ForgeTotal.js 5
fr

Total.js 5

Libérer un flux à sa fin avec CLEANUP()

Total.js 5 · total5@0.0.19 streamsfilescleanup Exécutée avec Total.js 5

CLEANUP(stream, [callback]) attend qu'un flux soit terminé (il s'est achevé, a été fermé ou a échoué) puis le détruit, ce qui libère le descripteur de fichier ou le socket qui se trouve derrière. Avec un callback, celui-ci est appelé ensuite ; sans callback, la fonction renvoie une promesse qui se résout à ce moment-là. C'est l'appel à faire après avoir confié un flux à quelque chose qui le lit (une réponse, un pipe, un envoi de fichier) quand on veut être sûr que rien ne reste ouvert si l'autre côté s'arrête avant la fin.

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 }));
}