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.
		
		
		
		
		
			
		
			
				
					
					
						
							134 lines
						
					
					
						
							4.4 KiB
						
					
					
				
			
		
		
	
	
							134 lines
						
					
					
						
							4.4 KiB
						
					
					
				"use strict";
 | 
						|
 | 
						|
var StreamHelper = require("./stream/StreamHelper");
 | 
						|
var DataWorker = require("./stream/DataWorker");
 | 
						|
var utf8 = require("./utf8");
 | 
						|
var CompressedObject = require("./compressedObject");
 | 
						|
var GenericWorker = require("./stream/GenericWorker");
 | 
						|
 | 
						|
/**
 | 
						|
 * A simple object representing a file in the zip file.
 | 
						|
 * @constructor
 | 
						|
 * @param {string} name the name of the file
 | 
						|
 * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data
 | 
						|
 * @param {Object} options the options of the file
 | 
						|
 */
 | 
						|
var ZipObject = function(name, data, options) {
 | 
						|
    this.name = name;
 | 
						|
    this.dir = options.dir;
 | 
						|
    this.date = options.date;
 | 
						|
    this.comment = options.comment;
 | 
						|
    this.unixPermissions = options.unixPermissions;
 | 
						|
    this.dosPermissions = options.dosPermissions;
 | 
						|
 | 
						|
    this._data = data;
 | 
						|
    this._dataBinary = options.binary;
 | 
						|
    // keep only the compression
 | 
						|
    this.options = {
 | 
						|
        compression : options.compression,
 | 
						|
        compressionOptions : options.compressionOptions
 | 
						|
    };
 | 
						|
};
 | 
						|
 | 
						|
ZipObject.prototype = {
 | 
						|
    /**
 | 
						|
     * Create an internal stream for the content of this object.
 | 
						|
     * @param {String} type the type of each chunk.
 | 
						|
     * @return StreamHelper the stream.
 | 
						|
     */
 | 
						|
    internalStream: function (type) {
 | 
						|
        var result = null, outputType = "string";
 | 
						|
        try {
 | 
						|
            if (!type) {
 | 
						|
                throw new Error("No output type specified.");
 | 
						|
            }
 | 
						|
            outputType = type.toLowerCase();
 | 
						|
            var askUnicodeString = outputType === "string" || outputType === "text";
 | 
						|
            if (outputType === "binarystring" || outputType === "text") {
 | 
						|
                outputType = "string";
 | 
						|
            }
 | 
						|
            result = this._decompressWorker();
 | 
						|
 | 
						|
            var isUnicodeString = !this._dataBinary;
 | 
						|
 | 
						|
            if (isUnicodeString && !askUnicodeString) {
 | 
						|
                result = result.pipe(new utf8.Utf8EncodeWorker());
 | 
						|
            }
 | 
						|
            if (!isUnicodeString && askUnicodeString) {
 | 
						|
                result = result.pipe(new utf8.Utf8DecodeWorker());
 | 
						|
            }
 | 
						|
        } catch (e) {
 | 
						|
            result = new GenericWorker("error");
 | 
						|
            result.error(e);
 | 
						|
        }
 | 
						|
 | 
						|
        return new StreamHelper(result, outputType, "");
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare the content in the asked type.
 | 
						|
     * @param {String} type the type of the result.
 | 
						|
     * @param {Function} onUpdate a function to call on each internal update.
 | 
						|
     * @return Promise the promise of the result.
 | 
						|
     */
 | 
						|
    async: function (type, onUpdate) {
 | 
						|
        return this.internalStream(type).accumulate(onUpdate);
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare the content as a nodejs stream.
 | 
						|
     * @param {String} type the type of each chunk.
 | 
						|
     * @param {Function} onUpdate a function to call on each internal update.
 | 
						|
     * @return Stream the stream.
 | 
						|
     */
 | 
						|
    nodeStream: function (type, onUpdate) {
 | 
						|
        return this.internalStream(type || "nodebuffer").toNodejsStream(onUpdate);
 | 
						|
    },
 | 
						|
 | 
						|
    /**
 | 
						|
     * Return a worker for the compressed content.
 | 
						|
     * @private
 | 
						|
     * @param {Object} compression the compression object to use.
 | 
						|
     * @param {Object} compressionOptions the options to use when compressing.
 | 
						|
     * @return Worker the worker.
 | 
						|
     */
 | 
						|
    _compressWorker: function (compression, compressionOptions) {
 | 
						|
        if (
 | 
						|
            this._data instanceof CompressedObject &&
 | 
						|
            this._data.compression.magic === compression.magic
 | 
						|
        ) {
 | 
						|
            return this._data.getCompressedWorker();
 | 
						|
        } else {
 | 
						|
            var result = this._decompressWorker();
 | 
						|
            if(!this._dataBinary) {
 | 
						|
                result = result.pipe(new utf8.Utf8EncodeWorker());
 | 
						|
            }
 | 
						|
            return CompressedObject.createWorkerFrom(result, compression, compressionOptions);
 | 
						|
        }
 | 
						|
    },
 | 
						|
    /**
 | 
						|
     * Return a worker for the decompressed content.
 | 
						|
     * @private
 | 
						|
     * @return Worker the worker.
 | 
						|
     */
 | 
						|
    _decompressWorker : function () {
 | 
						|
        if (this._data instanceof CompressedObject) {
 | 
						|
            return this._data.getContentWorker();
 | 
						|
        } else if (this._data instanceof GenericWorker) {
 | 
						|
            return this._data;
 | 
						|
        } else {
 | 
						|
            return new DataWorker(this._data);
 | 
						|
        }
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
var removedMethods = ["asText", "asBinary", "asNodeBuffer", "asUint8Array", "asArrayBuffer"];
 | 
						|
var removedFn = function () {
 | 
						|
    throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.");
 | 
						|
};
 | 
						|
 | 
						|
for(var i = 0; i < removedMethods.length; i++) {
 | 
						|
    ZipObject.prototype[removedMethods[i]] = removedFn;
 | 
						|
}
 | 
						|
module.exports = ZipObject;
 |