@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
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { ZipParser } from "./zip-parser.js";
|
|
2
|
+
import { createParse } from "./stream.browser.js";
|
|
3
|
+
import { pipeIterableToSink } from "../io/archive-sink.js";
|
|
4
|
+
import { toAsyncIterable, toUint8Array } from "../io/archive-source.js";
|
|
5
|
+
const textDecoderCache = new Map();
|
|
6
|
+
function getTextDecoder(encoding) {
|
|
7
|
+
const key = encoding ?? "utf-8";
|
|
8
|
+
const cached = textDecoderCache.get(key);
|
|
9
|
+
if (cached) {
|
|
10
|
+
return cached;
|
|
11
|
+
}
|
|
12
|
+
const decoder = new TextDecoder(key);
|
|
13
|
+
textDecoderCache.set(key, decoder);
|
|
14
|
+
return decoder;
|
|
15
|
+
}
|
|
16
|
+
export class UnzipEntry {
|
|
17
|
+
constructor(args) {
|
|
18
|
+
if (args.kind === "buffer") {
|
|
19
|
+
this._parser = args.parser;
|
|
20
|
+
this._info = args.info;
|
|
21
|
+
this.path = args.info.path;
|
|
22
|
+
this.isDirectory = args.info.isDirectory;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
this._parseEntry = args.entry;
|
|
26
|
+
this.path = args.entry.path;
|
|
27
|
+
this.isDirectory = args.entry.type === "Directory";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
async bytes() {
|
|
31
|
+
if (this._parser && this._info) {
|
|
32
|
+
const out = await this._parser.extract(this._info.path);
|
|
33
|
+
return out ?? new Uint8Array(0);
|
|
34
|
+
}
|
|
35
|
+
if (this._parseEntry) {
|
|
36
|
+
const data = await this._parseEntry.buffer();
|
|
37
|
+
// In Node.js, `entry.buffer()` may return a Buffer, which causes
|
|
38
|
+
// deep-equality mismatches against Uint8Array in tests.
|
|
39
|
+
if (typeof Buffer !== "undefined" && data instanceof Buffer) {
|
|
40
|
+
return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
|
|
41
|
+
}
|
|
42
|
+
return data;
|
|
43
|
+
}
|
|
44
|
+
return new Uint8Array(0);
|
|
45
|
+
}
|
|
46
|
+
async *stream() {
|
|
47
|
+
if (this._parser && this._info) {
|
|
48
|
+
const data = await this.bytes();
|
|
49
|
+
if (data.length) {
|
|
50
|
+
yield data;
|
|
51
|
+
}
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (this._parseEntry) {
|
|
55
|
+
for await (const chunk of this._parseEntry) {
|
|
56
|
+
yield chunk;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async pipeTo(sink) {
|
|
61
|
+
await pipeIterableToSink(this.stream(), sink);
|
|
62
|
+
}
|
|
63
|
+
async text(encoding) {
|
|
64
|
+
const bytes = await this.bytes();
|
|
65
|
+
return getTextDecoder(encoding).decode(bytes);
|
|
66
|
+
}
|
|
67
|
+
discard() {
|
|
68
|
+
if (this._parseEntry) {
|
|
69
|
+
this._parseEntry.autodrain();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
export class ZipReader {
|
|
74
|
+
constructor(source, options = {}) {
|
|
75
|
+
this._bufferParser = null;
|
|
76
|
+
this._source = source;
|
|
77
|
+
this._options = options;
|
|
78
|
+
}
|
|
79
|
+
async _ensureBufferParser() {
|
|
80
|
+
if (this._bufferParser) {
|
|
81
|
+
return this._bufferParser;
|
|
82
|
+
}
|
|
83
|
+
if (this._source instanceof Uint8Array ||
|
|
84
|
+
this._source instanceof ArrayBuffer ||
|
|
85
|
+
typeof this._source === "string" ||
|
|
86
|
+
(typeof Blob !== "undefined" && this._source instanceof Blob)) {
|
|
87
|
+
const bytes = await toUint8Array(this._source);
|
|
88
|
+
this._bufferParser = new ZipParser(bytes, {
|
|
89
|
+
decodeStrings: this._options.decodeStrings
|
|
90
|
+
});
|
|
91
|
+
return this._bufferParser;
|
|
92
|
+
}
|
|
93
|
+
throw new Error("This ZIP source is streaming; random access is not available");
|
|
94
|
+
}
|
|
95
|
+
async get(path) {
|
|
96
|
+
const parser = await this._ensureBufferParser();
|
|
97
|
+
const info = parser.getEntry(path);
|
|
98
|
+
if (!info) {
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
return new UnzipEntry({ kind: "buffer", parser, info });
|
|
102
|
+
}
|
|
103
|
+
async *entries() {
|
|
104
|
+
// Buffer mode
|
|
105
|
+
if (this._source instanceof Uint8Array ||
|
|
106
|
+
this._source instanceof ArrayBuffer ||
|
|
107
|
+
typeof this._source === "string" ||
|
|
108
|
+
(typeof Blob !== "undefined" && this._source instanceof Blob)) {
|
|
109
|
+
const parser = await this._ensureBufferParser();
|
|
110
|
+
for (const info of parser.getEntries()) {
|
|
111
|
+
yield new UnzipEntry({ kind: "buffer", parser, info });
|
|
112
|
+
}
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
// Streaming mode
|
|
116
|
+
// Always prefer forceStream mode for backpressure and bounded buffering.
|
|
117
|
+
const parse = createParse({ ...(this._options.parse ?? {}), forceStream: true });
|
|
118
|
+
const feedPromise = (async () => {
|
|
119
|
+
try {
|
|
120
|
+
for await (const chunk of toAsyncIterable(this._source)) {
|
|
121
|
+
await new Promise((resolve, reject) => {
|
|
122
|
+
parse.write(chunk, (err) => {
|
|
123
|
+
if (err) {
|
|
124
|
+
reject(err);
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
resolve();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
parse.end();
|
|
133
|
+
await parse.promise();
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
parse.destroy(e instanceof Error ? e : new Error(String(e)));
|
|
137
|
+
throw e;
|
|
138
|
+
}
|
|
139
|
+
})();
|
|
140
|
+
try {
|
|
141
|
+
for await (const entry of parse) {
|
|
142
|
+
yield new UnzipEntry({ kind: "stream", entry });
|
|
143
|
+
}
|
|
144
|
+
await feedPromise;
|
|
145
|
+
}
|
|
146
|
+
finally {
|
|
147
|
+
// Ensure the feed task does not get stranded.
|
|
148
|
+
await feedPromise.catch(() => { });
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async bytes(path) {
|
|
152
|
+
const entry = await this.get(path);
|
|
153
|
+
if (!entry) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return entry.bytes();
|
|
157
|
+
}
|
|
158
|
+
async close() {
|
|
159
|
+
// No persistent resources in buffer mode.
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export function unzip(source, options) {
|
|
163
|
+
return new ZipReader(source, options);
|
|
164
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Duplex, PassThrough, Transform, type Readable } from "@stream";
|
|
2
|
-
import { ByteQueue } from "@archive/byte-queue";
|
|
2
|
+
import { ByteQueue } from "@archive/internal/byte-queue";
|
|
3
3
|
import { parseZipExtraFields, type ZipExtraFields, type ZipVars } from "@archive/utils/zip-extra-fields";
|
|
4
|
+
export declare const DATA_DESCRIPTOR_SIGNATURE_BYTES: Uint8Array<ArrayBufferLike>;
|
|
4
5
|
export declare const CRX_HEADER_FORMAT: [string, number][];
|
|
5
6
|
export declare const LOCAL_FILE_HEADER_FORMAT: [string, number][];
|
|
6
7
|
export declare const DATA_DESCRIPTOR_FORMAT: [string, number][];
|
|
@@ -119,9 +120,14 @@ export interface ValidatedDataDescriptorScanResult {
|
|
|
119
120
|
*/
|
|
120
121
|
export declare function scanValidatedDataDescriptor(view: Uint8Array, dataDescriptorSignature: Uint8Array, bytesEmitted: number, startIndex?: number, out?: ValidatedDataDescriptorScanResult): ValidatedDataDescriptorScanResult;
|
|
121
122
|
export interface StreamUntilValidatedDataDescriptorSource {
|
|
122
|
-
getView(): Uint8Array;
|
|
123
123
|
getLength(): number;
|
|
124
124
|
read(length: number): Uint8Array;
|
|
125
|
+
/** Optional: zero-copy chunk views for streaming writes. */
|
|
126
|
+
peekChunks?(length: number): Uint8Array[];
|
|
127
|
+
/** Optional: consume bytes previously written from peekChunks(). */
|
|
128
|
+
discard?(length: number): void;
|
|
129
|
+
indexOfPattern(pattern: Uint8Array, startIndex: number): number;
|
|
130
|
+
peekUint32LE(offset: number): number | null;
|
|
125
131
|
isFinished(): boolean;
|
|
126
132
|
onDataAvailable(cb: () => void): () => void;
|
|
127
133
|
maybeReleaseWriteCallback?: () => void;
|
|
@@ -142,6 +148,45 @@ export declare function streamUntilValidatedDataDescriptor(options: StreamUntilV
|
|
|
142
148
|
export interface ParseOptions {
|
|
143
149
|
verbose?: boolean;
|
|
144
150
|
forceStream?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Browser-only: use a Web Worker to run inflate off the main thread.
|
|
153
|
+
* Defaults to false.
|
|
154
|
+
*/
|
|
155
|
+
useWorkerInflate?: boolean;
|
|
156
|
+
/**
|
|
157
|
+
* Browser-only: provide an explicit Worker script URL.
|
|
158
|
+
*
|
|
159
|
+
* Useful under strict CSP that blocks `blob:` workers. When set, the browser
|
|
160
|
+
* parser will try to construct `new Worker(workerInflateUrl)`.
|
|
161
|
+
*/
|
|
162
|
+
workerInflateUrl?: string;
|
|
163
|
+
/**
|
|
164
|
+
* Input backpressure high-water mark (bytes).
|
|
165
|
+
*
|
|
166
|
+
* When provided, implementations may delay the writable callback until the
|
|
167
|
+
* internal input buffer drops below `inputLowWaterMarkBytes`.
|
|
168
|
+
*
|
|
169
|
+
* This is primarily used by the browser parser, because its writable side
|
|
170
|
+
* otherwise tends to accept unlimited data and can cause large memory spikes.
|
|
171
|
+
*/
|
|
172
|
+
inputHighWaterMarkBytes?: number;
|
|
173
|
+
/**
|
|
174
|
+
* Input backpressure low-water mark (bytes).
|
|
175
|
+
* When the internal buffer drops to (or below) this value, a delayed writable
|
|
176
|
+
* callback may be released.
|
|
177
|
+
*/
|
|
178
|
+
inputLowWaterMarkBytes?: number;
|
|
179
|
+
/**
|
|
180
|
+
* Threshold (in bytes) for small file optimization.
|
|
181
|
+
* Files smaller than this will use sync decompression (no stream overhead).
|
|
182
|
+
*
|
|
183
|
+
* Note: the optimization is only applied when the entry sizes are trusted
|
|
184
|
+
* (i.e. no data descriptor) and BOTH compressedSize and uncompressedSize
|
|
185
|
+
* are below this threshold. This avoids buffering huge highly-compressible
|
|
186
|
+
* files (e.g. large XML) in memory, which would defeat streaming.
|
|
187
|
+
* Default: 5MB
|
|
188
|
+
*/
|
|
189
|
+
thresholdBytes?: number;
|
|
145
190
|
}
|
|
146
191
|
export interface EntryVars {
|
|
147
192
|
versionsNeededToExtract: number | null;
|
|
@@ -195,4 +240,14 @@ export interface ParseEmitter {
|
|
|
195
240
|
emitClose(): void;
|
|
196
241
|
}
|
|
197
242
|
export type InflateFactory = () => Transform | Duplex | PassThrough;
|
|
198
|
-
|
|
243
|
+
/**
|
|
244
|
+
* Synchronous inflate function type for small file optimization.
|
|
245
|
+
* When provided and file size is below threshold, this will be used
|
|
246
|
+
* instead of streaming decompression for better performance.
|
|
247
|
+
*/
|
|
248
|
+
export type InflateRawSync = (data: Uint8Array) => Uint8Array;
|
|
249
|
+
/**
|
|
250
|
+
* Default threshold for small file optimization (5MB).
|
|
251
|
+
*/
|
|
252
|
+
export declare const DEFAULT_PARSE_THRESHOLD_BYTES: number;
|
|
253
|
+
export declare function runParseLoop(opts: ParseOptions, io: ParseIO, emitter: ParseEmitter, inflateFactory: InflateFactory, state: ParseDriverState, inflateRawSync?: InflateRawSync): Promise<void>;
|