@loaders.gl/compression 3.0.12 → 3.1.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/compression-worker.js +7 -41054
  2. package/dist/compression-worker.js.map +1 -1
  3. package/dist/dist.min.js +1 -1
  4. package/dist/dist.min.js.map +1 -1
  5. package/dist/es5/bundle.js +2 -4
  6. package/dist/es5/bundle.js.map +1 -1
  7. package/dist/es5/compression-worker.js +27 -0
  8. package/dist/es5/compression-worker.js.map +1 -0
  9. package/dist/es5/index.js +13 -12
  10. package/dist/es5/index.js.map +1 -1
  11. package/dist/es5/lib/compression.js +13 -4
  12. package/dist/es5/lib/compression.js.map +1 -1
  13. package/dist/es5/lib/lz4-compression.js +84 -3
  14. package/dist/es5/lib/lz4-compression.js.map +1 -1
  15. package/dist/es5/lib/lzo-compression.js +0 -12
  16. package/dist/es5/lib/lzo-compression.js.map +1 -1
  17. package/dist/es5/workers/worker.js +0 -7
  18. package/dist/es5/workers/worker.js.map +1 -1
  19. package/dist/esm/bundle.js +2 -4
  20. package/dist/esm/bundle.js.map +1 -1
  21. package/dist/esm/compression-worker.js +14 -0
  22. package/dist/esm/compression-worker.js.map +1 -0
  23. package/dist/esm/index.js +1 -10
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/lib/compression.js +11 -3
  26. package/dist/esm/lib/compression.js.map +1 -1
  27. package/dist/esm/lib/lz4-compression.js +81 -3
  28. package/dist/esm/lib/lz4-compression.js.map +1 -1
  29. package/dist/esm/lib/lzo-compression.js +1 -7
  30. package/dist/esm/lib/lzo-compression.js.map +1 -1
  31. package/dist/esm/workers/worker.js +0 -5
  32. package/dist/esm/workers/worker.js.map +1 -1
  33. package/package.json +5 -5
  34. package/src/bundle.ts +2 -3
  35. package/src/compression-worker.ts +34 -0
  36. package/src/index.ts +2 -42
  37. package/src/lib/compression.ts +10 -3
  38. package/src/lib/lz4-compression.ts +140 -3
  39. package/src/lib/lzo-compression.ts +5 -5
  40. package/src/workers/worker.ts +4 -4
  41. package/dist/dist.es5.min.js +0 -2
  42. package/dist/dist.es5.min.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/lz4-compression.ts"],"names":["Compression","lz4js","LZ4Compression","constructor","options","modules","Error","name","compressSync","input","inputArray","Uint8Array","compress","buffer","decompressSync","decompress"],"mappings":";AAEA,SAAQA,WAAR,QAA0B,eAA1B;AAGA,IAAIC,KAAJ;AAKA,OAAO,MAAMC,cAAN,SAA6BF,WAA7B,CAAyC;AAO9CG,EAAAA,WAAW,CAACC,OAAD,EAA8B;AAAA;;AACvC,UAAMA,OAAN;;AADuC,kCANjB,KAMiB;;AAAA,wCALnB,CAAC,KAAD,CAKmB;;AAAA,8CAJb,CAAC,OAAD,CAIa;;AAAA,yCAHlB,IAGkB;;AAAA;;AAEvC,SAAKA,OAAL,GAAeA,OAAf;AAEAH,IAAAA,KAAK,GAAGA,KAAK,sBAAI,KAAKG,OAAT,2EAAI,cAAcC,OAAlB,0DAAI,sBAAuBJ,KAA3B,CAAb;;AACA,QAAI,CAACA,KAAL,EAAY;AACV,YAAM,IAAIK,KAAJ,CAAU,KAAKC,IAAf,CAAN;AACD;AACF;;AAEDC,EAAAA,YAAY,CAACC,KAAD,EAAkC;AAC5C,UAAMC,UAAU,GAAG,IAAIC,UAAJ,CAAeF,KAAf,CAAnB;AACA,WAAOR,KAAK,CAACW,QAAN,CAAeF,UAAf,EAA2BG,MAAlC;AACD;;AAEDC,EAAAA,cAAc,CAACL,KAAD,EAAkC;AAC9C,UAAMC,UAAU,GAAG,IAAIC,UAAJ,CAAeF,KAAf,CAAnB;AACA,WAAOR,KAAK,CAACc,UAAN,CAAiBL,UAAjB,EAA6BG,MAApC;AACD;;AAzB6C","sourcesContent":["// LZ4\nimport type {CompressionOptions} from './compression';\nimport {Compression} from './compression';\n// import lz4js from 'lz4js'; // https://bundlephobia.com/package/lz4\n\nlet lz4js;\n\n/**\n * LZ4 compression / decompression\n */\nexport class LZ4Compression extends Compression {\n readonly name: string = 'lz4';\n readonly extensions = ['lz4'];\n readonly contentEncodings = ['x-lz4'];\n readonly isSupported = true;\n readonly options: CompressionOptions;\n\n constructor(options: CompressionOptions) {\n super(options);\n this.options = options;\n\n lz4js = lz4js || this.options?.modules?.lz4js;\n if (!lz4js) {\n throw new Error(this.name);\n }\n }\n\n compressSync(input: ArrayBuffer): ArrayBuffer {\n const inputArray = new Uint8Array(input);\n return lz4js.compress(inputArray).buffer;\n }\n\n decompressSync(input: ArrayBuffer): ArrayBuffer {\n const inputArray = new Uint8Array(input);\n return lz4js.decompress(inputArray).buffer;\n }\n}\n"],"file":"lz4-compression.js"}
