Uvolněte stream po jeho skončení pomocí CLEANUP()
CLEANUP(stream, [callback]) počká, až stream skončí (dokončil se, byl uzavřen nebo selhal), a poté jej zničí, čímž uvolní deskriptor souboru nebo socket, který za ním stojí. S callbackem se zavolá po tomto kroku; bez něj vrátí promise, který se v tu chvíli vyřeší. Je to volání, které je dobré provést po předání streamu něčemu, co jej čte (odpověď, pipe, nahrávání), když chcete mít jistotu, že nic nezůstane otevřené, pokud druhá strana skončí předčasně.
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 }));
}