ForgeTotal.js 5
de

Total.js 5

Einen Stream nach seinem Ende mit CLEANUP() freigeben

Total.js 5 · total5@0.0.19 streamsfilescleanup Mit Total.js 5 ausgeführt

CLEANUP(stream, [callback]) wartet, bis ein Stream fertig ist (er ist zu Ende, wurde geschlossen oder ist fehlgeschlagen), und zerstört ihn dann, wodurch das Dateihandle oder der Socket dahinter freigegeben wird. Mit einem Callback wird dieser danach aufgerufen; ohne Callback gibt die Funktion ein Promise zurück, das in diesem Moment aufgelöst wird. Es ist der Aufruf, den man machen sollte, nachdem man einen Stream an etwas übergeben hat, das ihn liest (eine Antwort, ein Pipe, einen Upload), wenn man sicher sein will, dass nichts offen bleibt, falls die Gegenseite vorzeitig aufhört.

controllers/streams.js
const Fs = require('fs');
const { PassThrough } = require('stream');

exports.install = function() {
	ROUTE('GET /copy/', copy);
	ROUTE('GET /copy-callback/', copycallback);
};

async function copy($) {

	const file = PATH.tmp('cleanup.txt');
	Fs.writeFileSync(file, 'some text to read');

	const stream = Fs.createReadStream(file);
	const chunks = [];

	// a sink that reads everything
	const sink = new PassThrough();
	sink.on('data', chunk => chunks.push(chunk));
	stream.pipe(sink);

	const before = stream.destroyed;
	await CLEANUP(stream);

	$.json({ before: before, after: stream.destroyed, content: Buffer.concat(chunks).toString() });
}

function copycallback($) {

	const file = PATH.tmp('cleanup.txt');
	Fs.writeFileSync(file, 'again');

	const stream = Fs.createReadStream(file);
	stream.resume();

	CLEANUP(stream, () => $.json({ destroyed: stream.destroyed }));
}