1
+ {"version":3,"sources":["../../../src/lib/lz4-compression.ts"],"names":["toArrayBuffer","Compression","LZ4_MAGIC_NUMBER","lz4js","LZ4Compression","constructor","options","modules","Error","name","compressSync","input","inputArray","Uint8Array","compress","buffer","decompressSync","data","maxSize","isMagicNumberExists","checkMagicNumber","decompress","error","improveError","uncompressed","uncompressedSize","decodeBlock","slice","output","startIndex","endIndex","length","index","token","literalsLength","end","offset","matchLength","pos","magic","Uint32Array"],"mappings":"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","sourcesContent":["// Copyright (c) 2012 Pierre Curto\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n/* eslint-disable complexity */\n/* eslint-disable max-statements */\n\n// LZ4\nimport {toArrayBuffer} from '@loaders.gl/loader-utils';\nimport type {CompressionOptions} from './compression';\nimport {Compression} from './compression';\n// import lz4js from 'lz4js'; // https://bundlephobia.com/package/lz4\nconst LZ4_MAGIC_NUMBER = 0x184d2204;\n\nlet lz4js;\n\n/**\n * LZ4 compression / decompression\n */\nexport class LZ4Compression extends Compression {\n readonly name: string = 'lz4';\n readonly extensions = ['lz4'];\n readonly contentEncodings = ['x-lz4'];\n readonly isSupported = true;\n readonly options: CompressionOptions;\n\n constructor(options: CompressionOptions) {\n super(options);\n this.options = options;\n\n lz4js = lz4js || this.options?.modules?.lz4js;\n if (!lz4js) {\n throw new Error(this.name);\n }\n }\n\n compressSync(input: ArrayBuffer): ArrayBuffer {\n const inputArray = new Uint8Array(input);\n return lz4js.compress(inputArray).buffer;\n }\n\n /**\n * Decompresses an ArrayBuffer containing an Lz4 frame. maxSize is optional; if not\n * provided, a maximum size will be determined by examining the data. The\n * returned ArrayBuffer will always be perfectly sized.\n * If data provided without magic number we will parse it as block\n */\n decompressSync(data: ArrayBuffer, maxSize?: number): ArrayBuffer {\n try {\n const isMagicNumberExists = this.checkMagicNumber(data);\n const inputArray = new Uint8Array(data);\n\n if (isMagicNumberExists) {\n return lz4js.decompress(inputArray, maxSize).buffer;\n }\n\n if (!maxSize) {\n const error = new Error('Need to provide maxSize');\n throw this.improveError(error);\n }\n\n let uncompressed = new Uint8Array(maxSize);\n const uncompressedSize = this.decodeBlock(inputArray, uncompressed);\n uncompressed = uncompressed.slice(0, uncompressedSize);\n\n return toArrayBuffer(uncompressed);\n } catch (error) {\n throw this.improveError(error);\n }\n }\n\n /**\n * Decode lz4 file as block\n * Solution taken from here\n * https://github.com/pierrec/node-lz4/blob/0dac687262403fd34f905b963da7220692f2a4a1/lib/binding.js#L25\n * @param input\n * @param output\n * @param startIndex\n * @param endIndex\n */\n decodeBlock(\n data: Uint8Array,\n output: Uint8Array,\n startIndex?: number,\n endIndex?: number\n ): number {\n startIndex = startIndex || 0;\n endIndex = endIndex || data.length - startIndex;\n\n let uncompressedSize = 0;\n // Process each sequence in the incoming data\n for (let index = startIndex; index < endIndex; ) {\n const token = data[index++];\n\n // Literals\n let literalsLength = token >> 4;\n\n if (literalsLength > 0) {\n // length of literals\n let length = literalsLength + 240;\n\n while (length === 255) {\n length = data[index++];\n literalsLength += length;\n }\n\n // Copy the literals\n const end = index + literalsLength;\n\n while (index < end) {\n output[uncompressedSize++] = data[index++];\n }\n\n // End of buffer?\n if (index === endIndex) {\n return uncompressedSize;\n }\n }\n\n // Match copy\n // 2 bytes offset (little endian)\n const offset = data[index++] | (data[index++] << 8);\n\n // 0 is an invalid offset value\n if (offset === 0 || offset > uncompressedSize) {\n return -(index - 2);\n }\n\n // length of match copy\n let matchLength = token & 0xf;\n let length = matchLength + 240;\n\n while (length === 255) {\n length = data[index++];\n matchLength += length;\n }\n\n // Copy the match\n let pos = uncompressedSize - offset; // position of the match copy in the current output\n const end = uncompressedSize + matchLength + 4; // minmatch = 4\n\n while (uncompressedSize < end) {\n output[uncompressedSize++] = output[pos++];\n }\n }\n\n return uncompressedSize;\n }\n\n /**\n * Compare file magic with lz4 magic number\n * @param input\n */\n checkMagicNumber(data: ArrayBuffer): boolean {\n const magic = new Uint32Array(data.slice(0, 4));\n return magic[0] === LZ4_MAGIC_NUMBER;\n }\n}\n"],"file":"lz4-compression.js"}
@@ -1,9 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- import { loadLibrary } from '@loaders.gl/worker-utils';
3
2
  import { toBuffer } from '@loaders.gl/loader-utils';
4
3
  import { Compression } from './compression';
5
- const LZO_WASM_JS_URL = './node_modules/lzo-wasm/lzo-wasm.js';
6
- const LZO_WASM_WASM_URL = './node_modules/lzo-wasm/lzo-wasm.wasm';
7
4
  let lzo;
