# Uvolněte stream po jeho skončení pomocí CLEANUP()

> Použijte CLEANUP() ke zničení streamu hned po jeho dokončení nebo selhání, aby nezůstaly otevřené deskriptory souborů, s callbackem nebo jako promise.

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

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

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