diff --git a/src/core/operations/LZMACompress.mjs b/src/core/operations/LZMACompress.mjs index 0be27089..5a252db2 100644 --- a/src/core/operations/LZMACompress.mjs +++ b/src/core/operations/LZMACompress.mjs @@ -8,6 +8,7 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import { compress } from "@blu3r4y/lzma"; +import {isWorkerEnvironment} from "../Utils.mjs"; /** * LZMA Compress operation @@ -43,7 +44,7 @@ class LZMACompress extends Operation { * @param {Object[]} args * @returns {ArrayBuffer} */ - run(input, args) { + async run(input, args) { const mode = Number(args[0]); return new Promise((resolve, reject) => { compress(new Uint8Array(input), mode, (result, error) => { @@ -53,7 +54,7 @@ class LZMACompress extends Operation { // The compression returns as an Int8Array, but we can just get the unsigned data from the buffer resolve(new Int8Array(result).buffer); }, (percent) => { - self.sendStatusMessage(`Compressing input: ${(percent*100).toFixed(2)}%`); + if (isWorkerEnvironment()) self.sendStatusMessage(`Compressing input: ${(percent*100).toFixed(2)}%`); }); }); } diff --git a/src/core/operations/LZMADecompress.mjs b/src/core/operations/LZMADecompress.mjs index 44908f32..3bebb860 100644 --- a/src/core/operations/LZMADecompress.mjs +++ b/src/core/operations/LZMADecompress.mjs @@ -7,6 +7,7 @@ import Operation from "../Operation.mjs"; import OperationError from "../errors/OperationError.mjs"; import {decompress} from "@blu3r4y/lzma"; +import Utils, {isWorkerEnvironment} from "../Utils.mjs"; /** * LZMA Decompress operation @@ -32,16 +33,21 @@ class LZMADecompress extends Operation { * @param {Object[]} args * @returns {ArrayBuffer} */ - run(input, args) { + async run(input, args) { return new Promise((resolve, reject) => { decompress(new Uint8Array(input), (result, error) => { if (error) { reject(new OperationError(`Failed to decompress input: ${error.message}`)); } - // The decompression returns as an Int8Array, but we can just get the unsigned data from the buffer - resolve(new Int8Array(result).buffer); + // The decompression returns either a String or an untyped unsigned int8 array, but we can just get the unsigned data from the buffer + + if (typeof result == "string") { + resolve(Utils.strToArrayBuffer(result)); + } else { + resolve(new Int8Array(result).buffer); + } }, (percent) => { - self.sendStatusMessage(`Decompressing input: ${(percent*100).toFixed(2)}%`); + if (isWorkerEnvironment()) self.sendStatusMessage(`Decompressing input: ${(percent*100).toFixed(2)}%`); }); }); } diff --git a/tests/operations/tests/Compress.mjs b/tests/operations/tests/Compress.mjs index a1e895bb..015277b1 100644 --- a/tests/operations/tests/Compress.mjs +++ b/tests/operations/tests/Compress.mjs @@ -23,4 +23,56 @@ TestRegister.addTests([ } ], }, + { + name: "LZMA compress & decompress", + input: "The cat sat on the mat.", + // Generated using command `echo -n "The cat sat on the mat." | lzma -z -6 | xxd -p` + expectedOutput: "The cat sat on the mat.", + recipeConfig: [ + { + "op": "LZMA Compress", + "args": ["6"] + }, + { + "op": "LZMA Decompress", + "args": [] + }, + ], + }, + { + name: "LZMA decompress: binary", + // Generated using command `echo "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10" | xxd -r -p | lzma -z -6 | xxd -p` + input: "5d00008000ffffffffffffffff00000052500a84f99bb28021a969d627e03e8a922effffbd160000", + expectedOutput: "00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10", + recipeConfig: [ + { + "op": "From Hex", + "args": ["Space"] + }, + { + "op": "LZMA Decompress", + "args": [] + }, + { + "op": "To Hex", + "args": ["Space", 0] + } + ], + }, + { + name: "LZMA decompress: string", + // Generated using command `echo -n "The cat sat on the mat." | lzma -z -6 | xxd -p` + input: "5d00008000ffffffffffffffff002a1a08a202b1a4b814b912c94c4152e1641907d3fd8cd903ffff4fec0000", + expectedOutput: "The cat sat on the mat.", + recipeConfig: [ + { + "op": "From Hex", + "args": ["Space"] + }, + { + "op": "LZMA Decompress", + "args": [] + } + ], + }, ]);