unzipper-esm
Version:
Unzip cross-platform streaming API
79 lines (77 loc) • 3.63 kB
JavaScript
;
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