diff options
author | Florian Dold <florian.dold@gmail.com> | 2017-12-10 21:51:33 +0100 |
---|---|---|
committer | Florian Dold <florian.dold@gmail.com> | 2017-12-10 21:51:33 +0100 |
commit | 0469abd4a9c9270a1fdc962969e36e63699af8b4 (patch) | |
tree | f9864d4a4148621378958794cbbfdc2393733283 /node_modules/browserify-zlib/src/index.js | |
parent | 6947e79bbc258f7bc96af424ddb71a511f0c15a3 (diff) |
upgrade dependencies
Diffstat (limited to 'node_modules/browserify-zlib/src/index.js')
-rw-r--r-- | node_modules/browserify-zlib/src/index.js | 244 |
1 files changed, 142 insertions, 102 deletions
diff --git a/node_modules/browserify-zlib/src/index.js b/node_modules/browserify-zlib/src/index.js index 032689c4a..12f1ad033 100644 --- a/node_modules/browserify-zlib/src/index.js +++ b/node_modules/browserify-zlib/src/index.js @@ -1,29 +1,13 @@ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -var Transform = require('_stream_transform'); - -var binding = require('./binding'); -var util = require('util'); -var assert = require('assert').ok; +'use strict'; + +const Buffer = require('buffer').Buffer; +const Transform = require('stream').Transform; +const binding = require('./binding'); +const util = require('util'); +const assert = require('assert').ok; +const kMaxLength = require('buffer').kMaxLength; +const kRangeErrorMessage = 'Cannot create final Buffer. It would be larger ' + + 'than 0x' + kMaxLength.toString(16) + ' bytes'; // zlib doesn't provide these, so kludge them in following the same // const naming scheme zlib uses. @@ -47,12 +31,18 @@ binding.Z_MAX_LEVEL = 9; binding.Z_DEFAULT_LEVEL = binding.Z_DEFAULT_COMPRESSION; // expose all the zlib constants -Object.keys(binding).forEach(function(k) { - if (k.match(/^Z/)) exports[k] = binding[k]; -}); +const bkeys = Object.keys(binding); +for (var bk = 0; bk < bkeys.length; bk++) { + var bkey = bkeys[bk]; + if (bkey.match(/^Z/)) { + Object.defineProperty(exports, bkey, { + enumerable: true, value: binding[bkey], writable: false + }); + } +} // translation table for return codes. -exports.codes = { +const codes = { Z_OK: binding.Z_OK, Z_STREAM_END: binding.Z_STREAM_END, Z_NEED_DICT: binding.Z_NEED_DICT, @@ -64,8 +54,14 @@ exports.codes = { Z_VERSION_ERROR: binding.Z_VERSION_ERROR }; -Object.keys(exports.codes).forEach(function(k) { - exports.codes[exports.codes[k]] = k; +const ckeys = Object.keys(codes); +for (var ck = 0; ck < ckeys.length; ck++) { + var ckey = ckeys[ck]; + codes[codes[ckey]] = ckey; +} + +Object.defineProperty(exports, 'codes', { + enumerable: true, value: Object.freeze(codes), writable: false }); exports.Deflate = Deflate; @@ -217,20 +213,29 @@ function zlibBuffer(engine, buffer, callback) { } function onEnd() { - var buf = Buffer.concat(buffers, nread); + var buf; + var err = null; + + if (nread >= kMaxLength) { + err = new RangeError(kRangeErrorMessage); + } else { + buf = Buffer.concat(buffers, nread); + } + buffers = []; - callback(null, buf); engine.close(); + callback(err, buf); } } function zlibBufferSync(engine, buffer) { if (typeof buffer === 'string') - buffer = new Buffer(buffer); + buffer = Buffer.from(buffer); + if (!Buffer.isBuffer(buffer)) throw new TypeError('Not a string or buffer'); - var flushFlag = binding.Z_FINISH; + var flushFlag = engine._finishFlushFlag; return engine._processChunk(buffer, flushFlag); } @@ -248,7 +253,6 @@ function Inflate(opts) { } - // gzip - bigger header, same deflate compression function Gzip(opts) { if (!(this instanceof Gzip)) return new Gzip(opts); @@ -261,7 +265,6 @@ function Gunzip(opts) { } - // raw - no header function DeflateRaw(opts) { if (!(this instanceof DeflateRaw)) return new DeflateRaw(opts); @@ -280,6 +283,14 @@ function Unzip(opts) { Zlib.call(this, opts, binding.UNZIP); } +function isValidFlushFlag(flag) { + return flag === binding.Z_NO_FLUSH || + flag === binding.Z_PARTIAL_FLUSH || + flag === binding.Z_SYNC_FLUSH || + flag === binding.Z_FULL_FLUSH || + flag === binding.Z_FINISH || + flag === binding.Z_BLOCK; +} // the Zlib class they all inherit from // This thing manages the queue of requests, and returns @@ -292,17 +303,16 @@ function Zlib(opts, mode) { Transform.call(this, opts); - if (opts.flush) { - if (opts.flush !== binding.Z_NO_FLUSH && - opts.flush !== binding.Z_PARTIAL_FLUSH && - opts.flush !== binding.Z_SYNC_FLUSH && - opts.flush !== binding.Z_FULL_FLUSH && - opts.flush !== binding.Z_FINISH && - opts.flush !== binding.Z_BLOCK) { - throw new Error('Invalid flush flag: ' + opts.flush); - } + if (opts.flush && !isValidFlushFlag(opts.flush)) { + throw new Error('Invalid flush flag: ' + opts.flush); + } + if (opts.finishFlush && !isValidFlushFlag(opts.finishFlush)) { + throw new Error('Invalid flush flag: ' + opts.finishFlush); } + this._flushFlag = opts.flush || binding.Z_NO_FLUSH; + this._finishFlushFlag = typeof opts.finishFlush !== 'undefined' ? + opts.finishFlush : binding.Z_FINISH; if (opts.chunkSize) { if (opts.chunkSize < exports.Z_MIN_CHUNK || @@ -348,14 +358,14 @@ function Zlib(opts, mode) { } } - this._binding = new binding.Zlib(mode); + this._handle = new binding.Zlib(mode); var self = this; this._hadError = false; - this._binding.onerror = function(message, errno) { + this._handle.onerror = function(message, errno) { // there is no way to cleanly recover. // continuing only obscures problems. - self._binding = null; + _close(self); self._hadError = true; var error = new Error(message); @@ -370,19 +380,24 @@ function Zlib(opts, mode) { var strategy = exports.Z_DEFAULT_STRATEGY; if (typeof opts.strategy === 'number') strategy = opts.strategy; - this._binding.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, - level, - opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, - strategy, - opts.dictionary); + this._handle.init(opts.windowBits || exports.Z_DEFAULT_WINDOWBITS, + level, + opts.memLevel || exports.Z_DEFAULT_MEMLEVEL, + strategy, + opts.dictionary); - this._buffer = new Buffer(this._chunkSize); + this._buffer = Buffer.allocUnsafe(this._chunkSize); this._offset = 0; - this._closed = false; this._level = level; this._strategy = strategy; this.once('end', this.close); + + Object.defineProperty(this, '_closed', { + get: () => { return !this._handle; }, + configurable: true, + enumerable: true + }); } util.inherits(Zlib, Transform); @@ -403,7 +418,8 @@ Zlib.prototype.params = function(level, strategy, callback) { if (this._level !== level || this._strategy !== strategy) { var self = this; this.flush(binding.Z_SYNC_FLUSH, function() { - self._binding.params(level, strategy); + assert(self._handle, 'zlib binding closed'); + self._handle.params(level, strategy); if (!self._hadError) { self._level = level; self._strategy = strategy; @@ -416,19 +432,20 @@ Zlib.prototype.params = function(level, strategy, callback) { }; Zlib.prototype.reset = function() { - return this._binding.reset(); + assert(this._handle, 'zlib binding closed'); + return this._handle.reset(); }; // This is the _flush function called by the transform class, // internally, when the last chunk has been written. Zlib.prototype._flush = function(callback) { - this._transform(new Buffer(0), '', callback); + this._transform(Buffer.alloc(0), '', callback); }; Zlib.prototype.flush = function(kind, callback) { var ws = this._writableState; - if (typeof kind === 'function' || (kind === void 0 && !callback)) { + if (typeof kind === 'function' || (kind === undefined && !callback)) { callback = kind; kind = binding.Z_FULL_FLUSH; } @@ -440,32 +457,35 @@ Zlib.prototype.flush = function(kind, callback) { if (callback) this.once('end', callback); } else if (ws.needDrain) { - var self = this; - this.once('drain', function() { - self.flush(callback); - }); + if (callback) { + this.once('drain', () => this.flush(kind, callback)); + } } else { this._flushFlag = kind; - this.write(new Buffer(0), '', callback); + this.write(Buffer.alloc(0), '', callback); } }; Zlib.prototype.close = function(callback) { + _close(this, callback); + process.nextTick(emitCloseNT, this); +}; + +function _close(engine, callback) { if (callback) process.nextTick(callback); - if (this._closed) + // Caller may invoke .close after a zlib error (which will null _handle). + if (!engine._handle) return; - this._closed = true; - - this._binding.close(); + engine._handle.close(); + engine._handle = null; +} - var self = this; - process.nextTick(function() { - self.emit('close'); - }); -}; +function emitCloseNT(self) { + self.emit('close'); +} Zlib.prototype._transform = function(chunk, encoding, cb) { var flushFlag; @@ -473,15 +493,19 @@ Zlib.prototype._transform = function(chunk, encoding, cb) { var ending = ws.ending || ws.ended; var last = ending && (!chunk || ws.length === chunk.length); - if (!chunk === null && !Buffer.isBuffer(chunk)) + if (chunk !== null && !Buffer.isBuffer(chunk)) return cb(new Error('invalid input')); - // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag. + if (!this._handle) + return cb(new Error('zlib binding closed')); + + // If it's the last chunk, or a final flush, we use the Z_FINISH flush flag + // (or whatever flag was provided using opts.finishFlush). // If it's explicitly flushing at some other time, then we use // Z_FULL_FLUSH. Otherwise, use Z_NO_FLUSH for maximum compression // goodness. if (last) - flushFlag = binding.Z_FINISH; + flushFlag = this._finishFlushFlag; else { flushFlag = this._flushFlag; // once we've flushed the last of the queue, stop flushing and @@ -491,7 +515,6 @@ Zlib.prototype._transform = function(chunk, encoding, cb) { } } - var self = this; this._processChunk(chunk, flushFlag, cb); }; @@ -513,38 +536,55 @@ Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { error = er; }); + assert(this._handle, 'zlib binding closed'); do { - var res = this._binding.writeSync(flushFlag, - chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore); // out_len + var res = this._handle.writeSync(flushFlag, + chunk, // in + inOff, // in_off + availInBefore, // in_len + this._buffer, // out + this._offset, //out_off + availOutBefore); // out_len } while (!this._hadError && callback(res[0], res[1])); if (this._hadError) { throw error; } + if (nread >= kMaxLength) { + _close(this); + throw new RangeError(kRangeErrorMessage); + } + var buf = Buffer.concat(buffers, nread); - this.close(); + _close(this); return buf; } - var req = this._binding.write(flushFlag, - chunk, // in - inOff, // in_off - availInBefore, // in_len - this._buffer, // out - this._offset, //out_off - availOutBefore); // out_len + assert(this._handle, 'zlib binding closed'); + var req = this._handle.write(flushFlag, + chunk, // in + inOff, // in_off + availInBefore, // in_len + this._buffer, // out + this._offset, //out_off + availOutBefore); // out_len req.buffer = chunk; req.callback = callback; function callback(availInAfter, availOutAfter) { + // When the callback is used in an async write, the callback's + // context is the `req` object that was created. The req object + // is === this._handle, and that's why it's important to null + // out the values after they are done being used. `this._handle` + // can stay in memory longer than the callback and buffer are needed. + if (this) { + this.buffer = null; + this.callback = null; + } + if (self._hadError) return; @@ -567,7 +607,7 @@ Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { if (availOutAfter === 0 || self._offset >= self._chunkSize) { availOutBefore = self._chunkSize; self._offset = 0; - self._buffer = new Buffer(self._chunkSize); + self._buffer = Buffer.allocUnsafe(self._chunkSize); } if (availOutAfter === 0) { @@ -581,13 +621,13 @@ Zlib.prototype._processChunk = function(chunk, flushFlag, cb) { if (!async) return true; - var newReq = self._binding.write(flushFlag, - chunk, - inOff, - availInBefore, - self._buffer, - self._offset, - self._chunkSize); + var newReq = self._handle.write(flushFlag, + chunk, + inOff, + availInBefore, + self._buffer, + self._offset, + self._chunkSize); newReq.callback = callback; // this same function newReq.buffer = chunk; return; |