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