Files
insomnia/examples
Jack Kavanagh a91f1056f3 feat(templating): seed ambient sandbox stdlib globals — Buffer/process/crypto/URL (M2) (#10220)
* feat(templating): seed ambient sandbox stdlib globals (M2)

Add always-present, ungated safe-equivalent globals to the QuickJS sandbox:
Buffer (from/alloc/concat/isBuffer + utf8/base64/hex/latin1), a frozen
process stub (platform/arch from the envelope, empty frozen env, microtask
nextTick), Web-Crypto crypto.getRandomValues + crypto.subtle.digest
(host-backed), and URL/URLSearchParams. Lives in sandbox-globals.ts, eval'd
after the bootstrap + host-crypto installs.

Because the sandbox now provides a process stub, the old
'typeof process === undefined' sandbox-detection heuristic no longer holds;
add a non-writable INSOMNIA_TEMPLATE_SANDBOX marker and switch the canary +
demo probe to it.

- +19 unit parity tests vs node: Buffer/subtle/URL/URLSearchParams/getRandomValues + escape + marker
- e2e: stdlibprobe renders each API; flag-off captured and asserted byte-identical
  under the flag (parity), subtle pinned to a known hash, process.env '{}' + frozen sandbox-only
- smoke helpers wait for modal close + poll the post-toggle canary (re-open until
  the flag propagates), de-flaking the mid-test toggle
- demo plugin gains a stdlibprobe tag

require() module wrappers (url/buffer/util/querystring/string_decoder/assert)
are the M2b follow-up; they mostly re-export these globals.

* test(sandbox): pass M2 global-probe values as tag args, not interpolated code

CodeQL flagged the runGlobal test helper for constructing eval'd plugin
source from interpolated values. Make body a constant literal at every call
site and thread dynamic values through the tag's args (envelope data, read as
arguments[1..]) so no test value is concatenated into sandbox-eval'd code.

* fix(sandbox): enforce WebCrypto 65536-byte quota in getRandomValues + review nits

- getRandomValues now throws past 65536 bytes (matching WebCrypto's
  QuotaExceededError) instead of silently zero-filling the tail beyond the
  host __cryptoRandomBytes clamp — no predictable output.
- Correct the enableSandbox comment: assertions are expect.soft (mandated by
  the smoke ESLint config); the authoritative flag-applied signal is the
  downstream polling canary.
- Fix a doc-comment typo: typeof process === "undefined" (quoted).

* fix(sandbox): M2 stdlib parity fixes + bridge hardening (#10224)

* fix(sandbox): plumb host arch into process stub

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sandbox): add crypto.randomUUID to ambient web crypto

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sandbox): URLSearchParams.set keeps first occurrence

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sandbox): support URLSearchParams copy-construct

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sandbox): guard bridge dispatch against inherited keys

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(sandbox): hide raw host bridge from plugin code

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* fix(lint): fixed linting issue

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: kwburns-kong <kyle.burns@konghq.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 04:16:43 +00:00
..