From 59cc470e1ec6a3ea676347fa1861b28f997b6b1e Mon Sep 17 00:00:00 2001 From: Shawn Date: Thu, 10 Jan 2019 23:58:00 -0600 Subject: [PATCH] Code cleanup, fix race condition, return promise on unpack --- index.js | 75 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/index.js b/index.js index 31878ae..a1bc258 100644 --- a/index.js +++ b/index.js @@ -126,7 +126,7 @@ async function packDirectory(directory, options = {}) { }); await writeStream(entry, contents); - //console.log(contents) + entry.end(); }catch (e){console.log(e)} }, directory, packRoot); @@ -154,42 +154,49 @@ function streamToBuffer(stream) { async function unpackDirectory(directory, options = {}) { - if(!fs.existsSync(directory)) { - fs.mkdirSync(directory); - } - - const fileReadStream = getFileReadStream(options); - const zstd = await getZstd(); - - const extract = tar.extract(); - - extract.on('entry', async (header, fileStream, next) => { - let contents = await streamToBuffer(fileStream); - contents = new Uint8Array(contents); - - contents = zstd.decompress(contents); - - if(!/^\./.test(header.name)) { - if(header.name == 'index.html') { - console.log(String.fromCharCode.apply(null, contents)) - } - const writePath = path.join(directory, header.name); - fs.promises.mkdir(path.dirname(writePath), { recursive: true }); - var fileWriteStream = fs.createWriteStream(writePath); - fileWriteStream.write(contents); - fileWriteStream.end(); - next(); - } else { - fileStream.resume(); - next(); + return new Promise(async (resolve) => { + if(!fs.existsSync(directory)) { + fs.mkdirSync(directory); } - }); - extract.on('finish', () => { - // all entries read - }); + const fileReadStream = getFileReadStream(options); + const zstd = await getZstd(); - fileReadStream.pipe(extract); + const extract = tar.extract(); + + extract.on('entry', async (header, fileStream, next) => { + let contents = await streamToBuffer(fileStream); + contents = new Uint8Array(contents); + + contents = zstd.decompress(contents); + + if(!/^\./.test(header.name)) { + const writePath = path.join(directory, header.name); + + var fileWriteStream; + try { + fileWriteStream = fs.createWriteStream(writePath); + } catch (e) { + // Assume directory may not exist if an error is thrown + fs.mkdirSync(path.dirname(writePath), { recursive: true }); + fileWriteStream = fs.createWriteStream(writePath); + } + + fileWriteStream.write(contents); + fileWriteStream.end(); + next(); + } else { + fileStream.resume(); + next(); + } + }); + + extract.on('finish', () => { + resolve(true); + }); + + fileReadStream.pipe(extract); + }); } /*