ESB64 v1.1.0 - ESPACK-accelerated native base64 lane
v1.1.0 — 2026-08-08
SemVer: minor — adds the self-extracting accelerated bundle (a new, opt-in artifact); no existing API, artifact, or behavior changed for existing callers.
Gate: 411 Node assertions / WPT base64.json 80/80 / 144,000 differential fuzz checks vs V8 (0 divergences, seed 42) / 66/66 live-engine vectors in ES3 mode + 66/66 in native mode, byte-identical across modes, Illustrator 30.6.0. All green on this commit.
Added
ESB64.accel.jsx(+ minifiedESB64.accel.min.jsx, banner preserved): self-extracting single-file bundle in the espack "1 + n" model — the freestandingESB64Native.dll(9,728 B) is embedded as base64, unpacked once per system into%LOCALAPPDATA%\espack\, andbtoa/atob(plusencodeLatin1/decodeLatin1) swap to the native lane viaESPAK.attach, ES3-first with full fallback. See README → Performance → Native acceleration.npm run build:accel(builds + minifies the accel bundle via the adobe-extendscript-minification conservative pipeline) andnpm run native-build(clang+lld freestanding DLL, x86-64-v2,-O3 -flto, no CRT).- live-verify parity gate:
npm run live-verifynow runs the 66-vector WHATWG battery in both modes (--mode es3|native|both) and requires byte-identical results across modes.
Fixed
- Host-heap corruption on native returns — the first freestanding allocator wrote its free-list header at
p - 16without validation; a foreign pointer or double-free corrupted the host heap (Illustrator access violations in ntdll heap code, observed live).espk_freenow validates pool bounds + alignment and scans the free list — foreign pointers and double-frees are ignored no-ops (see README → Performance → Native acceleration).
Changed
- Deterministic native build — the DLL's PE timestamp is now fixed (
/timestamp:0on lld,/Breproon the MSVC fallback), sonpm run native-buildproduces byte-identical output every time. Rebuilds no longer trip espack's vendor drift guard, which compares DLL bytes. (espack'svendor/ESB64Native.dllrefreshed to match.) - live-verify harness path — COM tool path updated to the current
comtool/location;ILLUSTRATOR_COM_TOOLenv override supported, matching the eson/espack harnesses.
Performance
btoa16,384 units: ES3 16,272 µs → native 272 µs (59.8×, live, this release; README's 2026-08-07 measurement: 18.6 ms → 317 µs, 58.5×).atob48 K units: ES3 63,558 µs → native 846 µs (75.1×, live, this release; README: 66.8 ms → 957 µs, 69.8×).- DLL size: 107,520 B (MSVC) → 9,728 B freestanding (−91%);
ESB64.accel.jsx203,920 → 73,528 B, minified 44,573 B.
Security
- The accelerated bundle loads and executes a native DLL via
ExternalObject— opt-in, and only afterESPAK.attachsucceeds; any failure keeps the WHATWG-exact ES3 lane. NUL-bearing and non-ASCII payloads never cross the string boundary (kTypeString truncates at NUL, verified live): they are dispatched to the ES3 lane, so the native lane cannot corrupt or truncate them (README → Performance → Native acceleration, "Parity contract").
Compatibility
- No change: the pure-ES3 bundles, hosts, and Node ≥ 18 tooling are untouched; the accelerated bundle is Windows x64 for the native lane with the full ES3 fallback everywhere else.
Release deliverables
| Deliverable | Purpose |
|---|---|
ESB64.accel.jsx |
Self-extracting accelerated bundle — the new single-file production artifact |
ESB64.accel.min.jsx |
Minified accel bundle (banner preserved) |
ESB64Native.dll |
The freestanding WHATWG-exact accelerator DLL (9,728 B) — for embedding into your own espack bundles |
ESB64.jsx |
Full-facade ES3 bundle (all lanes, capabilities, install, benchmark) |
vendor-esb64.js |
Drop-in vendor, gap-fills the globals |
vendor-esb64-runtime.js |
15.8 KB atob/btoa-only runtime for per-eval injection |
esb64-core.esm.mjs |
ESM core for Node/testing |
License: GPL-3.0-or-later.