fast-extract
Version:
Extract contents from various archive types (tar, tar.bz2, tar.gz, tar.xz, tgz, zip)
40 lines (39 loc) • 1.29 kB
JavaScript
import { waitForAccess } from 'extract-base-iterator';
import fs from 'fs';
import { safeRm } from 'fs-remove-compat';
import Queue from 'queue-cb';
import tempSuffix from 'temp-suffix';
import writer from '../../compat/flush-write-stream.js';
export default function createWriteEntriesStream(dest, options = {}) {
options = {
now: new Date(),
...options
};
const tempDest = tempSuffix(dest);
const links = [];
return writer({
objectMode: true
}, function write(entry, _encoding, callback) {
if (entry.type === 'link') {
links.unshift(entry);
return callback();
}
if (entry.type === 'symlink') {
links.push(entry);
return callback();
}
entry.create(tempDest, options, callback);
}, function flush(callback) {
const queue = new Queue(1);
queue.defer(safeRm.bind(null, dest));
queue.defer(fs.rename.bind(null, tempDest, dest));
queue.defer(waitForAccess.bind(null, dest));
for(let index = 0; index < links.length; index++){
const entry = links[index];
queue.defer((cb)=>{
entry.create(dest, options, cb);
});
}
queue.await(callback);
});
}