@medicomind/rolldown-compression 2.1.6 → 2.1.8

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 (4) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +16 -15
  3. package/index.js +703 -0
  4. package/package.json +10 -8
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @medicomind/rolldown-compression
2
2
 
3
+ ## 2.1.8
4
+
5
+ ### Patch Changes
6
+
7
+ - [`f15e4b4`](https://github.com/Medico-Mind/rolldown-compression/commit/f15e4b4ed61eec6ea449ef61a08518b6cf5f5541) Thanks [@Mnwa](https://github.com/Mnwa)! - Reduce allocations in the native compression path: gzip now compresses through a buffered reader with a tighter worst-case output bound, and brotli reuses thread-local scratch buffers instead of allocating them per call.
8
+
9
+ - [`3ff01c1`](https://github.com/Medico-Mind/rolldown-compression/commit/3ff01c1272ee5c618b746f39b0e8493203206b29) Thanks [@Mnwa](https://github.com/Mnwa)! - Fix the published `wasm32-wasi` package manifest, which had drifted behind the napi-rs CLI: it no longer declares `cpu: ["wasm32"]` (the WASI binding runs on any host architecture), now declares `type: module` for its loaders, ships and points `types` at `rolldown-compression.wasi.d.cts`, and pins the `@emnapi/core` / `@emnapi/runtime` versions the binding is actually built against.
10
+
11
+ ## 2.1.7
12
+
13
+ ### Patch Changes
14
+
15
+ - [`addbfa5`](https://github.com/Medico-Mind/rolldown-compression/commit/addbfa564547d9553eef6c29633d4df6b0f44389) Thanks [@Mnwa](https://github.com/Mnwa)! - Fix build
16
+
3
17
  ## 2.1.6
4
18
 
5
19
  ### Patch Changes
package/README.md CHANGED
@@ -185,33 +185,34 @@ after: npm run build 537.24s user 5.59s system 740% cpu 1:13.29 total
185
185
 
186
186
  `npm run bench` (or `node benchmark/index.mjs --quick`) generates a dist-shaped fixture set — 202 files / ~85 MB with a long-tail size distribution, including two monolithic >16 MiB bundles that exercise the multithreaded brotli path — and compresses it with the native core vs `node:zlib` driven at full parallelism via `Promise.all` (the reference plugin's best case). Both sides always use the same levels.
187
187
 
188
- Results on an Apple M1 Pro (10 cores), Node 26, default `UV_THREADPOOL_SIZE`:
188
+ Results on an Apple M5 Pro (18 cores), Node 26, default `UV_THREADPOOL_SIZE`:
189
189
 
190
190
  #### With PGO
191
191
  | scenario | output | native (rust) | node:zlib | speedup |
192
192
  |-----------------------------------|----------|---------------|-----------|---------|
193
- | gzip+brotli (ref. defaults: 9/11) | 15.06 MB | 14.63s | 35.48s | 2.43x |
194
- | gzip (level 9) | 9.62 MB | 0.29s | 0.78s | 2.69x |
195
- | gzip (level 6) | 9.86 MB | 0.18s | 0.36s | 1.99x |
196
- | brotli (quality 11) | 5.45 MB | 14.27s | 35.37s | 2.48x |
197
- | brotli (quality 6) | 9.88 MB | 0.22s | 0.35s | 1.59x |
198
- | zstd (level 19) | 5.54 MB | 7.42s | 12.99s | 1.75x |
193
+ | gzip+brotli (ref. defaults: 9/11) | 15.06 MB | 7.06s | 23.57s | 3.34x |
194
+ | gzip (level 9) | 9.62 MB | 0.18s | 0.53s | 2.93x |
195
+ | gzip (level 6) | 9.86 MB | 0.11s | 0.24s | 2.08x |
196
+ | brotli (quality 11) | 5.45 MB | 6.91s | 23.43s | 3.39x |
197
+ | brotli (quality 6) | 9.88 MB | 0.12s | 0.23s | 1.99x |
198
+ | zstd (level 19) | 5.54 MB | 5.03s | 8.41s | 1.67x |
199
199
 
200
200
  #### Without PGO
201
201
  | scenario | output | native (rust) | node:zlib | speedup |
202
202
  |-----------------------------------|----------|---------------|-----------|---------|
203
- | gzip+brotli (ref. defaults: 9/11) | 15.06 MB | 14.79s | 35.50s | 2.40x |
204
- | gzip (level 9) | 9.62 MB | 0.26s | 0.79s | 3.07x |
205
- | gzip (level 6) | 9.86 MB | 0.18s | 0.36s | 1.98x |
206
- | brotli (quality 11) | 5.45 MB | 14.37s | 35.46s | 2.47x |
207
- | brotli (quality 6) | 9.88 MB | 0.22s | 0.35s | 1.58x |
208
- | zstd (level 19) | 5.54 MB | 7.34s | 13.09s | 1.78x |
203
+ | gzip+brotli (ref. defaults: 9/11) | 15.06 MB | 6.55s | 23.58s | 3.60x |
204
+ | gzip (level 9) | 9.62 MB | 0.16s | 0.54s | 3.31x |
205
+ | gzip (level 6) | 9.86 MB | 0.11s | 0.24s | 2.06x |
206
+ | brotli (quality 11) | 5.45 MB | 6.62s | 23.61s | 3.56x |
207
+ | brotli (quality 6) | 9.88 MB | 0.11s | 0.23s | 2.04x |
208
+ | zstd (level 19) | 5.54 MB | 5.06s | 8.43s | 1.67x |
209
209
 
210
210
  Reading these numbers honestly:
211
211
 
212
212
  - **gzip** and **zstd** are faster per core ([zlib-rs](https://github.com/trifectatechfoundation/zlib-rs), ~2.4x faster per core than node's bundled zlib in our measurements; libzstd) *and* use every core, while `node:zlib` is capped at `UV_THREADPOOL_SIZE` (default 4) threads. The two >16 MiB bundles temper the headline numbers: neither algorithm has a sectioned mode, so each giant file occupies a single thread on both sides and that tail runs at the per-core ratio rather than the thread-count ratio.
213
213
  - **brotli at quality 11** is the bound on the combined number: the Rust `brotli` crate is at per-core parity with node's C brotli (we measured a 1.01 single-thread ratio), so the speedup is parallelism — every core against `UV_THREADPOOL_SIZE` threads across the many small files, plus the sectioned worker pool (4 x 4 MiB sections) on the >16 MiB bundles that `node:zlib` has to compress one thread per file.
214
- - The speedup grows with core count and shrinks if you raise `UV_THREADPOOL_SIZE` for the JS side — the benchmark prints both so runs are comparable.
214
+ - The speedup grows with core count and shrinks if you raise `UV_THREADPOOL_SIZE` for the JS side — the benchmark prints both so runs are comparable. The 10-core M1 Pro these tables previously covered landed around 2.4x on the combined scenario; the 18-core M5 Pro reaches 3.3–3.6x against the same 4-thread JS side.
215
+ - The two tables above are single runs of each binding, so the small differences *between* them are run-to-run noise, not a PGO effect — see [PGO / BOLT builds](#pgo--bolt-builds) for an interleaved median comparison of the same two binaries.
215
216
 
216
217
  ### PGO / BOLT builds
217
218
 
@@ -231,7 +232,7 @@ Reading these numbers honestly:
231
232
  | baseline | plain `--release` (fat LTO, `codegen-units = 1`) |
232
233
  | pgo / pgo+bolt | same flags plus `-Cprofile-use` (and BOLT layout on Linux) |
233
234
 
234
- Expect modest gains: the baseline already ships fat LTO with `codegen-units = 1`, so PGO adds a few percent on the compression-heavy scenarios (~1.1x on the brotli quality 11 run on an M1 Pro) and is within noise on sub-second ones. Sub-second scenario deltas in the table are measurement noise, not regressions.
235
+ Expect modest gains at best: the baseline already ships fat LTO with `codegen-units = 1`, so there is little left for PGO to find. On an M5 Pro the interleaved medians come out at parity (0.98x–1.02x across the compression-heavy scenarios); an earlier M1 Pro run measured ~1.1x on brotli quality 11. Treat single-digit-percent deltas in either direction — and every sub-second scenario — as measurement noise rather than a real speedup or regression.
235
236
 
236
237
  The release workflow builds every published binary with PGO. Cross-compiled targets run the training workload through an emulation layer — x64 Node under Rosetta 2 for `x86_64-apple-darwin`, an arm64 Node container under QEMU for `aarch64-unknown-linux-gnu`, and an Alpine container for musl — so each target trains on its own instrumented binding.
237
238
 
package/index.js ADDED
@@ -0,0 +1,703 @@
1
+ // prettier-ignore
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ const { readFileSync } = require('fs')
7
+ let nativeBinding = null
8
+ const loadErrors = []
9
+
10
+ const isMusl = () => {
11
+ let musl = false
12
+ if (process.platform === 'linux') {
13
+ musl = isMuslFromFilesystem()
14
+ if (musl === null) {
15
+ musl = isMuslFromReport()
16
+ }
17
+ if (musl === null) {
18
+ musl = isMuslFromChildProcess()
19
+ }
20
+ }
21
+ return musl
22
+ }
23
+
24
+ const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
25
+
26
+ const isMuslFromFilesystem = () => {
27
+ try {
28
+ return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
29
+ } catch {
30
+ return null
31
+ }
32
+ }
33
+
34
+ const isMuslFromReport = () => {
35
+ let report = null
36
+ if (process.report && typeof process.report.getReport === 'function') {
37
+ process.report.excludeNetwork = true
38
+ report = process.report.getReport()
39
+ }
40
+ if (!report) {
41
+ return null
42
+ }
43
+ if (report.header && report.header.glibcVersionRuntime) {
44
+ return false
45
+ }
46
+ if (Array.isArray(report.sharedObjects)) {
47
+ if (report.sharedObjects.some(isFileMusl)) {
48
+ return true
49
+ }
50
+ }
51
+ return false
52
+ }
53
+
54
+ const isMuslFromChildProcess = () => {
55
+ try {
56
+ return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
57
+ } catch (e) {
58
+ // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
59
+ return false
60
+ }
61
+ }
62
+
63
+ function requireNative() {
64
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
65
+ try {
66
+ return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
67
+ } catch (err) {
68
+ loadErrors.push(err)
69
+ }
70
+ } else if (process.platform === 'android') {
71
+ if (process.arch === 'arm64') {
72
+ try {
73
+ return require('./rolldown-compression.android-arm64.node')
74
+ } catch (e) {
75
+ loadErrors.push(e)
76
+ }
77
+ try {
78
+ const binding = require('@medicomind/rolldown-compression-android-arm64')
79
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-android-arm64/package.json').version
80
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
81
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
82
+ }
83
+ return binding
84
+ } catch (e) {
85
+ loadErrors.push(e)
86
+ }
87
+ } else if (process.arch === 'arm') {
88
+ try {
89
+ return require('./rolldown-compression.android-arm-eabi.node')
90
+ } catch (e) {
91
+ loadErrors.push(e)
92
+ }
93
+ try {
94
+ const binding = require('@medicomind/rolldown-compression-android-arm-eabi')
95
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-android-arm-eabi/package.json').version
96
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
97
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
+ }
99
+ return binding
100
+ } catch (e) {
101
+ loadErrors.push(e)
102
+ }
103
+ } else {
104
+ loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
105
+ }
106
+ } else if (process.platform === 'win32') {
107
+ if (process.arch === 'x64') {
108
+ if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
109
+ try {
110
+ return require('./rolldown-compression.win32-x64-gnu.node')
111
+ } catch (e) {
112
+ loadErrors.push(e)
113
+ }
114
+ try {
115
+ const binding = require('@medicomind/rolldown-compression-win32-x64-gnu')
116
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-win32-x64-gnu/package.json').version
117
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
118
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
119
+ }
120
+ return binding
121
+ } catch (e) {
122
+ loadErrors.push(e)
123
+ }
124
+ } else {
125
+ try {
126
+ return require('./rolldown-compression.win32-x64-msvc.node')
127
+ } catch (e) {
128
+ loadErrors.push(e)
129
+ }
130
+ try {
131
+ const binding = require('@medicomind/rolldown-compression-win32-x64-msvc')
132
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-win32-x64-msvc/package.json').version
133
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
134
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
135
+ }
136
+ return binding
137
+ } catch (e) {
138
+ loadErrors.push(e)
139
+ }
140
+ }
141
+ } else if (process.arch === 'ia32') {
142
+ try {
143
+ return require('./rolldown-compression.win32-ia32-msvc.node')
144
+ } catch (e) {
145
+ loadErrors.push(e)
146
+ }
147
+ try {
148
+ const binding = require('@medicomind/rolldown-compression-win32-ia32-msvc')
149
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-win32-ia32-msvc/package.json').version
150
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
151
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
152
+ }
153
+ return binding
154
+ } catch (e) {
155
+ loadErrors.push(e)
156
+ }
157
+ } else if (process.arch === 'arm64') {
158
+ try {
159
+ return require('./rolldown-compression.win32-arm64-msvc.node')
160
+ } catch (e) {
161
+ loadErrors.push(e)
162
+ }
163
+ try {
164
+ const binding = require('@medicomind/rolldown-compression-win32-arm64-msvc')
165
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-win32-arm64-msvc/package.json').version
166
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
167
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
168
+ }
169
+ return binding
170
+ } catch (e) {
171
+ loadErrors.push(e)
172
+ }
173
+ } else {
174
+ loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
175
+ }
176
+ } else if (process.platform === 'darwin') {
177
+ try {
178
+ return require('./rolldown-compression.darwin-universal.node')
179
+ } catch (e) {
180
+ loadErrors.push(e)
181
+ }
182
+ try {
183
+ const binding = require('@medicomind/rolldown-compression-darwin-universal')
184
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-darwin-universal/package.json').version
185
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
186
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
187
+ }
188
+ return binding
189
+ } catch (e) {
190
+ loadErrors.push(e)
191
+ }
192
+ if (process.arch === 'x64') {
193
+ try {
194
+ return require('./rolldown-compression.darwin-x64.node')
195
+ } catch (e) {
196
+ loadErrors.push(e)
197
+ }
198
+ try {
199
+ const binding = require('@medicomind/rolldown-compression-darwin-x64')
200
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-darwin-x64/package.json').version
201
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
202
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
203
+ }
204
+ return binding
205
+ } catch (e) {
206
+ loadErrors.push(e)
207
+ }
208
+ } else if (process.arch === 'arm64') {
209
+ try {
210
+ return require('./rolldown-compression.darwin-arm64.node')
211
+ } catch (e) {
212
+ loadErrors.push(e)
213
+ }
214
+ try {
215
+ const binding = require('@medicomind/rolldown-compression-darwin-arm64')
216
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-darwin-arm64/package.json').version
217
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
218
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
219
+ }
220
+ return binding
221
+ } catch (e) {
222
+ loadErrors.push(e)
223
+ }
224
+ } else {
225
+ loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
226
+ }
227
+ } else if (process.platform === 'freebsd') {
228
+ if (process.arch === 'x64') {
229
+ try {
230
+ return require('./rolldown-compression.freebsd-x64.node')
231
+ } catch (e) {
232
+ loadErrors.push(e)
233
+ }
234
+ try {
235
+ const binding = require('@medicomind/rolldown-compression-freebsd-x64')
236
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-freebsd-x64/package.json').version
237
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
238
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
239
+ }
240
+ return binding
241
+ } catch (e) {
242
+ loadErrors.push(e)
243
+ }
244
+ } else if (process.arch === 'arm64') {
245
+ try {
246
+ return require('./rolldown-compression.freebsd-arm64.node')
247
+ } catch (e) {
248
+ loadErrors.push(e)
249
+ }
250
+ try {
251
+ const binding = require('@medicomind/rolldown-compression-freebsd-arm64')
252
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-freebsd-arm64/package.json').version
253
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
254
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
255
+ }
256
+ return binding
257
+ } catch (e) {
258
+ loadErrors.push(e)
259
+ }
260
+ } else {
261
+ loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
262
+ }
263
+ } else if (process.platform === 'linux') {
264
+ if (process.arch === 'x64') {
265
+ if (isMusl()) {
266
+ try {
267
+ return require('./rolldown-compression.linux-x64-musl.node')
268
+ } catch (e) {
269
+ loadErrors.push(e)
270
+ }
271
+ try {
272
+ const binding = require('@medicomind/rolldown-compression-linux-x64-musl')
273
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-x64-musl/package.json').version
274
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
275
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
276
+ }
277
+ return binding
278
+ } catch (e) {
279
+ loadErrors.push(e)
280
+ }
281
+ } else {
282
+ try {
283
+ return require('./rolldown-compression.linux-x64-gnu.node')
284
+ } catch (e) {
285
+ loadErrors.push(e)
286
+ }
287
+ try {
288
+ const binding = require('@medicomind/rolldown-compression-linux-x64-gnu')
289
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-x64-gnu/package.json').version
290
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
291
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
292
+ }
293
+ return binding
294
+ } catch (e) {
295
+ loadErrors.push(e)
296
+ }
297
+ }
298
+ } else if (process.arch === 'arm64') {
299
+ if (isMusl()) {
300
+ try {
301
+ return require('./rolldown-compression.linux-arm64-musl.node')
302
+ } catch (e) {
303
+ loadErrors.push(e)
304
+ }
305
+ try {
306
+ const binding = require('@medicomind/rolldown-compression-linux-arm64-musl')
307
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-arm64-musl/package.json').version
308
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
309
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
310
+ }
311
+ return binding
312
+ } catch (e) {
313
+ loadErrors.push(e)
314
+ }
315
+ } else {
316
+ try {
317
+ return require('./rolldown-compression.linux-arm64-gnu.node')
318
+ } catch (e) {
319
+ loadErrors.push(e)
320
+ }
321
+ try {
322
+ const binding = require('@medicomind/rolldown-compression-linux-arm64-gnu')
323
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-arm64-gnu/package.json').version
324
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
325
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
326
+ }
327
+ return binding
328
+ } catch (e) {
329
+ loadErrors.push(e)
330
+ }
331
+ }
332
+ } else if (process.arch === 'arm') {
333
+ if (isMusl()) {
334
+ try {
335
+ return require('./rolldown-compression.linux-arm-musleabihf.node')
336
+ } catch (e) {
337
+ loadErrors.push(e)
338
+ }
339
+ try {
340
+ const binding = require('@medicomind/rolldown-compression-linux-arm-musleabihf')
341
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-arm-musleabihf/package.json').version
342
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
343
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
344
+ }
345
+ return binding
346
+ } catch (e) {
347
+ loadErrors.push(e)
348
+ }
349
+ } else {
350
+ try {
351
+ return require('./rolldown-compression.linux-arm-gnueabihf.node')
352
+ } catch (e) {
353
+ loadErrors.push(e)
354
+ }
355
+ try {
356
+ const binding = require('@medicomind/rolldown-compression-linux-arm-gnueabihf')
357
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-arm-gnueabihf/package.json').version
358
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
359
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
360
+ }
361
+ return binding
362
+ } catch (e) {
363
+ loadErrors.push(e)
364
+ }
365
+ }
366
+ } else if (process.arch === 'loong64') {
367
+ if (isMusl()) {
368
+ try {
369
+ return require('./rolldown-compression.linux-loong64-musl.node')
370
+ } catch (e) {
371
+ loadErrors.push(e)
372
+ }
373
+ try {
374
+ const binding = require('@medicomind/rolldown-compression-linux-loong64-musl')
375
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-loong64-musl/package.json').version
376
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
377
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
378
+ }
379
+ return binding
380
+ } catch (e) {
381
+ loadErrors.push(e)
382
+ }
383
+ } else {
384
+ try {
385
+ return require('./rolldown-compression.linux-loong64-gnu.node')
386
+ } catch (e) {
387
+ loadErrors.push(e)
388
+ }
389
+ try {
390
+ const binding = require('@medicomind/rolldown-compression-linux-loong64-gnu')
391
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-loong64-gnu/package.json').version
392
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
393
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
394
+ }
395
+ return binding
396
+ } catch (e) {
397
+ loadErrors.push(e)
398
+ }
399
+ }
400
+ } else if (process.arch === 'riscv64') {
401
+ if (isMusl()) {
402
+ try {
403
+ return require('./rolldown-compression.linux-riscv64-musl.node')
404
+ } catch (e) {
405
+ loadErrors.push(e)
406
+ }
407
+ try {
408
+ const binding = require('@medicomind/rolldown-compression-linux-riscv64-musl')
409
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-riscv64-musl/package.json').version
410
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
411
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
412
+ }
413
+ return binding
414
+ } catch (e) {
415
+ loadErrors.push(e)
416
+ }
417
+ } else {
418
+ try {
419
+ return require('./rolldown-compression.linux-riscv64-gnu.node')
420
+ } catch (e) {
421
+ loadErrors.push(e)
422
+ }
423
+ try {
424
+ const binding = require('@medicomind/rolldown-compression-linux-riscv64-gnu')
425
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-riscv64-gnu/package.json').version
426
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
427
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
428
+ }
429
+ return binding
430
+ } catch (e) {
431
+ loadErrors.push(e)
432
+ }
433
+ }
434
+ } else if (process.arch === 'ppc64') {
435
+ try {
436
+ return require('./rolldown-compression.linux-ppc64-gnu.node')
437
+ } catch (e) {
438
+ loadErrors.push(e)
439
+ }
440
+ try {
441
+ const binding = require('@medicomind/rolldown-compression-linux-ppc64-gnu')
442
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-ppc64-gnu/package.json').version
443
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
444
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
445
+ }
446
+ return binding
447
+ } catch (e) {
448
+ loadErrors.push(e)
449
+ }
450
+ } else if (process.arch === 's390x') {
451
+ try {
452
+ return require('./rolldown-compression.linux-s390x-gnu.node')
453
+ } catch (e) {
454
+ loadErrors.push(e)
455
+ }
456
+ try {
457
+ const binding = require('@medicomind/rolldown-compression-linux-s390x-gnu')
458
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-linux-s390x-gnu/package.json').version
459
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
460
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
461
+ }
462
+ return binding
463
+ } catch (e) {
464
+ loadErrors.push(e)
465
+ }
466
+ } else {
467
+ loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
468
+ }
469
+ } else if (process.platform === 'openharmony') {
470
+ if (process.arch === 'arm64') {
471
+ try {
472
+ return require('./rolldown-compression.openharmony-arm64.node')
473
+ } catch (e) {
474
+ loadErrors.push(e)
475
+ }
476
+ try {
477
+ const binding = require('@medicomind/rolldown-compression-openharmony-arm64')
478
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-openharmony-arm64/package.json').version
479
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
480
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
481
+ }
482
+ return binding
483
+ } catch (e) {
484
+ loadErrors.push(e)
485
+ }
486
+ } else if (process.arch === 'x64') {
487
+ try {
488
+ return require('./rolldown-compression.openharmony-x64.node')
489
+ } catch (e) {
490
+ loadErrors.push(e)
491
+ }
492
+ try {
493
+ const binding = require('@medicomind/rolldown-compression-openharmony-x64')
494
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-openharmony-x64/package.json').version
495
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
496
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
497
+ }
498
+ return binding
499
+ } catch (e) {
500
+ loadErrors.push(e)
501
+ }
502
+ } else if (process.arch === 'arm') {
503
+ try {
504
+ return require('./rolldown-compression.openharmony-arm.node')
505
+ } catch (e) {
506
+ loadErrors.push(e)
507
+ }
508
+ try {
509
+ const binding = require('@medicomind/rolldown-compression-openharmony-arm')
510
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-openharmony-arm/package.json').version
511
+ if (bindingPackageVersion !== '2.1.8' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
512
+ throw new Error(`Native binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
513
+ }
514
+ return binding
515
+ } catch (e) {
516
+ loadErrors.push(e)
517
+ }
518
+ } else {
519
+ loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
520
+ }
521
+ } else {
522
+ loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
523
+ }
524
+ }
525
+
526
+ function createLoadErrorChain(errors) {
527
+ return errors.reduce((previous, current) => {
528
+ let message
529
+ try {
530
+ message =
531
+ current && typeof current.message === 'string'
532
+ ? current.message
533
+ : String(current)
534
+ } catch {
535
+ message = 'Unknown error'
536
+ }
537
+ const error = new Error(message)
538
+ error.cause = previous
539
+ return error
540
+ }, null)
541
+ }
542
+
543
+ // NAPI_RS_FORCE_WASI is a tri-state flag:
544
+ // unset / any other value → native binding preferred, WASI is only a fallback
545
+ // 'true' → prefer WASI, but retain native as a lazy fallback
546
+ // 'error' → require WASI without initializing a native fallback
547
+ // Treating any non-empty string as truthy (the historical behavior) meant
548
+ // NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered
549
+ // the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file.
550
+ //
551
+ // NAPI_RS_WASI_FLAVOR selects one exact generated flavor and implies strict
552
+ // WASI loading. It never crosses into another flavor or falls back to native.
553
+ const __napiWasiFlavors = ["wasm32-wasi"]
554
+ const __napiWasiFlavor = process.env.NAPI_RS_WASI_FLAVOR
555
+ const __napiWasiFlavorRequested =
556
+ typeof __napiWasiFlavor === 'string' && __napiWasiFlavor.length > 0
557
+ if (
558
+ __napiWasiFlavorRequested &&
559
+ __napiWasiFlavors.indexOf(__napiWasiFlavor) === -1
560
+ ) {
561
+ throw new Error(
562
+ 'Unsupported WASI flavor "' +
563
+ __napiWasiFlavor +
564
+ '". Available flavors: ' +
565
+ __napiWasiFlavors.join(', '),
566
+ )
567
+ }
568
+ const forceWasiError = process.env.NAPI_RS_FORCE_WASI === 'error'
569
+ const forceWasi =
570
+ process.env.NAPI_RS_FORCE_WASI === 'true' ||
571
+ forceWasiError ||
572
+ __napiWasiFlavorRequested
573
+
574
+ if (!forceWasi) {
575
+ nativeBinding = requireNative()
576
+ }
577
+
578
+ if (!nativeBinding || forceWasi) {
579
+ let wasiBinding = null
580
+ let wasiBindingLoaded = false
581
+ const wasiBindingErrors = []
582
+ const __napiWasiResolveCandidate = (specifier, isPackage, localArtifacts) => {
583
+ try {
584
+ require.resolve(specifier)
585
+ } catch (resolveError) {
586
+ if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
587
+ throw resolveError
588
+ }
589
+ if (isPackage) {
590
+ try {
591
+ require.resolve(specifier + '/package.json')
592
+ } catch (packageError) {
593
+ if (packageError && packageError.code === 'MODULE_NOT_FOUND') {
594
+ return resolveError
595
+ }
596
+ // An exports restriction proves the package exists even when its
597
+ // package.json is not public. Preserve the root resolution failure.
598
+ throw resolveError
599
+ }
600
+ // The package exists but its main/export target is broken.
601
+ throw resolveError
602
+ }
603
+ return resolveError
604
+ }
605
+ if (localArtifacts) {
606
+ let artifactError = null
607
+ for (let i = 0; i < localArtifacts.length; i++) {
608
+ try {
609
+ require.resolve(localArtifacts[i])
610
+ return null
611
+ } catch (resolveError) {
612
+ if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
613
+ throw resolveError
614
+ }
615
+ artifactError = resolveError
616
+ }
617
+ }
618
+ return artifactError
619
+ }
620
+ return null
621
+ }
622
+ if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === "wasm32-wasi")) {
623
+ let candidateError = null
624
+ let candidateFailed = false
625
+ try {
626
+ candidateError = __napiWasiResolveCandidate('./rolldown-compression.wasi.cjs', false, ["./rolldown-compression.wasm32-wasi.debug.wasm","./rolldown-compression.wasm32-wasi.wasm"])
627
+ candidateFailed = candidateError !== null
628
+ if (!candidateFailed) {
629
+ wasiBinding = require('./rolldown-compression.wasi.cjs')
630
+ nativeBinding = wasiBinding
631
+ wasiBindingLoaded = true
632
+ }
633
+ } catch (err) {
634
+ candidateError = err
635
+ candidateFailed = true
636
+ }
637
+ if (candidateFailed) {
638
+ wasiBindingErrors.push(candidateError)
639
+ loadErrors.push(candidateError)
640
+ }
641
+ }
642
+ if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === "wasm32-wasi")) {
643
+ let candidateError = null
644
+ let candidateFailed = false
645
+ try {
646
+ candidateError = __napiWasiResolveCandidate('@medicomind/rolldown-compression-wasm32-wasi', true, undefined)
647
+ candidateFailed = candidateError !== null
648
+ if (!candidateFailed) {
649
+ if (process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
650
+ const bindingPackageVersion = require('@medicomind/rolldown-compression-wasm32-wasi/package.json').version
651
+ if (bindingPackageVersion !== '2.1.8') {
652
+ throw new Error(`WASI binding package version mismatch, expected 2.1.8 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
653
+ }
654
+ }
655
+ wasiBinding = require('@medicomind/rolldown-compression-wasm32-wasi')
656
+ nativeBinding = wasiBinding
657
+ wasiBindingLoaded = true
658
+ }
659
+ } catch (err) {
660
+ candidateError = err
661
+ candidateFailed = true
662
+ }
663
+ if (candidateFailed) {
664
+ wasiBindingErrors.push(candidateError)
665
+ loadErrors.push(candidateError)
666
+ }
667
+ }
668
+ if (
669
+ !wasiBindingLoaded &&
670
+ forceWasi &&
671
+ !forceWasiError &&
672
+ !__napiWasiFlavorRequested
673
+ ) {
674
+ nativeBinding = requireNative()
675
+ }
676
+ if ((forceWasiError || __napiWasiFlavorRequested) && !wasiBindingLoaded) {
677
+ const error = new Error(
678
+ __napiWasiFlavorRequested
679
+ ? 'WASI binding for flavor "' + __napiWasiFlavor + '" not found'
680
+ : 'WASI binding not found and NAPI_RS_FORCE_WASI is set to error',
681
+ )
682
+ error.cause = createLoadErrorChain(wasiBindingErrors)
683
+ throw error
684
+ }
685
+ }
686
+
687
+ if (!nativeBinding) {
688
+ if (loadErrors.length > 0) {
689
+ const error = new Error(
690
+ `Cannot find native binding. ` +
691
+ `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
692
+ 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
693
+ )
694
+ // assign instead of the `new Error(message, { cause })` options form,
695
+ // which Node < 16.9 silently ignores
696
+ error.cause = createLoadErrorChain(loadErrors)
697
+ throw error
698
+ }
699
+ throw new Error(`Failed to load native binding`)
700
+ }
701
+
702
+ module.exports = nativeBinding
703
+ module.exports.compressBuffers = nativeBinding.compressBuffers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@medicomind/rolldown-compression",
3
- "version": "2.1.6",
3
+ "version": "2.1.8",
4
4
  "description": "Fast native (Rust) gzip / brotli / zstd compression plugin for Rolldown, powered by napi-rs",
5
5
  "keywords": [
6
6
  "rolldown",
@@ -91,18 +91,20 @@
91
91
  "rolldown": "^1.0.0"
92
92
  },
93
93
  "optionalDependencies": {
94
- "@medicomind/rolldown-compression-darwin-arm64": "2.1.6",
95
- "@medicomind/rolldown-compression-darwin-x64": "2.1.6",
96
- "@medicomind/rolldown-compression-linux-arm64-gnu": "2.1.6",
97
- "@medicomind/rolldown-compression-linux-x64-gnu": "2.1.6",
98
- "@medicomind/rolldown-compression-linux-x64-musl": "2.1.6",
99
- "@medicomind/rolldown-compression-wasm32-wasi": "2.1.6",
100
- "@medicomind/rolldown-compression-win32-x64-msvc": "2.1.6"
94
+ "@medicomind/rolldown-compression-darwin-arm64": "2.1.8",
95
+ "@medicomind/rolldown-compression-darwin-x64": "2.1.8",
96
+ "@medicomind/rolldown-compression-linux-arm64-gnu": "2.1.8",
97
+ "@medicomind/rolldown-compression-linux-x64-gnu": "2.1.8",
98
+ "@medicomind/rolldown-compression-linux-x64-musl": "2.1.8",
99
+ "@medicomind/rolldown-compression-wasm32-wasi": "2.1.8",
100
+ "@medicomind/rolldown-compression-win32-x64-msvc": "2.1.8"
101
101
  },
102
102
  "devDependencies": {
103
103
  "@biomejs/biome": "^2.5.3",
104
104
  "@changesets/changelog-github": "^0.7.0",
105
105
  "@changesets/cli": "^2.31.0",
106
+ "@emnapi/core": "2.0.0-alpha.3",
107
+ "@emnapi/runtime": "2.0.0-alpha.3",
106
108
  "@napi-rs/cli": "^3.7.2",
107
109
  "@napi-rs/wasm-runtime": "^1.1.6",
108
110
  "@types/node": "^26.1.1",