UNPKG

fast-extract

Version:

Extract contents from various archive types (tar, tar.bz2, tar.gz, tar.xz, tgz, zip)

58 lines (57 loc) 1.97 kB
import writer from 'flush-write-stream'; import pumpify from 'pumpify'; import createPipeline from './createPipeline.mjs'; import exitCleanup from './exitCleanup.mjs'; import rimrafAll from './rimrafAll.mjs'; export default function createWriteStream(dest, options) { if (typeof options === 'string') options = { type: options }; options = { _tempPaths: [], ...options }; const streams = createPipeline(dest, options); const generatedFiles = [ dest ].concat(options._tempPaths); generatedFiles.forEach(exitCleanup.add); let error = null; let ended = false; function onError(err, callback) { if (error || ended) return callback(err); error = err; res.destroy(err); return rimrafAll(generatedFiles, (err2)=>{ generatedFiles.forEach(exitCleanup.remove); callback(err || err2); }); } function onEnd(callback) { if (error || ended) return callback(); ended = true; return rimrafAll(options._tempPaths, (err)=>{ generatedFiles.forEach(exitCleanup.remove); callback(err); }); } const res = streams.length < 2 ? streams[0] : pumpify(streams); const write = writer(function write(chunk, encoding, callback) { res.write(chunk, encoding, (err)=>{ if (error) return; // skip if errored so will not emit errors multiple times err ? onError(err, callback) : callback(); }); }, function flush(callback) { if (error) return; // skip if errored so will not emit errors multiple times res.end((err)=>{ if (error) return; // skip if errored so will not emit errors multiple times err ? onError(err || error, callback) : onEnd(callback); }); }); res.on('error', (err)=>{ onError(err, ()=>{ write.destroy(err); }); }); return write; }