|
@@ -1,22 +1,6 @@
|
|
import Utils from "../Utils.js";
|
|
import Utils from "../Utils.js";
|
|
-import rawdeflate from "zlibjs/bin/rawdeflate.min";
|
|
|
|
-import rawinflate from "zlibjs/bin/rawinflate.min";
|
|
|
|
-import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min";
|
|
|
|
-import zip from "zlibjs/bin/zip.min";
|
|
|
|
-import unzip from "zlibjs/bin/unzip.min";
|
|
|
|
import bzip2 from "exports-loader?bzip2!../vendor/bzip2.js";
|
|
import bzip2 from "exports-loader?bzip2!../vendor/bzip2.js";
|
|
|
|
|
|
-const Zlib = {
|
|
|
|
- RawDeflate: rawdeflate.Zlib.RawDeflate,
|
|
|
|
- RawInflate: rawinflate.Zlib.RawInflate,
|
|
|
|
- Deflate: zlibAndGzip.Zlib.Deflate,
|
|
|
|
- Inflate: zlibAndGzip.Zlib.Inflate,
|
|
|
|
- Gzip: zlibAndGzip.Zlib.Gzip,
|
|
|
|
- Gunzip: zlibAndGzip.Zlib.Gunzip,
|
|
|
|
- Zip: zip.Zlib.Zip,
|
|
|
|
- Unzip: unzip.Zlib.Unzip,
|
|
|
|
-};
|
|
|
|
-
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
* Compression operations.
|
|
* Compression operations.
|
|
@@ -29,325 +13,6 @@ const Zlib = {
|
|
*/
|
|
*/
|
|
const Compress = {
|
|
const Compress = {
|
|
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- COMPRESSION_TYPE: ["Dynamic Huffman Coding", "Fixed Huffman Coding", "None (Store)"],
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- INFLATE_BUFFER_TYPE: ["Adaptive", "Block"],
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- COMPRESSION_METHOD: ["Deflate", "None (Store)"],
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- OS: ["MSDOS", "Unix", "Macintosh"],
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- RAW_COMPRESSION_TYPE_LOOKUP: {
|
|
|
|
- "Fixed Huffman Coding": Zlib.RawDeflate.CompressionType.FIXED,
|
|
|
|
- "Dynamic Huffman Coding": Zlib.RawDeflate.CompressionType.DYNAMIC,
|
|
|
|
- "None (Store)": Zlib.RawDeflate.CompressionType.NONE,
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Raw Deflate operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runRawDeflate: function(input, args) {
|
|
|
|
- const deflate = new Zlib.RawDeflate(input, {
|
|
|
|
- compressionType: Compress.RAW_COMPRESSION_TYPE_LOOKUP[args[0]]
|
|
|
|
- });
|
|
|
|
- return Array.prototype.slice.call(deflate.compress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- INFLATE_INDEX: 0,
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- INFLATE_BUFFER_SIZE: 0,
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- INFLATE_RESIZE: false,
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- INFLATE_VERIFY: false,
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- RAW_BUFFER_TYPE_LOOKUP: {
|
|
|
|
- "Adaptive": Zlib.RawInflate.BufferType.ADAPTIVE,
|
|
|
|
- "Block": Zlib.RawInflate.BufferType.BLOCK,
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Raw Inflate operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runRawInflate: function(input, args) {
|
|
|
|
- // Deal with character encoding issues
|
|
|
|
- input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
|
|
|
|
- let inflate = new Zlib.RawInflate(input, {
|
|
|
|
- index: args[0],
|
|
|
|
- bufferSize: args[1],
|
|
|
|
- bufferType: Compress.RAW_BUFFER_TYPE_LOOKUP[args[2]],
|
|
|
|
- resize: args[3],
|
|
|
|
- verify: args[4]
|
|
|
|
- }),
|
|
|
|
- result = Array.prototype.slice.call(inflate.decompress());
|
|
|
|
-
|
|
|
|
- // Raw Inflate somethimes messes up and returns nonsense like this:
|
|
|
|
- // ]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]....]...
|
|
|
|
- // e.g. Input data of [8b, 1d, dc, 44]
|
|
|
|
- // Look for the first two square brackets:
|
|
|
|
- if (result.length > 158 && result[0] === 93 && result[5] === 93) {
|
|
|
|
- // If the first two square brackets are there, check that the others
|
|
|
|
- // are also there. If they are, throw an error. If not, continue.
|
|
|
|
- let valid = false;
|
|
|
|
- for (let i = 0; i < 155; i += 5) {
|
|
|
|
- if (result[i] !== 93) {
|
|
|
|
- valid = true;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if (!valid) {
|
|
|
|
- throw "Error: Unable to inflate data";
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // Trust me, this is the easiest way...
|
|
|
|
- return result;
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- ZLIB_COMPRESSION_TYPE_LOOKUP: {
|
|
|
|
- "Fixed Huffman Coding": Zlib.Deflate.CompressionType.FIXED,
|
|
|
|
- "Dynamic Huffman Coding": Zlib.Deflate.CompressionType.DYNAMIC,
|
|
|
|
- "None (Store)": Zlib.Deflate.CompressionType.NONE,
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Zlib Deflate operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runZlibDeflate: function(input, args) {
|
|
|
|
- const deflate = new Zlib.Deflate(input, {
|
|
|
|
- compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
|
|
|
|
- });
|
|
|
|
- return Array.prototype.slice.call(deflate.compress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- ZLIB_BUFFER_TYPE_LOOKUP: {
|
|
|
|
- "Adaptive": Zlib.Inflate.BufferType.ADAPTIVE,
|
|
|
|
- "Block": Zlib.Inflate.BufferType.BLOCK,
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Zlib Inflate operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runZlibInflate: function(input, args) {
|
|
|
|
- // Deal with character encoding issues
|
|
|
|
- input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
|
|
|
|
- const inflate = new Zlib.Inflate(input, {
|
|
|
|
- index: args[0],
|
|
|
|
- bufferSize: args[1],
|
|
|
|
- bufferType: Compress.ZLIB_BUFFER_TYPE_LOOKUP[args[2]],
|
|
|
|
- resize: args[3],
|
|
|
|
- verify: args[4]
|
|
|
|
- });
|
|
|
|
- return Array.prototype.slice.call(inflate.decompress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- GZIP_CHECKSUM: false,
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Gzip operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runGzip: function(input, args) {
|
|
|
|
- let filename = args[1],
|
|
|
|
- comment = args[2],
|
|
|
|
- options = {
|
|
|
|
- deflateOptions: {
|
|
|
|
- compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
|
|
|
|
- },
|
|
|
|
- flags: {
|
|
|
|
- fhcrc: args[3]
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- if (filename.length) {
|
|
|
|
- options.flags.fname = true;
|
|
|
|
- options.filename = filename;
|
|
|
|
- }
|
|
|
|
- if (comment.length) {
|
|
|
|
- options.flags.fcommenct = true;
|
|
|
|
- options.comment = comment;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- const gzip = new Zlib.Gzip(input, options);
|
|
|
|
- return Array.prototype.slice.call(gzip.compress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Gunzip operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runGunzip: function(input, args) {
|
|
|
|
- // Deal with character encoding issues
|
|
|
|
- input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
|
|
|
|
- const gunzip = new Zlib.Gunzip(input);
|
|
|
|
- return Array.prototype.slice.call(gunzip.decompress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- PKZIP_FILENAME: "file.txt",
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- ZIP_COMPRESSION_METHOD_LOOKUP: {
|
|
|
|
- "Deflate": Zlib.Zip.CompressionMethod.DEFLATE,
|
|
|
|
- "None (Store)": Zlib.Zip.CompressionMethod.STORE
|
|
|
|
- },
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- ZIP_OS_LOOKUP: {
|
|
|
|
- "MSDOS": Zlib.Zip.OperatingSystem.MSDOS,
|
|
|
|
- "Unix": Zlib.Zip.OperatingSystem.UNIX,
|
|
|
|
- "Macintosh": Zlib.Zip.OperatingSystem.MACINTOSH
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Zip operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {byteArray}
|
|
|
|
- */
|
|
|
|
- runPkzip: function(input, args) {
|
|
|
|
- let password = Utils.strToByteArray(args[2]),
|
|
|
|
- options = {
|
|
|
|
- filename: Utils.strToByteArray(args[0]),
|
|
|
|
- comment: Utils.strToByteArray(args[1]),
|
|
|
|
- compressionMethod: Compress.ZIP_COMPRESSION_METHOD_LOOKUP[args[3]],
|
|
|
|
- os: Compress.ZIP_OS_LOOKUP[args[4]],
|
|
|
|
- deflateOption: {
|
|
|
|
- compressionType: Compress.ZLIB_COMPRESSION_TYPE_LOOKUP[args[5]]
|
|
|
|
- },
|
|
|
|
- },
|
|
|
|
- zip = new Zlib.Zip();
|
|
|
|
-
|
|
|
|
- if (password.length)
|
|
|
|
- zip.setPassword(password);
|
|
|
|
- zip.addFile(input, options);
|
|
|
|
- return Array.prototype.slice.call(zip.compress());
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * @constant
|
|
|
|
- * @default
|
|
|
|
- */
|
|
|
|
- PKUNZIP_VERIFY: false,
|
|
|
|
-
|
|
|
|
- /**
|
|
|
|
- * Unzip operation.
|
|
|
|
- *
|
|
|
|
- * @param {byteArray} input
|
|
|
|
- * @param {Object[]} args
|
|
|
|
- * @returns {string}
|
|
|
|
- */
|
|
|
|
- runPkunzip: function(input, args) {
|
|
|
|
- let options = {
|
|
|
|
- password: Utils.strToByteArray(args[0]),
|
|
|
|
- verify: args[1]
|
|
|
|
- },
|
|
|
|
- unzip = new Zlib.Unzip(input, options),
|
|
|
|
- filenames = unzip.getFilenames(),
|
|
|
|
- files = [];
|
|
|
|
-
|
|
|
|
- filenames.forEach(function(fileName) {
|
|
|
|
- const bytes = unzip.decompress(fileName);
|
|
|
|
- const contents = Utils.byteArrayToUtf8(bytes);
|
|
|
|
-
|
|
|
|
- const file = {
|
|
|
|
- fileName: fileName,
|
|
|
|
- size: contents.length,
|
|
|
|
- };
|
|
|
|
-
|
|
|
|
- const isDir = contents.length === 0 && fileName.endsWith("/");
|
|
|
|
- if (!isDir) {
|
|
|
|
- file.bytes = bytes;
|
|
|
|
- file.contents = contents;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- files.push(file);
|
|
|
|
- });
|
|
|
|
-
|
|
|
|
- return Utils.displayFilesAsHTML(files);
|
|
|
|
- },
|
|
|
|
-
|
|
|
|
-
|
|
|
|
/**
|
|
/**
|
|
* Bzip2 Decompress operation.
|
|
* Bzip2 Decompress operation.
|
|
*
|
|
*
|