Commit Graph
341 Commits
Author SHA1 Message Date
LongYinan d907346d1d chore(deps): update dependency @napi-rs/cli to ^3.10.8 2026-10-06 17:56:26 +08:00
renovate[bot] 22926d9e3e chore(deps): update dependency oxfmt to ^0.72.0 (#1221)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-10-06 17:55:56 +08:00
LongYinanandDevin fe73c75332 feat!: redesign bcrypt API while preserving stored hash verification (#1207)
* feat!: redesign bcrypt creation API and narrow Argon2 verification options

* chore: keep major API changes scoped to bcrypt

* fix(bcrypt): preserve Node 10 and 12 runtime compatibility

* fix(bcrypt): support cancellation without global AbortController

* fix(bcrypt): polish the 2.0 API and packaging before release

- Settle the public Promise before removing the abort listener, and remove
  it with the same options, so throwing or capture-flag EventTargets cannot
  hang a call or leak the listener.
- Keep signal.reason as a non-enumerable AbortError cause, so callers can
  tell a TimeoutError or custom reason apart.
- Throw TypeError for option values of the wrong type and keep RangeError
  for out-of-range or malformed values.
- Copy only the 72 password bytes bcrypt reads for async work, and wipe
  those copies on drop; replace the unreachable!() salt branch.
- Declare package exports so internal files cannot be deep-imported.
- Stop declaring the WASI package as an optional dependency, so installs do
  not pull it and a missing native binary fails loudly.
- Leave the version bump to the release step, add the 2.0.0 changelog, and
  preapprove this repo's own @node-rs/* packages.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* test(bcrypt): keep the event loop alive while waiting for AbortSignal.timeout

AbortSignal.timeout() uses a timer that does not keep the event loop
alive, and the controlled backend has no native work that would. The
test passed only when other tests kept the worker busy, and failed with
"Promise returned by test never resolved" on the Linux and WASI jobs.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* chore: resolve bcrypt-previous from the registry

With the bcrypt workspace back at 1.10.9, yarn's transparent workspaces
link bcrypt-previous (npm:@node-rs/bcrypt@1.10.9) to the workspace
itself whenever the lockfile is regenerated, so the previous-release
tests would compare the new code with itself. No workspace depends on
another, so only the workspace: protocol needs to link workspaces.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* chore(bcrypt): regenerate bindings with @napi-rs/cli 3.10.5

main moved @napi-rs/cli from 3.9.0 to 3.10.5. Regenerate the bcrypt
loaders and type declarations from native and wasm32-wasip1-threads
builds so the committed files match what the release build produces.
binding.js still parses as ES2019 for Node 10 and 12.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(bcrypt): keep custom signal errors from breaking settled or aborted calls

A signal whose removeEventListener throws made a successful call raise an
unhandled rejection, which exits modern Node, and on abort it skipped the
native cancellation. A signal whose reason getter throws stopped the abort
listener before it settled, so the call stayed pending or resolved after
the abort. Ignore cleanup failures once the call has settled, and read the
optional reason defensively.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat(bcrypt): add parseOptions and Node-style error codes for 2.0

Bundle two more contract changes into the 2.0 break so the error and
rehash-on-login story is complete at release:

- Thrown errors carry Node-style codes: TypeError ERR_INVALID_ARG_TYPE,
  RangeError ERR_OUT_OF_RANGE (including native InvalidArg translations),
  and AbortError ABORT_ERR, matching Node's own AbortError.
- parseOptions(hash) returns { version, cost } through the verifier's
  parser (bcrypt::HashParts), so every hash verify accepts is parseable,
  including +4 costs and imported 2x labels; hashes verify always rejects
  throw RangeError. Mirrors argon2's parseOptions in this repo.
- AbortSignalLike.removeEventListener declares the options argument the
  adapter actually passes.
- Drop unused blowfish and quickcheck dependencies from the bcrypt crate
  and the workspace.

Native and wasm32-wasip1-threads bindings are regenerated. api.cjs still
parses as ES2019 for Node 10 and 12.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix(bcrypt): tidy parseOptions review nits

- Use one options type for add/removeEventListener on AbortSignalLike,
  matching the comment that the same object is passed to both.
- Give parseOptions its own arity message; it never had positional
  options to drop.
- Cover the 60-byte non-ASCII parser branch in the test, which the
  previous 61-byte input missed.
- Mention in the README that parseOptions throws for hashes verify
  always rejects.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat(bcrypt): give the backend contract error a code

A stale platform package now fails at import time with
code ERR_BCRYPT_INCOMPATIBLE_BINARY, so every error the package throws
sits inside the documented ErrorCode contract.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* feat(bcrypt): switch hashing backend to bcrypt-rust

Replace the bcrypt 0.19 dependency with bcrypt-rust 1.0, keeping the crate
name so imports stay valid. The new crate is a drop-in for every API used
here except one deliberate difference: its HashParts parser is strict and
rejects the noncanonical '+4' cost spelling the old backend accepted.

Verify and parseOptions now use a lenient parser that mirrors the old
backend byte-for-byte (60 ASCII bytes, 2a/2b/2x/2y markers, u32::parse for
cost), then hand the canonicalized hash to bcrypt::verify so the cost gate
and constant-time compare stay in the library.

~20% faster than the C++ backend on hash and verify.

* bench: make benchmark comparisons 1:1 and migrate argon2 to tinybench

bcrypt: uniform call signatures via per-impl adapters, a fixed salt so the
hash suite measures hashing only, a real sync compare for verify (it
previously timed an unawaited async call with a hash inside the loop), one
cost across suites, all five implementations in every suite, and a compact
sorted table with latency, rme, ops/s, and a ratio to the baseline.

argon2: replace the hand-rolled performance.now() harness with tinybench
fixed-iteration runs, keep the per-iteration tag assertion and the
native-sync / native-async / js-wasm grouping, and adopt the same report
format.

* bench: narrow tinybench TaskResult before reading stats

TaskResult is a discriminated union; latency/throughput exist only on
completed and aborted-with-statistics. CI type-checks benchmark files
through packages/argon2/tsconfig.json, unlike oxnode which strips types.

* perf(bcrypt): fast-path genSaltSync options; note wasm salt overhead in bench comment

genSaltSync previously ran every call through options() + creation(),
allocating a fresh Object.create(null) copy even for {} and {cost}. Now
undefined uses a frozen empty options object and reusable options shapes
validate in place — identical error paths preserved for non-plain or
extra-key objects. Saves ~200ns of JS wrapper overhead per call.

* deps: bump bcrypt-rust to 1.0.1

Picks up the crypt_blowfish fused-round kernel shape
(Brooooooklyn/bcrypt-rust@f65cd90): bcrypt() at cost 10 on x86_64
drops ~19% (138.2ms -> 112.6ms vs vendored C at 108.7ms); arm64
unchanged.

* perf(bcrypt): cut genSaltSync overhead; pool OS entropy per thread

genSaltSync now serves 16-byte salts from a 256-byte thread-local pool
refilled by SysRng (direct getrandom), amortizing one syscall over 16
salts without any userspace PRNG in between. The salt string is built
without format! machinery and the bcrypt base64 engine is constructed
once in a LazyLock instead of per call.

api.cjs gains a specialized fast path for the {cost,version} shapes:
getOwnPropertyNames/getOwnPropertySymbols cover the same key space as
Reflect.ownKeys at half the cost, the sync() closure is inlined, and
anything the fast path cannot prove valid funnels into a shared full-
validation path so error types, codes, and messages stay identical.

x86_64 sandbox (30k-iteration amortized loop, best of reps):
  @node-rs/bcrypt ~380-560ns vs wasm OpenBSD ~550-730ns
  per-call min: 210-250ns vs 320-370ns; bench.js min 290ns vs 860ns.

* deps: bump bcrypt-rust to 1.0.2

Picks up the xor_late asm boundary (Brooooooklyn/bcrypt-rust#8): LLVM no
longer reassociates the fused round into two serial xors after the S-box
loads. On x86_64 EPYC the raw kernel now beats crypt_blowfish C
(~54.6ms vs ~54.9ms at cost 10) and JS hashSync/verifySync beat node
bcrypt (C++); arm64/wasm32 untouched via cfg fallback. CodSpeed: -4% on
all single-hash benches.

---------

Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-05 23:33:58 +08:00
renovate[bot] c118471ee5 chore(deps): update dependency oxfmt to ^0.71.0 (#1218)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-28 23:11:32 +00:00
renovate[bot] c14dee27cb chore(deps): update yarn to v4.18.1 (#1217)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-25 02:12:16 +00:00
renovate[bot] 84d621a480 chore(deps): update dependency oxfmt to ^0.70.0 (#1216)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-21 20:14:31 +00:00
renovate[bot] 20cce721bb chore(deps): update dependency oxfmt to ^0.68.0 (#1211)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-14 14:06:58 +00:00
renovate[bot] e692dfad3f chore(deps): update dependency oxfmt to ^0.67.0 (#1203)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-07 22:23:26 +00:00
renovate[bot] 1f53bf3ffb chore(deps): update dependency oxfmt to ^0.66.0 (#1198)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-09-01 16:44:17 +00:00
renovate[bot] fa77f2849e chore(deps): update dependency oxfmt to ^0.65.0 (#1194)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-25 04:34:43 +00:00
renovate[bot] 635e750eb0 chore(deps): update dependency oxfmt to ^0.64.0 (#1191)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-18 16:20:03 +00:00
LongYinan 1933745e96 chore: upgrade all npm deps (#1187)
* chore: upgrade all npm deps

* fix: update tsconfig for TypeScript 7

Remove deprecated downlevelIteration and importsNotUsedAsValues options,
and explicitly include node types required by TypeScript 7.

* fix: download test artifacts into package dirs

@napi-rs/cli 3.8 requires all configured targets when running
napi artifacts. Test jobs only have one platform, so download
bindings directly into the workspace like the package template.

* fix: download bindings into packages/ for tests

upload-artifact uses packages/ as the common root, so the artifact
contains argon2/*.node not packages/argon2/*.node. Download into
packages/ so binaries land where the loaders expect them.

* fix: add WASI .d.cts files required by @napi-rs/cli 3.8

napi artifacts now requires a complete WASI loader set including
*.wasi.d.cts. Also upload the full WASI support files from the wasm
build job for the publish path.

* fix: upload only wasm artifacts from WASI builds

WASI loaders and types stay committed in the repo and updated with
the codegen; CI only needs the built .wasm binaries.
2026-08-12 23:51:31 +08:00
renovate[bot] 284ee7075c chore(deps): update dependency oxfmt to ^0.63.0 (#1186)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-10 15:44:44 +00:00
renovate[bot] 54d5564d81 chore(deps): update dependency oxfmt to ^0.62.0 (#1183)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-08-03 13:20:02 +00:00
renovate[bot] 23aad38c4d chore(deps): update yarn to v4.18.0 (#1180)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-29 11:06:25 +00:00
renovate[bot] bf48de0466 chore(deps): update dependency oxfmt to ^0.61.0 (#1179)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-27 19:11:14 +00:00
renovate[bot] 07c7d14dd3 chore(deps): update dependency oxfmt to ^0.60.0 (#1174)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-21 23:56:06 +00:00
renovate[bot] 3c9ac9a5d4 chore(deps): update dependency oxfmt to ^0.59.0 (#1170)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-14 08:52:08 +00:00
renovate[bot] be829c4f6e chore(deps): update yarn to v4.17.1 (#1164)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-08 20:21:34 +00:00
renovate[bot] 84a2950255 chore(deps): update dependency oxfmt to ^0.58.0 (#1163)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-07-07 03:59:29 +00:00
renovate[bot] 6bf7127185 chore(deps): update dependency oxfmt to ^0.57.0 (#1160)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-30 03:39:02 +00:00
renovate[bot] c971c7d04f chore(deps): update dependency oxfmt to ^0.56.0 (#1157)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-22 18:17:37 +00:00
renovate[bot] ac62938458 chore(deps): update dependency oxfmt to ^0.55.0 (#1154)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-16 14:47:12 +00:00
renovate[bot] 618ee1b41d chore(deps): update dependency @emnapi/wasi-threads to v2 (#1149)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-16 22:30:32 +08:00
renovate[bot] d1f42811fe chore(deps): update dependency npm-run-all2 to v9 (#1137)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-15 22:00:18 +08:00
renovate[bot] 769c4dde01 chore(deps): update yarn monorepo to v4.17.0 (#1153)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-15 11:03:17 +00:00
renovate[bot] 6ebb41eefd chore(deps): update dependency oxfmt to ^0.54.0 (#1150)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-08 17:11:16 +00:00
renovate[bot] b40d786973 chore(deps): update yarn monorepo to v4.16.0 (#1148)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-06 11:35:54 +00:00
renovate[bot] b1fd4ff213 chore(deps): update dependency oxfmt to ^0.53.0 (#1146)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-06-01 21:54:02 +00:00
renovate[bot] f440c1c161 chore(deps): update dependency oxfmt to ^0.52.0 (#1143)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-26 09:14:57 +00:00
renovate[bot] 9f17b637c7 chore(deps): update yarn to v4.15.0 (#1139)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 02:25:32 +00:00
renovate[bot] c023a0a3ad chore(deps): update dependency oxfmt to ^0.51.0 (#1138)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-19 11:50:41 +00:00
renovate[bot] 03e4842db0 chore(deps): update dependency oxfmt to ^0.50.0 (#1134)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-15 17:09:25 +00:00
renovate[bot] 4234029812 chore(deps): update dependency oxfmt to ^0.49.0 (#1133)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-11 21:52:29 +00:00
renovate[bot] 7b2b3e8fee chore(deps): update dependency lint-staged to v17 (#1129)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-11 10:45:02 +08:00
renovate[bot] 4160ef5818 chore(deps): update dependency oxfmt to ^0.48.0 (#1128)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-05 16:22:49 +00:00
renovate[bot]andanthropic-code-agent[bot] c364489587 chore(deps): lock file maintenance (#1127)
* chore(deps): lock file maintenance

* chore(deps): update emnapi packages to latest (1.10.0)

Agent-Logs-Url: https://github.com/napi-rs/node-rs/sessions/eec16a0a-460d-4520-bf79-83494a584b1a

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: anthropic-code-agent[bot] <242468646+Claude@users.noreply.github.com>
2026-05-04 11:47:54 +08:00
1295b2d5ef chore(deps): update dependency ava to v8 (#1123)
* chore(deps): update dependency ava to v8

* fix: update ava v8 configuration and Node.js requirements

- Change ava extensions config from object to array format for v8
- Update CI Node.js version matrix from ['20', '22', '24'] to ['22', '24']
- Ava v8 requires Node.js >= 22.20 due to iterator helper methods

Agent-Logs-Url: https://github.com/napi-rs/node-rs/sessions/8e1e8303-351c-476e-9f4d-3d39ff8d992e

* fix: remove sse4_crc32 dependency incompatible with Node.js 24

- Remove sse4_crc32 and @types/sse4_crc32 from crc32 package dependencies
- Update crc32 benchmark to exclude sse4_crc32 comparisons
- sse4_crc32 v7.0.0 lacks prebuilt binaries for Node.js 24 (ABI v137)
- Bench CI now passes on Node.js 24

Agent-Logs-Url: https://github.com/napi-rs/node-rs/sessions/1b2c25e3-3d62-43a9-bc72-9f521bb287a4

* fix: remove nodejieba dependency incompatible with Node.js 24

Agent-Logs-Url: https://github.com/napi-rs/node-rs/sessions/bd608fb3-0247-49b5-9740-224f9847e188

* fix: remove xxhash dependency incompatible with Node.js 24

The xxhash npm package v0.3.0 does not have prebuilt binaries for Node.js 24 (ABI version 137), causing benchmark failures with "Cannot find module '../build/Release/hash'" errors.

Removed xxhash from devDependencies and updated benchmark/xxhash.ts to run benchmarks without the xxhash C++ comparison. The benchmark still includes comparisons with xxhash-addon, xxhashjs, and webpack's wasm implementation.

This follows the same pattern used for sse4_crc32 and nodejieba dependencies.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* fix: exclude Node.js 24 from armv7 test matrix

The armv7-unknown-linux-gnueabihf platform doesn't have Node.js 24 docker images available. Restrict testing to Node.js 22 only for this platform.

Agent-Logs-Url: https://github.com/napi-rs/node-rs/sessions/cee7816f-b688-4ae5-af92-6f51d48c387c

Co-authored-by: Brooooooklyn <3468483+Brooooooklyn@users.noreply.github.com>

---------

Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: anthropic-code-agent[bot] <242468646+Claude@users.noreply.github.com>
Co-authored-by: Claude Sonnet 4.5 <noreply@anthropic.com>
Co-authored-by: Brooooooklyn <3468483+Brooooooklyn@users.noreply.github.com>
2026-04-29 17:56:57 +08:00
renovate[bot] f65572559f chore(deps): update dependency oxfmt to ^0.47.0 (#1122)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-27 14:44:18 +00:00
renovate[bot] 32fc9d12f2 chore(deps): update dependency oxfmt to ^0.46.0 (#1121)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-20 20:53:33 +00:00
renovate[bot] 0c7a13f40a chore(deps): update yarn to v4.14.1 (#1119)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-17 09:02:42 +00:00
renovate[bot] e2410e51c4 chore(deps): update yarn to v4.14.0 (#1118)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-16 20:25:48 +00:00
renovate[bot] c0fd9fb32b chore(deps): update dependency oxfmt to ^0.45.0 (#1116)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-13 12:45:43 +00:00
renovate[bot] 8bdc01f075 chore(deps): update dependency oxfmt to ^0.44.0 (#1111)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-04-07 05:36:19 +00:00
renovate[bot] ed70e49720 chore(deps): update dependency oxfmt to ^0.43.0 (#1105)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-31 14:18:54 +00:00
renovate[bot] 1237611e4c chore(deps): update dependency oxfmt to ^0.42.0 (#1101)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-24 13:35:51 +00:00
renovate[bot] ec6d659398 chore(deps): update yarn to v4.13.0 (#1097)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-19 17:17:38 +00:00
renovate[bot] dc4b2a4dc5 chore(deps): update dependency oxfmt to ^0.41.0 (#1096)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-16 13:58:05 +00:00
renovate[bot] 3a893e0e1f chore(deps): update dependency oxfmt to ^0.40.0 (#1094)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-12 17:54:22 +00:00
renovate[bot] 7efad3afb0 chore(deps): update dependency oxfmt to ^0.39.0 (#1093)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-03-12 09:05:33 +00:00