Security

Read-Only Guarantee

Expressions cannot assign variables, mutate the context, or produce side effects:

  • Assignment operators (=, +=, -=, ++, --) are rejected at the parser level

  • Mutating methods (.push(), .pop(), .splice(), .sort(), .reverse(), .shift(), .unshift()) are excluded from the method whitelist

  • Block-body arrows (x => { ... }) are rejected — no variable declarations or multi-statement logic

  • Context serialization — variables are serialized into the Worker's separate V8 heap, so even if an escape is found, mutations cannot propagate back to session state

Blocked Globals

Blocked Globals means that an expression or script cannot access global variables, global objects, or ambient system state. Only explicitly provided inputs are available.

  • eval, Function — Code execution

  • require, import — Module loading

  • process, global, globalThis — Node.js internals

  • setTimeout, setInterval — Async operations

  • fetch, XMLHttpRequest — Network access

  • console — Side effects

  • Proxy, Reflect — Meta-programming

Protections

Protections are the enforced safeguards that ensure expressions remain safe, predictable, and non‑abusive, even when they come from untrusted sources. They define what an expression is allowed to do, what it can never do, and how far it is allowed to go.

  • Think of protections as the guardrails around the expression engine.

  • Worker Isolation: Each expression runs in a separate V8 isolate

  • Hard Timeout: worker.terminate() kills hung expressions

  • Memory Limits: Worker heap size capped at 64MB (configurable)

  • Size Limits: Context, result, string, and array sizes enforced

  • Prototype Blocking: No access to __proto__, constructor, prototype

  • Auto-Recovery: Crashed workers are automatically replaced

Last updated

Was this helpful?