Uvoľnite stream po jeho skončení pomocou CLEANUP()
CLEANUP(stream, [callback]) počká, kým stream skončí (dokončil sa, bol zatvorený alebo zlyhal), a potom ho zničí, čím uvoľní deskriptor súboru alebo socket, ktorý za ním stojí. S callbackom sa zavolá po tomto kroku; bez neho vráti promise, ktorý sa v tom okamihu vyrieši. Je to volanie, ktoré treba urobiť po odovzdaní streamu niečomu, čo ho číta (odpoveď, pipe, nahrávanie), keď chcete mať istotu, že nič nezostane otvorené, ak druhá strana skončí predčasne.
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 }));
}