neozipkit 1.0.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/NEOZIP_APPNOTE.md +625 -0
  2. package/README.md +44 -11
  3. package/WHATS_NEW.md +153 -10
  4. package/dist/browser/ZipkitBrowser.d.ts.map +1 -1
  5. package/dist/browser/ZipkitBrowser.js +4 -6
  6. package/dist/browser/ZipkitBrowser.js.map +1 -1
  7. package/dist/browser/zstd-browser-shim.d.ts +17 -9
  8. package/dist/browser/zstd-browser-shim.d.ts.map +1 -1
  9. package/dist/browser/zstd-browser-shim.js +99 -21
  10. package/dist/browser/zstd-browser-shim.js.map +1 -1
  11. package/dist/browser-esm/index.js +6534 -1275
  12. package/dist/browser-esm/index.js.map +4 -4
  13. package/dist/browser-umd/index.js +6534 -1275
  14. package/dist/browser-umd/index.js.map +4 -4
  15. package/dist/browser-umd/index.min.js +6 -3
  16. package/dist/core/ZipCompress.d.ts +6 -0
  17. package/dist/core/ZipCompress.d.ts.map +1 -1
  18. package/dist/core/ZipCompress.js +12 -11
  19. package/dist/core/ZipCompress.js.map +1 -1
  20. package/dist/core/ZipCopy.d.ts.map +1 -1
  21. package/dist/core/ZipCopy.js +33 -25
  22. package/dist/core/ZipCopy.js.map +1 -1
  23. package/dist/core/ZipDecompress.d.ts.map +1 -1
  24. package/dist/core/ZipDecompress.js +13 -8
  25. package/dist/core/ZipDecompress.js.map +1 -1
  26. package/dist/core/ZipEntry.d.ts +24 -0
  27. package/dist/core/ZipEntry.d.ts.map +1 -1
  28. package/dist/core/ZipEntry.js +146 -14
  29. package/dist/core/ZipEntry.js.map +1 -1
  30. package/dist/core/Zipkit.d.ts +43 -11
  31. package/dist/core/Zipkit.d.ts.map +1 -1
  32. package/dist/core/Zipkit.js +132 -82
  33. package/dist/core/Zipkit.js.map +1 -1
  34. package/dist/core/components/HashCalculator.d.ts +22 -1
  35. package/dist/core/components/HashCalculator.d.ts.map +1 -1
  36. package/dist/core/components/HashCalculator.js +49 -6
  37. package/dist/core/components/HashCalculator.js.map +1 -1
  38. package/dist/core/components/Util.d.ts +3 -4
  39. package/dist/core/components/Util.d.ts.map +1 -1
  40. package/dist/core/components/Util.js +10 -8
  41. package/dist/core/components/Util.js.map +1 -1
  42. package/dist/core/constants/Headers.d.ts +2 -3
  43. package/dist/core/constants/Headers.d.ts.map +1 -1
  44. package/dist/core/constants/Headers.js +15 -5
  45. package/dist/core/constants/Headers.js.map +1 -1
  46. package/dist/core/constants/MetaPaths.d.ts +38 -0
  47. package/dist/core/constants/MetaPaths.d.ts.map +1 -0
  48. package/dist/core/constants/MetaPaths.js +79 -0
  49. package/dist/core/constants/MetaPaths.js.map +1 -0
  50. package/dist/core/index.d.ts +5 -0
  51. package/dist/core/index.d.ts.map +1 -1
  52. package/dist/core/index.js +18 -1
  53. package/dist/core/index.js.map +1 -1
  54. package/dist/core/inflateZipPayload.d.ts +6 -0
  55. package/dist/core/inflateZipPayload.d.ts.map +1 -0
  56. package/dist/core/inflateZipPayload.js +28 -0
  57. package/dist/core/inflateZipPayload.js.map +1 -0
  58. package/dist/core/merkle/MerkleRoot.d.ts +109 -0
  59. package/dist/core/merkle/MerkleRoot.d.ts.map +1 -0
  60. package/dist/core/merkle/MerkleRoot.js +275 -0
  61. package/dist/core/merkle/MerkleRoot.js.map +1 -0
  62. package/dist/core/origin/OriginExtra.d.ts +43 -0
  63. package/dist/core/origin/OriginExtra.d.ts.map +1 -0
  64. package/dist/core/origin/OriginExtra.js +187 -0
  65. package/dist/core/origin/OriginExtra.js.map +1 -0
  66. package/dist/core/version.js +1 -1
  67. package/dist/core/zip64/Zip64.d.ts +138 -0
  68. package/dist/core/zip64/Zip64.d.ts.map +1 -0
  69. package/dist/core/zip64/Zip64.js +353 -0
  70. package/dist/core/zip64/Zip64.js.map +1 -0
  71. package/dist/node/ZipCompressNode.d.ts.map +1 -1
  72. package/dist/node/ZipCompressNode.js +40 -49
  73. package/dist/node/ZipCompressNode.js.map +1 -1
  74. package/dist/node/ZipCopyNode.d.ts.map +1 -1
  75. package/dist/node/ZipCopyNode.js +26 -26
  76. package/dist/node/ZipCopyNode.js.map +1 -1
  77. package/dist/node/ZipDecompressNode.d.ts.map +1 -1
  78. package/dist/node/ZipDecompressNode.js +21 -3
  79. package/dist/node/ZipDecompressNode.js.map +1 -1
  80. package/dist/node/ZipkitNode.d.ts +23 -1
  81. package/dist/node/ZipkitNode.d.ts.map +1 -1
  82. package/dist/node/ZipkitNode.js +158 -57
  83. package/dist/node/ZipkitNode.js.map +1 -1
  84. package/dist/node/ZstdNode.d.ts +14 -4
  85. package/dist/node/ZstdNode.d.ts.map +1 -1
  86. package/dist/node/ZstdNode.js +28 -4
  87. package/dist/node/ZstdNode.js.map +1 -1
  88. package/dist/node/buildZipBuffer.d.ts +49 -0
  89. package/dist/node/buildZipBuffer.d.ts.map +1 -0
  90. package/dist/node/buildZipBuffer.js +146 -0
  91. package/dist/node/buildZipBuffer.js.map +1 -0
  92. package/dist/node/index.d.ts +3 -0
  93. package/dist/node/index.d.ts.map +1 -1
  94. package/dist/node/index.js +6 -1
  95. package/dist/node/index.js.map +1 -1
  96. package/dist/node/inflateZipPayload.d.ts +5 -0
  97. package/dist/node/inflateZipPayload.d.ts.map +1 -0
  98. package/dist/node/inflateZipPayload.js +21 -0
  99. package/dist/node/inflateZipPayload.js.map +1 -0
  100. package/dist/types/index.js +2 -2
  101. package/node-esm.mjs +32 -0
  102. package/package.json +13 -6
  103. package/src/browser/ZipkitBrowser.ts +4 -6
  104. package/src/browser/zstd-browser-shim.ts +110 -28
  105. package/src/core/ZipCompress.ts +20 -13
  106. package/src/core/ZipCopy.ts +56 -27
  107. package/src/core/ZipDecompress.ts +14 -8
  108. package/src/core/ZipEntry.ts +200 -14
  109. package/src/core/Zipkit.ts +189 -98
  110. package/src/core/components/HashCalculator.ts +58 -6
  111. package/src/core/components/Util.ts +16 -7
  112. package/src/core/constants/Headers.ts +15 -4
  113. package/src/core/constants/MetaPaths.ts +86 -0
  114. package/src/core/index.ts +17 -0
  115. package/src/core/inflateZipPayload.ts +27 -0
  116. package/src/core/merkle/MerkleRoot.ts +312 -0
  117. package/src/core/origin/OriginExtra.ts +209 -0
  118. package/src/core/version.ts +1 -1
  119. package/src/core/zip64/Zip64.ts +473 -0
  120. package/src/node/ZipCompressNode.ts +40 -49
  121. package/src/node/ZipCopyNode.ts +31 -29
  122. package/src/node/ZipDecompressNode.ts +16 -3
  123. package/src/node/ZipkitNode.ts +203 -72
  124. package/src/node/ZstdNode.ts +33 -8
  125. package/src/node/buildZipBuffer.ts +221 -0
  126. package/src/node/index.ts +7 -0
  127. package/src/node/inflateZipPayload.ts +19 -0
  128. package/src/types/index.ts +2 -2
