Browse Source

Bzip2 compression support changed to use wasm backend

x4 speed.
Matt 6 years ago
parent
commit
a339eacd45
3 changed files with 42 additions and 45 deletions
  1. 14 33
      package-lock.json
  2. 1 1
      package.json
  3. 27 11
      src/core/operations/Bzip2Decompress.mjs

+ 14 - 33
package-lock.json

@@ -5263,8 +5263,7 @@
         "ansi-regex": {
         "ansi-regex": {
           "version": "2.1.1",
           "version": "2.1.1",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "aproba": {
         "aproba": {
           "version": "1.2.0",
           "version": "1.2.0",
@@ -5285,14 +5284,12 @@
         "balanced-match": {
         "balanced-match": {
           "version": "1.0.0",
           "version": "1.0.0",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "brace-expansion": {
         "brace-expansion": {
           "version": "1.1.11",
           "version": "1.1.11",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "balanced-match": "^1.0.0",
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
             "concat-map": "0.0.1"
@@ -5307,20 +5304,17 @@
         "code-point-at": {
         "code-point-at": {
           "version": "1.1.0",
           "version": "1.1.0",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "concat-map": {
         "concat-map": {
           "version": "0.0.1",
           "version": "0.0.1",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "console-control-strings": {
         "console-control-strings": {
           "version": "1.1.0",
           "version": "1.1.0",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "core-util-is": {
         "core-util-is": {
           "version": "1.0.2",
           "version": "1.0.2",
@@ -5437,8 +5431,7 @@
         "inherits": {
         "inherits": {
           "version": "2.0.3",
           "version": "2.0.3",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "ini": {
         "ini": {
           "version": "1.3.5",
           "version": "1.3.5",
@@ -5450,7 +5443,6 @@
           "version": "1.0.0",
           "version": "1.0.0",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "number-is-nan": "^1.0.0"
             "number-is-nan": "^1.0.0"
           }
           }
@@ -5465,7 +5457,6 @@
           "version": "3.0.4",
           "version": "3.0.4",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "brace-expansion": "^1.1.7"
             "brace-expansion": "^1.1.7"
           }
           }
@@ -5473,14 +5464,12 @@
         "minimist": {
         "minimist": {
           "version": "0.0.8",
           "version": "0.0.8",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "minipass": {
         "minipass": {
           "version": "2.3.5",
           "version": "2.3.5",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "safe-buffer": "^5.1.2",
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
             "yallist": "^3.0.0"
@@ -5499,7 +5488,6 @@
           "version": "0.5.1",
           "version": "0.5.1",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "minimist": "0.0.8"
             "minimist": "0.0.8"
           }
           }
@@ -5580,8 +5568,7 @@
         "number-is-nan": {
         "number-is-nan": {
           "version": "1.0.1",
           "version": "1.0.1",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "object-assign": {
         "object-assign": {
           "version": "4.1.1",
           "version": "4.1.1",
@@ -5593,7 +5580,6 @@
           "version": "1.4.0",
           "version": "1.4.0",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "wrappy": "1"
             "wrappy": "1"
           }
           }
@@ -5679,8 +5665,7 @@
         "safe-buffer": {
         "safe-buffer": {
           "version": "5.1.2",
           "version": "5.1.2",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "safer-buffer": {
         "safer-buffer": {
           "version": "2.1.2",
           "version": "2.1.2",
@@ -5716,7 +5701,6 @@
           "version": "1.0.2",
           "version": "1.0.2",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "code-point-at": "^1.0.0",
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -5736,7 +5720,6 @@
           "version": "3.0.1",
           "version": "3.0.1",
           "bundled": true,
           "bundled": true,
           "dev": true,
           "dev": true,
-          "optional": true,
           "requires": {
           "requires": {
             "ansi-regex": "^2.0.0"
             "ansi-regex": "^2.0.0"
           }
           }
@@ -5780,14 +5763,12 @@
         "wrappy": {
         "wrappy": {
           "version": "1.0.2",
           "version": "1.0.2",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         },
         },
         "yallist": {
         "yallist": {
           "version": "3.0.3",
           "version": "3.0.3",
           "bundled": true,
           "bundled": true,
-          "dev": true,
-          "optional": true
+          "dev": true
         }
         }
       }
       }
     },
     },
@@ -7905,9 +7886,9 @@
       "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA="
       "integrity": "sha1-ZMTwJfF/1Tv7RXY/rrFvAVp0dVA="
     },
     },
     "libbzip2-wasm": {
     "libbzip2-wasm": {
-      "version": "0.0.3",
-      "resolved": "https://registry.npmjs.org/libbzip2-wasm/-/libbzip2-wasm-0.0.3.tgz",
-      "integrity": "sha512-eJpB5ITwsdyjWu7DUJirHaBSFLhSbcz8txvL0Gf9NOb+HIzp/lRxFSDXyNAi59ncbhHe3xX+3gj0o+l8rSdJHQ=="
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/libbzip2-wasm/-/libbzip2-wasm-0.0.4.tgz",
+      "integrity": "sha512-RqscTx95+RTKhFAyjedsboR0Lmo3zd8//EuRwQXkdWmsCwYlzarVRaiYg6kS1O8m10MCQkGdrnlK9L4eAmZUwA=="
     },
     },
     "libyara-wasm": {
     "libyara-wasm": {
       "version": "0.0.12",
       "version": "0.0.12",

+ 1 - 1
package.json

@@ -117,7 +117,7 @@
     "jsqr": "^1.2.0",
     "jsqr": "^1.2.0",
     "jsrsasign": "8.0.12",
     "jsrsasign": "8.0.12",
     "kbpgp": "2.1.0",
     "kbpgp": "2.1.0",
-    "libbzip2-wasm": "0.0.3",
+    "libbzip2-wasm": "0.0.4",
     "libyara-wasm": "0.0.12",
     "libyara-wasm": "0.0.12",
     "lodash": "^4.17.11",
     "lodash": "^4.17.11",
     "loglevel": "^1.6.1",
     "loglevel": "^1.6.1",

+ 27 - 11
src/core/operations/Bzip2Decompress.mjs

@@ -5,8 +5,8 @@
  */
  */
 
 
 import Operation from "../Operation";
 import Operation from "../Operation";
-import bzip2 from "../vendor/bzip2";
 import OperationError from "../errors/OperationError";
 import OperationError from "../errors/OperationError";
+import Bzip2 from "libbzip2-wasm";
 
 
 /**
 /**
  * Bzip2 Decompress operation
  * Bzip2 Decompress operation
@@ -23,9 +23,15 @@ class Bzip2Decompress extends Operation {
         this.module = "Compression";
         this.module = "Compression";
         this.description = "Decompresses data using the Bzip2 algorithm.";
         this.description = "Decompresses data using the Bzip2 algorithm.";
         this.infoURL = "https://wikipedia.org/wiki/Bzip2";
         this.infoURL = "https://wikipedia.org/wiki/Bzip2";
-        this.inputType = "byteArray";
-        this.outputType = "string";
-        this.args = [];
+        this.inputType = "ArrayBuffer";
+        this.outputType = "ArrayBuffer";
+        this.args = [
+            {
+                name: "Use low-memory, slower decompression algorithm",
+                type: "boolean",
+                value: false
+            }
+        ];
         this.patterns = [
         this.patterns = [
             {
             {
                 "match": "^\\x42\\x5a\\x68",
                 "match": "^\\x42\\x5a\\x68",
@@ -41,14 +47,24 @@ class Bzip2Decompress extends Operation {
      * @returns {string}
      * @returns {string}
      */
      */
     run(input, args) {
     run(input, args) {
-        const compressed = new Uint8Array(input);
-
-        try {
-            const bzip2Reader = bzip2.array(compressed);
-            return bzip2.simple(bzip2Reader);
-        } catch (err) {
-            throw new OperationError(err);
+        const [small] = args;
+        if (input.byteLength <= 0) {
+            throw new OperationError("Please provide an input.");
         }
         }
+        if (ENVIRONMENT_IS_WORKER()) self.sendStatusMessage("Loading Bzip2...");
+        return new Promise((resolve, reject) => {
+            Bzip2().then(bzip2 => {
+                if (ENVIRONMENT_IS_WORKER()) self.sendStatusMessage("Decompressing data...");
+                const inpArray = new Uint8Array(input);
+                const bzip2cc = bzip2.decompressBZ2(inpArray, small ? 1 : 0);
+                if (bzip2cc.error !== 0) {
+                    reject(new OperationError(bzip2cc.error_msg));
+                } else {
+                    const output = bzip2cc.output;
+                    resolve(output.buffer.slice(output.byteOffset, output.byteLength + output.byteOffset));
+                }
+            });
+        });
     }
     }
 
 
 }
 }