UNPKG

unzipper-esm

Version:
79 lines (77 loc) 3.63 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = unzip; var _stream = require("stream"); var _zlib = _interopRequireDefault(require("zlib")); var _Decrypt = _interopRequireDefault(require("../Decrypt.js")); var _PullStream = _interopRequireDefault(require("../PullStream.js")); var _parseExtraField = _interopRequireDefault(require("../parseExtraField.js")); var _parseDateTime = _interopRequireDefault(require("../parseDateTime.js")); var _parseBuffer = _interopRequireDefault(require("../parseBuffer.js")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } // 'node:stream' // 'node:zlib' function unzip(source, offset, _password, directoryVars, length) { var file = new _PullStream["default"](), entry = new _stream.PassThrough(); var req = source.stream(offset, length); req.pipe(file).on('error', function (e) { entry.emit('error', e); }); entry.vars = file.pull(30).then(function (data) { var vars = (0, _parseBuffer["default"])(data, [['signature', 4], ['versionsNeededToExtract', 2], ['flags', 2], ['compressionMethod', 2], ['lastModifiedTime', 2], ['lastModifiedDate', 2], ['crc32', 4], ['compressedSize', 4], ['uncompressedSize', 4], ['fileNameLength', 2], ['extraFieldLength', 2]]); vars.lastModifiedDateTime = (0, _parseDateTime["default"])(vars.lastModifiedDate, vars.lastModifiedTime); return file.pull(vars.fileNameLength).then(function (fileName) { vars.fileName = fileName.toString('utf8'); return file.pull(vars.extraFieldLength); }).then(function (extraField) { var checkEncryption; vars.extra = (0, _parseExtraField["default"])(extraField, vars); // Ignore logal file header vars if the directory vars are available if (directoryVars && directoryVars.compressedSize) vars = directoryVars; if (vars.flags & 0x01) checkEncryption = file.pull(12).then(function (header) { if (!_password) throw new Error('MISSING_PASSWORD'); var decrypt = new _Decrypt["default"](); String(_password).split('').forEach(function (d) { decrypt.update(d); }); for (var i = 0; i < header.length; i++) header[i] = decrypt.decryptByte(header[i]); vars.decrypt = decrypt; vars.compressedSize -= 12; var check = vars.flags & 0x8 ? vars.lastModifiedTime >> 8 & 0xff : vars.crc32 >> 24 & 0xff; if (header[11] !== check) throw new Error('BAD_PASSWORD'); return vars; }); return Promise.resolve(checkEncryption).then(function () { entry.emit('vars', vars); return vars; }); }); }); entry.vars.then(function (vars) { var fileSizeKnown = !(vars.flags & 0x08) || vars.compressedSize > 0; var eof; var inflater = vars.compressionMethod ? _zlib["default"].createInflateRaw() : new _stream.PassThrough(); if (fileSizeKnown) { entry.size = vars.uncompressedSize; eof = vars.compressedSize; } else { eof = Buffer.alloc(4); eof.writeUInt32LE(0x08074b50, 0); } var stream = file.stream(eof); if (vars.decrypt) stream = stream.pipe(vars.decrypt.stream()); stream.pipe(inflater).on('error', function (err) { entry.emit('error', err); }).pipe(entry).on('finish', function () { if (req.destroy) req.destroy();else if (req.abort) req.abort();else if (req.close) req.close();else if (req.push) req.push();else console.log('warning - unable to close stream'); }); })["catch"](function (e) { entry.emit('error', e); }); return entry; } ; //# sourceMappingURL=unzip.js.map