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
			| 
								 
											3 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", {});
							 | 
						||
| 
								 | 
							
								};
							 |