@ricsam/isolate 0.1.3 → 0.1.5

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 (80) hide show
  1. package/README.md +25 -2
  2. package/dist/cjs/internal/async-context/index.cjs +140 -0
  3. package/dist/cjs/internal/async-context/index.cjs.map +10 -0
  4. package/dist/cjs/internal/client/connection.cjs +175 -123
  5. package/dist/cjs/internal/client/connection.cjs.map +3 -3
  6. package/dist/cjs/internal/console/index.cjs +2 -2
  7. package/dist/cjs/internal/console/index.cjs.map +2 -2
  8. package/dist/cjs/internal/core/index.cjs +13 -5
  9. package/dist/cjs/internal/core/index.cjs.map +3 -3
  10. package/dist/cjs/internal/crypto/index.cjs +2 -2
  11. package/dist/cjs/internal/crypto/index.cjs.map +2 -2
  12. package/dist/cjs/internal/daemon/connection.cjs +77 -12
  13. package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
  14. package/dist/cjs/internal/encoding/index.cjs.map +1 -1
  15. package/dist/cjs/internal/fetch/index.cjs +80 -18
  16. package/dist/cjs/internal/fetch/index.cjs.map +3 -3
  17. package/dist/cjs/internal/fetch/stream-state.cjs.map +1 -1
  18. package/dist/cjs/internal/fs/index.cjs +2 -2
  19. package/dist/cjs/internal/fs/index.cjs.map +2 -2
  20. package/dist/cjs/internal/module-loader/bundle.cjs +225 -8
  21. package/dist/cjs/internal/module-loader/bundle.cjs.map +3 -3
  22. package/dist/cjs/internal/path/index.cjs.map +1 -1
  23. package/dist/cjs/internal/playwright/index.cjs +2 -2
  24. package/dist/cjs/internal/playwright/index.cjs.map +2 -2
  25. package/dist/cjs/internal/runtime/index.cjs +78 -6
  26. package/dist/cjs/internal/runtime/index.cjs.map +3 -3
  27. package/dist/cjs/internal/test-environment/index.cjs +2 -2
  28. package/dist/cjs/internal/test-environment/index.cjs.map +2 -2
  29. package/dist/cjs/internal/timers/index.cjs +9 -4
  30. package/dist/cjs/internal/timers/index.cjs.map +3 -3
  31. package/dist/cjs/internal/typecheck/isolate-types.cjs +36 -1
  32. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
  33. package/dist/cjs/package.json +1 -1
  34. package/dist/mjs/internal/async-context/index.mjs +100 -0
  35. package/dist/mjs/internal/async-context/index.mjs.map +10 -0
  36. package/dist/mjs/internal/client/connection.mjs +176 -123
  37. package/dist/mjs/internal/client/connection.mjs.map +3 -3
  38. package/dist/mjs/internal/console/index.mjs +2 -2
  39. package/dist/mjs/internal/console/index.mjs.map +2 -2
  40. package/dist/mjs/internal/core/index.mjs +13 -5
  41. package/dist/mjs/internal/core/index.mjs.map +3 -3
  42. package/dist/mjs/internal/crypto/index.mjs +2 -2
  43. package/dist/mjs/internal/crypto/index.mjs.map +2 -2
  44. package/dist/mjs/internal/daemon/connection.mjs +77 -12
  45. package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
  46. package/dist/mjs/internal/encoding/index.mjs.map +1 -1
  47. package/dist/mjs/internal/fetch/index.mjs +80 -18
  48. package/dist/mjs/internal/fetch/index.mjs.map +3 -3
  49. package/dist/mjs/internal/fetch/stream-state.mjs.map +1 -1
  50. package/dist/mjs/internal/fs/index.mjs +2 -2
  51. package/dist/mjs/internal/fs/index.mjs.map +2 -2
  52. package/dist/mjs/internal/module-loader/bundle.mjs +225 -8
  53. package/dist/mjs/internal/module-loader/bundle.mjs.map +3 -3
  54. package/dist/mjs/internal/path/index.mjs.map +1 -1
  55. package/dist/mjs/internal/playwright/index.mjs +2 -2
  56. package/dist/mjs/internal/playwright/index.mjs.map +2 -2
  57. package/dist/mjs/internal/runtime/index.mjs +78 -6
  58. package/dist/mjs/internal/runtime/index.mjs.map +3 -3
  59. package/dist/mjs/internal/test-environment/index.mjs +2 -2
  60. package/dist/mjs/internal/test-environment/index.mjs.map +2 -2
  61. package/dist/mjs/internal/timers/index.mjs +9 -4
  62. package/dist/mjs/internal/timers/index.mjs.map +3 -3
  63. package/dist/mjs/internal/typecheck/isolate-types.mjs +36 -1
  64. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
  65. package/dist/mjs/package.json +1 -1
  66. package/dist/types/internal/async-context/index.d.ts +5 -0
  67. package/dist/types/internal/console/index.d.ts +1 -1
  68. package/dist/types/internal/core/index.d.ts +2 -2
  69. package/dist/types/internal/crypto/index.d.ts +1 -1
  70. package/dist/types/internal/daemon/types.d.ts +1 -0
  71. package/dist/types/internal/encoding/index.d.ts +1 -1
  72. package/dist/types/internal/fetch/index.d.ts +1 -1
  73. package/dist/types/internal/fetch/stream-state.d.ts +1 -1
  74. package/dist/types/internal/fs/index.d.ts +1 -1
  75. package/dist/types/internal/path/index.d.ts +1 -1
  76. package/dist/types/internal/playwright/index.d.ts +1 -1
  77. package/dist/types/internal/test-environment/index.d.ts +1 -1
  78. package/dist/types/internal/timers/index.d.ts +1 -1
  79. package/dist/types/internal/typecheck/isolate-types.d.ts +2 -2
  80. package/package.json +8 -3
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/internal/core/index.ts"],
4
4
  "sourcesContent": [
5
- "import ivm from \"isolated-vm\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n// Types for isolated-vm context\nexport type { Isolate, Context, Reference } from \"isolated-vm\";\n\nconst runtimeRequire = createRequire(path.join(process.cwd(), \"package.json\"));\n\n// ============================================================================\n// Error Encoding Helpers (for cross-boundary error transfer)\n// ============================================================================\n\nconst KNOWN_ERROR_TYPES = [\n \"TypeError\",\n \"RangeError\",\n \"SyntaxError\",\n \"ReferenceError\",\n \"URIError\",\n \"EvalError\",\n] as const;\n\n/**\n * Get the error constructor name, falling back to \"Error\" for unknown types.\n */\nfunction getErrorConstructorName(errorType: string): string {\n return (KNOWN_ERROR_TYPES as readonly string[]).includes(errorType)\n ? errorType\n : \"Error\";\n}\n\n/**\n * Encode an error with its type prefix for transfer across isolate boundary.\n */\nfunction encodeErrorForTransfer(err: Error): Error {\n const errorType = getErrorConstructorName(err.name);\n return new Error(`[${errorType}]${err.message}`);\n}\n\n/**\n * Normalize unknown thrown values to Error instances for stable transfer.\n */\nfunction toError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n if (typeof err === \"string\") {\n return new Error(err);\n }\n try {\n return new Error(JSON.stringify(err));\n } catch {\n return new Error(String(err ?? \"Unknown error\"));\n }\n}\n\n/**\n * JavaScript code for the __decodeError helper (used in isolate).\n */\nconst DECODE_ERROR_JS = `\nfunction __decodeError(err) {\n if (!(err instanceof Error)) return err;\n const match = err.message.match(/^\\\\[(TypeError|RangeError|SyntaxError|ReferenceError|URIError|EvalError|Error)\\\\](.*)$/);\n if (match) {\n const ErrorType = globalThis[match[1]] || Error;\n return new ErrorType(match[2]);\n }\n return err;\n}\n`.trim();\n\n// ============================================================================\n// DOMParser Injection State\n// ============================================================================\n\nconst domParserInjectedContexts = new WeakSet<ivm.Context>();\nlet linkedomWorkerInjectionCode: string | null = null;\n\n// ============================================================================\n// Instance State Management\n// ============================================================================\n\n/**\n * Map to store host-side state for instances created in the isolate.\n * Key is the unique instance ID, value is the instance state.\n */\nconst instanceStateMap = new WeakMap<ivm.Context, Map<number, unknown>>();\nlet nextInstanceId = 1;\n\nfunction getInstanceStateMapForContext(\n context: ivm.Context\n): Map<number, unknown> {\n let map = instanceStateMap.get(context);\n if (!map) {\n map = new Map();\n instanceStateMap.set(context, map);\n }\n return map;\n}\n\n/**\n * Clear all instance state (for testing)\n */\nexport function clearAllInstanceState(): void {\n nextInstanceId = 1;\n}\n\n// ============================================================================\n// Unmarshaled Handle Tracking\n// ============================================================================\n\nconst unmarshaledHandles = new WeakMap<ivm.Context, Set<ivm.Reference>>();\n\nfunction trackUnmarshaledHandle(\n context: ivm.Context,\n ref: ivm.Reference\n): void {\n let set = unmarshaledHandles.get(context);\n if (!set) {\n set = new Set();\n unmarshaledHandles.set(context, set);\n }\n set.add(ref);\n}\n\n/**\n * Cleanup all handles created during unmarshalling for a context\n */\nexport function cleanupUnmarshaledHandles(context: ivm.Context): void {\n const set = unmarshaledHandles.get(context);\n if (set) {\n for (const ref of set) {\n try {\n ref.release();\n } catch {\n // Handle may already be released\n }\n }\n set.clear();\n }\n}\n\n// ============================================================================\n// Marshal / Unmarshal\n// ============================================================================\n\nexport interface MarshalOptions {\n maxDepth?: number;\n}\n\nexport interface UnmarshalOptions {\n maxDepth?: number;\n}\n\nconst DEFAULT_MAX_DEPTH = 100;\n\n/**\n * Marshal a JavaScript value to an isolated-vm Reference.\n * Converts host values into values that can be used inside the isolate.\n */\nexport function marshal(\n context: ivm.Context,\n value: unknown,\n options?: MarshalOptions\n): ivm.Reference {\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n const seen = new Set<object>();\n\n function marshalValue(val: unknown, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Max depth of ${maxDepth} exceeded during marshalling`);\n }\n\n // Handle primitives\n if (val === null || val === undefined) {\n return val;\n }\n\n const type = typeof val;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return val;\n }\n\n if (type === \"function\") {\n // Create a callback that can be called from the isolate\n return new ivm.Callback((...args: unknown[]) => {\n try {\n return (val as (...args: unknown[]) => unknown)(...args);\n } catch (err) {\n if (err instanceof Error) {\n throw err;\n }\n throw new Error(String(err));\n }\n });\n }\n\n if (type === \"object\") {\n const obj = val as object;\n\n // Check for circular reference\n if (seen.has(obj)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(obj);\n\n try {\n // Handle Uint8Array and other typed arrays\n if (ArrayBuffer.isView(obj)) {\n if (obj instanceof Uint8Array) {\n // Create a copy of the buffer to pass to the isolate\n return new ivm.ExternalCopy(obj).copyInto();\n }\n // Other typed arrays - convert to regular array for now\n return Array.from(new Uint8Array(obj.buffer, obj.byteOffset, obj.byteLength));\n }\n\n // Handle ArrayBuffer\n if (obj instanceof ArrayBuffer) {\n return new ivm.ExternalCopy(new Uint8Array(obj)).copyInto();\n }\n\n // Handle Date\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n // Handle RegExp\n if (obj instanceof RegExp) {\n return {\n __type: \"RegExp\",\n source: obj.source,\n flags: obj.flags,\n };\n }\n\n // Handle Error\n if (obj instanceof Error) {\n return {\n __type: \"Error\",\n name: obj.name,\n message: obj.message,\n stack: obj.stack,\n };\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n const result: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n result[i] = marshalValue(obj[i], depth + 1);\n }\n return result;\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = marshalValue(\n (obj as Record<string, unknown>)[key],\n depth + 1\n );\n }\n return result;\n } finally {\n seen.delete(obj);\n }\n }\n\n // Unsupported type\n return undefined;\n }\n\n const marshaled = marshalValue(value, 0);\n\n // If it's already a Reference or Callback, return it directly\n if (marshaled instanceof ivm.Reference || marshaled instanceof ivm.Callback) {\n return marshaled as ivm.Reference;\n }\n\n // Use ExternalCopy for efficient transfer of the marshaled value\n const copy = new ivm.ExternalCopy(marshaled);\n const result = copy.copyInto();\n copy.release();\n\n // Note: This returns the copied value, not a Reference\n // For full Reference semantics, use context.global.setSync then getSync with { reference: true }\n return result as unknown as ivm.Reference;\n}\n\n/**\n * Unmarshal an isolated-vm Reference or value to a JavaScript value.\n * Converts isolate values back to host values.\n */\nexport function unmarshal(\n context: ivm.Context,\n value: ivm.Reference | unknown,\n options?: UnmarshalOptions\n): unknown {\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n function unmarshalValue(val: unknown, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Max depth of ${maxDepth} exceeded during unmarshalling`);\n }\n\n if (val === null || val === undefined) {\n return val;\n }\n\n const type = typeof val;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return val;\n }\n\n if (val instanceof ivm.Reference) {\n // Copy the value out of the isolate\n try {\n const copied = val.copySync();\n trackUnmarshaledHandle(context, val);\n return unmarshalValue(copied, depth);\n } catch {\n // If copy fails, the reference might be to a function\n return val;\n }\n }\n\n if (type === \"object\") {\n const obj = val as Record<string, unknown>;\n\n // Handle special types\n if (obj.__type === \"Error\") {\n const ErrorConstructor = (globalThis as Record<string, unknown>)[\n obj.name as string\n ] as ErrorConstructor | undefined;\n const error = new (ErrorConstructor || Error)(obj.message as string);\n error.name = obj.name as string;\n if (obj.stack) {\n error.stack = obj.stack as string;\n }\n return error;\n }\n\n if (obj.__type === \"RegExp\") {\n return new RegExp(obj.source as string, obj.flags as string);\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => unmarshalValue(item, depth + 1));\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = unmarshalValue(obj[key], depth + 1);\n }\n return result;\n }\n\n return val;\n }\n\n // Handle both Reference and direct values (from marshal's copyInto)\n if (value instanceof ivm.Reference) {\n try {\n const copied = value.copySync();\n return unmarshalValue(copied, 0);\n } catch {\n // Reference might be to a function or other non-copyable value\n return value;\n }\n }\n\n // Direct value (e.g., from marshal which returns copyInto result)\n return unmarshalValue(value, 0);\n}\n\n// ============================================================================\n// Scope Management\n// ============================================================================\n\n/**\n * Scope for managing reference lifecycle\n */\nexport interface Scope {\n /**\n * Track a reference for automatic cleanup when scope exits\n */\n manage<T extends ivm.Reference>(ref: T): T;\n\n /**\n * Marshal a value and track the resulting reference\n */\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference;\n}\n\n/**\n * Execute a synchronous callback with automatic reference cleanup.\n * All references tracked via scope.manage() will be released when the scope exits.\n */\nexport function withScope<T>(\n context: ivm.Context,\n callback: (scope: Scope) => T\n): T {\n const refs: ivm.Reference[] = [];\n\n const scope: Scope = {\n manage<R extends ivm.Reference>(ref: R): R {\n refs.push(ref);\n return ref;\n },\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference {\n const ref = marshal(context, value, options);\n refs.push(ref);\n return ref;\n },\n };\n\n try {\n return callback(scope);\n } finally {\n // Release in reverse order (LIFO)\n for (let i = refs.length - 1; i >= 0; i--) {\n try {\n refs[i]!.release();\n } catch {\n // Handle may already be released\n }\n }\n }\n}\n\n/**\n * Execute an async callback with automatic reference cleanup.\n * All references tracked via scope.manage() will be released when the scope exits.\n */\nexport async function withScopeAsync<T>(\n context: ivm.Context,\n callback: (scope: Scope) => Promise<T>\n): Promise<T> {\n const refs: ivm.Reference[] = [];\n\n const scope: Scope = {\n manage<R extends ivm.Reference>(ref: R): R {\n refs.push(ref);\n return ref;\n },\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference {\n const ref = marshal(context, value, options);\n refs.push(ref);\n return ref;\n },\n };\n\n try {\n return await callback(scope);\n } finally {\n // Release in reverse order (LIFO)\n for (let i = refs.length - 1; i >= 0; i--) {\n try {\n refs[i]!.release();\n } catch {\n // Handle may already be released\n }\n }\n }\n}\n\n// ============================================================================\n// Function Builder\n// ============================================================================\n\n/**\n * Define a synchronous function that can be called from the isolate.\n * Arguments are automatically unmarshalled, return values are automatically marshalled.\n */\nexport function defineFunction(\n context: ivm.Context,\n name: string,\n fn: (...args: unknown[]) => unknown\n): ivm.Reference {\n const callback = new ivm.Callback(\n (...args: unknown[]) => {\n return fn(...args);\n },\n { sync: true }\n );\n\n // Set it on the global object in the context\n const global = context.global;\n global.setSync(name, callback);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n/**\n * Define an async function that can be called from the isolate.\n * Uses ivm.Reference.apply with promise transfer so isolate code can truly await\n * host work without blocking the isolate thread.\n */\nexport function defineAsyncFunction(\n context: ivm.Context,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): ivm.Reference {\n const global = context.global;\n\n // Internal reference name to avoid conflicts with user code\n const refName = `__async_ref_${name}`;\n\n // Create a Reference to the async function (not a Callback)\n const asyncRef = new ivm.Reference(async (...args: unknown[]) => {\n return await fn(...args);\n });\n\n // Set the reference on global\n global.setSync(refName, asyncRef);\n\n // Inject an async wrapper that forwards through ivm.Reference.apply.\n const wrapperCode = `\n(function() {\n ${DECODE_ERROR_JS}\n\n globalThis.${name} = async function(...args) {\n try {\n return await ${refName}.apply(undefined, args, { result: { promise: true, copy: true } });\n } catch (err) {\n throw __decodeError(err);\n }\n };\n})();\n`;\n\n context.evalSync(wrapperCode);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n// ============================================================================\n// Class Builder\n// ============================================================================\n\nexport interface PropertyDescriptor<TState = unknown> {\n get?: (state: TState) => unknown;\n set?: (state: TState, value: unknown) => void;\n value?: unknown;\n writable?: boolean;\n enumerable?: boolean;\n configurable?: boolean;\n}\n\nexport interface ClassDefinition<TState extends object = object> {\n name: string;\n construct?: (args: unknown[]) => TState;\n methods?: Record<\n string,\n { fn: (state: TState, ...args: unknown[]) => unknown; async?: boolean }\n >;\n properties?: Record<string, PropertyDescriptor<TState>>;\n staticMethods?: Record<\n string,\n { fn: (...args: unknown[]) => unknown; async?: boolean }\n >;\n staticProperties?: Record<string, unknown>;\n extends?: string;\n}\n\n/**\n * Define a class that can be instantiated in the isolate.\n * Instance state is stored on the host side, accessed via unique IDs.\n */\nexport function defineClass<TState extends object = object>(\n context: ivm.Context,\n definition: ClassDefinition<TState>\n): ivm.Reference {\n const {\n name,\n construct,\n methods = {},\n properties = {},\n staticMethods = {},\n staticProperties = {},\n extends: parentClassName,\n } = definition;\n const stateMap = getInstanceStateMapForContext(context);\n\n // Build method callback/reference registrations.\n // Sync methods use Callback, async methods use Reference.\n const methodCallbacks: Record<string, ivm.Callback> = {};\n const methodReferences: Record<string, ivm.Reference<(instanceId: number, ...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [methodName, methodDef] of Object.entries(methods)) {\n if (methodDef.async) {\n // Async methods use Reference.apply with promise transfer.\n methodReferences[`__${name}_${methodName}_ref`] = new ivm.Reference(\n async (instanceId: number, ...args: unknown[]) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return await methodDef.fn(state, ...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n } else {\n // Sync methods use regular Callback\n methodCallbacks[`__${name}_${methodName}`] = new ivm.Callback(\n (instanceId: number, ...args: unknown[]) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return methodDef.fn(state, ...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Build property getter/setter callbacks\n const propertyCallbacks: Record<string, ivm.Callback> = {};\n for (const [propName, propDef] of Object.entries(properties)) {\n if (propDef.get) {\n const getter = propDef.get;\n propertyCallbacks[`__${name}_get_${propName}`] = new ivm.Callback(\n (instanceId: number) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return getter(state);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n if (propDef.set) {\n const setter = propDef.set;\n propertyCallbacks[`__${name}_set_${propName}`] = new ivm.Callback(\n (instanceId: number, value: unknown) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n setter(state, value);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Build static method callbacks/references.\n // Sync methods use Callback, async methods use Reference.\n const staticMethodCallbacks: Record<string, ivm.Callback> = {};\n const staticMethodReferences: Record<string, ivm.Reference<(...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [methodName, methodDef] of Object.entries(staticMethods)) {\n if (methodDef.async) {\n // Async static methods use Reference.apply with promise transfer.\n staticMethodReferences[`__${name}_static_${methodName}_ref`] = new ivm.Reference(\n async (...args: unknown[]) => {\n try {\n return await methodDef.fn(...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n } else {\n // Sync static methods use regular Callback\n staticMethodCallbacks[`__${name}_static_${methodName}`] = new ivm.Callback(\n (...args: unknown[]) => {\n try {\n return methodDef.fn(...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Constructor callback\n const constructorCallback = new ivm.Callback((...args: unknown[]) => {\n const instanceId = nextInstanceId++;\n if (construct) {\n try {\n const state = construct(args);\n stateMap.set(instanceId, state);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n } else {\n stateMap.set(instanceId, {} as TState);\n }\n return instanceId;\n });\n\n // Register all callbacks and references on global\n const global = context.global;\n global.setSync(`__${name}_construct`, constructorCallback);\n\n for (const [callbackName, callback] of Object.entries(methodCallbacks)) {\n global.setSync(callbackName, callback);\n }\n for (const [refName, ref] of Object.entries(methodReferences)) {\n global.setSync(refName, ref);\n }\n for (const [callbackName, callback] of Object.entries(propertyCallbacks)) {\n global.setSync(callbackName, callback);\n }\n for (const [callbackName, callback] of Object.entries(\n staticMethodCallbacks\n )) {\n global.setSync(callbackName, callback);\n }\n for (const [refName, ref] of Object.entries(staticMethodReferences)) {\n global.setSync(refName, ref);\n }\n\n // Build the class definition JavaScript code\n const extendsClause = parentClassName\n ? ` extends globalThis.${parentClassName}`\n : \"\";\n\n let classCode = `\n(function() {\n // Helper to decode error type from message\n function __decodeError(err) {\n const match = err.message.match(/^\\\\[(TypeError|RangeError|SyntaxError|ReferenceError|URIError|EvalError|Error)\\\\](.*)$/);\n if (match) {\n const ErrorType = globalThis[match[1]] || Error;\n return new ErrorType(match[2]);\n }\n return err;\n }\n\n // Marker to indicate a class is being extended (skip parent state creation)\n const __EXTENDING_MARKER = Symbol.for('__defineClass_extending__');\n // WeakMap to store instance IDs (shared across inheritance chain)\n const _${name}_instanceIds = new WeakMap();\n\n class ${name}${extendsClause} {\n constructor(...args) {\n try {\n ${parentClassName ? \"super(__EXTENDING_MARKER);\" : \"\"}\n // Skip state creation if being extended (child will create state)\n if (args[0] === __EXTENDING_MARKER) {\n return;\n }\n const instanceId = __${name}_construct(...args);\n _${name}_instanceIds.set(this, instanceId);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n\n _getInstanceId() {\n return _${name}_instanceIds.get(this);\n }\n`;\n\n // Add methods\n for (const [methodName, methodDef] of Object.entries(methods)) {\n if (methodDef.async) {\n classCode += `\n async ${methodName}(...args) {\n try {\n return await __${name}_${methodName}_ref.apply(\n undefined,\n [this._getInstanceId(), ...args],\n { result: { promise: true, copy: true } }\n );\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n } else {\n classCode += `\n ${methodName}(...args) {\n try {\n return __${name}_${methodName}(this._getInstanceId(), ...args);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n }\n\n // Add properties\n for (const [propName, propDef] of Object.entries(properties)) {\n if (propDef.get || propDef.set) {\n if (propDef.get) {\n classCode += `\n get ${propName}() {\n try {\n return __${name}_get_${propName}(this._getInstanceId());\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n if (propDef.set) {\n classCode += `\n set ${propName}(value) {\n try {\n __${name}_set_${propName}(this._getInstanceId(), value);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n }\n }\n\n classCode += `\n }\n`;\n\n // Add static methods\n for (const [methodName, methodDef] of Object.entries(staticMethods)) {\n if (methodDef.async) {\n classCode += `\n ${name}.${methodName} = async function(...args) {\n try {\n return await __${name}_static_${methodName}_ref.apply(\n undefined,\n args,\n { result: { promise: true, copy: true } }\n );\n } catch (err) {\n throw __decodeError(err);\n }\n };\n`;\n } else {\n classCode += `\n ${name}.${methodName} = function(...args) {\n try {\n return __${name}_static_${methodName}(...args);\n } catch (err) {\n throw __decodeError(err);\n }\n };\n`;\n }\n }\n\n // Add static properties\n for (const [propName, propValue] of Object.entries(staticProperties)) {\n classCode += `\n ${name}.${propName} = ${JSON.stringify(propValue)};\n`;\n }\n\n classCode += `\n globalThis.${name} = ${name};\n return ${name};\n})()\n`;\n\n // Evaluate the class and assign it directly to globalThis in the isolate\n context.evalSync(classCode);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n// ============================================================================\n// SetupCore - Inject WHATWG APIs\n// ============================================================================\n\nexport interface SetupCoreOptions {\n /** Whether to inject TextEncoder/TextDecoder */\n textEncoding?: boolean;\n /** Whether to inject URL/URLSearchParams */\n url?: boolean;\n /** Whether to inject Blob/File */\n blob?: boolean;\n /** Whether to inject Streams */\n streams?: boolean;\n /** Whether to inject DOMParser and DOM constructors */\n domParser?: boolean;\n}\n\nexport interface CoreHandle {\n dispose(): void;\n}\n\n/**\n * Setup core APIs in an isolated-vm context.\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - DOMParser\n * - Node, Document, DocumentFragment, DocumentType, Element, Attr, Text, Comment\n * - Event, EventTarget, CustomEvent\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n */\nexport async function setupCore(\n context: ivm.Context,\n options?: SetupCoreOptions\n): Promise<CoreHandle> {\n const opts = {\n textEncoding: true,\n url: true,\n blob: true,\n streams: true,\n domParser: true,\n ...options,\n };\n\n const stateMap = getInstanceStateMapForContext(context);\n\n // Inject TextEncoder/TextDecoder\n if (opts.textEncoding) {\n await injectTextEncoding(context);\n }\n\n // Inject URL/URLSearchParams\n if (opts.url) {\n await injectURL(context);\n }\n\n // Inject DOMException (needed by AbortController and structuredClone)\n await injectDOMException(context);\n\n // Inject structuredClone\n await injectStructuredClone(context);\n\n // Inject AbortController/AbortSignal (needed by Streams)\n await injectAbortController(context);\n\n // Inject Blob/File\n if (opts.blob) {\n await injectBlob(context, stateMap);\n }\n\n // Inject Streams\n if (opts.streams) {\n await injectStreams(context, stateMap);\n }\n\n // Inject TextEncoderStream/TextDecoderStream (requires both textEncoding and streams)\n if (opts.textEncoding && opts.streams) {\n await injectTextEncodingStreams(context);\n }\n\n // Inject DOMParser and DOM constructors\n if (opts.domParser) {\n await injectDOMParser(context);\n }\n\n return {\n dispose() {\n cleanupUnmarshaledHandles(context);\n },\n };\n}\n\n// ============================================================================\n// DOMParser / DOM Constructors Implementation\n// ============================================================================\n\nfunction getLinkedomWorkerInjectionCode(): string {\n if (linkedomWorkerInjectionCode) {\n return linkedomWorkerInjectionCode;\n }\n\n const linkedomPackageJsonPath = runtimeRequire.resolve(\"linkedom/package.json\");\n const workerPath = path.join(path.dirname(linkedomPackageJsonPath), \"worker.js\");\n const workerSource = readFileSync(workerPath, \"utf8\");\n const exportBlockPattern = /export\\s*\\{[\\s\\S]*?\\};?\\s*$/;\n\n if (!exportBlockPattern.test(workerSource)) {\n throw new Error(\"Failed to locate linkedom worker exports\");\n }\n\n const workerWithoutExports = workerSource.replace(exportBlockPattern, \"\");\n linkedomWorkerInjectionCode = `\n(function() {\n${workerWithoutExports}\nglobalThis.__linkedomExports = {\n DOMParser,\n Node,\n Document,\n DocumentFragment,\n DocumentType,\n Element,\n Attr,\n Text,\n Comment,\n Event: GlobalEvent,\n EventTarget: DOMEventTarget,\n CustomEvent,\n};\n})();\n`.trim();\n\n return linkedomWorkerInjectionCode;\n}\n\nasync function injectDOMParser(context: ivm.Context): Promise<void> {\n if (domParserInjectedContexts.has(context)) {\n return;\n }\n\n context.evalSync(getLinkedomWorkerInjectionCode());\n\n const code = `\n(function() {\n const linkedom = globalThis.__linkedomExports;\n if (!linkedom) {\n throw new Error(\"DOMParser initialization failed: missing linkedom exports\");\n }\n\n const supportedMimeTypes = new Set([\n \"text/html\",\n \"text/xml\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"image/svg+xml\",\n ]);\n\n const OriginalDOMParser = linkedom.DOMParser;\n\n class DOMParser extends OriginalDOMParser {\n parseFromString(input, mimeType) {\n const normalizedMimeType = String(mimeType);\n if (!supportedMimeTypes.has(normalizedMimeType)) {\n throw new TypeError(\n \"Failed to execute 'parseFromString' on 'DOMParser': The provided value '\" +\n normalizedMimeType +\n \"' is not a valid enumeration value of type SupportedType.\"\n );\n }\n const document = super.parseFromString(input, normalizedMimeType);\n // Normalize adjacent text nodes to match browser parser behavior expected by some SDKs.\n if (\n normalizedMimeType !== \"text/html\" &&\n document &&\n typeof document.normalize === \"function\"\n ) {\n document.normalize();\n }\n return document;\n }\n }\n\n globalThis.DOMParser = DOMParser;\n globalThis.Node = linkedom.Node;\n globalThis.Document = linkedom.Document;\n globalThis.DocumentFragment = linkedom.DocumentFragment;\n globalThis.DocumentType = linkedom.DocumentType;\n globalThis.Element = linkedom.Element;\n globalThis.Attr = linkedom.Attr;\n globalThis.Text = linkedom.Text;\n globalThis.Comment = linkedom.Comment;\n globalThis.Event = linkedom.Event;\n globalThis.EventTarget = linkedom.EventTarget;\n globalThis.CustomEvent = linkedom.CustomEvent;\n\n delete globalThis.__linkedomExports;\n})();\n`;\n\n try {\n context.evalSync(code);\n domParserInjectedContexts.add(context);\n } catch (err) {\n try {\n context.evalSync(\"delete globalThis.__linkedomExports;\");\n } catch {\n // Ignore cleanup errors if context is already torn down.\n }\n throw err;\n }\n}\n\n// ============================================================================\n// TextEncoder / TextDecoder Implementation\n// ============================================================================\n\nasync function injectTextEncoding(context: ivm.Context): Promise<void> {\n // TextEncoder and TextDecoder are pure JS implementations\n const code = `\n(function() {\n class TextEncoder {\n constructor(encoding = 'utf-8') {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextEncoder only supports UTF-8 encoding');\n }\n }\n\n get encoding() { return 'utf-8'; }\n\n encode(input = '') {\n const str = String(input);\n const octets = [];\n for (let i = 0; i < str.length; i++) {\n let codePoint = str.codePointAt(i);\n if (codePoint > 0xFFFF) {\n i++; // Skip the next code unit for surrogate pairs\n }\n if (codePoint < 0x80) {\n octets.push(codePoint);\n } else if (codePoint < 0x800) {\n octets.push(0xC0 | (codePoint >> 6));\n octets.push(0x80 | (codePoint & 0x3F));\n } else if (codePoint < 0x10000) {\n octets.push(0xE0 | (codePoint >> 12));\n octets.push(0x80 | ((codePoint >> 6) & 0x3F));\n octets.push(0x80 | (codePoint & 0x3F));\n } else {\n octets.push(0xF0 | (codePoint >> 18));\n octets.push(0x80 | ((codePoint >> 12) & 0x3F));\n octets.push(0x80 | ((codePoint >> 6) & 0x3F));\n octets.push(0x80 | (codePoint & 0x3F));\n }\n }\n return new Uint8Array(octets);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n for (let i = 0; i < len; i++) {\n destination[i] = encoded[i];\n }\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n #encoding;\n #fatal;\n #ignoreBOM;\n\n constructor(encoding = 'utf-8', options = {}) {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextDecoder only supports UTF-8 encoding');\n }\n this.#encoding = 'utf-8';\n this.#fatal = Boolean(options.fatal);\n this.#ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n get encoding() { return this.#encoding; }\n get fatal() { return this.#fatal; }\n get ignoreBOM() { return this.#ignoreBOM; }\n\n decode(input, options = {}) {\n if (input === undefined) return '';\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else {\n throw new TypeError('Input must be ArrayBuffer or ArrayBufferView');\n }\n\n let result = '';\n let i = 0;\n\n // Skip BOM if present and not ignored\n if (!this.#ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n i = 3;\n }\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCodePoint(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n result += String.fromCodePoint(((byte1 & 0x1F) << 6) | (byte2 & 0x3F));\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n result += String.fromCodePoint(((byte1 & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F));\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80 || (byte4 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n const codePoint = ((byte1 & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F);\n result += String.fromCodePoint(codePoint);\n } else {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// TextEncoderStream / TextDecoderStream Implementation\n// (Must be called AFTER streams are injected since they extend TransformStream)\n// ============================================================================\n\nasync function injectTextEncodingStreams(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n class TextEncoderStream extends TransformStream {\n constructor() {\n const encoder = new TextEncoder();\n let pendingHighSurrogate = null;\n\n super({\n transform(chunk, controller) {\n let text = String(chunk);\n\n // Handle pending high surrogate from previous chunk\n if (pendingHighSurrogate !== null) {\n text = pendingHighSurrogate + text;\n pendingHighSurrogate = null;\n }\n\n // Check if chunk ends with a high surrogate (incomplete pair)\n const lastChar = text.charCodeAt(text.length - 1);\n if (lastChar >= 0xD800 && lastChar <= 0xDBFF) {\n pendingHighSurrogate = text.slice(-1);\n text = text.slice(0, -1);\n }\n\n if (text.length > 0) {\n controller.enqueue(encoder.encode(text));\n }\n },\n flush(controller) {\n // If there's a pending high surrogate without a low surrogate, encode as replacement\n if (pendingHighSurrogate !== null) {\n controller.enqueue(encoder.encode('\\uFFFD'));\n }\n }\n });\n }\n\n get encoding() { return 'utf-8'; }\n }\n\n class TextDecoderStream extends TransformStream {\n #encoding = 'utf-8';\n #fatal;\n #ignoreBOM;\n\n constructor(encoding = 'utf-8', options = {}) {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextDecoderStream only supports UTF-8 encoding');\n }\n\n const fatal = Boolean(options.fatal);\n const ignoreBOM = Boolean(options.ignoreBOM);\n const decoder = new TextDecoder(encoding, { fatal, ignoreBOM });\n let buffer = new Uint8Array(0);\n\n super({\n transform(chunk, controller) {\n // Combine with any leftover bytes from previous chunk\n let bytes;\n if (chunk instanceof ArrayBuffer) {\n bytes = new Uint8Array(chunk);\n } else if (ArrayBuffer.isView(chunk)) {\n bytes = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n } else {\n throw new TypeError('Input must be ArrayBuffer or ArrayBufferView');\n }\n\n if (buffer.length > 0) {\n const combined = new Uint8Array(buffer.length + bytes.length);\n combined.set(buffer);\n combined.set(bytes, buffer.length);\n bytes = combined;\n buffer = new Uint8Array(0);\n }\n\n // Find the last complete UTF-8 sequence\n let validEnd = bytes.length;\n for (let i = bytes.length - 1; i >= Math.max(0, bytes.length - 4); i--) {\n const byte = bytes[i];\n if ((byte & 0xC0) !== 0x80) { // Start of a multi-byte sequence or ASCII\n const expectedLength = byte < 0x80 ? 1 :\n (byte & 0xE0) === 0xC0 ? 2 :\n (byte & 0xF0) === 0xE0 ? 3 :\n (byte & 0xF8) === 0xF0 ? 4 : 1;\n if (i + expectedLength > bytes.length) {\n validEnd = i;\n }\n break;\n }\n }\n\n // Save incomplete sequence for next chunk\n if (validEnd < bytes.length) {\n buffer = bytes.slice(validEnd);\n bytes = bytes.slice(0, validEnd);\n }\n\n if (bytes.length > 0) {\n const text = decoder.decode(bytes, { stream: true });\n if (text.length > 0) {\n controller.enqueue(text);\n }\n }\n },\n flush(controller) {\n // Decode any remaining bytes\n if (buffer.length > 0) {\n const text = decoder.decode(buffer);\n if (text.length > 0) {\n controller.enqueue(text);\n }\n }\n }\n });\n\n this.#fatal = fatal;\n this.#ignoreBOM = ignoreBOM;\n }\n\n get encoding() { return this.#encoding; }\n get fatal() { return this.#fatal; }\n get ignoreBOM() { return this.#ignoreBOM; }\n }\n\n globalThis.TextEncoderStream = TextEncoderStream;\n globalThis.TextDecoderStream = TextDecoderStream;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// URL / URLSearchParams Implementation\n// ============================================================================\n\nasync function injectURL(context: ivm.Context): Promise<void> {\n // URL and URLSearchParams implementation in pure JS\n const code = `\n(function() {\n // Helper for application/x-www-form-urlencoded encoding (spaces as +)\n function urlEncode(str) {\n return encodeURIComponent(String(str)).replace(/%20/g, '+');\n }\n\n class URLSearchParams {\n #params = [];\n #url = null;\n\n constructor(init = '', url = null) {\n this.#url = url;\n this._parseInit(init);\n }\n\n _parseInit(init) {\n this.#params = [];\n if (typeof init === 'string') {\n const query = init.startsWith('?') ? init.slice(1) : init;\n if (query) {\n for (const pair of query.split('&')) {\n const idx = pair.indexOf('=');\n if (idx === -1) {\n this.#params.push([decodeURIComponent(pair.replace(/\\\\+/g, ' ')), '']);\n } else {\n this.#params.push([\n decodeURIComponent(pair.slice(0, idx).replace(/\\\\+/g, ' ')),\n decodeURIComponent(pair.slice(idx + 1).replace(/\\\\+/g, ' '))\n ]);\n }\n }\n }\n } else if (Array.isArray(init)) {\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n this.#params.push([String(pair[0]), String(pair[1])]);\n }\n }\n } else if (init instanceof URLSearchParams) {\n for (const [key, value] of init) {\n this.#params.push([String(key), String(value)]);\n }\n } else if (init && typeof init === 'object') {\n for (const [key, value] of Object.entries(init)) {\n this.#params.push([String(key), String(value)]);\n }\n }\n }\n\n _updateFromSearch(search) {\n this._parseInit(search);\n }\n\n #notifyUpdate() {\n if (this.#url) {\n this.#url._updateSearchFromParams(this.toString());\n }\n }\n\n get size() {\n return this.#params.length;\n }\n\n append(name, value) {\n this.#params.push([String(name), String(value)]);\n this.#notifyUpdate();\n }\n\n delete(name, value) {\n const nameStr = String(name);\n if (value === undefined) {\n this.#params = this.#params.filter(([k]) => k !== nameStr);\n } else {\n const valueStr = String(value);\n this.#params = this.#params.filter(([k, v]) => !(k === nameStr && v === valueStr));\n }\n this.#notifyUpdate();\n }\n\n get(name) {\n const nameStr = String(name);\n const pair = this.#params.find(([k]) => k === nameStr);\n return pair ? pair[1] : null;\n }\n\n getAll(name) {\n const nameStr = String(name);\n return this.#params.filter(([k]) => k === nameStr).map(([, v]) => v);\n }\n\n has(name, value) {\n const nameStr = String(name);\n if (value === undefined) {\n return this.#params.some(([k]) => k === nameStr);\n }\n const valueStr = String(value);\n return this.#params.some(([k, v]) => k === nameStr && v === valueStr);\n }\n\n set(name, value) {\n const nameStr = String(name);\n const valueStr = String(value);\n let found = false;\n this.#params = this.#params.filter(([k]) => {\n if (k === nameStr) {\n if (!found) {\n found = true;\n return true;\n }\n return false;\n }\n return true;\n });\n if (found) {\n const idx = this.#params.findIndex(([k]) => k === nameStr);\n if (idx !== -1) {\n this.#params[idx] = [nameStr, valueStr];\n }\n } else {\n this.#params.push([nameStr, valueStr]);\n }\n this.#notifyUpdate();\n }\n\n sort() {\n this.#params.sort((a, b) => a[0].localeCompare(b[0]));\n this.#notifyUpdate();\n }\n\n toString() {\n return this.#params\n .map(([k, v]) => urlEncode(k) + '=' + urlEncode(v))\n .join('&');\n }\n\n *entries() {\n for (const pair of this.#params) {\n yield [pair[0], pair[1]];\n }\n }\n\n *keys() {\n for (const [k] of this.#params) {\n yield k;\n }\n }\n\n *values() {\n for (const [, v] of this.#params) {\n yield v;\n }\n }\n\n forEach(callback, thisArg) {\n for (const [k, v] of this.#params) {\n callback.call(thisArg, v, k, this);\n }\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n }\n\n class URL {\n #protocol = '';\n #username = '';\n #password = '';\n #hostname = '';\n #port = '';\n #pathname = '/';\n #search = '';\n #hash = '';\n #searchParams = null;\n\n constructor(url, base) {\n if (arguments.length === 0) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let urlStr = String(url);\n\n if (base !== undefined) {\n const baseUrl = new URL(String(base));\n if (urlStr.startsWith('//')) {\n urlStr = baseUrl.protocol + urlStr;\n } else if (urlStr.startsWith('/')) {\n urlStr = baseUrl.origin + urlStr;\n } else if (!urlStr.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:/)) {\n const basePath = baseUrl.pathname.substring(0, baseUrl.pathname.lastIndexOf('/') + 1);\n urlStr = baseUrl.origin + basePath + urlStr;\n }\n }\n\n // Parse the URL\n const match = urlStr.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):(\\\\/\\\\/)?(.*)$/);\n if (!match) {\n throw new TypeError(\"Failed to construct 'URL': Invalid URL\");\n }\n\n this.#protocol = match[1].toLowerCase() + ':';\n let rest = match[3];\n\n if (match[2]) {\n // Has authority (//...)\n let authEnd = rest.indexOf('/');\n if (authEnd === -1) authEnd = rest.indexOf('?');\n if (authEnd === -1) authEnd = rest.indexOf('#');\n if (authEnd === -1) authEnd = rest.length;\n\n const authority = rest.substring(0, authEnd);\n rest = rest.substring(authEnd);\n\n // Parse authority: [userinfo@]host[:port]\n let hostPart = authority;\n const atIdx = authority.indexOf('@');\n if (atIdx !== -1) {\n const userinfo = authority.substring(0, atIdx);\n hostPart = authority.substring(atIdx + 1);\n const colonIdx = userinfo.indexOf(':');\n if (colonIdx !== -1) {\n this.#username = decodeURIComponent(userinfo.substring(0, colonIdx));\n this.#password = decodeURIComponent(userinfo.substring(colonIdx + 1));\n } else {\n this.#username = decodeURIComponent(userinfo);\n }\n }\n\n // Handle IPv6\n if (hostPart.startsWith('[')) {\n const bracketEnd = hostPart.indexOf(']');\n if (bracketEnd !== -1) {\n this.#hostname = hostPart.substring(0, bracketEnd + 1);\n if (hostPart.length > bracketEnd + 1 && hostPart[bracketEnd + 1] === ':') {\n this.#port = hostPart.substring(bracketEnd + 2);\n }\n }\n } else {\n const colonIdx = hostPart.lastIndexOf(':');\n if (colonIdx !== -1) {\n this.#hostname = hostPart.substring(0, colonIdx);\n this.#port = hostPart.substring(colonIdx + 1);\n } else {\n this.#hostname = hostPart;\n }\n }\n }\n\n // Parse path, query, fragment\n let hashIdx = rest.indexOf('#');\n if (hashIdx !== -1) {\n this.#hash = rest.substring(hashIdx);\n rest = rest.substring(0, hashIdx);\n }\n\n let queryIdx = rest.indexOf('?');\n if (queryIdx !== -1) {\n this.#search = rest.substring(queryIdx);\n rest = rest.substring(0, queryIdx);\n }\n\n this.#pathname = rest || '/';\n if (!this.#pathname.startsWith('/') && this.#hostname) {\n this.#pathname = '/' + this.#pathname;\n }\n }\n\n get protocol() { return this.#protocol; }\n set protocol(value) { this.#protocol = String(value).toLowerCase() + (String(value).endsWith(':') ? '' : ':'); }\n\n get username() { return this.#username; }\n set username(value) { this.#username = String(value); }\n\n get password() { return this.#password; }\n set password(value) { this.#password = String(value); }\n\n get hostname() { return this.#hostname; }\n set hostname(value) { this.#hostname = String(value); }\n\n get port() { return this.#port; }\n set port(value) { this.#port = String(value); }\n\n get pathname() { return this.#pathname; }\n set pathname(value) { this.#pathname = String(value); }\n\n get search() { return this.#search; }\n set search(value) {\n const str = String(value);\n this.#search = str.startsWith('?') ? str : (str ? '?' + str : '');\n if (this.#searchParams) {\n this.#searchParams._updateFromSearch(this.#search);\n }\n }\n\n _updateSearchFromParams(search) {\n this.#search = search ? '?' + search : '';\n }\n\n get hash() { return this.#hash; }\n set hash(value) {\n const str = String(value);\n this.#hash = str.startsWith('#') ? str : (str ? '#' + str : '');\n }\n\n get host() {\n return this.#port ? this.#hostname + ':' + this.#port : this.#hostname;\n }\n set host(value) {\n const str = String(value);\n const colonIdx = str.lastIndexOf(':');\n if (colonIdx !== -1 && !str.includes('[')) {\n this.#hostname = str.substring(0, colonIdx);\n this.#port = str.substring(colonIdx + 1);\n } else {\n this.#hostname = str;\n this.#port = '';\n }\n }\n\n get origin() {\n if (this.#protocol === 'blob:') {\n try {\n return new URL(this.#pathname).origin;\n } catch {\n return 'null';\n }\n }\n return this.#protocol + '//' + this.host;\n }\n\n get href() {\n let result = this.#protocol;\n if (this.#hostname) {\n result += '//';\n if (this.#username) {\n result += encodeURIComponent(this.#username);\n if (this.#password) {\n result += ':' + encodeURIComponent(this.#password);\n }\n result += '@';\n }\n result += this.host;\n }\n result += this.#pathname + this.#search + this.#hash;\n return result;\n }\n set href(value) {\n const newUrl = new URL(String(value));\n this.#protocol = newUrl.protocol;\n this.#username = newUrl.username;\n this.#password = newUrl.password;\n this.#hostname = newUrl.hostname;\n this.#port = newUrl.port;\n this.#pathname = newUrl.pathname;\n this.#search = newUrl.search;\n this.#hash = newUrl.hash;\n this.#searchParams = null;\n }\n\n get searchParams() {\n if (!this.#searchParams) {\n this.#searchParams = new URLSearchParams(this.#search, this);\n }\n return this.#searchParams;\n }\n\n toString() { return this.href; }\n toJSON() { return this.href; }\n\n static canParse(url, base) {\n try {\n new URL(url, base);\n return true;\n } catch {\n return false;\n }\n }\n }\n\n globalThis.URL = URL;\n globalThis.URLSearchParams = URLSearchParams;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// Blob / File Implementation\n// ============================================================================\n\ninterface BlobState {\n parts: Uint8Array[];\n type: string;\n size: number;\n}\n\ninterface FileState extends BlobState {\n name: string;\n lastModified: number;\n}\n\nasync function injectBlob(\n context: ivm.Context,\n stateMap: Map<number, unknown>\n): Promise<void> {\n // Helper function to convert parts to bytes\n const partsToBytes = (parts: unknown[]): Uint8Array[] => {\n return parts.map((part) => {\n if (typeof part === \"string\") {\n return new TextEncoder().encode(part);\n }\n if (part instanceof Uint8Array) {\n return part;\n }\n if (part instanceof ArrayBuffer) {\n return new Uint8Array(part);\n }\n if (ArrayBuffer.isView(part)) {\n return new Uint8Array(part.buffer, part.byteOffset, part.byteLength);\n }\n // For blob parts, we'd need to get their bytes - handled in isolate\n return new TextEncoder().encode(String(part));\n });\n };\n\n // Register helper callbacks\n const global = context.global;\n\n // Blob constructor\n global.setSync(\n \"__Blob_construct\",\n new ivm.Callback((parts: unknown[], options?: { type?: string }) => {\n const instanceId = nextInstanceId++;\n const bytes = partsToBytes(parts || []);\n const size = bytes.reduce((acc, b) => acc + b.length, 0);\n const state: BlobState = {\n parts: bytes,\n type: options?.type?.toLowerCase() || \"\",\n size,\n };\n stateMap.set(instanceId, state);\n return instanceId;\n })\n );\n\n global.setSync(\n \"__Blob_get_size\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n return state?.size ?? 0;\n })\n );\n\n global.setSync(\n \"__Blob_get_type\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n return state?.type ?? \"\";\n })\n );\n\n global.setSync(\n \"__Blob_text\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return \"\";\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new TextDecoder().decode(combined);\n })\n );\n\n global.setSync(\n \"__Blob_arrayBuffer\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return new ivm.ExternalCopy(new ArrayBuffer(0)).copyInto();\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new ivm.ExternalCopy(combined.buffer).copyInto();\n })\n );\n\n global.setSync(\n \"__Blob_bytes\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return new ivm.ExternalCopy(new Uint8Array(0)).copyInto();\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new ivm.ExternalCopy(combined).copyInto();\n })\n );\n\n global.setSync(\n \"__Blob_slice\",\n new ivm.Callback(\n (\n instanceId: number,\n start?: number,\n end?: number,\n contentType?: string\n ) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) {\n const newId = nextInstanceId++;\n stateMap.set(newId, { parts: [], type: \"\", size: 0 });\n return newId;\n }\n\n // Combine all parts\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n\n // Handle negative indices\n let s = start ?? 0;\n let e = end ?? state.size;\n if (s < 0) s = Math.max(0, state.size + s);\n if (e < 0) e = Math.max(0, state.size + e);\n s = Math.min(s, state.size);\n e = Math.min(e, state.size);\n\n const sliced = combined.slice(s, e);\n const newId = nextInstanceId++;\n const newState: BlobState = {\n parts: [sliced],\n type: contentType ?? state.type,\n size: sliced.length,\n };\n stateMap.set(newId, newState);\n return newId;\n }\n )\n );\n\n // File constructor (extends Blob)\n global.setSync(\n \"__File_construct\",\n new ivm.Callback(\n (\n parts: unknown[],\n name: string,\n options?: { type?: string; lastModified?: number }\n ) => {\n const instanceId = nextInstanceId++;\n const bytes = partsToBytes(parts || []);\n const size = bytes.reduce((acc, b) => acc + b.length, 0);\n const state: FileState = {\n parts: bytes,\n type: options?.type?.toLowerCase() || \"\",\n size,\n name: String(name),\n lastModified: options?.lastModified ?? Date.now(),\n };\n stateMap.set(instanceId, state);\n return instanceId;\n }\n )\n );\n\n global.setSync(\n \"__File_get_name\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as FileState;\n return state?.name ?? \"\";\n })\n );\n\n global.setSync(\n \"__File_get_lastModified\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as FileState;\n return state?.lastModified ?? 0;\n })\n );\n\n // Inject Blob and File classes\n // Using a WeakMap inside the isolate to store instance IDs (avoids private field issues)\n const blobCode = `\n(function() {\n const _blobInstanceIds = new WeakMap();\n\n class Blob {\n constructor(parts = [], options = {}) {\n if (parts === null && options === null) {\n // Internal: creating from existing instance ID (set via _setInstanceId)\n return;\n }\n // Pre-process parts: extract bytes from Blob/File instances\n const processedParts = [];\n for (const part of (parts || [])) {\n if (part instanceof Blob) {\n // Get bytes synchronously via host callback\n processedParts.push(__Blob_bytes(part._getInstanceId()));\n } else {\n processedParts.push(part);\n }\n }\n const instanceId = __Blob_construct(processedParts, options);\n _blobInstanceIds.set(this, instanceId);\n }\n\n static _createFromInstanceId(instanceId) {\n const blob = new Blob(null, null);\n _blobInstanceIds.set(blob, instanceId);\n return blob;\n }\n\n _getInstanceId() {\n return _blobInstanceIds.get(this);\n }\n\n get size() {\n return __Blob_get_size(this._getInstanceId());\n }\n\n get type() {\n return __Blob_get_type(this._getInstanceId());\n }\n\n async text() {\n return await __Blob_text(this._getInstanceId());\n }\n\n async arrayBuffer() {\n return await __Blob_arrayBuffer(this._getInstanceId());\n }\n\n async bytes() {\n return await __Blob_bytes(this._getInstanceId());\n }\n\n slice(start, end, contentType) {\n const newInstanceId = __Blob_slice(this._getInstanceId(), start, end, contentType);\n return Blob._createFromInstanceId(newInstanceId);\n }\n\n stream() {\n const blob = this;\n return new ReadableStream({\n async start(controller) {\n const buffer = await blob.arrayBuffer();\n controller.enqueue(new Uint8Array(buffer));\n controller.close();\n }\n });\n }\n }\n\n class File extends Blob {\n constructor(parts, name, options = {}) {\n // Create file through host callback\n super(null, null);\n // Pre-process parts: extract bytes from Blob/File instances\n const processedParts = [];\n for (const part of (parts || [])) {\n if (part instanceof Blob) {\n processedParts.push(__Blob_bytes(part._getInstanceId()));\n } else {\n processedParts.push(part);\n }\n }\n const instanceId = __File_construct(processedParts, name, options);\n _blobInstanceIds.set(this, instanceId);\n }\n\n get name() {\n return __File_get_name(this._getInstanceId());\n }\n\n get lastModified() {\n return __File_get_lastModified(this._getInstanceId());\n }\n\n get webkitRelativePath() {\n return \"\";\n }\n\n slice(start, end, contentType) {\n const newInstanceId = __Blob_slice(this._getInstanceId(), start, end, contentType);\n return Blob._createFromInstanceId(newInstanceId);\n }\n }\n\n globalThis.Blob = Blob;\n globalThis.File = File;\n})();\n`;\n\n context.evalSync(blobCode);\n}\n\n// ============================================================================\n// DOMException Implementation\n// ============================================================================\n\nasync function injectDOMException(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n class DOMException extends Error {\n #code;\n\n static INDEX_SIZE_ERR = 1;\n static DOMSTRING_SIZE_ERR = 2;\n static HIERARCHY_REQUEST_ERR = 3;\n static WRONG_DOCUMENT_ERR = 4;\n static INVALID_CHARACTER_ERR = 5;\n static NO_DATA_ALLOWED_ERR = 6;\n static NO_MODIFICATION_ALLOWED_ERR = 7;\n static NOT_FOUND_ERR = 8;\n static NOT_SUPPORTED_ERR = 9;\n static INUSE_ATTRIBUTE_ERR = 10;\n static INVALID_STATE_ERR = 11;\n static SYNTAX_ERR = 12;\n static INVALID_MODIFICATION_ERR = 13;\n static NAMESPACE_ERR = 14;\n static INVALID_ACCESS_ERR = 15;\n static VALIDATION_ERR = 16;\n static TYPE_MISMATCH_ERR = 17;\n static SECURITY_ERR = 18;\n static NETWORK_ERR = 19;\n static ABORT_ERR = 20;\n static URL_MISMATCH_ERR = 21;\n static QUOTA_EXCEEDED_ERR = 22;\n static TIMEOUT_ERR = 23;\n static INVALID_NODE_TYPE_ERR = 24;\n static DATA_CLONE_ERR = 25;\n\n constructor(message = '', name = 'Error') {\n super(message);\n this.name = name;\n this.#code = this.#getCode(name);\n }\n\n get code() {\n return this.#code;\n }\n\n #getCode(name) {\n const codes = {\n 'IndexSizeError': 1,\n 'HierarchyRequestError': 3,\n 'WrongDocumentError': 4,\n 'InvalidCharacterError': 5,\n 'NoModificationAllowedError': 7,\n 'NotFoundError': 8,\n 'NotSupportedError': 9,\n 'InUseAttributeError': 10,\n 'InvalidStateError': 11,\n 'SyntaxError': 12,\n 'InvalidModificationError': 13,\n 'NamespaceError': 14,\n 'InvalidAccessError': 15,\n 'TypeMismatchError': 17,\n 'SecurityError': 18,\n 'NetworkError': 19,\n 'AbortError': 20,\n 'URLMismatchError': 21,\n 'QuotaExceededError': 22,\n 'TimeoutError': 23,\n 'InvalidNodeTypeError': 24,\n 'DataCloneError': 25,\n };\n return codes[name] ?? 0;\n }\n }\n\n globalThis.DOMException = DOMException;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// AbortController / AbortSignal Implementation\n// ============================================================================\n\nasync function injectAbortController(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n // Use WeakMap for private state (similar to Blob pattern)\n const _abortSignalState = new WeakMap();\n\n class AbortSignal {\n constructor() {\n // AbortSignal should not be constructed directly\n // Only AbortController can create it\n _abortSignalState.set(this, { aborted: false, reason: undefined, listeners: [], onabortHandler: null });\n }\n\n get aborted() {\n return _abortSignalState.get(this)?.aborted ?? false;\n }\n\n get reason() {\n return _abortSignalState.get(this)?.reason;\n }\n\n get onabort() {\n return _abortSignalState.get(this)?.onabortHandler ?? null;\n }\n\n set onabort(handler) {\n const state = _abortSignalState.get(this);\n if (!state) return;\n\n // Remove previous handler if it was a listener\n if (state.onabortHandler) {\n this.removeEventListener('abort', state.onabortHandler);\n }\n\n state.onabortHandler = typeof handler === 'function' ? handler : null;\n\n // Add new handler as listener\n if (state.onabortHandler) {\n this.addEventListener('abort', state.onabortHandler);\n }\n }\n\n throwIfAborted() {\n const state = _abortSignalState.get(this);\n if (state?.aborted) {\n throw state.reason;\n }\n }\n\n addEventListener(type, listener) {\n if (type !== 'abort') return;\n const state = _abortSignalState.get(this);\n if (state) {\n state.listeners.push(listener);\n }\n }\n\n removeEventListener(type, listener) {\n if (type !== 'abort') return;\n const state = _abortSignalState.get(this);\n if (state) {\n const idx = state.listeners.indexOf(listener);\n if (idx !== -1) state.listeners.splice(idx, 1);\n }\n }\n\n _abort(reason) {\n const state = _abortSignalState.get(this);\n if (!state || state.aborted) return;\n state.aborted = true;\n state.reason = reason !== undefined ? reason : new DOMException('The operation was aborted.', 'AbortError');\n const event = { type: 'abort', target: this };\n for (const listener of state.listeners) {\n try {\n listener(event);\n } catch (e) {\n // Ignore listener errors\n }\n }\n }\n\n static abort(reason) {\n const controller = new AbortController();\n controller.abort(reason);\n return controller.signal;\n }\n\n static timeout(milliseconds) {\n const controller = new AbortController();\n setTimeout(() => {\n controller.abort(new DOMException('The operation timed out.', 'TimeoutError'));\n }, milliseconds);\n return controller.signal;\n }\n\n static any(signals) {\n if (!Array.isArray(signals)) {\n throw new TypeError('signals must be an iterable');\n }\n\n // If any signal is already aborted, return an aborted signal with that reason\n for (const signal of signals) {\n if (signal.aborted) {\n return AbortSignal.abort(signal.reason);\n }\n }\n\n // Create a new controller that will abort when any input signal aborts\n const controller = new AbortController();\n\n for (const signal of signals) {\n signal.addEventListener('abort', () => {\n if (!controller.signal.aborted) {\n controller.abort(signal.reason);\n }\n });\n }\n\n return controller.signal;\n }\n }\n\n class AbortController {\n #signal = null;\n\n constructor() {\n this.#signal = new AbortSignal();\n }\n\n get signal() {\n return this.#signal;\n }\n\n abort(reason) {\n this.#signal._abort(reason);\n }\n }\n\n globalThis.AbortController = AbortController;\n globalThis.AbortSignal = AbortSignal;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// structuredClone Implementation\n// ============================================================================\n\nasync function injectStructuredClone(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n globalThis.structuredClone = function structuredClone(value, options) {\n const transfer = options?.transfer;\n const transferSet = transfer ? new Set(transfer) : null;\n const seen = new Map();\n\n function clone(val) {\n // Primitives\n if (val === null || val === undefined) return val;\n const type = typeof val;\n if (type === 'string' || type === 'number' || type === 'boolean' || type === 'bigint') {\n return val;\n }\n\n // Non-cloneable types\n if (type === 'function') {\n throw new DOMException('Function cannot be cloned.', 'DataCloneError');\n }\n if (type === 'symbol') {\n throw new DOMException('Symbol cannot be cloned.', 'DataCloneError');\n }\n\n // Circular reference check\n if (seen.has(val)) {\n return seen.get(val);\n }\n\n // Date\n if (val instanceof Date) {\n const cloned = new Date(val.getTime());\n seen.set(val, cloned);\n return cloned;\n }\n\n // RegExp\n if (val instanceof RegExp) {\n const cloned = new RegExp(val.source, val.flags);\n seen.set(val, cloned);\n return cloned;\n }\n\n // Error types\n if (val instanceof Error) {\n const ErrorCtor = globalThis[val.name] || Error;\n const cloned = new ErrorCtor(val.message);\n seen.set(val, cloned);\n cloned.stack = val.stack;\n if (val.cause !== undefined) cloned.cause = clone(val.cause);\n return cloned;\n }\n\n // ArrayBuffer\n if (val instanceof ArrayBuffer) {\n const cloned = val.slice(0);\n seen.set(val, cloned);\n return cloned;\n }\n\n // TypedArrays\n if (ArrayBuffer.isView(val) && !(val instanceof DataView)) {\n const TypedArrayCtor = val.constructor;\n const bufferClone = clone(val.buffer);\n const cloned = new TypedArrayCtor(bufferClone, val.byteOffset, val.length);\n seen.set(val, cloned);\n return cloned;\n }\n\n // DataView\n if (val instanceof DataView) {\n const bufferClone = clone(val.buffer);\n const cloned = new DataView(bufferClone, val.byteOffset, val.byteLength);\n seen.set(val, cloned);\n return cloned;\n }\n\n // Map\n if (val instanceof Map) {\n const cloned = new Map();\n seen.set(val, cloned);\n for (const [k, v] of val) cloned.set(clone(k), clone(v));\n return cloned;\n }\n\n // Set\n if (val instanceof Set) {\n const cloned = new Set();\n seen.set(val, cloned);\n for (const v of val) cloned.add(clone(v));\n return cloned;\n }\n\n // Array\n if (Array.isArray(val)) {\n const cloned = new Array(val.length);\n seen.set(val, cloned);\n for (let i = 0; i < val.length; i++) {\n if (i in val) cloned[i] = clone(val[i]);\n }\n return cloned;\n }\n\n // WeakMap/WeakSet - not cloneable\n if (val instanceof WeakMap) {\n throw new DOMException('WeakMap cannot be cloned.', 'DataCloneError');\n }\n if (val instanceof WeakSet) {\n throw new DOMException('WeakSet cannot be cloned.', 'DataCloneError');\n }\n\n // Plain objects\n const cloned = {};\n seen.set(val, cloned);\n for (const key of Object.keys(val)) {\n cloned[key] = clone(val[key]);\n }\n return cloned;\n }\n\n return clone(value);\n };\n})();\n`;\n context.evalSync(code);\n}\n\n// ============================================================================\n// Streams Implementation\n// ============================================================================\n\nasync function injectStreams(\n context: ivm.Context,\n _stateMap: Map<number, unknown>\n): Promise<void> {\n // WHATWG Streams implementation\n const streamsCode = `\n(function() {\n // Simple queue implementation\n class SimpleQueue {\n #items = [];\n\n enqueue(item) {\n this.#items.push(item);\n }\n\n dequeue() {\n return this.#items.shift();\n }\n\n peek() {\n return this.#items[0];\n }\n\n get length() {\n return this.#items.length;\n }\n\n isEmpty() {\n return this.#items.length === 0;\n }\n }\n\n // ReadableStream\n class ReadableStream {\n #state = 'readable';\n #reader = null;\n #storedError = undefined;\n #controller = null;\n #underlyingSource = null;\n\n constructor(underlyingSource = {}, strategy = {}) {\n this.#underlyingSource = underlyingSource;\n\n const controller = {\n stream: this,\n queue: new SimpleQueue(),\n started: false,\n closeRequested: false,\n pullAgain: false,\n pulling: false,\n\n close: () => {\n if (this.#state !== 'readable') return;\n controller.closeRequested = true;\n if (controller.queue.isEmpty()) {\n this.#state = 'closed';\n if (this.#reader) {\n // Resolve any pending read with done: true\n if (this.#reader._pendingRead) {\n const { resolve } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n resolve({ value: undefined, done: true });\n }\n this.#reader._resolveClose?.();\n }\n }\n },\n\n enqueue: (chunk) => {\n if (this.#state !== 'readable') return;\n controller.queue.enqueue(chunk);\n if (this.#reader && this.#reader._pendingRead) {\n const { resolve } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n const chunk = controller.queue.dequeue();\n resolve({ value: chunk, done: false });\n if (controller.closeRequested && controller.queue.isEmpty()) {\n this.#state = 'closed';\n this.#reader._resolveClose?.();\n }\n }\n },\n\n error: (e) => {\n if (this.#state !== 'readable') return;\n this.#state = 'errored';\n this.#storedError = e;\n if (this.#reader && this.#reader._pendingRead) {\n const { reject } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n reject(e);\n }\n },\n\n desiredSize: strategy.highWaterMark ?? 1\n };\n\n this.#controller = controller;\n\n // Start the underlying source\n if (underlyingSource.start) {\n const startPromise = Promise.resolve(underlyingSource.start(controller));\n startPromise.then(() => {\n controller.started = true;\n // If pulls were queued while starting, process them now\n if (controller.pullAgain) {\n controller.pullAgain = false;\n this._pull();\n }\n }).catch((e) => {\n controller.error(e);\n });\n } else {\n // No start callback - mark as started immediately\n controller.started = true;\n }\n }\n\n get locked() {\n return this.#reader !== null;\n }\n\n cancel(reason) {\n if (this.#reader) {\n return Promise.reject(new TypeError('Cannot cancel a stream that has a reader'));\n }\n return this._cancelInternal(reason);\n }\n\n // Internal cancel method - used by reader.cancel() which is allowed even when locked\n _cancelInternal(reason) {\n this.#state = 'closed';\n // Resolve any pending reads with done: true\n if (this.#reader) {\n if (this.#reader._pendingRead) {\n this.#reader._pendingRead.resolve({ value: undefined, done: true });\n this.#reader._pendingRead = null;\n }\n // Resolve the reader's closed promise\n this.#reader._resolveClose?.();\n }\n return Promise.resolve(this.#underlyingSource?.cancel?.(reason));\n }\n\n getReader(options = {}) {\n if (this.#reader) {\n throw new TypeError('ReadableStream is already locked');\n }\n const reader = new ReadableStreamDefaultReader(this);\n this.#reader = reader;\n return reader;\n }\n\n pipeThrough(transform, options = {}) {\n const readable = transform.readable;\n const writable = transform.writable;\n this.pipeTo(writable, options);\n return readable;\n }\n\n async pipeTo(destination, options = {}) {\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n await writer.close();\n } catch (e) {\n await writer.abort(e);\n throw e;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n }\n\n tee() {\n const reader = this.getReader();\n let reading = false;\n let canceled1 = false;\n let canceled2 = false;\n let reason1;\n let reason2;\n\n const pullAlgorithm = async () => {\n if (reading) return;\n reading = true;\n\n try {\n const { value, done } = await reader.read();\n reading = false;\n\n if (done) {\n if (!canceled1) branch1Controller.close();\n if (!canceled2) branch2Controller.close();\n return;\n }\n\n // Enqueue directly to controllers (not to unused queues)\n if (!canceled1) branch1Controller.enqueue(value);\n if (!canceled2) branch2Controller.enqueue(value);\n } catch (e) {\n if (!canceled1) branch1Controller.error(e);\n if (!canceled2) branch2Controller.error(e);\n }\n };\n\n let branch1Controller;\n let branch2Controller;\n\n const branch1 = new ReadableStream({\n start(controller) {\n branch1Controller = controller;\n },\n pull(controller) {\n return pullAlgorithm();\n },\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) {\n reader.cancel([reason1, reason2]);\n }\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) {\n branch2Controller = controller;\n },\n pull(controller) {\n return pullAlgorithm();\n },\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) {\n reader.cancel([reason1, reason2]);\n }\n }\n });\n\n return [branch1, branch2];\n }\n\n async *[Symbol.asyncIterator]() {\n const reader = this.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Internal methods for reader access\n _getController() {\n return this.#controller;\n }\n\n _getState() {\n return this.#state;\n }\n\n _setState(state) {\n this.#state = state;\n }\n\n _getStoredError() {\n return this.#storedError;\n }\n\n _setReader(reader) {\n this.#reader = reader;\n }\n\n _pull() {\n const controller = this.#controller;\n // If not started yet, queue the pull request to run when started\n if (!controller.started) {\n controller.pullAgain = true;\n return;\n }\n if (controller.pulling) return;\n controller.pulling = true;\n\n Promise.resolve(this.#underlyingSource?.pull?.(controller))\n .then(() => {\n controller.pulling = false;\n if (controller.pullAgain) {\n controller.pullAgain = false;\n this._pull();\n }\n })\n .catch((e) => {\n controller.error(e);\n });\n }\n\n static from(asyncIterable) {\n const iterator = asyncIterable[Symbol.asyncIterator]?.() ?? asyncIterable[Symbol.iterator]?.();\n\n return new ReadableStream({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n cancel(reason) {\n iterator.return?.(reason);\n }\n });\n }\n }\n\n // ReadableStreamDefaultReader\n class ReadableStreamDefaultReader {\n #stream = null;\n _pendingRead = null;\n _resolveClose = null;\n _rejectClose = null;\n #closed = null;\n\n constructor(stream) {\n if (stream.locked) {\n throw new TypeError('ReadableStream is already locked');\n }\n this.#stream = stream;\n stream._setReader(this);\n\n this.#closed = new Promise((resolve, reject) => {\n this._resolveClose = resolve;\n this._rejectClose = reject;\n });\n }\n\n get closed() {\n return this.#closed;\n }\n\n async read() {\n if (!this.#stream) {\n throw new TypeError('Reader has been released');\n }\n\n const controller = this.#stream._getController();\n const state = this.#stream._getState();\n\n if (state === 'closed') {\n return { value: undefined, done: true };\n }\n\n if (state === 'errored') {\n throw this.#stream._getStoredError();\n }\n\n if (!controller.queue.isEmpty()) {\n const chunk = controller.queue.dequeue();\n if (controller.closeRequested && controller.queue.isEmpty()) {\n this.#stream._setState('closed');\n this._resolveClose?.();\n }\n return { value: chunk, done: false };\n }\n\n // Queue is empty - check if stream was requested to close\n if (controller.closeRequested) {\n this.#stream._setState('closed');\n this._resolveClose?.();\n return { value: undefined, done: true };\n }\n\n // Need to wait for data\n return new Promise((resolve, reject) => {\n this._pendingRead = { resolve, reject };\n this.#stream._pull();\n });\n }\n\n cancel(reason) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Reader has been released'));\n }\n // Use internal cancel - reader is allowed to cancel even when stream is locked\n return this.#stream._cancelInternal(reason);\n }\n\n releaseLock() {\n if (!this.#stream) return;\n if (this._pendingRead) {\n this._pendingRead.reject(new TypeError('Reader was released'));\n this._pendingRead = null;\n }\n this.#stream._setReader(null);\n this.#stream = null;\n }\n }\n\n // WritableStream\n class WritableStream {\n #state = 'writable';\n #writer = null;\n #storedError = undefined;\n #controller = null;\n #underlyingSink = null;\n #writeQueue = [];\n #closePromise = null;\n\n constructor(underlyingSink = {}, strategy = {}) {\n this.#underlyingSink = underlyingSink;\n\n const controller = {\n stream: this,\n signal: new AbortController().signal,\n error: (e) => {\n if (this.#state !== 'writable') return;\n this.#state = 'errored';\n this.#storedError = e;\n }\n };\n\n this.#controller = controller;\n\n Promise.resolve(underlyingSink.start?.(controller))\n .catch((e) => {\n controller.error(e);\n });\n }\n\n get locked() {\n return this.#writer !== null;\n }\n\n abort(reason) {\n if (this.#writer) {\n return Promise.reject(new TypeError('Cannot abort a stream that has a writer'));\n }\n this.#state = 'errored';\n this.#storedError = reason;\n return Promise.resolve(this.#underlyingSink?.abort?.(reason));\n }\n\n close() {\n if (this.#writer) {\n return Promise.reject(new TypeError('Cannot close a stream that has a writer'));\n }\n return this._close();\n }\n\n _close() {\n if (this.#closePromise) return this.#closePromise;\n\n this.#closePromise = Promise.resolve(this.#underlyingSink?.close?.())\n .then(() => {\n this.#state = 'closed';\n });\n\n return this.#closePromise;\n }\n\n _abort(reason) {\n this.#state = 'errored';\n this.#storedError = reason;\n // Reject any pending write promises\n for (const pending of this.#writeQueue) {\n pending.reject?.(reason);\n }\n this.#writeQueue = [];\n return Promise.resolve(this.#underlyingSink?.abort?.(reason));\n }\n\n getWriter() {\n if (this.#writer) {\n throw new TypeError('WritableStream is already locked');\n }\n const writer = new WritableStreamDefaultWriter(this);\n this.#writer = writer;\n return writer;\n }\n\n // Internal methods\n _getState() {\n return this.#state;\n }\n\n _getStoredError() {\n return this.#storedError;\n }\n\n _setWriter(writer) {\n this.#writer = writer;\n }\n\n _write(chunk) {\n if (this.#state !== 'writable') {\n return Promise.reject(this.#storedError || new TypeError('Stream is not writable'));\n }\n\n let resolve, reject;\n const pendingPromise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n const pending = { resolve, reject };\n this.#writeQueue.push(pending);\n\n const cleanup = () => {\n const index = this.#writeQueue.indexOf(pending);\n if (index !== -1) {\n this.#writeQueue.splice(index, 1);\n }\n };\n\n Promise.resolve(this.#underlyingSink?.write?.(chunk, this.#controller))\n .then((result) => {\n cleanup();\n resolve(result);\n })\n .catch((e) => {\n cleanup();\n reject(e);\n });\n\n return pendingPromise;\n }\n }\n\n // WritableStreamDefaultWriter\n class WritableStreamDefaultWriter {\n #stream = null;\n #ready = null;\n #closed = null;\n #closedResolve = null;\n #closedReject = null;\n #closedSettled = false;\n\n constructor(stream) {\n if (stream.locked) {\n throw new TypeError('WritableStream is already locked');\n }\n this.#stream = stream;\n stream._setWriter(this);\n\n this.#ready = Promise.resolve();\n this.#closed = new Promise((resolve, reject) => {\n this.#closedResolve = resolve;\n this.#closedReject = reject;\n });\n }\n\n get closed() {\n return this.#closed;\n }\n\n get ready() {\n return this.#ready;\n }\n\n get desiredSize() {\n return 1;\n }\n\n abort(reason) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n // Mark closed as settled since abort will reject the closed promise\n this.#closedSettled = true;\n const abortPromise = this.#stream._abort(reason);\n // DON'T reject closed here - see if test passes without it\n return abortPromise;\n }\n\n close() {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n return this.#stream._close().then(() => {\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedResolve?.();\n }\n }).catch((e) => {\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedReject?.(e);\n }\n throw e;\n });\n }\n\n write(chunk) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n return this.#stream._write(chunk);\n }\n\n releaseLock() {\n if (!this.#stream) return;\n this.#stream._setWriter(null);\n this.#stream = null;\n // Only reject the closed promise if it hasn't been settled yet\n // (i.e., the stream wasn't closed or aborted before release)\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedReject?.(new TypeError('Writer was released'));\n }\n }\n }\n\n // TransformStream\n class TransformStream {\n #readable;\n #writable;\n\n constructor(transformer = {}, writableStrategy = {}, readableStrategy = {}) {\n let readableController;\n\n this.#readable = new ReadableStream({\n start(controller) {\n readableController = controller;\n }\n }, readableStrategy);\n\n const transformerController = {\n enqueue: (chunk) => {\n readableController.enqueue(chunk);\n },\n error: (e) => {\n readableController.error(e);\n },\n terminate: () => {\n readableController.close();\n },\n desiredSize: readableController?.desiredSize ?? 1\n };\n\n this.#writable = new WritableStream({\n start() {\n return transformer.start?.(transformerController);\n },\n write(chunk) {\n // If no transform function is provided, act as identity transform\n if (transformer.transform) {\n return transformer.transform(chunk, transformerController);\n } else {\n transformerController.enqueue(chunk);\n }\n },\n close() {\n const result = transformer.flush?.(transformerController);\n return Promise.resolve(result).then(() => {\n readableController.close();\n });\n },\n abort(reason) {\n readableController.error(reason);\n return Promise.resolve();\n }\n }, writableStrategy);\n }\n\n get readable() {\n return this.#readable;\n }\n\n get writable() {\n return this.#writable;\n }\n }\n\n // ByteLengthQueuingStrategy\n class ByteLengthQueuingStrategy {\n #highWaterMark;\n\n constructor({ highWaterMark }) {\n this.#highWaterMark = highWaterMark;\n }\n\n get highWaterMark() {\n return this.#highWaterMark;\n }\n\n get size() {\n return (chunk) => chunk.byteLength;\n }\n }\n\n // CountQueuingStrategy\n class CountQueuingStrategy {\n #highWaterMark;\n\n constructor({ highWaterMark }) {\n this.#highWaterMark = highWaterMark;\n }\n\n get highWaterMark() {\n return this.#highWaterMark;\n }\n\n get size() {\n return () => 1;\n }\n }\n\n globalThis.ReadableStream = ReadableStream;\n globalThis.ReadableStreamDefaultReader = ReadableStreamDefaultReader;\n globalThis.WritableStream = WritableStream;\n globalThis.WritableStreamDefaultWriter = WritableStreamDefaultWriter;\n globalThis.TransformStream = TransformStream;\n globalThis.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy;\n globalThis.CountQueuingStrategy = CountQueuingStrategy;\n})();\n`;\n\n context.evalSync(streamsCode);\n}\n"
5
+ "import ivm from \"@ricsam/isolated-vm\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\n\n// Types for isolated-vm context\nexport type { Isolate, Context, Reference } from \"@ricsam/isolated-vm\";\n\nconst runtimeRequire = createRequire(path.join(process.cwd(), \"package.json\"));\n\n// ============================================================================\n// Error Encoding Helpers (for cross-boundary error transfer)\n// ============================================================================\n\nconst KNOWN_ERROR_TYPES = [\n \"TypeError\",\n \"RangeError\",\n \"SyntaxError\",\n \"ReferenceError\",\n \"URIError\",\n \"EvalError\",\n] as const;\n\n/**\n * Get the error constructor name, falling back to \"Error\" for unknown types.\n */\nfunction getErrorConstructorName(errorType: string): string {\n return (KNOWN_ERROR_TYPES as readonly string[]).includes(errorType)\n ? errorType\n : \"Error\";\n}\n\n/**\n * Encode an error with its type prefix for transfer across isolate boundary.\n */\nfunction encodeErrorForTransfer(err: Error): Error {\n const errorType = getErrorConstructorName(err.name);\n return new Error(`[${errorType}]${err.message}`);\n}\n\n/**\n * Normalize unknown thrown values to Error instances for stable transfer.\n */\nfunction toError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n if (typeof err === \"string\") {\n return new Error(err);\n }\n try {\n return new Error(JSON.stringify(err));\n } catch {\n return new Error(String(err ?? \"Unknown error\"));\n }\n}\n\n/**\n * JavaScript code for the __decodeError helper (used in isolate).\n */\nconst DECODE_ERROR_JS = `\nfunction __decodeError(err) {\n if (!(err instanceof Error)) return err;\n const match = err.message.match(/^\\\\[(TypeError|RangeError|SyntaxError|ReferenceError|URIError|EvalError|Error)\\\\](.*)$/);\n if (match) {\n const ErrorType = globalThis[match[1]] || Error;\n return new ErrorType(match[2]);\n }\n return err;\n}\n`.trim();\n\n// ============================================================================\n// DOMParser Injection State\n// ============================================================================\n\nconst domParserInjectedContexts = new WeakSet<ivm.Context>();\nlet linkedomWorkerInjectionCode: string | null = null;\n\n// ============================================================================\n// Instance State Management\n// ============================================================================\n\n/**\n * Map to store host-side state for instances created in the isolate.\n * Key is the unique instance ID, value is the instance state.\n */\nconst instanceStateMap = new WeakMap<ivm.Context, Map<number, unknown>>();\nlet nextInstanceId = 1;\n\nfunction getInstanceStateMapForContext(\n context: ivm.Context\n): Map<number, unknown> {\n let map = instanceStateMap.get(context);\n if (!map) {\n map = new Map();\n instanceStateMap.set(context, map);\n }\n return map;\n}\n\n/**\n * Clear all instance state (for testing)\n */\nexport function clearAllInstanceState(): void {\n nextInstanceId = 1;\n}\n\n// ============================================================================\n// Unmarshaled Handle Tracking\n// ============================================================================\n\nconst unmarshaledHandles = new WeakMap<ivm.Context, Set<ivm.Reference>>();\n\nfunction trackUnmarshaledHandle(\n context: ivm.Context,\n ref: ivm.Reference\n): void {\n let set = unmarshaledHandles.get(context);\n if (!set) {\n set = new Set();\n unmarshaledHandles.set(context, set);\n }\n set.add(ref);\n}\n\n/**\n * Cleanup all handles created during unmarshalling for a context\n */\nexport function cleanupUnmarshaledHandles(context: ivm.Context): void {\n const set = unmarshaledHandles.get(context);\n if (set) {\n for (const ref of set) {\n try {\n ref.release();\n } catch {\n // Handle may already be released\n }\n }\n set.clear();\n }\n}\n\n// ============================================================================\n// Marshal / Unmarshal\n// ============================================================================\n\nexport interface MarshalOptions {\n maxDepth?: number;\n}\n\nexport interface UnmarshalOptions {\n maxDepth?: number;\n}\n\nconst DEFAULT_MAX_DEPTH = 100;\n\n/**\n * Marshal a JavaScript value to an isolated-vm Reference.\n * Converts host values into values that can be used inside the isolate.\n */\nexport function marshal(\n context: ivm.Context,\n value: unknown,\n options?: MarshalOptions\n): ivm.Reference {\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n const seen = new Set<object>();\n\n function marshalValue(val: unknown, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Max depth of ${maxDepth} exceeded during marshalling`);\n }\n\n // Handle primitives\n if (val === null || val === undefined) {\n return val;\n }\n\n const type = typeof val;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return val;\n }\n\n if (type === \"function\") {\n // Create a callback that can be called from the isolate\n return new ivm.Callback((...args: unknown[]) => {\n try {\n return (val as (...args: unknown[]) => unknown)(...args);\n } catch (err) {\n if (err instanceof Error) {\n throw err;\n }\n throw new Error(String(err));\n }\n });\n }\n\n if (type === \"object\") {\n const obj = val as object;\n\n // Check for circular reference\n if (seen.has(obj)) {\n throw new Error(\"Circular reference detected during marshalling\");\n }\n seen.add(obj);\n\n try {\n // Handle Uint8Array and other typed arrays\n if (ArrayBuffer.isView(obj)) {\n if (obj instanceof Uint8Array) {\n // Create a copy of the buffer to pass to the isolate\n return new ivm.ExternalCopy(obj).copyInto();\n }\n // Other typed arrays - convert to regular array for now\n return Array.from(new Uint8Array(obj.buffer, obj.byteOffset, obj.byteLength));\n }\n\n // Handle ArrayBuffer\n if (obj instanceof ArrayBuffer) {\n return new ivm.ExternalCopy(new Uint8Array(obj)).copyInto();\n }\n\n // Handle Date\n if (obj instanceof Date) {\n return obj.toISOString();\n }\n\n // Handle RegExp\n if (obj instanceof RegExp) {\n return {\n __type: \"RegExp\",\n source: obj.source,\n flags: obj.flags,\n };\n }\n\n // Handle Error\n if (obj instanceof Error) {\n return {\n __type: \"Error\",\n name: obj.name,\n message: obj.message,\n stack: obj.stack,\n };\n }\n\n // Handle Array\n if (Array.isArray(obj)) {\n const result: unknown[] = [];\n for (let i = 0; i < obj.length; i++) {\n result[i] = marshalValue(obj[i], depth + 1);\n }\n return result;\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = marshalValue(\n (obj as Record<string, unknown>)[key],\n depth + 1\n );\n }\n return result;\n } finally {\n seen.delete(obj);\n }\n }\n\n // Unsupported type\n return undefined;\n }\n\n const marshaled = marshalValue(value, 0);\n\n // If it's already a Reference or Callback, return it directly\n if (marshaled instanceof ivm.Reference || marshaled instanceof ivm.Callback) {\n return marshaled as ivm.Reference;\n }\n\n // Use ExternalCopy for efficient transfer of the marshaled value\n const copy = new ivm.ExternalCopy(marshaled);\n const result = copy.copyInto();\n copy.release();\n\n // Note: This returns the copied value, not a Reference\n // For full Reference semantics, use context.global.setSync then getSync with { reference: true }\n return result as unknown as ivm.Reference;\n}\n\n/**\n * Unmarshal an isolated-vm Reference or value to a JavaScript value.\n * Converts isolate values back to host values.\n */\nexport function unmarshal(\n context: ivm.Context,\n value: ivm.Reference | unknown,\n options?: UnmarshalOptions\n): unknown {\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n function unmarshalValue(val: unknown, depth: number): unknown {\n if (depth > maxDepth) {\n throw new Error(`Max depth of ${maxDepth} exceeded during unmarshalling`);\n }\n\n if (val === null || val === undefined) {\n return val;\n }\n\n const type = typeof val;\n if (type === \"string\" || type === \"number\" || type === \"boolean\") {\n return val;\n }\n\n if (val instanceof ivm.Reference) {\n // Copy the value out of the isolate\n try {\n const copied = val.copySync();\n trackUnmarshaledHandle(context, val);\n return unmarshalValue(copied, depth);\n } catch {\n // If copy fails, the reference might be to a function\n return val;\n }\n }\n\n if (type === \"object\") {\n const obj = val as Record<string, unknown>;\n\n // Handle special types\n if (obj.__type === \"Error\") {\n const ErrorConstructor = (globalThis as Record<string, unknown>)[\n obj.name as string\n ] as ErrorConstructor | undefined;\n const error = new (ErrorConstructor || Error)(obj.message as string);\n error.name = obj.name as string;\n if (obj.stack) {\n error.stack = obj.stack as string;\n }\n return error;\n }\n\n if (obj.__type === \"RegExp\") {\n return new RegExp(obj.source as string, obj.flags as string);\n }\n\n // Handle arrays\n if (Array.isArray(obj)) {\n return obj.map((item) => unmarshalValue(item, depth + 1));\n }\n\n // Handle plain objects\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(obj)) {\n result[key] = unmarshalValue(obj[key], depth + 1);\n }\n return result;\n }\n\n return val;\n }\n\n // Handle both Reference and direct values (from marshal's copyInto)\n if (value instanceof ivm.Reference) {\n try {\n const copied = value.copySync();\n return unmarshalValue(copied, 0);\n } catch {\n // Reference might be to a function or other non-copyable value\n return value;\n }\n }\n\n // Direct value (e.g., from marshal which returns copyInto result)\n return unmarshalValue(value, 0);\n}\n\n// ============================================================================\n// Scope Management\n// ============================================================================\n\n/**\n * Scope for managing reference lifecycle\n */\nexport interface Scope {\n /**\n * Track a reference for automatic cleanup when scope exits\n */\n manage<T extends ivm.Reference>(ref: T): T;\n\n /**\n * Marshal a value and track the resulting reference\n */\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference;\n}\n\n/**\n * Execute a synchronous callback with automatic reference cleanup.\n * All references tracked via scope.manage() will be released when the scope exits.\n */\nexport function withScope<T>(\n context: ivm.Context,\n callback: (scope: Scope) => T\n): T {\n const refs: ivm.Reference[] = [];\n\n const scope: Scope = {\n manage<R extends ivm.Reference>(ref: R): R {\n refs.push(ref);\n return ref;\n },\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference {\n const ref = marshal(context, value, options);\n refs.push(ref);\n return ref;\n },\n };\n\n try {\n return callback(scope);\n } finally {\n // Release in reverse order (LIFO)\n for (let i = refs.length - 1; i >= 0; i--) {\n try {\n refs[i]!.release();\n } catch {\n // Handle may already be released\n }\n }\n }\n}\n\n/**\n * Execute an async callback with automatic reference cleanup.\n * All references tracked via scope.manage() will be released when the scope exits.\n */\nexport async function withScopeAsync<T>(\n context: ivm.Context,\n callback: (scope: Scope) => Promise<T>\n): Promise<T> {\n const refs: ivm.Reference[] = [];\n\n const scope: Scope = {\n manage<R extends ivm.Reference>(ref: R): R {\n refs.push(ref);\n return ref;\n },\n marshal(value: unknown, options?: MarshalOptions): ivm.Reference {\n const ref = marshal(context, value, options);\n refs.push(ref);\n return ref;\n },\n };\n\n try {\n return await callback(scope);\n } finally {\n // Release in reverse order (LIFO)\n for (let i = refs.length - 1; i >= 0; i--) {\n try {\n refs[i]!.release();\n } catch {\n // Handle may already be released\n }\n }\n }\n}\n\n// ============================================================================\n// Function Builder\n// ============================================================================\n\n/**\n * Define a synchronous function that can be called from the isolate.\n * Arguments are automatically unmarshalled, return values are automatically marshalled.\n */\nexport function defineFunction(\n context: ivm.Context,\n name: string,\n fn: (...args: unknown[]) => unknown\n): ivm.Reference {\n const callback = new ivm.Callback(\n (...args: unknown[]) => {\n return fn(...args);\n },\n { sync: true }\n );\n\n // Set it on the global object in the context\n const global = context.global;\n global.setSync(name, callback);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n/**\n * Define an async function that can be called from the isolate.\n * Uses ivm.Reference.apply with promise transfer so isolate code can truly await\n * host work without blocking the isolate thread.\n */\nexport function defineAsyncFunction(\n context: ivm.Context,\n name: string,\n fn: (...args: unknown[]) => Promise<unknown>\n): ivm.Reference {\n const global = context.global;\n\n // Internal reference name to avoid conflicts with user code\n const refName = `__async_ref_${name}`;\n\n // Create a Reference to the async function (not a Callback)\n const asyncRef = new ivm.Reference(async (...args: unknown[]) => {\n return await fn(...args);\n });\n\n // Set the reference on global\n global.setSync(refName, asyncRef);\n\n // Inject an async wrapper that forwards through ivm.Reference.apply.\n const wrapperCode = `\n(function() {\n ${DECODE_ERROR_JS}\n\n globalThis.${name} = async function(...args) {\n try {\n return await ${refName}.apply(undefined, args, { result: { promise: true, copy: true } });\n } catch (err) {\n throw __decodeError(err);\n }\n };\n})();\n`;\n\n context.evalSync(wrapperCode);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n// ============================================================================\n// Class Builder\n// ============================================================================\n\nexport interface PropertyDescriptor<TState = unknown> {\n get?: (state: TState) => unknown;\n set?: (state: TState, value: unknown) => void;\n value?: unknown;\n writable?: boolean;\n enumerable?: boolean;\n configurable?: boolean;\n}\n\nexport interface ClassDefinition<TState extends object = object> {\n name: string;\n construct?: (args: unknown[]) => TState;\n methods?: Record<\n string,\n { fn: (state: TState, ...args: unknown[]) => unknown; async?: boolean }\n >;\n properties?: Record<string, PropertyDescriptor<TState>>;\n staticMethods?: Record<\n string,\n { fn: (...args: unknown[]) => unknown; async?: boolean }\n >;\n staticProperties?: Record<string, unknown>;\n extends?: string;\n}\n\n/**\n * Define a class that can be instantiated in the isolate.\n * Instance state is stored on the host side, accessed via unique IDs.\n */\nexport function defineClass<TState extends object = object>(\n context: ivm.Context,\n definition: ClassDefinition<TState>\n): ivm.Reference {\n const {\n name,\n construct,\n methods = {},\n properties = {},\n staticMethods = {},\n staticProperties = {},\n extends: parentClassName,\n } = definition;\n const stateMap = getInstanceStateMapForContext(context);\n\n // Build method callback/reference registrations.\n // Sync methods use Callback, async methods use Reference.\n const methodCallbacks: Record<string, ivm.Callback> = {};\n const methodReferences: Record<string, ivm.Reference<(instanceId: number, ...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [methodName, methodDef] of Object.entries(methods)) {\n if (methodDef.async) {\n // Async methods use Reference.apply with promise transfer.\n methodReferences[`__${name}_${methodName}_ref`] = new ivm.Reference(\n async (instanceId: number, ...args: unknown[]) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return await methodDef.fn(state, ...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n } else {\n // Sync methods use regular Callback\n methodCallbacks[`__${name}_${methodName}`] = new ivm.Callback(\n (instanceId: number, ...args: unknown[]) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return methodDef.fn(state, ...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Build property getter/setter callbacks\n const propertyCallbacks: Record<string, ivm.Callback> = {};\n for (const [propName, propDef] of Object.entries(properties)) {\n if (propDef.get) {\n const getter = propDef.get;\n propertyCallbacks[`__${name}_get_${propName}`] = new ivm.Callback(\n (instanceId: number) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n return getter(state);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n if (propDef.set) {\n const setter = propDef.set;\n propertyCallbacks[`__${name}_set_${propName}`] = new ivm.Callback(\n (instanceId: number, value: unknown) => {\n const state = stateMap.get(instanceId) as TState | undefined;\n if (!state) {\n throw new Error(`Instance ${instanceId} not found`);\n }\n try {\n setter(state, value);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Build static method callbacks/references.\n // Sync methods use Callback, async methods use Reference.\n const staticMethodCallbacks: Record<string, ivm.Callback> = {};\n const staticMethodReferences: Record<string, ivm.Reference<(...args: unknown[]) => Promise<unknown>>> = {};\n\n for (const [methodName, methodDef] of Object.entries(staticMethods)) {\n if (methodDef.async) {\n // Async static methods use Reference.apply with promise transfer.\n staticMethodReferences[`__${name}_static_${methodName}_ref`] = new ivm.Reference(\n async (...args: unknown[]) => {\n try {\n return await methodDef.fn(...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n } else {\n // Sync static methods use regular Callback\n staticMethodCallbacks[`__${name}_static_${methodName}`] = new ivm.Callback(\n (...args: unknown[]) => {\n try {\n return methodDef.fn(...args);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n }\n );\n }\n }\n\n // Constructor callback\n const constructorCallback = new ivm.Callback((...args: unknown[]) => {\n const instanceId = nextInstanceId++;\n if (construct) {\n try {\n const state = construct(args);\n stateMap.set(instanceId, state);\n } catch (err) {\n throw encodeErrorForTransfer(toError(err));\n }\n } else {\n stateMap.set(instanceId, {} as TState);\n }\n return instanceId;\n });\n\n // Register all callbacks and references on global\n const global = context.global;\n global.setSync(`__${name}_construct`, constructorCallback);\n\n for (const [callbackName, callback] of Object.entries(methodCallbacks)) {\n global.setSync(callbackName, callback);\n }\n for (const [refName, ref] of Object.entries(methodReferences)) {\n global.setSync(refName, ref);\n }\n for (const [callbackName, callback] of Object.entries(propertyCallbacks)) {\n global.setSync(callbackName, callback);\n }\n for (const [callbackName, callback] of Object.entries(\n staticMethodCallbacks\n )) {\n global.setSync(callbackName, callback);\n }\n for (const [refName, ref] of Object.entries(staticMethodReferences)) {\n global.setSync(refName, ref);\n }\n\n // Build the class definition JavaScript code\n const extendsClause = parentClassName\n ? ` extends globalThis.${parentClassName}`\n : \"\";\n\n let classCode = `\n(function() {\n // Helper to decode error type from message\n function __decodeError(err) {\n const match = err.message.match(/^\\\\[(TypeError|RangeError|SyntaxError|ReferenceError|URIError|EvalError|Error)\\\\](.*)$/);\n if (match) {\n const ErrorType = globalThis[match[1]] || Error;\n return new ErrorType(match[2]);\n }\n return err;\n }\n\n // Marker to indicate a class is being extended (skip parent state creation)\n const __EXTENDING_MARKER = Symbol.for('__defineClass_extending__');\n // WeakMap to store instance IDs (shared across inheritance chain)\n const _${name}_instanceIds = new WeakMap();\n\n class ${name}${extendsClause} {\n constructor(...args) {\n try {\n ${parentClassName ? \"super(__EXTENDING_MARKER);\" : \"\"}\n // Skip state creation if being extended (child will create state)\n if (args[0] === __EXTENDING_MARKER) {\n return;\n }\n const instanceId = __${name}_construct(...args);\n _${name}_instanceIds.set(this, instanceId);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n\n _getInstanceId() {\n return _${name}_instanceIds.get(this);\n }\n`;\n\n // Add methods\n for (const [methodName, methodDef] of Object.entries(methods)) {\n if (methodDef.async) {\n classCode += `\n async ${methodName}(...args) {\n try {\n return await __${name}_${methodName}_ref.apply(\n undefined,\n [this._getInstanceId(), ...args],\n { result: { promise: true, copy: true } }\n );\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n } else {\n classCode += `\n ${methodName}(...args) {\n try {\n return __${name}_${methodName}(this._getInstanceId(), ...args);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n }\n\n // Add properties\n for (const [propName, propDef] of Object.entries(properties)) {\n if (propDef.get || propDef.set) {\n if (propDef.get) {\n classCode += `\n get ${propName}() {\n try {\n return __${name}_get_${propName}(this._getInstanceId());\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n if (propDef.set) {\n classCode += `\n set ${propName}(value) {\n try {\n __${name}_set_${propName}(this._getInstanceId(), value);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n`;\n }\n }\n }\n\n classCode += `\n }\n`;\n\n // Add static methods\n for (const [methodName, methodDef] of Object.entries(staticMethods)) {\n if (methodDef.async) {\n classCode += `\n ${name}.${methodName} = async function(...args) {\n try {\n return await __${name}_static_${methodName}_ref.apply(\n undefined,\n args,\n { result: { promise: true, copy: true } }\n );\n } catch (err) {\n throw __decodeError(err);\n }\n };\n`;\n } else {\n classCode += `\n ${name}.${methodName} = function(...args) {\n try {\n return __${name}_static_${methodName}(...args);\n } catch (err) {\n throw __decodeError(err);\n }\n };\n`;\n }\n }\n\n // Add static properties\n for (const [propName, propValue] of Object.entries(staticProperties)) {\n classCode += `\n ${name}.${propName} = ${JSON.stringify(propValue)};\n`;\n }\n\n classCode += `\n globalThis.${name} = ${name};\n return ${name};\n})()\n`;\n\n // Evaluate the class and assign it directly to globalThis in the isolate\n context.evalSync(classCode);\n\n return global.getSync(name) as ivm.Reference;\n}\n\n// ============================================================================\n// SetupCore - Inject WHATWG APIs\n// ============================================================================\n\nexport interface SetupCoreOptions {\n /** Whether to inject TextEncoder/TextDecoder */\n textEncoding?: boolean;\n /** Whether to inject URL/URLSearchParams */\n url?: boolean;\n /** Whether to inject Blob/File */\n blob?: boolean;\n /** Whether to inject Streams */\n streams?: boolean;\n /** Whether to inject DOMParser and DOM constructors */\n domParser?: boolean;\n}\n\nexport interface CoreHandle {\n dispose(): void;\n}\n\n/**\n * Setup core APIs in an isolated-vm context.\n *\n * Injects the following globals:\n * - ReadableStream, WritableStream, TransformStream\n * - ReadableStreamDefaultReader, WritableStreamDefaultWriter\n * - Blob\n * - File\n * - DOMException\n * - DOMParser\n * - Node, Document, DocumentFragment, DocumentType, Element, Attr, Text, Comment\n * - Event, EventTarget, CustomEvent\n * - URL, URLSearchParams\n * - TextEncoder, TextDecoder\n */\nexport async function setupCore(\n context: ivm.Context,\n options?: SetupCoreOptions\n): Promise<CoreHandle> {\n const opts = {\n textEncoding: true,\n url: true,\n blob: true,\n streams: true,\n domParser: true,\n ...options,\n };\n\n const stateMap = getInstanceStateMapForContext(context);\n\n // Inject TextEncoder/TextDecoder\n if (opts.textEncoding) {\n await injectTextEncoding(context);\n }\n\n // Inject URL/URLSearchParams\n if (opts.url) {\n await injectURL(context);\n }\n\n // Inject DOMException (needed by AbortController and structuredClone)\n await injectDOMException(context);\n\n // Inject structuredClone\n await injectStructuredClone(context);\n\n // Inject AbortController/AbortSignal (needed by Streams)\n await injectAbortController(context);\n\n // Inject Blob/File\n if (opts.blob) {\n await injectBlob(context, stateMap);\n }\n\n // Inject Streams\n if (opts.streams) {\n await injectStreams(context, stateMap);\n }\n\n // Inject TextEncoderStream/TextDecoderStream (requires both textEncoding and streams)\n if (opts.textEncoding && opts.streams) {\n await injectTextEncodingStreams(context);\n }\n\n // Inject DOMParser and DOM constructors\n if (opts.domParser) {\n await injectDOMParser(context);\n }\n\n return {\n dispose() {\n cleanupUnmarshaledHandles(context);\n },\n };\n}\n\n// ============================================================================\n// DOMParser / DOM Constructors Implementation\n// ============================================================================\n\nfunction getLinkedomWorkerInjectionCode(): string {\n if (linkedomWorkerInjectionCode) {\n return linkedomWorkerInjectionCode;\n }\n\n const linkedomPackageJsonPath = runtimeRequire.resolve(\"linkedom/package.json\");\n const workerPath = path.join(path.dirname(linkedomPackageJsonPath), \"worker.js\");\n const workerSource = readFileSync(workerPath, \"utf8\");\n const exportBlockPattern = /export\\s*\\{[\\s\\S]*?\\};?\\s*$/;\n\n if (!exportBlockPattern.test(workerSource)) {\n throw new Error(\"Failed to locate linkedom worker exports\");\n }\n\n const workerWithoutExports = workerSource.replace(exportBlockPattern, \"\");\n linkedomWorkerInjectionCode = `\n(function() {\n${workerWithoutExports}\nglobalThis.__linkedomExports = {\n DOMParser,\n Node,\n Document,\n DocumentFragment,\n DocumentType,\n Element,\n Attr,\n Text,\n Comment,\n Event: GlobalEvent,\n EventTarget: DOMEventTarget,\n CustomEvent,\n};\n})();\n`.trim();\n\n return linkedomWorkerInjectionCode;\n}\n\nasync function injectDOMParser(context: ivm.Context): Promise<void> {\n if (domParserInjectedContexts.has(context)) {\n return;\n }\n\n context.evalSync(getLinkedomWorkerInjectionCode());\n\n const code = `\n(function() {\n const linkedom = globalThis.__linkedomExports;\n if (!linkedom) {\n throw new Error(\"DOMParser initialization failed: missing linkedom exports\");\n }\n\n const supportedMimeTypes = new Set([\n \"text/html\",\n \"text/xml\",\n \"application/xml\",\n \"application/xhtml+xml\",\n \"image/svg+xml\",\n ]);\n\n const OriginalDOMParser = linkedom.DOMParser;\n\n class DOMParser extends OriginalDOMParser {\n parseFromString(input, mimeType) {\n const normalizedMimeType = String(mimeType);\n if (!supportedMimeTypes.has(normalizedMimeType)) {\n throw new TypeError(\n \"Failed to execute 'parseFromString' on 'DOMParser': The provided value '\" +\n normalizedMimeType +\n \"' is not a valid enumeration value of type SupportedType.\"\n );\n }\n const document = super.parseFromString(input, normalizedMimeType);\n // Normalize adjacent text nodes to match browser parser behavior expected by some SDKs.\n if (\n normalizedMimeType !== \"text/html\" &&\n document &&\n typeof document.normalize === \"function\"\n ) {\n document.normalize();\n }\n return document;\n }\n }\n\n globalThis.DOMParser = DOMParser;\n globalThis.Node = linkedom.Node;\n globalThis.Document = linkedom.Document;\n globalThis.DocumentFragment = linkedom.DocumentFragment;\n globalThis.DocumentType = linkedom.DocumentType;\n globalThis.Element = linkedom.Element;\n globalThis.Attr = linkedom.Attr;\n globalThis.Text = linkedom.Text;\n globalThis.Comment = linkedom.Comment;\n globalThis.Event = linkedom.Event;\n globalThis.EventTarget = linkedom.EventTarget;\n globalThis.CustomEvent = linkedom.CustomEvent;\n\n delete globalThis.__linkedomExports;\n})();\n`;\n\n try {\n context.evalSync(code);\n domParserInjectedContexts.add(context);\n } catch (err) {\n try {\n context.evalSync(\"delete globalThis.__linkedomExports;\");\n } catch {\n // Ignore cleanup errors if context is already torn down.\n }\n throw err;\n }\n}\n\n// ============================================================================\n// TextEncoder / TextDecoder Implementation\n// ============================================================================\n\nasync function injectTextEncoding(context: ivm.Context): Promise<void> {\n // TextEncoder and TextDecoder are pure JS implementations\n const code = `\n(function() {\n class TextEncoder {\n constructor(encoding = 'utf-8') {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextEncoder only supports UTF-8 encoding');\n }\n }\n\n get encoding() { return 'utf-8'; }\n\n encode(input = '') {\n const str = String(input);\n const octets = [];\n for (let i = 0; i < str.length; i++) {\n let codePoint = str.codePointAt(i);\n if (codePoint > 0xFFFF) {\n i++; // Skip the next code unit for surrogate pairs\n }\n if (codePoint < 0x80) {\n octets.push(codePoint);\n } else if (codePoint < 0x800) {\n octets.push(0xC0 | (codePoint >> 6));\n octets.push(0x80 | (codePoint & 0x3F));\n } else if (codePoint < 0x10000) {\n octets.push(0xE0 | (codePoint >> 12));\n octets.push(0x80 | ((codePoint >> 6) & 0x3F));\n octets.push(0x80 | (codePoint & 0x3F));\n } else {\n octets.push(0xF0 | (codePoint >> 18));\n octets.push(0x80 | ((codePoint >> 12) & 0x3F));\n octets.push(0x80 | ((codePoint >> 6) & 0x3F));\n octets.push(0x80 | (codePoint & 0x3F));\n }\n }\n return new Uint8Array(octets);\n }\n\n encodeInto(source, destination) {\n const encoded = this.encode(source);\n const len = Math.min(encoded.length, destination.length);\n for (let i = 0; i < len; i++) {\n destination[i] = encoded[i];\n }\n return { read: source.length, written: len };\n }\n }\n\n class TextDecoder {\n #encoding;\n #fatal;\n #ignoreBOM;\n\n constructor(encoding = 'utf-8', options = {}) {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextDecoder only supports UTF-8 encoding');\n }\n this.#encoding = 'utf-8';\n this.#fatal = Boolean(options.fatal);\n this.#ignoreBOM = Boolean(options.ignoreBOM);\n }\n\n get encoding() { return this.#encoding; }\n get fatal() { return this.#fatal; }\n get ignoreBOM() { return this.#ignoreBOM; }\n\n decode(input, options = {}) {\n if (input === undefined) return '';\n\n let bytes;\n if (input instanceof ArrayBuffer) {\n bytes = new Uint8Array(input);\n } else if (ArrayBuffer.isView(input)) {\n bytes = new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n } else {\n throw new TypeError('Input must be ArrayBuffer or ArrayBufferView');\n }\n\n let result = '';\n let i = 0;\n\n // Skip BOM if present and not ignored\n if (!this.#ignoreBOM && bytes.length >= 3 &&\n bytes[0] === 0xEF && bytes[1] === 0xBB && bytes[2] === 0xBF) {\n i = 3;\n }\n\n while (i < bytes.length) {\n const byte1 = bytes[i++];\n\n if (byte1 < 0x80) {\n result += String.fromCodePoint(byte1);\n } else if ((byte1 & 0xE0) === 0xC0) {\n const byte2 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n result += String.fromCodePoint(((byte1 & 0x1F) << 6) | (byte2 & 0x3F));\n } else if ((byte1 & 0xF0) === 0xE0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n result += String.fromCodePoint(((byte1 & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F));\n } else if ((byte1 & 0xF8) === 0xF0) {\n const byte2 = bytes[i++];\n const byte3 = bytes[i++];\n const byte4 = bytes[i++];\n if ((byte2 & 0xC0) !== 0x80 || (byte3 & 0xC0) !== 0x80 || (byte4 & 0xC0) !== 0x80) {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n continue;\n }\n const codePoint = ((byte1 & 0x07) << 18) | ((byte2 & 0x3F) << 12) | ((byte3 & 0x3F) << 6) | (byte4 & 0x3F);\n result += String.fromCodePoint(codePoint);\n } else {\n if (this.#fatal) throw new TypeError('Invalid UTF-8');\n result += '\\\\uFFFD';\n }\n }\n\n return result;\n }\n }\n\n globalThis.TextEncoder = TextEncoder;\n globalThis.TextDecoder = TextDecoder;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// TextEncoderStream / TextDecoderStream Implementation\n// (Must be called AFTER streams are injected since they extend TransformStream)\n// ============================================================================\n\nasync function injectTextEncodingStreams(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n class TextEncoderStream extends TransformStream {\n constructor() {\n const encoder = new TextEncoder();\n let pendingHighSurrogate = null;\n\n super({\n transform(chunk, controller) {\n let text = String(chunk);\n\n // Handle pending high surrogate from previous chunk\n if (pendingHighSurrogate !== null) {\n text = pendingHighSurrogate + text;\n pendingHighSurrogate = null;\n }\n\n // Check if chunk ends with a high surrogate (incomplete pair)\n const lastChar = text.charCodeAt(text.length - 1);\n if (lastChar >= 0xD800 && lastChar <= 0xDBFF) {\n pendingHighSurrogate = text.slice(-1);\n text = text.slice(0, -1);\n }\n\n if (text.length > 0) {\n controller.enqueue(encoder.encode(text));\n }\n },\n flush(controller) {\n // If there's a pending high surrogate without a low surrogate, encode as replacement\n if (pendingHighSurrogate !== null) {\n controller.enqueue(encoder.encode('\\uFFFD'));\n }\n }\n });\n }\n\n get encoding() { return 'utf-8'; }\n }\n\n class TextDecoderStream extends TransformStream {\n #encoding = 'utf-8';\n #fatal;\n #ignoreBOM;\n\n constructor(encoding = 'utf-8', options = {}) {\n const normalizedEncoding = String(encoding).toLowerCase().trim();\n if (normalizedEncoding !== 'utf-8' && normalizedEncoding !== 'utf8') {\n throw new RangeError('TextDecoderStream only supports UTF-8 encoding');\n }\n\n const fatal = Boolean(options.fatal);\n const ignoreBOM = Boolean(options.ignoreBOM);\n const decoder = new TextDecoder(encoding, { fatal, ignoreBOM });\n let buffer = new Uint8Array(0);\n\n super({\n transform(chunk, controller) {\n // Combine with any leftover bytes from previous chunk\n let bytes;\n if (chunk instanceof ArrayBuffer) {\n bytes = new Uint8Array(chunk);\n } else if (ArrayBuffer.isView(chunk)) {\n bytes = new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n } else {\n throw new TypeError('Input must be ArrayBuffer or ArrayBufferView');\n }\n\n if (buffer.length > 0) {\n const combined = new Uint8Array(buffer.length + bytes.length);\n combined.set(buffer);\n combined.set(bytes, buffer.length);\n bytes = combined;\n buffer = new Uint8Array(0);\n }\n\n // Find the last complete UTF-8 sequence\n let validEnd = bytes.length;\n for (let i = bytes.length - 1; i >= Math.max(0, bytes.length - 4); i--) {\n const byte = bytes[i];\n if ((byte & 0xC0) !== 0x80) { // Start of a multi-byte sequence or ASCII\n const expectedLength = byte < 0x80 ? 1 :\n (byte & 0xE0) === 0xC0 ? 2 :\n (byte & 0xF0) === 0xE0 ? 3 :\n (byte & 0xF8) === 0xF0 ? 4 : 1;\n if (i + expectedLength > bytes.length) {\n validEnd = i;\n }\n break;\n }\n }\n\n // Save incomplete sequence for next chunk\n if (validEnd < bytes.length) {\n buffer = bytes.slice(validEnd);\n bytes = bytes.slice(0, validEnd);\n }\n\n if (bytes.length > 0) {\n const text = decoder.decode(bytes, { stream: true });\n if (text.length > 0) {\n controller.enqueue(text);\n }\n }\n },\n flush(controller) {\n // Decode any remaining bytes\n if (buffer.length > 0) {\n const text = decoder.decode(buffer);\n if (text.length > 0) {\n controller.enqueue(text);\n }\n }\n }\n });\n\n this.#fatal = fatal;\n this.#ignoreBOM = ignoreBOM;\n }\n\n get encoding() { return this.#encoding; }\n get fatal() { return this.#fatal; }\n get ignoreBOM() { return this.#ignoreBOM; }\n }\n\n globalThis.TextEncoderStream = TextEncoderStream;\n globalThis.TextDecoderStream = TextDecoderStream;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// URL / URLSearchParams Implementation\n// ============================================================================\n\nasync function injectURL(context: ivm.Context): Promise<void> {\n // URL and URLSearchParams implementation in pure JS\n const code = `\n(function() {\n // Helper for application/x-www-form-urlencoded encoding (spaces as +)\n function urlEncode(str) {\n return encodeURIComponent(String(str)).replace(/%20/g, '+');\n }\n\n class URLSearchParams {\n #params = [];\n #url = null;\n\n constructor(init = '', url = null) {\n this.#url = url;\n this._parseInit(init);\n }\n\n _parseInit(init) {\n this.#params = [];\n if (typeof init === 'string') {\n const query = init.startsWith('?') ? init.slice(1) : init;\n if (query) {\n for (const pair of query.split('&')) {\n const idx = pair.indexOf('=');\n if (idx === -1) {\n this.#params.push([decodeURIComponent(pair.replace(/\\\\+/g, ' ')), '']);\n } else {\n this.#params.push([\n decodeURIComponent(pair.slice(0, idx).replace(/\\\\+/g, ' ')),\n decodeURIComponent(pair.slice(idx + 1).replace(/\\\\+/g, ' '))\n ]);\n }\n }\n }\n } else if (Array.isArray(init)) {\n for (const pair of init) {\n if (Array.isArray(pair) && pair.length >= 2) {\n this.#params.push([String(pair[0]), String(pair[1])]);\n }\n }\n } else if (init instanceof URLSearchParams) {\n for (const [key, value] of init) {\n this.#params.push([String(key), String(value)]);\n }\n } else if (init && typeof init === 'object') {\n for (const [key, value] of Object.entries(init)) {\n this.#params.push([String(key), String(value)]);\n }\n }\n }\n\n _updateFromSearch(search) {\n this._parseInit(search);\n }\n\n #notifyUpdate() {\n if (this.#url) {\n this.#url._updateSearchFromParams(this.toString());\n }\n }\n\n get size() {\n return this.#params.length;\n }\n\n append(name, value) {\n this.#params.push([String(name), String(value)]);\n this.#notifyUpdate();\n }\n\n delete(name, value) {\n const nameStr = String(name);\n if (value === undefined) {\n this.#params = this.#params.filter(([k]) => k !== nameStr);\n } else {\n const valueStr = String(value);\n this.#params = this.#params.filter(([k, v]) => !(k === nameStr && v === valueStr));\n }\n this.#notifyUpdate();\n }\n\n get(name) {\n const nameStr = String(name);\n const pair = this.#params.find(([k]) => k === nameStr);\n return pair ? pair[1] : null;\n }\n\n getAll(name) {\n const nameStr = String(name);\n return this.#params.filter(([k]) => k === nameStr).map(([, v]) => v);\n }\n\n has(name, value) {\n const nameStr = String(name);\n if (value === undefined) {\n return this.#params.some(([k]) => k === nameStr);\n }\n const valueStr = String(value);\n return this.#params.some(([k, v]) => k === nameStr && v === valueStr);\n }\n\n set(name, value) {\n const nameStr = String(name);\n const valueStr = String(value);\n let found = false;\n this.#params = this.#params.filter(([k]) => {\n if (k === nameStr) {\n if (!found) {\n found = true;\n return true;\n }\n return false;\n }\n return true;\n });\n if (found) {\n const idx = this.#params.findIndex(([k]) => k === nameStr);\n if (idx !== -1) {\n this.#params[idx] = [nameStr, valueStr];\n }\n } else {\n this.#params.push([nameStr, valueStr]);\n }\n this.#notifyUpdate();\n }\n\n sort() {\n this.#params.sort((a, b) => a[0].localeCompare(b[0]));\n this.#notifyUpdate();\n }\n\n toString() {\n return this.#params\n .map(([k, v]) => urlEncode(k) + '=' + urlEncode(v))\n .join('&');\n }\n\n *entries() {\n for (const pair of this.#params) {\n yield [pair[0], pair[1]];\n }\n }\n\n *keys() {\n for (const [k] of this.#params) {\n yield k;\n }\n }\n\n *values() {\n for (const [, v] of this.#params) {\n yield v;\n }\n }\n\n forEach(callback, thisArg) {\n for (const [k, v] of this.#params) {\n callback.call(thisArg, v, k, this);\n }\n }\n\n [Symbol.iterator]() {\n return this.entries();\n }\n }\n\n class URL {\n #protocol = '';\n #username = '';\n #password = '';\n #hostname = '';\n #port = '';\n #pathname = '/';\n #search = '';\n #hash = '';\n #searchParams = null;\n\n constructor(url, base) {\n if (arguments.length === 0) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let urlStr = String(url);\n\n if (base !== undefined) {\n const baseUrl = new URL(String(base));\n if (urlStr.startsWith('//')) {\n urlStr = baseUrl.protocol + urlStr;\n } else if (urlStr.startsWith('/')) {\n urlStr = baseUrl.origin + urlStr;\n } else if (!urlStr.match(/^[a-zA-Z][a-zA-Z0-9+.-]*:/)) {\n const basePath = baseUrl.pathname.substring(0, baseUrl.pathname.lastIndexOf('/') + 1);\n urlStr = baseUrl.origin + basePath + urlStr;\n }\n }\n\n // Parse the URL\n const match = urlStr.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):(\\\\/\\\\/)?(.*)$/);\n if (!match) {\n throw new TypeError(\"Failed to construct 'URL': Invalid URL\");\n }\n\n this.#protocol = match[1].toLowerCase() + ':';\n let rest = match[3];\n\n if (match[2]) {\n // Has authority (//...)\n let authEnd = rest.indexOf('/');\n if (authEnd === -1) authEnd = rest.indexOf('?');\n if (authEnd === -1) authEnd = rest.indexOf('#');\n if (authEnd === -1) authEnd = rest.length;\n\n const authority = rest.substring(0, authEnd);\n rest = rest.substring(authEnd);\n\n // Parse authority: [userinfo@]host[:port]\n let hostPart = authority;\n const atIdx = authority.indexOf('@');\n if (atIdx !== -1) {\n const userinfo = authority.substring(0, atIdx);\n hostPart = authority.substring(atIdx + 1);\n const colonIdx = userinfo.indexOf(':');\n if (colonIdx !== -1) {\n this.#username = decodeURIComponent(userinfo.substring(0, colonIdx));\n this.#password = decodeURIComponent(userinfo.substring(colonIdx + 1));\n } else {\n this.#username = decodeURIComponent(userinfo);\n }\n }\n\n // Handle IPv6\n if (hostPart.startsWith('[')) {\n const bracketEnd = hostPart.indexOf(']');\n if (bracketEnd !== -1) {\n this.#hostname = hostPart.substring(0, bracketEnd + 1);\n if (hostPart.length > bracketEnd + 1 && hostPart[bracketEnd + 1] === ':') {\n this.#port = hostPart.substring(bracketEnd + 2);\n }\n }\n } else {\n const colonIdx = hostPart.lastIndexOf(':');\n if (colonIdx !== -1) {\n this.#hostname = hostPart.substring(0, colonIdx);\n this.#port = hostPart.substring(colonIdx + 1);\n } else {\n this.#hostname = hostPart;\n }\n }\n }\n\n // Parse path, query, fragment\n let hashIdx = rest.indexOf('#');\n if (hashIdx !== -1) {\n this.#hash = rest.substring(hashIdx);\n rest = rest.substring(0, hashIdx);\n }\n\n let queryIdx = rest.indexOf('?');\n if (queryIdx !== -1) {\n this.#search = rest.substring(queryIdx);\n rest = rest.substring(0, queryIdx);\n }\n\n this.#pathname = rest || '/';\n if (!this.#pathname.startsWith('/') && this.#hostname) {\n this.#pathname = '/' + this.#pathname;\n }\n }\n\n get protocol() { return this.#protocol; }\n set protocol(value) { this.#protocol = String(value).toLowerCase() + (String(value).endsWith(':') ? '' : ':'); }\n\n get username() { return this.#username; }\n set username(value) { this.#username = String(value); }\n\n get password() { return this.#password; }\n set password(value) { this.#password = String(value); }\n\n get hostname() { return this.#hostname; }\n set hostname(value) { this.#hostname = String(value); }\n\n get port() { return this.#port; }\n set port(value) { this.#port = String(value); }\n\n get pathname() { return this.#pathname; }\n set pathname(value) { this.#pathname = String(value); }\n\n get search() { return this.#search; }\n set search(value) {\n const str = String(value);\n this.#search = str.startsWith('?') ? str : (str ? '?' + str : '');\n if (this.#searchParams) {\n this.#searchParams._updateFromSearch(this.#search);\n }\n }\n\n _updateSearchFromParams(search) {\n this.#search = search ? '?' + search : '';\n }\n\n get hash() { return this.#hash; }\n set hash(value) {\n const str = String(value);\n this.#hash = str.startsWith('#') ? str : (str ? '#' + str : '');\n }\n\n get host() {\n return this.#port ? this.#hostname + ':' + this.#port : this.#hostname;\n }\n set host(value) {\n const str = String(value);\n const colonIdx = str.lastIndexOf(':');\n if (colonIdx !== -1 && !str.includes('[')) {\n this.#hostname = str.substring(0, colonIdx);\n this.#port = str.substring(colonIdx + 1);\n } else {\n this.#hostname = str;\n this.#port = '';\n }\n }\n\n get origin() {\n if (this.#protocol === 'blob:') {\n try {\n return new URL(this.#pathname).origin;\n } catch {\n return 'null';\n }\n }\n return this.#protocol + '//' + this.host;\n }\n\n get href() {\n let result = this.#protocol;\n if (this.#hostname) {\n result += '//';\n if (this.#username) {\n result += encodeURIComponent(this.#username);\n if (this.#password) {\n result += ':' + encodeURIComponent(this.#password);\n }\n result += '@';\n }\n result += this.host;\n }\n result += this.#pathname + this.#search + this.#hash;\n return result;\n }\n set href(value) {\n const newUrl = new URL(String(value));\n this.#protocol = newUrl.protocol;\n this.#username = newUrl.username;\n this.#password = newUrl.password;\n this.#hostname = newUrl.hostname;\n this.#port = newUrl.port;\n this.#pathname = newUrl.pathname;\n this.#search = newUrl.search;\n this.#hash = newUrl.hash;\n this.#searchParams = null;\n }\n\n get searchParams() {\n if (!this.#searchParams) {\n this.#searchParams = new URLSearchParams(this.#search, this);\n }\n return this.#searchParams;\n }\n\n toString() { return this.href; }\n toJSON() { return this.href; }\n\n static canParse(url, base) {\n try {\n new URL(url, base);\n return true;\n } catch {\n return false;\n }\n }\n }\n\n globalThis.URL = URL;\n globalThis.URLSearchParams = URLSearchParams;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// Blob / File Implementation\n// ============================================================================\n\ninterface BlobState {\n parts: Uint8Array[];\n type: string;\n size: number;\n}\n\ninterface FileState extends BlobState {\n name: string;\n lastModified: number;\n}\n\nasync function injectBlob(\n context: ivm.Context,\n stateMap: Map<number, unknown>\n): Promise<void> {\n // Helper function to convert parts to bytes\n const partsToBytes = (parts: unknown[]): Uint8Array[] => {\n return parts.map((part) => {\n if (typeof part === \"string\") {\n return new TextEncoder().encode(part);\n }\n if (part instanceof Uint8Array) {\n return part;\n }\n if (part instanceof ArrayBuffer) {\n return new Uint8Array(part);\n }\n if (ArrayBuffer.isView(part)) {\n return new Uint8Array(part.buffer, part.byteOffset, part.byteLength);\n }\n // For blob parts, we'd need to get their bytes - handled in isolate\n return new TextEncoder().encode(String(part));\n });\n };\n\n // Register helper callbacks\n const global = context.global;\n\n // Blob constructor\n global.setSync(\n \"__Blob_construct\",\n new ivm.Callback((parts: unknown[], options?: { type?: string }) => {\n const instanceId = nextInstanceId++;\n const bytes = partsToBytes(parts || []);\n const size = bytes.reduce((acc, b) => acc + b.length, 0);\n const state: BlobState = {\n parts: bytes,\n type: options?.type?.toLowerCase() || \"\",\n size,\n };\n stateMap.set(instanceId, state);\n return instanceId;\n })\n );\n\n global.setSync(\n \"__Blob_get_size\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n return state?.size ?? 0;\n })\n );\n\n global.setSync(\n \"__Blob_get_type\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n return state?.type ?? \"\";\n })\n );\n\n global.setSync(\n \"__Blob_text\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return \"\";\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new TextDecoder().decode(combined);\n })\n );\n\n global.setSync(\n \"__Blob_arrayBuffer\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return new ivm.ExternalCopy(new ArrayBuffer(0)).copyInto();\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new ivm.ExternalCopy(combined.buffer).copyInto();\n })\n );\n\n global.setSync(\n \"__Blob_bytes\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) return new ivm.ExternalCopy(new Uint8Array(0)).copyInto();\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n return new ivm.ExternalCopy(combined).copyInto();\n })\n );\n\n global.setSync(\n \"__Blob_slice\",\n new ivm.Callback(\n (\n instanceId: number,\n start?: number,\n end?: number,\n contentType?: string\n ) => {\n const state = stateMap.get(instanceId) as BlobState;\n if (!state) {\n const newId = nextInstanceId++;\n stateMap.set(newId, { parts: [], type: \"\", size: 0 });\n return newId;\n }\n\n // Combine all parts\n const combined = new Uint8Array(state.size);\n let offset = 0;\n for (const part of state.parts) {\n combined.set(part, offset);\n offset += part.length;\n }\n\n // Handle negative indices\n let s = start ?? 0;\n let e = end ?? state.size;\n if (s < 0) s = Math.max(0, state.size + s);\n if (e < 0) e = Math.max(0, state.size + e);\n s = Math.min(s, state.size);\n e = Math.min(e, state.size);\n\n const sliced = combined.slice(s, e);\n const newId = nextInstanceId++;\n const newState: BlobState = {\n parts: [sliced],\n type: contentType ?? state.type,\n size: sliced.length,\n };\n stateMap.set(newId, newState);\n return newId;\n }\n )\n );\n\n // File constructor (extends Blob)\n global.setSync(\n \"__File_construct\",\n new ivm.Callback(\n (\n parts: unknown[],\n name: string,\n options?: { type?: string; lastModified?: number }\n ) => {\n const instanceId = nextInstanceId++;\n const bytes = partsToBytes(parts || []);\n const size = bytes.reduce((acc, b) => acc + b.length, 0);\n const state: FileState = {\n parts: bytes,\n type: options?.type?.toLowerCase() || \"\",\n size,\n name: String(name),\n lastModified: options?.lastModified ?? Date.now(),\n };\n stateMap.set(instanceId, state);\n return instanceId;\n }\n )\n );\n\n global.setSync(\n \"__File_get_name\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as FileState;\n return state?.name ?? \"\";\n })\n );\n\n global.setSync(\n \"__File_get_lastModified\",\n new ivm.Callback((instanceId: number) => {\n const state = stateMap.get(instanceId) as FileState;\n return state?.lastModified ?? 0;\n })\n );\n\n // Inject Blob and File classes\n // Using a WeakMap inside the isolate to store instance IDs (avoids private field issues)\n const blobCode = `\n(function() {\n const _blobInstanceIds = new WeakMap();\n\n class Blob {\n constructor(parts = [], options = {}) {\n if (parts === null && options === null) {\n // Internal: creating from existing instance ID (set via _setInstanceId)\n return;\n }\n // Pre-process parts: extract bytes from Blob/File instances\n const processedParts = [];\n for (const part of (parts || [])) {\n if (part instanceof Blob) {\n // Get bytes synchronously via host callback\n processedParts.push(__Blob_bytes(part._getInstanceId()));\n } else {\n processedParts.push(part);\n }\n }\n const instanceId = __Blob_construct(processedParts, options);\n _blobInstanceIds.set(this, instanceId);\n }\n\n static _createFromInstanceId(instanceId) {\n const blob = new Blob(null, null);\n _blobInstanceIds.set(blob, instanceId);\n return blob;\n }\n\n _getInstanceId() {\n return _blobInstanceIds.get(this);\n }\n\n get size() {\n return __Blob_get_size(this._getInstanceId());\n }\n\n get type() {\n return __Blob_get_type(this._getInstanceId());\n }\n\n async text() {\n return await __Blob_text(this._getInstanceId());\n }\n\n async arrayBuffer() {\n return await __Blob_arrayBuffer(this._getInstanceId());\n }\n\n async bytes() {\n return await __Blob_bytes(this._getInstanceId());\n }\n\n slice(start, end, contentType) {\n const newInstanceId = __Blob_slice(this._getInstanceId(), start, end, contentType);\n return Blob._createFromInstanceId(newInstanceId);\n }\n\n stream() {\n const blob = this;\n return new ReadableStream({\n async start(controller) {\n const buffer = await blob.arrayBuffer();\n controller.enqueue(new Uint8Array(buffer));\n controller.close();\n }\n });\n }\n }\n\n class File extends Blob {\n constructor(parts, name, options = {}) {\n // Create file through host callback\n super(null, null);\n // Pre-process parts: extract bytes from Blob/File instances\n const processedParts = [];\n for (const part of (parts || [])) {\n if (part instanceof Blob) {\n processedParts.push(__Blob_bytes(part._getInstanceId()));\n } else {\n processedParts.push(part);\n }\n }\n const instanceId = __File_construct(processedParts, name, options);\n _blobInstanceIds.set(this, instanceId);\n }\n\n get name() {\n return __File_get_name(this._getInstanceId());\n }\n\n get lastModified() {\n return __File_get_lastModified(this._getInstanceId());\n }\n\n get webkitRelativePath() {\n return \"\";\n }\n\n slice(start, end, contentType) {\n const newInstanceId = __Blob_slice(this._getInstanceId(), start, end, contentType);\n return Blob._createFromInstanceId(newInstanceId);\n }\n }\n\n globalThis.Blob = Blob;\n globalThis.File = File;\n})();\n`;\n\n context.evalSync(blobCode);\n}\n\n// ============================================================================\n// DOMException Implementation\n// ============================================================================\n\nasync function injectDOMException(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n class DOMException extends Error {\n #code;\n\n static INDEX_SIZE_ERR = 1;\n static DOMSTRING_SIZE_ERR = 2;\n static HIERARCHY_REQUEST_ERR = 3;\n static WRONG_DOCUMENT_ERR = 4;\n static INVALID_CHARACTER_ERR = 5;\n static NO_DATA_ALLOWED_ERR = 6;\n static NO_MODIFICATION_ALLOWED_ERR = 7;\n static NOT_FOUND_ERR = 8;\n static NOT_SUPPORTED_ERR = 9;\n static INUSE_ATTRIBUTE_ERR = 10;\n static INVALID_STATE_ERR = 11;\n static SYNTAX_ERR = 12;\n static INVALID_MODIFICATION_ERR = 13;\n static NAMESPACE_ERR = 14;\n static INVALID_ACCESS_ERR = 15;\n static VALIDATION_ERR = 16;\n static TYPE_MISMATCH_ERR = 17;\n static SECURITY_ERR = 18;\n static NETWORK_ERR = 19;\n static ABORT_ERR = 20;\n static URL_MISMATCH_ERR = 21;\n static QUOTA_EXCEEDED_ERR = 22;\n static TIMEOUT_ERR = 23;\n static INVALID_NODE_TYPE_ERR = 24;\n static DATA_CLONE_ERR = 25;\n\n constructor(message = '', name = 'Error') {\n super(message);\n this.name = name;\n this.#code = this.#getCode(name);\n }\n\n get code() {\n return this.#code;\n }\n\n #getCode(name) {\n const codes = {\n 'IndexSizeError': 1,\n 'HierarchyRequestError': 3,\n 'WrongDocumentError': 4,\n 'InvalidCharacterError': 5,\n 'NoModificationAllowedError': 7,\n 'NotFoundError': 8,\n 'NotSupportedError': 9,\n 'InUseAttributeError': 10,\n 'InvalidStateError': 11,\n 'SyntaxError': 12,\n 'InvalidModificationError': 13,\n 'NamespaceError': 14,\n 'InvalidAccessError': 15,\n 'TypeMismatchError': 17,\n 'SecurityError': 18,\n 'NetworkError': 19,\n 'AbortError': 20,\n 'URLMismatchError': 21,\n 'QuotaExceededError': 22,\n 'TimeoutError': 23,\n 'InvalidNodeTypeError': 24,\n 'DataCloneError': 25,\n };\n return codes[name] ?? 0;\n }\n }\n\n globalThis.DOMException = DOMException;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// AbortController / AbortSignal Implementation\n// ============================================================================\n\nasync function injectAbortController(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n // Use WeakMap for private state (similar to Blob pattern)\n const _abortSignalState = new WeakMap();\n const __wrapAsyncContextCallback = (callback) => (\n typeof callback === 'function' && globalThis.AsyncContext?.Snapshot?.wrap\n ? globalThis.AsyncContext.Snapshot.wrap(callback)\n : callback\n );\n\n class AbortSignal {\n constructor() {\n // AbortSignal should not be constructed directly\n // Only AbortController can create it\n _abortSignalState.set(this, { aborted: false, reason: undefined, listeners: [], onabortHandler: null });\n }\n\n get aborted() {\n return _abortSignalState.get(this)?.aborted ?? false;\n }\n\n get reason() {\n return _abortSignalState.get(this)?.reason;\n }\n\n get onabort() {\n return _abortSignalState.get(this)?.onabortHandler ?? null;\n }\n\n set onabort(handler) {\n const state = _abortSignalState.get(this);\n if (!state) return;\n\n // Remove previous handler if it was a listener\n if (state.onabortHandler) {\n this.removeEventListener('abort', state.onabortHandler);\n }\n\n state.onabortHandler = typeof handler === 'function' ? handler : null;\n\n // Add new handler as listener\n if (state.onabortHandler) {\n this.addEventListener('abort', state.onabortHandler);\n }\n }\n\n throwIfAborted() {\n const state = _abortSignalState.get(this);\n if (state?.aborted) {\n throw state.reason;\n }\n }\n\n addEventListener(type, listener) {\n if (type !== 'abort') return;\n const state = _abortSignalState.get(this);\n if (state) {\n const wrapped = __wrapAsyncContextCallback(listener);\n state.listeners.push({ original: listener, wrapped });\n }\n }\n\n removeEventListener(type, listener) {\n if (type !== 'abort') return;\n const state = _abortSignalState.get(this);\n if (state) {\n const idx = state.listeners.findIndex((entry) => (\n entry.original === listener || entry.wrapped === listener\n ));\n if (idx !== -1) state.listeners.splice(idx, 1);\n }\n }\n\n _abort(reason) {\n const state = _abortSignalState.get(this);\n if (!state || state.aborted) return;\n state.aborted = true;\n state.reason = reason !== undefined ? reason : new DOMException('The operation was aborted.', 'AbortError');\n const event = { type: 'abort', target: this };\n for (const listener of state.listeners) {\n try {\n listener.wrapped(event);\n } catch (e) {\n // Ignore listener errors\n }\n }\n }\n\n static abort(reason) {\n const controller = new AbortController();\n controller.abort(reason);\n return controller.signal;\n }\n\n static timeout(milliseconds) {\n const controller = new AbortController();\n setTimeout(() => {\n controller.abort(new DOMException('The operation timed out.', 'TimeoutError'));\n }, milliseconds);\n return controller.signal;\n }\n\n static any(signals) {\n if (!Array.isArray(signals)) {\n throw new TypeError('signals must be an iterable');\n }\n\n // If any signal is already aborted, return an aborted signal with that reason\n for (const signal of signals) {\n if (signal.aborted) {\n return AbortSignal.abort(signal.reason);\n }\n }\n\n // Create a new controller that will abort when any input signal aborts\n const controller = new AbortController();\n\n for (const signal of signals) {\n signal.addEventListener('abort', () => {\n if (!controller.signal.aborted) {\n controller.abort(signal.reason);\n }\n });\n }\n\n return controller.signal;\n }\n }\n\n class AbortController {\n #signal = null;\n\n constructor() {\n this.#signal = new AbortSignal();\n }\n\n get signal() {\n return this.#signal;\n }\n\n abort(reason) {\n this.#signal._abort(reason);\n }\n }\n\n globalThis.AbortController = AbortController;\n globalThis.AbortSignal = AbortSignal;\n})();\n`;\n\n context.evalSync(code);\n}\n\n// ============================================================================\n// structuredClone Implementation\n// ============================================================================\n\nasync function injectStructuredClone(context: ivm.Context): Promise<void> {\n const code = `\n(function() {\n globalThis.structuredClone = function structuredClone(value, options) {\n const transfer = options?.transfer;\n const transferSet = transfer ? new Set(transfer) : null;\n const seen = new Map();\n\n function clone(val) {\n // Primitives\n if (val === null || val === undefined) return val;\n const type = typeof val;\n if (type === 'string' || type === 'number' || type === 'boolean' || type === 'bigint') {\n return val;\n }\n\n // Non-cloneable types\n if (type === 'function') {\n throw new DOMException('Function cannot be cloned.', 'DataCloneError');\n }\n if (type === 'symbol') {\n throw new DOMException('Symbol cannot be cloned.', 'DataCloneError');\n }\n\n // Circular reference check\n if (seen.has(val)) {\n return seen.get(val);\n }\n\n // Date\n if (val instanceof Date) {\n const cloned = new Date(val.getTime());\n seen.set(val, cloned);\n return cloned;\n }\n\n // RegExp\n if (val instanceof RegExp) {\n const cloned = new RegExp(val.source, val.flags);\n seen.set(val, cloned);\n return cloned;\n }\n\n // Error types\n if (val instanceof Error) {\n const ErrorCtor = globalThis[val.name] || Error;\n const cloned = new ErrorCtor(val.message);\n seen.set(val, cloned);\n cloned.stack = val.stack;\n if (val.cause !== undefined) cloned.cause = clone(val.cause);\n return cloned;\n }\n\n // ArrayBuffer\n if (val instanceof ArrayBuffer) {\n const cloned = val.slice(0);\n seen.set(val, cloned);\n return cloned;\n }\n\n // TypedArrays\n if (ArrayBuffer.isView(val) && !(val instanceof DataView)) {\n const TypedArrayCtor = val.constructor;\n const bufferClone = clone(val.buffer);\n const cloned = new TypedArrayCtor(bufferClone, val.byteOffset, val.length);\n seen.set(val, cloned);\n return cloned;\n }\n\n // DataView\n if (val instanceof DataView) {\n const bufferClone = clone(val.buffer);\n const cloned = new DataView(bufferClone, val.byteOffset, val.byteLength);\n seen.set(val, cloned);\n return cloned;\n }\n\n // Map\n if (val instanceof Map) {\n const cloned = new Map();\n seen.set(val, cloned);\n for (const [k, v] of val) cloned.set(clone(k), clone(v));\n return cloned;\n }\n\n // Set\n if (val instanceof Set) {\n const cloned = new Set();\n seen.set(val, cloned);\n for (const v of val) cloned.add(clone(v));\n return cloned;\n }\n\n // Array\n if (Array.isArray(val)) {\n const cloned = new Array(val.length);\n seen.set(val, cloned);\n for (let i = 0; i < val.length; i++) {\n if (i in val) cloned[i] = clone(val[i]);\n }\n return cloned;\n }\n\n // WeakMap/WeakSet - not cloneable\n if (val instanceof WeakMap) {\n throw new DOMException('WeakMap cannot be cloned.', 'DataCloneError');\n }\n if (val instanceof WeakSet) {\n throw new DOMException('WeakSet cannot be cloned.', 'DataCloneError');\n }\n\n // Plain objects\n const cloned = {};\n seen.set(val, cloned);\n for (const key of Object.keys(val)) {\n cloned[key] = clone(val[key]);\n }\n return cloned;\n }\n\n return clone(value);\n };\n})();\n`;\n context.evalSync(code);\n}\n\n// ============================================================================\n// Streams Implementation\n// ============================================================================\n\nasync function injectStreams(\n context: ivm.Context,\n _stateMap: Map<number, unknown>\n): Promise<void> {\n // WHATWG Streams implementation\n const streamsCode = `\n(function() {\n // Simple queue implementation\n class SimpleQueue {\n #items = [];\n\n enqueue(item) {\n this.#items.push(item);\n }\n\n dequeue() {\n return this.#items.shift();\n }\n\n peek() {\n return this.#items[0];\n }\n\n get length() {\n return this.#items.length;\n }\n\n isEmpty() {\n return this.#items.length === 0;\n }\n }\n\n // ReadableStream\n class ReadableStream {\n #state = 'readable';\n #reader = null;\n #storedError = undefined;\n #controller = null;\n #underlyingSource = null;\n\n constructor(underlyingSource = {}, strategy = {}) {\n this.#underlyingSource = underlyingSource;\n\n const controller = {\n stream: this,\n queue: new SimpleQueue(),\n started: false,\n closeRequested: false,\n pullAgain: false,\n pulling: false,\n\n close: () => {\n if (this.#state !== 'readable') return;\n controller.closeRequested = true;\n if (controller.queue.isEmpty()) {\n this.#state = 'closed';\n if (this.#reader) {\n // Resolve any pending read with done: true\n if (this.#reader._pendingRead) {\n const { resolve } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n resolve({ value: undefined, done: true });\n }\n this.#reader._resolveClose?.();\n }\n }\n },\n\n enqueue: (chunk) => {\n if (this.#state !== 'readable') return;\n controller.queue.enqueue(chunk);\n if (this.#reader && this.#reader._pendingRead) {\n const { resolve } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n const chunk = controller.queue.dequeue();\n resolve({ value: chunk, done: false });\n if (controller.closeRequested && controller.queue.isEmpty()) {\n this.#state = 'closed';\n this.#reader._resolveClose?.();\n }\n }\n },\n\n error: (e) => {\n if (this.#state !== 'readable') return;\n this.#state = 'errored';\n this.#storedError = e;\n if (this.#reader && this.#reader._pendingRead) {\n const { reject } = this.#reader._pendingRead;\n this.#reader._pendingRead = null;\n reject(e);\n }\n },\n\n desiredSize: strategy.highWaterMark ?? 1\n };\n\n this.#controller = controller;\n\n // Start the underlying source\n if (underlyingSource.start) {\n const startPromise = Promise.resolve(underlyingSource.start(controller));\n startPromise.then(() => {\n controller.started = true;\n // If pulls were queued while starting, process them now\n if (controller.pullAgain) {\n controller.pullAgain = false;\n this._pull();\n }\n }).catch((e) => {\n controller.error(e);\n });\n } else {\n // No start callback - mark as started immediately\n controller.started = true;\n }\n }\n\n get locked() {\n return this.#reader !== null;\n }\n\n cancel(reason) {\n if (this.#reader) {\n return Promise.reject(new TypeError('Cannot cancel a stream that has a reader'));\n }\n return this._cancelInternal(reason);\n }\n\n // Internal cancel method - used by reader.cancel() which is allowed even when locked\n _cancelInternal(reason) {\n this.#state = 'closed';\n // Resolve any pending reads with done: true\n if (this.#reader) {\n if (this.#reader._pendingRead) {\n this.#reader._pendingRead.resolve({ value: undefined, done: true });\n this.#reader._pendingRead = null;\n }\n // Resolve the reader's closed promise\n this.#reader._resolveClose?.();\n }\n return Promise.resolve(this.#underlyingSource?.cancel?.(reason));\n }\n\n getReader(options = {}) {\n if (this.#reader) {\n throw new TypeError('ReadableStream is already locked');\n }\n const reader = new ReadableStreamDefaultReader(this);\n this.#reader = reader;\n return reader;\n }\n\n pipeThrough(transform, options = {}) {\n const readable = transform.readable;\n const writable = transform.writable;\n this.pipeTo(writable, options);\n return readable;\n }\n\n async pipeTo(destination, options = {}) {\n const reader = this.getReader();\n const writer = destination.getWriter();\n\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n await writer.write(value);\n }\n await writer.close();\n } catch (e) {\n await writer.abort(e);\n throw e;\n } finally {\n reader.releaseLock();\n writer.releaseLock();\n }\n }\n\n tee() {\n const reader = this.getReader();\n let reading = false;\n let canceled1 = false;\n let canceled2 = false;\n let reason1;\n let reason2;\n\n const pullAlgorithm = async () => {\n if (reading) return;\n reading = true;\n\n try {\n const { value, done } = await reader.read();\n reading = false;\n\n if (done) {\n if (!canceled1) branch1Controller.close();\n if (!canceled2) branch2Controller.close();\n return;\n }\n\n // Enqueue directly to controllers (not to unused queues)\n if (!canceled1) branch1Controller.enqueue(value);\n if (!canceled2) branch2Controller.enqueue(value);\n } catch (e) {\n if (!canceled1) branch1Controller.error(e);\n if (!canceled2) branch2Controller.error(e);\n }\n };\n\n let branch1Controller;\n let branch2Controller;\n\n const branch1 = new ReadableStream({\n start(controller) {\n branch1Controller = controller;\n },\n pull(controller) {\n return pullAlgorithm();\n },\n cancel(reason) {\n canceled1 = true;\n reason1 = reason;\n if (canceled2) {\n reader.cancel([reason1, reason2]);\n }\n }\n });\n\n const branch2 = new ReadableStream({\n start(controller) {\n branch2Controller = controller;\n },\n pull(controller) {\n return pullAlgorithm();\n },\n cancel(reason) {\n canceled2 = true;\n reason2 = reason;\n if (canceled1) {\n reader.cancel([reason1, reason2]);\n }\n }\n });\n\n return [branch1, branch2];\n }\n\n async *[Symbol.asyncIterator]() {\n const reader = this.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) return;\n yield value;\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n // Internal methods for reader access\n _getController() {\n return this.#controller;\n }\n\n _getState() {\n return this.#state;\n }\n\n _setState(state) {\n this.#state = state;\n }\n\n _getStoredError() {\n return this.#storedError;\n }\n\n _setReader(reader) {\n this.#reader = reader;\n }\n\n _pull() {\n const controller = this.#controller;\n // If not started yet, queue the pull request to run when started\n if (!controller.started) {\n controller.pullAgain = true;\n return;\n }\n if (controller.pulling) return;\n controller.pulling = true;\n\n Promise.resolve(this.#underlyingSource?.pull?.(controller))\n .then(() => {\n controller.pulling = false;\n if (controller.pullAgain) {\n controller.pullAgain = false;\n this._pull();\n }\n })\n .catch((e) => {\n controller.error(e);\n });\n }\n\n static from(asyncIterable) {\n const iterator = asyncIterable[Symbol.asyncIterator]?.() ?? asyncIterable[Symbol.iterator]?.();\n\n return new ReadableStream({\n async pull(controller) {\n const { value, done } = await iterator.next();\n if (done) {\n controller.close();\n } else {\n controller.enqueue(value);\n }\n },\n cancel(reason) {\n iterator.return?.(reason);\n }\n });\n }\n }\n\n // ReadableStreamDefaultReader\n class ReadableStreamDefaultReader {\n #stream = null;\n _pendingRead = null;\n _resolveClose = null;\n _rejectClose = null;\n #closed = null;\n\n constructor(stream) {\n if (stream.locked) {\n throw new TypeError('ReadableStream is already locked');\n }\n this.#stream = stream;\n stream._setReader(this);\n\n this.#closed = new Promise((resolve, reject) => {\n this._resolveClose = resolve;\n this._rejectClose = reject;\n });\n }\n\n get closed() {\n return this.#closed;\n }\n\n async read() {\n if (!this.#stream) {\n throw new TypeError('Reader has been released');\n }\n\n const controller = this.#stream._getController();\n const state = this.#stream._getState();\n\n if (state === 'closed') {\n return { value: undefined, done: true };\n }\n\n if (state === 'errored') {\n throw this.#stream._getStoredError();\n }\n\n if (!controller.queue.isEmpty()) {\n const chunk = controller.queue.dequeue();\n if (controller.closeRequested && controller.queue.isEmpty()) {\n this.#stream._setState('closed');\n this._resolveClose?.();\n }\n return { value: chunk, done: false };\n }\n\n // Queue is empty - check if stream was requested to close\n if (controller.closeRequested) {\n this.#stream._setState('closed');\n this._resolveClose?.();\n return { value: undefined, done: true };\n }\n\n // Need to wait for data\n return new Promise((resolve, reject) => {\n this._pendingRead = { resolve, reject };\n this.#stream._pull();\n });\n }\n\n cancel(reason) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Reader has been released'));\n }\n // Use internal cancel - reader is allowed to cancel even when stream is locked\n return this.#stream._cancelInternal(reason);\n }\n\n releaseLock() {\n if (!this.#stream) return;\n if (this._pendingRead) {\n this._pendingRead.reject(new TypeError('Reader was released'));\n this._pendingRead = null;\n }\n this.#stream._setReader(null);\n this.#stream = null;\n }\n }\n\n // WritableStream\n class WritableStream {\n #state = 'writable';\n #writer = null;\n #storedError = undefined;\n #controller = null;\n #underlyingSink = null;\n #writeQueue = [];\n #closePromise = null;\n\n constructor(underlyingSink = {}, strategy = {}) {\n this.#underlyingSink = underlyingSink;\n\n const controller = {\n stream: this,\n signal: new AbortController().signal,\n error: (e) => {\n if (this.#state !== 'writable') return;\n this.#state = 'errored';\n this.#storedError = e;\n }\n };\n\n this.#controller = controller;\n\n Promise.resolve(underlyingSink.start?.(controller))\n .catch((e) => {\n controller.error(e);\n });\n }\n\n get locked() {\n return this.#writer !== null;\n }\n\n abort(reason) {\n if (this.#writer) {\n return Promise.reject(new TypeError('Cannot abort a stream that has a writer'));\n }\n this.#state = 'errored';\n this.#storedError = reason;\n return Promise.resolve(this.#underlyingSink?.abort?.(reason));\n }\n\n close() {\n if (this.#writer) {\n return Promise.reject(new TypeError('Cannot close a stream that has a writer'));\n }\n return this._close();\n }\n\n _close() {\n if (this.#closePromise) return this.#closePromise;\n\n this.#closePromise = Promise.resolve(this.#underlyingSink?.close?.())\n .then(() => {\n this.#state = 'closed';\n });\n\n return this.#closePromise;\n }\n\n _abort(reason) {\n this.#state = 'errored';\n this.#storedError = reason;\n // Reject any pending write promises\n for (const pending of this.#writeQueue) {\n pending.reject?.(reason);\n }\n this.#writeQueue = [];\n return Promise.resolve(this.#underlyingSink?.abort?.(reason));\n }\n\n getWriter() {\n if (this.#writer) {\n throw new TypeError('WritableStream is already locked');\n }\n const writer = new WritableStreamDefaultWriter(this);\n this.#writer = writer;\n return writer;\n }\n\n // Internal methods\n _getState() {\n return this.#state;\n }\n\n _getStoredError() {\n return this.#storedError;\n }\n\n _setWriter(writer) {\n this.#writer = writer;\n }\n\n _write(chunk) {\n if (this.#state !== 'writable') {\n return Promise.reject(this.#storedError || new TypeError('Stream is not writable'));\n }\n\n let resolve, reject;\n const pendingPromise = new Promise((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n const pending = { resolve, reject };\n this.#writeQueue.push(pending);\n\n const cleanup = () => {\n const index = this.#writeQueue.indexOf(pending);\n if (index !== -1) {\n this.#writeQueue.splice(index, 1);\n }\n };\n\n Promise.resolve(this.#underlyingSink?.write?.(chunk, this.#controller))\n .then((result) => {\n cleanup();\n resolve(result);\n })\n .catch((e) => {\n cleanup();\n reject(e);\n });\n\n return pendingPromise;\n }\n }\n\n // WritableStreamDefaultWriter\n class WritableStreamDefaultWriter {\n #stream = null;\n #ready = null;\n #closed = null;\n #closedResolve = null;\n #closedReject = null;\n #closedSettled = false;\n\n constructor(stream) {\n if (stream.locked) {\n throw new TypeError('WritableStream is already locked');\n }\n this.#stream = stream;\n stream._setWriter(this);\n\n this.#ready = Promise.resolve();\n this.#closed = new Promise((resolve, reject) => {\n this.#closedResolve = resolve;\n this.#closedReject = reject;\n });\n }\n\n get closed() {\n return this.#closed;\n }\n\n get ready() {\n return this.#ready;\n }\n\n get desiredSize() {\n return 1;\n }\n\n abort(reason) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n // Mark closed as settled since abort will reject the closed promise\n this.#closedSettled = true;\n const abortPromise = this.#stream._abort(reason);\n // DON'T reject closed here - see if test passes without it\n return abortPromise;\n }\n\n close() {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n return this.#stream._close().then(() => {\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedResolve?.();\n }\n }).catch((e) => {\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedReject?.(e);\n }\n throw e;\n });\n }\n\n write(chunk) {\n if (!this.#stream) {\n return Promise.reject(new TypeError('Writer has been released'));\n }\n return this.#stream._write(chunk);\n }\n\n releaseLock() {\n if (!this.#stream) return;\n this.#stream._setWriter(null);\n this.#stream = null;\n // Only reject the closed promise if it hasn't been settled yet\n // (i.e., the stream wasn't closed or aborted before release)\n if (!this.#closedSettled) {\n this.#closedSettled = true;\n this.#closedReject?.(new TypeError('Writer was released'));\n }\n }\n }\n\n // TransformStream\n class TransformStream {\n #readable;\n #writable;\n\n constructor(transformer = {}, writableStrategy = {}, readableStrategy = {}) {\n let readableController;\n\n this.#readable = new ReadableStream({\n start(controller) {\n readableController = controller;\n }\n }, readableStrategy);\n\n const transformerController = {\n enqueue: (chunk) => {\n readableController.enqueue(chunk);\n },\n error: (e) => {\n readableController.error(e);\n },\n terminate: () => {\n readableController.close();\n },\n desiredSize: readableController?.desiredSize ?? 1\n };\n\n this.#writable = new WritableStream({\n start() {\n return transformer.start?.(transformerController);\n },\n write(chunk) {\n // If no transform function is provided, act as identity transform\n if (transformer.transform) {\n return transformer.transform(chunk, transformerController);\n } else {\n transformerController.enqueue(chunk);\n }\n },\n close() {\n const result = transformer.flush?.(transformerController);\n return Promise.resolve(result).then(() => {\n readableController.close();\n });\n },\n abort(reason) {\n readableController.error(reason);\n return Promise.resolve();\n }\n }, writableStrategy);\n }\n\n get readable() {\n return this.#readable;\n }\n\n get writable() {\n return this.#writable;\n }\n }\n\n // ByteLengthQueuingStrategy\n class ByteLengthQueuingStrategy {\n #highWaterMark;\n\n constructor({ highWaterMark }) {\n this.#highWaterMark = highWaterMark;\n }\n\n get highWaterMark() {\n return this.#highWaterMark;\n }\n\n get size() {\n return (chunk) => chunk.byteLength;\n }\n }\n\n // CountQueuingStrategy\n class CountQueuingStrategy {\n #highWaterMark;\n\n constructor({ highWaterMark }) {\n this.#highWaterMark = highWaterMark;\n }\n\n get highWaterMark() {\n return this.#highWaterMark;\n }\n\n get size() {\n return () => 1;\n }\n }\n\n globalThis.ReadableStream = ReadableStream;\n globalThis.ReadableStreamDefaultReader = ReadableStreamDefaultReader;\n globalThis.WritableStream = WritableStream;\n globalThis.WritableStreamDefaultWriter = WritableStreamDefaultWriter;\n globalThis.TransformStream = TransformStream;\n globalThis.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy;\n globalThis.CountQueuingStrategy = CountQueuingStrategy;\n})();\n`;\n\n context.evalSync(streamsCode);\n}\n"
6
6
  ],
