@loaders.gl/compression 3.1.3 → 4.0.0-alpha.5

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 (96) hide show
  1. package/dist/brotli/decode.js +2187 -2320
  2. package/dist/brotli/decode.js.map +1 -0
  3. package/dist/bundle.js +2 -2
  4. package/dist/bundle.js.map +1 -0
  5. package/dist/compression-worker.js +2 -2
  6. package/dist/compression-worker.js.map +2 -2
  7. package/dist/dist.min.js +3 -3
  8. package/dist/dist.min.js.map +2 -2
  9. package/dist/index.js +11 -24
  10. package/dist/index.js.map +1 -0
  11. package/dist/lib/brotli-compression.d.ts.map +1 -1
  12. package/dist/lib/brotli-compression.js +98 -81
  13. package/dist/lib/brotli-compression.js.map +1 -0
  14. package/dist/lib/compression.js +61 -56
  15. package/dist/lib/compression.js.map +1 -0
  16. package/dist/lib/deflate-compression.js +150 -128
  17. package/dist/lib/deflate-compression.js.map +1 -0
  18. package/dist/lib/gzip-compression.js +20 -16
  19. package/dist/lib/gzip-compression.js.map +1 -0
  20. package/dist/lib/lz4-compression.js +108 -132
  21. package/dist/lib/lz4-compression.js.map +1 -0
  22. package/dist/lib/lzo-compression.js +44 -54
  23. package/dist/lib/lzo-compression.js.map +1 -0
  24. package/dist/lib/no-compression.js +36 -29
  25. package/dist/lib/no-compression.js.map +1 -0
  26. package/dist/lib/snappy-compression.js +29 -26
  27. package/dist/lib/snappy-compression.js.map +1 -0
  28. package/dist/lib/zstd-compression.d.ts.map +1 -1
  29. package/dist/lib/zstd-compression.js +43 -39
  30. package/dist/lib/zstd-compression.js.map +1 -0
  31. package/dist/types.js +2 -2
  32. package/dist/{es5/types.js.map → types.js.map} +0 -0
  33. package/dist/workers/worker.js +61 -70
  34. package/dist/workers/worker.js.map +1 -0
  35. package/package.json +7 -7
  36. package/src/lib/brotli-compression.ts +2 -1
  37. package/src/lib/zstd-compression.ts +4 -1
  38. package/dist/es5/brotli/decode.js +0 -2221
  39. package/dist/es5/brotli/decode.js.map +0 -1
  40. package/dist/es5/bundle.js +0 -7
  41. package/dist/es5/bundle.js.map +0 -1
  42. package/dist/es5/compression-worker.js +0 -27
  43. package/dist/es5/compression-worker.js.map +0 -1
  44. package/dist/es5/index.js +0 -92
  45. package/dist/es5/index.js.map +0 -1
  46. package/dist/es5/lib/brotli-compression.js +0 -236
  47. package/dist/es5/lib/brotli-compression.js.map +0 -1
  48. package/dist/es5/lib/compression.js +0 -200
  49. package/dist/es5/lib/compression.js.map +0 -1
  50. package/dist/es5/lib/deflate-compression.js +0 -420
  51. package/dist/es5/lib/deflate-compression.js.map +0 -1
  52. package/dist/es5/lib/gzip-compression.js +0 -57
  53. package/dist/es5/lib/gzip-compression.js.map +0 -1
  54. package/dist/es5/lib/lz4-compression.js +0 -157
  55. package/dist/es5/lib/lz4-compression.js.map +0 -1
  56. package/dist/es5/lib/lzo-compression.js +0 -157
  57. package/dist/es5/lib/lzo-compression.js.map +0 -1
  58. package/dist/es5/lib/no-compression.js +0 -116
  59. package/dist/es5/lib/no-compression.js.map +0 -1
  60. package/dist/es5/lib/snappy-compression.js +0 -66
  61. package/dist/es5/lib/snappy-compression.js.map +0 -1
  62. package/dist/es5/lib/zstd-compression.js +0 -125
  63. package/dist/es5/lib/zstd-compression.js.map +0 -1
  64. package/dist/es5/types.js +0 -2
  65. package/dist/es5/workers/worker.js +0 -118
  66. package/dist/es5/workers/worker.js.map +0 -1
  67. package/dist/esm/brotli/decode.js +0 -2213
  68. package/dist/esm/brotli/decode.js.map +0 -1
  69. package/dist/esm/bundle.js +0 -5
  70. package/dist/esm/bundle.js.map +0 -1
  71. package/dist/esm/compression-worker.js +0 -14
  72. package/dist/esm/compression-worker.js.map +0 -1
  73. package/dist/esm/index.js +0 -11
  74. package/dist/esm/index.js.map +0 -1
  75. package/dist/esm/lib/brotli-compression.js +0 -108
  76. package/dist/esm/lib/brotli-compression.js.map +0 -1
  77. package/dist/esm/lib/compression.js +0 -62
  78. package/dist/esm/lib/compression.js.map +0 -1
  79. package/dist/esm/lib/deflate-compression.js +0 -157
  80. package/dist/esm/lib/deflate-compression.js.map +0 -1
  81. package/dist/esm/lib/gzip-compression.js +0 -21
  82. package/dist/esm/lib/gzip-compression.js.map +0 -1
  83. package/dist/esm/lib/lz4-compression.js +0 -117
  84. package/dist/esm/lib/lz4-compression.js.map +0 -1
  85. package/dist/esm/lib/lzo-compression.js +0 -48
  86. package/dist/esm/lib/lzo-compression.js.map +0 -1
  87. package/dist/esm/lib/no-compression.js +0 -37
  88. package/dist/esm/lib/no-compression.js.map +0 -1
  89. package/dist/esm/lib/snappy-compression.js +0 -30
  90. package/dist/esm/lib/snappy-compression.js.map +0 -1
  91. package/dist/esm/lib/zstd-compression.js +0 -46
  92. package/dist/esm/lib/zstd-compression.js.map +0 -1
  93. package/dist/esm/types.js +0 -2
  94. package/dist/esm/types.js.map +0 -1
  95. package/dist/esm/workers/worker.js +0 -68
  96. package/dist/esm/workers/worker.js.map +0 -1
