Skip to content

ESB64 v1.1.0 - ESPACK-accelerated native base64 lane

Choose a tag to compare

@thelabcorner thelabcorner released this 08 Aug 20:08
· 9 commits to master since this release

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 (+ minified ESB64.accel.min.jsx, banner preserved): self-extracting single-file bundle in the espack "1 + n" model — the freestanding ESB64Native.dll (9,728 B) is embedded as base64, unpacked once per system into %LOCALAPPDATA%\espack\, and btoa/atob (plus encodeLatin1/decodeLatin1) swap to the native lane via ESPAK.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) and npm run native-build (clang+lld freestanding DLL, x86-64-v2, -O3 -flto, no CRT).
  • live-verify parity gate: npm run live-verify now 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 - 16 without validation; a foreign pointer or double-free corrupted the host heap (Illustrator access violations in ntdll heap code, observed live). espk_free now 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:0 on lld, /Brepro on the MSVC fallback), so npm run native-build produces byte-identical output every time. Rebuilds no longer trip espack's vendor drift guard, which compares DLL bytes. (espack's vendor/ESB64Native.dll refreshed to match.)
  • live-verify harness path — COM tool path updated to the current comtool/ location; ILLUSTRATOR_COM_TOOL env override supported, matching the eson/espack harnesses.

Performance

  • btoa 16,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×).
  • atob 48 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.jsx 203,920 → 73,528 B, minified 44,573 B.

Security

  • The accelerated bundle loads and executes a native DLL via ExternalObject — opt-in, and only after ESPAK.attach succeeds; 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.