package/README.md CHANGED
@@ -4,15 +4,18 @@ Advanced ZIP file creation, compression, and encryption library for Node.js and
4
4
 
5
5
  **Scope of this package:** NeoZipKit focuses solely on creating and manipulating ZIP files (compression, encryption, extraction). All blockchain-related functionality—timestamping, NFT tokenization, verification, wallet integration, and smart contracts—lives in the sibling **[neozip-blockchain](../neozip-blockchain/)** package within this monorepo. Use that package when you need to link ZIPs to the blockchain.
6
6
 
7
- > **Stable 1.0:** NeoZipKit **1.0.2** is the first non-beta release. Please report issues on [GitHub](https://github.com/NeoWareInc/neozipkit/issues). This package is part of the [neozipkit monorepo](../../README.md).
7
+ **Format note:** See **[NEOZIP_APPNOTE.md](./NEOZIP_APPNOTE.md)** for the NeoZip ZIP profile (compression methods, Extra Field `0x014E`, `META-INF` integrity and blockchain sidecars). Kit backlog: **[docs/FUTURE_ENHANCEMENTS.md](docs/FUTURE_ENHANCEMENTS.md)**.
8
+
9
+ > **Stable 1.5:** NeoZipKit **1.5.0** (Zip64, Extra Field `0x014F`, browser/buffer zstd). See [NEOZIP_APPNOTE.md](./NEOZIP_APPNOTE.md) and [WHATS_NEW.md](WHATS_NEW.md). Please report issues on [GitHub](https://github.com/NeoWareInc/neozipkit/issues).
8
10
 
9
11
 
10
12
 
11
13
  ## Features
12
14
 
13
- - **Advanced ZIP compression** with support for multiple compression methods (Deflate, ZStandard, Stored)
15
+ - **Advanced ZIP compression** with support for multiple compression methods (Deflate, ZStandard, Stored), including zstd on in-memory `Buffer` / `ArrayBuffer` and in the browser via `CompressionStream`
14
16
  - **Streaming compression** for memory-efficient processing of large files
15
- - **Encryption** with ZIP (Legacy), **AES-256** (WinZip-compatible AE-1/AE-2), and **NeoEncrypt** (NEO AES-256 via extra field `0x024E`, standard compression method in headers); create and extract in Node and browser
17
+ - **Zip64 (APPNOTE Version 1)** for archives past classic ZIP limits: Node streaming for member sizes / offsets ≥ 4 GiB; buffer APIs support Zip64 for entry counts > 65 535 and can **read** Zip64 metadata when the archive already fits in memory. Use `forceZip64: true` to emit Zip64 for small test archives (`pnpm test:zip64`).
18
+ - **Encryption** with ZIP (Legacy), **NeoEncrypt** (default AES-256 via Extra Field `0x024E`), and **WinZip AES-256** (AE-1/AE-2, method 99 — write with `encryptionMethod: 'aes256'`, always readable on extract); create and extract in Node and browser
16
19
  - **Hash-based verification** with Merkle tree support (CRC-32, SHA-256)
17
20
  - **Real-time progress tracking** for long-running operations
18
21
  - **Browser and Node.js compatibility** with clean platform separation
@@ -102,15 +105,44 @@ All blockchain code lives in the sibling **[neozip-blockchain](../neozip-blockch
102
105
  | --------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
103
106
  | `ZipkitNode` create / extract / list | File streaming (`loadZipFile`, `writeZipEntry`, `extractToFile`, …) |
104
107
  | Core `Zipkit.loadZip(Buffer)` / browser | Buffer APIs kept for browser and small in-process buffers |
105
- | Zstd (method 93) | Node native `zlib` Transform streams only (no WASM). Requires Node ≥ 22.15 |
108
+ | Zip64 sizes / offsets ≥ 4 GiB | **Node streaming only** (`ZipkitNode` / `ZipCopyNode`). Buffer builders refuse with a clear error |
109
+ | Zip64 entry count > 65 535 | Node **or** buffer/browser when the whole archive still fits in memory |
110
+ | Zstd (method 93) | Node: native `zlib` streams and buffer compress/inflate (Node ≥ 22.15). Browser: `CompressionStream` zstd on `ArrayBuffer` (no WASM). Sync zstd is Node-only |
106
111
  | Legacy WASM zstd archives | Detect with `detectLegacyWasmZstd` / `ZipkitNode.detectLegacyZstdEntries`; extract truncates +18 zero padding |
107
112
 
108
113
 
109
114
  See also: [docs/ZSTD_USAGE.md](docs/ZSTD_USAGE.md) and the Rust crate notes in `neozip-rust` (`crates/neozipkit/src/limits.rs`).
110
115
 
111
- ## Publishing (npm)
116
+ ## Zip64 (large archives)
117
+
118
+ Classic ZIP fields are **16-bit** entry counts and **32-bit** sizes/offsets. Past those limits the kit emits APPNOTE **Zip64 Version 1** automatically (no opt-in flag). Spanned/split multi-disk archives are not supported.
119
+
120
+ | Limit exceeded | Threshold | Use |
121
+ | -------------- | --------- | --- |
122
+ | Member uncompressed or compressed size | ≥ 4 GiB (`> 0xFFFFFFFF`) | `ZipkitNode` file create / extract |
123
+ | Local-header or central-directory offset | ≥ 4 GiB | `ZipkitNode` / `ZipCopyNode` |
124
+ | Number of members | > 65 535 | Node **or** in-memory (`buildZipBufferSync` / browser) if RAM allows |
125
+ | Listing / reading Zip64 metadata | — | Any surface that can open the archive; Extra Field `0x0001` and Zip64 EOCD are parsed |
126
+
127
+ **Wire details (automatic):** Extra Field `0x0001` on overflowing members, Zip64 end-of-central-directory + locator before the classic EOCD, classic fields set to `0xFFFF` / `0xFFFFFFFF` sentinels, version needed to extract **45**.
128
+
129
+ ```typescript
130
+ import { ZipkitNode } from 'neozipkit/node';
131
+
132
+ // Large members: stream to/from disk — do not use buildZipBufferSync for ≥ 4 GiB payloads
133
+ const zip = new ZipkitNode();
134
+ await zip.createZipFromFiles(['huge-video.mkv'], 'archive.nzip');
135
+ await zip.loadZipFile('archive.nzip');
136
+ const entries = zip.getDirectory();
137
+ // entries[0].uncompressedSize / compressedSize / localHdrOffset hold full 64-bit values
138
+ await zip.closeFile();
139
+ ```
140
+
141
+ Do **not** call `buildZipBufferSync` or browser Blob create when a member size or archive offset would need Zip64 for ≥ 4 GiB — that path throws and points you at `ZipkitNode`. Prefer streaming extract for huge members rather than `extractToBuffer`.
142
+
143
+ Release notes: [WHATS_NEW.md](WHATS_NEW.md). Spec: PKWARE [docs/APPNOTE.txt](docs/APPNOTE.txt) §§4.3.14–4.3.16, 4.5.3.
112
144
 
113
- The published tarball includes **`dist/`**, **`src/`** (for `neozipkit/src` conditional exports), **[`README.md`](README.md)**, and **[`WHATS_NEW.md`](WHATS_NEW.md)**. **`examples/`** and other repo-only folders are excluded—use **`pnpm publish:dry-run`** (`npm publish --dry-run`) to preview the file list.
145
+ The published tarball includes **`dist/`**, **`src/`** (for `neozipkit/src` conditional exports), **`node-esm.mjs`** (the ESM entry for `neozipkit/node`), **[`README.md`](README.md)**, and **[`WHATS_NEW.md`](WHATS_NEW.md)**. **`examples/`** and other repo-only folders are excluded—use **`pnpm publish:dry-run`** (`npm publish --dry-run`) to preview the file list.
114
146
 
115
147
  ## Development
116
148
 
@@ -164,21 +196,22 @@ As of **v0.6.1**, `loadZipFile()` automatically **closes any prior read handle**
164
196
 
165
197
  - **STORED (0)** – No compression
166
198
  - **DEFLATED (8)** – Deflate (default)
167
- - **ZSTD (93)** – Zstandard
199
+ - **ZSTD (93)** – Zstandard. Node uses native `zlib` (streams and `Buffer` / `ArrayBuffer`). The browser bundle uses `CompressionStream` zstd. `ZipkitNode.writeMembersSync` / `buildZipBufferSync` default to raw zstd level 7. Caller extra blocks such as ZipWiki `0x014F` go on `ZipEntry.additionalExtra` and are written beside `0x014E`.
168
200
 
169
201
 
170
202
 
171
203
  ### Encryption
172
204
 
173
- - **ZIP (Legacy)** – Classic ZIP encryption; use `password` in options (no `encryptionMethod`).
174
- - **AES-256** – WinZip-compatible (AE-1/AE-2); use `password` and `encryptionMethod: 'aes256'` in compress options. Create and extract supported in Node and browser. See [WHATS_NEW.md](WHATS_NEW.md#060-2025-01-27) for details. For on-disk layout (headers, extra field 0x9901), AE-1 vs AE-2, and how this differs from ZipCrypto and PKWARE strong encryption, see [docs/WINZIP_AES_FORMAT.md](docs/WINZIP_AES_FORMAT.md).
175
- - **NeoEncrypt (NEO AES-256)** – NeoZip-specific: use `password` and `encryptionMethod: 'neo-aes256'`. The LO/CEN compression method stays a normal ZIP code (e.g. deflate, zstd); encryption is indicated by the encrypted flag plus extra field `0x024E`. Ciphertext layout matches the WinZip AES stream (PBKDF2, CTR, HMAC). Specification: [docs/NEO_CRYPTO_FORMAT.md](docs/NEO_CRYPTO_FORMAT.md).
205
+ - **NeoEncrypt (default AES-256)** – When you pass a `password` and omit `encryptionMethod` (or set `'neo-aes256'`), NeoZipKit writes NeoEncrypt: standard compression method in the header + Extra Field `0x024E`. Spec: [docs/NEO_CRYPTO_FORMAT.md](docs/NEO_CRYPTO_FORMAT.md).
206
+ **Note:** kit API name `'aes256'` still means **WinZip write**; product CLI `--aes256` / `-e` means **NeoEncrypt**.
207
+ - **WinZip AES-256 (interop)** – Use `password` and `encryptionMethod: 'aes256'` to **write** AE-1/AE-2 (method 99 + Extra Field `0x9901`). Extract always recognizes WinZip AES when present. Layout: [docs/WINZIP_AES_FORMAT.md](docs/WINZIP_AES_FORMAT.md).
208
+ - **ZIP (Legacy / ZipCrypto)** – Classic ZIP encryption; use `password` with `encryptionMethod: 'zipcrypto'`.
176
209
 
177
210
 
178
211
 
179
212
  ## What’s new
180
213
 
181
- See [WHATS_NEW.md](WHATS_NEW.md) for release notes.
214
+ See [WHATS_NEW.md](WHATS_NEW.md) for release notes. The unreleased section covers Extra Field `0x014F`, buffer and browser zstd, and `writeMembersSync`.
182
215
 
183
216
  ## Security
184
217
 
package/WHATS_NEW.md CHANGED
@@ -2,8 +2,155 @@
2
2
 
3
3
  Release notes for people who install and use **`neozipkit`** from npm. For blockchain timestamping and NFTs, see the sibling package [`neozip-blockchain`](https://www.npmjs.com/package/neozip-blockchain).
4
4
 
5
+ ## 1.5.0 (2026-10-25)
6
+
7
+ Released with sibling **`neozip-blockchain@1.5.0`**.
8
+
9
+ ### forceZip64 (testing Zip64 without huge files)
10
+
11
+ `CompressOptions.forceZip64` (and `buildZipBufferSync` / `writeZipFileSync` `{ forceZip64: true }`) emit APPNOTE Zip64 Version 1 even when sizes and offsets fit classic fields — Extra Field `0x0001`, version needed **45**, Zip64 EOCD + locator, classic CD-offset sentinel (Info-ZIP `-fz` style). Use it to exercise list/integrity paths with the small files under `examples/test-files/`.
12
+
13
+ ```ts
14
+ await zip.createZipFromFiles(files, 'out-zip64.zip', {
15
+ forceZip64: true,
16
+ useZstd: false,
17
+ });
18
+ ```
19
+
20
+ Smoke script (create → list → `testOnly`): `pnpm example:create-zip64` or `pnpm test:zip64`.
21
+
22
+ ### Zip64 (APPNOTE Version 1)
23
+
24
+ NeoZipKit can create and open archives past classic ZIP limits: **more than 65 535 members**, or **sizes / offsets ≥ 4 GiB**. Zip64 Version 1 is emitted automatically when a classic field would overflow. Spanned (multi-disk) Zip64 is still out of scope.
25
+
26
+ **What you should use**
27
+
28
+ | Goal | API |
29
+ | ---- | --- |
30
+ | Write or copy members ≥ 4 GiB, or archives whose CD offset ≥ 4 GiB | **`ZipkitNode`** / **`ZipCopyNode`** (file streaming) |
31
+ | Many small members (> 65 535) that still fit in RAM | Node **or** `buildZipBufferSync` / browser |
32
+ | Open a Zip64 archive already in a `Buffer` | `Zipkit.loadZip` — lists and parses sizes correctly; avoid loading multi-GiB members into memory |
33
+ | Force Zip64 for small test archives | `createZipFromFiles(..., { forceZip64: true })` |
34
+
35
+ **On the wire**
36
+
37
+ - Per-member Extra Field **`0x0001`** (only overflowing fields, APPNOTE order); local Zip64 extras always carry both uncompressed and compressed sizes
38
+ - **Zip64 EOCD** (`0x06064b50`) + **locator** (`0x07064b50`) before the classic EOCD
39
+ - Classic EOCD / header fields use `0xFFFF` / `0xFFFFFFFF` sentinels where they overflow
40
+ - Version needed to extract **45** on Zip64 members
41
+
42
+ **Read path:** any classic EOCD sentinel triggers locator → Zip64 EOCD; `ZipEntry.readZipEntry` merges `0x0001` into `uncompressedSize`, `compressedSize`, and `localHdrOffset`. Copy paths use 8-byte data-descriptor sizes when `usesZip64Extra` is set.
43
+
44
+ **Buffer / browser policy:** size or offset Zip64 that would build a multi-GiB `Buffer` / Blob throws a clear error directing you to the Node file API. Entry-count Zip64 is allowed when the archive remains memory-feasible.
45
+
46
+ Helpers: `src/core/zip64/Zip64.ts` (also exported from the package). Tests: `tests/unit/core/zip64/Zip64.test.ts`.
47
+
48
+ ### Caller extra fields, including ZipWiki `0x014F`
49
+
50
+ `ZipEntry.createLocalHdr()` and `centralDirEntry()` write caller-supplied extra-field records beside **`0x014E`**, WinZip AES, and NeoEncrypt. Pass a buffer of complete records (header id + size + payload) on `entry.additionalExtra`.
51
+
52
+ - **`0x014F`** is ZipWiki’s origin locator (URI, size, mtime, CRC-32 or SHA-256). The id is `HDR_ID.ORIGIN`. Helpers: `makeOriginExtra` / `parseOriginFromExtra` / `parseOriginFromEntry` (`src/core/origin/OriginExtra.ts`).
53
+ - Unknown extra ids survive a read. They are collected into `additionalExtra` so a later header rebuild does not drop them.
54
+ - `ZipCopyNode` copies local bytes as-is and copies `additionalExtra` onto the rebuilt central-directory header, so an origin tag survives a raw copy.
55
+ - Set `entry.emitUnicodePath = false` when the caller extra blob must be the only extra (ZipWiki pack does this). The default remains the Info-ZIP Unicode Path extra when the name needs it.
56
+ - Method **93** records version needed to extract **6.3** (63).
57
+
58
+ ```ts
59
+ import { makeOriginExtra, parseOriginFromEntry, buildZipBufferSync } from 'neozipkit/node';
60
+
61
+ const originExtra = makeOriginExtra({
62
+ uri: 'https://example.org/docs/sample.pdf',
63
+ size: 1234,
64
+ });
65
+ const buf = buildZipBufferSync([
66
+ { name: 'wiki/parsed/sample.pdf.md', data: notes, method: 0, additionalExtra: originExtra },
67
+ ]);
68
+ // After loadZip / loadZipFile:
69
+ const loc = parseOriginFromEntry(entries[0]);
70
+ console.log(loc?.uri);
71
+ ```
72
+
73
+ Tests: `tests/unit/core/origin/OriginExtra.test.ts`.
74
+
75
+ ### Zstd on in-memory buffers, including the browser
76
+
77
+ Method 93 is no longer only a Node file stream.
78
+
79
+ - **Node:** `ZstdNode.compress`, `decompress`, `compressSync`, and `decompressSync` accept a `Buffer`, `Uint8Array`, or `ArrayBuffer`. `compressSyncAtLevel(data, zstdLevel)` uses a raw zlib zstd level (1–19). ZipWiki pack uses level **7** on that scale. The 1–9 kit scale (`mapCompressionLevel`, about `level * 2.1`) is unchanged for `createZipFromFiles` / `writeZipEntry`.
80
+ - **Browser:** the bundle no longer throws from the zstd stub. Compress and inflate use `CompressionStream` / `DecompressionStream` (`'zstd'`) on an `ArrayBuffer`. There is still no WASM codec. Sync `compressSync` / `decompressSync` are Node-only; the browser API is async. Browsers without `CompressionStream` zstd (and Node itself) throw a clear error. Deflate and store are unchanged.
81
+ - `inflateZipPayload(method, bytes)` (browser and core) and `inflateZipPayloadSync(method, buffer)` (`neozipkit/node`) inflate store (0), raw deflate (8), and zstd (93).
82
+
83
+ ### In-memory and streaming writer
84
+
85
+ `ZipkitNode.writeMembersSync(path, members)` streams local headers, payloads, the central directory, and the EOCD to a file. `buildZipBufferSync(members)` builds the same archive as one `Buffer` for tests and small rewrites. `writeZipFileSync` is the same stream without the class.
86
+
87
+ - Default method is zstd **93** at raw level **7**. Pass `method: 0 | 8 | 93`. Empty payloads and payloads that do not shrink are stored.
88
+ - `useSHA256: true` writes Extra Field **`0x014E`**. `additionalExtra` is the caller block (`0x014F`). NeoEncrypt is not turned on.
89
+ - `precompressed` copies an existing method, compressed bytes, CRC-32, and extra blob without recompressing.
90
+
91
+ ```ts
92
+ import { ZipkitNode } from 'neozipkit/node';
93
+
94
+ const zip = new ZipkitNode();
95
+ zip.writeMembersSync('notes.zipwiki', [
96
+ {
97
+ name: 'wiki/parsed/notes.txt.md',
98
+ data: Buffer.from('# Notes\n'),
99
+ method: 93,
100
+ level: 7,
101
+ additionalExtra: originExtra, // complete 0x014F record
102
+ },
103
+ ]);
104
+ ```
105
+
106
+ ### Merkle v1 on CRC-only archives
107
+
108
+ `getMerkleRootAsync()` (v1) now captures `merkleLeafV1` while `testEntry` checks CRC-32, not only when Extra Field `0x014E` is present. v0 is unchanged: bare `0x014E` digests for older archives.
109
+
110
+ ### ESM import of `neozipkit/node`
111
+
112
+ The compiled kit is CommonJS. The package `import` condition is `node-esm.mjs`, so named imports (`ZipkitNode`, `buildZipBufferSync`, `ZipCopyNode`, Merkle helpers) work from ESM. `require('neozipkit/node')` still loads `dist/node/index.js`. `minimatch` is a runtime dependency of `ZipkitNode`.
113
+
114
+ ---
115
+
116
+ ## 1.0.5 (2026-08-14)
117
+
118
+ ### NeoZip Application Note + APPNOTE §6 Merkle (v0 / v1)
119
+
120
+ Ships **[NEOZIP_APPNOTE.md](./NEOZIP_APPNOTE.md)** in the npm package (also linked from the README). Aligns the kit with the profile’s **wire foundations** and **§6 Merkle** algorithms (optional AI-aware `META-INF/manifest.json` is still forthcoming).
121
+
122
+ **Foundations:**
123
+
124
+ - Extra Field **`0x014E`** — per-entry SHA-256 of uncompressed payload (when `useSHA256: true`)
125
+ - Zstd method **93** when you opt in with `useZstd: true` (Node ≥ 22.15; Deflate remains the library default)
126
+ - **ASCII case-insensitive** discovery of reserved `META-INF/` paths (`TOKEN.NZIP`, `TIMESTAMP.NZIP`, `TS-SUBMIT.NZIP`, OTS twins, `manifest.json`)
127
+ - Merkle leaves exclude all **`META-INF/**`** entries
128
+
129
+ **Merkle root (APPNOTE §6):**
130
+
131
+ | Algorithm | Leaves | Odd node | Domain separation |
132
+ | :---- | :---- | :---- | :---- |
133
+ | **v1** (default, new archives) | `SHA-256(0x00 ‖ payload)` | Promote unhashed | `0x00` leaf / `0x01` parent |
134
+ | **v0** (legacy verify) | bare `0x014E` digests | Duplicate last (Bitcoin-style) | None |
135
+
136
+ **API:**
137
+
138
+ - **`getMerkleRootAsync()`** — preferred for **v1**: uses stream-captured `merkleLeafV1` when available, otherwise extracts content (buffer mode) or Node streaming `testEntry` (`ZipkitNode`)
139
+ - **`getMerkleRoot({ algorithm: 'v0' })`** — digests-only legacy root for old on-chain bindings
140
+ - **`getMerkleRoot()`** — v1 when leaves were already captured during create/hash; otherwise `null` (use async)
141
+ - Pure helpers / **`Zipkit.merkleRootFromEntries(...)`**: path normalize (NFC, `/`), path-ordered leaves, optional `merkleLeafV1`, `matchMerkleRoot` (§6.4-style v1→v0 fallback)
142
+
143
+ Leaves no longer sort by hash value or reorder parent pairs. During create/extract with `useSHA256`, **`HashCalculator`** computes bare digests and domain-separated **v1** leaves in the same streaming pass (`finalizeMerkleLeafV1` / entry `merkleLeafV1`).
144
+
145
+ **Also:** NeoEncrypt (`0x024E` + real compression method) remains the default confidential write path; WinZip AES (method **99** + **`0x9901`**) is recognized for interop (APPNOTE §4.2). TypeScript 6: removed deprecated `baseUrl` from the package tsconfig.
146
+
147
+ Helpers: `findReservedMetaEntry`, `isMetaInfPath`, `isReservedMetaPath`, `asciiPathEqualsIgnoreCase`.
148
+
149
+ ---
150
+
5
151
  ## 1.0.2 (2026-07-28)
6
152
 
153
+
7
154
  ### First stable release
8
155
 
9
156
  **1.0.2** is the first non-beta release. From here on, NeoZipKit follows [Semantic Versioning](https://semver.org/): breaking API changes bump the major version.
@@ -77,7 +224,7 @@ Full **WinZip-compatible AES-256 (AE-1/AE-2)** support, in addition to legacy ZI
77
224
  - Create and extract encrypted ZIPs in **Node and the browser**.
78
225
  - Interop with WinZip, 7-Zip, The Unarchiver (`unar`/`lsar`), and other AE-1/AE-2 tools.
79
226
 
80
- **Create:**
227
+ **Create (NeoEncrypt — default when only `password` is set):**
81
228
 
82
229
  ```ts
83
230
  const zip = new ZipkitNode();
@@ -86,28 +233,24 @@ await zip.createZipFromFiles(
86
233
  'secure.zip',
87
234
  {
88
235
  password: 'YourStrongPassword',
89
- encryptionMethod: 'aes256',
236
+ // encryptionMethod: 'neo-aes256', // default when password is set
90
237
  level: 6,
91
238
  }
92
239
  );
93
240
  ```
94
241
 
95
- **Extract:**
242
+ **Create (explicit WinZip AES write):** pass `encryptionMethod: 'aes256'` (method 99 + `0x9901`).
96
243
 
97
- ```ts
98
- await zip.extractZipFile('secure.zip', './out', {
99
- password: 'YourStrongPassword',
100
- });
101
- ```
244
+ **Extract:** pass the same password; NeoZipKit auto-detects NeoEncrypt (`0x024E`), WinZip AES (method 99), or ZipCrypto.
102
245
 
103
- **How it works (summary):** PBKDF2-HMAC-SHA1 (1000 iterations), AES-256-CTR (WinZip little-endian counter), HMAC-SHA1 over ciphertext (10-byte auth code per entry).
246
+ **How it works (summary):** PBKDF2-HMAC-SHA1 (1000 iterations), AES-256-CTR (WinZip little-endian counter), HMAC-SHA1 over ciphertext (10-byte auth code per entry). NeoEncrypt and WinZip AES-256 share that ciphertext layout; headers differ (`0x024E` + real cmp method vs method 99 + `0x9901`).
104
247
 
105
248
  Also in this release:
106
249
 
107
250
  - Encryption bit set correctly on all encrypted local headers (including the last entry).
108
251
  - Copy/append helpers for building archives by copying entries then finalizing the central directory.
109
252
 
110
- **NeoEncrypt** (NeoZip-specific AES via extra field `0x024E`, normal compression method in headers) is available with `encryptionMethod: 'neo-aes256'`. See the package README for details.
253
+ **Naming note:** kit API `'aes256'` = WinZip **write**; product CLI `--aes256` / `-e` = **NeoEncrypt**. See [NEOZIP_APPNOTE.md](NEOZIP_APPNOTE.md) §4.2.
111
254
 
112
255
  ---
113
256
 
@@ -1 +1 @@
1
- {"version":3,"file":"ZipkitBrowser.d.ts","sourceRoot":"","sources":["../../src/browser/ZipkitBrowser.ts"],"names":[],"mappings":"AAKA,OAAO,MAAM,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAExC,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,MAAM,EAAS,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAY,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAMxD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;;IAezC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IAyCzD,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAetC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCzF,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAgB3E,aAAa,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAwGnG;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAUhB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBrE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAS9E"}
1
+ {"version":3,"file":"ZipkitBrowser.d.ts","sourceRoot":"","sources":["../../src/browser/ZipkitBrowser.ts"],"names":[],"mappings":"AAKA,OAAO,MAAM,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,QAAQ,MAAM,kBAAkB,CAAC;AAExC,OAAO,MAAM,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,OAAO,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAE,MAAM,EAAS,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAY,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAIzC,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAMxD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,MAAM;;IAezC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IAyCzD,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,QAAQ;IAetC,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC;IAUzC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC;IAqCzF,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAgB3E,aAAa,CAAC,UAAU,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAwGnG;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAQhB,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAkBrE,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAS9E"}
@@ -51,7 +51,7 @@ const Errors_1 = __importDefault(require("../core/constants/Errors"));
51
51
  exports.Errors = Errors_1.default;
52
52
  const Headers = __importStar(require("../core/constants/Headers"));
53
53
  exports.Headers = Headers;
54
- const Headers_1 = require("../core/constants/Headers");
54
+ const MetaPaths_1 = require("../core/constants/MetaPaths");
55
55
  const ZipCrypto_1 = require("../core/encryption/ZipCrypto");
56
56
  Object.defineProperty(exports, "sha256", { enumerable: true, get: function () { return ZipCrypto_1.sha256; } });
57
57
  const Util_1 = require("../core/components/Util");
@@ -187,7 +187,7 @@ class ZipkitBrowser extends core_1.default {
187
187
  for (const entry of zipEntries) {
188
188
  if (!entry.isUpdated) {
189
189
  // Check for META-INF metadata files even in copy mode
190
- if (entry.filename === Headers_1.TOKENIZED_METADATA || entry.filename === Headers_1.TIMESTAMP_SUBMITTED || entry.filename === Headers_1.TIMESTAMP_METADATA) {
190
+ if ((0, MetaPaths_1.isMetaInfPath)(entry.filename || '')) {
191
191
  // Force this entry to be processed with special handling instead of copied
192
192
  entry.isUpdated = true;
193
193
  // Don't continue here - let it fall through to special handling below
@@ -218,7 +218,7 @@ class ZipkitBrowser extends core_1.default {
218
218
  continue;
219
219
  }
220
220
  // Special handling for META-INF metadata files - store uncompressed with CRC-32
221
- if (entry.filename === Headers_1.TOKENIZED_METADATA || entry.filename === Headers_1.TIMESTAMP_SUBMITTED || entry.filename === Headers_1.TIMESTAMP_METADATA) {
221
+ if ((0, MetaPaths_1.isMetaInfPath)(entry.filename || '')) {
222
222
  // For metadata files, use STORED compression (no compression)
223
223
  const buffer = Buffer.from(fileBuffer);
224
224
  // Calculate CRC-32 for the metadata file (not SHA-256 to avoid Merkle Root interference)
@@ -267,9 +267,7 @@ class ZipkitBrowser extends core_1.default {
267
267
  * @returns boolean - True if the file is a metadata file
268
268
  */
269
269
  isMetadataFile(filename) {
270
- return filename === Headers_1.TIMESTAMP_SUBMITTED ||
271
- filename === Headers_1.TIMESTAMP_METADATA ||
272
- filename === Headers_1.TOKENIZED_METADATA;
270
+ return (0, MetaPaths_1.isMetaInfPath)(filename);
273
271
  }
274
272
  // --------------------------------------
275
273
  // Helper method: Add a file to the ZIP with compression
@@ -1 +1 @@
1
- {"version":3,"file":"ZipkitBrowser.js","sourceRoot":"","sources":["../../src/browser/ZipkitBrowser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ZipkitBrowser.js","sourceRoot":"","sources":["../../src/browser/ZipkitBrowser.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,23 @@
1
1
  /**
2
- * Browser stub for ZSTD — native zlib streaming is Node-only.
3
- * Browser builds alias `ZstdNode` to this module so the bad WASM codec is never shipped.
2
+ * Browser zstd codec for in-memory buffers.
3
+ * Uses CompressionStream / DecompressionStream ('zstd') so the old WASM codec stays out.
4
+ * Node builds use src/node/ZstdNode.ts (native zlib) instead of this file.
4
5
  */
6
+ import { Buffer } from 'buffer';
7
+ /** Bytes accepted by the buffer zstd codec. */
8
+ export type ZstdInput = Buffer | Uint8Array | ArrayBuffer;
5
9
  export declare function isNativeZstdAvailable(): boolean;
6
- export declare function mapCompressionLevel(_level: number): number;
10
+ export declare function mapCompressionLevel(level: number): number;
7
11
  export declare function createCompressTransform(_level?: number): never;
8
12
  export declare function createDecompressTransform(): never;
9
- export declare function compress(_data: Buffer, _level?: number): Promise<Buffer>;
10
- export declare function decompress(_data: Buffer): Promise<Buffer>;
11
- export declare function compressSync(_data: Buffer, _level?: number): Buffer;
12
- export declare function decompressSync(_data: Buffer): Buffer;
13
- export declare function compressChunks(_readChunk: (position: number, size: number) => Buffer, _totalSize: number, _chunkSize: number, _level: number, _onPlainChunk?: (chunk: Buffer) => void, _onCompressedChunk?: (chunk: Buffer) => void | Promise<void>): Promise<number>;
14
- export declare function decompressStream(_compressedStream: AsyncIterable<Buffer>): AsyncGenerator<Buffer>;
13
+ export declare function compress(data: ZstdInput, _level?: number): Promise<Buffer>;
14
+ export declare function decompress(data: ZstdInput): Promise<Buffer>;
15
+ export declare function compressSync(_data: ZstdInput, _level?: number): Buffer;
16
+ export declare function compressSyncAtLevel(data: ZstdInput, _zstdLevel?: number): Buffer;
17
+ export declare function decompressSync(_data: ZstdInput): Buffer;
18
+ export declare function asZstdBuffer(data: ZstdInput): Buffer;
19
+ export declare function compressChunks(readChunk: (position: number, size: number) => Buffer, totalSize: number, chunkSize: number, level: number, _onPlainChunk?: (chunk: Buffer) => void, onCompressedChunk?: (chunk: Buffer) => void | Promise<void>): Promise<number>;
20
+ export declare function decompressStream(compressedStream: AsyncIterable<Buffer>): AsyncGenerator<Buffer>;
15
21
  export declare const ZstdNode: {
16
22
  isNativeZstdAvailable: typeof isNativeZstdAvailable;
17
23
  mapCompressionLevel: typeof mapCompressionLevel;
@@ -20,7 +26,9 @@ export declare const ZstdNode: {
20
26
  compress: typeof compress;
21
27
  decompress: typeof decompress;
22
28
  compressSync: typeof compressSync;
29
+ compressSyncAtLevel: typeof compressSyncAtLevel;
23
30
  decompressSync: typeof decompressSync;
31
+ asZstdBuffer: typeof asZstdBuffer;
24
32
  compressChunks: typeof compressChunks;
25
33
  decompressStream: typeof decompressStream;
26
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"zstd-browser-shim.d.ts","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,wBAAgB,qBAAqB,IAAI,OAAO,CAE/C;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAE9D;AAED,wBAAgB,yBAAyB,IAAI,KAAK,CAEjD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE9E;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAsB,cAAc,CAClC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,EACtD,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACvC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC3D,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAuB,gBAAgB,CACrC,iBAAiB,EAAE,aAAa,CAAC,MAAM,CAAC,GACvC,cAAc,CAAC,MAAM,CAAC,CAExB;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;CAWpB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"zstd-browser-shim.d.ts","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,+CAA+C;AAC/C,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;AAe1D,wBAAgB,qBAAqB,IAAI,OAAO,CAY/C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEzD;AAqCD,wBAAgB,uBAAuB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAE9D;AAED,wBAAgB,yBAAyB,IAAI,KAAK,CAEjD;AAED,wBAAsB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAEhF;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEvD;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED,wBAAsB,cAAc,CAClC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,EACrD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EACvC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAC1D,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,wBAAuB,gBAAgB,CACrC,gBAAgB,EAAE,aAAa,CAAC,MAAM,CAAC,GACtC,cAAc,CAAC,MAAM,CAAC,CAMxB;AAED,eAAO,MAAM,QAAQ;;;;;;;;;;;;;CAapB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  /**
3
- * Browser stub for ZSTD — native zlib streaming is Node-only.
4
- * Browser builds alias `ZstdNode` to this module so the bad WASM codec is never shipped.
3
+ * Browser zstd codec for in-memory buffers.
4
+ * Uses CompressionStream / DecompressionStream ('zstd') so the old WASM codec stays out.
5
+ * Node builds use src/node/ZstdNode.ts (native zlib) instead of this file.
5
6
  */
6
7
  Object.defineProperty(exports, "__esModule", { value: true });
7
8
  exports.ZstdNode = void 0;
@@ -12,43 +13,118 @@ exports.createDecompressTransform = createDecompressTransform;
12
13
  exports.compress = compress;
13
14
  exports.decompress = decompress;
14
15
  exports.compressSync = compressSync;
16
+ exports.compressSyncAtLevel = compressSyncAtLevel;
15
17
  exports.decompressSync = decompressSync;
18
+ exports.asZstdBuffer = asZstdBuffer;
16
19
  exports.compressChunks = compressChunks;
17
20
  exports.decompressStream = decompressStream;
18
- const ZSTD_BROWSER_UNSUPPORTED = 'ZSTD requires Node.js with native zlib support (Node.js >= 22.15 or >= 23.8). ' +
19
- 'Browser builds do not include a zstd codec; use Deflate or process zstd archives in Node.';
20
- function unsupported() {
21
- throw new Error(ZSTD_BROWSER_UNSUPPORTED);
21
+ const buffer_1 = require("buffer");
22
+ const ZSTD_UNAVAILABLE = 'This browser does not expose CompressionStream zstd. ' +
23
+ 'Use a current Chromium or Safari, or inflate the archive in Node.';
24
+ function asBytes(data) {
25
+ if (data instanceof ArrayBuffer)
26
+ return new Uint8Array(data);
27
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
28
+ }
29
+ function toBuffer(bytes) {
30
+ return buffer_1.Buffer.from(bytes);
22
31
  }
23
32
  function isNativeZstdAvailable() {
24
- return false;
33
+ try {
34
+ if (typeof CompressionStream === 'undefined' || typeof DecompressionStream === 'undefined') {
35
+ return false;
36
+ }
37
+ // 'zstd' is not in the older CompressionFormat union.
38
+ new CompressionStream('zstd');
39
+ new DecompressionStream('zstd');
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ function mapCompressionLevel(level) {
47
+ return Math.min(Math.max(1, Math.floor(level * 2.1)), 19);
48
+ }
49
+ function assertZstd() {
50
+ if (!isNativeZstdAvailable()) {
51
+ throw new Error(ZSTD_UNAVAILABLE);
52
+ }
25
53
  }
26
- function mapCompressionLevel(_level) {
27
- return unsupported();
54
+ async function transformZstd(data, mode) {
55
+ assertZstd();
56
+ const Stream = mode === 'compress' ? CompressionStream : DecompressionStream;
57
+ const stream = new Stream('zstd');
58
+ const copy = new Uint8Array(data.byteLength);
59
+ copy.set(data);
60
+ const writer = stream.writable.getWriter();
61
+ await writer.write(copy);
62
+ await writer.close();
63
+ const reader = stream.readable.getReader();
64
+ const chunks = [];
65
+ let total = 0;
66
+ for (;;) {
67
+ const { done, value } = await reader.read();
68
+ if (done)
69
+ break;
70
+ if (value) {
71
+ chunks.push(value);
72
+ total += value.byteLength;
73
+ }
74
+ }
75
+ const out = new Uint8Array(total);
76
+ let offset = 0;
77
+ for (const chunk of chunks) {
78
+ out.set(chunk, offset);
79
+ offset += chunk.byteLength;
80
+ }
81
+ return out;
28
82
  }
29
83
  function createCompressTransform(_level) {
30
- return unsupported();
84
+ throw new Error('Browser zstd uses buffer compress(); Node zlib transforms are not available.');
31
85
  }
32
86
  function createDecompressTransform() {
33
- return unsupported();
87
+ throw new Error('Browser zstd uses buffer decompress(); Node zlib transforms are not available.');
34
88
  }
35
- async function compress(_data, _level) {
36
- return unsupported();
89
+ async function compress(data, _level) {
90
+ return toBuffer(await transformZstd(asBytes(data), 'compress'));
37
91
  }
38
- async function decompress(_data) {
39
- return unsupported();
92
+ async function decompress(data) {
93
+ return toBuffer(await transformZstd(asBytes(data), 'decompress'));
40
94
  }
41
95
  function compressSync(_data, _level) {
42
- return unsupported();
96
+ throw new Error('Browser zstd compress is async. Use compress().');
97
+ }
98
+ function compressSyncAtLevel(data, _zstdLevel) {
99
+ return compressSync(data);
43
100
  }
44
101
  function decompressSync(_data) {
45
- return unsupported();
102
+ throw new Error('Browser zstd decompress is async. Use decompress().');
103
+ }
104
+ function asZstdBuffer(data) {
105
+ return toBuffer(asBytes(data));
46
106
  }
47
- async function compressChunks(_readChunk, _totalSize, _chunkSize, _level, _onPlainChunk, _onCompressedChunk) {
48
- return unsupported();
107
+ async function compressChunks(readChunk, totalSize, chunkSize, level, _onPlainChunk, onCompressedChunk) {
108
+ const parts = [];
109
+ let position = 0;
110
+ while (position < totalSize) {
111
+ const size = Math.min(chunkSize, totalSize - position);
112
+ const chunk = readChunk(position, size);
113
+ parts.push(buffer_1.Buffer.from(chunk));
114
+ position += chunk.length;
115
+ }
116
+ const compressed = await compress(buffer_1.Buffer.concat(parts), level);
117
+ if (onCompressedChunk) {
118
+ await onCompressedChunk(compressed);
119
+ }
120
+ return compressed.length;
49
121
  }
50
- async function* decompressStream(_compressedStream) {
51
- unsupported();
122
+ async function* decompressStream(compressedStream) {
123
+ const parts = [];
124
+ for await (const chunk of compressedStream) {
125
+ parts.push(buffer_1.Buffer.from(chunk));
126
+ }
127
+ yield await decompress(buffer_1.Buffer.concat(parts));
52
128
  }
53
129
  exports.ZstdNode = {
54
130
  isNativeZstdAvailable,
@@ -58,7 +134,9 @@ exports.ZstdNode = {
58
134
  compress,
59
135
  decompress,
60
136
  compressSync,
137
+ compressSyncAtLevel,
61
138
  decompressSync,
139
+ asZstdBuffer,
62
140
  compressChunks,
63
141
  decompressStream,
64
142
  };
@@ -1 +1 @@
1
- {"version":3,"file":"zstd-browser-shim.js","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAUH,sDAEC;AAED,kDAEC;AAED,0DAEC;AAED,8DAEC;AAED,4BAEC;AAED,gCAEC;AAED,oCAEC;AAED,wCAEC;AAED,wCASC;AAED,4CAIC;AAvDD,MAAM,wBAAwB,GAC5B,gFAAgF;IAChF,2FAA2F,CAAC;AAE9F,SAAS,WAAW;IAClB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,qBAAqB;IACnC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAc;IAChD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,uBAAuB,CAAC,MAAe;IACrD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,yBAAyB;IACvC,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,QAAQ,CAAC,KAAa,EAAE,MAAe;IAC3D,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,UAAU,CAAC,KAAa;IAC5C,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,YAAY,CAAC,KAAa,EAAE,MAAe;IACzD,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAED,SAAgB,cAAc,CAAC,KAAa;IAC1C,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,UAAsD,EACtD,UAAkB,EAClB,UAAkB,EAClB,MAAc,EACd,aAAuC,EACvC,kBAA4D;IAE5D,OAAO,WAAW,EAAE,CAAC;AACvB,CAAC;AAEM,KAAK,SAAS,CAAC,CAAC,gBAAgB,CACrC,iBAAwC;IAExC,WAAW,EAAE,CAAC;AAChB,CAAC;AAEY,QAAA,QAAQ,GAAG;IACtB,qBAAqB;IACrB,mBAAmB;IACnB,uBAAuB;IACvB,yBAAyB;IACzB,QAAQ;IACR,UAAU;IACV,YAAY;IACZ,cAAc;IACd,cAAc;IACd,gBAAgB;CACjB,CAAC;AAEF,kBAAe,gBAAQ,CAAC"}
1
+ {"version":3,"file":"zstd-browser-shim.js","sourceRoot":"","sources":["../../src/browser/zstd-browser-shim.ts"],"names":[],"mappings":"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"}