7
- "mappings": ";AAAA;AACA;AACA;AACA;AAKA,IAAM,iBAAiB,cAAc,KAAK,KAAK,QAAQ,IAAI,GAAG,cAAc,CAAC;AAM7E,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,SAAS,uBAAuB,CAAC,WAA2B;AAAA,EAC1D,OAAQ,kBAAwC,SAAS,SAAS,IAC9D,YACA;AAAA;AAMN,SAAS,sBAAsB,CAAC,KAAmB;AAAA,EACjD,MAAM,YAAY,wBAAwB,IAAI,IAAI;AAAA,EAClD,OAAO,IAAI,MAAM,IAAI,aAAa,IAAI,SAAS;AAAA;AAMjD,SAAS,OAAO,CAAC,KAAqB;AAAA,EACpC,IAAI,eAAe,OAAO;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,QAAQ,UAAU;AAAA,IAC3B,OAAO,IAAI,MAAM,GAAG;AAAA,EACtB;AAAA,EACA,IAAI;AAAA,IACF,OAAO,IAAI,MAAM,KAAK,UAAU,GAAG,CAAC;AAAA,IACpC,MAAM;AAAA,IACN,OAAO,IAAI,MAAM,OAAO,OAAO,eAAe,CAAC;AAAA;AAAA;AAOnD,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtB,KAAK;AAMP,IAAM,4BAA4B,IAAI;AACtC,IAAI,8BAA6C;AAUjD,IAAM,mBAAmB,IAAI;AAC7B,IAAI,iBAAiB;AAErB,SAAS,6BAA6B,CACpC,SACsB;AAAA,EACtB,IAAI,MAAM,iBAAiB,IAAI,OAAO;AAAA,EACtC,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI;AAAA,IACV,iBAAiB,IAAI,SAAS,GAAG;AAAA,EACnC;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,qBAAqB,GAAS;AAAA,EAC5C,iBAAiB;AAAA;AAOnB,IAAM,qBAAqB,IAAI;AAE/B,SAAS,sBAAsB,CAC7B,SACA,KACM;AAAA,EACN,IAAI,MAAM,mBAAmB,IAAI,OAAO;AAAA,EACxC,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI;AAAA,IACV,mBAAmB,IAAI,SAAS,GAAG;AAAA,EACrC;AAAA,EACA,IAAI,IAAI,GAAG;AAAA;AAMN,SAAS,yBAAyB,CAAC,SAA4B;AAAA,EACpE,MAAM,MAAM,mBAAmB,IAAI,OAAO;AAAA,EAC1C,IAAI,KAAK;AAAA,IACP,WAAW,OAAO,KAAK;AAAA,MACrB,IAAI;AAAA,QACF,IAAI,QAAQ;AAAA,QACZ,MAAM;AAAA,IAGV;AAAA,IACA,IAAI,MAAM;AAAA,EACZ;AAAA;AAeF,IAAM,oBAAoB;AAMnB,SAAS,OAAO,CACrB,SACA,OACA,SACe;AAAA,EACf,MAAM,WAAW,SAAS,YAAY;AAAA,EACtC,MAAM,OAAO,IAAI;AAAA,EAEjB,SAAS,YAAY,CAAC,KAAc,OAAwB;AAAA,IAC1D,IAAI,QAAQ,UAAU;AAAA,MACpB,MAAM,IAAI,MAAM,gBAAgB,sCAAsC;AAAA,IACxE;AAAA,IAGA,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,MACrC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,SAAS,YAAY,SAAS,YAAY,SAAS,WAAW;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,SAAS,YAAY;AAAA,MAEvB,OAAO,IAAI,IAAI,SAAS,IAAI,SAAoB;AAAA,QAC9C,IAAI;AAAA,UACF,OAAQ,IAAwC,GAAG,IAAI;AAAA,UACvD,OAAO,KAAK;AAAA,UACZ,IAAI,eAAe,OAAO;AAAA,YACxB,MAAM;AAAA,UACR;AAAA,UACA,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAAA;AAAA,OAE9B;AAAA,IACH;AAAA,IAEA,IAAI,SAAS,UAAU;AAAA,MACrB,MAAM,MAAM;AAAA,MAGZ,IAAI,KAAK,IAAI,GAAG,GAAG;AAAA,QACjB,MAAM,IAAI,MAAM,gDAAgD;AAAA,MAClE;AAAA,MACA,KAAK,IAAI,GAAG;AAAA,MAEZ,IAAI;AAAA,QAEF,IAAI,YAAY,OAAO,GAAG,GAAG;AAAA,UAC3B,IAAI,eAAe,YAAY;AAAA,YAE7B,OAAO,IAAI,IAAI,aAAa,GAAG,EAAE,SAAS;AAAA,UAC5C;AAAA,UAEA,OAAO,MAAM,KAAK,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU,CAAC;AAAA,QAC9E;AAAA,QAGA,IAAI,eAAe,aAAa;AAAA,UAC9B,OAAO,IAAI,IAAI,aAAa,IAAI,WAAW,GAAG,CAAC,EAAE,SAAS;AAAA,QAC5D;AAAA,QAGA,IAAI,eAAe,MAAM;AAAA,UACvB,OAAO,IAAI,YAAY;AAAA,QACzB;AAAA,QAGA,IAAI,eAAe,QAAQ;AAAA,UACzB,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ,IAAI;AAAA,YACZ,OAAO,IAAI;AAAA,UACb;AAAA,QACF;AAAA,QAGA,IAAI,eAAe,OAAO;AAAA,UACxB,OAAO;AAAA,YACL,QAAQ;AAAA,YACR,MAAM,IAAI;AAAA,YACV,SAAS,IAAI;AAAA,YACb,OAAO,IAAI;AAAA,UACb;AAAA,QACF;AAAA,QAGA,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,UACtB,MAAM,UAAoB,CAAC;AAAA,UAC3B,SAAS,IAAI,EAAG,IAAI,IAAI,QAAQ,KAAK;AAAA,YACnC,QAAO,KAAK,aAAa,IAAI,IAAI,QAAQ,CAAC;AAAA,UAC5C;AAAA,UACA,OAAO;AAAA,QACT;AAAA,QAGA,MAAM,UAAkC,CAAC;AAAA,QACzC,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,UAClC,QAAO,OAAO,aACX,IAAgC,MACjC,QAAQ,CACV;AAAA,QACF;AAAA,QACA,OAAO;AAAA,gBACP;AAAA,QACA,KAAK,OAAO,GAAG;AAAA;AAAA,IAEnB;AAAA,IAGA;AAAA;AAAA,EAGF,MAAM,YAAY,aAAa,OAAO,CAAC;AAAA,EAGvC,IAAI,qBAAqB,IAAI,aAAa,qBAAqB,IAAI,UAAU;AAAA,IAC3E,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,OAAO,IAAI,IAAI,aAAa,SAAS;AAAA,EAC3C,MAAM,SAAS,KAAK,SAAS;AAAA,EAC7B,KAAK,QAAQ;AAAA,EAIb,OAAO;AAAA;AAOF,SAAS,SAAS,CACvB,SACA,OACA,SACS;AAAA,EACT,MAAM,WAAW,SAAS,YAAY;AAAA,EAEtC,SAAS,cAAc,CAAC,KAAc,OAAwB;AAAA,IAC5D,IAAI,QAAQ,UAAU;AAAA,MACpB,MAAM,IAAI,MAAM,gBAAgB,wCAAwC;AAAA,IAC1E;AAAA,IAEA,IAAI,QAAQ,QAAQ,QAAQ,WAAW;AAAA,MACrC,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,OAAO,OAAO;AAAA,IACpB,IAAI,SAAS,YAAY,SAAS,YAAY,SAAS,WAAW;AAAA,MAChE,OAAO;AAAA,IACT;AAAA,IAEA,IAAI,eAAe,IAAI,WAAW;AAAA,MAEhC,IAAI;AAAA,QACF,MAAM,SAAS,IAAI,SAAS;AAAA,QAC5B,uBAAuB,SAAS,GAAG;AAAA,QACnC,OAAO,eAAe,QAAQ,KAAK;AAAA,QACnC,MAAM;AAAA,QAEN,OAAO;AAAA;AAAA,IAEX;AAAA,IAEA,IAAI,SAAS,UAAU;AAAA,MACrB,MAAM,MAAM;AAAA,MAGZ,IAAI,IAAI,WAAW,SAAS;AAAA,QAC1B,MAAM,mBAAoB,WACxB,IAAI;AAAA,QAEN,MAAM,QAAQ,KAAK,oBAAoB,OAAO,IAAI,OAAiB;AAAA,QACnE,MAAM,OAAO,IAAI;AAAA,QACjB,IAAI,IAAI,OAAO;AAAA,UACb,MAAM,QAAQ,IAAI;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,MACT;AAAA,MAEA,IAAI,IAAI,WAAW,UAAU;AAAA,QAC3B,OAAO,IAAI,OAAO,IAAI,QAAkB,IAAI,KAAe;AAAA,MAC7D;AAAA,MAGA,IAAI,MAAM,QAAQ,GAAG,GAAG;AAAA,QACtB,OAAO,IAAI,IAAI,CAAC,SAAS,eAAe,MAAM,QAAQ,CAAC,CAAC;AAAA,MAC1D;AAAA,MAGA,MAAM,SAAkC,CAAC;AAAA,MACzC,WAAW,OAAO,OAAO,KAAK,GAAG,GAAG;AAAA,QAClC,OAAO,OAAO,eAAe,IAAI,MAAM,QAAQ,CAAC;AAAA,MAClD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,OAAO;AAAA;AAAA,EAIT,IAAI,iBAAiB,IAAI,WAAW;AAAA,IAClC,IAAI;AAAA,MACF,MAAM,SAAS,MAAM,SAAS;AAAA,MAC9B,OAAO,eAAe,QAAQ,CAAC;AAAA,MAC/B,MAAM;AAAA,MAEN,OAAO;AAAA;AAAA,EAEX;AAAA,EAGA,OAAO,eAAe,OAAO,CAAC;AAAA;AA0BzB,SAAS,SAAY,CAC1B,SACA,UACG;AAAA,EACH,MAAM,OAAwB,CAAC;AAAA,EAE/B,MAAM,QAAe;AAAA,IACnB,MAA+B,CAAC,KAAW;AAAA,MACzC,KAAK,KAAK,GAAG;AAAA,MACb,OAAO;AAAA;AAAA,IAET,OAAO,CAAC,OAAgB,SAAyC;AAAA,MAC/D,MAAM,MAAM,QAAQ,SAAS,OAAO,OAAO;AAAA,MAC3C,KAAK,KAAK,GAAG;AAAA,MACb,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,IAAI;AAAA,IACF,OAAO,SAAS,KAAK;AAAA,YACrB;AAAA,IAEA,SAAS,IAAI,KAAK,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,MACzC,IAAI;AAAA,QACF,KAAK,GAAI,QAAQ;AAAA,QACjB,MAAM;AAAA,IAGV;AAAA;AAAA;AAQJ,eAAsB,cAAiB,CACrC,SACA,UACY;AAAA,EACZ,MAAM,OAAwB,CAAC;AAAA,EAE/B,MAAM,QAAe;AAAA,IACnB,MAA+B,CAAC,KAAW;AAAA,MACzC,KAAK,KAAK,GAAG;AAAA,MACb,OAAO;AAAA;AAAA,IAET,OAAO,CAAC,OAAgB,SAAyC;AAAA,MAC/D,MAAM,MAAM,QAAQ,SAAS,OAAO,OAAO;AAAA,MAC3C,KAAK,KAAK,GAAG;AAAA,MACb,OAAO;AAAA;AAAA,EAEX;AAAA,EAEA,IAAI;AAAA,IACF,OAAO,MAAM,SAAS,KAAK;AAAA,YAC3B;AAAA,IAEA,SAAS,IAAI,KAAK,SAAS,EAAG,KAAK,GAAG,KAAK;AAAA,MACzC,IAAI;AAAA,QACF,KAAK,GAAI,QAAQ;AAAA,QACjB,MAAM;AAAA,IAGV;AAAA;AAAA;AAYG,SAAS,cAAc,CAC5B,SACA,MACA,IACe;AAAA,EACf,MAAM,WAAW,IAAI,IAAI,SACvB,IAAI,SAAoB;AAAA,IACtB,OAAO,GAAG,GAAG,IAAI;AAAA,KAEnB,EAAE,MAAM,KAAK,CACf;AAAA,EAGA,MAAM,SAAS,QAAQ;AAAA,EACvB,OAAO,QAAQ,MAAM,QAAQ;AAAA,EAE7B,OAAO,OAAO,QAAQ,IAAI;AAAA;AAQrB,SAAS,mBAAmB,CACjC,SACA,MACA,IACe;AAAA,EACf,MAAM,SAAS,QAAQ;AAAA,EAGvB,MAAM,UAAU,eAAe;AAAA,EAG/B,MAAM,WAAW,IAAI,IAAI,UAAU,UAAU,SAAoB;AAAA,IAC/D,OAAO,MAAM,GAAG,GAAG,IAAI;AAAA,GACxB;AAAA,EAGD,OAAO,QAAQ,SAAS,QAAQ;AAAA,EAGhC,MAAM,cAAc;AAAA;AAAA,IAElB;AAAA;AAAA,eAEW;AAAA;AAAA,qBAEM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQnB,QAAQ,SAAS,WAAW;AAAA,EAE5B,OAAO,OAAO,QAAQ,IAAI;AAAA;AAoCrB,SAAS,WAA2C,CACzD,SACA,YACe;AAAA,EACf;AAAA,IACE;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,IACX,aAAa,CAAC;AAAA,IACd,gBAAgB,CAAC;AAAA,IACjB,mBAAmB,CAAC;AAAA,IACpB,SAAS;AAAA,MACP;AAAA,EACJ,MAAM,WAAW,8BAA8B,OAAO;AAAA,EAItD,MAAM,kBAAgD,CAAC;AAAA,EACvD,MAAM,mBAAgH,CAAC;AAAA,EAEvH,YAAY,YAAY,cAAc,OAAO,QAAQ,OAAO,GAAG;AAAA,IAC7D,IAAI,UAAU,OAAO;AAAA,MAEnB,iBAAiB,KAAK,QAAQ,oBAAoB,IAAI,IAAI,UACxD,OAAO,eAAuB,SAAoB;AAAA,QAChD,MAAM,QAAQ,SAAS,IAAI,UAAU;AAAA,QACrC,IAAI,CAAC,OAAO;AAAA,UACV,MAAM,IAAI,MAAM,YAAY,sBAAsB;AAAA,QACpD;AAAA,QACA,IAAI;AAAA,UACF,OAAO,MAAM,UAAU,GAAG,OAAO,GAAG,IAAI;AAAA,UACxC,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA,IACF,EAAO;AAAA,MAEL,gBAAgB,KAAK,QAAQ,gBAAgB,IAAI,IAAI,SACnD,CAAC,eAAuB,SAAoB;AAAA,QAC1C,MAAM,QAAQ,SAAS,IAAI,UAAU;AAAA,QACrC,IAAI,CAAC,OAAO;AAAA,UACV,MAAM,IAAI,MAAM,YAAY,sBAAsB;AAAA,QACpD;AAAA,QACA,IAAI;AAAA,UACF,OAAO,UAAU,GAAG,OAAO,GAAG,IAAI;AAAA,UAClC,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA;AAAA,EAEJ;AAAA,EAGA,MAAM,oBAAkD,CAAC;AAAA,EACzD,YAAY,UAAU,YAAY,OAAO,QAAQ,UAAU,GAAG;AAAA,IAC5D,IAAI,QAAQ,KAAK;AAAA,MACf,MAAM,SAAS,QAAQ;AAAA,MACvB,kBAAkB,KAAK,YAAY,cAAc,IAAI,IAAI,SACvD,CAAC,eAAuB;AAAA,QACtB,MAAM,QAAQ,SAAS,IAAI,UAAU;AAAA,QACrC,IAAI,CAAC,OAAO;AAAA,UACV,MAAM,IAAI,MAAM,YAAY,sBAAsB;AAAA,QACpD;AAAA,QACA,IAAI;AAAA,UACF,OAAO,OAAO,KAAK;AAAA,UACnB,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,KAAK;AAAA,MACf,MAAM,SAAS,QAAQ;AAAA,MACvB,kBAAkB,KAAK,YAAY,cAAc,IAAI,IAAI,SACvD,CAAC,YAAoB,UAAmB;AAAA,QACtC,MAAM,QAAQ,SAAS,IAAI,UAAU;AAAA,QACrC,IAAI,CAAC,OAAO;AAAA,UACV,MAAM,IAAI,MAAM,YAAY,sBAAsB;AAAA,QACpD;AAAA,QACA,IAAI;AAAA,UACF,OAAO,OAAO,KAAK;AAAA,UACnB,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA,IACF;AAAA,EACF;AAAA,EAIA,MAAM,wBAAsD,CAAC;AAAA,EAC7D,MAAM,yBAAkG,CAAC;AAAA,EAEzG,YAAY,YAAY,cAAc,OAAO,QAAQ,aAAa,GAAG;AAAA,IACnE,IAAI,UAAU,OAAO;AAAA,MAEnB,uBAAuB,KAAK,eAAe,oBAAoB,IAAI,IAAI,UACrE,UAAU,SAAoB;AAAA,QAC5B,IAAI;AAAA,UACF,OAAO,MAAM,UAAU,GAAG,GAAG,IAAI;AAAA,UACjC,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA,IACF,EAAO;AAAA,MAEL,sBAAsB,KAAK,eAAe,gBAAgB,IAAI,IAAI,SAChE,IAAI,SAAoB;AAAA,QACtB,IAAI;AAAA,UACF,OAAO,UAAU,GAAG,GAAG,IAAI;AAAA,UAC3B,OAAO,KAAK;AAAA,UACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,OAG/C;AAAA;AAAA,EAEJ;AAAA,EAGA,MAAM,sBAAsB,IAAI,IAAI,SAAS,IAAI,SAAoB;AAAA,IACnE,MAAM,aAAa;AAAA,IACnB,IAAI,WAAW;AAAA,MACb,IAAI;AAAA,QACF,MAAM,QAAQ,UAAU,IAAI;AAAA,QAC5B,SAAS,IAAI,YAAY,KAAK;AAAA,QAC9B,OAAO,KAAK;AAAA,QACZ,MAAM,uBAAuB,QAAQ,GAAG,CAAC;AAAA;AAAA,IAE7C,EAAO;AAAA,MACL,SAAS,IAAI,YAAY,CAAC,CAAW;AAAA;AAAA,IAEvC,OAAO;AAAA,GACR;AAAA,EAGD,MAAM,SAAS,QAAQ;AAAA,EACvB,OAAO,QAAQ,KAAK,kBAAkB,mBAAmB;AAAA,EAEzD,YAAY,cAAc,aAAa,OAAO,QAAQ,eAAe,GAAG;AAAA,IACtE,OAAO,QAAQ,cAAc,QAAQ;AAAA,EACvC;AAAA,EACA,YAAY,SAAS,QAAQ,OAAO,QAAQ,gBAAgB,GAAG;AAAA,IAC7D,OAAO,QAAQ,SAAS,GAAG;AAAA,EAC7B;AAAA,EACA,YAAY,cAAc,aAAa,OAAO,QAAQ,iBAAiB,GAAG;AAAA,IACxE,OAAO,QAAQ,cAAc,QAAQ;AAAA,EACvC;AAAA,EACA,YAAY,cAAc,aAAa,OAAO,QAC5C,qBACF,GAAG;AAAA,IACD,OAAO,QAAQ,cAAc,QAAQ;AAAA,EACvC;AAAA,EACA,YAAY,SAAS,QAAQ,OAAO,QAAQ,sBAAsB,GAAG;AAAA,IACnE,OAAO,QAAQ,SAAS,GAAG;AAAA,EAC7B;AAAA,EAGA,MAAM,gBAAgB,kBAClB,uBAAuB,oBACvB;AAAA,EAEJ,IAAI,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAeP;AAAA;AAAA,UAED,OAAO;AAAA;AAAA;AAAA,UAGP,kBAAkB,+BAA+B;AAAA;AAAA;AAAA;AAAA;AAAA,+BAK5B;AAAA,WACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAOK;AAAA;AAAA;AAAA,EAKd,YAAY,YAAY,cAAc,OAAO,QAAQ,OAAO,GAAG;AAAA,IAC7D,IAAI,UAAU,OAAO;AAAA,MACnB,aAAa;AAAA,YACP;AAAA;AAAA,yBAEa,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAU7B,EAAO;AAAA,MACL,aAAa;AAAA,MACb;AAAA;AAAA,mBAEa,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzB;AAAA,EAGA,YAAY,UAAU,YAAY,OAAO,QAAQ,UAAU,GAAG;AAAA,IAC5D,IAAI,QAAQ,OAAO,QAAQ,KAAK;AAAA,MAC9B,IAAI,QAAQ,KAAK;AAAA,QACf,aAAa;AAAA,UACX;AAAA;AAAA,mBAES,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMzB;AAAA,MACA,IAAI,QAAQ,KAAK;AAAA,QACf,aAAa;AAAA,UACX;AAAA;AAAA,YAEE,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMlB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa;AAAA;AAAA;AAAA,EAKb,YAAY,YAAY,cAAc,OAAO,QAAQ,aAAa,GAAG;AAAA,IACnE,IAAI,UAAU,OAAO;AAAA,MACnB,aAAa;AAAA,IACf,QAAQ;AAAA;AAAA,uBAEW,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUlC,EAAO;AAAA,MACL,aAAa;AAAA,IACf,QAAQ;AAAA;AAAA,iBAEK,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO9B;AAAA,EAGA,YAAY,UAAU,cAAc,OAAO,QAAQ,gBAAgB,GAAG;AAAA,IACpE,aAAa;AAAA,IACb,QAAQ,cAAc,KAAK,UAAU,SAAS;AAAA;AAAA,EAEhD;AAAA,EAEA,aAAa;AAAA,eACA,UAAU;AAAA,WACd;AAAA;AAAA;AAAA,EAKT,QAAQ,SAAS,SAAS;AAAA,EAE1B,OAAO,OAAO,QAAQ,IAAI;AAAA;AAuC5B,eAAsB,SAAS,CAC7B,SACA,SACqB;AAAA,EACrB,MAAM,OAAO;AAAA,IACX,cAAc;AAAA,IACd,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,OACR;AAAA,EACL;AAAA,EAEA,MAAM,WAAW,8BAA8B,OAAO;AAAA,EAGtD,IAAI,KAAK,cAAc;AAAA,IACrB,MAAM,mBAAmB,OAAO;AAAA,EAClC;AAAA,EAGA,IAAI,KAAK,KAAK;AAAA,IACZ,MAAM,UAAU,OAAO;AAAA,EACzB;AAAA,EAGA,MAAM,mBAAmB,OAAO;AAAA,EAGhC,MAAM,sBAAsB,OAAO;AAAA,EAGnC,MAAM,sBAAsB,OAAO;AAAA,EAGnC,IAAI,KAAK,MAAM;AAAA,IACb,MAAM,WAAW,SAAS,QAAQ;AAAA,EACpC;AAAA,EAGA,IAAI,KAAK,SAAS;AAAA,IAChB,MAAM,cAAc,SAAS,QAAQ;AAAA,EACvC;AAAA,EAGA,IAAI,KAAK,gBAAgB,KAAK,SAAS;AAAA,IACrC,MAAM,0BAA0B,OAAO;AAAA,EACzC;AAAA,EAGA,IAAI,KAAK,WAAW;AAAA,IAClB,MAAM,gBAAgB,OAAO;AAAA,EAC/B;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,GAAG;AAAA,MACR,0BAA0B,OAAO;AAAA;AAAA,EAErC;AAAA;AAOF,SAAS,8BAA8B,GAAW;AAAA,EAChD,IAAI,6BAA6B;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,0BAA0B,eAAe,QAAQ,uBAAuB;AAAA,EAC9E,MAAM,aAAa,KAAK,KAAK,KAAK,QAAQ,uBAAuB,GAAG,WAAW;AAAA,EAC/E,MAAM,eAAe,aAAa,YAAY,MAAM;AAAA,EACpD,MAAM,qBAAqB;AAAA,EAE3B,IAAI,CAAC,mBAAmB,KAAK,YAAY,GAAG;AAAA,IAC1C,MAAM,IAAI,MAAM,0CAA0C;AAAA,EAC5D;AAAA,EAEA,MAAM,uBAAuB,aAAa,QAAQ,oBAAoB,EAAE;AAAA,EACxE,8BAA8B;AAAA;AAAA,EAE9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,KAAK;AAAA,EAEL,OAAO;AAAA;AAGT,eAAe,eAAe,CAAC,SAAqC;AAAA,EAClE,IAAI,0BAA0B,IAAI,OAAO,GAAG;AAAA,IAC1C;AAAA,EACF;AAAA,EAEA,QAAQ,SAAS,+BAA+B,CAAC;AAAA,EAEjD,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyDb,IAAI;AAAA,IACF,QAAQ,SAAS,IAAI;AAAA,IACrB,0BAA0B,IAAI,OAAO;AAAA,IACrC,OAAO,KAAK;AAAA,IACZ,IAAI;AAAA,MACF,QAAQ,SAAS,sCAAsC;AAAA,MACvD,MAAM;AAAA,IAGR,MAAM;AAAA;AAAA;AAQV,eAAe,kBAAkB,CAAC,SAAqC;AAAA,EAErE,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyIb,QAAQ,SAAS,IAAI;AAAA;AAQvB,eAAe,yBAAyB,CAAC,SAAqC;AAAA,EAC5E,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkIb,QAAQ,SAAS,IAAI;AAAA;AAOvB,eAAe,SAAS,CAAC,SAAqC;AAAA,EAE5D,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAktBpB,QAAQ,SAAS,WAAW;AAAA;",
8
- "debugId": "58642E58B9C2142364756E2164756E21",
7
+ "mappings": "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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAktBpB,QAAQ,SAAS,WAAW;AAAA;",
8
+ "debugId": "074AB4608F283C7764756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,5 +1,5 @@
1
1
  // src/internal/crypto/index.ts
2
- import ivm from "isolated-vm";
2
+ import ivm from "@ricsam/isolated-vm";
3
3
  import crypto from "node:crypto";
4
4
  var cryptoKeysByContext = new WeakMap;
5
5
  var nextKeyId = 1;
@@ -403,4 +403,4 @@ export {
403
403
  setupCrypto
404
404
  };
405
405
 
406
- //# debugId=56846119A4CC968B64756E2164756E21
406
+ //# debugId=0B21DFAE8F92325664756E2164756E21