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
						
					
					
				| "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;
 |