Commit 572a0ba
authored
fix: replace @eggjs/yauzl with upstream yauzl 3.4.0, update yazl to 3.3.1 (#145)
Fixes the Node 26 CI failure on master, and moves both zip dependencies
to their upstream, maintained versions.
## yauzl: the Node 26 fix
`@eggjs/yauzl` depends on `fd-slicer2`, whose `ReadStream` loses data
when piped on Node 26. Any zip entry over the 64 KiB `highWaterMark`
delivers roughly the first chunk and then stalls, with no `end`, no
`error`, no `close`. That is why `zip.uncompress()` hangs until the 60s
timeout on Node 26 while passing on 18 through 24.
Not our code: released 2.1.1 reproduces it identically. Reported
upstream at node-modules/yauzl#3.
`yauzl@3.4.0` dropped `fd-slicer` entirely (only dependency is now
`pend`) and does not have the bug.
The fork was adopted for `decodeStrings: false` so absolute paths
survive `validateFileName`. I checked that still holds against the
`contain-absolute-path.zip` fixture rather than assuming:
| | @eggjs/yauzl 2.11.0 | upstream 3.4.0 |
| --- | --- | --- |
| entries | 31 | 31 |
| `fileName` is Buffer | 31 | 31 |
| `externalFileAttributes` present | 31 | 31 |
| files read | 21 | 21 |
| leading `/` entry | preserved | preserved |
Only visible difference: yauzl 3 capitalises the "End of central
directory record signature not found" message, so that assertion is now
case-insensitive.
## yazl 3 and the early-finalize bug it exposed
yazl 3 turns "add entries after calling `end()`" from a tolerated no-op
into a thrown error, and compressing trips it immediately.
`_onEntryFinish()` finalizes as soon as the entry queue is momentarily
empty. For zip the finish callback runs synchronously, so a caller
doing:
```js
zipStream.addEntry(streamA, ...);
zipStream.addEntry(bufferB, ...);
```
closed the archive after the first entry, and the second threw. Tar
avoids it only because its `fs.stat` makes the callback async, which
lets the later entries queue first.
Worth being precise about the old behaviour: **yazl 2 did not drop those
entries.** I checked, and the produced archive contained all of them. So
this was latent, not a live data-loss bug.
Fix is to finalize on the next tick and skip it if an entry arrived
meanwhile. Verified the produced archive still contains every entry.
Residual limitation, unchanged in spirit from before: entries added
after a longer async gap still finalize early. That is the existing
drain heuristic, and giving the stream an explicit "done adding" call
would be an API change worth doing separately.
## Result
**171 passing on both Node 24 and Node 26**, lint and `tsc` clean. On
Node 26 the zip suite finishes in ~495ms where it previously hung for
60s. The symlink cases from #140 were re-checked through the new zip
path and still block.
Drops `fd-slicer2` and `buffer-crc32` from the tree. Supersedes #132.1 parent 3499eb2 commit 572a0ba
4 files changed
Lines changed: 17 additions & 7 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
127 | 127 | | |
128 | 128 | | |
129 | 129 | | |
130 | | - | |
131 | | - | |
| 130 | + | |
132 | 131 | | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
133 | 139 | | |
134 | 140 | | |
135 | 141 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
125 | 125 | | |
126 | 126 | | |
127 | 127 | | |
128 | | - | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
129 | 133 | | |
130 | 134 | | |
131 | 135 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | | - | |
43 | 42 | | |
44 | 43 | | |
45 | 44 | | |
46 | 45 | | |
47 | 46 | | |
48 | | - | |
| 47 | + | |
| 48 | + | |
49 | 49 | | |
50 | 50 | | |
51 | 51 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
52 | 52 | | |
53 | 53 | | |
54 | 54 | | |
55 | | - | |
| 55 | + | |
56 | 56 | | |
57 | 57 | | |
58 | 58 | | |
| |||
0 commit comments