{"version":3,"sources":["zip.ts"],"names":["promisify","utilPromisify","yauzl","property","yauzlOpen","open","bind","yauzlOpenP","yauzlFromRAR","fromRandomAccessReader","yauzlFromRARP","openOpts","lazyEntries","StreamerRAR","RandomAccessReader","constructor","streamer","_streamer","_readStreamForRange","start","end","Zip","Object","openFile","file","_zipfile","openStreamer","totalSize","reader","read","itter","zipfile","Error","Promise","resolve","reject","error","next","err","close","readEntry","on","entry","path","fileName","replace","dir","endsWith","crc32","sizeC","compressedSize","sizeD","uncompressedSize","stream","openReadStream","openP","r","done"],"mappings":"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","sourcesContent":["// tslint:disable max-classes-per-file\n\nimport {promisify as utilPromisify} from 'util';\nimport yauzl from 'yauzl';\n\nimport {property} from './decorators';\nimport {\n\tZipItter,\n\tZipStreamer\n} from './types';\n\nconst yauzlOpen = yauzl.open.bind(yauzl);\nconst yauzlOpenP = utilPromisify(yauzlOpen);\nconst yauzlFromRAR = yauzl.fromRandomAccessReader.bind(yauzl);\nconst yauzlFromRARP = utilPromisify(yauzlFromRAR);\nconst openOpts = {lazyEntries: true};\n\n/**\n * Streamer Random Access Read wrapper class.\n *\n * @param streamer ZipStreamer function.\n */\nclass StreamerRAR extends yauzl.RandomAccessReader {\n\n\t/**\n\t * Streamer instance.\n\t */\n\tprivate readonly _streamer: ZipStreamer;\n\n\tconstructor(streamer: ZipStreamer) {\n\t\tsuper();\n\t\tthis._streamer = streamer;\n\t}\n\n\t/**\n\t * Read stream from range.\n\t *\n\t * @param start Range start.\n\t * @param end Range end.\n\t * @return Readable stream.\n\t */\n\tpublic _readStreamForRange(start: number, end: number) {\n\t\treturn this._streamer(start, end);\n\t}\n}\n\n/**\n * Zip file reader class.\n */\nexport class Zip extends Object {\n\t/**\n\t * The zipfile instance, generic type to avoid dependency.\n\t */\n\t@property(false)\n\tprotected _zipfile: any = null;\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\t/**\n\t * Open with a file.\n\t *\n\t * @param file File path.\n\t */\n\tpublic async openFile(file: string) {\n\t\tthis._zipfile = await yauzlOpenP(file, openOpts);\n\t}\n\n\t/**\n\t * Open with a streamer.\n\t *\n\t * @param streamer Streamer function.\n\t * @param totalSize Total size of file.\n\t */\n\tpublic async openStreamer(streamer: ZipStreamer, totalSize: number) {\n\t\tconst reader = new StreamerRAR(streamer);\n\t\tthis._zipfile = await yauzlFromRARP(reader, totalSize, openOpts);\n\t}\n\n\t/**\n\t * Read zip file entries.\n\t * To stop reading and close file, return false from itter.\n\t *\n\t * @param itter Callback function.\n\t */\n\tpublic async read(itter: ZipItter) {\n\t\tconst zipfile = this._zipfile as yauzl.ZipFile | null;\n\t\tif (!zipfile) {\n\t\t\tthrow new Error('Zip instance not opened');\n\t\t}\n\t\tthis._zipfile = null;\n\n\t\tawait new Promise((resolve, reject) => {\n\t\t\tlet error: Error | null = null;\n\t\t\tconst next = (err: Error | null) => {\n\t\t\t\tif (err) {\n\t\t\t\t\terror = err;\n\t\t\t\t\tzipfile.close();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tzipfile.readEntry();\n\t\t\t};\n\t\t\tzipfile.on('error', next);\n\t\t\tzipfile.on('entry', async entry => {\n\t\t\t\tconst path = entry.fileName.replace(/\\\\/g, '/');\n\t\t\t\tconst dir = path.endsWith('/');\n\t\t\t\tconst crc32 = entry.crc32;\n\t\t\t\tconst sizeC = entry.compressedSize;\n\t\t\t\tconst sizeD = entry.uncompressedSize;\n\t\t\t\tconst stream = async () => {\n\t\t\t\t\tconst open = zipfile.openReadStream.bind(zipfile);\n\t\t\t\t\tconst openP = utilPromisify(open);\n\t\t\t\t\tconst r = await openP(entry);\n\t\t\t\t\treturn r;\n\t\t\t\t};\n\n\t\t\t\tlet done = false;\n\t\t\t\ttry {\n\t\t\t\t\tdone = await itter({\n\t\t\t\t\t\tpath,\n\t\t\t\t\t\tdir,\n\t\t\t\t\t\tcrc32,\n\t\t\t\t\t\tsizeC,\n\t\t\t\t\t\tsizeD,\n\t\t\t\t\t\tstream\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tcatch (err) {\n\t\t\t\t\tnext(err);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (done) {\n\t\t\t\t\tzipfile.close();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnext(null);\n\t\t\t\t}\n\t\t\t});\n\t\t\tzipfile.on('close', () => {\n\t\t\t\tif (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tresolve();\n\t\t\t});\n\t\t\tnext(null);\n\t\t});\n\t}\n}\n"],"file":"zip.mjs","sourceRoot":"../src"}