@@ -1,135 +1,157 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.DeflateCompression = void 0;
7
- const compression_1 = require("./compression");
8
- const loader_utils_1 = require("@loaders.gl/loader-utils");
9
- const pako_1 = __importDefault(require("pako")); // https://bundlephobia.com/package/pako
10
- const zlib_1 = __importDefault(require("zlib"));
11
- const loader_utils_2 = require("@loaders.gl/loader-utils");
12
- /**
13
- * DEFLATE compression / decompression
14
- */
15
- class DeflateCompression extends compression_1.Compression {
16
- constructor(options = {}) {
17
- super(options);
18
- this.name = 'deflate';
19
- this.extensions = [];
20
- this.contentEncodings = ['deflate'];
21
- this.isSupported = true;
22
- this._chunks = [];
23
- this.options = options;
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { Compression } from './compression';
3
+ import { isBrowser, toArrayBuffer } from '@loaders.gl/loader-utils';
4
+ import pako from 'pako';
5
+ import zlib from 'zlib';
6
+ import { promisify } from '@loaders.gl/loader-utils';
7
+ export class DeflateCompression extends Compression {
8
+ constructor(options = {}) {
9
+ super(options);
10
+
11
+ _defineProperty(this, "name", 'deflate');
12
+
13
+ _defineProperty(this, "extensions", []);
14
+
15
+ _defineProperty(this, "contentEncodings", ['deflate']);
16
+
17
+ _defineProperty(this, "isSupported", true);
18
+
19
+ _defineProperty(this, "options", void 0);
20
+
21
+ _defineProperty(this, "_chunks", []);
22
+
23
+ this.options = options;
24
+ }
25
+
26
+ async compress(input) {
27
+ var _this$options$deflate;
28
+
29
+ if (!isBrowser && (_this$options$deflate = this.options.deflate) !== null && _this$options$deflate !== void 0 && _this$options$deflate.useZlib) {
30
+ var _this$options$deflate2;
31
+
32
+ const buffer = (_this$options$deflate2 = this.options.deflate) !== null && _this$options$deflate2 !== void 0 && _this$options$deflate2.gzip ? await promisify(zlib.gzip)(input) : await promisify(zlib.deflate)(input);
33
+ return toArrayBuffer(buffer);
24
34
  }
25
- async compress(input) {
26
- // On Node.js we can use built-in zlib
27
- if (!loader_utils_1.isBrowser && this.options.deflate?.useZlib) {
28
- const buffer = this.options.deflate?.gzip
29
- ? await (0, loader_utils_2.promisify)(zlib_1.default.gzip)(input)
30
- : await (0, loader_utils_2.promisify)(zlib_1.default.deflate)(input);
31
- return (0, loader_utils_1.toArrayBuffer)(buffer);
32
- }
33
- return this.compressSync(input);
35
+
36
+ return this.compressSync(input);
37
+ }
38
+
39
+ async decompress(input) {
40
+ var _this$options$deflate3;
41
+
42
+ if (!isBrowser && (_this$options$deflate3 = this.options.deflate) !== null && _this$options$deflate3 !== void 0 && _this$options$deflate3.useZlib) {
43
+ var _this$options$deflate4;
44
+
45
+ const buffer = (_this$options$deflate4 = this.options.deflate) !== null && _this$options$deflate4 !== void 0 && _this$options$deflate4.gzip ? await promisify(zlib.gunzip)(input) : await promisify(zlib.inflate)(input);
46
+ return toArrayBuffer(buffer);
34
47
  }
35
- async decompress(input) {
36
- // On Node.js we can use built-in zlib
37
- if (!loader_utils_1.isBrowser && this.options.deflate?.useZlib) {
38
- const buffer = this.options.deflate?.gzip
39
- ? await (0, loader_utils_2.promisify)(zlib_1.default.gunzip)(input)
40
- : await (0, loader_utils_2.promisify)(zlib_1.default.inflate)(input);
41
- return (0, loader_utils_1.toArrayBuffer)(buffer);
42
- }
43
- return this.decompressSync(input);
48
+
49
+ return this.decompressSync(input);
50
+ }
51
+
52
+ compressSync(input) {
53
+ var _this$options$deflate5, _this$options;
54
+
55
+ if (!isBrowser && (_this$options$deflate5 = this.options.deflate) !== null && _this$options$deflate5 !== void 0 && _this$options$deflate5.useZlib) {
56
+ var _this$options$deflate6;
57
+
58
+ const buffer = (_this$options$deflate6 = this.options.deflate) !== null && _this$options$deflate6 !== void 0 && _this$options$deflate6.gzip ? zlib.gzipSync(input) : zlib.deflateSync(input);
59
+ return toArrayBuffer(buffer);
44
60
  }
45
- compressSync(input) {
46
- // On Node.js we can use built-in zlib
47
- if (!loader_utils_1.isBrowser && this.options.deflate?.useZlib) {
48
- const buffer = this.options.deflate?.gzip ? zlib_1.default.gzipSync(input) : zlib_1.default.deflateSync(input);
49
- return (0, loader_utils_1.toArrayBuffer)(buffer);
50
- }
51
- const pakoOptions = this.options?.deflate || {};
52
- const inputArray = new Uint8Array(input);
53
- return pako_1.default.deflate(inputArray, pakoOptions).buffer;
61
+
62
+ const pakoOptions = ((_this$options = this.options) === null || _this$options === void 0 ? void 0 : _this$options.deflate) || {};
63
+ const inputArray = new Uint8Array(input);
64
+ return pako.deflate(inputArray, pakoOptions).buffer;
65
+ }
66
+
67
+ decompressSync(input) {
68
+ var _this$options$deflate7, _this$options2;
69
+
70
+ if (!isBrowser && (_this$options$deflate7 = this.options.deflate) !== null && _this$options$deflate7 !== void 0 && _this$options$deflate7.useZlib) {
71
+ var _this$options$deflate8;
72
+
73
+ const buffer = (_this$options$deflate8 = this.options.deflate) !== null && _this$options$deflate8 !== void 0 && _this$options$deflate8.gzip ? zlib.gunzipSync(input) : zlib.inflateSync(input);
74
+ return toArrayBuffer(buffer);
54
75
  }
55
- decompressSync(input) {
56
- // On Node.js we can use built-in zlib
57
- if (!loader_utils_1.isBrowser && this.options.deflate?.useZlib) {
58
- const buffer = this.options.deflate?.gzip ? zlib_1.default.gunzipSync(input) : zlib_1.default.inflateSync(input);
59
- return (0, loader_utils_1.toArrayBuffer)(buffer);
60
- }
61
- const pakoOptions = this.options?.deflate || {};
62
- const inputArray = new Uint8Array(input);
63
- return pako_1.default.inflate(inputArray, pakoOptions).buffer;
76
+
77
+ const pakoOptions = ((_this$options2 = this.options) === null || _this$options2 === void 0 ? void 0 : _this$options2.deflate) || {};
78
+ const inputArray = new Uint8Array(input);
79
+ return pako.inflate(inputArray, pakoOptions).buffer;
80
+ }
81
+
82
+ async *compressBatches(asyncIterator) {
83
+ var _this$options3;
84
+
85
+ const pakoOptions = ((_this$options3 = this.options) === null || _this$options3 === void 0 ? void 0 : _this$options3.deflate) || {};
86
+ const pakoProcessor = new pako.Deflate(pakoOptions);
87
+ yield* this.transformBatches(pakoProcessor, asyncIterator);
88
+ }
89
+
90
+ async *decompressBatches(asyncIterator) {
91
+ var _this$options4;
92
+
93
+ const pakoOptions = ((_this$options4 = this.options) === null || _this$options4 === void 0 ? void 0 : _this$options4.deflate) || {};
94
+ const pakoProcessor = new pako.Inflate(pakoOptions);
95
+ yield* this.transformBatches(pakoProcessor, asyncIterator);
96
+ }
97
+
98
+ async *transformBatches(pakoProcessor, asyncIterator) {
99
+ pakoProcessor.onData = this._onData.bind(this);
100
+ pakoProcessor.onEnd = this._onEnd.bind(this);
101
+
102
+ for await (const chunk of asyncIterator) {
103
+ const uint8Array = new Uint8Array(chunk);
104
+ const ok = pakoProcessor.push(uint8Array, false);
105
+
106
+ if (!ok) {
107
+ throw new Error("".concat(this._getError(), "write"));
108
+ }
109
+
110
+ const chunks = this._getChunks();
111
+
112
+ yield* chunks;
64
113
  }
65
- async *compressBatches(asyncIterator) {
66
- const pakoOptions = this.options?.deflate || {};
67
- const pakoProcessor = new pako_1.default.Deflate(pakoOptions);
68
- yield* this.transformBatches(pakoProcessor, asyncIterator);
69
- }
70
- async *decompressBatches(asyncIterator) {
71
- const pakoOptions = this.options?.deflate || {};
72
- const pakoProcessor = new pako_1.default.Inflate(pakoOptions);
73
- yield* this.transformBatches(pakoProcessor, asyncIterator);
74
- }
75
- async *transformBatches(pakoProcessor, asyncIterator) {
76
- pakoProcessor.onData = this._onData.bind(this);
77
- pakoProcessor.onEnd = this._onEnd.bind(this);
78
- for await (const chunk of asyncIterator) {
79
- const uint8Array = new Uint8Array(chunk);
80
- const ok = pakoProcessor.push(uint8Array, false); // false -> not last chunk
81
- if (!ok) {
82
- throw new Error(`${this._getError()}write`);
83
- }
84
- const chunks = this._getChunks();
85
- yield* chunks;
86
- }
87
- // End
88
- const emptyChunk = new Uint8Array(0);
89
- const ok = pakoProcessor.push(emptyChunk, true); // true -> last chunk
90
- if (!ok) {
91
- // For some reason we get error but it still works???
92
- // throw new Error(this._getError() + 'end');
93
- }
94
- const chunks = this._getChunks();
95
- yield* chunks;
96
- }
97
- _onData(chunk) {
98
- this._chunks.push(chunk);
99
- }
100
- _onEnd(status) {
101
- if (status !== 0) {
102
- throw new Error(this._getError(status) + this._chunks.length);
103
- }
104
- }
105
- _getChunks() {
106
- const chunks = this._chunks;
107
- this._chunks = [];
108
- return chunks;
109
- }
110
- // TODO - For some reason we don't get the error message from pako in _onEnd?
111
- _getError(code = 0) {
112
- const MESSAGES = {
113
- /* Z_NEED_DICT 2 */
114
- 2: 'need dictionary',
115
- /* Z_STREAM_END 1 */
116
- 1: 'stream end',
117
- /* Z_OK 0 */
118
- 0: '',
119
- /* Z_ERRNO (-1) */
120
- '-1': 'file error',
121
- /* Z_STREAM_ERROR (-2) */
122
- '-2': 'stream error',
123
- /* Z_DATA_ERROR (-3) */
124
- '-3': 'data error',
125
- /* Z_MEM_ERROR (-4) */
126
- '-4': 'insufficient memory',
127
- /* Z_BUF_ERROR (-5) */
128
- '-5': 'buffer error',
129
- /* Z_VERSION_ERROR (-6) */
130
- '-6': 'incompatible version'
131
- };
132
- return `${this.name}: ${MESSAGES[code]}`;
114
+
115
+ const emptyChunk = new Uint8Array(0);
116
+ const ok = pakoProcessor.push(emptyChunk, true);
117
+
118
+ if (!ok) {}
119
+
120
+ const chunks = this._getChunks();
121
+
122
+ yield* chunks;
123
+ }
124
+
125
+ _onData(chunk) {
126
+ this._chunks.push(chunk);
127
+ }
128
+
129
+ _onEnd(status) {
130
+ if (status !== 0) {
131
+ throw new Error(this._getError(status) + this._chunks.length);
133
132
  }
133
+ }
134
+
135
+ _getChunks() {
136
+ const chunks = this._chunks;
137
+ this._chunks = [];
138
+ return chunks;
139
+ }
140
+
141
+ _getError(code = 0) {
142
+ const MESSAGES = {
143
+ 2: 'need dictionary',
144
+ 1: 'stream end',
145
+ 0: '',
146
+ '-1': 'file error',
147
+ '-2': 'stream error',
148
+ '-3': 'data error',
149
+ '-4': 'insufficient memory',
150
+ '-5': 'buffer error',
151
+ '-6': 'incompatible version'
152
+ };
153
+ return "".concat(this.name, ": ").concat(MESSAGES[code]);
154
+ }
155
+
134
156
  }
135
- exports.DeflateCompression = DeflateCompression;
157
+ //# sourceMappingURL=deflate-compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/deflate-compression.ts"],"names":["Compression","isBrowser","toArrayBuffer","pako","zlib","promisify","DeflateCompression","constructor","options","compress","input","deflate","useZlib","buffer","gzip","compressSync","decompress","gunzip","inflate","decompressSync","gzipSync","deflateSync","pakoOptions","inputArray","Uint8Array","gunzipSync","inflateSync","compressBatches","asyncIterator","pakoProcessor","Deflate","transformBatches","decompressBatches","Inflate","onData","_onData","bind","onEnd","_onEnd","chunk","uint8Array","ok","push","Error","_getError","chunks","_getChunks","emptyChunk","_chunks","status","length","code","MESSAGES","name"],"mappings":"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","sourcesContent":["// DEFLATE\nimport type {CompressionOptions} from './compression';\nimport {Compression} from './compression';\nimport {isBrowser, toArrayBuffer} from '@loaders.gl/loader-utils';\nimport pako from 'pako'; // https://bundlephobia.com/package/pako\nimport zlib from 'zlib';\nimport {promisify} from '@loaders.gl/loader-utils';\n\nexport type DeflateCompressionOptions = CompressionOptions & {\n deflate?: pako.InflateOptions & pako.DeflateOptions & {useZlib?: boolean};\n};\n\n/**\n * DEFLATE compression / decompression\n */\nexport class DeflateCompression extends Compression {\n readonly name: string = 'deflate';\n readonly extensions: string[] = [];\n readonly contentEncodings = ['deflate'];\n readonly isSupported = true;\n\n readonly options: DeflateCompressionOptions;\n\n private _chunks: ArrayBuffer[] = [];\n\n constructor(options: DeflateCompressionOptions = {}) {\n super(options);\n this.options = options;\n }\n\n async compress(input: ArrayBuffer): Promise<ArrayBuffer> {\n // On Node.js we can use built-in zlib\n if (!isBrowser && this.options.deflate?.useZlib) {\n const buffer = this.options.deflate?.gzip\n ? await promisify(zlib.gzip)(input)\n : await promisify(zlib.deflate)(input);\n return toArrayBuffer(buffer);\n }\n return this.compressSync(input);\n }\n\n async decompress(input: ArrayBuffer): Promise<ArrayBuffer> {\n // On Node.js we can use built-in zlib\n if (!isBrowser && this.options.deflate?.useZlib) {\n const buffer = this.options.deflate?.gzip\n ? await promisify(zlib.gunzip)(input)\n : await promisify(zlib.inflate)(input);\n return toArrayBuffer(buffer);\n }\n return this.decompressSync(input);\n }\n\n compressSync(input: ArrayBuffer): ArrayBuffer {\n // On Node.js we can use built-in zlib\n if (!isBrowser && this.options.deflate?.useZlib) {\n const buffer = this.options.deflate?.gzip ? zlib.gzipSync(input) : zlib.deflateSync(input);\n return toArrayBuffer(buffer);\n }\n const pakoOptions: pako.DeflateOptions = this.options?.deflate || {};\n const inputArray = new Uint8Array(input);\n return pako.deflate(inputArray, pakoOptions).buffer;\n }\n\n decompressSync(input: ArrayBuffer): ArrayBuffer {\n // On Node.js we can use built-in zlib\n if (!isBrowser && this.options.deflate?.useZlib) {\n const buffer = this.options.deflate?.gzip ? zlib.gunzipSync(input) : zlib.inflateSync(input);\n return toArrayBuffer(buffer);\n }\n const pakoOptions: pako.InflateOptions = this.options?.deflate || {};\n const inputArray = new Uint8Array(input);\n return pako.inflate(inputArray, pakoOptions).buffer;\n }\n\n async *compressBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>\n ): AsyncIterable<ArrayBuffer> {\n const pakoOptions: pako.DeflateOptions = this.options?.deflate || {};\n const pakoProcessor = new pako.Deflate(pakoOptions);\n yield* this.transformBatches(pakoProcessor, asyncIterator);\n }\n\n async *decompressBatches(\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>\n ): AsyncIterable<ArrayBuffer> {\n const pakoOptions: pako.InflateOptions = this.options?.deflate || {};\n const pakoProcessor = new pako.Inflate(pakoOptions);\n yield* this.transformBatches(pakoProcessor, asyncIterator);\n }\n\n async *transformBatches(\n pakoProcessor: pako.Inflate | pako.Deflate,\n asyncIterator: AsyncIterable<ArrayBuffer> | Iterable<ArrayBuffer>\n ): AsyncIterable<ArrayBuffer> {\n pakoProcessor.onData = this._onData.bind(this);\n pakoProcessor.onEnd = this._onEnd.bind(this);\n for await (const chunk of asyncIterator) {\n const uint8Array = new Uint8Array(chunk);\n const ok = pakoProcessor.push(uint8Array, false); // false -> not last chunk\n if (!ok) {\n throw new Error(`${this._getError()}write`);\n }\n const chunks = this._getChunks();\n yield* chunks;\n }\n\n // End\n const emptyChunk = new Uint8Array(0);\n const ok = pakoProcessor.push(emptyChunk, true); // true -> last chunk\n if (!ok) {\n // For some reason we get error but it still works???\n // throw new Error(this._getError() + 'end');\n }\n const chunks = this._getChunks();\n yield* chunks;\n }\n\n _onData(chunk) {\n this._chunks.push(chunk);\n }\n\n _onEnd(status) {\n if (status !== 0) {\n throw new Error(this._getError(status) + this._chunks.length);\n }\n }\n\n _getChunks(): ArrayBuffer[] {\n const chunks = this._chunks;\n this._chunks = [];\n return chunks;\n }\n\n // TODO - For some reason we don't get the error message from pako in _onEnd?\n _getError(code: number = 0): string {\n const MESSAGES = {\n /* Z_NEED_DICT 2 */\n 2: 'need dictionary',\n /* Z_STREAM_END 1 */\n 1: 'stream end',\n /* Z_OK 0 */\n 0: '',\n /* Z_ERRNO (-1) */\n '-1': 'file error',\n /* Z_STREAM_ERROR (-2) */\n '-2': 'stream error',\n /* Z_DATA_ERROR (-3) */\n '-3': 'data error',\n /* Z_MEM_ERROR (-4) */\n '-4': 'insufficient memory',\n /* Z_BUF_ERROR (-5) */\n '-5': 'buffer error',\n /* Z_VERSION_ERROR (-6) */\n '-6': 'incompatible version'\n };\n return `${this.name}: ${MESSAGES[code]}`;\n }\n}\n"],"file":"deflate-compression.js"}
@@ -1,17 +1,21 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GZipCompression = void 0;
4
- const deflate_compression_1 = require("./deflate-compression");
5
- /**
6
- * GZIP compression / decompression
7
- */
8
- class GZipCompression extends deflate_compression_1.DeflateCompression {
9
- constructor(options) {
10
- super({ ...options, deflate: { ...options?.gzip, gzip: true } });
11
- this.name = 'gzip';
12
- this.extensions = ['gz', 'gzip'];
13
- this.contentEncodings = ['gzip', 'x-gzip'];
14
- this.isSupported = true;
15
- }
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { DeflateCompression } from './deflate-compression';
3
+ export class GZipCompression extends DeflateCompression {
4
+ constructor(options) {
5
+ super({ ...options,
6
+ deflate: { ...(options === null || options === void 0 ? void 0 : options.gzip),
7
+ gzip: true
8
+ }
9
+ });
10
+
11
+ _defineProperty(this, "name", 'gzip');
12
+
13
+ _defineProperty(this, "extensions", ['gz', 'gzip']);
14
+
15
+ _defineProperty(this, "contentEncodings", ['gzip', 'x-gzip']);
16
+
17
+ _defineProperty(this, "isSupported", true);
18
+ }
19
+
16
20
  }
17
- exports.GZipCompression = GZipCompression;
21
+ //# sourceMappingURL=gzip-compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/gzip-compression.ts"],"names":["DeflateCompression","GZipCompression","constructor","options","deflate","gzip"],"mappings":";AAGA,SAAQA,kBAAR,QAAiC,uBAAjC;AAUA,OAAO,MAAMC,eAAN,SAA8BD,kBAA9B,CAAiD;AAMtDE,EAAAA,WAAW,CAACC,OAAD,EAAmC;AAC5C,UAAM,EAAC,GAAGA,OAAJ;AAAaC,MAAAA,OAAO,EAAE,EAAC,IAAGD,OAAH,aAAGA,OAAH,uBAAGA,OAAO,CAAEE,IAAZ,CAAD;AAAmBA,QAAAA,IAAI,EAAE;AAAzB;AAAtB,KAAN;;AAD4C,kCALtB,MAKsB;;AAAA,wCAJxB,CAAC,IAAD,EAAO,MAAP,CAIwB;;AAAA,8CAHlB,CAAC,MAAD,EAAS,QAAT,CAGkB;;AAAA,yCAFvB,IAEuB;AAE7C;;AARqD","sourcesContent":["// GZIP\n// import {isBrowser} from '@loaders.gl/loader-utils';\nimport type {CompressionOptions} from './compression';\nimport {DeflateCompression} from './deflate-compression';\nimport pako from 'pako'; // https://bundlephobia.com/package/pako\n\nexport type GZipCompressionOptions = CompressionOptions & {\n gzip?: pako.InflateOptions & pako.DeflateOptions;\n};\n\n/**\n * GZIP compression / decompression\n */\nexport class GZipCompression extends DeflateCompression {\n readonly name: string = 'gzip';\n readonly extensions = ['gz', 'gzip'];\n readonly contentEncodings = ['gzip', 'x-gzip'];\n readonly isSupported = true;\n\n constructor(options?: GZipCompressionOptions) {\n super({...options, deflate: {...options?.gzip, gzip: true}});\n }\n}\n"],"file":"gzip-compression.js"}
@@ -1,141 +1,117 @@
1
- "use strict";
2
- // Copyright (c) 2012 Pierre Curto
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.LZ4Compression = void 0;
5
- // Permission is hereby granted, free of charge, to any person obtaining a copy
6
- // of this software and associated documentation files (the "Software"), to deal
7
- // in the Software without restriction, including without limitation the rights
8
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- // copies of the Software, and to permit persons to whom the Software is
10
- // furnished to do so, subject to the following conditions:
11
- // The above copyright notice and this permission notice shall be included in
12
- // all copies or substantial portions of the Software.
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
- /* eslint-disable complexity */
21
- /* eslint-disable max-statements */
22
- // LZ4
23
- const loader_utils_1 = require("@loaders.gl/loader-utils");
24
- const compression_1 = require("./compression");
25
- // import lz4js from 'lz4js'; // https://bundlephobia.com/package/lz4
1
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
+ import { toArrayBuffer } from '@loaders.gl/loader-utils';
3
+ import { Compression } from './compression';
26
4
  const LZ4_MAGIC_NUMBER = 0x184d2204;
27
5
  let lz4js;
28
- /**
29
- * LZ4 compression / decompression
30
- */
31
- class LZ4Compression extends compression_1.Compression {
32
- constructor(options) {
33
- super(options);
34
- this.name = 'lz4';
35
- this.extensions = ['lz4'];
36
- this.contentEncodings = ['x-lz4'];
37
- this.isSupported = true;
38
- this.options = options;
39
- lz4js = lz4js || this.options?.modules?.lz4js;
40
- if (!lz4js) {
41
- throw new Error(this.name);
42
- }
6
+ export class LZ4Compression extends Compression {
7
+ constructor(options) {
8
+ var _this$options, _this$options$modules;
9
+
10
+ super(options);
11
+
12
+ _defineProperty(this, "name", 'lz4');
13
+
14
+ _defineProperty(this, "extensions", ['lz4']);
15
+
16
+ _defineProperty(this, "contentEncodings", ['x-lz4']);
17
+
18
+ _defineProperty(this, "isSupported", true);
19
+
20
+ _defineProperty(this, "options", void 0);
21
+
22
+ this.options = options;
23
+ lz4js = lz4js || ((_this$options = this.options) === null || _this$options === void 0 ? void 0 : (_this$options$modules = _this$options.modules) === null || _this$options$modules === void 0 ? void 0 : _this$options$modules.lz4js);
24
+
25
+ if (!lz4js) {
26
+ throw new Error(this.name);
43
27
  }
44
- compressSync(input) {
45
- const inputArray = new Uint8Array(input);
46
- return lz4js.compress(inputArray).buffer;
28
+ }
29
+
30
+ compressSync(input) {
31
+ const inputArray = new Uint8Array(input);
32
+ return lz4js.compress(inputArray).buffer;
33
+ }
34
+
35
+ decompressSync(data, maxSize) {
36
+ try {
37
+ const isMagicNumberExists = this.checkMagicNumber(data);
38
+ const inputArray = new Uint8Array(data);
39
+
40
+ if (isMagicNumberExists) {
41
+ return lz4js.decompress(inputArray, maxSize).buffer;
42
+ }
43
+
44
+ if (!maxSize) {
45
+ const error = new Error('Need to provide maxSize');
46
+ throw this.improveError(error);
47
+ }
48
+
49
+ let uncompressed = new Uint8Array(maxSize);
50
+ const uncompressedSize = this.decodeBlock(inputArray, uncompressed);
51
+ uncompressed = uncompressed.slice(0, uncompressedSize);
52
+ return toArrayBuffer(uncompressed);
53
+ } catch (error) {
54
+ throw this.improveError(error);
47
55
  }
48
- /**
49
- * Decompresses an ArrayBuffer containing an Lz4 frame. maxSize is optional; if not
50
- * provided, a maximum size will be determined by examining the data. The
51
- * returned ArrayBuffer will always be perfectly sized.
52
- * If data provided without magic number we will parse it as block
53
- */
54
- decompressSync(data, maxSize) {
55
- try {
56
- const isMagicNumberExists = this.checkMagicNumber(data);
57
- const inputArray = new Uint8Array(data);
58
- if (isMagicNumberExists) {
59
- return lz4js.decompress(inputArray, maxSize).buffer;
60
- }
61
- if (!maxSize) {
62
- const error = new Error('Need to provide maxSize');
63
- throw this.improveError(error);
64
- }
65
- let uncompressed = new Uint8Array(maxSize);
66
- const uncompressedSize = this.decodeBlock(inputArray, uncompressed);
67
- uncompressed = uncompressed.slice(0, uncompressedSize);
68
- return (0, loader_utils_1.toArrayBuffer)(uncompressed);
56
+ }
57
+
58
+ decodeBlock(data, output, startIndex, endIndex) {
59
+ startIndex = startIndex || 0;
60
+ endIndex = endIndex || data.length - startIndex;
61
+ let uncompressedSize = 0;
62
+
63
+ for (let index = startIndex; index < endIndex;) {
64
+ const token = data[index++];
65
+ let literalsLength = token >> 4;
66
+
67
+ if (literalsLength > 0) {
68
+ let length = literalsLength + 240;
69
+
70
+ while (length === 255) {
71
+ length = data[index++];
72
+ literalsLength += length;
69
73
  }
70
- catch (error) {
71
- throw this.improveError(error);
74
+
75
+ const end = index + literalsLength;
76
+
77
+ while (index < end) {
78
+ output[uncompressedSize++] = data[index++];
72
79
  }
73
- }
74
- /**
75
- * Decode lz4 file as block
76
- * Solution taken from here
77
- * https://github.com/pierrec/node-lz4/blob/0dac687262403fd34f905b963da7220692f2a4a1/lib/binding.js#L25
78
- * @param input
79
- * @param output
80
- * @param startIndex
81
- * @param endIndex
82
- */
83
- decodeBlock(data, output, startIndex, endIndex) {
84
- startIndex = startIndex || 0;
85
- endIndex = endIndex || data.length - startIndex;
86
- let uncompressedSize = 0;
87
- // Process each sequence in the incoming data
88
- for (let index = startIndex; index < endIndex;) {
89
- const token = data[index++];
90
- // Literals
91
- let literalsLength = token >> 4;
92
- if (literalsLength > 0) {
93
- // length of literals
94
- let length = literalsLength + 240;
95
- while (length === 255) {
96
- length = data[index++];
97
- literalsLength += length;
98
- }
99
- // Copy the literals
100
- const end = index + literalsLength;
101
- while (index < end) {
102
- output[uncompressedSize++] = data[index++];
103
- }
104
- // End of buffer?
105
- if (index === endIndex) {
106
- return uncompressedSize;
107
- }
108
- }
109
- // Match copy
110
- // 2 bytes offset (little endian)
111
- const offset = data[index++] | (data[index++] << 8);
112
- // 0 is an invalid offset value
113
- if (offset === 0 || offset > uncompressedSize) {
114
- return -(index - 2);
115
- }
116
- // length of match copy
117
- let matchLength = token & 0xf;
118
- let length = matchLength + 240;
119
- while (length === 255) {
120
- length = data[index++];
121
- matchLength += length;
122
- }
123
- // Copy the match
124
- let pos = uncompressedSize - offset; // position of the match copy in the current output
125
- const end = uncompressedSize + matchLength + 4; // minmatch = 4
126
- while (uncompressedSize < end) {
127
- output[uncompressedSize++] = output[pos++];
128
- }
80
+
81
+ if (index === endIndex) {
82
+ return uncompressedSize;
129
83
  }
130
- return uncompressedSize;
131
- }
132
- /**
133
- * Compare file magic with lz4 magic number
134
- * @param input
135
- */
136
- checkMagicNumber(data) {
137
- const magic = new Uint32Array(data.slice(0, 4));
138
- return magic[0] === LZ4_MAGIC_NUMBER;
84
+ }
85
+
86
+ const offset = data[index++] | data[index++] << 8;
87
+
88
+ if (offset === 0 || offset > uncompressedSize) {
89
+ return -(index - 2);
90
+ }
91
+
92
+ let matchLength = token & 0xf;
93
+ let length = matchLength + 240;
94
+
95
+ while (length === 255) {
96
+ length = data[index++];
97
+ matchLength += length;
98
+ }
99
+
100
+ let pos = uncompressedSize - offset;
101
+ const end = uncompressedSize + matchLength + 4;
102
+
103
+ while (uncompressedSize < end) {
104
+ output[uncompressedSize++] = output[pos++];
105
+ }
139
106
  }
107
+
108
+ return uncompressedSize;
109
+ }
110
+
111
+ checkMagicNumber(data) {
112
+ const magic = new Uint32Array(data.slice(0, 4));
113
+ return magic[0] === LZ4_MAGIC_NUMBER;
114
+ }
115
+
140
116
  }
141
- exports.LZ4Compression = LZ4Compression;
117
+ //# sourceMappingURL=lz4-compression.js.map
@@ -0,0 +1 @@
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"}