# Frigör en ström när den slutar med CLEANUP()

> Använd CLEANUP() för att förstöra en ström så snart den är klar eller har misslyckats, så att inga filhandtag lämnas öppna, med en callback eller som ett löfte.

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

`CLEANUP(stream, [callback])` väntar tills en ström är **klar** (den tog slut, stängdes eller misslyckades) och förstör den sedan, vilket frigör filhandtaget eller socketen bakom den. Med en callback anropas den efteråt; utan callback returnerar funktionen ett löfte som löses vid den tidpunkten. Det är anropet man gör efter att ha lämnat över en ström till något som läser den (ett svar, en pipe, en uppladdning) när man vill vara säker på att inget förblir öppet om den andra sidan slutar i förtid.

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