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.
		
		
		
		
		
			
		
			
				
					75 lines
				
				2.8 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.8 KiB
			| 
											2 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | var external = require("./external"); | ||
|  | var DataWorker = require("./stream/DataWorker"); | ||
|  | var Crc32Probe = require("./stream/Crc32Probe"); | ||
|  | var DataLengthProbe = require("./stream/DataLengthProbe"); | ||
|  | 
 | ||
|  | /** | ||
|  |  * Represent a compressed object, with everything needed to decompress it. | ||
|  |  * @constructor | ||
|  |  * @param {number} compressedSize the size of the data compressed. | ||
|  |  * @param {number} uncompressedSize the size of the data after decompression. | ||
|  |  * @param {number} crc32 the crc32 of the decompressed file. | ||
|  |  * @param {object} compression the type of compression, see lib/compressions.js. | ||
|  |  * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data. | ||
|  |  */ | ||
|  | function CompressedObject(compressedSize, uncompressedSize, crc32, compression, data) { | ||
|  |     this.compressedSize = compressedSize; | ||
|  |     this.uncompressedSize = uncompressedSize; | ||
|  |     this.crc32 = crc32; | ||
|  |     this.compression = compression; | ||
|  |     this.compressedContent = data; | ||
|  | } | ||
|  | 
 | ||
|  | CompressedObject.prototype = { | ||
|  |     /** | ||
|  |      * Create a worker to get the uncompressed content. | ||
|  |      * @return {GenericWorker} the worker. | ||
|  |      */ | ||
|  |     getContentWorker: function () { | ||
|  |         var worker = new DataWorker(external.Promise.resolve(this.compressedContent)) | ||
|  |             .pipe(this.compression.uncompressWorker()) | ||
|  |             .pipe(new DataLengthProbe("data_length")); | ||
|  | 
 | ||
|  |         var that = this; | ||
|  |         worker.on("end", function () { | ||
|  |             if (this.streamInfo["data_length"] !== that.uncompressedSize) { | ||
|  |                 throw new Error("Bug : uncompressed data size mismatch"); | ||
|  |             } | ||
|  |         }); | ||
|  |         return worker; | ||
|  |     }, | ||
|  |     /** | ||
|  |      * Create a worker to get the compressed content. | ||
|  |      * @return {GenericWorker} the worker. | ||
|  |      */ | ||
|  |     getCompressedWorker: function () { | ||
|  |         return new DataWorker(external.Promise.resolve(this.compressedContent)) | ||
|  |             .withStreamInfo("compressedSize", this.compressedSize) | ||
|  |             .withStreamInfo("uncompressedSize", this.uncompressedSize) | ||
|  |             .withStreamInfo("crc32", this.crc32) | ||
|  |             .withStreamInfo("compression", this.compression) | ||
|  |         ; | ||
|  |     } | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Chain the given worker with other workers to compress the content with the | ||
|  |  * given compression. | ||
|  |  * @param {GenericWorker} uncompressedWorker the worker to pipe. | ||
|  |  * @param {Object} compression the compression object. | ||
|  |  * @param {Object} compressionOptions the options to use when compressing. | ||
|  |  * @return {GenericWorker} the new worker compressing the content. | ||
|  |  */ | ||
|  | CompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) { | ||
|  |     return uncompressedWorker | ||
|  |         .pipe(new Crc32Probe()) | ||
|  |         .pipe(new DataLengthProbe("uncompressedSize")) | ||
|  |         .pipe(compression.compressWorker(compressionOptions)) | ||
|  |         .pipe(new DataLengthProbe("compressedSize")) | ||
|  |         .withStreamInfo("compression", compression); | ||
|  | }; | ||
|  | 
 | ||
|  | module.exports = CompressedObject; |