@cj-tech-master/excelts 4.2.1 → 4.2.2
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/{esm/modules/archive → browser/modules/archive/compression}/compress.base.js +1 -1
- package/dist/{types/modules/archive → browser/modules/archive/compression}/compress.browser.d.ts +2 -8
- package/dist/browser/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
- package/dist/browser/modules/archive/{compress.d.ts → compression/compress.d.ts} +2 -2
- package/dist/{esm/modules/archive → browser/modules/archive/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 +8 -0
- package/dist/browser/modules/archive/io/archive-sink.js +45 -0
- package/dist/browser/modules/archive/io/archive-source.d.ts +6 -0
- package/dist/browser/modules/archive/io/archive-source.js +100 -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} +36 -2
- 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} +371 -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} +6 -5
- package/dist/browser/modules/archive/{zip-parser.d.ts → 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/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/utils/ooxml-validator.d.ts +48 -0
- package/dist/browser/modules/excel/utils/ooxml-validator.js +469 -0
- package/dist/browser/modules/excel/worksheet.js +5 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
- package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
- package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
- package/dist/browser/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
- package/dist/browser/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
- package/dist/browser/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
- package/dist/browser/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
- 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/base-transform.d.ts +3 -0
- package/dist/browser/modules/stream/base-transform.js +34 -20
- package/dist/browser/modules/stream/buffered-stream.d.ts +2 -12
- package/dist/browser/modules/stream/chunked-builder.js +4 -4
- package/dist/browser/modules/stream/index.browser.d.ts +13 -19
- package/dist/browser/modules/stream/index.browser.js +10 -22
- package/dist/browser/modules/stream/index.d.ts +18 -41
- package/dist/browser/modules/stream/index.js +15 -44
- package/dist/browser/modules/stream/internal/event-utils.d.ts +17 -0
- package/dist/browser/modules/stream/internal/event-utils.js +40 -0
- package/dist/browser/modules/stream/internal/type-guards.d.ts +9 -0
- package/dist/browser/modules/stream/internal/type-guards.js +24 -0
- package/dist/browser/modules/stream/pull-stream.d.ts +5 -6
- package/dist/browser/modules/stream/pull-stream.js +107 -43
- package/dist/browser/modules/stream/shared.d.ts +1 -1
- package/dist/browser/modules/stream/shared.js +7 -4
- package/dist/browser/modules/stream/streams.browser.d.ts +32 -44
- package/dist/browser/modules/stream/streams.browser.js +921 -836
- package/dist/browser/modules/stream/streams.d.ts +4 -20
- package/dist/browser/modules/stream/streams.js +146 -95
- package/dist/browser/modules/stream/utils.js +5 -38
- package/dist/cjs/modules/archive/{compress.base.js → compression/compress.base.js} +1 -1
- package/dist/cjs/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
- 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 +49 -0
- package/dist/cjs/modules/archive/io/archive-source.js +105 -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} +372 -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/stream/workbook-reader.browser.js +2 -2
- package/dist/cjs/modules/excel/stream/workbook-writer.browser.js +4 -4
- package/dist/cjs/modules/excel/utils/ooxml-validator.js +475 -0
- package/dist/cjs/modules/excel/worksheet.js +5 -2
- package/dist/cjs/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
- package/dist/cjs/modules/excel/xlsx/xform/drawing/sp-xform.js +115 -0
- package/dist/cjs/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
- package/dist/cjs/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
- package/dist/cjs/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
- package/dist/cjs/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
- 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/base-transform.js +34 -20
- package/dist/cjs/modules/stream/chunked-builder.js +4 -4
- package/dist/cjs/modules/stream/index.browser.js +10 -17
- package/dist/cjs/modules/stream/index.js +15 -39
- package/dist/cjs/modules/stream/internal/event-utils.js +43 -0
- package/dist/cjs/modules/stream/internal/type-guards.js +30 -0
- package/dist/cjs/modules/stream/pull-stream.js +107 -43
- package/dist/cjs/modules/stream/shared.js +7 -4
- package/dist/cjs/modules/stream/streams.browser.js +927 -847
- package/dist/cjs/modules/stream/streams.js +156 -107
- package/dist/cjs/modules/stream/utils.js +3 -36
- package/dist/esm/index.browser.js +12 -0
- package/dist/{browser/modules/archive → esm/modules/archive/compression}/compress.base.js +1 -1
- package/dist/esm/modules/archive/{compress.browser.js → compression/compress.browser.js} +3 -11
- package/dist/{browser/modules/archive → esm/modules/archive/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 +45 -0
- package/dist/esm/modules/archive/io/archive-source.js +100 -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} +371 -110
- package/dist/{browser/modules/archive/parse.js → esm/modules/archive/unzip/stream.js} +6 -5
- 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/stream/workbook-reader.browser.js +1 -1
- package/dist/esm/modules/excel/stream/workbook-writer.browser.js +1 -1
- package/dist/esm/modules/excel/utils/ooxml-validator.js +469 -0
- package/dist/esm/modules/excel/worksheet.js +5 -2
- package/dist/esm/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.js +13 -1
- package/dist/esm/modules/excel/xlsx/xform/drawing/sp-xform.js +112 -0
- package/dist/esm/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.js +30 -2
- package/dist/esm/modules/excel/xlsx/xform/drawing/vml-drawing-xform.js +11 -0
- package/dist/esm/modules/excel/xlsx/xform/sheet/page-setup-xform.js +16 -2
- package/dist/esm/modules/excel/xlsx/xform/sheet/worksheet-xform.js +110 -12
- 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/base-transform.js +34 -20
- package/dist/esm/modules/stream/chunked-builder.js +4 -4
- package/dist/esm/modules/stream/index.browser.js +10 -22
- package/dist/esm/modules/stream/index.js +15 -44
- package/dist/esm/modules/stream/internal/event-utils.js +40 -0
- package/dist/esm/modules/stream/internal/type-guards.js +24 -0
- package/dist/esm/modules/stream/pull-stream.js +107 -43
- package/dist/esm/modules/stream/shared.js +7 -4
- package/dist/esm/modules/stream/streams.browser.js +921 -836
- package/dist/esm/modules/stream/streams.js +146 -95
- package/dist/esm/modules/stream/utils.js +5 -38
- package/dist/iife/THIRD_PARTY_NOTICES.md +0 -31
- package/dist/iife/excelts.iife.js +6495 -4440
- 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.browser.d.ts +2 -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 +8 -0
- package/dist/types/modules/archive/io/archive-source.d.ts +6 -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} +38 -4
- 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/types/modules/archive/{zip-parser.d.ts → 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/stream/workbook-writer.browser.d.ts +1 -1
- package/dist/types/modules/excel/utils/ooxml-validator.d.ts +48 -0
- package/dist/types/modules/excel/xlsx/xform/drawing/ctrl-prop-xform.d.ts +1 -0
- package/dist/types/modules/excel/xlsx/xform/drawing/sp-xform.d.ts +18 -0
- package/dist/types/modules/excel/xlsx/xform/drawing/two-cell-anchor-xform.d.ts +6 -1
- package/dist/types/modules/excel/xlsx/xform/sheet/page-setup-xform.d.ts +1 -0
- package/dist/types/modules/stream/base-transform.d.ts +3 -0
- package/dist/types/modules/stream/buffered-stream.d.ts +2 -12
- package/dist/types/modules/stream/index.browser.d.ts +13 -19
- package/dist/types/modules/stream/index.d.ts +18 -41
- package/dist/types/modules/stream/internal/event-utils.d.ts +17 -0
- package/dist/types/modules/stream/internal/type-guards.d.ts +9 -0
- package/dist/types/modules/stream/pull-stream.d.ts +5 -6
- package/dist/types/modules/stream/shared.d.ts +1 -1
- package/dist/types/modules/stream/streams.browser.d.ts +32 -44
- package/dist/types/modules/stream/streams.d.ts +4 -20
- package/package.json +14 -10
- 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 -644
- 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 -666
- 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 -644
- 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/{compress.base.d.ts → compression/compress.base.d.ts} +0 -0
- /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/types/modules/archive/{compress.base.d.ts → compression/compress.base.d.ts} +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
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Uses the browser Duplex stream implementation for compatibility.
|
|
7
7
|
*/
|
|
8
8
|
import { Duplex } from "@stream";
|
|
9
|
-
import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/
|
|
9
|
+
import { type CrxHeader, type PullStreamPublicApi, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
|
|
10
10
|
export type { CrxHeader, EntryProps, EntryVars, ParseOptions, ZipEntry };
|
|
11
11
|
export type ParseStream = Duplex & {
|
|
12
12
|
promise(): Promise<void>;
|
|
@@ -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.browser.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: () => {
|
|
@@ -344,7 +535,22 @@ export function createParseClass(createInflateRawFn) {
|
|
|
344
535
|
// NOTE: We intentionally do NOT pass inflateRawSync to runParseLoop in browser.
|
|
345
536
|
// Browser's native DecompressionStream is faster than our pure-JS fallback,
|
|
346
537
|
// so we always use the streaming path for decompression in browsers.
|
|
347
|
-
|
|
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
|
|
348
554
|
// No inflateRawSync - always use streaming DecompressionStream in browser
|
|
349
555
|
);
|
|
350
556
|
this._parsingDone.catch((e) => {
|
|
@@ -356,8 +562,16 @@ export function createParseClass(createInflateRawFn) {
|
|
|
356
562
|
});
|
|
357
563
|
});
|
|
358
564
|
}
|
|
359
|
-
_handleWrite(chunk) {
|
|
565
|
+
_handleWrite(chunk, callback) {
|
|
360
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
|
+
}
|
|
361
575
|
this._wakeUp();
|
|
362
576
|
this.emit("data-available");
|
|
363
577
|
this.emit("chunk");
|
|
@@ -368,13 +582,6 @@ export function createParseClass(createInflateRawFn) {
|
|
|
368
582
|
set buffer(value) {
|
|
369
583
|
this._buffer.reset(value);
|
|
370
584
|
}
|
|
371
|
-
_maybeReleaseWriteCallback() {
|
|
372
|
-
if (typeof this.cb === "function") {
|
|
373
|
-
const callback = this.cb;
|
|
374
|
-
this.cb = undefined;
|
|
375
|
-
callback();
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
585
|
_wakeUp() {
|
|
379
586
|
if (this._pendingResolve) {
|
|
380
587
|
const resolve = this._pendingResolve;
|
|
@@ -382,6 +589,17 @@ export function createParseClass(createInflateRawFn) {
|
|
|
382
589
|
resolve();
|
|
383
590
|
}
|
|
384
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
|
+
}
|
|
385
603
|
_waitForData() {
|
|
386
604
|
return new Promise(resolve => {
|
|
387
605
|
this._pendingResolve = resolve;
|
|
@@ -395,60 +613,76 @@ export function createParseClass(createInflateRawFn) {
|
|
|
395
613
|
if (this.finished) {
|
|
396
614
|
if (this._buffer.length > 0) {
|
|
397
615
|
const data = this._buffer.read(this._buffer.length);
|
|
616
|
+
this._maybeReleaseWriteCallback();
|
|
398
617
|
return data;
|
|
399
618
|
}
|
|
400
619
|
throw new Error("FILE_ENDED");
|
|
401
620
|
}
|
|
402
621
|
await this._waitForData();
|
|
403
622
|
}
|
|
404
|
-
|
|
623
|
+
const out = this._buffer.read(length);
|
|
624
|
+
this._maybeReleaseWriteCallback();
|
|
625
|
+
return out;
|
|
405
626
|
}
|
|
406
627
|
async _pullUntilInternal(pattern, includeEof = false) {
|
|
407
628
|
const chunks = [];
|
|
408
|
-
|
|
409
|
-
const overlap = Math.max(0, pattern.length - 1);
|
|
629
|
+
const scanner = new PatternScanner(pattern);
|
|
410
630
|
while (true) {
|
|
411
|
-
const
|
|
412
|
-
const match =
|
|
631
|
+
const bufLen = this._buffer.length;
|
|
632
|
+
const match = scanner.find(this._buffer);
|
|
413
633
|
if (match !== -1) {
|
|
414
634
|
this.match = match;
|
|
415
635
|
const toRead = match + (includeEof ? pattern.length : 0);
|
|
416
636
|
if (toRead > 0) {
|
|
417
637
|
chunks.push(this._buffer.read(toRead));
|
|
638
|
+
this._maybeReleaseWriteCallback();
|
|
418
639
|
}
|
|
419
|
-
return concatUint8Arrays(chunks);
|
|
640
|
+
return chunks.length === 1 ? chunks[0] : concatUint8Arrays(chunks);
|
|
420
641
|
}
|
|
421
642
|
// No match yet. Avoid rescanning bytes that can't start a match.
|
|
422
|
-
|
|
643
|
+
scanner.onNoMatch(bufLen);
|
|
423
644
|
if (this.finished) {
|
|
424
645
|
throw new Error("FILE_ENDED");
|
|
425
646
|
}
|
|
426
647
|
const safeLen = Math.max(0, this._buffer.length - pattern.length);
|
|
427
648
|
if (safeLen > 0) {
|
|
428
649
|
chunks.push(this._buffer.read(safeLen));
|
|
429
|
-
|
|
650
|
+
scanner.onConsume(safeLen);
|
|
651
|
+
this._maybeReleaseWriteCallback();
|
|
430
652
|
}
|
|
431
653
|
await this._waitForData();
|
|
432
654
|
}
|
|
433
655
|
}
|
|
434
656
|
_streamFixedLength(length) {
|
|
435
|
-
const output = new PassThrough();
|
|
657
|
+
const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
|
|
436
658
|
let remaining = length;
|
|
437
659
|
let done = false;
|
|
660
|
+
let waitingDrain = false;
|
|
438
661
|
const pull = () => {
|
|
439
662
|
if (done) {
|
|
440
663
|
return;
|
|
441
664
|
}
|
|
665
|
+
if (waitingDrain) {
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
442
668
|
while (remaining > 0 && this._buffer.length > 0) {
|
|
443
669
|
const toRead = Math.min(remaining, this._buffer.length);
|
|
444
670
|
const chunk = this._buffer.read(toRead);
|
|
445
671
|
remaining -= toRead;
|
|
446
|
-
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
|
+
}
|
|
447
682
|
}
|
|
448
683
|
if (remaining === 0) {
|
|
449
684
|
done = true;
|
|
450
685
|
this.removeListener("data-available", pull);
|
|
451
|
-
this._maybeReleaseWriteCallback();
|
|
452
686
|
output.end();
|
|
453
687
|
}
|
|
454
688
|
else if (this.finished) {
|
|
@@ -462,42 +696,69 @@ export function createParseClass(createInflateRawFn) {
|
|
|
462
696
|
return output;
|
|
463
697
|
}
|
|
464
698
|
_streamUntilPattern(pattern, includeEof = false) {
|
|
465
|
-
const output = new PassThrough();
|
|
699
|
+
const output = new PassThrough({ highWaterMark: DEFAULT_UNZIP_STREAM_HIGH_WATER_MARK });
|
|
466
700
|
let done = false;
|
|
467
|
-
|
|
468
|
-
const
|
|
701
|
+
const patternLen = pattern.length;
|
|
702
|
+
const scanner = new PatternScanner(pattern);
|
|
703
|
+
let waitingDrain = false;
|
|
469
704
|
const pull = () => {
|
|
470
|
-
if (done) {
|
|
705
|
+
if (done || waitingDrain) {
|
|
471
706
|
return;
|
|
472
707
|
}
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
this.match = match;
|
|
477
|
-
const endIndex = includeEof ? match + pattern.length : match;
|
|
478
|
-
if (endIndex > 0) {
|
|
479
|
-
output.write(this._buffer.read(endIndex));
|
|
708
|
+
while (true) {
|
|
709
|
+
if (this._buffer.length <= 0) {
|
|
710
|
+
break;
|
|
480
711
|
}
|
|
481
|
-
|
|
482
|
-
this.
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
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);
|
|
500
753
|
this._maybeReleaseWriteCallback();
|
|
754
|
+
if (!ok) {
|
|
755
|
+
waitingDrain = true;
|
|
756
|
+
output.once("drain", () => {
|
|
757
|
+
waitingDrain = false;
|
|
758
|
+
pull();
|
|
759
|
+
});
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
501
762
|
}
|
|
502
763
|
};
|
|
503
764
|
this.on("data-available", pull);
|
|
@@ -520,11 +781,7 @@ export function createParseClass(createInflateRawFn) {
|
|
|
520
781
|
return Promise.reject(new Error("FILE_ENDED"));
|
|
521
782
|
}
|
|
522
783
|
if (this._buffer.length >= eof) {
|
|
523
|
-
|
|
524
|
-
if (this._buffer.length === 0) {
|
|
525
|
-
this._maybeReleaseWriteCallback();
|
|
526
|
-
}
|
|
527
|
-
return Promise.resolve(data);
|
|
784
|
+
return Promise.resolve(this._buffer.read(eof));
|
|
528
785
|
}
|
|
529
786
|
return this._pullInternal(eof);
|
|
530
787
|
}
|
|
@@ -540,14 +797,18 @@ export function createParseClass(createInflateRawFn) {
|
|
|
540
797
|
_streamUntilDataDescriptor() {
|
|
541
798
|
return streamUntilValidatedDataDescriptor({
|
|
542
799
|
source: {
|
|
543
|
-
getView: () => this._buffer.view(),
|
|
544
800
|
getLength: () => this._buffer.length,
|
|
545
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),
|
|
546
806
|
isFinished: () => this.finished,
|
|
547
807
|
onDataAvailable: (cb) => {
|
|
548
808
|
this.on("data-available", cb);
|
|
549
809
|
return () => this.removeListener("data-available", cb);
|
|
550
|
-
}
|
|
810
|
+
},
|
|
811
|
+
maybeReleaseWriteCallback: () => this._maybeReleaseWriteCallback()
|
|
551
812
|
},
|
|
552
813
|
dataDescriptorSignature
|
|
553
814
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Duplex } from "@stream";
|
|
2
|
-
import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/
|
|
3
|
-
export type { CrxHeader } from "@archive/
|
|
2
|
+
import { type PullStreamPublicApi, type CrxHeader, type EntryProps, type EntryVars, type InflateFactory, type ParseOptions, type ZipEntry } from "@archive/unzip/stream.base";
|
|
3
|
+
export type { CrxHeader } from "@archive/unzip/stream.base";
|
|
4
4
|
export type { EntryProps, EntryVars, ParseOptions, ZipEntry };
|
|
5
5
|
export type ParseStream = Duplex & {
|
|
6
6
|
promise(): Promise<void>;
|