You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					86 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					86 lines
				
				2.3 KiB
			| 
											2 years ago
										 | "use strict"; | ||
|  | var USE_TYPEDARRAY = (typeof Uint8Array !== "undefined") && (typeof Uint16Array !== "undefined") && (typeof Uint32Array !== "undefined"); | ||
|  | 
 | ||
|  | var pako = require("pako"); | ||
|  | var utils = require("./utils"); | ||
|  | var GenericWorker = require("./stream/GenericWorker"); | ||
|  | 
 | ||
|  | var ARRAY_TYPE = USE_TYPEDARRAY ? "uint8array" : "array"; | ||
|  | 
 | ||
|  | exports.magic = "\x08\x00"; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Create a worker that uses pako to inflate/deflate. | ||
|  |  * @constructor | ||
|  |  * @param {String} action the name of the pako function to call : either "Deflate" or "Inflate". | ||
|  |  * @param {Object} options the options to use when (de)compressing. | ||
|  |  */ | ||
|  | function FlateWorker(action, options) { | ||
|  |     GenericWorker.call(this, "FlateWorker/" + action); | ||
|  | 
 | ||
|  |     this._pako = null; | ||
|  |     this._pakoAction = action; | ||
|  |     this._pakoOptions = options; | ||
|  |     // the `meta` object from the last chunk received
 | ||
|  |     // this allow this worker to pass around metadata
 | ||
|  |     this.meta = {}; | ||
|  | } | ||
|  | 
 | ||
|  | utils.inherits(FlateWorker, GenericWorker); | ||
|  | 
 | ||
|  | /** | ||
|  |  * @see GenericWorker.processChunk | ||
|  |  */ | ||
|  | FlateWorker.prototype.processChunk = function (chunk) { | ||
|  |     this.meta = chunk.meta; | ||
|  |     if (this._pako === null) { | ||
|  |         this._createPako(); | ||
|  |     } | ||
|  |     this._pako.push(utils.transformTo(ARRAY_TYPE, chunk.data), false); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @see GenericWorker.flush | ||
|  |  */ | ||
|  | FlateWorker.prototype.flush = function () { | ||
|  |     GenericWorker.prototype.flush.call(this); | ||
|  |     if (this._pako === null) { | ||
|  |         this._createPako(); | ||
|  |     } | ||
|  |     this._pako.push([], true); | ||
|  | }; | ||
|  | /** | ||
|  |  * @see GenericWorker.cleanUp | ||
|  |  */ | ||
|  | FlateWorker.prototype.cleanUp = function () { | ||
|  |     GenericWorker.prototype.cleanUp.call(this); | ||
|  |     this._pako = null; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Create the _pako object. | ||
|  |  * TODO: lazy-loading this object isn't the best solution but it's the | ||
|  |  * quickest. The best solution is to lazy-load the worker list. See also the | ||
|  |  * issue #446. | ||
|  |  */ | ||
|  | FlateWorker.prototype._createPako = function () { | ||
|  |     this._pako = new pako[this._pakoAction]({ | ||
|  |         raw: true, | ||
|  |         level: this._pakoOptions.level || -1 // default compression
 | ||
|  |     }); | ||
|  |     var self = this; | ||
|  |     this._pako.onData = function(data) { | ||
|  |         self.push({ | ||
|  |             data : data, | ||
|  |             meta : self.meta | ||
|  |         }); | ||
|  |     }; | ||
|  | }; | ||
|  | 
 | ||
|  | exports.compressWorker = function (compressionOptions) { | ||
|  |     return new FlateWorker("Deflate", compressionOptions); | ||
|  | }; | ||
|  | exports.uncompressWorker = function () { | ||
|  |     return new FlateWorker("Inflate", {}); | ||
|  | }; |