@poe-platform/safe-js 0.1.720 → 0.1.722

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +50 -7
  2. package/dist/config-mutations/types.d.ts +3 -1
  3. package/dist/safe-js/chunks/{chunk-B2SQLK4O.js → chunk-3QQYJ4RQ.js} +3 -2
  4. package/dist/safe-js/chunks/chunk-3QQYJ4RQ.js.map +7 -0
  5. package/dist/safe-js/chunks/{chunk-OP3H3ZDN.js → chunk-55RIIUGG.js} +23 -7
  6. package/dist/safe-js/chunks/chunk-55RIIUGG.js.map +7 -0
  7. package/dist/safe-js/chunks/{chunk-NJM2Q74Z.js → chunk-7SBQ7WTV.js} +10 -11
  8. package/dist/safe-js/chunks/chunk-7SBQ7WTV.js.map +7 -0
  9. package/dist/safe-js/chunks/{chunk-KP6I45ET.js → chunk-BNIEPGDU.js} +9885 -8523
  10. package/dist/safe-js/chunks/{chunk-KP6I45ET.js.map → chunk-BNIEPGDU.js.map} +4 -4
  11. package/dist/safe-js/chunks/{chunk-HYD4K4HN.js → chunk-D3GC5QPZ.js} +63 -1
  12. package/dist/safe-js/chunks/chunk-D3GC5QPZ.js.map +7 -0
  13. package/dist/safe-js/chunks/{chunk-KK5NCR5R.js → chunk-EH5A2EQI.js} +501 -150
  14. package/dist/safe-js/chunks/chunk-EH5A2EQI.js.map +7 -0
  15. package/dist/safe-js/chunks/{chunk-APKV5Y6T.js → chunk-FA5CQO6V.js} +2 -2
  16. package/dist/safe-js/chunks/{chunk-RML35GIF.js → chunk-GCOLKRMY.js} +4 -4
  17. package/dist/safe-js/chunks/{chunk-U6KZ2DQ2.js → chunk-K3ZRBAG5.js} +3 -3
  18. package/dist/safe-js/chunks/{chunk-BGJXQN4A.js → chunk-QL2ALAE6.js} +4 -4
  19. package/dist/safe-js/chunks/{chunk-IDQ67DY2.js → chunk-RYVHEOHM.js} +1131 -101
  20. package/dist/safe-js/chunks/chunk-RYVHEOHM.js.map +7 -0
  21. package/dist/safe-js/chunks/{chunk-A7CADQAD.js → chunk-S2GFVXSI.js} +3 -3
  22. package/dist/safe-js/chunks/{chunk-XMA6FOJU.js → chunk-WF7HYDJ4.js} +4 -5
  23. package/dist/safe-js/chunks/{chunk-XMA6FOJU.js.map → chunk-WF7HYDJ4.js.map} +2 -2
  24. package/dist/safe-js/chunks/{chunk-NEJ44T4Y.js → chunk-XHSOM5CG.js} +2 -2
  25. package/dist/safe-js/chunks/{cli-runtime-PO6DQDHP.js → cli-runtime-6QPGM3TX.js} +14 -14
  26. package/dist/safe-js/chunks/{dump-TRGFSCJ7.js → dump-TU6SYRFD.js} +4 -4
  27. package/dist/safe-js/chunks/{fs-4T5MZW5J.js → fs-HTZT32MQ.js} +4 -4
  28. package/dist/safe-js/chunks/harness-RYAMI444.js +10 -0
  29. package/dist/safe-js/chunks/mcp-DO2IRFGQ.js +11 -0
  30. package/dist/safe-js/chunks/migration-file-K7UH5ZG6.js +12 -0
  31. package/dist/safe-js/chunks/restore-7LRP4BM3.js +13 -0
  32. package/dist/safe-js/chunks/run-6SETM7SV.js +17 -0
  33. package/dist/safe-js/chunks/runtime-modules-MCQS2SHQ.js +10 -0
  34. package/dist/safe-js/cli.js +2 -2
  35. package/dist/safe-js/core.js +7 -7
  36. package/dist/safe-js/extensions.d.ts +3 -1
  37. package/dist/safe-js/index.js +14 -14
  38. package/dist/safe-js/interp/async.d.ts +4 -1
  39. package/dist/safe-js/interp/budget.d.ts +15 -6
  40. package/dist/safe-js/interp/collection-iterator.d.ts +1 -1
  41. package/dist/safe-js/interp/host-bridge.d.ts +1 -0
  42. package/dist/safe-js/interp/host-capabilities.d.ts +13 -4
  43. package/dist/safe-js/interp/interpreter.d.ts +5 -1
  44. package/dist/safe-js/interp/intl-numberformat.d.ts +2 -2
  45. package/dist/safe-js/interp/jobs.d.ts +8 -0
  46. package/dist/safe-js/interp/scope.d.ts +13 -3
  47. package/dist/safe-js/interp/typed-array.d.ts +5 -2
  48. package/dist/safe-js/interp/values.d.ts +1 -0
  49. package/dist/safe-js/modules/registry.d.ts +4 -1
  50. package/dist/safe-js/modules/source-graph.d.ts +19 -1
  51. package/dist/safe-js/parse/compact-spans.d.ts +18 -0
  52. package/dist/safe-js/parse/dynamic-source.d.ts +3 -1
  53. package/dist/safe-js/parse/function-source.d.ts +1 -1
  54. package/dist/safe-js/parse/parser.d.ts +8 -3
  55. package/dist/safe-js/parse/tokenizer.d.ts +4 -0
  56. package/dist/safe-js/realm.d.ts +17 -3
  57. package/dist/safe-js/restore.d.ts +1 -0
  58. package/dist/safe-js/run.d.ts +10 -0
  59. package/dist/safe-js/snapshot/guest-heap.d.ts +1 -0
  60. package/dist/toolcraft-design/prompts/primitives/note.d.ts +1 -1
  61. package/package.json +2 -2
  62. package/dist/safe-js/chunks/chunk-B2SQLK4O.js.map +0 -7
  63. package/dist/safe-js/chunks/chunk-HYD4K4HN.js.map +0 -7
  64. package/dist/safe-js/chunks/chunk-IDQ67DY2.js.map +0 -7
  65. package/dist/safe-js/chunks/chunk-KK5NCR5R.js.map +0 -7
  66. package/dist/safe-js/chunks/chunk-NJM2Q74Z.js.map +0 -7
  67. package/dist/safe-js/chunks/chunk-OP3H3ZDN.js.map +0 -7
  68. package/dist/safe-js/chunks/harness-DLEQ2Z3O.js +0 -10
  69. package/dist/safe-js/chunks/mcp-TNVEFJ6K.js +0 -11
  70. package/dist/safe-js/chunks/migration-file-IDIUFLKY.js +0 -12
  71. package/dist/safe-js/chunks/restore-P27AUZR2.js +0 -13
  72. package/dist/safe-js/chunks/run-KGAEHYMV.js +0 -17
  73. package/dist/safe-js/chunks/runtime-modules-KICK45EE.js +0 -10
  74. /package/dist/safe-js/chunks/{chunk-APKV5Y6T.js.map → chunk-FA5CQO6V.js.map} +0 -0
  75. /package/dist/safe-js/chunks/{chunk-RML35GIF.js.map → chunk-GCOLKRMY.js.map} +0 -0
  76. /package/dist/safe-js/chunks/{chunk-U6KZ2DQ2.js.map → chunk-K3ZRBAG5.js.map} +0 -0
  77. /package/dist/safe-js/chunks/{chunk-BGJXQN4A.js.map → chunk-QL2ALAE6.js.map} +0 -0
  78. /package/dist/safe-js/chunks/{chunk-A7CADQAD.js.map → chunk-S2GFVXSI.js.map} +0 -0
  79. /package/dist/safe-js/chunks/{chunk-NEJ44T4Y.js.map → chunk-XHSOM5CG.js.map} +0 -0
  80. /package/dist/safe-js/chunks/{cli-runtime-PO6DQDHP.js.map → cli-runtime-6QPGM3TX.js.map} +0 -0
  81. /package/dist/safe-js/chunks/{dump-TRGFSCJ7.js.map → dump-TU6SYRFD.js.map} +0 -0
  82. /package/dist/safe-js/chunks/{fs-4T5MZW5J.js.map → fs-HTZT32MQ.js.map} +0 -0
  83. /package/dist/safe-js/chunks/{harness-DLEQ2Z3O.js.map → harness-RYAMI444.js.map} +0 -0
  84. /package/dist/safe-js/chunks/{mcp-TNVEFJ6K.js.map → mcp-DO2IRFGQ.js.map} +0 -0
  85. /package/dist/safe-js/chunks/{migration-file-IDIUFLKY.js.map → migration-file-K7UH5ZG6.js.map} +0 -0
  86. /package/dist/safe-js/chunks/{restore-P27AUZR2.js.map → restore-7LRP4BM3.js.map} +0 -0
  87. /package/dist/safe-js/chunks/{run-KGAEHYMV.js.map → run-6SETM7SV.js.map} +0 -0
  88. /package/dist/safe-js/chunks/{runtime-modules-KICK45EE.js.map → runtime-modules-MCQS2SHQ.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/realm.ts", "../../src/modules/source-graph.ts", "../../src/random.ts", "../../src/snapshot/backend.ts", "../../src/snapshot/scheduler.ts", "../../src/snapshot/serialize.ts", "../../src/snapshot/replay-inputs.ts", "../../src/run.ts"],
4
- "sourcesContent": ["import {hashParsedAst} from \"./parse/hash.js\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { types } from \"node:util\";\nimport { guestProxyStates } from \"./interp/guest-proxy.js\";\nimport { callGuestProxy } from \"./interp/guest-proxy-call.js\";\nimport { sandboxGetProperty } from \"./interp/guest-proxy-get.js\";\nimport { invokeBuiltinClosure } from \"./interp/builtin-call.js\";\nimport { Budget, SandboxError } from \"./interp/budget.js\";\nimport { CompileScope } from \"./interp/regex/compile-guard.js\";\nimport { createBuiltinBindings } from \"./interp/globals.js\";\nimport { releaseObjectPrototype } from \"./interp/object-model.js\";\nimport { interpret, Scope, type InterpreterResult } from \"./interp/interpreter.js\";\nimport { attachExecutionControl, SandboxJobQueue, runAsyncPrefix, suspendJob, type ExecutionControl } from \"./interp/jobs.js\";\nimport { withCancellationSignal, awaitSandboxValue } from \"./interp/cancel.js\";\nimport { enterRunningState } from \"./interp/running-state.js\";\nimport { runResources, type RunResources } from \"./interp/resources.js\";\nimport {\n createSandboxPromiseRejectionTracker,\n withSandboxPromiseRejectionTracker\n} from \"./interp/promise-tracker.js\";\nimport {\n copyHostValueToSandbox,\n wrapCallerInjectedBindings,\n type CallerInjectedBinding,\n type HostBridgeOptions,\n type RealmBridge\n} from \"./interp/host-bridge.js\";\nimport {\n createLiveHostObject,\n createGuestReference,\n exportHostCapability,\n readGuestReference,\n readGuestCallback,\n registerGuestCallback,\n revokeGuestCallback,\n revokeHostObject,\n revokeGuestReference,\n type GuestReference,\n type HostObjectDefinition,\n type HostObject\n} from \"./interp/host-capabilities.js\";\nimport {\n deepCopyFromSandbox,\n isSandboxClosure,\n isSandboxPromise,\n measureSandboxData,\n reconcileCompiledValues,\n type SandboxClosure,\n type SandboxCallContext,\n type SandboxValue\n} from \"./interp/values.js\";\nimport {\n getExtensionSetup,\n readDataRecord,\n readStringList,\n type CallbackOptions,\n type CallbackInvocation,\n type ExtensionContext,\n type ExtensionExports,\n type HostOperation,\n type SafeJSExtension\n} from \"./extensions.js\";\nimport {SourceModuleGraph, type SourceResolver} from \"./modules/source-graph.js\";\nimport { createModuleEnvironment, resolveModuleImports, type ModuleRegistry } from \"./modules/registry.js\";\nimport { parseExecutableModule } from \"./parse/parser.js\";\nimport { createReplayableRandom } from \"./random.js\";\nimport { hashSource } from \"./parse/hash.js\";\nimport { describeThrownValue } from \"./error/shape.js\";\nimport { encodeReplayData } from \"./snapshot/replay-data.js\";\nimport type { ConsoleSink } from \"./interp/globals/console-json.js\";\nimport type { RunClock, RunOptions, RunResult } from \"./run.js\";\n\nexport type RealmLimits = {\n extensions?: number;\n hostObjects?: number;\n callbacks?: number;\n guestReferences?: number;\n cleanups?: number;\n nestedEvaluations?: number;\n};\nexport type RealmOptions = {\n sourceResolver?: SourceResolver;\n clock?: RunClock;\n bindings?: Record<string, CallerInjectedBinding>;\n modules?: ModuleRegistry;\n extensions?: readonly SafeJSExtension[];\n builtinOverrides?: { console?: string };\n grants?: readonly string[];\n budget?: Budget;\n signal?: AbortSignal;\n sink?: ConsoleSink;\n randomSeed?: number;\n limits?: RealmLimits;\n};\nexport type RealmResult =\n | (Omit<Extract<InterpreterResult, { ok: true }>, \"snapshot\" | \"returnValue\"> & {\n returnValue?: unknown;\n })\n | Omit<Extract<InterpreterResult, { ok: false }>, \"snapshot\">;\nexport type SafeJSRealm = ExecutionControl & {\n readonly extensions: readonly SafeJSExtension[\"manifest\"][];\n evaluate(source: string, options?: { filename?: string; sourceType?: \"module\" }): Promise<RealmResult>;\n startCallback(callback: unknown, options?: CallbackOptions): CallbackInvocation;\n invokeCallback(callback: unknown, options?: CallbackOptions): Promise<unknown>;\n releaseCallback(callback: unknown): void;\n releaseGuestReference(reference: unknown): void;\n close(): Promise<void>;\n};\n\ntype HostPhase = {\n active: boolean;\n extension?: SafeJSExtension;\n evaluating: boolean;\n pending: Set<Promise<void>>;\n failure?: { reason: unknown };\n};\ntype Callback = (...args: readonly unknown[]) => Promise<unknown>;\n\nclass RealmState {\n readonly budget: Budget;\n readonly lease: ReturnType<Budget[\"acquireCompileOwner\"]>;\n readonly compilation: CompileScope;\n readonly controller = new AbortController();\n readonly phase = new AsyncLocalStorage<HostPhase>();\n readonly queue: SandboxJobQueue;\n readonly tracker = createSandboxPromiseRejectionTracker();\n readonly bridge: RealmBridge;\n readonly limits: Required<RealmLimits>;\n readonly extensions: readonly SafeJSExtension[];\n readonly consoleExtension?: string;\n readonly cleanups: Array<() => void | Promise<void>> = [];\n readonly referenceReleases = new Set<() => void>();\n readonly resources: RunResources;\n readonly callbacks = new Map<Callback, SandboxClosure>();\n readonly pendingCallbacks = new Set<{ closure: SandboxClosure; promise?: Promise<unknown> }>();\n readonly callbackCache = new WeakMap<SandboxClosure, Callback>();\n readonly hostObjects = new Set<HostObject>();\n readonly guestReferences = new Map<GuestReference, [SandboxValue]>();\n readonly retainedOperations = new WeakMap<\n HostOperation,\n { from: number; extension: SafeJSExtension }\n >();\n readonly nestedOperations = new WeakMap<HostOperation, SafeJSExtension>();\n readonly convertedModules = new Map<string, Record<string, SandboxValue>>();\n readonly nativeConversions = { seen: new WeakMap<object, SandboxValue>() };\n readonly modules: Record<string, Record<string, CallerInjectedBinding>>;\n readonly globals: Record<string, CallerInjectedBinding>;\n readonly builtinBindings: ReturnType<typeof createBuiltinBindings>;\n scope?: Scope;\n sourceGraph?: SourceModuleGraph;\n sourceModuleHash?: string;\n active?: Promise<unknown>;\n disposal?: Promise<void>;\n closed = false;\n initialized = false;\n nestedDepth = 0;\n failure?: { reason: unknown };\n\n constructor(readonly options: RealmOptions, queue = new SandboxJobQueue()) {\n this.queue = queue;\n const limitInput = readDataRecord(options.limits ?? {}, \"Realm limits\");\n this.limits = {\n extensions: 32,\n hostObjects: 1024,\n callbacks: 1024,\n guestReferences: 1024,\n cleanups: 1024,\n nestedEvaluations: 16\n };\n for (const [name, value] of Object.entries(limitInput)) {\n if (!Object.hasOwn(this.limits, name) || !Number.isSafeInteger(value) || Number(value) < 1)\n throw new TypeError(\"Realm limits must be positive safe integers with supported names.\");\n this.limits[name as keyof RealmLimits] = Number(value);\n }\n if (\n options.extensions !== undefined &&\n (!Array.isArray(options.extensions) || types.isProxy(options.extensions))\n )\n throw new TypeError(\"Extensions must be a registration array.\");\n const registrations = options.extensions ?? [];\n const extensions: SafeJSExtension[] = [];\n if (registrations.length > this.limits.extensions)\n throw new RangeError(\"Realm extension limit exceeded.\");\n for (let index = 0; index < registrations.length; index++) {\n const descriptor = Object.getOwnPropertyDescriptor(registrations, String(index));\n if (descriptor === undefined || !(\"value\" in descriptor))\n throw new TypeError(\"Extension registrations require data properties, not accessors.\");\n extensions.push(descriptor.value);\n }\n if (Reflect.ownKeys(registrations).length !== extensions.length + 1)\n throw new TypeError(\"Extension registrations have unsupported fields.\");\n this.extensions = Object.freeze(extensions);\n if (this.extensions.length > this.limits.extensions)\n throw new RangeError(\"Realm extension limit exceeded.\");\n this.globals = readDataRecord(options.bindings ?? {}, \"Realm bindings\") as Record<\n string,\n CallerInjectedBinding\n >;\n this.modules = readModules(options.modules);\n const grants = new Set(readStringList(options.grants ?? [], \"Realm grants\"));\n for (const extension of this.extensions) getExtensionSetup(extension);\n const overrides = readDataRecord(options.builtinOverrides === undefined ? {} : options.builtinOverrides, \"Builtin overrides\");\n for (const [name, extensionName] of Object.entries(overrides)) {\n if (name !== \"console\" || typeof extensionName !== \"string\" || extensionName.length === 0 || extensionName.length > 256)\n throw new TypeError(\"Builtin overrides only supports console with a nonempty extension name.\");\n if (!this.extensions.some(extension => extension.manifest.name === extensionName && extension.manifest.globals?.includes(name)))\n throw new TypeError(\"Console override requires a registered extension declaring console.\");\n this.consoleExtension = extensionName;\n }\n this.budget = options.budget ?? new Budget({ maxCallDepth: 1000 });\n this.lease = this.budget.acquireCompileOwner(true);\n this.compilation = new CompileScope(this.lease.owner);\n this.bridge = {\n owner: this,\n assertActive: this.assertOpen,\n wrapCallback: this.wrapCallback,\n captureArguments: this.captureArguments,\n invoke: this.invokeHost,\n awaitResult: (operation) => this.nestedOperations.has(operation)\n };\n this.resources = {\n signal: this.controller.signal,\n referenceReleases: this.referenceReleases,\n add: this.onCleanup,\n reportError: reason => this.poison(reason)\n };\n try {\n this.builtinBindings = createBuiltinBindings({\n budget: this.budget,\n compileOwner: this.lease.owner,\n sink: options.sink,\n clock: options.clock,\n random: createReplayableRandom({ seed: options.randomSeed }).next\n });\n const names = new Set<string>();\n const globals = new Set([\n ...Object.keys(this.builtinBindings).filter(name => name !== \"console\" || this.consoleExtension === undefined),\n ...Object.keys(this.globals)\n ]);\n const modules = new Map(\n Object.entries(this.modules).map(([name, exports]) => [name, new Set(Object.keys(exports))])\n );\n for (const extension of this.extensions) {\n const manifest = extension.manifest;\n if (names.has(manifest.name))\n throw new TypeError(`Duplicate extension '${manifest.name}'.`);\n names.add(manifest.name);\n for (const capability of manifest.capabilities ?? []) {\n if (!grants.has(capability))\n throw new TypeError(`Missing grant '${capability}' for extension '${manifest.name}'.`);\n }\n for (const name of manifest.globals ?? []) {\n if (name === \"console\" && this.consoleExtension !== undefined && manifest.name !== this.consoleExtension)\n throw new TypeError(`Conflicting global 'console': replacement is authorized only for '${this.consoleExtension}'.`);\n if (globals.has(name)) throw new TypeError(`Conflicting global '${name}'.`);\n globals.add(name);\n }\n for (const [name, exports] of Object.entries(manifest.modules ?? {})) {\n const occupied = modules.get(name) ?? new Set<string>();\n for (const key of exports) {\n if (occupied.has(key)) throw new TypeError(`Conflicting export '${name}.${key}'.`);\n occupied.add(key);\n }\n modules.set(name, occupied);\n }\n }\n this.controller.signal.addEventListener(\"abort\", () => this.queue.interrupt(this.controller.signal.reason), { once: true });\n options.signal?.addEventListener(\"abort\", this.abort, { once: true });\n if (options.signal?.aborted) this.abort();\n this.budget.setRetainedValues(this, this.retainedRoots);\n this.tracker.onFatalRejection((error) => this.poison(error));\n } catch (error) {\n releaseObjectPrototype(this.budget);\n this.compilation.dispose();\n this.lease.release();\n throw error;\n }\n }\n\n bridgeOptions = (): HostBridgeOptions => ({\n budget: this.budget,\n compileOwner: this.lease.owner,\n signal: this.controller.signal,\n realm: this.bridge\n });\n\n retainedRoots = (): SandboxValue[] => [\n ...this.callbacks.values(),\n ...Array.from(this.pendingCallbacks, (pending) => pending.closure),\n ...this.guestReferences.values()\n ];\n\n captureArguments: RealmBridge[\"captureArguments\"] = (operation, args, copy) => {\n const from = this.retainedOperations.get(operation)?.from ?? args.length;\n const values = copy(args.slice(0, from));\n const captured: GuestReference[] = [];\n const rollback = () => {\n for (const reference of captured) {\n revokeGuestReference(reference, this);\n this.guestReferences.delete(reference);\n }\n };\n try {\n for (const value of args.slice(from)) {\n this.checkCollection(\n this.guestReferences.size + 1,\n this.limits.guestReferences,\n \"guest reference\"\n );\n const root: [SandboxValue] = [value];\n const reference = createGuestReference(root, this, this.assertOpen);\n this.guestReferences.set(reference, root);\n captured.push(reference);\n values.push(reference);\n }\n if (captured.length > 0)\n this.budget.reconcileDataUsage(\n measureSandboxData([...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()])\n );\n return { args: values, rollback };\n } catch (error) {\n rollback();\n if (error instanceof SandboxError) this.poison(error);\n throw error;\n }\n };\n\n releaseGuestReference = (reference: unknown): void => {\n readGuestReference(reference, this);\n revokeGuestReference(reference as GuestReference, this);\n this.guestReferences.delete(reference as GuestReference);\n if (this.active === undefined)\n reconcileCompiledValues(\n this.budget,\n [...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()],\n this.compilation\n );\n };\n\n assertOpen = (): void => {\n if (this.failure !== undefined) throw this.failure.reason;\n if (this.closed) throw new Error(\"SafeJS realm is closed; capabilities are revoked.\");\n this.controller.signal.throwIfAborted();\n };\n\n abort = (): void => {\n this.poison(this.options.signal?.reason ?? new SandboxError(\"aborted\"));\n void this.close().catch(() => undefined);\n };\n\n poison(reason: unknown): void {\n this.failure ??= { reason };\n this.controller.abort(reason);\n if (this.active === undefined)\n queueMicrotask(() => {\n void this.dispose().catch(() => undefined);\n });\n }\n\n chargeWork = (units = 1): void => {\n this.assertOpen();\n if (!Number.isSafeInteger(units) || units < 0)\n throw new TypeError(\"Work charges must be non-negative safe integers.\");\n try {\n for (let index = 0; index < units; index++) this.budget.visitNode();\n } catch (error) {\n this.poison(error);\n throw error;\n }\n };\n\n onCleanup = (cleanup: () => void | Promise<void>): (() => void) => {\n this.assertOpen();\n if (typeof cleanup !== \"function\") throw new TypeError(\"Cleanup must be a function.\");\n this.checkCollection(this.cleanups.length + 1, this.limits.cleanups, \"cleanup\");\n // Each registration has its own identity even when callbacks are reused.\n const registration = () => cleanup();\n this.cleanups.push(registration);\n return () => {\n const index = this.cleanups.indexOf(registration);\n if (index !== -1) this.cleanups.splice(index,1);\n };\n };\n\n checkCollection(count: number, limit: number, name: string): void {\n this.assertOpen();\n try {\n this.budget.allocateCollectionEntries(count);\n } catch (error) {\n this.poison(error);\n throw error;\n }\n if (count > limit) throw new RangeError(`Realm ${name} limit exceeded.`);\n }\n\n invokeHost = (operation: HostOperation, call: () => unknown): unknown => {\n this.assertOpen();\n const phase: HostPhase = {\n active: true,\n extension: this.nestedOperations.get(operation),\n evaluating: false,\n pending: new Set()\n };\n return this.phase.run(phase, () => {\n try {\n const result = call();\n if (types.isPromise(result) || phase.pending.size > 0 || phase.failure !== undefined) {\n return Promise.resolve(result)\n .then(\n async (value) => {\n await Promise.allSettled(phase.pending);\n if (phase.failure !== undefined) throw phase.failure.reason;\n this.assertOpen();\n return value;\n },\n async (error) => {\n if (error instanceof SandboxError || phase.pending.size > 0) this.poison(error);\n await Promise.allSettled(phase.pending);\n throw error;\n }\n )\n .finally(() => {\n phase.active = false;\n });\n }\n this.assertOpen();\n phase.active = false;\n return result;\n } catch (error) {\n phase.active = false;\n if (error instanceof SandboxError) this.poison(error);\n if (phase.pending.size > 0) {\n this.poison(error);\n return Promise.allSettled(phase.pending).then(() => {\n throw error;\n });\n }\n throw error;\n }\n });\n };\n\n importValue(value: unknown): SandboxValue {\n return copyHostValueToSandbox(\n value,\n [],\n this.bridgeOptions(),\n { seen: new WeakMap() },\n \"<realm>\"\n );\n }\n\n exportValue(value: SandboxValue): unknown {\n return deepCopyFromSandbox(value, {\n compilation: this.compilation,\n wrapClosure: this.wrapCallback,\n unwrapHostObject: (object) => exportHostCapability(object, this)\n });\n }\n\n createHostObject = (definition: HostObjectDefinition): HostObject => {\n this.checkCollection(this.hostObjects.size + 1, this.limits.hostObjects, \"host object\");\n const object = createLiveHostObject(definition, {\n owner: this,\n assertActive: this.assertOpen,\n chargeWork: this.chargeWork,\n checkLength: (length) => this.budget.allocateArrayLength(length),\n checkString: (value) => { this.budget.allocateString(value); },\n checkTemporaryDataSize: (size) => {\n const temporary = {};\n try {\n this.budget.setRetainedDataUsage(temporary, size);\n } finally {\n this.budget.setRetainedDataUsage(temporary, 0);\n }\n },\n read: (operation, validate) => {\n const value = this.invokeHost(operation, operation);\n if (types.isPromise(value)) {\n void Promise.resolve(value).catch(() => undefined);\n throw new TypeError(\"Live property operations must be synchronous.\");\n }\n return this.importValue(validate === undefined ? value : validate(value));\n },\n write: (operation, value) => {\n const result = this.invokeHost(operation, () => operation(this.exportValue(value)));\n if (types.isPromise(result)) {\n void Promise.resolve(result).catch(() => undefined);\n throw new TypeError(\"Live property setters must be synchronous.\");\n }\n },\n method: (operation) => {\n const value = copyHostValueToSandbox(\n operation,\n [],\n this.bridgeOptions(),\n this.nativeConversions,\n \"<host-method>\"\n );\n if (!isSandboxClosure(value)) throw new TypeError(\"Invalid host method.\");\n return value;\n }\n });\n this.hostObjects.add(object);\n try {\n this.budget.chargeDataUsage(1);\n } catch (error) {\n this.poison(error);\n throw error;\n }\n return object;\n };\n\n wrapCallback = (closure: SandboxClosure): Callback => {\n this.assertOpen();\n const existing = this.callbackCache.get(closure);\n if (existing !== undefined && this.callbacks.has(existing)) return existing;\n this.checkCollection(this.callbacks.size + 1, this.limits.callbacks, \"callback\");\n const invokeCallback = this.invokeCallback;\n const callback = function (this: unknown, ...args: readonly unknown[]) {\n return invokeCallback(callback, { args, thisValue: this });\n };\n this.callbacks.set(callback, closure);\n this.callbackCache.set(closure, callback);\n registerGuestCallback(callback, {\n owner: this,\n closure,\n assertActive: () => {\n this.assertOpen();\n if (!this.callbacks.has(callback)) throw new TypeError(\"Guest callback is revoked.\");\n }\n });\n try {\n this.budget.reconcileDataUsage(\n measureSandboxData([...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()])\n );\n } catch (error) {\n this.poison(error);\n throw error;\n }\n return callback;\n };\n\n releaseCallback = (callback: unknown): void => {\n readGuestCallback(callback, this);\n revokeGuestCallback(callback as object, this);\n this.callbacks.delete(callback as Callback);\n if (this.active === undefined)\n reconcileCompiledValues(\n this.budget,\n [...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()],\n this.compilation\n );\n };\n\n startCallback = (callback: unknown, options: CallbackOptions = {}): CallbackInvocation => {\n let complete!: () => void;\n let fail!: (reason: unknown) => void;\n const synchronous = new Promise<void>((resolve, reject) => {\n complete = resolve;\n fail = reject;\n });\n const result = this.executeCallback(callback, options, complete);\n void result.catch(fail);\n void synchronous.catch(() => undefined);\n return Object.freeze({ synchronous, result });\n };\n\n invokeCallback = this.executeCallback.bind(this);\n\n private async executeCallback(\n callback: unknown,\n options: CallbackOptions = {},\n completeSynchronous?: () => void\n ): Promise<unknown> {\n if (this.closed || this.failure !== undefined) await this.dispose();\n this.assertOpen();\n const closure = readGuestCallback(callback, this);\n this.checkCollection(this.pendingCallbacks.size + 1, this.limits.callbacks, \"pending callback\");\n const record: { closure: SandboxClosure; promise?: Promise<unknown> } = { closure };\n this.pendingCallbacks.add(record);\n const invoke = async () => {\n this.assertOpen();\n readGuestCallback(callback, this);\n const leave = enterRunningState(closure);\n const leaveCall = this.budget.enterCall();\n try {\n const values = this.importValue([\n options.thisValue,\n [...(options.args ?? [])]\n ]) as SandboxValue[];\n const callerContext: SandboxCallContext = {\n thisValue: values[0],\n compilation: this.compilation,\n stack: [],\n getProperty: (object, key) => sandboxGetProperty(object, key, object, this.budget, bridge)\n };\n const bridge: SandboxCallContext = {\n ...callerContext,\n invokeClosure: (target, args, receiver, construct, newTarget) =>\n invokeBuiltinClosure(target, args, this.budget, callerContext, receiver, construct, newTarget)\n };\n const value = await (guestProxyStates.has(closure)\n ? callGuestProxy(closure, values[1] as SandboxValue[], this.budget, bridge, values[0])\n : closure.call(values[1] as SandboxValue[], {\n thisValue: values[0], compilation: this.compilation, stack: []\n }));\n const settlement = awaitSandboxValue(value, this.controller.signal, this.budget);\n void settlement.catch(() => undefined);\n if (isSandboxPromise(value) && value.synchronousPrefix !== undefined)\n await value.synchronousPrefix;\n this.assertOpen();\n completeSynchronous?.();\n const settled = await suspendJob(settlement);\n return this.exportValue(settled);\n } finally {\n leaveCall();\n leave();\n }\n };\n try {\n const active = this.active !== undefined;\n const pending = withSandboxPromiseRejectionTracker(this.tracker, () =>\n runResources.run(this.resources, () =>\n withCancellationSignal(this.controller.signal, () =>\n active && this.phase.getStore()?.active ? runAsyncPrefix(invoke) : this.queue.run(invoke)\n )\n )\n );\n record.promise = active ? pending : this.perform(() => pending);\n return await record.promise;\n } catch (error) {\n if (error instanceof SandboxError) this.poison(error);\n throw error;\n } finally {\n this.pendingCallbacks.delete(record);\n if (!this.closed && this.active === undefined)\n reconcileCompiledValues(\n this.budget,\n [...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()],\n this.compilation\n );\n }\n }\n\n initialize(): void {\n if (this.initialized) return;\n this.assertOpen();\n this.initialized = true;\n for (const extension of this.extensions) {\n const context: ExtensionContext = Object.freeze({\n signal: this.controller.signal,\n // Detachment is internal, not an extension capability.\n onCleanup: cleanup => { this.onCleanup(cleanup); },\n chargeWork: this.chargeWork,\n createHostObject: this.createHostObject,\n startCallback: this.startCallback,\n invokeCallback: this.invokeCallback,\n releaseCallback: this.releaseCallback,\n releaseGuestReference: this.releaseGuestReference,\n retainGuestArguments: <Operation extends HostOperation>(\n operation: Operation,\n from: number\n ): Operation => {\n this.assertOpen();\n if (!extension.manifest.capabilities?.includes(\"guest:retain\"))\n throw new TypeError(\"Retaining arguments requires the guest:retain grant.\");\n if (typeof operation !== \"function\")\n throw new TypeError(\"Retained operation must be a function.\");\n if (!Number.isSafeInteger(from) || from < 0)\n throw new TypeError(\"Argument index must be a non-negative safe integer.\");\n if (this.scope !== undefined)\n throw new TypeError(\"Retained operations must be registered during setup.\");\n const previous = this.retainedOperations.get(operation);\n if (\n previous !== undefined &&\n (previous.extension !== extension || previous.from !== from)\n )\n throw new TypeError(\"Conflicting retained operation declaration.\");\n this.retainedOperations.set(operation, { extension, from });\n return operation;\n },\n nestedOperation: <Operation extends HostOperation>(operation: Operation): Operation => {\n this.assertOpen();\n if (!extension.manifest.capabilities?.includes(\"source:nested\"))\n throw new TypeError(\"Nested source requires the source:nested grant.\");\n if (typeof operation !== \"function\")\n throw new TypeError(\"Nested operation must be a function.\");\n if (this.scope !== undefined)\n throw new TypeError(\"Nested operations must be registered during setup.\");\n const owner = this.nestedOperations.get(operation);\n if (owner !== undefined && owner !== extension)\n throw new TypeError(\"Nested operation already belongs to another extension.\");\n this.nestedOperations.set(operation, extension);\n return operation;\n },\n evaluateNested: (source) => {\n const phase = this.phase.getStore();\n if (\n !extension.manifest.capabilities?.includes(\"source:nested\") ||\n !phase?.active ||\n phase.extension !== extension ||\n phase.evaluating\n ) {\n const error = new SandboxError(\"reentry\");\n this.poison(error);\n const rejected = Promise.reject<void>(error);\n void rejected.catch(() => undefined);\n return rejected;\n }\n const pending = this.evaluateNested(source, extension);\n phase.pending.add(pending);\n void pending.then(\n () => {\n phase.pending.delete(pending);\n },\n (reason) => {\n phase.pending.delete(pending);\n phase.failure ??= { reason };\n }\n );\n return pending;\n }\n });\n const output = getExtensionSetup(extension)(context);\n if (types.isPromise(output)) {\n void Promise.resolve(output).catch(() => undefined);\n throw new TypeError(\"Extension setup must be synchronous.\");\n }\n const exports = readDataRecord(output, \"Extension exports\");\n if (Object.keys(exports).some((key) => key !== \"globals\" && key !== \"modules\"))\n throw new TypeError(\"Unknown extension export field.\");\n const globals = readDataRecord(\n exports.globals ?? {},\n \"Extension globals\"\n ) as ExtensionExports[\"globals\"] & {};\n const modules = readModules(exports.modules as ModuleRegistry | undefined);\n assertNames(Object.keys(globals), extension.manifest.globals ?? [], \"global\");\n if (extension.manifest.name === this.consoleExtension && !this.hostObjects.has(globals.console as HostObject))\n throw new TypeError(\"Console replacement must be a host object created in this realm.\");\n assertNames(Object.keys(modules), Object.keys(extension.manifest.modules ?? {}), \"module\");\n for (const [name, values] of Object.entries(modules)) {\n assertNames(Object.keys(values), extension.manifest.modules?.[name] ?? [], \"module export\");\n this.modules[name] ??= Object.create(null) as Record<string, CallerInjectedBinding>;\n Object.assign(this.modules[name], values);\n }\n Object.assign(this.globals, globals);\n }\n const bindings = wrapCallerInjectedBindings(this.globals, this.bridgeOptions());\n this.scope = new Scope(this.builtinBindings, undefined, undefined, { chargeData: false }).child(\n bindings,\n { functionBoundary: true }\n );\n }\n\n async evaluateRaw(\n source: string,\n filename = \"<realm>\",\n nested = false,\n sourceType?: \"module\"\n ): Promise<InterpreterResult> {\n this.assertOpen();\n if (typeof source !== \"string\") throw new TypeError(\"Realm source must be a string.\");\n if (sourceType === \"module\") {\n this.initialize();\n this.sourceGraph ??= new SourceModuleGraph({\n resolver:this.options.sourceResolver ?? (() => undefined), scope:this.scope!,\n modules:createModuleEnvironment(this.modules,{...this.bridgeOptions(),wrappedModules:this.convertedModules}),\n budget:this.budget, compilation:this.compilation, signal:this.controller.signal,\n jobs:this.queue, assertActive:this.assertOpen, surfaceUnhandledThrows:true\n });\n const before = this.sourceGraph.stats.nodeVisits;\n const namespace = await this.sourceGraph.evaluateSource({id:filename,source}, module => {\n this.sourceModuleHash = hashParsedAst(module);\n });\n await this.sourceGraph.settle();\n return {ok:true,returnValue:namespace,snapshot:{bindings:{}},stats:{nodeVisits:this.sourceGraph.stats.nodeVisits - before,currentDataSize:this.budget.currentDataSize,peakDataSize:this.budget.peakDataSize}};\n }\n const module = parseExecutableModule(source, filename, this.lease.owner);\n this.initialize();\n const moduleEnvironment = createModuleEnvironment(this.modules, {...this.bridgeOptions(),wrappedModules:this.convertedModules});\n const imports = resolveModuleImports(module, this.modules, {\n environment: moduleEnvironment,\n ...this.bridgeOptions(),\n wrappedModules: this.convertedModules\n });\n this.scope!.moduleEnvironment = moduleEnvironment;\n for (const [name, value] of Object.entries(imports)) {\n const binding = this.scope!.lookup(name);\n if (!binding.found) this.scope!.declare(name, \"const\", value);\n else if (binding.value !== value) throw new TypeError(`Conflicting import '${name}'.`);\n }\n const result = await interpret(\n {\n type: \"BlockStatement\",\n body: module.body.filter((statement) => statement.type !== \"ImportDeclaration\"),\n span: module.span\n },\n {\n scope: this.scope,\n useScopeDirectly: true,\n budget: this.budget,\n compilation: this.compilation,\n signal: this.controller.signal,\n surfaceUnhandledThrows: true,\n jobs: this.queue,\n nested,\n assertActive: this.assertOpen\n }\n );\n this.assertOpen();\n return result;\n }\n\n evaluateNested = async (source: string, extension: SafeJSExtension): Promise<void> => {\n this.assertOpen();\n const phase = this.phase.getStore();\n if (\n !phase?.active ||\n phase.extension !== extension ||\n phase.evaluating ||\n this.active === undefined\n )\n throw new SandboxError(\"reentry\");\n const leave = this.budget.enterCall();\n phase.evaluating = true;\n try {\n if (++this.nestedDepth > this.limits.nestedEvaluations) {\n const error = new SandboxError({\n budget: \"callDepth\",\n current: this.nestedDepth,\n limit: this.limits.nestedEvaluations\n });\n this.poison(error);\n throw error;\n }\n const result = await this.evaluateRaw(source, \"<nested>\", true);\n if (!result.ok) throw new Error(result.error.message);\n } finally {\n this.nestedDepth--;\n phase.evaluating = false;\n leave();\n }\n };\n\n evaluate = async (source: string, options: { filename?: string; sourceType?: \"module\" } = {}): Promise<RealmResult> =>\n this.perform(async () => {\n const result = await this.evaluateRaw(source, options.filename, false, options.sourceType);\n if (!result.ok) {\n await this.dispose();\n return { ok: false, error: result.error, stats: result.stats };\n }\n return { ok: true, returnValue: this.exportValue(result.returnValue), stats: result.stats };\n });\n\n async perform<Result>(task: () => Promise<Result>): Promise<Result> {\n if (this.closed || this.failure !== undefined) await this.dispose();\n this.assertOpen();\n if (this.active !== undefined) throw new SandboxError(\"reentry\");\n const pending = Promise.resolve().then(() =>\n withSandboxPromiseRejectionTracker(this.tracker, () =>\n runResources.run(this.resources, () =>\n withCancellationSignal(this.controller.signal, task)\n )\n )\n );\n this.active = pending;\n try {\n const result = await pending;\n await this.queue.drain();\n const unhandled = await this.tracker.findUnhandledRejection();\n if (unhandled !== undefined) {\n const error = new Error(\n `Unhandled guest promise rejection: ${describeThrownValue(unhandled.reason)}`\n );\n error.name = \"UnhandledRejectionError\";\n throw error;\n }\n if (this.failure !== undefined) throw this.failure.reason;\n if (!this.closed)\n reconcileCompiledValues(\n this.budget,\n [...(this.scope?.retainedDataRoots() ?? []), ...this.retainedRoots()],\n this.compilation\n );\n return result;\n } catch (error) {\n const reason = this.failure === undefined ? error : this.failure.reason;\n this.poison(reason);\n try {\n await this.dispose();\n } catch (cleanup) {\n throw new AggregateError([reason, cleanup], \"Realm execution and cleanup failed.\");\n }\n throw reason;\n } finally {\n this.active = undefined;\n }\n }\n\n close = (): Promise<void> => {\n this.closed = true;\n this.controller.abort(new Error(\"SafeJS realm is closed.\"));\n if (this.phase.getStore()?.active) return this.dispose();\n return Promise.allSettled([\n this.active,\n ...Array.from(this.pendingCallbacks, (pending) => pending.promise)\n ]).then(() => this.dispose());\n };\n\n dispose(): Promise<void> {\n if (this.disposal !== undefined) return this.disposal;\n this.closed = true;\n this.controller.abort(new Error(\"SafeJS realm is closed.\"));\n this.options.signal?.removeEventListener(\"abort\", this.abort);\n for (const callback of this.callbacks.keys()) revokeGuestCallback(callback, this);\n this.callbacks.clear();\n for (const object of this.hostObjects) revokeHostObject(object, this);\n this.hostObjects.clear();\n for (const reference of this.guestReferences.keys()) revokeGuestReference(reference, this);\n this.guestReferences.clear();\n for (const release of this.referenceReleases) release();\n this.referenceReleases.clear();\n this.budget.setRetainedValues(this, undefined);\n this.sourceGraph?.close();\n releaseObjectPrototype(this.budget);\n this.disposal = (async () => {\n const errors: unknown[] = [];\n for (const cleanup of this.cleanups.splice(0).reverse()) {\n try {\n await cleanup();\n } catch (error) {\n errors.push(error);\n }\n }\n this.scope = undefined;\n this.convertedModules.clear();\n for (const key of Object.keys(this.globals)) delete this.globals[key];\n for (const key of Object.keys(this.modules)) delete this.modules[key];\n for (const key of Object.keys(this.builtinBindings))\n Reflect.deleteProperty(this.builtinBindings, key);\n this.nativeConversions.seen = new WeakMap();\n reconcileCompiledValues(this.budget, [], this.compilation);\n this.compilation.dispose();\n this.lease.release();\n if (errors.length > 0) throw new AggregateError(errors, \"Realm cleanup failed.\");\n })().finally(() => this.queue.finish());\n return this.disposal;\n }\n}\n\nfunction readModules(\n input: ModuleRegistry | undefined\n): Record<string, Record<string, CallerInjectedBinding>> {\n const entries = (value: unknown, label: string): Array<[string, unknown]> => {\n if (types.isMap(value) && !types.isProxy(value)) {\n const result = [...Map.prototype.entries.call(value)] as Array<[string, unknown]>;\n if (\n result.length > 4096 ||\n result.some(([key]) => typeof key !== \"string\" || key.length === 0)\n )\n throw new TypeError(`${label} requires bounded string keys.`);\n return result;\n }\n return Object.entries(readDataRecord(value, label));\n };\n const modules = Object.create(null) as Record<string, Record<string, CallerInjectedBinding>>;\n for (const [name, exports] of entries(input ?? {}, \"Module registry\")) {\n const exported = Object.create(null) as Record<string, CallerInjectedBinding>;\n for (const [key, value] of entries(exports, \"Module exports\"))\n exported[key] = value as CallerInjectedBinding;\n modules[name] = exported;\n }\n return modules;\n}\n\nfunction assertNames(actual: readonly string[], expected: readonly string[], label: string): void {\n if (actual.length !== expected.length || actual.some((name) => !expected.includes(name)))\n throw new TypeError(`Extension ${label} names do not match its manifest.`);\n}\n\nexport function createRealm(options: RealmOptions = {}): SafeJSRealm {\n const state = new RealmState(readRealmOptions(options));\n return Object.freeze(attachExecutionControl({\n extensions: Object.freeze(state.extensions.map((extension) => extension.manifest)),\n evaluate: state.evaluate,\n startCallback: state.startCallback,\n invokeCallback: state.invokeCallback,\n releaseCallback: state.releaseCallback,\n releaseGuestReference: state.releaseGuestReference,\n close: state.close\n }, state.queue));\n}\n\nexport async function runWithExtensions(source: string, options: RunOptions, jobs?: SandboxJobQueue): Promise<RunResult> {\n if (\n options.snapshot !== undefined ||\n options.snapshotBackend !== undefined ||\n options.snapshotPath !== undefined ||\n options.entryPointArgs !== undefined\n )\n throw new TypeError(\n \"Live extension runs do not support snapshots or entryPointArgs; use a persistent realm.\"\n );\n const state = new RealmState(readRealmOptions(options, true), jobs);\n try {\n const result = await state.perform(() => state.evaluateRaw(source, options.filename, false, options.sourceType));\n if (result.ok && options.sourceType !== \"module\") encodeReplayData(result.returnValue);\n return {\n ...result,\n snapshot: {\n version: 1,\n sourceHash: state.sourceModuleHash ?? hashSource(source),\n bindings: {},\n replayError: \"Live realm state cannot be serialized or replayed.\"\n }\n };\n } catch (error) {\n if (state.disposal === undefined) {\n try {\n await state.close();\n } catch (cleanupError) {\n throw new AggregateError([error, cleanupError], \"Realm execution and cleanup failed.\");\n }\n }\n throw error;\n } finally {\n if (state.disposal === undefined) await state.close();\n }\n}\n\nfunction readRealmOptions(value: unknown, oneShot = false): RealmOptions {\n const options = readDataRecord(value, \"Realm options\");\n const supported = new Set([\n \"bindings\",\n \"modules\",\n \"sourceResolver\",\n \"extensions\",\n \"builtinOverrides\",\n \"grants\",\n \"budget\",\n \"signal\",\n \"sink\",\n \"randomSeed\",\n \"clock\",\n \"limits\"\n ]);\n for (const [key, entry] of Object.entries(options)) {\n if (supported.has(key) || (oneShot && (key === \"filename\" || key === \"sourceType\" || entry === undefined))) continue;\n throw new TypeError(`Unsupported ${oneShot ? \"extension-run\" : \"realm\"} option '${key}'.`);\n }\n return options as RealmOptions;\n}\n", "import {parseSourceModule, type ParsedSourceModule} from \"../parse/source-module.js\";\nimport type { Module } from \"../parse/parser.js\";\nimport {interpret, type InterpretOptions} from \"../interp/interpreter.js\";\nimport {Scope} from \"../interp/scope.js\";\nimport {createModuleNamespace} from \"../interp/module-namespace.js\";\nimport {setSandboxPrototype} from \"../interp/object-model.js\";\nimport type {SandboxObject} from \"../interp/values.js\";\nimport {awaitWithSignal} from \"../interp/cancel.js\";\nimport {SandboxJobQueue} from \"../interp/jobs.js\";\nimport {attachSourceLoader, resolveModuleNamespace, type ModuleEnvironment} from \"./registry.js\";\n\nexport type SourceModule = {id: string; source: string};\nexport type SourceResolver = (specifier: string, referrer: string, context: {signal?: AbortSignal}) =>\n SourceModule | undefined | Promise<SourceModule | undefined>;\n\ntype RecordEntry = {\n id: string;\n source: string;\n parsed: ParsedSourceModule;\n scope: Scope;\n dependencies: Map<string, RecordEntry | SandboxObject>;\n namespace?: SandboxObject;\n linked?: Promise<void>;\n evaluation?: Promise<void>;\n traversal?: Promise<void>;\n async?: boolean;\n completed?: boolean;\n failure?: {reason: unknown};\n dfsIndex?: number;\n dfsAncestor?: number;\n onStack?: boolean;\n cycleRoot?: RecordEntry;\n};\ntype Binding = {record: RecordEntry; name: string} | {namespace: SandboxObject; name: string; whole?: true};\nconst ambiguous = Symbol(\"ambiguous module export\");\nconst sourceRecords = new WeakSet<object>();\n\n/** Owns one realm's canonical source identities. The resolver is the only source authority. */\nexport class SourceModuleGraph {\n readonly stats = {nodeVisits:0};\n private readonly records = new Map<string, RecordEntry>();\n private readonly requests = new Map<string, Promise<RecordEntry | SandboxObject>>();\n private requestDataSize = 0;\n private readonly pendingImports = new Set<Promise<SandboxObject>>();\n private readonly jobs: SandboxJobQueue;\n private readonly evaluationStack: RecordEntry[] = [];\n private evaluationIndex = 0;\n\n constructor(private readonly options: InterpretOptions & {\n scope: Scope;\n resolver: SourceResolver;\n modules: ModuleEnvironment;\n }) {\n this.jobs = options.jobs ?? new SandboxJobQueue();\n attachSourceLoader(options.modules,this.import.bind(this));\n options.budget?.setRetainedValues(this, () => [...this.records.values()].flatMap(record =>\n [record.id,record.source,...record.parsed.requests,...record.scope.retainedDataRoots()]));\n }\n\n close(): void {\n this.options.budget?.setRetainedValues(this,undefined);\n this.options.budget?.setRetainedDataUsage(this.requests,0);\n this.requestDataSize = 0;\n this.records.clear();\n this.requests.clear();\n }\n\n import(specifier: string, referrer: string): Promise<SandboxObject> {\n const pending=(async () => {\n const entry = await this.load(specifier, referrer);\n if (!isRecord(entry)) return entry;\n await this.loadGraph(entry);\n await this.link(entry);\n await this.evaluate(entry);\n await this.jobs.drain();\n return this.namespace(entry);\n })();\n this.pendingImports.add(pending);\n void pending.then(() => this.pendingImports.delete(pending), () => this.pendingImports.delete(pending));\n return pending;\n }\n\n async settle(): Promise<void> {\n do {\n await Promise.allSettled([...this.pendingImports]);\n await this.jobs.drain();\n } while (this.pendingImports.size > 0);\n }\n\n async evaluateSource(source: SourceModule, beforeEvaluation?: (module: Module) => void): Promise<SandboxObject> {\n const entry = this.register(source);\n await this.loadGraph(entry);\n await this.link(entry);\n beforeEvaluation?.(entry.parsed.module);\n await this.evaluate(entry);\n await this.jobs.drain();\n return this.namespace(entry);\n }\n\n private register(source: SourceModule): RecordEntry {\n const known = this.records.get(source.id);\n if (known !== undefined) {\n if (known.source !== source.source) throw new TypeError(`Source identity '${source.id}' changed within the graph.`);\n return known;\n }\n this.options.budget?.chargeDataUsage(source.source.length + source.id.length + 1);\n const parsed = parseSourceModule(source.source, source.id, this.options.compilation?.owner ?? this.options.compileOwner);\n const importMeta = Object.create(null) as SandboxObject;\n setSandboxPrototype(importMeta,null);\n const record: RecordEntry = {id:source.id, source:source.source, parsed,\n scope: new Scope({this:undefined},this.options.scope,importMeta, {functionBoundary:true}), dependencies:new Map()};\n record.scope.moduleEnvironment = this.options.modules;\n record.scope.moduleId = record.id;\n sourceRecords.add(record);\n this.records.set(source.id,record);\n return record;\n }\n\n private load(specifier: string, referrer: string): Promise<RecordEntry | SandboxObject> {\n if (this.options.modules.available.includes(specifier))\n return Promise.resolve(resolveModuleNamespace(this.options.modules, specifier));\n const key = JSON.stringify([referrer, specifier]);\n const cached = this.requests.get(key);\n if (cached !== undefined) return cached;\n // Both successful aliases and denied requests are cached for this realm's\n // lifetime. Reserve their identities before calling the host resolver.\n const requestDataSize = this.requestDataSize + key.length + 1;\n this.options.budget?.setRetainedDataUsage(this.requests,requestDataSize);\n this.requestDataSize = requestDataSize;\n const request = (async () => {\n this.options.signal?.throwIfAborted();\n const source = await awaitWithSignal(Promise.resolve(this.options.resolver(specifier, referrer, {signal:this.options.signal})),this.options.signal);\n this.options.signal?.throwIfAborted();\n if (source === undefined) throw new TypeError(`Source resolver denied '${specifier}' from '${referrer}'.`);\n if (typeof source.id !== \"string\" || source.id.length === 0 || typeof source.source !== \"string\")\n throw new TypeError(\"Source resolver must supply a nonempty identity and source text.\");\n return this.register(source);\n })();\n this.requests.set(key,request);\n return request;\n }\n\n private loadGraph(root: RecordEntry): Promise<void> {\n return new Promise((resolve, reject) => {\n const visited = new Set<RecordEntry>();\n let pending = 1;\n let loading = true;\n const fail = (reason: unknown) => {loading = false; reject(reason);};\n const finish = () => {\n if (--pending === 0 && loading) {loading = false; resolve();}\n };\n const visit = (record: RecordEntry) => {\n this.options.budget?.visitNode();\n if (visited.has(record)) return;\n visited.add(record);\n for (const {specifier: request, attributes} of record.parsed.moduleRequests) {\n this.options.budget?.visitNode();\n if (attributes.length > 0) throw new SyntaxError(`Unsupported import attribute '${attributes[0]![0]}'.`);\n pending++;\n // Request every edge without waiting for its peers. Each resolution\n // continues loading its own descendants, including across cycles.\n void this.load(request,record.id).then(dependency => {\n if (!loading) return;\n try {\n record.dependencies.set(request,dependency);\n if (isRecord(dependency)) visit(dependency);\n finish();\n } catch (reason) {fail(reason);}\n }, fail);\n }\n };\n try {visit(root); finish();} catch (reason) {fail(reason);}\n });\n }\n\n private async link(root: RecordEntry): Promise<void> {\n const pending = [root];\n const visited = new Set<RecordEntry>();\n while (pending.length > 0) {\n this.options.budget?.visitNode();\n const record = pending.pop()!;\n if (visited.has(record)) continue;\n visited.add(record);\n for (const dependency of record.dependencies.values()) if (isRecord(dependency)) pending.push(dependency);\n }\n // Instantiate all local cells and hoisted functions before creating any import.\n for (const record of visited) if (record.linked === undefined) {\n record.linked = this.execute(record,\"link\");\n await record.linked;\n } else await record.linked;\n for (const record of visited) {\n for (const entry of record.parsed.exports) {\n this.options.budget?.visitNode();\n if (entry.exported !== undefined && entry.request !== undefined) this.requireExport(record,entry.exported);\n }\n for (const entry of record.parsed.imports) {\n this.options.budget?.visitNode();\n if (record.scope.hasOwnBinding(entry.local)) continue;\n const dependency = record.dependencies.get(entry.request)!;\n if (entry.namespace === true) {\n record.scope.declare(entry.local,\"const\",isRecord(dependency) ? this.namespace(dependency) : dependency);\n continue;\n }\n const binding = isRecord(dependency) ? this.requireExport(dependency,entry.imported)\n : Object.hasOwn(dependency,entry.imported) ? {namespace:dependency,name:entry.imported} : undefined;\n if (binding === undefined) throw new SyntaxError(`Module '${entry.request}' does not export '${entry.imported}'.`);\n if (\"record\" in binding) record.scope.declareImport(entry.local,binding.record.scope,binding.name);\n else record.scope.declare(entry.local,\"const\",binding.whole ? binding.namespace : binding.namespace[binding.name]);\n }\n }\n }\n\n private names(record: RecordEntry, visited = new Set<RecordEntry>()): Set<string> {\n this.options.budget?.visitNode();\n if (visited.has(record)) return new Set();\n const leave = this.options.budget?.enterCall();\n try {\n visited.add(record);\n const names = new Set<string>();\n for (const entry of record.parsed.exports) {\n this.options.budget?.visitNode();\n if (entry.exported !== undefined) names.add(entry.exported);\n else {\n const dependency = record.dependencies.get(entry.request!)!;\n for (const name of isRecord(dependency) ? this.names(dependency,visited) : Object.keys(dependency))\n if (name !== \"default\") names.add(name);\n }\n }\n return names;\n } finally { leave?.(); }\n }\n\n private resolve(record: RecordEntry, name: string, visited = new Set<string>()): Binding | typeof ambiguous | undefined {\n this.options.budget?.visitNode();\n const key = JSON.stringify([record.id,name]);\n if (visited.has(key)) return undefined;\n const leave = this.options.budget?.enterCall();\n try {\n visited.add(key);\n const explicit = record.parsed.exports.find(entry => {\n this.options.budget?.visitNode();\n return entry.exported === name;\n });\n if (explicit?.local !== undefined) {\n const imported = record.parsed.imports.find(entry => {\n this.options.budget?.visitNode();\n return entry.local === explicit.local;\n });\n if (imported === undefined || imported.namespace === true) return {record,name:explicit.local};\n return this.resolveDependency(record, imported.request, imported.imported,visited);\n }\n if (explicit?.request !== undefined) return this.resolveDependency(record,explicit.request,explicit.imported!,visited,explicit.namespace);\n if (name === \"default\") return undefined;\n let resolved: Binding | undefined;\n for (const entry of record.parsed.exports) {\n this.options.budget?.visitNode();\n if (entry.exported !== undefined) continue;\n const candidate = this.resolveDependency(record,entry.request!,name,visited);\n if (candidate === ambiguous) return ambiguous;\n if (candidate === undefined) continue;\n if (resolved !== undefined && !sameBinding(resolved,candidate)) return ambiguous;\n resolved = candidate;\n }\n return resolved;\n } finally { leave?.(); }\n }\n\n private resolveDependency(record: RecordEntry, request: string, name: string, visited: Set<string>, whole = false): Binding | typeof ambiguous | undefined {\n const dependency = record.dependencies.get(request)!;\n if (whole) {\n if (!isRecord(dependency)) return {namespace:dependency,name:\"\",whole:true};\n const namespace = this.namespace(dependency);\n const local = \"*namespace*\";\n if (!dependency.scope.hasOwnBinding(local)) dependency.scope.declare(local,\"const\",namespace);\n return {record:dependency,name:local};\n }\n return isRecord(dependency) ? this.resolve(dependency,name,visited)\n : Object.hasOwn(dependency,name) ? {namespace:dependency,name} : undefined;\n }\n\n private requireExport(record: RecordEntry, name: string): Binding {\n const resolved = this.resolve(record,name);\n if (resolved === undefined || resolved === ambiguous)\n throw new SyntaxError(`Module '${record.id}' has ${resolved === ambiguous ? \"an ambiguous\" : \"no\"} export '${name}'.`);\n return resolved;\n }\n\n private namespace(record: RecordEntry): SandboxObject {\n if (record.namespace !== undefined) return record.namespace;\n const bindings = new Map<string,Binding>();\n record.namespace = createModuleNamespace(namespace => {\n record.namespace = namespace;\n for (const name of this.names(record)) {\n const resolved = this.resolve(record,name);\n if (resolved !== undefined && resolved !== ambiguous) bindings.set(name,resolved);\n }\n return Object.fromEntries([...bindings.keys()].map(name => [name,undefined]));\n }, name => {\n const binding = bindings.get(name)!;\n if (\"namespace\" in binding) return binding.whole ? binding.namespace : binding.namespace[binding.name];\n const value = binding.record.scope.lookup(binding.name);\n if (!value.found) throw new ReferenceError(`Uninitialized module export '${name}'.`);\n return value.value;\n }, () => record.scope.retainedDataRoots());\n return record.namespace;\n }\n\n private async evaluate(record: RecordEntry): Promise<void> {\n try {\n await this.jobs.run(() => this.start(record));\n await (record.cycleRoot ?? record).evaluation;\n } catch (reason) {\n for (const pending of this.evaluationStack.splice(0)) {\n pending.onStack=false;\n pending.cycleRoot=record;\n pending.failure ??= {reason};\n }\n throw reason;\n }\n }\n\n private start(record: RecordEntry, ancestors = new Set<RecordEntry>()): Promise<void> {\n if (ancestors.has(record)) return Promise.resolve();\n if (record.traversal !== undefined) return record.traversal;\n let fulfilled!: () => void;\n let rejected!: (reason: unknown) => void;\n record.evaluation = new Promise<void>((resolve,reject) => {fulfilled=resolve;rejected=reject;});\n void record.evaluation.catch(() => undefined);\n const complete = () => {record.completed=true;fulfilled();};\n const fail = (reason: unknown) => {record.completed=true;record.failure={reason};rejected(reason);};\n const next = new Set(ancestors).add(record);\n record.traversal = (async () => {\n record.dfsIndex=this.evaluationIndex++;\n record.dfsAncestor=record.dfsIndex;\n record.onStack=true;\n this.evaluationStack.push(record);\n const dependencies: Promise<void>[] = [];\n // Host resolution completion order must not change evaluation order.\n for (const request of record.parsed.requests) {\n const dependency = record.dependencies.get(request)!;\n if (!isRecord(dependency)) continue;\n if (!next.has(dependency)) await this.start(dependency,next);\n if (dependency.onStack) record.dfsAncestor=Math.min(record.dfsAncestor,dependency.dfsAncestor!);\n const required=dependency.onStack ? dependency : dependency.cycleRoot ?? dependency;\n if (required.failure !== undefined) throw required.failure.reason;\n if (required.async && !required.completed) dependencies.push(required.evaluation!);\n }\n record.async = record.parsed.hasTLA || dependencies.length > 0;\n if (dependencies.length > 0) {\n void Promise.all(dependencies).then(() => this.execute(record,\"evaluate\")).then(complete,fail);\n } else if (record.parsed.hasTLA) {\n let suspend!: () => void;\n const prefix = new Promise<void>(resolve => {suspend=resolve;});\n void this.execute(record,\"evaluate\",suspend).then(complete,fail).then(suspend);\n await prefix;\n } else {\n await this.execute(record,\"evaluate\");\n complete();\n }\n if (record.dfsIndex === record.dfsAncestor) {\n for (;;) {\n const member=this.evaluationStack.pop()!;\n member.onStack=false;\n member.cycleRoot=record;\n if (member===record) break;\n }\n }\n })().catch(error => {fail(error);throw error;});\n return record.traversal;\n }\n\n private async execute(record: RecordEntry, modulePhase: \"link\" | \"evaluate\", onSuspend?: () => void): Promise<void> {\n const result = await interpret({type:\"BlockStatement\",body:record.parsed.module.body,span:record.parsed.module.span},\n {...this.options, scope:record.scope, useScopeDirectly:true, jobs:this.jobs, nested:true,modulePhase,onSuspend});\n this.stats.nodeVisits += result.stats.nodeVisits;\n if (!result.ok) throw new Error(result.error.message);\n }\n}\n\nfunction isRecord(value: RecordEntry | SandboxObject): value is RecordEntry {\n return sourceRecords.has(value);\n}\nfunction sameBinding(left: Binding, right: Binding): boolean {\n return left.name === right.name && (\"record\" in left && \"record\" in right ? left.record === right.record\n : \"namespace\" in left && \"namespace\" in right && left.namespace === right.namespace && left.whole === right.whole);\n}\n", "import { randomInt } from \"node:crypto\";\n\nimport { createSeededRandom } from \"./interp/globals/math.js\";\nimport type { SafeJSSnapshot } from \"./restore.js\";\nimport type { RunRandom } from \"./run.js\";\n\nexport type ReplayableRandom = RunRandom & {\n restore: (state: number) => void;\n};\n\nexport function createReplayableRandom(\n options: {\n seed?: number;\n snapshot?: SafeJSSnapshot;\n } = {}\n): ReplayableRandom {\n const snapshot = options.snapshot;\n const saved = snapshot?.random;\n let initialState = options.seed;\n if (saved !== undefined) {\n const hasLoopState =\n typeof snapshot?.loopIterations === \"object\" &&\n snapshot.loopIterations !== null &&\n Object.keys(snapshot.loopIterations).length > 0;\n const replaysFromStart =\n snapshot?.replay !== undefined ||\n (Array.isArray(snapshot?.pendingAwaits) &&\n snapshot.pendingAwaits.length > 0 &&\n !hasLoopState);\n initialState = replaysFromStart\n ? (saved.initialState ?? saved.seed)\n : (saved.resumeState ?? saved.state);\n }\n const generator = createSeededRandom(initialState ?? randomInt(4_294_967_296));\n return { seed: saved?.seed ?? generator.snapshot(), ...generator };\n}\n", "import { randomUUID } from \"node:crypto\";\nimport { readFile, rename, stat, unlink, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport { getOwnErrorCode, hasOwnErrorCode } from \"../error-codes.js\";\nimport type { SafeJSSnapshot } from \"../restore.js\";\nimport { serializeSafeJSSnapshot } from \"./dump-format.js\";\n\nexport type Snapshot = SafeJSSnapshot;\n\nexport interface SnapshotBackend {\n read(): Promise<Snapshot | undefined>;\n write(snapshot: Snapshot): Promise<void>;\n remove(): Promise<void>;\n}\n\nexport type FileSnapshotBackendOptions = {\n writeMaxAttempts?: number;\n writeRetryDelayMs?: number;\n};\n\nconst DEFAULT_WRITE_MAX_ATTEMPTS = 3;\nconst DEFAULT_WRITE_RETRY_DELAY_MS = 100;\nconst LOCKED_FILE_ERROR_CODES = new Set([\"EACCES\", \"EBUSY\", \"EPERM\"]);\nconst pendingOperations = new Map<string, Promise<void>>();\n\nexport class FileSnapshotBackend implements SnapshotBackend {\n readonly #writeMaxAttempts: number;\n readonly #writeRetryDelayMs: number;\n\n constructor(\n readonly path: string,\n options: FileSnapshotBackendOptions = {}\n ) {\n this.#writeMaxAttempts = options.writeMaxAttempts ?? DEFAULT_WRITE_MAX_ATTEMPTS;\n this.#writeRetryDelayMs = options.writeRetryDelayMs ?? DEFAULT_WRITE_RETRY_DELAY_MS;\n }\n\n async read(): Promise<Snapshot | undefined> {\n try {\n return JSON.parse(await readFile(this.path, \"utf8\")) as Snapshot;\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n return undefined;\n }\n\n if (error instanceof SyntaxError) {\n throw new Error(`Failed to parse snapshot at ${this.path}: ${error.message}`);\n }\n\n throw error;\n }\n }\n\n async write(snapshot: Snapshot): Promise<void> {\n await enqueueOperation(this.path, () =>\n writeSnapshotAtomically(this.path, snapshot, {\n maxAttempts: this.#writeMaxAttempts,\n retryDelayMs: this.#writeRetryDelayMs\n })\n );\n }\n\n async remove(): Promise<void> {\n await enqueueOperation(this.path, async () => {\n try {\n await unlink(this.path);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n });\n }\n}\n\nasync function writeSnapshotAtomically(\n snapshotPath: string,\n snapshot: Snapshot,\n options: {\n maxAttempts: number;\n retryDelayMs: number;\n }\n): Promise<void> {\n const parentPath = dirname(snapshotPath);\n const contents = serializeSafeJSSnapshot(snapshot);\n\n await assertParentDirectoryExists(snapshotPath, parentPath);\n\n for (let attempt = 1; attempt <= options.maxAttempts; attempt += 1) {\n try {\n const temporaryPath = `${snapshotPath}.${randomUUID()}.tmp`;\n await writeSnapshotOnce(temporaryPath, snapshotPath, contents);\n return;\n } catch (error) {\n if (hasErrorCode(error, \"EEXIST\")) {\n if (attempt === options.maxAttempts) {\n throw new Error(\n `Failed to write snapshot at ${snapshotPath} after ${options.maxAttempts} attempts: temporary path already exists`,\n {\n cause: error\n }\n );\n }\n\n continue;\n }\n\n if (!isLockedFileError(error)) {\n throw error;\n }\n\n if (attempt === options.maxAttempts) {\n throw new Error(\n `Failed to write snapshot at ${snapshotPath} after ${options.maxAttempts} attempts: file is locked (${getOwnErrorCode(error)})`,\n {\n cause: error\n }\n );\n }\n\n await delay(options.retryDelayMs);\n }\n }\n}\n\nasync function assertParentDirectoryExists(\n snapshotPath: string,\n parentPath: string\n): Promise<void> {\n try {\n const parent = await stat(parentPath);\n if (!parent.isDirectory()) {\n throw new Error(\n `Cannot write snapshot at ${snapshotPath}: parent path ${parentPath} is not a directory`\n );\n }\n } catch (error) {\n if (hasErrorCode(error, \"ENOENT\")) {\n throw new Error(\n `Cannot write snapshot at ${snapshotPath}: parent directory ${parentPath} does not exist`,\n {\n cause: error\n }\n );\n }\n\n throw error;\n }\n}\n\nasync function writeSnapshotOnce(\n temporaryPath: string,\n snapshotPath: string,\n contents: string\n): Promise<void> {\n let temporaryCreated = false;\n let renamed = false;\n try {\n try {\n await writeFile(temporaryPath, contents, { encoding: \"utf8\", flag: \"wx\" });\n temporaryCreated = true;\n } catch (error) {\n if (!hasErrorCode(error, \"EEXIST\")) {\n await removeTemporarySnapshot(temporaryPath).catch(() => undefined);\n }\n throw error;\n }\n await rename(temporaryPath, snapshotPath);\n renamed = true;\n } finally {\n if (temporaryCreated && !renamed) {\n await removeTemporarySnapshot(temporaryPath).catch(() => undefined);\n }\n }\n}\n\nasync function enqueueOperation(path: string, operation: () => Promise<void>): Promise<void> {\n const previous = pendingOperations.get(path) ?? Promise.resolve();\n const pending = previous.catch(() => undefined).then(operation);\n const queued = pending.catch(() => undefined);\n pendingOperations.set(path, queued);\n try {\n await pending;\n } finally {\n if (pendingOperations.get(path) === queued) {\n pendingOperations.delete(path);\n }\n }\n}\n\nasync function removeTemporarySnapshot(temporaryPath: string): Promise<void> {\n try {\n await unlink(temporaryPath);\n } catch (error) {\n if (!hasErrorCode(error, \"ENOENT\")) {\n throw error;\n }\n }\n}\n\nasync function delay(ms: number): Promise<void> {\n if (ms === 0) {\n return;\n }\n\n await new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction hasErrorCode(error: unknown, code: string): boolean {\n return hasOwnErrorCode(error, code);\n}\n\nfunction isLockedFileError(error: unknown): boolean {\n const code = getOwnErrorCode(error);\n return code !== undefined && LOCKED_FILE_ERROR_CODES.has(code);\n}\n", "import {\n FileSnapshotBackend,\n type FileSnapshotBackendOptions,\n type Snapshot,\n type SnapshotBackend\n} from \"./backend.js\";\n\nconst DEFAULT_SNAPSHOT_INTERVAL_MS = 30_000;\n\nexport type SnapshotSchedulerOptions = {\n snapshotBackend?: SnapshotBackend;\n snapshotIntervalMs?: number;\n snapshotPath?: string;\n snapshotWriteMaxAttempts?: number;\n snapshotWriteRetryDelayMs?: number;\n};\n\nexport type SnapshotScheduler<TSnapshot> = {\n finish(): Promise<void>;\n onYield(createSnapshot: () => TSnapshot): void;\n pause(): void;\n resume(): void;\n write(snapshot: TSnapshot): Promise<void>;\n};\n\nexport function createSnapshotScheduler<TSnapshot>(\n options: SnapshotSchedulerOptions\n): SnapshotScheduler<TSnapshot> {\n const snapshotBackend =\n options.snapshotBackend ??\n (options.snapshotPath === undefined\n ? undefined\n : new FileSnapshotBackend(options.snapshotPath, createFileSnapshotBackendOptions(options)));\n\n if (snapshotBackend === undefined) {\n return {\n async finish() {},\n onYield() {},\n pause() {},\n resume() {},\n async write() {}\n };\n }\n\n const intervalMs = options.snapshotIntervalMs ?? DEFAULT_SNAPSHOT_INTERVAL_MS;\n if (intervalMs === 0) {\n return {\n async finish() {},\n onYield() {},\n pause() {},\n resume() {},\n async write(snapshot) {\n await snapshotBackend.write(snapshot as Snapshot);\n }\n };\n }\n\n let nextCheckpointAt = Date.now() + intervalMs;\n let pendingWrite = Promise.resolve();\n let isPaused = false;\n const writeErrors: unknown[] = [];\n\n return {\n async finish() {\n await pendingWrite;\n if (writeErrors.length > 0) {\n throw writeErrors[0];\n }\n },\n onYield(createSnapshot) {\n if (isPaused) {\n return;\n }\n\n if (Date.now() < nextCheckpointAt) {\n return;\n }\n\n nextCheckpointAt = Date.now() + intervalMs;\n const snapshot = createSnapshot();\n pendingWrite = pendingWrite\n .catch(() => undefined)\n .then(async () => {\n try {\n await snapshotBackend.write(snapshot as Snapshot);\n } catch (error) {\n writeErrors.push(error);\n }\n });\n },\n pause() {\n isPaused = true;\n },\n resume() {\n if (!isPaused) {\n return;\n }\n\n isPaused = false;\n nextCheckpointAt = Date.now() + intervalMs;\n },\n async write(snapshot) {\n await pendingWrite.catch(() => undefined);\n await snapshotBackend.write(snapshot as Snapshot);\n }\n };\n}\n\nfunction createFileSnapshotBackendOptions(\n options: SnapshotSchedulerOptions\n): FileSnapshotBackendOptions {\n return {\n writeMaxAttempts: options.snapshotWriteMaxAttempts,\n writeRetryDelayMs: options.snapshotWriteRetryDelayMs\n };\n}\n", "import { weakReferenceStates } from \"../interp/weak-reference.js\";\nimport { getIntrinsicRealmIdentity } from \"../interp/intrinsics.js\";\nimport { getFunctionRealmPrototype } from \"../interp/function-realm.js\";\nimport { finalizationRegistryStates } from \"../interp/finalization-registry-state.js\";\nimport { wellKnownSymbols } from \"../interp/symbols.js\";\nimport { hashSource } from \"../parse/hash.js\";\nimport { weakCollectionStates, type WeakCollectionKey } from \"../interp/weak-collection.js\";\nimport type { PropertyDescriptorData } from \"./property-descriptors.js\";\nimport { serializeCollectionProperties } from \"./collection-properties.js\";\nimport { hasCustomRegexProperties, serializeRegexProperties, type RegexPropertyData } from \"./regexp-properties.js\";\nimport { ownSerializableSymbolKeys, serializeSymbol, serializeSymbolProperties, type SerializedSymbol, type SerializedSymbolProperty } from \"./symbols.js\";\nimport { collectionIteratorState, isSandboxCollectionIterator, snapshotCollectionIterator, type CollectionIterationMethod, type SandboxCollectionIterator } from \"../interp/collection-iterator.js\";\nimport { isSandboxRegExpIterator, regexpIteratorState, type SandboxRegExpIterator } from \"../interp/regexp-iterator.js\";\nimport { hasGuestObjectState, hasNullObjectPrototype, isGuestClosure } from \"../interp/object-model.js\";\nimport { sandboxErrorTypes, type SandboxErrorName } from \"../error/shape.js\";\nimport { assertSnapshotDataDepth, assertSnapshotGraphDepth } from \"../graph-depth.js\";\nimport { captureGuestHeapNode, type GuestHeapNode, type GuestObjectState, type PrivateElementData } from \"./guest-heap.js\";\nimport { getClosureOrigin, getGeneratorOrigin } from \"../interp/closure-origin.js\";\nimport { classOrigins } from \"../interp/classes.js\";\nimport { functionSources, templateSources } from \"../parse/function-source.js\";\nimport { templateOrigins, templateRealmIdentities } from \"../interp/template-objects.js\";\nimport { serializeArguments, type SerializedArguments } from \"./arguments.js\";\nimport { requiresArrayEntries, serializeArray, type SerializedArray } from \"./arrays.js\";\nimport { typedArrayStorage, isNumericTypedArray, type NumericTypedArray } from \"../interp/typed-array.js\";\nimport { captureTypedArrayState, encodeTypedArrayLayout, type TypedArrayData } from \"./typed-array.js\";\nimport { isSandboxArrayBuffer } from \"../interp/array-buffer.js\";\nimport { isSandboxSharedArrayBuffer } from \"../interp/shared-array-buffer.js\";\nimport { encodeSharedArrayBufferStorage, type SharedArrayBufferData } from \"./shared-array-buffer.js\";\nimport { dataViewBuffer, isSandboxDataView } from \"../interp/data-view.js\";\nimport { captureDataViewState, encodeDataViewLayout, type DataViewData } from \"./data-view.js\";\nimport { captureArrayBufferState, encodeArrayBufferStorage, type ArrayBufferData } from \"./array-buffer.js\";\nimport { dateDataProperties, isSandboxDate } from \"../interp/date.js\";\nimport { serializeDate, type SerializedDate } from \"./date-properties.js\";\nimport { boxedDataProperties, isSandboxBox, type SandboxBox } from \"../interp/boxed.js\";\nimport { encodeBoxedData, type BoxedData } from \"./boxed.js\";\nimport {\n isSandboxClosure,\n isSandboxArguments,\n isSandboxGenerator,\n isSandboxMap,\n isSandboxRegex,\n getRegexProperties,\n isSandboxSet,\n type SandboxMap,\n type SandboxArray,\n type SandboxClosure,\n type SandboxGenerator,\n type SandboxPromise,\n type SandboxRegex,\n type SandboxSet\n} from \"../interp/values.js\";\n\ntype SnapshotId = number | string;\n\ntype SerializedUndefinedValue = {\n kind: \"undefined\";\n};\n\ntype SerializedNonFiniteNumber = {\n kind: \"number\";\n value: \"-Infinity\" | \"Infinity\" | \"NaN\" | \"-0\";\n};\n\nexport type SerializedClosureValue = {\n kind: \"fn\";\n astNodeId: number;\n capturedScopeId: SnapshotId;\n};\n\nexport type SerializedGeneratorValue =\n { async?: boolean } & ({\n kind: \"generator\";\n state: \"start\";\n astNodeId: number;\n capturedScopeId: SnapshotId;\n }\n | {\n kind: \"generator\";\n state: \"suspended\";\n astNodeId: number;\n capturedScopeId: SnapshotId;\n yieldNodeId: number;\n sent: SerializedSnapshotValue;\n }\n | {\n kind: \"generator\";\n state: \"done\";\n });\n\nexport type SerializedPromiseValue = {\n kind: \"promise\";\n id: SnapshotId;\n};\n\nexport type SerializedReferenceValue = {\n kind: \"ref\";\n id: number;\n};\n\nexport type SerializedHeapValue =\n | (SharedArrayBufferData<SerializedReferenceValue> & {state:GuestObjectState<SerializedSnapshotValue>})\n | (DataViewData<SerializedReferenceValue> & { state: GuestObjectState<SerializedSnapshotValue> })\n | (ArrayBufferData<SerializedReferenceValue> & { state: GuestObjectState<SerializedSnapshotValue> })\n | GuestHeapNode<SerializedSnapshotValue>\n | { kind: \"regexp-iterator\"; matcher: SerializedSnapshotValue; input: SerializedSnapshotValue; exhausted: boolean; global?: boolean; unicode?: boolean; entries: Record<string, SerializedSnapshotValue>; symbolEntries?: Array<SerializedSymbolProperty<SerializedSnapshotValue>> }\n | SerializedSymbol\n | BoxedData<SerializedSnapshotValue>\n | ({ kind: \"regex-object\"; source: string; flags: string; lastIndex: SerializedSnapshotValue } & RegexPropertyData<SerializedSnapshotValue>)\n | { kind: \"collection-iterator\"; collectionKind: \"map\" | \"set\"; method: CollectionIterationMethod; collection: SerializedSnapshotValue; index: number; exhausted: boolean; entries: Record<string, SerializedSnapshotValue> }\n | SerializedDate<SerializedSnapshotValue>\n | (TypedArrayData<SerializedReferenceValue> & { entries: Record<string, SerializedSnapshotValue>; state?: GuestObjectState<SerializedSnapshotValue> })\n | SerializedArguments<SerializedSnapshotValue>\n | SerializedArray<SerializedSnapshotValue>\n | {\n kind: \"object\";\n sandboxNullPrototype?: true;\n entries: Record<string, SerializedSnapshotValue>;\n symbolEntries?: Array<SerializedSymbolProperty<SerializedSnapshotValue>>;\n errorType?: SandboxErrorName;\n }\n | {\n kind: \"map\";\n privateElements?: PrivateElementData<SerializedSnapshotValue>[];\n prototype?: SerializedSnapshotValue;\n propertyState?: PropertyDescriptorData<SerializedSnapshotValue>;\n entries: Array<[SerializedSnapshotValue, SerializedSnapshotValue]>;\n }\n | {\n kind: \"set\";\n privateElements?: PrivateElementData<SerializedSnapshotValue>[];\n prototype?: SerializedSnapshotValue;\n propertyState?: PropertyDescriptorData<SerializedSnapshotValue>;\n values: SerializedSnapshotValue[];\n };\n\nexport type SerializedSnapshotValue =\n | boolean\n | null\n | number\n | string\n | SerializedClosureValue\n | SerializedGeneratorValue\n | SerializedNonFiniteNumber\n | SerializedPromiseValue\n | SerializedReferenceValue\n | SerializedUndefinedValue\n | { kind: \"regex\"; source: string; flags: string; lastIndex: number }\n | SerializedSnapshotValue[]\n | {\n [key: string]: SerializedSnapshotValue;\n };\n\nexport type RuntimeClosureValue = {\n kind: \"fn\";\n astNodeId: number;\n capturedScopeId: SnapshotId;\n call?: unknown;\n};\n\nexport type RuntimePromiseValue = {\n kind: \"promise\";\n id: SnapshotId;\n promise?: Promise<unknown>;\n};\n\nexport type RuntimeSnapshotValue =\n | bigint\n | symbol\n | SandboxBox\n | Date\n | NumericTypedArray\n | ArrayBuffer\n | SharedArrayBuffer\n | DataView<ArrayBufferLike>\n | boolean\n | null\n | number\n | string\n | undefined\n | RuntimeClosureValue\n | SandboxClosure\n | SandboxGenerator\n | SandboxCollectionIterator\n | SandboxRegExpIterator\n | RuntimePromiseValue\n | SandboxPromise\n | SandboxMap\n | SandboxRegex\n | SandboxSet\n | RuntimeSnapshotValue[]\n | {\n [key: string]: RuntimeSnapshotValue;\n };\n\nexport type RuntimeScopeFrame = {\n id: SnapshotId;\n parentId?: SnapshotId;\n bindings: Record<string, RuntimeSnapshotValue>;\n};\n\nexport type SerializedScopeFrame = {\n id: SnapshotId;\n parentId?: SnapshotId;\n bindings: Record<string, SerializedSnapshotValue>;\n};\n\nexport type RuntimeCallFrame = {\n astNodeId: number;\n scopeId: SnapshotId;\n awaitingPromiseId?: SnapshotId;\n};\n\nexport type SerializedCallFrame = RuntimeCallFrame;\n\nexport type RuntimePendingPromise = {\n id: SnapshotId;\n promise?: Promise<unknown>;\n [key: string]: RuntimeSnapshotValue | Promise<unknown> | SnapshotId | undefined;\n};\n\nexport type SerializedPendingPromise = {\n id: SnapshotId;\n [key: string]: SerializedSnapshotValue | SnapshotId;\n};\n\nexport type SerializeInput = {\n source: string;\n currentAstNodeId: number;\n scopeChain: RuntimeScopeFrame[];\n callStack: RuntimeCallFrame[];\n pendingPromises: RuntimePendingPromise[];\n moduleBindings: Record<string, string>;\n};\n\nexport type SerializedSnapshot = {\n sourceHash: string;\n currentAstNodeId: number;\n scopeChain: SerializedScopeFrame[];\n callStack: SerializedCallFrame[];\n pendingPromises: SerializedPendingPromise[];\n moduleBindings: Record<string, string>;\n heap?: Record<string, SerializedHeapValue>;\n};\n\ntype SerializationState = {\n source: string;\n moduleSources: Map<string, number>;\n intrinsicRealms: Map<object, number>;\n float32Buffers: WeakMap<ArrayBuffer, number>;\n sharedBlocks?:WeakMap<object,number>;\n ancestors: WeakMap<object, string>;\n heap: Record<string, SerializedHeapValue>;\n heapIds: Map<object | symbol, number>;\n guestValues: Set<object>;\n weakEntries: Map<object, Array<[WeakCollectionKey, unknown]>>;\n weakTargets: Map<object, object | symbol>;\n finalizationTargets: Map<object, Array<{target?:object | symbol;token?:object | symbol}>>;\n serializedHeapIds: Set<number>;\n};\n\nexport class UnsnapshotableValueError extends Error {\n readonly path: string;\n\n constructor(path: string) {\n super(\n \"Cannot snapshot a generator suspended mid-iteration; drain or discard it before the await boundary.\"\n );\n this.name = \"UnsnapshotableValueError\";\n this.path = path;\n }\n}\n\nexport function serialize(input: SerializeInput): SerializedSnapshot {\n for (const [scopeIndex, scope] of input.scopeChain.entries()) {\n for (const [name, value] of Object.entries(scope.bindings)) {\n assertSnapshotGraphDepth(value, `scopeChain[${scopeIndex}].bindings.${name}`);\n }\n }\n for (const [promiseIndex, promise] of input.pendingPromises.entries()) {\n for (const [key, value] of Object.entries(promise)) {\n if (key !== \"id\" && key !== \"promise\") {\n assertSnapshotGraphDepth(value, `pendingPromises[${promiseIndex}].${key}`);\n }\n }\n }\n const state: SerializationState = {\n source: input.source,\n moduleSources: new Map(),\n intrinsicRealms: new Map(),\n float32Buffers: new WeakMap(),\n ancestors: new WeakMap(),\n heap: Object.create(null) as Record<string, SerializedHeapValue>,\n ...indexHeapContainers(input),\n serializedHeapIds: new Set()\n };\n\n const snapshot: SerializedSnapshot = {\n sourceHash: hashSource(input.source),\n currentAstNodeId: input.currentAstNodeId,\n scopeChain: input.scopeChain.map((scope, index) =>\n serializeScopeFrame(scope, `scopeChain[${index}]`, state)\n ),\n callStack: input.callStack.map((frame) => ({ ...frame })),\n pendingPromises: input.pendingPromises.map((promise, index) =>\n serializePendingPromise(promise, `pendingPromises[${index}]`, state)\n ),\n moduleBindings: { ...input.moduleBindings }\n };\n\n if (Object.keys(state.heap).length === 0) {\n return snapshot;\n }\n\n if (state.intrinsicRealms.size === 1) {\n for (const node of Object.values(state.heap)) if (node.kind === \"intrinsic\" || node.kind === \"guest-function\" || node.kind === \"guest-class\" || node.kind === \"guest-generator\" || node.kind === \"guest-array\") delete node.realm;\n }\n\n return {\n ...snapshot,\n heap: state.heap\n };\n}\n\nfunction serializeScopeFrame(\n scope: RuntimeScopeFrame,\n path: string,\n state: SerializationState\n): SerializedScopeFrame {\n const bindings = Object.create(null) as Record<string, SerializedSnapshotValue>;\n\n for (const [name, value] of Object.entries(scope.bindings)) {\n bindings[name] = serializeValue(value, `${path}.bindings.${name}`, state);\n }\n\n return scope.parentId === undefined\n ? {\n id: scope.id,\n bindings\n }\n : {\n id: scope.id,\n parentId: scope.parentId,\n bindings\n };\n}\n\nfunction serializePendingPromise(\n pendingPromise: RuntimePendingPromise,\n path: string,\n state: SerializationState\n): SerializedPendingPromise {\n const serialized: SerializedPendingPromise = {\n id: pendingPromise.id\n };\n\n for (const [key, value] of Object.entries(pendingPromise)) {\n if (key === \"id\" || key === \"promise\") {\n continue;\n }\n\n serialized[key] = serializeValue(value as RuntimeSnapshotValue, `${path}.${key}`, state);\n }\n\n return serialized;\n}\n\nfunction serializeValue(\n value: RuntimeSnapshotValue,\n path: string,\n state: SerializationState\n): SerializedSnapshotValue {\n if (typeof value === \"symbol\") return serializeSymbol(value, state.heapIds, state.heap);\n if (typeof value === \"object\" && value !== null && state.guestValues.has(value)) {\n const id = state.heapIds.get(value)!;\n if (!state.serializedHeapIds.has(id)) {\n state.serializedHeapIds.add(id);\n const node = captureGuestHeapNode(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<guest>`, state), state.weakEntries.get(value), state.weakTargets.get(value), state.finalizationTargets.get(value));\n if (node === undefined) throw new TypeError(`Missing guest heap state at ${path}.`);\n if ((node.kind === \"guest-function\" || node.kind === \"guest-class\" || node.kind === \"guest-generator\" || node.kind === \"guest-array\") && node.dynamicSource === undefined) {\n const origin = getClosureOrigin(value) ?? classOrigins.get(value) ?? getGeneratorOrigin(value);\n const template = Array.isArray(value) ? templateOrigins.get(value as SandboxArray) : undefined;\n const body = template === undefined\n ? origin === undefined ? undefined : functionSources.get(origin.node)?.text\n : templateSources.get(template);\n if (body !== undefined && body !== state.source) {\n let sourceId = state.moduleSources.get(body);\n if (sourceId === undefined) {\n const source = { kind: \"guest-source\" as const, functionKind: \"module\" as const, parameters: \"\", body };\n sourceId = state.heapIds.size + 1;\n state.heapIds.set(source, sourceId);\n state.moduleSources.set(body, sourceId);\n state.heap[String(sourceId)] = source;\n }\n node.dynamicSource = { kind: \"ref\", id: sourceId };\n }\n }\n if (node.kind === \"intrinsic\" || node.kind === \"guest-function\" || node.kind === \"guest-class\" || node.kind === \"guest-generator\" || node.kind === \"guest-array\") {\n const realmValue = node.kind === \"intrinsic\" ? value\n : isSandboxClosure(value) ? getFunctionRealmPrototype(value, \"Object\", undefined) : undefined;\n const origin = node.kind === \"guest-array\" ? templateRealmIdentities.get(value)\n : node.kind === \"guest-generator\" ? getGeneratorOrigin(value)?.realmIdentity\n : realmValue === undefined ? undefined : getIntrinsicRealmIdentity(realmValue);\n if (origin === undefined && node.kind === \"intrinsic\") throw new TypeError(\"Missing intrinsic realm identity.\");\n if (origin !== undefined) {\n let realm = state.intrinsicRealms.get(origin);\n if (realm === undefined) state.intrinsicRealms.set(origin, realm = state.intrinsicRealms.size + 1);\n node.realm = realm;\n }\n }\n state.heap[String(id)] = node;\n }\n return { kind: \"ref\", id };\n }\n if (isSandboxClosure(value) && !isGuestClosure(value)) throw new TypeError(`Cannot serialize host reference at ${path}.`);\n if (typeof value === \"object\" && value !== null && hasGuestObjectState(value) && !isSandboxMap(value) && !isSandboxSet(value) && !isNumericTypedArray(value) && !isSandboxArrayBuffer(value) && !isSandboxSharedArrayBuffer(value) && !isSandboxDataView(value)) {\n throw new TypeError(\"Guest function properties and prototype links cannot be serialized.\");\n }\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (value === undefined) {\n return {\n kind: \"undefined\"\n };\n }\n\n if (typeof value === \"number\") {\n if (Object.is(value, -0)) return { kind: \"number\", value: \"-0\" };\n if (Number.isFinite(value)) {\n return value;\n }\n\n return {\n kind: \"number\",\n value: Number.isNaN(value)\n ? \"NaN\"\n : value === Number.POSITIVE_INFINITY\n ? \"Infinity\"\n : \"-Infinity\"\n };\n }\n\n if (typeof value === \"bigint\") return { kind: \"bigint\", value: String(value) };\n\n if (Array.isArray(value)) {\n const reference = serializeHeapReference(value, path, state);\n if (reference !== undefined) {\n return reference;\n }\n\n return withSerializableContainer(value, path, state, () =>\n value.map((entry, index) => serializeValue(entry, `${path}[${index}]`, state))\n );\n }\n\n if (isRuntimeClosureValue(value)) {\n return {\n kind: \"fn\",\n astNodeId: value.astNodeId,\n capturedScopeId: value.capturedScopeId\n };\n }\n\n if (isSandboxGenerator(value)) {\n if (value.state === \"done\") {\n return {\n kind: \"generator\",\n state: \"done\",\n ...(value.async ? { async: true } : {})\n };\n }\n\n if (value.state === \"suspended\" || value.state === \"running\") {\n const continuation = value.channel.snapshot();\n if (continuation.yieldNodeId === undefined) {\n throw new UnsnapshotableValueError(path);\n }\n if (value.astNodeId === undefined || value.capturedScopeId === undefined) {\n throw new TypeError(`Cannot serialize generator without origin metadata at ${path}.`);\n }\n return {\n kind: \"generator\",\n state: \"suspended\",\n ...(value.async ? { async: true } : {}),\n astNodeId: value.astNodeId,\n capturedScopeId: value.capturedScopeId,\n yieldNodeId: continuation.yieldNodeId,\n sent: serializeValue(continuation.sent as RuntimeSnapshotValue, `${path}.sent`, state)\n };\n }\n\n if (value.astNodeId === undefined || value.capturedScopeId === undefined) {\n throw new TypeError(`Cannot serialize generator without origin metadata at ${path}.`);\n }\n\n return {\n kind: \"generator\",\n state: \"start\",\n ...(value.async ? { async: true } : {}),\n astNodeId: value.astNodeId,\n capturedScopeId: value.capturedScopeId\n };\n }\n\n if (isRuntimePromiseValue(value)) {\n return {\n kind: \"promise\",\n id: value.id\n };\n }\n\n if (isSandboxRegex(value)) {\n const reference = serializeHeapReference(value, path, state);\n if (reference !== undefined) return reference;\n if (typeof value.lastIndex !== \"number\") throw new TypeError(`Missing regex heap reference at ${path}.`);\n return { kind: \"regex\", source: value.source, flags: value.flags, lastIndex: value.lastIndex };\n }\n\n if (isSandboxSharedArrayBuffer(value) || isSandboxDataView(value) || isSandboxArrayBuffer(value) || isSandboxBox(value) || isSandboxDate(value) || isSandboxMap(value) || isSandboxSet(value) || isSandboxRegExpIterator(value) || isSandboxCollectionIterator(value) || isNumericTypedArray(value)) {\n const reference = serializeHeapReference(value, path, state);\n if (reference === undefined) {\n throw new TypeError(`Cannot serialize collection without a heap reference at ${path}.`);\n }\n return reference;\n }\n\n if (!isPlainObject(value)) {\n throw new TypeError(`Cannot serialize host reference at ${path}.`);\n }\n\n const reference = serializeHeapReference(value, path, state);\n if (reference !== undefined) {\n return reference;\n }\n\n const serialized = Object.create(null) as Record<string, SerializedSnapshotValue>;\n\n return withSerializableContainer(value, path, state, () => {\n for (const [key, entry] of Object.entries(value)) {\n serialized[key] = serializeValue(entry, `${path}.${key}`, state);\n }\n\n return serialized;\n });\n}\n\nfunction serializeHeapReference(\n value:\n | SandboxBox\n | RuntimeSnapshotValue[]\n | Record<string, RuntimeSnapshotValue>\n | SandboxMap\n | SandboxSet\n | SandboxRegex\n | SandboxCollectionIterator\n | SandboxRegExpIterator\n | Date\n | NumericTypedArray\n | ArrayBufferLike | DataView<ArrayBufferLike>,\n path: string,\n state: SerializationState\n): SerializedReferenceValue | undefined {\n const id = state.heapIds.get(value);\n if (id === undefined) {\n return undefined;\n }\n\n if (!state.serializedHeapIds.has(id)) {\n state.serializedHeapIds.add(id);\n\n if (isSandboxRegex(value)) {\n state.heap[String(id)] = { kind: \"regex-object\", source: value.source, flags: value.flags,\n lastIndex: serializeValue(value.lastIndex as RuntimeSnapshotValue, `${path}.lastIndex`, state),\n ...serializeRegexProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<regex-property>`, state)) };\n } else if (isSandboxRegExpIterator(value)) {\n const snapshot = regexpIteratorState(value);\n const entries: Record<string, SerializedSnapshotValue> = Object.create(null);\n state.heap[String(id)] = {\n kind: \"regexp-iterator\", matcher: serializeValue(snapshot.matcher as RuntimeSnapshotValue, `${path}.<matcher>`, state),\n ...(snapshot.global === undefined ? {} : { global: snapshot.global, unicode: snapshot.unicode }),\n input: serializeValue(snapshot.input, `${path}.<input>`, state), exhausted: snapshot.exhausted, entries,\n symbolEntries: serializeSymbolProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.[symbol]`, state))\n };\n for (const [key, entry] of Object.entries(value)) entries[key] = serializeValue(entry as RuntimeSnapshotValue, `${path}.${key}`, state);\n } else if (isSandboxCollectionIterator(value)) {\n const snapshot = snapshotCollectionIterator(value);\n const entries: Record<string, SerializedSnapshotValue> = Object.create(null);\n state.heap[String(id)] = {\n kind: \"collection-iterator\", collectionKind: snapshot.collectionKind, method: snapshot.method,\n collection: serializeValue(snapshot.collection, `${path}.<collection>`, state),\n index: snapshot.index, exhausted: snapshot.exhausted, entries\n };\n for (const [key, entry] of Object.entries(value)) entries[key] = serializeValue(entry as RuntimeSnapshotValue, `${path}.${key}`, state);\n } else if (isSandboxBox(value)) {\n state.heap[String(id)] = encodeBoxedData(value, (entry, key) => serializeValue(entry as RuntimeSnapshotValue, `${path}.${key}`, state));\n } else if (isSandboxDate(value)) {\n state.heap[String(id)] = serializeDate(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<date-property>`, state));\n } else if (isSandboxDataView(value)) {\n state.heap[String(id)] = { ...encodeDataViewLayout(value),\n buffer: serializeHeapReference(dataViewBuffer(value), `${path}.buffer`, state)!,\n state: captureDataViewState(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<view>`, state)) };\n } else if (isSandboxSharedArrayBuffer(value)) {\n state.sharedBlocks??=new WeakMap();\n state.heap[String(id)]={...encodeSharedArrayBufferStorage(value,id,state.sharedBlocks,id=>({kind:\"ref\" as const,id})),\n state:captureArrayBufferState(value,entry=>serializeValue(entry as RuntimeSnapshotValue,`${path}.<buffer>`,state))};\n } else if (isSandboxArrayBuffer(value)) {\n state.heap[String(id)] = { ...encodeArrayBufferStorage(value, id, state.float32Buffers, id => ({ kind: \"ref\" as const, id })),\n state: captureArrayBufferState(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<buffer>`, state)) };\n } else if (isNumericTypedArray(value)) {\n const storage = typedArrayStorage(value);\n state.heap[String(id)] = { ...encodeTypedArrayLayout(value),\n buffer: serializeHeapReference(storage.buffer, `${path}.buffer`, state)!, entries: {},\n state: captureTypedArrayState(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<typed-array>`, state)) };\n } else if (isSandboxArguments(value)) {\n state.heap[String(id)] = serializeArguments(value, (entry, key) =>\n serializeValue(entry as RuntimeSnapshotValue, `${path}.${key}`, state)\n );\n } else if (isSandboxMap(value)) {\n state.heap[String(id)] = {\n kind: \"map\",\n ...serializeCollectionProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<property>`, state)),\n entries: [...value.entries].map(([key, entry], index) => [\n serializeValue(key as RuntimeSnapshotValue, `${path}.entries[${index}][0]`, state),\n serializeValue(entry as RuntimeSnapshotValue, `${path}.entries[${index}][1]`, state)\n ])\n };\n } else if (isSandboxSet(value)) {\n state.heap[String(id)] = {\n kind: \"set\",\n ...serializeCollectionProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.<property>`, state)),\n values: [...value.values].map((entry, index) =>\n serializeValue(entry as RuntimeSnapshotValue, `${path}.values[${index}]`, state)\n )\n };\n } else if (Array.isArray(value)) {\n const array = serializeArray(value, (entry, key) =>\n serializeValue(entry as RuntimeSnapshotValue, `${path}[${key}]`, state)\n );\n state.heap[String(id)] = array;\n const symbols = serializeSymbolProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.[symbol]`, state));\n if (symbols.length > 0) array.symbolEntries = symbols;\n } else {\n const entries = Object.create(null) as Record<string, SerializedSnapshotValue>;\n const errorType = sandboxErrorTypes.get(value);\n const serializedObject: Extract<SerializedHeapValue, { kind: \"object\" }> = {\n kind: \"object\",\n ...(hasNullObjectPrototype(value) ? { sandboxNullPrototype: true as const } : {}),\n entries,\n ...(errorType === undefined ? {} : { errorType })\n };\n state.heap[String(id)] = serializedObject;\n\n for (const [key, entry] of Object.entries(value)) {\n entries[key] = serializeValue(entry, `${path}.${key}`, state);\n }\n const symbolKeys = ownSerializableSymbolKeys(value);\n if (symbolKeys.length > 0) {\n serializedObject.symbolEntries = serializeSymbolProperties(value, entry => serializeValue(entry as RuntimeSnapshotValue, `${path}.[symbol]`, state));\n }\n }\n }\n\n return {\n kind: \"ref\",\n id\n };\n}\n\nfunction isRuntimeClosureValue(value: unknown): value is RuntimeClosureValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n hasOwnProperty(value, \"kind\") &&\n value.kind === \"fn\" &&\n hasOwnProperty(value, \"astNodeId\") &&\n typeof value.astNodeId === \"number\" &&\n hasOwnProperty(value, \"capturedScopeId\") &&\n (typeof value.capturedScopeId === \"number\" || typeof value.capturedScopeId === \"string\")\n );\n}\n\nfunction isRuntimePromiseValue(value: unknown): value is RuntimePromiseValue {\n return (\n typeof value === \"object\" &&\n value !== null &&\n hasOwnProperty(value, \"kind\") &&\n value.kind === \"promise\" &&\n hasOwnProperty(value, \"id\")\n );\n}\n\nfunction isPlainObject(value: object): value is Record<string, RuntimeSnapshotValue> {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction hasOwnProperty<Name extends PropertyKey>(\n value: object,\n name: Name\n): value is Record<Name, unknown> {\n return Object.prototype.hasOwnProperty.call(value, name);\n}\n\nfunction withSerializableContainer<TValue>(\n value: object,\n path: string,\n state: SerializationState,\n serializeContainer: () => TValue\n): TValue {\n const ancestorPath = state.ancestors.get(value);\n if (ancestorPath !== undefined) {\n throw new TypeError(`Cannot serialize cyclic value at ${path}.`);\n }\n\n state.ancestors.set(value, path);\n\n try {\n return serializeContainer();\n } finally {\n state.ancestors.delete(value);\n }\n}\n\nfunction indexHeapContainers(input: SerializeInput): Pick<SerializationState, \"heapIds\" | \"guestValues\" | \"weakEntries\" | \"weakTargets\" | \"finalizationTargets\"> {\n const stats = new Map<\n object,\n {\n count: number;\n cyclic: boolean;\n expanded: boolean;\n forceHeap?: boolean;\n }\n >();\n const ancestors = new WeakSet<object>();\n const guestValues = new Set<object>();\n const weakEntries = new Map<object, Array<[WeakCollectionKey, unknown]>>();\n const seenSymbols = new Set<symbol>();\n type Contribution = { owner: object; key: WeakCollectionKey; value: unknown; depth: number };\n const waiting = new Map<WeakCollectionKey, Contribution[]>();\n const ready: Contribution[] = [];\n const reached = (value: WeakCollectionKey, depth: number) => {\n if (typeof value === \"symbol\") {\n if (seenSymbols.has(value)) return;\n seenSymbols.add(value);\n }\n const unlocked = waiting.get(value);\n if (unlocked !== undefined) {\n for (const contribution of unlocked) ready.push(contribution);\n waiting.delete(value);\n }\n if (typeof value === \"symbol\") return;\n const weakState = weakCollectionStates.get(value);\n if (weakState === undefined) return;\n weakEntries.set(value, []);\n for (const reference of weakState.references) {\n const key = reference.deref();\n if (key === undefined) continue;\n const entry = weakState.entries.get(key);\n if (entry === undefined) continue;\n const contribution = { owner: value, key, value: weakState.kind === \"map\" ? entry.value : undefined, depth: depth + 1 };\n if (typeof key === \"symbol\" ? seenSymbols.has(key) || Object.values(wellKnownSymbols).includes(key) : stats.has(key)) ready.push(contribution);\n else {\n const pending = waiting.get(key);\n if (pending === undefined) waiting.set(key, [contribution]);\n else pending.push(contribution);\n }\n }\n };\n\n for (const scope of input.scopeChain) {\n for (const value of Object.values(scope.bindings)) {\n collectContainerStats(value, stats, ancestors, guestValues, 0, reached);\n }\n }\n\n for (const promise of input.pendingPromises) {\n for (const [key, value] of Object.entries(promise)) {\n if (key === \"id\" || key === \"promise\") {\n continue;\n }\n\n collectContainerStats(value as RuntimeSnapshotValue, stats, ancestors, guestValues, 0, reached);\n }\n }\n\n for (let index = 0; index < ready.length; index++) {\n const contribution = ready[index]!;\n weakEntries.get(contribution.owner)!.push([contribution.key, contribution.value]);\n if (typeof contribution.key === \"object\") stats.get(contribution.key)!.forceHeap = true;\n collectContainerStats(contribution.value, stats, ancestors, guestValues, contribution.depth, reached);\n if (contribution.value !== null && typeof contribution.value === \"object\") {\n const stat = stats.get(contribution.value);\n if (stat !== undefined) stat.forceHeap = true;\n }\n }\n const weakTargets = new Map<object, object | symbol>();\n const finalizationTargets = new Map<object, Array<{target?:object | symbol;token?:object | symbol}>>();\n const reachableWeakTarget = (target: object | symbol | undefined): object | symbol | undefined => {\n if (typeof target === \"symbol\") return seenSymbols.has(target) || Object.values(wellKnownSymbols).includes(target) ? target : undefined;\n if (target === undefined || !stats.has(target)) return undefined;\n stats.get(target)!.forceHeap = true;\n return target;\n };\n for (const value of guestValues) {\n const target = reachableWeakTarget(weakReferenceStates.get(value)?.deref());\n if (target !== undefined) weakTargets.set(value,target);\n const finalization = finalizationRegistryStates.get(value);\n if (finalization !== undefined) finalizationTargets.set(value,[...finalization.state.cells].map(cell => ({\n target:reachableWeakTarget(cell.target.deref()),token:reachableWeakTarget(cell.token?.deref())\n })));\n }\n const heapIds = new Map<object | symbol, number>();\n let nextId = 1;\n for (const [value, stat] of stats.entries()) {\n if (\n stat.count > 1 ||\n stat.forceHeap === true ||\n guestValues.has(value) ||\n stat.cyclic ||\n hasNullObjectPrototype(value) ||\n ownSerializableSymbolKeys(value).length > 0 ||\n (isSandboxRegex(value) && (hasCustomRegexProperties(value) || !Number.isSafeInteger(value.lastIndex) ||\n (typeof value.lastIndex === \"number\" && value.lastIndex < 0) || Object.is(value.lastIndex, -0))) ||\n isSandboxBox(value) ||\n isSandboxDate(value) ||\n isNumericTypedArray(value) ||\n isSandboxArrayBuffer(value) ||\n isSandboxSharedArrayBuffer(value) ||\n isSandboxDataView(value) ||\n (Array.isArray(value) && requiresArrayEntries(value)) ||\n sandboxErrorTypes.has(value) ||\n isSandboxArguments(value) ||\n isSandboxCollectionIterator(value) ||\n isSandboxRegExpIterator(value) ||\n isSandboxMap(value) ||\n isSandboxSet(value)\n ) {\n heapIds.set(value, nextId);\n nextId += 1;\n }\n }\n\n return { heapIds, guestValues, weakEntries, weakTargets, finalizationTargets };\n}\n\nfunction collectContainerStats(\n value: unknown,\n stats: Map<object, { count: number; cyclic: boolean; expanded: boolean; forceHeap?: boolean }>,\n ancestors: WeakSet<object>,\n guestValues: Set<object>,\n depth = 0,\n reached?: (value: WeakCollectionKey, depth: number) => void\n): void {\n if (typeof value === \"symbol\") {\n reached?.(value, depth);\n return;\n }\n if (\n value === null ||\n typeof value !== \"object\" ||\n isRuntimeClosureValue(value) ||\n isRuntimePromiseValue(value) ||\n (isSandboxGenerator(value) && getGeneratorOrigin(value) === undefined)\n ) {\n return;\n }\n\n assertSnapshotDataDepth(depth, \"<snapshot-heap>\");\n let stat = stats.get(value);\n if (stat === undefined) {\n stat = {\n count: 0,\n cyclic: false,\n expanded: false\n };\n stats.set(value, stat);\n reached?.(value, depth);\n }\n\n stat.count += 1;\n\n if (ancestors.has(value)) {\n stat.cyclic = true;\n return;\n }\n\n if (stat.expanded) {\n return;\n }\n\n stat.expanded = true;\n ancestors.add(value);\n\n const guestEntries: unknown[] = [];\n if (isSandboxDataView(value)) guestEntries.push(dataViewBuffer(value));\n if (isNumericTypedArray(value)) guestEntries.push(typedArrayStorage(value).buffer);\n const guest = isSandboxDataView(value)\n ? { kind: \"dataview\", state: captureDataViewState(value, entry => { guestEntries.push(entry); return null; }) }\n : isNumericTypedArray(value)\n ? { kind: \"float32array\", state: captureTypedArrayState(value, entry => { guestEntries.push(entry); return null; }) }\n : isSandboxArrayBuffer(value) || isSandboxSharedArrayBuffer(value)\n ? { kind: \"arraybuffer\", state: captureArrayBufferState(value, entry => { guestEntries.push(entry); return null; }) }\n : captureGuestHeapNode(value, entry => { guestEntries.push(entry); return null; });\n if (guest !== undefined) {\n if (!isNumericTypedArray(value) && !isSandboxArrayBuffer(value) && !isSandboxSharedArrayBuffer(value) && !isSandboxDataView(value)) guestValues.add(value);\n for (const entry of guestEntries) {\n collectContainerStats(entry, stats, ancestors, guestValues, depth + 1, reached);\n if (entry !== null && typeof entry === \"object\") {\n const entryStat = stats.get(entry);\n if (entryStat !== undefined) entryStat.forceHeap = true;\n }\n }\n ancestors.delete(value);\n return;\n }\n\n if (!Array.isArray(value) && !isPlainObject(value) && !isSandboxDate(value) &&\n !isNumericTypedArray(value) && !isSandboxMap(value) && !isSandboxCollectionIterator(value) &&\n !isSandboxRegExpIterator(value) && !isSandboxSet(value)) {\n ancestors.delete(value);\n return;\n }\n\n const entries = isSandboxRegex(value)\n ? Reflect.ownKeys(getRegexProperties(value)).flatMap(key => {\n const descriptor = Object.getOwnPropertyDescriptor(getRegexProperties(value), key)!;\n return \"value\" in descriptor ? [descriptor.value] : [];\n })\n : isSandboxDate(value)\n ? dateDataProperties(value).flatMap(([key, descriptor]) => typeof key === \"string\" ? [descriptor.value] : [])\n : isSandboxBox(value)\n ? boxedDataProperties(value).map(([, descriptor]) => descriptor.value)\n : isSandboxRegExpIterator(value)\n ? [regexpIteratorState(value).matcher, regexpIteratorState(value).input, ...Object.values(value)]\n : isSandboxCollectionIterator(value)\n ? [collectionIteratorState(value).collection, ...Object.values(value)]\n : isSandboxArguments(value)\n ? Object.values(Object.getOwnPropertyDescriptors(value)).flatMap((descriptor) =>\n \"value\" in descriptor ? [descriptor.value] : []\n )\n : isSandboxMap(value)\n ? [...value.entries].flatMap(([key, entry]) => [key, entry])\n : isSandboxSet(value)\n ? [...value.values]\n : Object.values(value);\n if (isSandboxMap(value) || isSandboxSet(value)) {\n serializeCollectionProperties(value, entry => {\n entries.push(entry);\n return null;\n });\n }\n for (const entry of entries) {\n collectContainerStats(entry, stats, ancestors, guestValues, depth + 1, reached);\n }\n for (const key of ownSerializableSymbolKeys(value)) {\n collectContainerStats(key, stats, ancestors, guestValues, depth + 1, reached);\n const descriptor = Object.getOwnPropertyDescriptor(value, key)!;\n if (\"value\" in descriptor)\n collectContainerStats(descriptor.value, stats, ancestors, guestValues, depth + 1, reached);\n }\n\n ancestors.delete(value);\n}\n", "import { collectionIteratorState, isSandboxCollectionIterator } from \"../interp/collection-iterator.js\";\nimport { regexpIteratorState, isSandboxRegExpIterator } from \"../interp/regexp-iterator.js\";\nimport {\n createSandboxPromise,\n createSandboxClosure,\n isSandboxClosure,\n isSandboxMap,\n isSandboxSet,\n isSandboxPromise,\n promiseProperties,\n type SandboxClosure,\n type SandboxPromise,\n type SandboxValue\n} from \"../interp/values.js\";\nimport { createReplayEncodingContext, decodeReplayData, encodeReplayData, type ReplayData, type ReplayPathSegment } from \"./replay-data.js\";\nimport { CompileScope } from \"../interp/regex/compile-guard.js\";\nimport { ownSerializableSymbolKeys } from \"./symbols.js\";\nimport { isSandboxModuleNamespace } from \"../interp/module-namespace.js\";\nimport { validateSnapshotData } from \"./validation.js\";\n\n\nexport type ReplayInputs = {\n bindings: Record<string, SandboxValue>;\n imports: Record<string, SandboxValue>;\n entryPointArgs: SandboxValue[] | undefined;\n importMeta: SandboxValue;\n moduleNamespaces?: Record<string,SandboxValue>;\n};\n\ntype ModuleReplayInputs = {namespace: Record<string,SandboxValue>};\n\nexport function prepareReplayInputs<T extends ReplayInputs | ModuleReplayInputs>(\n current: T,\n saved?: unknown,\n preparePromise?: (promise: SandboxPromise | undefined, id: string) => SandboxPromise,\n onCapabilityRestored?: (original: SandboxClosure, restored: SandboxClosure) => void,\n compilation?: CompileScope,\n onInputSymbols?: (symbols: ReadonlyMap<number, symbol>) => void\n): {\n values: T;\n snapshot: ReplayData;\n captureNamespace: (namespace: Record<string, SandboxValue>, name: string) => void;\n prepareNamespace: (namespace: Record<string, SandboxValue>, name: string) => Record<string, SandboxValue>;\n} {\n const identities = new WeakMap<object, string>();\n const capabilities = new Map<string, SandboxClosure>();\n const promises = new Map<string, SandboxPromise>();\n const namespaces: Record<string, SandboxValue> = Object.create(null);\n if (\"moduleNamespaces\" in current) Object.assign(namespaces, current.moduleNamespaces);\n const context = createReplayEncodingContext();\n const identifyCapability = (closure: SandboxClosure, path: readonly ReplayPathSegment[]) => {\n const id = identities.get(closure) ?? JSON.stringify(path);\n identities.set(closure, id);\n capabilities.set(id, closure);\n return id;\n };\n const inputPromises = new Map<string, SandboxPromise>();\n const identifyPromise = (promise: SandboxPromise, path: readonly ReplayPathSegment[]) => {\n if (preparePromise === undefined) return undefined;\n const id = identities.get(promise) ?? JSON.stringify(path);\n identities.set(promise, id);\n inputPromises.set(id, promise);\n return id;\n };\n const readCapability = (id: string): SandboxValue => {\n const path: unknown = JSON.parse(id);\n if (!Array.isArray(path) || path.length === 0)\n throw new TypeError(\"Invalid replay input capability path.\");\n let value: SandboxValue = { ...current, moduleNamespaces: namespaces };\n for (const key of path) {\n if (typeof key !== \"string\") {\n if (key === null || typeof key !== \"object\" || Array.isArray(key) ||\n Object.keys(key).length !== 1 || !Object.hasOwn(key, \"symbol\") ||\n !Number.isSafeInteger(key.symbol) || key.symbol < 0)\n throw new TypeError(\"Invalid replay input symbol capability path.\");\n if (value === null || typeof value !== \"object\") return undefined;\n const symbol = ownSerializableSymbolKeys(value)[key.symbol];\n if (symbol === undefined) return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(value, symbol);\n if (descriptor === undefined || !(\"value\" in descriptor)) return undefined;\n value = descriptor.value;\n continue;\n }\n if (isSandboxRegExpIterator(value)) {\n if (key === \"<matcher>\") value = regexpIteratorState(value).matcher;\n else if (key === \"<input>\") value = regexpIteratorState(value).input;\n else {\n const property: unknown = JSON.parse(key);\n if (!Array.isArray(property) || property.length !== 2 || property[0] !== \"property\" || typeof property[1] !== \"string\") throw new TypeError(\"Invalid replay input iterator capability path.\");\n const descriptor = Object.getOwnPropertyDescriptor(value, property[1]);\n value = descriptor !== undefined && \"value\" in descriptor ? descriptor.value : undefined;\n }\n continue;\n }\n if (isSandboxCollectionIterator(value)) {\n if (key === \"<collection>\") value = collectionIteratorState(value).collection;\n else {\n const property: unknown = JSON.parse(key);\n if (!Array.isArray(property) || property.length !== 2 || property[0] !== \"property\" || typeof property[1] !== \"string\") throw new TypeError(\"Invalid replay input iterator capability path.\");\n const descriptor = Object.getOwnPropertyDescriptor(value, property[1]);\n value = descriptor !== undefined && \"value\" in descriptor ? descriptor.value : undefined;\n }\n continue;\n }\n if (isSandboxMap(value)) {\n const parts = key.split(\":\");\n const [kind, ordinal] = parts;\n const index = Number(ordinal);\n if (\n parts.length !== 2 ||\n ![\"key\", \"value\"].includes(kind) ||\n String(index) !== ordinal ||\n !Number.isSafeInteger(index) ||\n index < 0\n )\n throw new TypeError(\"Invalid replay input map capability path.\");\n value = [...value.entries][index]?.[kind === \"key\" ? 0 : 1];\n continue;\n }\n if (isSandboxSet(value)) {\n const index = Number(key);\n if (String(index) !== key || !Number.isSafeInteger(index) || index < 0)\n throw new TypeError(\"Invalid replay input set capability path.\");\n value = [...value.values][index];\n continue;\n }\n if (key === \"properties\" && isSandboxClosure(value)) {\n value = value.properties;\n continue;\n }\n if (key === \"properties\" && isSandboxPromise(value)) {\n value = promiseProperties.get(value);\n continue;\n }\n if (value === null || typeof value !== \"object\") return undefined;\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !(\"value\" in descriptor)) return undefined;\n value = descriptor.value;\n }\n return value;\n };\n const resolveCapability = (id: string) => {\n const value = saved === undefined ? capabilities.get(id) : readCapability(id);\n return isSandboxClosure(value) ? value : undefined;\n };\n const memo = { nodes: context.nodes, values: new Map<number, SandboxValue>() };\n if (saved !== undefined) validateSnapshotData(saved);\n const snapshot = saved === undefined ? encodeReplayData(current, {\n context, captureCapabilityProperties: true, identifyCapability, identifyPromise,\n onValueEncoded: (id, value) => { memo.values.set(id, value); }\n }) : structuredClone(saved) as ReplayData;\n if (saved !== undefined) {\n const validationScope = new CompileScope(compilation?.owner);\n try {\n const validated = decodeReplayData(snapshot, {\n resolveCapability,\n resolvePromise: id => { readCapability(id); return createSandboxPromise(Promise.resolve(undefined), { trackReplay: false }); }\n }, validationScope);\n assertReplayInputShape(validated, \"namespace\" in current);\n if (snapshot.namespaceRoots !== undefined) {\n if (snapshot.namespaceRoots === null || typeof snapshot.namespaceRoots !== \"object\" || Array.isArray(snapshot.namespaceRoots))\n throw new TypeError(\"Invalid replay namespace roots.\");\n const validationCapability = createSandboxClosure({ call: () => undefined });\n for (const root of Object.values(snapshot.namespaceRoots)) {\n const namespace = decodeReplayData({ root, nodes: snapshot.nodes }, {\n resolveCapability: id => { readCapability(id); return validationCapability; },\n resolvePromise: id => { readCapability(id); return createSandboxPromise(Promise.resolve(undefined), { trackReplay: false }); }\n }, validationScope);\n if (!isSandboxModuleNamespace(namespace)) throw new TypeError(\"Invalid replay module namespace.\");\n }\n }\n } finally {\n validationScope.dispose();\n }\n context.nodes = snapshot.nodes;\n memo.nodes = snapshot.nodes;\n }\n const inputSymbols = new Map<number, symbol>();\n for (let id = 0; id < snapshot.nodes.length; id++) {\n if (snapshot.nodes[id]?.kind !== \"symbol\") continue;\n const symbol = decodeReplayData({ root: { tag: \"ref\", id }, nodes: snapshot.nodes }, { memo }, compilation);\n if (typeof symbol !== \"symbol\") throw new TypeError(\"Invalid input symbol.\");\n inputSymbols.set(id, symbol);\n }\n onInputSymbols?.(inputSymbols);\n const resolvePromise = (id: string) => {\n const value = saved === undefined ? inputPromises.get(id) : readCapability(id);\n if (!promises.has(id) && preparePromise !== undefined)\n promises.set(id, preparePromise(isSandboxPromise(value) ? value : undefined, id));\n return promises.get(id);\n };\n if (inputPromises.size > 0) {\n memo.values.clear();\n for (const [id, symbol] of inputSymbols) memo.values.set(id, symbol);\n }\n const values = saved === undefined && inputPromises.size === 0 ? current\n : decodeReplayData(snapshot, { memo, resolveCapability, resolvePromise, onCapabilityRestored }, compilation) as T;\n const captureNamespace = (namespace: Record<string, SandboxValue>, name: string) => {\n if (!Object.hasOwn(namespaces, name)) namespaces[name] = namespace;\n if (snapshot.namespaceRoots !== undefined && Object.hasOwn(snapshot.namespaceRoots, name)) return;\n if (!isSandboxModuleNamespace(namespace)) throw new TypeError(\"Invalid replay module namespace.\");\n const encoded = encodeReplayData(namespace, {\n context, path: [\"moduleNamespaces\", name], captureCapabilityProperties: true,\n identifyCapability, identifyPromise\n });\n snapshot.namespaceRoots ??= Object.create(null) as NonNullable<ReplayData[\"namespaceRoots\"]>;\n Object.defineProperty(snapshot.namespaceRoots, name, {\n value: encoded.root, enumerable: true, configurable: true, writable: true\n });\n };\n return {\n values, snapshot, captureNamespace,\n prepareNamespace: (namespace, name) => {\n captureNamespace(namespace, name);\n return decodeReplayData({ root: snapshot.namespaceRoots![name], nodes: snapshot.nodes },\n { memo, resolveCapability, resolvePromise, onCapabilityRestored }, compilation) as Record<string, SandboxValue>;\n }\n };\n}\n\nfunction assertReplayInputShape(restored: SandboxValue, moduleInput: boolean): void {\n if (\n restored === null ||\n typeof restored !== \"object\" ||\n Array.isArray(restored) ||\n isSandboxClosure(restored) ||\n isSandboxPromise(restored) ||\n isSandboxCollectionIterator(restored) ||\n isSandboxRegExpIterator(restored) ||\n isSandboxMap(restored) ||\n isSandboxSet(restored)\n )\n throw new TypeError(\"Invalid replay inputs.\");\n const values = restored as Record<string,SandboxValue>;\n for (const key of moduleInput ? [\"namespace\"] : [\"bindings\", \"imports\", ...(values.moduleNamespaces===undefined ? [] : [\"moduleNamespaces\"])]) {\n if (\n values[key] === null ||\n typeof values[key] !== \"object\" ||\n Array.isArray(values[key]) ||\n isSandboxClosure(values[key]) ||\n isSandboxPromise(values[key]) ||\n isSandboxCollectionIterator(values[key]) ||\n isSandboxRegExpIterator(values[key]) ||\n isSandboxMap(values[key]) ||\n isSandboxSet(values[key])\n )\n throw new TypeError(`Invalid replay input ${key}.`);\n }\n if (values.entryPointArgs !== undefined && !Array.isArray(values.entryPointArgs))\n throw new TypeError(\"Invalid replay entry point arguments.\");\n const namespaces = moduleInput ? [values.namespace]\n : Object.values((values.moduleNamespaces ?? {}) as Record<string,SandboxValue>);\n if (namespaces.some(namespace=>!isSandboxModuleNamespace(namespace)))\n throw new TypeError(\"Invalid replay module namespace.\");\n}\n", "import type {SourceResolver} from \"./modules/source-graph.js\";\nimport { createHostCallbackContext } from \"#safe-js-platform\";\nimport { attachExecutionControl, SandboxJobQueue, type ExecutionControl } from \"./interp/jobs.js\";\nimport { runWithExtensions, type RealmOptions } from \"./realm.js\";\n\nimport { hashParsedAst, hashSource } from \"./parse/hash.js\";\nimport { runResources, withRunResources } from \"./interp/resources.js\";\nimport { createReplayableRandom } from \"./random.js\";\nimport {\n attachErrorSpan,\n describeThrownValue,\n materializeWrappedErrorCause,\n replaceErrorStack,\n type ErrorSourceSpan\n} from \"./error/shape.js\";\nimport type { ParseResult } from \"./parse.js\";\nimport {\n findRegexLiteral,\n parseExecutableModule,\n type AwaitExpression,\n type CallExpression,\n type Identifier,\n type Module,\n type SourceSpan,\n type Statement\n} from \"./parse/parser.js\";\nimport { restore, type SafeJSSnapshot } from \"./restore.js\";\nimport { Budget, type CompileTicket } from \"./interp/budget.js\";\nimport { CompileScope } from \"./interp/regex/compile-guard.js\";\nimport {\n PromiseReplay,\n promiseReplayContext,\n type PromiseReplaySnapshot\n} from \"./interp/promise-replay.js\";\nimport { wrapCancelableBindings } from \"./interp/cancel.js\";\nimport { enterSnapshotRun } from \"./interp/running-state.js\";\nimport {\n createSandboxPromiseRejectionTracker,\n observeSandboxPromise,\n withSandboxPromiseRejectionTracker,\n type SandboxPromiseRejectionTracker\n} from \"./interp/promise-tracker.js\";\nimport {\n HostCallJournal,\n type HostCallRecord,\n type HostCallReplay,\n type HostCallResumeProvider\n} from \"./interp/host-call.js\";\nimport type { ConsoleSink } from \"./interp/globals/console-json.js\";\nimport { createBuiltinBindings } from \"./interp/globals.js\";\nimport { releaseObjectPrototype } from \"./interp/object-model.js\";\nimport {\n declareHostOperation,\n wrapCallerInjectedBindings,\n type CallerInjectedBinding\n} from \"./interp/host-bridge.js\";\nimport {\n interpret,\n Scope,\n type InterpreterResult,\n type LoopIterationSnapshot\n} from \"./interp/interpreter.js\";\nimport { consumeSettledHostCall } from \"./interp/promise.js\";\nimport {\n deepCopyToSandbox,\n isSandboxClosure,\n isSandboxPromise,\n measureSandboxData,\n reconcileCompiledValues,\n type SandboxValue,\n type SandboxPromise\n} from \"./interp/values.js\";\nimport { createModuleEnvironment, resolveModuleImports, resolveModuleNamespace, type ModuleEnvironment, type ModuleEnvironmentOptions, type ModuleRegistry } from \"./modules/registry.js\";\nimport { createModuleNamespace } from \"./interp/module-namespace.js\";\nimport {\n activateOtelSink,\n getActiveOtelSpan,\n safeAddEvent,\n type OtelSink\n} from \"./observability/otel.js\";\nimport type { SnapshotBackend } from \"./snapshot/backend.js\";\nimport { attachDumpController, createDumpController } from \"./snapshot/dump.js\";\nimport { DUMP_FORMAT_VERSION, EXECUTION_SEMANTICS, inMemoryRunSnapshots } from \"./snapshot/dump-format.js\";\nimport { createSnapshotScheduler, type SnapshotScheduler } from \"./snapshot/scheduler.js\";\nimport { UnsnapshotableValueError } from \"./snapshot/serialize.js\";\nimport { prepareReplayInputs, type ReplayInputs } from \"./snapshot/replay-inputs.js\";\nimport {\n decodeReplayData,\n MissingReplayCapabilityError,\n type ReplayData\n} from \"./snapshot/replay-data.js\";\n\nexport type RunOptions = {\n sourceType?: \"module\";\n sourceResolver?: SourceResolver;\n sourceRoot?: string;\n extensions?: RealmOptions[\"extensions\"];\n builtinOverrides?: RealmOptions[\"builtinOverrides\"];\n grants?: RealmOptions[\"grants\"];\n limits?: RealmOptions[\"limits\"];\n bindings?: Record<string, CallerInjectedBinding>;\n budget?: Budget;\n clock?: RunClock;\n entryPointArgs?: readonly unknown[];\n filename?: string;\n importMeta?: Record<string, unknown>;\n hostCallResumeProvider?: HostCallResumeProvider;\n modules?: ModuleRegistry;\n random?: RunRandom;\n randomSeed?: number;\n otelSink?: OtelSink;\n signal?: AbortSignal;\n snapshot?: SafeJSSnapshot;\n snapshotBackend?: SnapshotBackend;\n snapshotIntervalMs?: number;\n snapshotPath?: string;\n sink?: ConsoleSink;\n};\n\nexport class UnhandledRejectionError extends Error {\n readonly reason: unknown;\n\n constructor(reason: unknown, span?: ErrorSourceSpan) {\n super(`Unhandled rejection: ${describeThrownValue(reason)}`);\n this.name = \"UnhandledRejectionError\";\n this.reason = reason;\n attachErrorSpan(this, span);\n replaceErrorStack(this);\n }\n}\n\nexport type RunSnapshot = SafeJSSnapshot & {\n bindings: InterpreterResult[\"snapshot\"][\"bindings\"];\n clock?: RunClockSnapshot;\n hostCalls?: HostCallRecord[];\n replay?: HostCallReplay;\n replayError?: string;\n promiseReplay?: PromiseReplaySnapshot;\n initialInputs?: ReplayData;\n loopIterations?: Record<string, LoopIterationSnapshot>;\n pendingAwaits?: RunPendingAwaitSnapshot[];\n random?: {\n seed: number;\n state: number;\n initialState?: number;\n resumeState?: number;\n };\n};\n\nexport type RunPendingAwaitSnapshot = {\n nodeId?: number;\n span: SourceSpan;\n};\n\nexport type RunClockSnapshot = {\n next: number;\n};\n\nexport type RunClock = {\n now?: () => number;\n restore?: (snapshot: RunClockSnapshot) => void;\n snapshot: () => RunClockSnapshot | undefined;\n};\n\nexport type RunRandom = {\n next: () => number;\n seed: number;\n snapshot: () => number;\n};\n\ntype WithRunSnapshot<TResult extends InterpreterResult> = TResult extends unknown\n ? Omit<TResult, \"snapshot\"> & {\n snapshot: RunSnapshot;\n }\n : never;\n\nexport type RunResult = WithRunSnapshot<InterpreterResult>;\nexport type RunPromise = Promise<RunResult> & ExecutionControl;\n\nconst DEFAULT_MAX_CALL_DEPTH = 1_000;\n\nexport function run(source: string, options: RunOptions = {}): RunPromise {\n const jobs = new SandboxJobQueue();\n if (options.extensions !== undefined || options.builtinOverrides !== undefined || options.sourceType !== undefined || options.sourceResolver !== undefined || options.sourceRoot !== undefined) {\n const result = (async () => {\n if (options.sourceType === undefined && (options.sourceResolver !== undefined || options.sourceRoot !== undefined))\n throw new TypeError(\"Source resolution requires sourceType: 'module'.\");\n if (options.sourceRoot !== undefined) {\n if (options.sourceResolver !== undefined) throw new TypeError(\"Specify sourceRoot or sourceResolver, not both.\");\n const {createRootedSourceResolver} = await import(\"./modules/source-files.js\");\n const {sourceRoot, ...resolved} = options;\n const sourceResolver = await createRootedSourceResolver(sourceRoot);\n return runWithExtensions(source,{...resolved,filename:await sourceResolver.entryId(options.filename),sourceResolver},jobs);\n }\n return runWithExtensions(source, options, jobs);\n })().finally(() => jobs.finish());\n const dumpController = createDumpController();\n dumpController.fail(new TypeError(\"Snapshot is not replayable: Live realm state cannot be serialized or replayed.\"));\n return attachExecutionControl(attachDumpController(result, dumpController), jobs, options.signal);\n }\n let capturePausedSnapshot: (() => RunSnapshot) | undefined;\n const lifecycle = {\n hostCallbackDepth: 0,\n hostCallbackContext: createHostCallbackContext()\n };\n const dumpController = createDumpController(lifecycle, {\n isPaused: () => jobs.executionState === \"paused\",\n snapshot: () => capturePausedSnapshot?.()\n });\n const promiseTracker = createSandboxPromiseRejectionTracker();\n const detachExecutionFailure = promiseTracker.onFatalRejection((error) => jobs.interrupt(error));\n let completedSnapshot: RunSnapshot | undefined;\n const execute = async () => {\n const budget = options.budget ?? new Budget({ maxCallDepth: DEFAULT_MAX_CALL_DEPTH });\n const operation = budget.acquireCompileOwner(true);\n const compilation = new CompileScope(operation.owner);\n try {\n const restoredSnapshot =\n options.snapshot === undefined\n ? undefined\n : restore(options.snapshot, { source }, operation.owner);\n const promiseReplay = new PromiseReplay(restoredSnapshot?.promiseReplay);\n return await promiseReplayContext.run(promiseReplay, async () => {\n const deactivateOtelSink = activateOtelSink(options.otelSink);\n let leaveSnapshotRun: (() => void) | undefined;\n let leaveHostReplay: (() => void) | undefined;\n let leaveInputReplay: (() => void) | undefined;\n let createFailureSnapshot: (() => RunSnapshot) | undefined;\n let cancellationSnapshot: RunSnapshot | undefined;\n let cancellationSnapshotError: { reason: unknown } | undefined;\n let snapshotScheduler: SnapshotScheduler<RunSnapshot> | undefined;\n const captureCancellationSnapshot = () => {\n try {\n cancellationSnapshot = createFailureSnapshot?.();\n } catch (reason) {\n cancellationSnapshotError = { reason };\n }\n };\n options.signal?.addEventListener(\"abort\", captureCancellationSnapshot, { once: true });\n try {\n const executionSemantics =\n restoredSnapshot?.executionSemantics === \"jobs-v6\" ||\n restoredSnapshot?.executionSemantics === \"jobs-v7\" ||\n restoredSnapshot?.executionSemantics === \"jobs-v8\"\n ? restoredSnapshot.executionSemantics\n : EXECUTION_SEMANTICS;\n const functionSourceText = executionSemantics === \"jobs-v8\" || executionSemantics === EXECUTION_SEMANTICS;\n runResources.getStore()!.functionSourceText = functionSourceText;\n runResources.getStore()!.hostDataMetadata = executionSemantics === EXECUTION_SEMANTICS;\n const convertInitialInput = <TValue>(convert: () => TValue): TValue =>\n executionSemantics === \"jobs-v6\" ? convert() : promiseReplayContext.exit(convert);\n if (restoredSnapshot !== undefined) {\n leaveSnapshotRun = enterSnapshotRun(options.snapshot ?? restoredSnapshot);\n }\n promiseReplay.attachBudget(budget);\n const filename = options.filename ?? \"<input>\";\n const module = parseExecutableModule(source, filename, operation.owner);\n promiseReplay.validateNodes(module);\n const sourceHash =\n findRegexLiteral(module) === undefined\n ? hashSource(source, operation.owner, functionSourceText)\n : hashParsedAst(module, functionSourceText);\n const hostCalls = new HostCallJournal(\n sourceHash,\n readHostCallSnapshot(restoredSnapshot),\n options.hostCallResumeProvider,\n restoredSnapshot?.replay,\n budget,\n operation.owner\n );\n leaveHostReplay = hostCalls.dispose.bind(hostCalls);\n promiseReplay.validateCallbacks(hostCalls.callbackPositions());\n const generator =\n options.random ??\n createReplayableRandom({ seed: options.randomSeed, snapshot: restoredSnapshot });\n const random = { seed: generator.seed, initialState: generator.snapshot(), generator };\n const interpreterSnapshot =\n restoredSnapshot?.replay === undefined && hasLoopIterationSnapshot(restoredSnapshot)\n ? {\n ...(restoredSnapshot as RunSnapshot),\n resumeNodeId: (restoredSnapshot as RunSnapshot).pendingAwaits?.[0]?.nodeId\n }\n : undefined;\n const callerBindings = convertInitialInput(() =>\n options.bindings === undefined\n ? {}\n : wrapCallerInjectedBindings(options.bindings, {\n budget,\n compileOwner: operation.owner,\n hostCalls,\n moduleId: \"<bindings>\",\n signal: options.signal,\n lifecycle\n })\n );\n const builtinBindings = createBuiltinBindings({\n compileOwner: operation.owner,\n budget,\n hostCalls,\n sink: options.sink,\n random: random?.generator.next,\n clock: options.clock\n });\n const importMeta = convertInitialInput(\n () => deepCopyToSandbox(options.importMeta ?? {}, { compilation }) as Record<string, SandboxValue>\n );\n if (restoredSnapshot?.migration !== undefined) {\n if (Object.hasOwn(importMeta, \"migration\"))\n throw new TypeError(\n \"import.meta.migration is reserved for migrated checkpoint state.\"\n );\n Object.defineProperty(importMeta, \"migration\", {\n value: decodeReplayData(restoredSnapshot.migration.state, {}, compilation),\n enumerable: true,\n configurable: true,\n writable: true\n });\n }\n const inputPromiseReplacements = new WeakMap<SandboxPromise, SandboxPromise>();\n const prepareInputPromise = (promise: SandboxPromise | undefined, id: string): SandboxPromise => {\n if (promise !== undefined) observeSandboxPromise(promise);\n const operation = declareHostOperation(() => {\n if (promise === undefined) throw new TypeError(`Missing initial promise '${id}'.`);\n return promise.promise;\n }, \"read-side-effect\");\n const binding = wrapCallerInjectedBindings({[id]:operation},{\n budget,hostCalls,moduleId:\"<inputs>\",compileOwner:compilation.owner,signal:options.signal,lifecycle,\n promiseReplacements: inputPromiseReplacements\n })[id]!;\n if (!isSandboxClosure(binding)) throw new TypeError(\"Invalid initial promise operation.\");\n const prepared = binding.call([]) as SandboxPromise;\n hostCalls.registerInputPromise(prepared);\n if (promise !== undefined) inputPromiseReplacements.set(promise, prepared);\n return prepared;\n };\n let moduleEnvironment: ModuleEnvironment | undefined;\n const moduleOptions: ModuleEnvironmentOptions = {budget,compileOwner:operation.owner,hostCalls,signal:options.signal};\n const moduleInputOwner = {};\n let moduleInputSize = 0;\n const initialInputs = prepareReplayInputs<ReplayInputs>(\n {\n bindings: callerBindings,\n imports: convertInitialInput(() => {\n const modules = options.modules;\n moduleEnvironment = createModuleEnvironment(modules, moduleOptions);\n return resolveModuleImports(module, modules, {\n environment: moduleEnvironment,\n budget,\n compileOwner: operation.owner,\n hostCalls,\n signal: options.signal,\n allowMissing: restoredSnapshot?.initialInputs !== undefined\n });\n }),\n entryPointArgs: convertInitialInput(() =>\n options.entryPointArgs === undefined\n ? undefined\n : (deepCopyToSandbox([...options.entryPointArgs], { compilation }) as SandboxValue[])\n ),\n importMeta\n },\n restoredSnapshot?.initialInputs,\n prepareInputPromise,\n hostCalls.rebindHostCapability.bind(hostCalls),\n compilation,\n hostCalls.registerInputSymbols.bind(hostCalls)\n );\n leaveInputReplay = () => {\n budget.setRetainedDataUsage(initialInputs,0);\n budget.setRetainedDataUsage(moduleInputOwner,0);\n };\n if (moduleEnvironment !== undefined) {\n moduleOptions.prepareNamespace = (namespace,name) => {\n const prepared = initialInputs.prepareNamespace(namespace,name);\n const included = new Set<CompileTicket>();\n const size = measureSandboxData([prepared],{ignoreClosureCaptures:true,compileTickets:included});\n budget.reconcileCompileData(moduleInputSize+size,included,included,moduleInputOwner);\n moduleInputSize += size;\n return prepared;\n };\n for (const name of Object.keys(initialInputs.snapshot.namespaceRoots ?? {})) {\n if (moduleEnvironment.available.includes(name)) resolveModuleNamespace(moduleEnvironment,name,false);\n else {\n moduleEnvironment.available.push(name);\n moduleEnvironment.namespaces[name] = createModuleNamespace({});\n }\n }\n for (const [name, namespace] of Object.entries(moduleEnvironment.namespaces))\n initialInputs.captureNamespace(namespace as Record<string,SandboxValue>,name);\n }\n hostCalls.validateHostCapabilities();\n const inputTickets = new Set<CompileTicket>();\n const inputSize = measureSandboxData(\n [\n ...Object.values(initialInputs.values.bindings),\n ...Object.values(initialInputs.values.imports),\n ...(initialInputs.values.entryPointArgs ?? []),\n initialInputs.values.importMeta\n ],\n { ignoreClosureCaptures: true, compileTickets: inputTickets }\n );\n budget.reconcileCompileData(inputSize, inputTickets, inputTickets, initialInputs);\n const entryPointArgs = initialInputs.values.entryPointArgs;\n const cancelableCallerBindings = wrapCancelableBindings(\n initialInputs.values.bindings,\n options.signal\n );\n\n const scope = new Scope(\n builtinBindings,\n undefined,\n undefined,\n { chargeData: false },\n interpreterSnapshot?.bindings as Record<string, SandboxValue> | undefined\n );\n const callerScope = scope.child(cancelableCallerBindings, {globalEnvironment: true});\n const executionScope = new Scope(\n initialInputs.values.imports,\n callerScope,\n initialInputs.values.importMeta,\n { functionBoundary: true }\n );\n executionScope.moduleEnvironment = moduleEnvironment;\n const activeSnapshotScheduler = createSnapshotScheduler<RunSnapshot>({\n snapshotBackend: options.snapshotBackend,\n snapshotIntervalMs: options.snapshotIntervalMs,\n snapshotPath: options.snapshotPath\n });\n snapshotScheduler = activeSnapshotScheduler;\n createFailureSnapshot = () =>\n createRunSnapshot({\n executionSemantics,\n migration: restoredSnapshot?.migration,\n bindings: executionScope.snapshot().bindings,\n clock: options.clock,\n hostCalls: hostCalls.snapshot(),\n replay: hostCalls.snapshotReplay(),\n initialInputs: initialInputs.snapshot,\n promiseReplay: promiseReplay.snapshot(),\n random,\n sourceHash\n });\n capturePausedSnapshot = createFailureSnapshot;\n let snapshotIteration = 0;\n\n const topLevelResult = await interpret(createExecutableNode(module), {\n jobs,\n compilation,\n budget,\n captureReplayState: random.generator.snapshot,\n onYield: (yieldPoint) => {\n snapshotIteration += 1;\n safeAddEvent(yieldPoint.otelSpan ?? getActiveOtelSpan(), \"snapshot.saved\", {\n iteration: snapshotIteration\n });\n let snapshot: RunSnapshot | undefined;\n const createSnapshot = () => {\n if (snapshot !== undefined) {\n return snapshot;\n }\n const interpreterSnapshot = yieldPoint.snapshot();\n snapshot = createRunSnapshot({\n executionSemantics,\n migration: restoredSnapshot?.migration,\n bindings: interpreterSnapshot.bindings,\n clock: options.clock,\n hostCalls: hostCalls.snapshot(),\n loopIterations: interpreterSnapshot.loopIterations,\n pendingAwaits: [createPendingAwaitSnapshot(yieldPoint)],\n replay: hostCalls.snapshotReplay(),\n initialInputs: initialInputs.snapshot,\n promiseReplay: promiseReplay.snapshot(),\n random,\n randomResumeState:\n typeof yieldPoint.replayState === \"number\" ? yieldPoint.replayState : undefined,\n sourceHash\n });\n return snapshot;\n };\n\n activeSnapshotScheduler.onYield(createSnapshot);\n dumpController.onYield(createSnapshot);\n },\n scope: executionScope,\n signal: options.signal,\n snapshot: interpreterSnapshot,\n surfaceUnhandledThrows: true,\n useScopeDirectly: true\n });\n const result =\n entryPointArgs === undefined || !topLevelResult.ok\n ? topLevelResult\n : await callEntryPoint({\n jobs,\n args: entryPointArgs,\n budget,\n compilation,\n captureReplayState: random.generator.snapshot,\n filename,\n module,\n onYield: (yieldPoint) => {\n snapshotIteration += 1;\n safeAddEvent(yieldPoint.otelSpan ?? getActiveOtelSpan(), \"snapshot.saved\", {\n iteration: snapshotIteration\n });\n let snapshot: RunSnapshot | undefined;\n const createSnapshot = () => {\n if (snapshot !== undefined) {\n return snapshot;\n }\n const interpreterSnapshot = yieldPoint.snapshot();\n snapshot = createRunSnapshot({\n executionSemantics,\n migration: restoredSnapshot?.migration,\n bindings: interpreterSnapshot.bindings,\n clock: options.clock,\n hostCalls: hostCalls.snapshot(),\n loopIterations: interpreterSnapshot.loopIterations,\n pendingAwaits: [createPendingAwaitSnapshot(yieldPoint)],\n replay: hostCalls.snapshotReplay(),\n initialInputs: initialInputs.snapshot,\n promiseReplay: promiseReplay.snapshot(),\n random,\n randomResumeState:\n typeof yieldPoint.replayState === \"number\"\n ? yieldPoint.replayState\n : undefined,\n sourceHash\n });\n return snapshot;\n };\n\n activeSnapshotScheduler.onYield(createSnapshot);\n dumpController.onYield(createSnapshot);\n },\n scope: executionScope,\n signal: options.signal,\n snapshot: interpreterSnapshot\n });\n await throwIfReturnedPromiseRejected(result);\n await throwIfUnhandledPromiseRejected(promiseTracker);\n await activeSnapshotScheduler.finish();\n\n let replay: HostCallReplay | undefined;\n let replayError: string | undefined;\n try {\n replay = hostCalls.snapshotReplay();\n } catch (error) {\n if (!(error instanceof MissingReplayCapabilityError)) throw error;\n replayError = error.message;\n }\n const snapshot = createRunSnapshot({\n executionSemantics,\n migration: restoredSnapshot?.migration,\n bindings: executionScope.snapshot().bindings,\n clock: options.clock,\n hostCalls: hostCalls.snapshot(),\n replay,\n initialInputs: initialInputs.snapshot,\n promiseReplay: promiseReplay.snapshot(),\n random,\n sourceHash\n });\n if (replayError !== undefined) snapshot.replayError = replayError;\n dumpController.finalize(snapshot);\n completedSnapshot = snapshot;\n\n reconcileCompiledValues(\n budget,\n [\n ...Object.values(result.snapshot.bindings),\n ...(result.ok && \"returnValue\" in result ? [result.returnValue] : [])\n ],\n compilation\n );\n\n return {\n ...result,\n snapshot\n };\n } catch (error) {\n promiseReplay.fail(error);\n materializeWrappedErrorCause(error);\n if (createFailureSnapshot !== undefined && snapshotScheduler !== undefined) {\n try {\n if (cancellationSnapshotError !== undefined) throw cancellationSnapshotError.reason;\n const snapshot = cancellationSnapshot ?? createFailureSnapshot();\n dumpController.finalize(snapshot);\n await snapshotScheduler.write(snapshot);\n } catch (snapshotError) {\n if (snapshotError instanceof UnsnapshotableValueError) {\n console.warn(`Skipping failure snapshot: ${snapshotError.message}`);\n } else {\n console.warn(\"Failed to write failure snapshot.\", snapshotError);\n }\n }\n }\n dumpController.fail(error);\n throw error;\n } finally {\n lifecycle.hostCallbackContext.disable();\n options.signal?.removeEventListener(\"abort\", captureCancellationSnapshot);\n leaveInputReplay?.();\n leaveHostReplay?.();\n promiseReplay.dispose();\n leaveSnapshotRun?.();\n deactivateOtelSink();\n }\n });\n } finally {\n releaseObjectPrototype(budget);\n compilation.dispose();\n operation.release();\n }\n };\n const result = withRunResources(options.signal, () =>\n withSandboxPromiseRejectionTracker(promiseTracker, execute)\n ).catch(async (error: unknown) => {\n if (completedSnapshot !== undefined) {\n try {\n await createSnapshotScheduler<RunSnapshot>(options).write(completedSnapshot);\n } catch (snapshotError) {\n console.warn(\"Failed to write failure snapshot.\", snapshotError);\n }\n }\n dumpController.fail(error);\n throw error;\n });\n\n const controlled = result.finally(() => {\n capturePausedSnapshot = undefined;\n detachExecutionFailure();\n jobs.finish();\n });\n return attachExecutionControl(attachDumpController(controlled, dumpController), jobs, options.signal);\n}\n\nasync function throwIfReturnedPromiseRejected(result: InterpreterResult): Promise<void> {\n if (!result.ok || !isSandboxPromise(result.returnValue)) {\n return;\n }\n\n observeSandboxPromise(result.returnValue);\n\n let rejected = false;\n let rejectionReason: unknown;\n result.returnValue.promise.then(\n () => undefined,\n (reason) => {\n rejected = true;\n rejectionReason = reason;\n }\n );\n\n await Promise.resolve();\n await Promise.resolve();\n\n if (rejected) {\n consumeSettledHostCall(result.returnValue);\n throw new UnhandledRejectionError(rejectionReason, result.returnValue.span);\n }\n}\n\nasync function throwIfUnhandledPromiseRejected(\n tracker: SandboxPromiseRejectionTracker\n): Promise<void> {\n const unhandled = await tracker.findUnhandledRejection();\n if (unhandled !== undefined) {\n throw new UnhandledRejectionError(unhandled.reason, unhandled.span);\n }\n}\n\nasync function callEntryPoint(input: {\n jobs: SandboxJobQueue;\n compilation: CompileScope;\n args: readonly SandboxValue[];\n budget: Budget;\n captureReplayState: () => number;\n filename: string;\n module: Module;\n onYield: NonNullable<Parameters<typeof interpret>[1]>[\"onYield\"];\n scope: Scope;\n signal?: AbortSignal;\n snapshot?: RunSnapshot;\n}): Promise<InterpreterResult> {\n const defaultExport = input.scope.lookup(\"default\");\n\n if (!defaultExport.found) {\n throw new Error(`Script ${input.filename} does not export a default function.`);\n }\n\n if (!isSandboxClosure(defaultExport.value)) {\n throw new TypeError(`Default export in ${input.filename} must be callable.`);\n }\n\n const argumentBindings = Object.fromEntries(\n input.args.map((value, index) => [createEntryPointArgName(index), value])\n ) as Record<string, SandboxValue>;\n const entryScope = input.scope.child({\n __agentScriptEntryPoint: defaultExport.value,\n ...argumentBindings\n });\n\n return interpret(createEntryPointAwait(input.args.length, input.module.span), {\n jobs: input.jobs,\n compilation: input.compilation,\n signal: input.signal,\n budget: input.budget,\n captureReplayState: input.captureReplayState,\n onYield: input.onYield,\n scope: entryScope,\n snapshot: input.snapshot,\n surfaceUnhandledThrows: true,\n useScopeDirectly: true\n });\n}\n\nfunction createEntryPointAwait(argCount: number, span: SourceSpan): AwaitExpression {\n return {\n type: \"AwaitExpression\",\n argument: createEntryPointCall(argCount, span),\n span\n };\n}\n\nfunction createEntryPointCall(argCount: number, span: SourceSpan): CallExpression {\n return {\n type: \"CallExpression\",\n callee: createIdentifier(\"__agentScriptEntryPoint\", span),\n arguments: Array.from({ length: argCount }, (_value, index) =>\n createIdentifier(createEntryPointArgName(index), span)\n ),\n optional: false,\n span\n };\n}\n\nfunction createIdentifier(name: string, span: SourceSpan): Identifier {\n return {\n type: \"Identifier\",\n name,\n span\n };\n}\n\nfunction createEntryPointArgName(index: number): string {\n return `__agentScriptEntryPointArg${index}`;\n}\n\nfunction createExecutableNode(module: Module): ParseResult {\n const executableStatements = module.body.filter(\n (statement): statement is Exclude<Statement, { type: \"ImportDeclaration\" }> =>\n statement.type !== \"ImportDeclaration\"\n );\n\n if (executableStatements.length === 0) {\n return {\n type: \"BlockStatement\",\n body: [],\n span: module.span\n };\n }\n\n if (executableStatements.length === 1) {\n const [statement] = executableStatements;\n return statement.type === \"ExpressionStatement\" ? statement.expression : statement;\n }\n\n return {\n type: \"BlockStatement\",\n body: executableStatements,\n span: module.span\n };\n}\n\nfunction createRunSnapshot(input: {\n executionSemantics: \"jobs-v6\" | \"jobs-v7\" | \"jobs-v8\" | typeof EXECUTION_SEMANTICS;\n migration?: SafeJSSnapshot[\"migration\"];\n bindings: InterpreterResult[\"snapshot\"][\"bindings\"];\n clock: RunClock | undefined;\n hostCalls?: HostCallRecord[];\n replay?: HostCallReplay;\n promiseReplay?: PromiseReplaySnapshot;\n initialInputs?: ReplayData;\n loopIterations?: Record<string, LoopIterationSnapshot>;\n pendingAwaits?: RunPendingAwaitSnapshot[];\n randomResumeState?: number;\n random:\n | {\n seed: number;\n initialState: number;\n generator: RunRandom;\n }\n | undefined;\n sourceHash: string;\n}): RunSnapshot {\n const snapshot: RunSnapshot = {\n version: DUMP_FORMAT_VERSION,\n executionSemantics: input.executionSemantics,\n sourceHash: input.sourceHash,\n ...(input.migration === undefined ? {} : { migration: structuredClone(input.migration) }),\n bindings: input.bindings,\n clock: input.clock?.snapshot(),\n ...(input.hostCalls === undefined || input.hostCalls.length === 0\n ? {}\n : { hostCalls: input.hostCalls }),\n ...(input.loopIterations === undefined ? {} : { loopIterations: input.loopIterations }),\n ...(input.replay === undefined ? {} : { replay: input.replay }),\n ...(input.initialInputs === undefined ? {} : { initialInputs: structuredClone(input.initialInputs) }),\n ...(input.promiseReplay === undefined ? {} : { promiseReplay: input.promiseReplay }),\n ...(input.pendingAwaits === undefined || input.pendingAwaits.length === 0\n ? {}\n : { pendingAwaits: input.pendingAwaits }),\n random:\n input.random === undefined\n ? undefined\n : {\n seed: input.random.seed,\n initialState: input.random.initialState,\n ...(input.randomResumeState === undefined\n ? {}\n : { resumeState: input.randomResumeState }),\n state: input.random.generator.snapshot()\n }\n };\n inMemoryRunSnapshots.add(snapshot);\n return snapshot;\n}\n\nfunction readHostCallSnapshot(snapshot: SafeJSSnapshot | undefined): HostCallRecord[] {\n if (snapshot === undefined || !Array.isArray(snapshot.hostCalls)) {\n return [];\n }\n\n return snapshot.hostCalls.map((value, index) => {\n if (typeof value !== \"object\" || value === null) {\n throw new TypeError(`Snapshot hostCalls[${index}] must be an object.`);\n }\n\n const record = value as Partial<HostCallRecord>;\n const requiredStrings = [\n \"id\",\n \"runId\",\n \"sourceHash\",\n \"moduleId\",\n \"operation\",\n \"argumentDigest\"\n ] as const;\n for (const key of requiredStrings) {\n if (typeof record[key] !== \"string\" || record[key].length === 0) {\n throw new TypeError(`Snapshot hostCalls[${index}].${key} must be a non-empty string.`);\n }\n }\n if (record.sourceHash !== snapshot.sourceHash) {\n throw new TypeError(`Snapshot hostCalls[${index}].sourceHash must match the snapshot.`);\n }\n if (record.policy !== \"re-issue\" && record.policy !== \"read-side-effect\") {\n throw new TypeError(`Snapshot hostCalls[${index}].policy is invalid.`);\n }\n if (\n record.lifecycle !== \"created\" &&\n record.lifecycle !== \"running\" &&\n record.lifecycle !== \"settled\" &&\n record.lifecycle !== \"consumed\" &&\n record.lifecycle !== \"cancelled\"\n ) {\n throw new TypeError(`Snapshot hostCalls[${index}].lifecycle is invalid.`);\n }\n if (\n (record.lifecycle === \"settled\" || record.lifecycle === \"cancelled\") &&\n record.outcome === undefined\n ) {\n throw new TypeError(`Snapshot hostCalls[${index}].outcome is required.`);\n }\n\n return record as HostCallRecord;\n });\n}\n\nfunction hasLoopIterationSnapshot(snapshot: SafeJSSnapshot | undefined): snapshot is RunSnapshot {\n return (\n snapshot !== undefined &&\n typeof snapshot.loopIterations === \"object\" &&\n snapshot.loopIterations !== null &&\n Object.keys(snapshot.loopIterations).length > 0\n );\n}\n\nfunction createPendingAwaitSnapshot(yieldPoint: ResumeBreakpoint): RunPendingAwaitSnapshot {\n return {\n ...(yieldPoint.nodeId === undefined ? {} : { nodeId: yieldPoint.nodeId }),\n span: yieldPoint.span\n };\n}\n\ntype ResumeBreakpoint = Parameters<\n NonNullable<NonNullable<Parameters<typeof interpret>[1]>[\"onYield\"]>\n>[0];\n"],
5
- "mappings": "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",
6
- "names": ["module", "descriptor", "result", "dumpController", "operation", "snapshot", "interpreterSnapshot"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/restore.ts"],
4
- "sourcesContent": ["import { hashSource } from \"./parse/hash.js\";\nimport type { CompileOwner } from \"./interp/budget.js\";\nimport { replaceErrorStack } from \"./error/shape.js\";\nimport { SnapshotValidationError, validateDumpEnvelope, validateRuntimeSnapshotDescriptors } from \"./snapshot/validation.js\";\nimport { inMemoryRunSnapshots, serializeSafeJSSnapshot } from \"./snapshot/dump-format.js\";\nimport { assertSnapshotInactive } from \"./interp/running-state.js\";\nimport { validateSnapshotMigration, type SnapshotMigration } from \"./snapshot/migration.js\";\nimport { parseModule } from \"./parse/parser.js\";\nimport { ParseError } from \"./parse/format-error.js\";\nimport { createModuleSource, createDynamicSource, createEvalSource, type DynamicSource, type EvalSourceContext } from \"./parse/dynamic-source.js\";\nimport { validateGuestFunctionAst } from \"./snapshot/guest-ast-validation.js\";\nimport { validateTemplateObjects } from \"./snapshot/template-validation.js\";\nimport type { ParseResult } from \"./parse.js\";\n\nexport type SafeJSSnapshot = {\n version?: number;\n sourceHash: string;\n migration?: SnapshotMigration;\n clock?: {\n next: number;\n };\n random?: {\n seed: number;\n state: number;\n initialState?: number;\n resumeState?: number;\n };\n [key: string]: unknown;\n};\n\nexport type RestoreOptions = {\n source: string;\n};\n\nexport class SnapshotMismatchError extends Error {\n readonly actualHash: string;\n readonly expectedHash: string;\n\n constructor(expectedHash: string, actualHash: string) {\n super(\n `source changed since snapshot was taken (hash ${expectedHash} expected, got ${actualHash}); pass --reset to discard`\n );\n this.name = \"SnapshotMismatchError\";\n this.actualHash = actualHash;\n this.expectedHash = expectedHash;\n replaceErrorStack(this);\n }\n}\n\nexport function restore<TSnapshot extends SafeJSSnapshot>(\n snapshot: TSnapshot,\n options: RestoreOptions,\n owner?: CompileOwner\n): TSnapshot {\n assertSnapshotInactive(snapshot);\n try {\n validateDumpEnvelope(snapshot, { resume: true });\n } catch (error) {\n if (!(error instanceof SnapshotValidationError) || error.code !== \"invalidState\" ||\n !inMemoryRunSnapshots.has(snapshot)) throw error;\n // Runtime snapshots can retain guest descriptor state. Use the same portable\n // representation as dump(), then apply all normal validation below.\n validateRuntimeSnapshotDescriptors(snapshot);\n snapshot = JSON.parse(serializeSafeJSSnapshot(snapshot)) as TSnapshot;\n validateDumpEnvelope(snapshot, { resume: true });\n }\n validateSnapshotMigration(snapshot.migration, snapshot.sourceHash, owner);\n\n const currentSourceHash = hashSource(\n options.source,\n owner,\n snapshot.executionSemantics !== \"jobs-v6\" && snapshot.executionSemantics !== \"jobs-v7\"\n );\n\n if (snapshot.sourceHash !== currentSourceHash) {\n throw new SnapshotMismatchError(snapshot.sourceHash, currentSourceHash);\n }\n\n if (snapshot.heap !== undefined && typeof snapshot.heap === \"object\" && snapshot.heap !== null) {\n const entries = Object.entries(snapshot.heap);\n const closures = entries.filter(([, value]) =>\n value !== null && typeof value === \"object\" && ([\"guest-function\", \"guest-class\", \"guest-generator\"].includes(String((value as Record<string, unknown>).kind)) ||\n (value as Record<string, unknown>).templateNodeId !== undefined));\n const dynamicSources = new Map<number, DynamicSource>();\n for (const [id, value] of entries) {\n const record = value as Record<string, unknown>;\n if (record.kind === \"guest-source\" || record.kind === \"guest-script\") {\n try {\n const compiled = record.kind === \"guest-script\"\n ? createEvalSource(record.body as string, record.context as EvalSourceContext, owner)\n : record.functionKind === \"module\" ? createModuleSource(record.body as string, owner)\n : createDynamicSource(record.functionKind as Exclude<DynamicSource[\"kind\"], \"eval\" | \"module\">,\n record.parameters as string, record.body as string, owner);\n dynamicSources.set(Number(id), compiled.source);\n } catch (error) {\n if (!(error instanceof SyntaxError) && !(error instanceof ParseError)) throw error;\n throw new SnapshotValidationError(\"invalidValue\", `$.heap[${JSON.stringify(id)}]`, error.message);\n }\n }\n }\n if (closures.length > 0) {\n const functions = new Map<number, Record<string, unknown>>();\n const pending: unknown[] = [parseModule(options.source, \"<input>\", owner)];\n while (pending.length > 0) {\n const value = pending.pop();\n if (value === null || typeof value !== \"object\") continue;\n const node = value as Record<string, unknown>;\n if (typeof node.nodeId === \"number\") {\n functions.set(node.nodeId, node);\n }\n for (const entry of Object.values(node)) pending.push(entry);\n }\n for (const [id, value] of closures) {\n const record = value as Record<string, unknown>;\n if (record.kind === \"guest-array\") continue;\n const nodes = record.dynamicSource === undefined ? functions\n : dynamicSources.get((record.dynamicSource as {id: number}).id)!.nodes;\n const origin = nodes.get(record.astNodeId as number);\n try { validateGuestFunctionAst(record, origin); }\n catch (error) {\n throw new SnapshotValidationError(\"invalidValue\", `$.heap[${JSON.stringify(id)}].astNodeId`, error instanceof Error ? error.message : String(error));\n }\n }\n try { validateTemplateObjects(snapshot.heap as Record<string, unknown>, functions.values() as Iterable<ParseResult>, dynamicSources); }\n catch (error) { throw new SnapshotValidationError(\"invalidValue\", \"$.heap\", String(error)); }\n }\n }\n\n return snapshot;\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }