@cj-tech-master/excelts 4.2.0 → 4.2.1-canary.20260111102127.f808a37
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.
- package/THIRD_PARTY_NOTICES.md +0 -31
- package/dist/browser/index.browser.d.ts +1 -0
- package/dist/browser/index.browser.js +12 -0
- package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.base.d.ts +1 -0
- package/dist/browser/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
- package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.browser.d.ts +10 -8
- package/dist/{esm/modules/archive → browser/modules/archive/compression}/compress.browser.js +18 -19
- package/dist/browser/modules/archive/{compress.d.ts → compression/compress.d.ts} +2 -2
- package/dist/browser/modules/archive/{compress.js → compression/compress.js} +1 -1
- package/dist/browser/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +1 -1
- package/dist/browser/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +1 -1
- package/dist/browser/modules/archive/{crc32.js → compression/crc32.js} +1 -1
- package/dist/browser/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
- package/dist/browser/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +2 -2
- package/dist/browser/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
- package/dist/browser/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +2 -2
- package/dist/browser/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
- package/dist/browser/modules/archive/defaults.d.ts +1 -0
- package/dist/browser/modules/archive/defaults.js +6 -3
- package/dist/browser/modules/archive/index.base.d.ts +4 -4
- package/dist/browser/modules/archive/index.base.js +3 -6
- package/dist/browser/modules/archive/index.browser.d.ts +3 -4
- package/dist/browser/modules/archive/index.browser.js +3 -7
- package/dist/browser/modules/archive/index.d.ts +3 -4
- package/dist/browser/modules/archive/index.js +3 -5
- package/dist/browser/modules/archive/internal/byte-queue.d.ts +33 -0
- package/dist/browser/modules/archive/internal/byte-queue.js +407 -0
- package/dist/browser/modules/archive/io/archive-sink.d.ts +9 -0
- package/dist/browser/modules/archive/io/archive-sink.js +77 -0
- package/dist/browser/modules/archive/io/archive-source.d.ts +8 -0
- package/dist/browser/modules/archive/io/archive-source.js +107 -0
- package/dist/browser/modules/archive/{extract.d.ts → unzip/extract.d.ts} +2 -2
- package/dist/browser/modules/archive/unzip/index.d.ts +40 -0
- package/dist/browser/modules/archive/unzip/index.js +164 -0
- package/dist/browser/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +58 -3
- package/dist/browser/modules/archive/unzip/stream.base.js +1022 -0
- package/dist/browser/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +1 -1
- package/dist/browser/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
- package/dist/browser/modules/archive/{parse.d.ts → unzip/stream.d.ts} +2 -2
- package/dist/{esm/modules/archive/parse.js → browser/modules/archive/unzip/stream.js} +7 -6
- package/dist/{types/modules/archive → browser/modules/archive/unzip}/zip-parser.d.ts +1 -1
- package/dist/{esm/modules/archive → browser/modules/archive/unzip}/zip-parser.js +38 -24
- package/dist/browser/modules/archive/utils/async-queue.d.ts +7 -0
- package/dist/browser/modules/archive/utils/async-queue.js +103 -0
- package/dist/browser/modules/archive/utils/bytes.js +16 -16
- package/dist/browser/modules/archive/utils/compressibility.d.ts +10 -0
- package/dist/browser/modules/archive/utils/compressibility.js +57 -0
- package/dist/browser/modules/archive/utils/parse-buffer.js +21 -23
- package/dist/browser/modules/archive/utils/pattern-scanner.d.ts +21 -0
- package/dist/browser/modules/archive/utils/pattern-scanner.js +27 -0
- package/dist/browser/modules/archive/utils/timestamps.js +62 -1
- package/dist/browser/modules/archive/utils/zip-extra-fields.d.ts +1 -1
- package/dist/browser/modules/archive/utils/zip-extra-fields.js +26 -14
- package/dist/browser/modules/archive/zip/index.d.ts +42 -0
- package/dist/browser/modules/archive/zip/index.js +157 -0
- package/dist/browser/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +28 -5
- package/dist/browser/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
- package/dist/browser/modules/archive/zip/zip-bytes.d.ts +73 -0
- package/dist/browser/modules/archive/zip/zip-bytes.js +239 -0
- package/dist/{esm/modules/archive → browser/modules/archive/zip}/zip-entry-metadata.js +3 -3
- package/dist/browser/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
- package/dist/browser/modules/archive/zip-spec/zip-records.js +126 -0
- package/dist/browser/modules/excel/form-control.d.ts +2 -0
- package/dist/browser/modules/excel/form-control.js +54 -16
- package/dist/browser/modules/excel/stream/workbook-reader.browser.js +1 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
- package/dist/browser/modules/excel/stream/workbook-writer.browser.js +1 -1
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
- package/dist/browser/modules/excel/xlsx/xlsx.browser.js +3 -6
- package/dist/browser/modules/excel/xlsx/xlsx.js +1 -1
- package/dist/browser/modules/stream/streams.browser.d.ts +28 -28
- package/dist/browser/modules/stream/streams.browser.js +850 -697
- package/dist/browser/modules/stream/streams.js +140 -58
- package/dist/cjs/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
- package/dist/cjs/modules/archive/{compress.browser.js → compression/compress.browser.js} +18 -19
- package/dist/cjs/modules/archive/{compress.js → compression/compress.js} +1 -1
- package/dist/cjs/modules/archive/{crc32.js → compression/crc32.js} +1 -1
- package/dist/cjs/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
- package/dist/cjs/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
- package/dist/cjs/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
- package/dist/cjs/modules/archive/defaults.js +7 -4
- package/dist/cjs/modules/archive/index.base.js +9 -19
- package/dist/cjs/modules/archive/index.browser.js +4 -10
- package/dist/cjs/modules/archive/index.js +4 -8
- package/dist/cjs/modules/archive/internal/byte-queue.js +411 -0
- package/dist/cjs/modules/archive/io/archive-sink.js +82 -0
- package/dist/cjs/modules/archive/io/archive-source.js +114 -0
- package/dist/cjs/modules/archive/unzip/index.js +170 -0
- package/dist/cjs/modules/archive/unzip/stream.base.js +1044 -0
- package/dist/cjs/modules/archive/{parse.browser.js → unzip/stream.browser.js} +377 -111
- package/dist/cjs/modules/archive/{parse.js → unzip/stream.js} +9 -8
- package/dist/cjs/modules/archive/{zip-parser.js → unzip/zip-parser.js} +47 -33
- package/dist/cjs/modules/archive/utils/async-queue.js +106 -0
- package/dist/cjs/modules/archive/utils/bytes.js +16 -16
- package/dist/cjs/modules/archive/utils/compressibility.js +60 -0
- package/dist/cjs/modules/archive/utils/parse-buffer.js +21 -23
- package/dist/cjs/modules/archive/utils/pattern-scanner.js +31 -0
- package/dist/cjs/modules/archive/utils/timestamps.js +64 -3
- package/dist/cjs/modules/archive/utils/zip-extra-fields.js +26 -14
- package/dist/cjs/modules/archive/zip/index.js +162 -0
- package/dist/cjs/modules/archive/{streaming-zip.js → zip/stream.js} +194 -50
- package/dist/cjs/modules/archive/zip/zip-bytes.js +242 -0
- package/dist/cjs/modules/archive/{zip-entry-metadata.js → zip/zip-entry-metadata.js} +5 -5
- package/dist/cjs/modules/archive/zip-spec/zip-records.js +136 -0
- package/dist/cjs/modules/excel/form-control.js +54 -16
- package/dist/cjs/modules/excel/stream/workbook-reader.browser.js +2 -2
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
- package/dist/cjs/modules/excel/xlsx/xlsx.browser.js +6 -9
- package/dist/cjs/modules/excel/xlsx/xlsx.js +2 -2
- package/dist/cjs/modules/stream/streams.browser.js +850 -697
- package/dist/cjs/modules/stream/streams.js +140 -58
- package/dist/esm/index.browser.js +12 -0
- package/dist/esm/modules/archive/{compress.base.js → compression/compress.base.js} +2 -1
- package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.browser.js +18 -19
- package/dist/esm/modules/archive/{compress.js → compression/compress.js} +1 -1
- package/dist/esm/modules/archive/{crc32.js → compression/crc32.js} +1 -1
- package/dist/esm/modules/archive/{deflate-fallback.js → compression/deflate-fallback.js} +1 -1
- package/dist/esm/modules/archive/{streaming-compress.browser.js → compression/streaming-compress.browser.js} +3 -3
- package/dist/esm/modules/archive/{streaming-compress.js → compression/streaming-compress.js} +2 -2
- package/dist/esm/modules/archive/defaults.js +6 -3
- package/dist/esm/modules/archive/index.base.js +3 -6
- package/dist/esm/modules/archive/index.browser.js +3 -7
- package/dist/esm/modules/archive/index.js +3 -5
- package/dist/esm/modules/archive/internal/byte-queue.js +407 -0
- package/dist/esm/modules/archive/io/archive-sink.js +77 -0
- package/dist/esm/modules/archive/io/archive-source.js +107 -0
- package/dist/esm/modules/archive/unzip/index.js +164 -0
- package/dist/esm/modules/archive/unzip/stream.base.js +1022 -0
- package/dist/esm/modules/archive/{parse.browser.js → unzip/stream.browser.js} +376 -110
- package/dist/{browser/modules/archive/parse.js → esm/modules/archive/unzip/stream.js} +7 -6
- package/dist/{browser/modules/archive → esm/modules/archive/unzip}/zip-parser.js +38 -24
- package/dist/esm/modules/archive/utils/async-queue.js +103 -0
- package/dist/esm/modules/archive/utils/bytes.js +16 -16
- package/dist/esm/modules/archive/utils/compressibility.js +57 -0
- package/dist/esm/modules/archive/utils/parse-buffer.js +21 -23
- package/dist/esm/modules/archive/utils/pattern-scanner.js +27 -0
- package/dist/esm/modules/archive/utils/timestamps.js +62 -1
- package/dist/esm/modules/archive/utils/zip-extra-fields.js +26 -14
- package/dist/esm/modules/archive/zip/index.js +157 -0
- package/dist/esm/modules/archive/{streaming-zip.js → zip/stream.js} +192 -48
- package/dist/esm/modules/archive/zip/zip-bytes.js +239 -0
- package/dist/{browser/modules/archive → esm/modules/archive/zip}/zip-entry-metadata.js +3 -3
- package/dist/esm/modules/archive/zip-spec/zip-records.js +126 -0
- package/dist/esm/modules/excel/form-control.js +54 -16
- package/dist/esm/modules/excel/stream/workbook-reader.browser.js +1 -1
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +17 -3
- package/dist/esm/modules/excel/xlsx/xlsx.browser.js +3 -6
- package/dist/esm/modules/excel/xlsx/xlsx.js +1 -1
- package/dist/esm/modules/stream/streams.browser.js +850 -697
- package/dist/esm/modules/stream/streams.js +140 -58
- package/dist/iife/THIRD_PARTY_NOTICES.md +81 -0
- package/dist/iife/excelts.iife.js +4777 -2863
- package/dist/iife/excelts.iife.js.map +1 -1
- package/dist/iife/excelts.iife.min.js +103 -31
- package/dist/types/index.browser.d.ts +1 -0
- package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.base.d.ts +1 -0
- package/dist/{browser/modules/archive → types/modules/archive/compression}/compress.browser.d.ts +10 -8
- package/dist/types/modules/archive/{streaming-compress.browser.d.ts → compression/streaming-compress.browser.d.ts} +1 -1
- package/dist/types/modules/archive/defaults.d.ts +1 -0
- package/dist/types/modules/archive/index.base.d.ts +4 -4
- package/dist/types/modules/archive/index.browser.d.ts +3 -4
- package/dist/types/modules/archive/index.d.ts +3 -4
- package/dist/types/modules/archive/internal/byte-queue.d.ts +33 -0
- package/dist/types/modules/archive/io/archive-sink.d.ts +9 -0
- package/dist/types/modules/archive/io/archive-source.d.ts +8 -0
- package/dist/types/modules/archive/unzip/index.d.ts +40 -0
- package/dist/types/modules/archive/{parse.base.d.ts → unzip/stream.base.d.ts} +60 -5
- package/dist/types/modules/archive/{parse.browser.d.ts → unzip/stream.browser.d.ts} +2 -2
- package/dist/types/modules/archive/{parse.d.ts → unzip/stream.d.ts} +3 -3
- package/dist/{browser/modules/archive → types/modules/archive/unzip}/zip-parser.d.ts +1 -1
- package/dist/types/modules/archive/utils/async-queue.d.ts +7 -0
- package/dist/types/modules/archive/utils/compressibility.d.ts +10 -0
- package/dist/types/modules/archive/utils/pattern-scanner.d.ts +21 -0
- package/dist/types/modules/archive/utils/zip-extra-fields.d.ts +1 -1
- package/dist/types/modules/archive/zip/index.d.ts +42 -0
- package/dist/types/modules/archive/{streaming-zip.d.ts → zip/stream.d.ts} +29 -6
- package/dist/types/modules/archive/zip/zip-bytes.d.ts +73 -0
- package/dist/types/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +1 -1
- package/dist/types/modules/archive/{zip-records.d.ts → zip-spec/zip-records.d.ts} +20 -0
- package/dist/types/modules/excel/form-control.d.ts +2 -0
- package/dist/types/modules/excel/stream/workbook-writer.browser.d.ts +1 -1
- package/dist/types/modules/stream/streams.browser.d.ts +28 -28
- package/package.json +10 -6
- package/dist/browser/modules/archive/byte-queue.d.ts +0 -18
- package/dist/browser/modules/archive/byte-queue.js +0 -125
- package/dist/browser/modules/archive/parse.base.js +0 -610
- package/dist/browser/modules/archive/utils/zip-extra.d.ts +0 -18
- package/dist/browser/modules/archive/utils/zip-extra.js +0 -68
- package/dist/browser/modules/archive/zip-builder.d.ts +0 -117
- package/dist/browser/modules/archive/zip-builder.js +0 -292
- package/dist/browser/modules/archive/zip-constants.d.ts +0 -18
- package/dist/browser/modules/archive/zip-constants.js +0 -23
- package/dist/browser/modules/archive/zip-records.js +0 -84
- package/dist/cjs/modules/archive/byte-queue.js +0 -129
- package/dist/cjs/modules/archive/parse.base.js +0 -632
- package/dist/cjs/modules/archive/utils/zip-extra.js +0 -74
- package/dist/cjs/modules/archive/zip-builder.js +0 -297
- package/dist/cjs/modules/archive/zip-constants.js +0 -26
- package/dist/cjs/modules/archive/zip-records.js +0 -90
- package/dist/esm/modules/archive/byte-queue.js +0 -125
- package/dist/esm/modules/archive/parse.base.js +0 -610
- package/dist/esm/modules/archive/utils/zip-extra.js +0 -68
- package/dist/esm/modules/archive/zip-builder.js +0 -292
- package/dist/esm/modules/archive/zip-constants.js +0 -23
- package/dist/esm/modules/archive/zip-records.js +0 -84
- package/dist/types/modules/archive/byte-queue.d.ts +0 -18
- package/dist/types/modules/archive/utils/zip-extra.d.ts +0 -18
- package/dist/types/modules/archive/zip-builder.d.ts +0 -117
- package/dist/types/modules/archive/zip-constants.d.ts +0 -18
- /package/dist/browser/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
- /package/dist/browser/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
- /package/dist/browser/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
- /package/dist/browser/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
- /package/dist/browser/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
- /package/dist/browser/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
- /package/dist/browser/modules/archive/{extract.js → unzip/extract.js} +0 -0
- /package/dist/browser/modules/archive/{zip-entry-metadata.d.ts → zip/zip-entry-metadata.d.ts} +0 -0
- /package/dist/browser/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
- /package/dist/browser/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
- /package/dist/cjs/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
- /package/dist/cjs/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
- /package/dist/cjs/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
- /package/dist/cjs/modules/archive/{extract.js → unzip/extract.js} +0 -0
- /package/dist/cjs/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
- /package/dist/esm/modules/archive/{crc32.base.js → compression/crc32.base.js} +0 -0
- /package/dist/esm/modules/archive/{crc32.browser.js → compression/crc32.browser.js} +0 -0
- /package/dist/esm/modules/archive/{streaming-compress.base.js → compression/streaming-compress.base.js} +0 -0
- /package/dist/esm/modules/archive/{extract.js → unzip/extract.js} +0 -0
- /package/dist/esm/modules/archive/{zip-entry-info.js → zip-spec/zip-entry-info.js} +0 -0
- /package/dist/{LICENSE → iife/LICENSE} +0 -0
- /package/dist/types/modules/archive/{compress.d.ts → compression/compress.d.ts} +0 -0
- /package/dist/types/modules/archive/{crc32.base.d.ts → compression/crc32.base.d.ts} +0 -0
- /package/dist/types/modules/archive/{crc32.browser.d.ts → compression/crc32.browser.d.ts} +0 -0
- /package/dist/types/modules/archive/{crc32.d.ts → compression/crc32.d.ts} +0 -0
- /package/dist/types/modules/archive/{deflate-fallback.d.ts → compression/deflate-fallback.d.ts} +0 -0
- /package/dist/types/modules/archive/{streaming-compress.base.d.ts → compression/streaming-compress.base.d.ts} +0 -0
- /package/dist/types/modules/archive/{streaming-compress.d.ts → compression/streaming-compress.d.ts} +0 -0
- /package/dist/types/modules/archive/{extract.d.ts → unzip/extract.d.ts} +0 -0
- /package/dist/types/modules/archive/{zip-entry-info.d.ts → zip-spec/zip-entry-info.d.ts} +0 -0
|
@@ -5,14 +5,13 @@
|
|
|
5
5
|
* Falls back to pure JavaScript implementation for older browsers.
|
|
6
6
|
* Uses the browser Duplex stream implementation for compatibility.
|
|
7
7
|
*/
|
|
8
|
-
import { Duplex, PassThrough, concatUint8Arrays } from "
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
import { hasDeflateRawDecompressionStream } from "./compress.base.js";
|
|
8
|
+
import { Duplex, PassThrough, concatUint8Arrays } from "../../stream/index.js";
|
|
9
|
+
import { DATA_DESCRIPTOR_SIGNATURE_BYTES, runParseLoop, streamUntilValidatedDataDescriptor } from "./stream.base.js";
|
|
10
|
+
import { PatternScanner } from "../utils/pattern-scanner.js";
|
|
11
|
+
import { inflateRaw as fallbackInflateRaw } from "../compression/deflate-fallback.js";
|
|
12
|
+
import { ByteQueue } from "../internal/byte-queue.js";
|
|
13
|
+
import { hasDeflateRawDecompressionStream } from "../compression/compress.base.js";
|
|
14
|
+
const DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK = 256 * 1024;
|
|
16
15
|
// =============================================================================
|
|
17
16
|
// Browser InflateRaw using DecompressionStream
|
|
18
17
|
// =============================================================================
|
|
@@ -29,6 +28,9 @@ class BrowserInflateRaw extends Duplex {
|
|
|
29
28
|
// Pass write handler to Duplex so pipe() calls our write method
|
|
30
29
|
// Also pass final handler to close the DecompressionStream when _writable ends
|
|
31
30
|
super({
|
|
31
|
+
// Keep the internal buffer bounded; this stream is used in tight parse loops.
|
|
32
|
+
writableHighWaterMark: 512 * 1024,
|
|
33
|
+
readableHighWaterMark: 512 * 1024,
|
|
32
34
|
write: (chunk, _encoding, callback) => {
|
|
33
35
|
this._doWrite(chunk, callback);
|
|
34
36
|
},
|
|
@@ -137,47 +139,6 @@ class BrowserInflateRaw extends Duplex {
|
|
|
137
139
|
this.push(null);
|
|
138
140
|
}
|
|
139
141
|
}
|
|
140
|
-
// Override write to feed data into DecompressionStream
|
|
141
|
-
write(chunk, encodingOrCallback, callback) {
|
|
142
|
-
// Handle overload
|
|
143
|
-
let cb;
|
|
144
|
-
if (typeof encodingOrCallback === "function") {
|
|
145
|
-
cb = encodingOrCallback;
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
cb = callback;
|
|
149
|
-
}
|
|
150
|
-
this._doWrite(chunk, cb);
|
|
151
|
-
return true;
|
|
152
|
-
}
|
|
153
|
-
// Override end to close the DecompressionStream writer
|
|
154
|
-
end(chunkOrCallback, encodingOrCallback, callback) {
|
|
155
|
-
// Handle overloads
|
|
156
|
-
let chunk;
|
|
157
|
-
let cb;
|
|
158
|
-
if (typeof chunkOrCallback === "function") {
|
|
159
|
-
cb = chunkOrCallback;
|
|
160
|
-
}
|
|
161
|
-
else if (chunkOrCallback !== undefined) {
|
|
162
|
-
chunk = chunkOrCallback;
|
|
163
|
-
if (typeof encodingOrCallback === "function") {
|
|
164
|
-
cb = encodingOrCallback;
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
cb = callback;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
// Write final chunk if provided
|
|
171
|
-
if (chunk) {
|
|
172
|
-
this.write(chunk, () => {
|
|
173
|
-
this._closeWriter(cb);
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
this._closeWriter(cb);
|
|
178
|
-
}
|
|
179
|
-
return this;
|
|
180
|
-
}
|
|
181
142
|
_closeWriter(callback) {
|
|
182
143
|
if (this.writeClosed) {
|
|
183
144
|
this._readingDonePromise.then(() => {
|
|
@@ -205,7 +166,6 @@ class BrowserInflateRaw extends Duplex {
|
|
|
205
166
|
if (callback) {
|
|
206
167
|
callback();
|
|
207
168
|
}
|
|
208
|
-
this.emit("finish");
|
|
209
169
|
});
|
|
210
170
|
});
|
|
211
171
|
}
|
|
@@ -218,6 +178,225 @@ class BrowserInflateRaw extends Duplex {
|
|
|
218
178
|
}
|
|
219
179
|
}
|
|
220
180
|
// =============================================================================
|
|
181
|
+
// Worker-based InflateRaw (optional)
|
|
182
|
+
// =============================================================================
|
|
183
|
+
let _inflateWorkerUrl = null;
|
|
184
|
+
function getInflateWorkerUrl(customUrl) {
|
|
185
|
+
if (typeof customUrl === "string" && customUrl.length > 0) {
|
|
186
|
+
return customUrl;
|
|
187
|
+
}
|
|
188
|
+
if (_inflateWorkerUrl) {
|
|
189
|
+
return _inflateWorkerUrl;
|
|
190
|
+
}
|
|
191
|
+
// Inline worker to avoid bundler-specific worker loaders.
|
|
192
|
+
// It streams deflate-raw through DecompressionStream and posts decompressed chunks back.
|
|
193
|
+
const code = `
|
|
194
|
+
let ds;
|
|
195
|
+
let writer;
|
|
196
|
+
let reader;
|
|
197
|
+
let junkError = false;
|
|
198
|
+
let pendingWrites = 0;
|
|
199
|
+
|
|
200
|
+
function isJunkErrorMessage(msg) {
|
|
201
|
+
return typeof msg === 'string' && (msg.includes('Junk') || msg.includes('junk'));
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async function ensureStarted() {
|
|
205
|
+
if (ds) return;
|
|
206
|
+
ds = new DecompressionStream('deflate-raw');
|
|
207
|
+
writer = ds.writable.getWriter();
|
|
208
|
+
reader = ds.readable.getReader();
|
|
209
|
+
|
|
210
|
+
(async () => {
|
|
211
|
+
try {
|
|
212
|
+
while (true) {
|
|
213
|
+
const r = await reader.read();
|
|
214
|
+
if (r.done) break;
|
|
215
|
+
const chunk = r.value;
|
|
216
|
+
postMessage({ t: 'data', chunk }, [chunk.buffer]);
|
|
217
|
+
}
|
|
218
|
+
postMessage({ t: 'end' });
|
|
219
|
+
} catch (e) {
|
|
220
|
+
const msg = e && e.message ? e.message : String(e);
|
|
221
|
+
if (isJunkErrorMessage(msg)) {
|
|
222
|
+
junkError = true;
|
|
223
|
+
postMessage({ t: 'end' });
|
|
224
|
+
} else {
|
|
225
|
+
postMessage({ t: 'error', message: msg });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
})();
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
onmessage = async (ev) => {
|
|
232
|
+
const msg = ev.data;
|
|
233
|
+
try {
|
|
234
|
+
await ensureStarted();
|
|
235
|
+
if (msg.t === 'write') {
|
|
236
|
+
if (junkError) {
|
|
237
|
+
postMessage({ t: 'ack', id: msg.id });
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
pendingWrites++;
|
|
241
|
+
await writer.write(msg.chunk);
|
|
242
|
+
pendingWrites--;
|
|
243
|
+
postMessage({ t: 'ack', id: msg.id });
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
if (msg.t === 'close') {
|
|
247
|
+
// Wait for in-flight writes to finish (best-effort).
|
|
248
|
+
while (pendingWrites > 0) {
|
|
249
|
+
await new Promise(r => setTimeout(r, 0));
|
|
250
|
+
}
|
|
251
|
+
try { await writer.close(); } catch (_) {}
|
|
252
|
+
postMessage({ t: 'closed' });
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
if (msg.t === 'abort') {
|
|
256
|
+
try { await writer.abort(); } catch (_) {}
|
|
257
|
+
postMessage({ t: 'aborted' });
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
} catch (e) {
|
|
261
|
+
const m = e && e.message ? e.message : String(e);
|
|
262
|
+
postMessage({ t: 'error', message: m, id: msg && msg.id });
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
`;
|
|
266
|
+
const blob = new Blob([code], { type: "text/javascript" });
|
|
267
|
+
_inflateWorkerUrl = URL.createObjectURL(blob);
|
|
268
|
+
return _inflateWorkerUrl;
|
|
269
|
+
}
|
|
270
|
+
class WorkerInflateRaw extends Duplex {
|
|
271
|
+
constructor(workerUrl) {
|
|
272
|
+
super({
|
|
273
|
+
write: (chunk, _encoding, callback) => {
|
|
274
|
+
this._doWrite(chunk, callback);
|
|
275
|
+
},
|
|
276
|
+
final: (callback) => {
|
|
277
|
+
this._doClose(callback);
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
this._nextId = 1;
|
|
281
|
+
this._pendingAcks = new Map();
|
|
282
|
+
this._closed = false;
|
|
283
|
+
this._junkError = false;
|
|
284
|
+
this._terminated = false;
|
|
285
|
+
const url = getInflateWorkerUrl(workerUrl);
|
|
286
|
+
this.worker = new Worker(url);
|
|
287
|
+
this.worker.onmessage = (ev) => {
|
|
288
|
+
const msg = ev.data;
|
|
289
|
+
if (!msg || typeof msg.t !== "string") {
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (msg.t === "data") {
|
|
293
|
+
const chunk = msg.chunk;
|
|
294
|
+
this.push(chunk);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
if (msg.t === "end") {
|
|
298
|
+
this.push(null);
|
|
299
|
+
this._terminateWorker();
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
if (msg.t === "aborted") {
|
|
303
|
+
this._terminateWorker();
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
if (msg.t === "ack") {
|
|
307
|
+
const id = msg.id;
|
|
308
|
+
const cb = this._pendingAcks.get(id);
|
|
309
|
+
if (cb) {
|
|
310
|
+
this._pendingAcks.delete(id);
|
|
311
|
+
cb();
|
|
312
|
+
}
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
if (msg.t === "error") {
|
|
316
|
+
const message = typeof msg.message === "string" ? msg.message : "Worker inflate error";
|
|
317
|
+
if (message.includes("Junk") || message.includes("junk")) {
|
|
318
|
+
this._junkError = true;
|
|
319
|
+
// Treat as end-of-stream.
|
|
320
|
+
this.push(null);
|
|
321
|
+
this._terminateWorker();
|
|
322
|
+
// Resolve any pending writes.
|
|
323
|
+
for (const cb of this._pendingAcks.values()) {
|
|
324
|
+
cb();
|
|
325
|
+
}
|
|
326
|
+
this._pendingAcks.clear();
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const err = new Error(message);
|
|
330
|
+
// Fail any pending writes.
|
|
331
|
+
for (const cb of this._pendingAcks.values()) {
|
|
332
|
+
cb(err);
|
|
333
|
+
}
|
|
334
|
+
this._pendingAcks.clear();
|
|
335
|
+
this.emit("error", err);
|
|
336
|
+
this._terminateWorker();
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
};
|
|
340
|
+
this.worker.onerror = (e) => {
|
|
341
|
+
const err = new Error(e.message || "Worker error");
|
|
342
|
+
for (const cb of this._pendingAcks.values()) {
|
|
343
|
+
cb(err);
|
|
344
|
+
}
|
|
345
|
+
this._pendingAcks.clear();
|
|
346
|
+
this.emit("error", err);
|
|
347
|
+
this._terminateWorker();
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
_terminateWorker() {
|
|
351
|
+
if (this._terminated) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
this._terminated = true;
|
|
355
|
+
try {
|
|
356
|
+
this.worker.terminate();
|
|
357
|
+
}
|
|
358
|
+
catch {
|
|
359
|
+
// ignore
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
_doWrite(chunk, callback) {
|
|
363
|
+
if (this._closed || this._junkError) {
|
|
364
|
+
callback();
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const id = this._nextId++;
|
|
368
|
+
this._pendingAcks.set(id, callback);
|
|
369
|
+
// Transfer the underlying ArrayBuffer to reduce copies.
|
|
370
|
+
// If chunk is a view into a larger buffer, slice to avoid transferring unrelated bytes.
|
|
371
|
+
const transferable = chunk.byteOffset === 0 && chunk.byteLength === chunk.buffer.byteLength
|
|
372
|
+
? chunk
|
|
373
|
+
: chunk.slice();
|
|
374
|
+
this.worker.postMessage({ t: "write", id, chunk: transferable }, [transferable.buffer]);
|
|
375
|
+
}
|
|
376
|
+
_doClose(callback) {
|
|
377
|
+
if (this._closed) {
|
|
378
|
+
callback();
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
this._closed = true;
|
|
382
|
+
this.worker.postMessage({ t: "close" });
|
|
383
|
+
callback();
|
|
384
|
+
}
|
|
385
|
+
destroy(error) {
|
|
386
|
+
if (!this._closed) {
|
|
387
|
+
this._closed = true;
|
|
388
|
+
try {
|
|
389
|
+
this.worker.postMessage({ t: "abort" });
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
// ignore
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
this._terminateWorker();
|
|
396
|
+
return super.destroy(error);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
// =============================================================================
|
|
221
400
|
// Fallback InflateRaw for browsers without DecompressionStream
|
|
222
401
|
// =============================================================================
|
|
223
402
|
/**
|
|
@@ -277,7 +456,7 @@ function createInflateRaw() {
|
|
|
277
456
|
// =============================================================================
|
|
278
457
|
// Utilities
|
|
279
458
|
// =============================================================================
|
|
280
|
-
const dataDescriptorSignature =
|
|
459
|
+
const dataDescriptorSignature = DATA_DESCRIPTOR_SIGNATURE_BYTES;
|
|
281
460
|
export function createParseClass(createInflateRawFn) {
|
|
282
461
|
/**
|
|
283
462
|
* ZIP Stream Parser for browsers.
|
|
@@ -291,11 +470,11 @@ export function createParseClass(createInflateRawFn) {
|
|
|
291
470
|
super({
|
|
292
471
|
objectMode: true,
|
|
293
472
|
write: (chunk, _encoding, callback) => {
|
|
294
|
-
this._handleWrite(chunk);
|
|
295
|
-
callback();
|
|
473
|
+
this._handleWrite(chunk, callback);
|
|
296
474
|
},
|
|
297
475
|
final: (callback) => {
|
|
298
476
|
this.finished = true;
|
|
477
|
+
this._maybeReleaseWriteCallback();
|
|
299
478
|
this._wakeUp();
|
|
300
479
|
this.emit("data-available");
|
|
301
480
|
this.emit("chunk", false);
|
|
@@ -307,6 +486,12 @@ export function createParseClass(createInflateRawFn) {
|
|
|
307
486
|
this._driverState = {};
|
|
308
487
|
this._parsingDone = Promise.resolve();
|
|
309
488
|
this._opts = opts;
|
|
489
|
+
// Default values are intentionally conservative to avoid memory spikes
|
|
490
|
+
// when parsing large archives under slow consumers.
|
|
491
|
+
const hi = Math.max(64 * 1024, opts.inputHighWaterMarkBytes ?? 2 * 1024 * 1024);
|
|
492
|
+
const lo = Math.max(32 * 1024, opts.inputLowWaterMarkBytes ?? Math.floor(hi / 4));
|
|
493
|
+
this._inputHighWaterMarkBytes = hi;
|
|
494
|
+
this._inputLowWaterMarkBytes = Math.min(lo, hi);
|
|
310
495
|
const io = {
|
|
311
496
|
pull: (length) => this.pull(length),
|
|
312
497
|
pullUntil: (pattern, includeEof) => this.pullUntil(pattern, includeEof),
|
|
@@ -334,6 +519,12 @@ export function createParseClass(createInflateRawFn) {
|
|
|
334
519
|
},
|
|
335
520
|
emitError: (err) => {
|
|
336
521
|
this.__emittedError = err;
|
|
522
|
+
// Ensure upstream writers don't hang waiting for a deferred write callback.
|
|
523
|
+
if (this._writeCb) {
|
|
524
|
+
const cb = this._writeCb;
|
|
525
|
+
this._writeCb = undefined;
|
|
526
|
+
cb(err);
|
|
527
|
+
}
|
|
337
528
|
this.emit("error", err);
|
|
338
529
|
},
|
|
339
530
|
emitClose: () => {
|
|
@@ -341,7 +532,27 @@ export function createParseClass(createInflateRawFn) {
|
|
|
341
532
|
}
|
|
342
533
|
};
|
|
343
534
|
queueMicrotask(() => {
|
|
344
|
-
|
|
535
|
+
// NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
|
|
536
|
+
// Browser's native DecompressionStream is faster than our pure-JS fallback,
|
|
537
|
+
// so we always use the streaming path for decompression in browsers.
|
|
538
|
+
const inflateFactory = () => {
|
|
539
|
+
if (this._opts.useWorkerInflate && typeof Worker !== "undefined") {
|
|
540
|
+
// Worker path requires DecompressionStream support.
|
|
541
|
+
if (hasDeflateRawDecompressionStream()) {
|
|
542
|
+
try {
|
|
543
|
+
return new WorkerInflateRaw(this._opts.workerInflateUrl);
|
|
544
|
+
}
|
|
545
|
+
catch {
|
|
546
|
+
// If Worker construction fails (e.g. CSP/CORS), fall back.
|
|
547
|
+
return createInflateRawFn();
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
return createInflateRawFn();
|
|
552
|
+
};
|
|
553
|
+
this._parsingDone = runParseLoop(this._opts, io, emitter, inflateFactory, this._driverState
|
|
554
|
+
// No inflateRawSync - always use streaming DecompressionStream in browser
|
|
555
|
+
);
|
|
345
556
|
this._parsingDone.catch((e) => {
|
|
346
557
|
if (!this.__emittedError || this.__emittedError !== e) {
|
|
347
558
|
this.__emittedError = e;
|
|
@@ -351,8 +562,16 @@ export function createParseClass(createInflateRawFn) {
|
|
|
351
562
|
});
|
|
352
563
|
});
|
|
353
564
|
}
|
|
354
|
-
_handleWrite(chunk) {
|
|
565
|
+
_handleWrite(chunk, callback) {
|
|
355
566
|
this._buffer.append(chunk);
|
|
567
|
+
// Apply writable backpressure by deferring the callback when the input buffer is large.
|
|
568
|
+
// The callback will be released once the parser drains the buffer.
|
|
569
|
+
if (this._buffer.length >= this._inputHighWaterMarkBytes) {
|
|
570
|
+
this._writeCb = callback;
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
callback();
|
|
574
|
+
}
|
|
356
575
|
this._wakeUp();
|
|
357
576
|
this.emit("data-available");
|
|
358
577
|
this.emit("chunk");
|
|
@@ -363,13 +582,6 @@ export function createParseClass(createInflateRawFn) {
|
|
|
363
582
|
set buffer(value) {
|
|
364
583
|
this._buffer.reset(value);
|
|
365
584
|
}
|
|
366
|
-
_maybeReleaseWriteCallback() {
|
|
367
|
-
if (typeof this.cb === "function") {
|
|
368
|
-
const callback = this.cb;
|
|
369
|
-
this.cb = undefined;
|
|
370
|
-
callback();
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
585
|
_wakeUp() {
|
|
374
586
|
if (this._pendingResolve) {
|
|
375
587
|
const resolve = this._pendingResolve;
|
|
@@ -377,6 +589,17 @@ export function createParseClass(createInflateRawFn) {
|
|
|
377
589
|
resolve();
|
|
378
590
|
}
|
|
379
591
|
}
|
|
592
|
+
_maybeReleaseWriteCallback() {
|
|
593
|
+
if (!this._writeCb) {
|
|
594
|
+
return;
|
|
595
|
+
}
|
|
596
|
+
if (this._buffer.length > this._inputLowWaterMarkBytes) {
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
const cb = this._writeCb;
|
|
600
|
+
this._writeCb = undefined;
|
|
601
|
+
cb();
|
|
602
|
+
}
|
|
380
603
|
_waitForData() {
|
|
381
604
|
return new Promise(resolve => {
|
|
382
605
|
this._pendingResolve = resolve;
|
|
@@ -390,60 +613,76 @@ export function createParseClass(createInflateRawFn) {
|
|
|
390
613
|
if (this.finished) {
|
|
391
614
|
if (this._buffer.length > 0) {
|
|
392
615
|
const data = this._buffer.read(this._buffer.length);
|
|
616
|
+
this._maybeReleaseWriteCallback();
|
|
393
617
|
return data;
|
|
394
618
|
}
|
|
395
619
|
throw new Error("FILE_ENDED");
|
|
396
620
|
}
|
|
397
621
|
await this._waitForData();
|
|
398
622
|
}
|
|
399
|
-
|
|
623
|
+
const out = this._buffer.read(length);
|
|
624
|
+
this._maybeReleaseWriteCallback();
|
|
625
|
+
return out;
|
|
400
626
|
}
|
|
401
627
|
async _pullUntilInternal(pattern, includeEof = false) {
|
|
402
628
|
const chunks = [];
|
|
403
|
-
|
|
404
|
-
const overlap = Math.max(0, pattern.length - 1);
|
|
629
|
+
const scanner = new PatternScanner(pattern);
|
|
405
630
|
while (true) {
|
|
406
|
-
const
|
|
407
|
-
const match =
|
|
631
|
+
const bufLen = this._buffer.length;
|
|
632
|
+
const match = scanner.find(this._buffer);
|
|
408
633
|
if (match !== -1) {
|
|
409
634
|
this.match = match;
|
|
410
635
|
const toRead = match + (includeEof ? pattern.length : 0);
|
|
411
636
|
if (toRead > 0) {
|
|
412
637
|
chunks.push(this._buffer.read(toRead));
|
|
638
|
+
this._maybeReleaseWriteCallback();
|
|
413
639
|
}
|
|
414
|
-
return concatUint8Arrays(chunks);
|
|
640
|
+
return chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks);
|
|
415
641
|
}
|
|
416
642
|
// No match yet. Avoid rescanning bytes that can't start a match.
|
|
417
|
-
|
|
643
|
+
scanner.onNoMatch(bufLen);
|
|
418
644
|
if (this.finished) {
|
|
419
645
|
throw new Error("FILE_ENDED");
|
|
420
646
|
}
|
|
421
647
|
const safeLen = Math.max(0, this._buffer.length - pattern.length);
|
|
422
648
|
if (safeLen > 0) {
|
|
423
649
|
chunks.push(this._buffer.read(safeLen));
|
|
424
|
-
|
|
650
|
+
scanner.onConsume(safeLen);
|
|
651
|
+
this._maybeReleaseWriteCallback();
|
|
425
652
|
}
|
|
426
653
|
await this._waitForData();
|
|
427
654
|
}
|
|
428
655
|
}
|
|
429
656
|
_streamFixedLength(length) {
|
|
430
|
-
const output = new PassThrough();
|
|
657
|
+
const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
|
|
431
658
|
let remaining = length;
|
|
432
659
|
let done = false;
|
|
660
|
+
let waitingDrain = false;
|
|
433
661
|
const pull = () => {
|
|
434
662
|
if (done) {
|
|
435
663
|
return;
|
|
436
664
|
}
|
|
665
|
+
if (waitingDrain) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
437
668
|
while (remaining > 0 && this._buffer.length > 0) {
|
|
438
669
|
const toRead = Math.min(remaining, this._buffer.length);
|
|
439
670
|
const chunk = this._buffer.read(toRead);
|
|
440
671
|
remaining -= toRead;
|
|
441
|
-
output.write(chunk);
|
|
672
|
+
const ok = output.write(chunk);
|
|
673
|
+
this._maybeReleaseWriteCallback();
|
|
674
|
+
if (!ok) {
|
|
675
|
+
waitingDrain = true;
|
|
676
|
+
output.once("drain", () => {
|
|
677
|
+
waitingDrain = false;
|
|
678
|
+
pull();
|
|
679
|
+
});
|
|
680
|
+
return;
|
|
681
|
+
}
|
|
442
682
|
}
|
|
443
683
|
if (remaining === 0) {
|
|
444
684
|
done = true;
|
|
445
685
|
this.removeListener("data-available", pull);
|
|
446
|
-
this._maybeReleaseWriteCallback();
|
|
447
686
|
output.end();
|
|
448
687
|
}
|
|
449
688
|
else if (this.finished) {
|
|
@@ -457,42 +696,69 @@ export function createParseClass(createInflateRawFn) {
|
|
|
457
696
|
return output;
|
|
458
697
|
}
|
|
459
698
|
_streamUntilPattern(pattern, includeEof = false) {
|
|
460
|
-
const output = new PassThrough();
|
|
699
|
+
const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
|
|
461
700
|
let done = false;
|
|
462
|
-
|
|
463
|
-
const
|
|
701
|
+
const patternLen = pattern.length;
|
|
702
|
+
const scanner = new PatternScanner(pattern);
|
|
703
|
+
let waitingDrain = false;
|
|
464
704
|
const pull = () => {
|
|
465
|
-
if (done) {
|
|
705
|
+
if (done || waitingDrain) {
|
|
466
706
|
return;
|
|
467
707
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
this.match = match;
|
|
472
|
-
const endIndex = includeEof ? match + pattern.length : match;
|
|
473
|
-
if (endIndex > 0) {
|
|
474
|
-
output.write(this._buffer.read(endIndex));
|
|
708
|
+
while (true) {
|
|
709
|
+
if (this._buffer.length <= 0) {
|
|
710
|
+
break;
|
|
475
711
|
}
|
|
476
|
-
|
|
477
|
-
this.
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
712
|
+
const bufLen = this._buffer.length;
|
|
713
|
+
const match = scanner.find(this._buffer);
|
|
714
|
+
if (match !== -1) {
|
|
715
|
+
this.match = match;
|
|
716
|
+
const endIndex = includeEof ? match + patternLen : match;
|
|
717
|
+
if (endIndex > 0) {
|
|
718
|
+
const ok = output.write(this._buffer.read(endIndex));
|
|
719
|
+
scanner.onConsume(endIndex);
|
|
720
|
+
this._maybeReleaseWriteCallback();
|
|
721
|
+
if (!ok) {
|
|
722
|
+
waitingDrain = true;
|
|
723
|
+
output.once("drain", () => {
|
|
724
|
+
waitingDrain = false;
|
|
725
|
+
pull();
|
|
726
|
+
});
|
|
727
|
+
return;
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
done = true;
|
|
731
|
+
this.removeListener("data-available", pull);
|
|
732
|
+
output.end();
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
// No match yet. Avoid rescanning bytes that can't start a match.
|
|
736
|
+
scanner.onNoMatch(bufLen);
|
|
737
|
+
if (this.finished) {
|
|
738
|
+
done = true;
|
|
739
|
+
this.removeListener("data-available", pull);
|
|
740
|
+
output.destroy(new Error("FILE_ENDED"));
|
|
741
|
+
return;
|
|
742
|
+
}
|
|
743
|
+
const safeLen = bufLen - patternLen;
|
|
744
|
+
if (safeLen <= 0) {
|
|
745
|
+
// Keep enough bytes to detect a split signature.
|
|
746
|
+
if (this._buffer.length <= patternLen) {
|
|
747
|
+
this._maybeReleaseWriteCallback();
|
|
748
|
+
}
|
|
749
|
+
break;
|
|
750
|
+
}
|
|
751
|
+
const ok = output.write(this._buffer.read(safeLen));
|
|
752
|
+
scanner.onConsume(safeLen);
|
|
495
753
|
this._maybeReleaseWriteCallback();
|
|
754
|
+
if (!ok) {
|
|
755
|
+
waitingDrain = true;
|
|
756
|
+
output.once("drain", () => {
|
|
757
|
+
waitingDrain = false;
|
|
758
|
+
pull();
|
|
759
|
+
});
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
496
762
|
}
|
|
497
763
|
};
|
|
498
764
|
this.on("data-available", pull);
|
|
@@ -515,11 +781,7 @@ export function createParseClass(createInflateRawFn) {
|
|
|
515
781
|
return Promise.reject(new Error("FILE_ENDED"));
|
|
516
782
|
}
|
|
517
783
|
if (this._buffer.length >= eof) {
|
|
518
|
-
|
|
519
|
-
if (this._buffer.length === 0) {
|
|
520
|
-
this._maybeReleaseWriteCallback();
|
|
521
|
-
}
|
|
522
|
-
return Promise.resolve(data);
|
|
784
|
+
return Promise.resolve(this._buffer.read(eof));
|
|
523
785
|
}
|
|
524
786
|
return this._pullInternal(eof);
|
|
525
787
|
}
|
|
@@ -535,14 +797,18 @@ export function createParseClass(createInflateRawFn) {
|
|
|
535
797
|
_streamUntilDataDescriptor() {
|
|
536
798
|
return streamUntilValidatedDataDescriptor({
|
|
537
799
|
source: {
|
|
538
|
-
getView: () => this._buffer.view(),
|
|
539
800
|
getLength: () => this._buffer.length,
|
|
540
801
|
read: (length) => this._buffer.read(length),
|
|
802
|
+
peekChunks: (length) => this._buffer.peekChunks(length),
|
|
803
|
+
discard: (length) => this._buffer.discard(length),
|
|
804
|
+
indexOfPattern: (pattern, startIndex) => this._buffer.indexOfPattern(pattern, startIndex),
|
|
805
|
+
peekUint32LE: (offset) => this._buffer.peekUint32LE(offset),
|
|
541
806
|
isFinished: () => this.finished,
|
|
542
807
|
onDataAvailable: (cb) => {
|
|
543
808
|
this.on("data-available", cb);
|
|
544
809
|
return () => this.removeListener("data-available", cb);
|
|
545
|
-
}
|
|
810
|
+
},
|
|
811
|
+
maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
|
|
546
812
|
},
|
|
547
813
|
dataDescriptorSignature
|
|
548
814
|
});
|