# Einen Stream nach seinem Ende mit CLEANUP() freigeben

> Mit CLEANUP() zerstörst du einen Stream, sobald er beendet ist oder fehlgeschlagen ist, damit keine Dateihandles offen bleiben, mit Callback oder als Promise.

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

`CLEANUP(stream, [callback])` wartet, bis ein Stream **fertig** ist (er ist zu Ende, wurde geschlossen oder ist fehlgeschlagen), und zerstört ihn dann, wodurch das Dateihandle oder der Socket dahinter freigegeben wird. Mit einem Callback wird dieser danach aufgerufen; ohne Callback gibt die Funktion ein Promise zurück, das in diesem Moment aufgelöst wird. Es ist der Aufruf, den man machen sollte, nachdem man einen Stream an etwas übergeben hat, das ihn liest (eine Antwort, ein Pipe, einen Upload), wenn man sicher sein will, dass nichts offen bleibt, falls die Gegenseite vorzeitig aufhört.

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