8
5
  export class LZOCompression extends Compression {
9
6
  constructor(options) {
@@ -29,10 +26,7 @@ export class LZOCompression extends Compression {
29
26
  }
30
27
  }
31
28
 
32
- async preload() {
33
- await loadLibrary(LZO_WASM_JS_URL);
34
- await loadLibrary(LZO_WASM_WASM_URL);
35
- }
29
+ async preload() {}
36
30
 
37
31
  async compress(input) {
38
32
  await this.preload();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/lib/lzo-compression.ts"],"names":["loadLibrary","toBuffer","Compression","LZO_WASM_JS_URL","LZO_WASM_WASM_URL","lzo","LZOCompression","constructor","options","modules","Error","name","preload","compress","input","inputBuffer","buffer","decompress","error"],"mappings":";AACA,SAAQA,WAAR,QAA0B,0BAA1B;AACA,SAAQC,QAAR,QAAuB,0BAAvB;AAGA,SAAQC,WAAR,QAA0B,eAA1B;AAMA,MAAMC,eAAe,GAAG,qCAAxB;AACA,MAAMC,iBAAiB,GAAG,uCAA1B;AAEA,IAAIC,GAAJ;AAKA,OAAO,MAAMC,cAAN,SAA6BJ,WAA7B,CAAyC;AAW9CK,EAAAA,WAAW,CAACC,OAAD,EAA8B;AAAA;;AACvC,UAAMA,OAAN;;AADuC,kCAVzB,KAUyB;;AAAA,wCATnB,EASmB;;AAAA,8CARb,EAQa;;AAAA,yCAPlB,KAOkB;;AAAA;;AAEvC,SAAKA,OAAL,GAAeA,OAAf;AAEAH,IAAAA,GAAG,GAAGA,GAAG,sBAAI,KAAKG,OAAT,2EAAI,cAAcC,OAAlB,0DAAI,sBAAuBJ,GAA3B,CAAT;;AACA,QAAI,CAACA,GAAL,EAAU;AACR,YAAM,IAAIK,KAAJ,CAAU,KAAKC,IAAf,CAAN;AACD;AACF;;AAEY,QAAPC,OAAO,GAAG;AACd,UAAMZ,WAAW,CAACG,eAAD,CAAjB;AACA,UAAMH,WAAW,CAACI,iBAAD,CAAjB;AACD;;AAEa,QAARS,QAAQ,CAACC,KAAD,EAA2C;AACvD,UAAM,KAAKF,OAAL,EAAN;AAEA,UAAMG,WAAW,GAAGd,QAAQ,CAACa,KAAD,CAA5B;AACA,WAAOT,GAAG,CAACQ,QAAJ,CAAaE,WAAb,EAA0BC,MAAjC;AACD;;AAEe,QAAVC,UAAU,CAACH,KAAD,EAA2C;AACzD,QAAI;AACF,YAAM,KAAKF,OAAL,EAAN;AAEA,YAAMG,WAAW,GAAGd,QAAQ,CAACa,KAAD,CAA5B;AACA,aAAOT,GAAG,CAACY,UAAJ,CAAeF,WAAf,EAA4BC,MAAnC;AACD,KALD,CAKE,OAAOE,KAAP,EAAc;AAGd,YAAMA,KAAN;AACD;AACF;;AA5C6C","sourcesContent":["// LZO\nimport {loadLibrary} from '@loaders.gl/worker-utils';\nimport {toBuffer} from '@loaders.gl/loader-utils';\n\nimport type {CompressionOptions} from './compression';\nimport {Compression} from './compression';\n// import {isBrowser} from '@loaders.gl/loader-utils';\n\n// import lzo from 'lzo'; // https://bundlephobia.com/package/lzo\n// import {decompress} from 'lzo-wasm';\n\nconst LZO_WASM_JS_URL = './node_modules/lzo-wasm/lzo-wasm.js';\nconst LZO_WASM_WASM_URL = './node_modules/lzo-wasm/lzo-wasm.wasm';\n\nlet lzo;\n\n/**\n * Lempel-Ziv-Oberheimer compression / decompression\n */\nexport class LZOCompression extends Compression {\n readonly name = 'lzo';\n readonly extensions = [];\n readonly contentEncodings = [];\n readonly isSupported = false; // !isBrowser;\n readonly options: CompressionOptions;\n\n /**\n * lzo is an injectable dependency due to big size\n * @param options\n */\n constructor(options: CompressionOptions) {\n super(options);\n this.options = options;\n\n lzo = lzo || this.options?.modules?.lzo;\n if (!lzo) {\n throw new Error(this.name);\n }\n }\n\n async preload() {\n await loadLibrary(LZO_WASM_JS_URL);\n await loadLibrary(LZO_WASM_WASM_URL);\n }\n\n async compress(input: ArrayBuffer): Promise<ArrayBuffer> {\n await this.preload();\n // const inputArray = new Uint8Array(input);\n const inputBuffer = toBuffer(input);\n return lzo.compress(inputBuffer).buffer;\n }\n\n async decompress(input: ArrayBuffer): Promise<ArrayBuffer> {\n try {\n await this.preload();\n // const inputArray = new Uint8Array(input);\n const inputBuffer = toBuffer(input);\n return lzo.decompress(inputBuffer).buffer;\n } catch (error) {\n // TODO - solve SharedArrayBuffer issues\n // return decompress(input);\n throw error;\n }\n }\n}\n"],"file":"lzo-compression.js"}
1
+ {"version":3,"sources":["../../../src/lib/lzo-compression.ts"],"names":["toBuffer","Compression","lzo","LZOCompression","constructor","options","modules","Error","name","preload","compress","input","inputBuffer","buffer","decompress","error"],"mappings":";AAEA,SAAQA,QAAR,QAAuB,0BAAvB;AAGA,SAAQC,WAAR,QAA0B,eAA1B;AASA,IAAIC,GAAJ;AAKA,OAAO,MAAMC,cAAN,SAA6BF,WAA7B,CAAyC;AAW9CG,EAAAA,WAAW,CAACC,OAAD,EAA8B;AAAA;;AACvC,UAAMA,OAAN;;AADuC,kCAVzB,KAUyB;;AAAA,wCATnB,EASmB;;AAAA,8CARb,EAQa;;AAAA,yCAPlB,KAOkB;;AAAA;;AAEvC,SAAKA,OAAL,GAAeA,OAAf;AAEAH,IAAAA,GAAG,GAAGA,GAAG,sBAAI,KAAKG,OAAT,2EAAI,cAAcC,OAAlB,0DAAI,sBAAuBJ,GAA3B,CAAT;;AACA,QAAI,CAACA,GAAL,EAAU;AACR,YAAM,IAAIK,KAAJ,CAAU,KAAKC,IAAf,CAAN;AACD;AACF;;AAEY,QAAPC,OAAO,GAAG,CAGf;;AAEa,QAARC,QAAQ,CAACC,KAAD,EAA2C;AACvD,UAAM,KAAKF,OAAL,EAAN;AAEA,UAAMG,WAAW,GAAGZ,QAAQ,CAACW,KAAD,CAA5B;AACA,WAAOT,GAAG,CAACQ,QAAJ,CAAaE,WAAb,EAA0BC,MAAjC;AACD;;AAEe,QAAVC,UAAU,CAACH,KAAD,EAA2C;AACzD,QAAI;AACF,YAAM,KAAKF,OAAL,EAAN;AAEA,YAAMG,WAAW,GAAGZ,QAAQ,CAACW,KAAD,CAA5B;AACA,aAAOT,GAAG,CAACY,UAAJ,CAAeF,WAAf,EAA4BC,MAAnC;AACD,KALD,CAKE,OAAOE,KAAP,EAAc;AAGd,YAAMA,KAAN;AACD;AACF;;AA5C6C","sourcesContent":["// LZO\n// import {loadLibrary} from '@loaders.gl/worker-utils';\nimport {toBuffer} from '@loaders.gl/loader-utils';\n\nimport type {CompressionOptions} from './compression';\nimport {Compression} from './compression';\n// import {isBrowser} from '@loaders.gl/loader-utils';\n\n// import lzo from 'lzo'; // https://bundlephobia.com/package/lzo\n// import {decompress} from 'lzo-wasm';\n\n// const LZO_WASM_JS_URL = './node_modules/lzo-wasm/lzo-wasm.js';\n// const LZO_WASM_WASM_URL = './node_modules/lzo-wasm/lzo-wasm.wasm';\n\nlet lzo;\n\n/**\n * Lempel-Ziv-Oberheimer compression / decompression\n */\nexport class LZOCompression extends Compression {\n readonly name = 'lzo';\n readonly extensions = [];\n readonly contentEncodings = [];\n readonly isSupported = false; // !isBrowser;\n readonly options: CompressionOptions;\n\n /**\n * lzo is an injectable dependency due to big size\n * @param options\n */\n constructor(options: CompressionOptions) {\n super(options);\n this.options = options;\n\n lzo = lzo || this.options?.modules?.lzo;\n if (!lzo) {\n throw new Error(this.name);\n }\n }\n\n async preload() {\n // await loadLibrary(LZO_WASM_JS_URL);\n // await loadLibrary(LZO_WASM_WASM_URL);\n }\n\n async compress(input: ArrayBuffer): Promise<ArrayBuffer> {\n await this.preload();\n // const inputArray = new Uint8Array(input);\n const inputBuffer = toBuffer(input);\n return lzo.compress(inputBuffer).buffer;\n }\n\n async decompress(input: ArrayBuffer): Promise<ArrayBuffer> {\n try {\n await this.preload();\n // const inputArray = new Uint8Array(input);\n const inputBuffer = toBuffer(input);\n return lzo.decompress(inputBuffer).buffer;\n } catch (error) {\n // TODO - solve SharedArrayBuffer issues\n // return decompress(input);\n throw error;\n }\n }\n}\n"],"file":"lzo-compression.js"}
@@ -4,12 +4,10 @@ import { BrotliCompression } from '../lib/brotli-compression';
4
4
  import { DeflateCompression } from '../lib/deflate-compression';
5
5
  import { GZipCompression } from '../lib/gzip-compression';
6
6
  import { LZ4Compression } from '../lib/lz4-compression';
7
- import { LZOCompression } from '../lib/lzo-compression';
8
7
  import { SnappyCompression } from '../lib/snappy-compression';
9
8
  import { ZstdCompression } from '../lib/zstd-compression';
10
9
  import brotliDecompress from 'brotli/decompress';
11
10
  import lz4js from 'lz4js';
12
- import lzo from 'lzo';
13
11
  import { ZstdCodec } from 'zstd-codec';
14
12
  const modules = {
15
13
  brotli: {
@@ -19,7 +17,6 @@ const modules = {
19
17
  }
20
18
  },
21
19
  lz4js,
22
- lzo,
23
20
  'zstd-codec': ZstdCodec
24
21
  };
25
22
  const COMPRESSIONS = [new NoCompression({
@@ -30,8 +27,6 @@ const COMPRESSIONS = [new NoCompression({
30
27
  modules
31
28
  }), new GZipCompression({
32
29
  modules
33
- }), new LZOCompression({
34
- modules
35
30
  }), new LZ4Compression({
36
31
  modules
37
32
  }), new SnappyCompression({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/workers/worker.ts"],"names":["createWorker","NoCompression","BrotliCompression","DeflateCompression","GZipCompression","LZ4Compression","LZOCompression","SnappyCompression","ZstdCompression","brotliDecompress","lz4js","lzo","ZstdCodec","modules","brotli","decompress","compress","Error","COMPRESSIONS","data","options","operation","getOperation","String","compression","getCompression","name","Compression","find","compression_"],"mappings":"AAAA,SAAQA,YAAR,QAA2B,0BAA3B;AAGA,SAAQC,aAAR,QAA4B,uBAA5B;AACA,SAAQC,iBAAR,QAAgC,2BAAhC;AACA,SAAQC,kBAAR,QAAiC,4BAAjC;AACA,SAAQC,eAAR,QAA8B,yBAA9B;AACA,SAAQC,cAAR,QAA6B,wBAA7B;AACA,SAAQC,cAAR,QAA6B,wBAA7B;AACA,SAAQC,iBAAR,QAAgC,2BAAhC;AACA,SAAQC,eAAR,QAA8B,yBAA9B;AAKA,OAAOC,gBAAP,MAA6B,mBAA7B;AACA,OAAOC,KAAP,MAAkB,OAAlB;AACA,OAAOC,GAAP,MAAgB,KAAhB;AACA,SAAQC,SAAR,QAAwB,YAAxB;AAGA,MAAMC,OAAO,GAAG;AAEdC,EAAAA,MAAM,EAAE;AACNC,IAAAA,UAAU,EAAEN,gBADN;AAENO,IAAAA,QAAQ,EAAE,MAAM;AACd,YAAM,IAAIC,KAAJ,CAAU,iBAAV,CAAN;AACD;AAJK,GAFM;AAQdP,EAAAA,KARc;AASdC,EAAAA,GATc;AAUd,gBAAcC;AAVA,CAAhB;AAcA,MAAMM,YAAY,GAAG,CACnB,IAAIjB,aAAJ,CAAkB;AAACY,EAAAA;AAAD,CAAlB,CADmB,EAEnB,IAAIX,iBAAJ,CAAsB;AAACW,EAAAA;AAAD,CAAtB,CAFmB,EAGnB,IAAIV,kBAAJ,CAAuB;AAACU,EAAAA;AAAD,CAAvB,CAHmB,EAInB,IAAIT,eAAJ,CAAoB;AAACS,EAAAA;AAAD,CAApB,CAJmB,EAKnB,IAAIP,cAAJ,CAAmB;AAACO,EAAAA;AAAD,CAAnB,CALmB,EAMnB,IAAIR,cAAJ,CAAmB;AAACQ,EAAAA;AAAD,CAAnB,CANmB,EAOnB,IAAIN,iBAAJ,CAAsB;AAACM,EAAAA;AAAD,CAAtB,CAPmB,EAQnB,IAAIL,eAAJ,CAAoB;AAACK,EAAAA;AAAD,CAApB,CARmB,CAArB;AAWAb,YAAY,CAAC,OAAOmB,IAAP,EAAaC,OAAO,GAAG,EAAvB,KAA8B;AACzC,QAAMC,SAAS,GAAGC,YAAY,CAACC,MAAM,CAACH,OAAD,aAACA,OAAD,uBAACA,OAAO,CAAEC,SAAV,CAAP,CAA9B;AACA,QAAMG,WAAW,GAAGC,cAAc,CAACF,MAAM,CAACH,OAAD,aAACA,OAAD,uBAACA,OAAO,CAAEI,WAAV,CAAP,CAAlC;;AAGA,UAAQH,SAAR;AACE,SAAK,UAAL;AACE,aAAO,MAAMG,WAAW,CAACR,QAAZ,CAAqBG,IAArB,CAAb;;AACF,SAAK,YAAL;AACE,aAAO,MAAMK,WAAW,CAACT,UAAZ,CAAuBI,IAAvB,CAAb;;AACF;AACE,YAAM,IAAIF,KAAJ,CAAU,gBAAV,CAAN;AANJ;AAQD,CAbW,CAAZ;;AAeA,SAASK,YAAT,CAAsBD,SAAtB,EAAoE;AAClE,UAAQA,SAAR;AACE,SAAK,UAAL;AACA,SAAK,SAAL;AACE,aAAO,UAAP;;AACF,SAAK,YAAL;AACA,SAAK,SAAL;AACE,aAAO,YAAP;;AACF;AACE,YAAM,IAAIJ,KAAJ,CACH,kDAAiDI,SAAU,uCADxD,CAAN;AARJ;AAYD;;AAED,SAASI,cAAT,CAAwBC,IAAxB,EAAsC;AACpC,QAAMC,WAAW,GAAGT,YAAY,CAACU,IAAb,CAAmBC,YAAD,IAAkBH,IAAI,KAAKG,YAAY,CAACH,IAA1D,CAApB;;AACA,MAAI,CAACC,WAAL,EAAkB;AAChB,UAAM,IAAIV,KAAJ,CAAW,oDAAmDS,IAAK,EAAnE,CAAN;AACD;;AACD,SAAOC,WAAP;AACD","sourcesContent":["import {createWorker} from '@loaders.gl/worker-utils';\n\n// Compressors\nimport {NoCompression} from '../lib/no-compression';\nimport {BrotliCompression} from '../lib/brotli-compression';\nimport {DeflateCompression} from '../lib/deflate-compression';\nimport {GZipCompression} from '../lib/gzip-compression';\nimport {LZ4Compression} from '../lib/lz4-compression';\nimport {LZOCompression} from '../lib/lzo-compression';\nimport {SnappyCompression} from '../lib/snappy-compression';\nimport {ZstdCompression} from '../lib/zstd-compression';\n\n// Import big dependencies\n\n// import brotli from 'brotli'; - brotli has problems with decompress in browsers\nimport brotliDecompress from 'brotli/decompress';\nimport lz4js from 'lz4js';\nimport lzo from 'lzo';\nimport {ZstdCodec} from 'zstd-codec';\n\n// Inject large dependencies through Compression constructor options\nconst modules = {\n // brotli has problems with decompress in browsers\n brotli: {\n decompress: brotliDecompress,\n compress: () => {\n throw new Error('brotli compress');\n }\n },\n lz4js,\n lzo,\n 'zstd-codec': ZstdCodec\n};\n\n/** @type {Compression[]} */\nconst COMPRESSIONS = [\n new NoCompression({modules}),\n new BrotliCompression({modules}),\n new DeflateCompression({modules}),\n new GZipCompression({modules}),\n new LZOCompression({modules}),\n new LZ4Compression({modules}),\n new SnappyCompression({modules}),\n new ZstdCompression({modules})\n];\n\ncreateWorker(async (data, options = {}) => {\n const operation = getOperation(String(options?.operation));\n const compression = getCompression(String(options?.compression));\n\n // @ts-ignore\n switch (operation) {\n case 'compress':\n return await compression.compress(data);\n case 'decompress':\n return await compression.decompress(data);\n default:\n throw new Error('invalid option');\n }\n});\n\nfunction getOperation(operation: string): 'compress' | 'decompress' {\n switch (operation) {\n case 'compress':\n case 'deflate':\n return 'compress';\n case 'decompress':\n case 'inflate':\n return 'decompress';\n default:\n throw new Error(\n `@loaders.gl/compression: Unsupported operation ${operation}. Expected 'compress' or 'decompress'`\n );\n }\n}\n\nfunction getCompression(name: string) {\n const Compression = COMPRESSIONS.find((compression_) => name === compression_.name);\n if (!Compression) {\n throw new Error(`@loaders.gl/compression: Unsupported compression ${name}`);\n }\n return Compression;\n}\n"],"file":"worker.js"}
1
+ {"version":3,"sources":["../../../src/workers/worker.ts"],"names":["createWorker","NoCompression","BrotliCompression","DeflateCompression","GZipCompression","LZ4Compression","SnappyCompression","ZstdCompression","brotliDecompress","lz4js","ZstdCodec","modules","brotli","decompress","compress","Error","COMPRESSIONS","data","options","operation","getOperation","String","compression","getCompression","name","Compression","find","compression_"],"mappings":"AAAA,SAAQA,YAAR,QAA2B,0BAA3B;AAGA,SAAQC,aAAR,QAA4B,uBAA5B;AACA,SAAQC,iBAAR,QAAgC,2BAAhC;AACA,SAAQC,kBAAR,QAAiC,4BAAjC;AACA,SAAQC,eAAR,QAA8B,yBAA9B;AACA,SAAQC,cAAR,QAA6B,wBAA7B;AAEA,SAAQC,iBAAR,QAAgC,2BAAhC;AACA,SAAQC,eAAR,QAA8B,yBAA9B;AAKA,OAAOC,gBAAP,MAA6B,mBAA7B;AACA,OAAOC,KAAP,MAAkB,OAAlB;AAEA,SAAQC,SAAR,QAAwB,YAAxB;AAGA,MAAMC,OAAO,GAAG;AAEdC,EAAAA,MAAM,EAAE;AACNC,IAAAA,UAAU,EAAEL,gBADN;AAENM,IAAAA,QAAQ,EAAE,MAAM;AACd,YAAM,IAAIC,KAAJ,CAAU,iBAAV,CAAN;AACD;AAJK,GAFM;AAQdN,EAAAA,KARc;AAUd,gBAAcC;AAVA,CAAhB;AAcA,MAAMM,YAAY,GAAG,CACnB,IAAIf,aAAJ,CAAkB;AAACU,EAAAA;AAAD,CAAlB,CADmB,EAEnB,IAAIT,iBAAJ,CAAsB;AAACS,EAAAA;AAAD,CAAtB,CAFmB,EAGnB,IAAIR,kBAAJ,CAAuB;AAACQ,EAAAA;AAAD,CAAvB,CAHmB,EAInB,IAAIP,eAAJ,CAAoB;AAACO,EAAAA;AAAD,CAApB,CAJmB,EAMnB,IAAIN,cAAJ,CAAmB;AAACM,EAAAA;AAAD,CAAnB,CANmB,EAOnB,IAAIL,iBAAJ,CAAsB;AAACK,EAAAA;AAAD,CAAtB,CAPmB,EAQnB,IAAIJ,eAAJ,CAAoB;AAACI,EAAAA;AAAD,CAApB,CARmB,CAArB;AAWAX,YAAY,CAAC,OAAOiB,IAAP,EAAaC,OAAO,GAAG,EAAvB,KAA8B;AACzC,QAAMC,SAAS,GAAGC,YAAY,CAACC,MAAM,CAACH,OAAD,aAACA,OAAD,uBAACA,OAAO,CAAEC,SAAV,CAAP,CAA9B;AACA,QAAMG,WAAW,GAAGC,cAAc,CAACF,MAAM,CAACH,OAAD,aAACA,OAAD,uBAACA,OAAO,CAAEI,WAAV,CAAP,CAAlC;;AAGA,UAAQH,SAAR;AACE,SAAK,UAAL;AACE,aAAO,MAAMG,WAAW,CAACR,QAAZ,CAAqBG,IAArB,CAAb;;AACF,SAAK,YAAL;AACE,aAAO,MAAMK,WAAW,CAACT,UAAZ,CAAuBI,IAAvB,CAAb;;AACF;AACE,YAAM,IAAIF,KAAJ,CAAU,gBAAV,CAAN;AANJ;AAQD,CAbW,CAAZ;;AAeA,SAASK,YAAT,CAAsBD,SAAtB,EAAoE;AAClE,UAAQA,SAAR;AACE,SAAK,UAAL;AACA,SAAK,SAAL;AACE,aAAO,UAAP;;AACF,SAAK,YAAL;AACA,SAAK,SAAL;AACE,aAAO,YAAP;;AACF;AACE,YAAM,IAAIJ,KAAJ,CACH,kDAAiDI,SAAU,uCADxD,CAAN;AARJ;AAYD;;AAED,SAASI,cAAT,CAAwBC,IAAxB,EAAsC;AACpC,QAAMC,WAAW,GAAGT,YAAY,CAACU,IAAb,CAAmBC,YAAD,IAAkBH,IAAI,KAAKG,YAAY,CAACH,IAA1D,CAApB;;AACA,MAAI,CAACC,WAAL,EAAkB;AAChB,UAAM,IAAIV,KAAJ,CAAW,oDAAmDS,IAAK,EAAnE,CAAN;AACD;;AACD,SAAOC,WAAP;AACD","sourcesContent":["import {createWorker} from '@loaders.gl/worker-utils';\n\n// Compressors\nimport {NoCompression} from '../lib/no-compression';\nimport {BrotliCompression} from '../lib/brotli-compression';\nimport {DeflateCompression} from '../lib/deflate-compression';\nimport {GZipCompression} from '../lib/gzip-compression';\nimport {LZ4Compression} from '../lib/lz4-compression';\n// import {LZOCompression} from '../lib/lzo-compression';\nimport {SnappyCompression} from '../lib/snappy-compression';\nimport {ZstdCompression} from '../lib/zstd-compression';\n\n// Import big dependencies\n\n// import brotli from 'brotli'; - brotli has problems with decompress in browsers\nimport brotliDecompress from 'brotli/decompress';\nimport lz4js from 'lz4js';\n// import lzo from 'lzo';\nimport {ZstdCodec} from 'zstd-codec';\n\n// Inject large dependencies through Compression constructor options\nconst modules = {\n // brotli has problems with decompress in browsers\n brotli: {\n decompress: brotliDecompress,\n compress: () => {\n throw new Error('brotli compress');\n }\n },\n lz4js,\n // lzo,\n 'zstd-codec': ZstdCodec\n};\n\n/** @type {Compression[]} */\nconst COMPRESSIONS = [\n new NoCompression({modules}),\n new BrotliCompression({modules}),\n new DeflateCompression({modules}),\n new GZipCompression({modules}),\n // new LZOCompression({modules}),\n new LZ4Compression({modules}),\n new SnappyCompression({modules}),\n new ZstdCompression({modules})\n];\n\ncreateWorker(async (data, options = {}) => {\n const operation = getOperation(String(options?.operation));\n const compression = getCompression(String(options?.compression));\n\n // @ts-ignore\n switch (operation) {\n case 'compress':\n return await compression.compress(data);\n case 'decompress':\n return await compression.decompress(data);\n default:\n throw new Error('invalid option');\n }\n});\n\nfunction getOperation(operation: string): 'compress' | 'decompress' {\n switch (operation) {\n case 'compress':\n case 'deflate':\n return 'compress';\n case 'decompress':\n case 'inflate':\n return 'decompress';\n default:\n throw new Error(\n `@loaders.gl/compression: Unsupported operation ${operation}. Expected 'compress' or 'decompress'`\n );\n }\n}\n\nfunction getCompression(name: string) {\n const Compression = COMPRESSIONS.find((compression_) => name === compression_.name);\n if (!Compression) {\n throw new Error(`@loaders.gl/compression: Unsupported compression ${name}`);\n }\n return Compression;\n}\n"],"file":"worker.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/compression",
3
- "version": "3.0.12",
3
+ "version": "3.1.0-alpha.4",
4
4
  "description": "Decompression and compression plugins for loaders.gl",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -34,12 +34,12 @@
34
34
  "scripts": {
35
35
  "pre-build": "npm run build-bundle && npm run build-worker",
36
36
  "build-bundle": "webpack --display=minimal --config ../../scripts/webpack/bundle.js",
37
- "build-worker": "webpack --entry ./src/workers/worker.ts --output ./dist/compression-worker.js --env.dev --config ../../scripts/webpack/worker.js"
37
+ "build-worker": "webpack --entry ./src/workers/worker.ts --output ./dist/compression-worker.js --config ../../scripts/webpack/worker.js"
38
38
  },
39
39
  "dependencies": {
40
40
  "@babel/runtime": "^7.3.1",
41
- "@loaders.gl/loader-utils": "3.0.12",
42
- "@loaders.gl/worker-utils": "3.0.12",
41
+ "@loaders.gl/loader-utils": "3.1.0-alpha.4",
42
+ "@loaders.gl/worker-utils": "3.1.0-alpha.4",
43
43
  "@types/brotli": "^1.3.0",
44
44
  "@types/pako": "^1.0.1",
45
45
  "lzo-wasm": "^0.0.4",
@@ -58,5 +58,5 @@
58
58
  "lzo": "^0.4.11",
59
59
  "zstd-codec": "^0.1"
60
60
  },
61
- "gitHead": "47cac9b0d4e6c1953bcfa6af5cadf1d42c25401a"
61
+ "gitHead": "e309784af37ef9f3640c7733c7851124c72e1fa3"
62
62
  }
package/src/bundle.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  // @ts-nocheck
2
2
  const moduleExports = require('./index');
3
- const _global = typeof window === 'undefined' ? global : window;
4
- _global.loaders = _global.loaders || {};
5
- module.exports = Object.assign(_global.loaders, moduleExports);
3
+ globalThis.loaders = globalThis.loaders || {};
4
+ module.exports = Object.assign(globalThis.loaders, moduleExports);
@@ -0,0 +1,34 @@
1
+ import type {WorkerObject} from '@loaders.gl/worker-utils';
2
+ import {processOnWorker} from '@loaders.gl/worker-utils';
3
+
4
+ // __VERSION__ is injected by babel-plugin-version-inline
5
+ // @ts-ignore TS2304: Cannot find name '__VERSION__'.
6
+ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
7
+
8
+ export type CompressionWorkerOptions = {
9
+ compression: string;
10
+ operation: 'compress' | 'decompress';
11
+ };
12
+
13
+ /**
14
+ * Worker for Zlib real-time compression and decompression
15
+ */
16
+ export const CompressionWorker = {
17
+ id: 'compression',
18
+ name: 'compression',
19
+ module: 'compression',
20
+ version: VERSION,
21
+ options: {}
22
+ };
23
+
24
+ /**
25
+ * Provide type safety
26
+ */
27
+ export function compressOnWorker(
28
+ data: ArrayBuffer,
29
+ options: CompressionWorkerOptions
30
+ ): Promise<ArrayBuffer> {
31
+ return processOnWorker(CompressionWorker, data, options);
32
+ }
33
+
34
+ export const _typecheckCompressionWorker: WorkerObject = CompressionWorker;
package/src/index.ts CHANGED
@@ -1,5 +1,3 @@
1
- // import type {Worker} from '@loaders.gl/worker-utils';
2
-
3
1
  export type {CompressionOptions} from './lib/compression';
4
2
 
5
3
  export {Compression} from './lib/compression';
@@ -12,43 +10,5 @@ export {SnappyCompression} from './lib/snappy-compression';
12
10
  export {BrotliCompression} from './lib/brotli-compression';
13
11
  export {LZOCompression} from './lib/lzo-compression';
14
12
 
15
- // Zstd - NOT exported due to size of Zstd library
16
- // export {default as ZstdDeflateTransform} from './lib/zstd/zstd-deflate-transform';
17
- // export {default as ZstdInflateTransform} from './lib/zstd/zstd-inflate-transform';
18
-
19
- // __VERSION__ is injected by babel-plugin-version-inline
20
- // @ts-ignore TS2304: Cannot find name '__VERSION__'.
21
- const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
22
-
23
- export type CompressionWorkerOptions = {
24
- compression: string;
25
- operation: 'compress' | 'decompress';
26
- };
27
-
28
- /**
29
- * Worker for Zlib real-time compression and decompression
30
- */
31
- export const CompressionWorker = {
32
- id: 'compression',
33
- name: 'compression',
34
- module: 'compression',
35
- version: VERSION,
36
- options: {
37
- zlib: {
38
- // level
39
- }
40
- }
41
- };
42
-
43
- /**
44
- * Overload parseOnWorker to provide type safety
45
- export function parseOnWorker(
46
- worker: ZlibWorker | LZ4Worker | ZstdWorker,
47
- data: ArrayBuffer,
48
- options?: object
49
- ): Promise<ArrayBuffer>;
50
- */
51
-
52
- // export const _typecheckZlibWorker: Worker = ZlibWorker;
53
- // export const _typecheckLZ4Worker: Worker = LZ4Worker;
54
- // export const _typecheckZstdWorker: Worker = ZstdWorker;
13
+ export type {CompressionWorkerOptions} from './compression-worker';
14
+ export {CompressionWorker, compressOnWorker} from './compression-worker';
@@ -31,9 +31,9 @@ export abstract class Compression {
31
31
  }
32
32
 
33
33
  /** Asynchronously decompress data */
34
- async decompress(input: ArrayBuffer): Promise<ArrayBuffer> {
34
+ async decompress(input: ArrayBuffer, size?: number): Promise<ArrayBuffer> {
35
35
  await this.preload();
36
- return this.decompressSync(input);
36
+ return this.decompressSync(input, size);
37
37
  }
38
38
 
39
39
  /** Synchronously compress data */
@@ -42,7 +42,7 @@ export abstract class Compression {
42
42
  }
43
43
 
44
44
  /** Synchronously compress data */
45
- decompressSync(input: ArrayBuffer): ArrayBuffer {
45
+ decompressSync(input: ArrayBuffer, size?: number): ArrayBuffer {
46
46
  throw new Error(`${this.name}: sync decompression not supported`);
47
47
  }
48
48
 
@@ -69,4 +69,11 @@ export abstract class Compression {
69
69
  protected concatenate(asyncIterator): Promise<ArrayBuffer> {
70
70
  return concatenateArrayBuffersAsync(asyncIterator);
71
71
  }
72
+
73
+ protected improveError(error) {
74
+ if (!error.message.includes(this.name)) {
75
+ error.message = `${this.name} ${error.message}`;
76
+ }
77
+ return error;
78
+ }
72
79
  }
@@ -1,7 +1,32 @@
1
+ // Copyright (c) 2012 Pierre Curto
2
+
3
+ // Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ // of this software and associated documentation files (the "Software"), to deal
5
+ // in the Software without restriction, including without limitation the rights
6
+ // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7
+ // copies of the Software, and to permit persons to whom the Software is
8
+ // furnished to do so, subject to the following conditions:
9
+
10
+ // The above copyright notice and this permission notice shall be included in
11
+ // all copies or substantial portions of the Software.
12
+
13
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18
+ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19
+ // THE SOFTWARE.
20
+
21
+ /* eslint-disable complexity */
22
+ /* eslint-disable max-statements */
23
+
1
24
  // LZ4
25
+ import {toArrayBuffer} from '@loaders.gl/loader-utils';
2
26
  import type {CompressionOptions} from './compression';
3
27
  import {Compression} from './compression';
4
28
  // import lz4js from 'lz4js'; // https://bundlephobia.com/package/lz4
29
+ const LZ4_MAGIC_NUMBER = 0x184d2204;
5
30
 
6
31
  let lz4js;
7
32
 
@@ -30,8 +55,120 @@ export class LZ4Compression extends Compression {
30
55
  return lz4js.compress(inputArray).buffer;
31
56
  }
32
57
 
33
- decompressSync(input: ArrayBuffer): ArrayBuffer {
34
- const inputArray = new Uint8Array(input);
35
- return lz4js.decompress(inputArray).buffer;
58
+ /**
59
+ * Decompresses an ArrayBuffer containing an Lz4 frame. maxSize is optional; if not
60
+ * provided, a maximum size will be determined by examining the data. The
61
+ * returned ArrayBuffer will always be perfectly sized.
62
+ * If data provided without magic number we will parse it as block
63
+ */
64
+ decompressSync(data: ArrayBuffer, maxSize?: number): ArrayBuffer {
65
+ try {
66
+ const isMagicNumberExists = this.checkMagicNumber(data);
67
+ const inputArray = new Uint8Array(data);
68
+
69
+ if (isMagicNumberExists) {
70
+ return lz4js.decompress(inputArray, maxSize).buffer;
71
+ }
72
+
73
+ if (!maxSize) {
74
+ const error = new Error('Need to provide maxSize');
75
+ throw this.improveError(error);
76
+ }
77
+
78
+ let uncompressed = new Uint8Array(maxSize);
79
+ const uncompressedSize = this.decodeBlock(inputArray, uncompressed);
80
+ uncompressed = uncompressed.slice(0, uncompressedSize);
81
+
82
+ return toArrayBuffer(uncompressed);
83
+ } catch (error) {
84
+ throw this.improveError(error);
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Decode lz4 file as block
90
+ * Solution taken from here
91
+ * https://github.com/pierrec/node-lz4/blob/0dac687262403fd34f905b963da7220692f2a4a1/lib/binding.js#L25
92
+ * @param input
93
+ * @param output
94
+ * @param startIndex
95
+ * @param endIndex
96
+ */
97
+ decodeBlock(
98
+ data: Uint8Array,
99
+ output: Uint8Array,
100
+ startIndex?: number,
101
+ endIndex?: number
102
+ ): number {
103
+ startIndex = startIndex || 0;
104
+ endIndex = endIndex || data.length - startIndex;
105
+
106
+ let uncompressedSize = 0;
107
+ // Process each sequence in the incoming data
108
+ for (let index = startIndex; index < endIndex; ) {
109
+ const token = data[index++];
110
+
111
+ // Literals
112
+ let literalsLength = token >> 4;
113
+
114
+ if (literalsLength > 0) {
115
+ // length of literals
116
+ let length = literalsLength + 240;
117
+
118
+ while (length === 255) {
119
+ length = data[index++];
120
+ literalsLength += length;
121
+ }
122
+
123
+ // Copy the literals
124
+ const end = index + literalsLength;
125
+
126
+ while (index < end) {
127
+ output[uncompressedSize++] = data[index++];
128
+ }
129
+
130
+ // End of buffer?
131
+ if (index === endIndex) {
132
+ return uncompressedSize;
133
+ }
134
+ }
135
+
136
+ // Match copy
137
+ // 2 bytes offset (little endian)
138
+ const offset = data[index++] | (data[index++] << 8);
139
+
140
+ // 0 is an invalid offset value
141
+ if (offset === 0 || offset > uncompressedSize) {
142
+ return -(index - 2);
143
+ }
144
+
145
+ // length of match copy
146
+ let matchLength = token & 0xf;
147
+ let length = matchLength + 240;
148
+
149
+ while (length === 255) {
150
+ length = data[index++];
151
+ matchLength += length;
152
+ }
153
+
154
+ // Copy the match
155
+ let pos = uncompressedSize - offset; // position of the match copy in the current output
156
+ const end = uncompressedSize + matchLength + 4; // minmatch = 4
157
+
158
+ while (uncompressedSize < end) {
159
+ output[uncompressedSize++] = output[pos++];
160
+ }
161
+ }
162
+
163
+ return uncompressedSize;
164
+ }
165
+
166
+ /**
167
+ * Compare file magic with lz4 magic number
168
+ * @param input
169
+ */
170
+ checkMagicNumber(data: ArrayBuffer): boolean {
171
+ const magic = new Uint32Array(data.slice(0, 4));
172
+ return magic[0] === LZ4_MAGIC_NUMBER;
36
173
  }
37
174
  }
@@ -1,5 +1,5 @@
1
1
  // LZO
2
- import {loadLibrary} from '@loaders.gl/worker-utils';
2
+ // import {loadLibrary} from '@loaders.gl/worker-utils';
3
3
  import {toBuffer} from '@loaders.gl/loader-utils';
4
4
 
5
5
  import type {CompressionOptions} from './compression';
@@ -9,8 +9,8 @@ import {Compression} from './compression';
9
9
  // import lzo from 'lzo'; // https://bundlephobia.com/package/lzo
10
10
  // import {decompress} from 'lzo-wasm';
11
11
 
12
- const LZO_WASM_JS_URL = './node_modules/lzo-wasm/lzo-wasm.js';
13
- const LZO_WASM_WASM_URL = './node_modules/lzo-wasm/lzo-wasm.wasm';
12
+ // const LZO_WASM_JS_URL = './node_modules/lzo-wasm/lzo-wasm.js';
13
+ // const LZO_WASM_WASM_URL = './node_modules/lzo-wasm/lzo-wasm.wasm';
14
14
 
15
15
  let lzo;
16
16
 
@@ -39,8 +39,8 @@ export class LZOCompression extends Compression {
39
39
  }
40
40
 
41
41
  async preload() {
42
- await loadLibrary(LZO_WASM_JS_URL);
43
- await loadLibrary(LZO_WASM_WASM_URL);
42
+ // await loadLibrary(LZO_WASM_JS_URL);
43
+ // await loadLibrary(LZO_WASM_WASM_URL);
44
44
  }
45
45
 
46
46
  async compress(input: ArrayBuffer): Promise<ArrayBuffer> {
@@ -6,7 +6,7 @@ import {BrotliCompression} from '../lib/brotli-compression';
6
6
  import {DeflateCompression} from '../lib/deflate-compression';
7
7
  import {GZipCompression} from '../lib/gzip-compression';
8
8
  import {LZ4Compression} from '../lib/lz4-compression';
9
- import {LZOCompression} from '../lib/lzo-compression';
9
+ // import {LZOCompression} from '../lib/lzo-compression';
10
10
  import {SnappyCompression} from '../lib/snappy-compression';
11
11
  import {ZstdCompression} from '../lib/zstd-compression';
12
12
 
@@ -15,7 +15,7 @@ import {ZstdCompression} from '../lib/zstd-compression';
15
15
  // import brotli from 'brotli'; - brotli has problems with decompress in browsers
16
16
  import brotliDecompress from 'brotli/decompress';
17
17
  import lz4js from 'lz4js';
18
- import lzo from 'lzo';
18
+ // import lzo from 'lzo';
19
19
  import {ZstdCodec} from 'zstd-codec';
20
20
 
21
21
  // Inject large dependencies through Compression constructor options
@@ -28,7 +28,7 @@ const modules = {
28
28
  }
29
29
  },
30
30
  lz4js,
31
- lzo,
31
+ // lzo,
32
32
  'zstd-codec': ZstdCodec
33
33
  };
34
34
 
@@ -38,7 +38,7 @@ const COMPRESSIONS = [
38
38
  new BrotliCompression({modules}),
39
39
  new DeflateCompression({modules}),
40
40
  new GZipCompression({modules}),
41
- new LZOCompression({modules}),
41
+ // new LZOCompression({modules}),
42
42
  new LZ4Compression({modules}),
43
43
  new SnappyCompression({modules}),
44
44
  new ZstdCompression({modules})