# Uvoľnite stream po jeho skončení pomocou CLEANUP()

> Použite CLEANUP() na zničenie streamu hneď po jeho dokončení alebo zlyhaní, aby nezostali otvorené deskriptory súborov, s callbackom alebo ako promise.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: sk
Content-SHA256: 55a30d6aa03acc2d41d200d81244b72c28645ad3c5cdae767a6dfd001d30f9ae
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

`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.

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