123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269 |
- import msg from './messages';
- import zstream from './zstream';
- import {deflateInit2, deflateEnd, deflateReset, deflate} from './deflate';
- import {inflateInit2, inflate, inflateEnd, inflateReset} from './inflate';
- // import constants from './constants';
- // zlib modes
- export var NONE = 0;
- export var DEFLATE = 1;
- export var INFLATE = 2;
- export var GZIP = 3;
- export var GUNZIP = 4;
- export var DEFLATERAW = 5;
- export var INFLATERAW = 6;
- export var UNZIP = 7;
- export var Z_NO_FLUSH= 0,
- Z_PARTIAL_FLUSH= 1,
- Z_SYNC_FLUSH= 2,
- Z_FULL_FLUSH= 3,
- Z_FINISH= 4,
- Z_BLOCK= 5,
- Z_TREES= 6,
- /* Return codes for the compression/decompression functions. Negative values
- * are errors, positive values are used for special but normal events.
- */
- Z_OK= 0,
- Z_STREAM_END= 1,
- Z_NEED_DICT= 2,
- Z_ERRNO= -1,
- Z_STREAM_ERROR= -2,
- Z_DATA_ERROR= -3,
- //Z_MEM_ERROR: -4,
- Z_BUF_ERROR= -5,
- //Z_VERSION_ERROR: -6,
- /* compression levels */
- Z_NO_COMPRESSION= 0,
- Z_BEST_SPEED= 1,
- Z_BEST_COMPRESSION= 9,
- Z_DEFAULT_COMPRESSION= -1,
- Z_FILTERED= 1,
- Z_HUFFMAN_ONLY= 2,
- Z_RLE= 3,
- Z_FIXED= 4,
- Z_DEFAULT_STRATEGY= 0,
- /* Possible values of the data_type field (though see inflate()) */
- Z_BINARY= 0,
- Z_TEXT= 1,
- //Z_ASCII: 1, // = Z_TEXT (deprecated)
- Z_UNKNOWN= 2,
- /* The deflate compression method */
- Z_DEFLATED= 8;
- export function Zlib(mode) {
- if (mode < DEFLATE || mode > UNZIP)
- throw new TypeError('Bad argument');
- this.mode = mode;
- this.init_done = false;
- this.write_in_progress = false;
- this.pending_close = false;
- this.windowBits = 0;
- this.level = 0;
- this.memLevel = 0;
- this.strategy = 0;
- this.dictionary = null;
- }
- Zlib.prototype.init = function(windowBits, level, memLevel, strategy, dictionary) {
- this.windowBits = windowBits;
- this.level = level;
- this.memLevel = memLevel;
- this.strategy = strategy;
- // dictionary not supported.
- if (this.mode === GZIP || this.mode === GUNZIP)
- this.windowBits += 16;
- if (this.mode === UNZIP)
- this.windowBits += 32;
- if (this.mode === DEFLATERAW || this.mode === INFLATERAW)
- this.windowBits = -this.windowBits;
- this.strm = new zstream();
- var status;
- switch (this.mode) {
- case DEFLATE:
- case GZIP:
- case DEFLATERAW:
- status = deflateInit2(
- this.strm,
- this.level,
- Z_DEFLATED,
- this.windowBits,
- this.memLevel,
- this.strategy
- );
- break;
- case INFLATE:
- case GUNZIP:
- case INFLATERAW:
- case UNZIP:
- status = inflateInit2(
- this.strm,
- this.windowBits
- );
- break;
- default:
- throw new Error('Unknown mode ' + this.mode);
- }
- if (status !== Z_OK) {
- this._error(status);
- return;
- }
- this.write_in_progress = false;
- this.init_done = true;
- };
- Zlib.prototype.params = function() {
- throw new Error('deflateParams Not supported');
- };
- Zlib.prototype._writeCheck = function() {
- if (!this.init_done)
- throw new Error('write before init');
- if (this.mode === NONE)
- throw new Error('already finalized');
- if (this.write_in_progress)
- throw new Error('write already in progress');
- if (this.pending_close)
- throw new Error('close is pending');
- };
- Zlib.prototype.write = function(flush, input, in_off, in_len, out, out_off, out_len) {
- this._writeCheck();
- this.write_in_progress = true;
- var self = this;
- process.nextTick(function() {
- self.write_in_progress = false;
- var res = self._write(flush, input, in_off, in_len, out, out_off, out_len);
- self.callback(res[0], res[1]);
- if (self.pending_close)
- self.close();
- });
- return this;
- };
- // set method for Node buffers, used by pako
- function bufferSet(data, offset) {
- for (var i = 0; i < data.length; i++) {
- this[offset + i] = data[i];
- }
- }
- Zlib.prototype.writeSync = function(flush, input, in_off, in_len, out, out_off, out_len) {
- this._writeCheck();
- return this._write(flush, input, in_off, in_len, out, out_off, out_len);
- };
- Zlib.prototype._write = function(flush, input, in_off, in_len, out, out_off, out_len) {
- this.write_in_progress = true;
- if (flush !== Z_NO_FLUSH &&
- flush !== Z_PARTIAL_FLUSH &&
- flush !== Z_SYNC_FLUSH &&
- flush !== Z_FULL_FLUSH &&
- flush !== Z_FINISH &&
- flush !== Z_BLOCK) {
- throw new Error('Invalid flush value');
- }
- if (input == null) {
- input = new Buffer(0);
- in_len = 0;
- in_off = 0;
- }
- if (out._set)
- out.set = out._set;
- else
- out.set = bufferSet;
- var strm = this.strm;
- strm.avail_in = in_len;
- strm.input = input;
- strm.next_in = in_off;
- strm.avail_out = out_len;
- strm.output = out;
- strm.next_out = out_off;
- var status;
- switch (this.mode) {
- case DEFLATE:
- case GZIP:
- case DEFLATERAW:
- status = deflate(strm, flush);
- break;
- case UNZIP:
- case INFLATE:
- case GUNZIP:
- case INFLATERAW:
- status = inflate(strm, flush);
- break;
- default:
- throw new Error('Unknown mode ' + this.mode);
- }
- if (status !== Z_STREAM_END && status !== Z_OK) {
- this._error(status);
- }
- this.write_in_progress = false;
- return [strm.avail_in, strm.avail_out];
- };
- Zlib.prototype.close = function() {
- if (this.write_in_progress) {
- this.pending_close = true;
- return;
- }
- this.pending_close = false;
- if (this.mode === DEFLATE || this.mode === GZIP || this.mode === DEFLATERAW) {
- deflateEnd(this.strm);
- } else {
- inflateEnd(this.strm);
- }
- this.mode = NONE;
- };
- var status
- Zlib.prototype.reset = function() {
- switch (this.mode) {
- case DEFLATE:
- case DEFLATERAW:
- status = deflateReset(this.strm);
- break;
- case INFLATE:
- case INFLATERAW:
- status = inflateReset(this.strm);
- break;
- }
- if (status !== Z_OK) {
- this._error(status);
- }
- };
- Zlib.prototype._error = function(status) {
- this.onerror(msg[status] + ': ' + this.strm.msg, status);
- this.write_in_progress = false;
- if (this.pending_close)
- this.close();
- };
|