@ricsam/isolate 0.1.0 → 0.1.2

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 (240) hide show
  1. package/README.md +254 -0
  2. package/dist/cjs/bridge/diagnostics.cjs +2 -2
  3. package/dist/cjs/bridge/diagnostics.cjs.map +1 -1
  4. package/dist/cjs/bridge/legacy-adapters.cjs +2 -2
  5. package/dist/cjs/bridge/legacy-adapters.cjs.map +1 -1
  6. package/dist/cjs/bridge/request-context.cjs +2 -2
  7. package/dist/cjs/bridge/request-context.cjs.map +1 -1
  8. package/dist/cjs/bridge/runtime-bindings.cjs +2 -2
  9. package/dist/cjs/bridge/runtime-bindings.cjs.map +1 -1
  10. package/dist/cjs/browser/browser-runtime.cjs +2 -2
  11. package/dist/cjs/browser/browser-runtime.cjs.map +1 -1
  12. package/dist/cjs/daemon.cjs +2 -2
  13. package/dist/cjs/daemon.cjs.map +1 -1
  14. package/dist/cjs/files/index.cjs +2 -2
  15. package/dist/cjs/files/index.cjs.map +1 -1
  16. package/dist/cjs/host/create-isolate-host.cjs +4 -4
  17. package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
  18. package/dist/cjs/host/index.cjs +2 -2
  19. package/dist/cjs/host/index.cjs.map +1 -1
  20. package/dist/cjs/index.cjs +2 -2
  21. package/dist/cjs/index.cjs.map +1 -1
  22. package/dist/cjs/internal/client/connection.cjs +2 -2
  23. package/dist/cjs/internal/client/connection.cjs.map +1 -1
  24. package/dist/cjs/internal/client/index.cjs +2 -2
  25. package/dist/cjs/internal/client/index.cjs.map +1 -1
  26. package/dist/cjs/internal/client/types.cjs +2 -2
  27. package/dist/cjs/internal/client/types.cjs.map +1 -1
  28. package/dist/cjs/internal/console/index.cjs +2 -2
  29. package/dist/cjs/internal/console/index.cjs.map +1 -1
  30. package/dist/cjs/internal/console/utils.cjs +2 -2
  31. package/dist/cjs/internal/console/utils.cjs.map +1 -1
  32. package/dist/cjs/internal/core/index.cjs +2 -2
  33. package/dist/cjs/internal/core/index.cjs.map +1 -1
  34. package/dist/cjs/internal/crypto/index.cjs +2 -2
  35. package/dist/cjs/internal/crypto/index.cjs.map +1 -1
  36. package/dist/cjs/internal/daemon/callback-fs-handler.cjs +2 -2
  37. package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +1 -1
  38. package/dist/cjs/internal/daemon/connection.cjs +2 -2
  39. package/dist/cjs/internal/daemon/connection.cjs.map +1 -1
  40. package/dist/cjs/internal/daemon/daemon.cjs +2 -2
  41. package/dist/cjs/internal/daemon/daemon.cjs.map +1 -1
  42. package/dist/cjs/internal/daemon/index.cjs +2 -2
  43. package/dist/cjs/internal/daemon/index.cjs.map +1 -1
  44. package/dist/cjs/internal/daemon/runtime-pool.cjs +2 -2
  45. package/dist/cjs/internal/daemon/runtime-pool.cjs.map +1 -1
  46. package/dist/cjs/internal/daemon/types.cjs +2 -2
  47. package/dist/cjs/internal/daemon/types.cjs.map +1 -1
  48. package/dist/cjs/internal/encoding/index.cjs +2 -2
  49. package/dist/cjs/internal/encoding/index.cjs.map +1 -1
  50. package/dist/cjs/internal/fetch/consistency/origins.cjs +2 -2
  51. package/dist/cjs/internal/fetch/consistency/origins.cjs.map +1 -1
  52. package/dist/cjs/internal/fetch/index.cjs +2 -2
  53. package/dist/cjs/internal/fetch/index.cjs.map +1 -1
  54. package/dist/cjs/internal/fetch/stream-state.cjs +2 -2
  55. package/dist/cjs/internal/fetch/stream-state.cjs.map +1 -1
  56. package/dist/cjs/internal/fs/index.cjs +2 -2
  57. package/dist/cjs/internal/fs/index.cjs.map +1 -1
  58. package/dist/cjs/internal/fs/node-adapter.cjs +2 -2
  59. package/dist/cjs/internal/fs/node-adapter.cjs.map +1 -1
  60. package/dist/cjs/internal/module-loader/bundle.cjs +2 -2
  61. package/dist/cjs/internal/module-loader/bundle.cjs.map +1 -1
  62. package/dist/cjs/internal/module-loader/index.cjs +2 -2
  63. package/dist/cjs/internal/module-loader/index.cjs.map +1 -1
  64. package/dist/cjs/internal/module-loader/mappings.cjs +2 -2
  65. package/dist/cjs/internal/module-loader/mappings.cjs.map +1 -1
  66. package/dist/cjs/internal/module-loader/resolve.cjs +2 -2
  67. package/dist/cjs/internal/module-loader/resolve.cjs.map +1 -1
  68. package/dist/cjs/internal/module-loader/strip-types.cjs +2 -2
  69. package/dist/cjs/internal/module-loader/strip-types.cjs.map +1 -1
  70. package/dist/cjs/internal/path/index.cjs +2 -2
  71. package/dist/cjs/internal/path/index.cjs.map +1 -1
  72. package/dist/cjs/internal/playwright/client.cjs +2 -2
  73. package/dist/cjs/internal/playwright/client.cjs.map +1 -1
  74. package/dist/cjs/internal/playwright/handler.cjs +2 -2
  75. package/dist/cjs/internal/playwright/handler.cjs.map +1 -1
  76. package/dist/cjs/internal/playwright/index.cjs +2 -2
  77. package/dist/cjs/internal/playwright/index.cjs.map +1 -1
  78. package/dist/cjs/internal/playwright/types.cjs +2 -2
  79. package/dist/cjs/internal/playwright/types.cjs.map +1 -1
  80. package/dist/cjs/internal/protocol/codec.cjs +2 -2
  81. package/dist/cjs/internal/protocol/codec.cjs.map +1 -1
  82. package/dist/cjs/internal/protocol/framing.cjs +2 -2
  83. package/dist/cjs/internal/protocol/framing.cjs.map +1 -1
  84. package/dist/cjs/internal/protocol/index.cjs +2 -2
  85. package/dist/cjs/internal/protocol/index.cjs.map +1 -1
  86. package/dist/cjs/internal/protocol/marshalValue.cjs +2 -2
  87. package/dist/cjs/internal/protocol/marshalValue.cjs.map +1 -1
  88. package/dist/cjs/internal/protocol/serialization.cjs +2 -2
  89. package/dist/cjs/internal/protocol/serialization.cjs.map +1 -1
  90. package/dist/cjs/internal/protocol/types.cjs +2 -2
  91. package/dist/cjs/internal/protocol/types.cjs.map +1 -1
  92. package/dist/cjs/internal/runtime/index.cjs +2 -2
  93. package/dist/cjs/internal/runtime/index.cjs.map +1 -1
  94. package/dist/cjs/internal/server/index.cjs +2 -2
  95. package/dist/cjs/internal/server/index.cjs.map +1 -1
  96. package/dist/cjs/internal/test-environment/index.cjs +2 -2
  97. package/dist/cjs/internal/test-environment/index.cjs.map +1 -1
  98. package/dist/cjs/internal/timers/index.cjs +2 -2
  99. package/dist/cjs/internal/timers/index.cjs.map +1 -1
  100. package/dist/cjs/internal/transform/index.cjs +2 -2
  101. package/dist/cjs/internal/transform/index.cjs.map +1 -1
  102. package/dist/cjs/internal/typecheck/index.cjs +2 -2
  103. package/dist/cjs/internal/typecheck/index.cjs.map +1 -1
  104. package/dist/cjs/internal/typecheck/isolate-types.cjs +2 -2
  105. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +1 -1
  106. package/dist/cjs/internal/typecheck/typecheck.cjs +2 -2
  107. package/dist/cjs/internal/typecheck/typecheck.cjs.map +1 -1
  108. package/dist/cjs/modules/index.cjs +11 -4
  109. package/dist/cjs/modules/index.cjs.map +3 -3
  110. package/dist/cjs/package.json +1 -1
  111. package/dist/cjs/runtime/script-runtime.cjs +2 -2
  112. package/dist/cjs/runtime/script-runtime.cjs.map +1 -1
  113. package/dist/cjs/server/app-server.cjs +2 -2
  114. package/dist/cjs/server/app-server.cjs.map +1 -1
  115. package/dist/cjs/testing/integration-helpers.cjs +2 -2
  116. package/dist/cjs/testing/integration-helpers.cjs.map +1 -1
  117. package/dist/cjs/typecheck/index.cjs +2 -2
  118. package/dist/cjs/typecheck/index.cjs.map +1 -1
  119. package/dist/cjs/types.cjs +2 -2
  120. package/dist/cjs/types.cjs.map +1 -1
  121. package/dist/mjs/bridge/diagnostics.mjs +2 -2
  122. package/dist/mjs/bridge/diagnostics.mjs.map +1 -1
  123. package/dist/mjs/bridge/legacy-adapters.mjs +2 -2
  124. package/dist/mjs/bridge/legacy-adapters.mjs.map +1 -1
  125. package/dist/mjs/bridge/request-context.mjs +2 -2
  126. package/dist/mjs/bridge/request-context.mjs.map +1 -1
  127. package/dist/mjs/bridge/runtime-bindings.mjs +2 -2
  128. package/dist/mjs/bridge/runtime-bindings.mjs.map +1 -1
  129. package/dist/mjs/browser/browser-runtime.mjs +2 -2
  130. package/dist/mjs/browser/browser-runtime.mjs.map +1 -1
  131. package/dist/mjs/daemon.mjs +2 -2
  132. package/dist/mjs/daemon.mjs.map +1 -1
  133. package/dist/mjs/files/index.mjs +2 -2
  134. package/dist/mjs/files/index.mjs.map +1 -1
  135. package/dist/mjs/host/create-isolate-host.mjs +3 -3
  136. package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
  137. package/dist/mjs/host/index.mjs +2 -2
  138. package/dist/mjs/host/index.mjs.map +1 -1
  139. package/dist/mjs/index.mjs +2 -2
  140. package/dist/mjs/index.mjs.map +1 -1
  141. package/dist/mjs/internal/client/connection.mjs +2 -2
  142. package/dist/mjs/internal/client/connection.mjs.map +1 -1
  143. package/dist/mjs/internal/client/index.mjs +2 -2
  144. package/dist/mjs/internal/client/index.mjs.map +1 -1
  145. package/dist/mjs/internal/client/types.mjs +1 -1
  146. package/dist/mjs/internal/client/types.mjs.map +1 -1
  147. package/dist/mjs/internal/console/index.mjs +2 -2
  148. package/dist/mjs/internal/console/index.mjs.map +1 -1
  149. package/dist/mjs/internal/console/utils.mjs +2 -2
  150. package/dist/mjs/internal/console/utils.mjs.map +1 -1
  151. package/dist/mjs/internal/core/index.mjs +2 -2
  152. package/dist/mjs/internal/core/index.mjs.map +1 -1
  153. package/dist/mjs/internal/crypto/index.mjs +2 -2
  154. package/dist/mjs/internal/crypto/index.mjs.map +1 -1
  155. package/dist/mjs/internal/daemon/callback-fs-handler.mjs +2 -2
  156. package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +1 -1
  157. package/dist/mjs/internal/daemon/connection.mjs +2 -2
  158. package/dist/mjs/internal/daemon/connection.mjs.map +1 -1
  159. package/dist/mjs/internal/daemon/daemon.mjs +2 -2
  160. package/dist/mjs/internal/daemon/daemon.mjs.map +1 -1
  161. package/dist/mjs/internal/daemon/index.mjs +2 -2
  162. package/dist/mjs/internal/daemon/index.mjs.map +1 -1
  163. package/dist/mjs/internal/daemon/runtime-pool.mjs +2 -2
  164. package/dist/mjs/internal/daemon/runtime-pool.mjs.map +1 -1
  165. package/dist/mjs/internal/daemon/types.mjs +1 -1
  166. package/dist/mjs/internal/daemon/types.mjs.map +1 -1
  167. package/dist/mjs/internal/encoding/index.mjs +2 -2
  168. package/dist/mjs/internal/encoding/index.mjs.map +1 -1
  169. package/dist/mjs/internal/fetch/consistency/origins.mjs +2 -2
  170. package/dist/mjs/internal/fetch/consistency/origins.mjs.map +1 -1
  171. package/dist/mjs/internal/fetch/index.mjs +2 -2
  172. package/dist/mjs/internal/fetch/index.mjs.map +1 -1
  173. package/dist/mjs/internal/fetch/stream-state.mjs +2 -2
  174. package/dist/mjs/internal/fetch/stream-state.mjs.map +1 -1
  175. package/dist/mjs/internal/fs/index.mjs +2 -2
  176. package/dist/mjs/internal/fs/index.mjs.map +1 -1
  177. package/dist/mjs/internal/fs/node-adapter.mjs +2 -2
  178. package/dist/mjs/internal/fs/node-adapter.mjs.map +1 -1
  179. package/dist/mjs/internal/module-loader/bundle.mjs +2 -2
  180. package/dist/mjs/internal/module-loader/bundle.mjs.map +1 -1
  181. package/dist/mjs/internal/module-loader/index.mjs +2 -2
  182. package/dist/mjs/internal/module-loader/index.mjs.map +1 -1
  183. package/dist/mjs/internal/module-loader/mappings.mjs +2 -2
  184. package/dist/mjs/internal/module-loader/mappings.mjs.map +1 -1
  185. package/dist/mjs/internal/module-loader/resolve.mjs +2 -2
  186. package/dist/mjs/internal/module-loader/resolve.mjs.map +1 -1
  187. package/dist/mjs/internal/module-loader/strip-types.mjs +2 -2
  188. package/dist/mjs/internal/module-loader/strip-types.mjs.map +1 -1
  189. package/dist/mjs/internal/path/index.mjs +2 -2
  190. package/dist/mjs/internal/path/index.mjs.map +1 -1
  191. package/dist/mjs/internal/playwright/client.mjs +2 -2
  192. package/dist/mjs/internal/playwright/client.mjs.map +1 -1
  193. package/dist/mjs/internal/playwright/handler.mjs +2 -2
  194. package/dist/mjs/internal/playwright/handler.mjs.map +1 -1
  195. package/dist/mjs/internal/playwright/index.mjs +2 -2
  196. package/dist/mjs/internal/playwright/index.mjs.map +1 -1
  197. package/dist/mjs/internal/playwright/types.mjs +2 -2
  198. package/dist/mjs/internal/playwright/types.mjs.map +1 -1
  199. package/dist/mjs/internal/protocol/codec.mjs +2 -2
  200. package/dist/mjs/internal/protocol/codec.mjs.map +1 -1
  201. package/dist/mjs/internal/protocol/framing.mjs +2 -2
  202. package/dist/mjs/internal/protocol/framing.mjs.map +1 -1
  203. package/dist/mjs/internal/protocol/index.mjs +2 -2
  204. package/dist/mjs/internal/protocol/index.mjs.map +1 -1
  205. package/dist/mjs/internal/protocol/marshalValue.mjs +2 -2
  206. package/dist/mjs/internal/protocol/marshalValue.mjs.map +1 -1
  207. package/dist/mjs/internal/protocol/serialization.mjs +2 -2
  208. package/dist/mjs/internal/protocol/serialization.mjs.map +1 -1
  209. package/dist/mjs/internal/protocol/types.mjs +2 -2
  210. package/dist/mjs/internal/protocol/types.mjs.map +1 -1
  211. package/dist/mjs/internal/runtime/index.mjs +2 -2
  212. package/dist/mjs/internal/runtime/index.mjs.map +1 -1
  213. package/dist/mjs/internal/server/index.mjs +2 -2
  214. package/dist/mjs/internal/server/index.mjs.map +1 -1
  215. package/dist/mjs/internal/test-environment/index.mjs +2 -2
  216. package/dist/mjs/internal/test-environment/index.mjs.map +1 -1
  217. package/dist/mjs/internal/timers/index.mjs +2 -2
  218. package/dist/mjs/internal/timers/index.mjs.map +1 -1
  219. package/dist/mjs/internal/transform/index.mjs +2 -2
  220. package/dist/mjs/internal/transform/index.mjs.map +1 -1
  221. package/dist/mjs/internal/typecheck/index.mjs +2 -2
  222. package/dist/mjs/internal/typecheck/index.mjs.map +1 -1
  223. package/dist/mjs/internal/typecheck/isolate-types.mjs +2 -2
  224. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +1 -1
  225. package/dist/mjs/internal/typecheck/typecheck.mjs +2 -2
  226. package/dist/mjs/internal/typecheck/typecheck.mjs.map +1 -1
  227. package/dist/mjs/modules/index.mjs +11 -4
  228. package/dist/mjs/modules/index.mjs.map +3 -3
  229. package/dist/mjs/package.json +1 -1
  230. package/dist/mjs/runtime/script-runtime.mjs +2 -2
  231. package/dist/mjs/runtime/script-runtime.mjs.map +1 -1
  232. package/dist/mjs/server/app-server.mjs +2 -2
  233. package/dist/mjs/server/app-server.mjs.map +1 -1
  234. package/dist/mjs/testing/integration-helpers.mjs +2 -2
  235. package/dist/mjs/testing/integration-helpers.mjs.map +1 -1
  236. package/dist/mjs/typecheck/index.mjs +2 -2
  237. package/dist/mjs/typecheck/index.mjs.map +1 -1
  238. package/dist/mjs/types.mjs +1 -1
  239. package/dist/mjs/types.mjs.map +1 -1
  240. package/package.json +46 -38
@@ -5,6 +5,6 @@
5
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"
6
6
  ],
7
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,EAktBpB,QAAQ,SAAS,WAAW;AAAA;",
8
- "debugId": "57BC0FFB8A19AE2164756E2164756E21",
8
+ "debugId": "58642E58B9C2142364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
- // packages/isolate/src/internal/crypto/index.ts
1
+ // src/internal/crypto/index.ts
2
2
  import ivm from "isolated-vm";
3
3
  import crypto from "node:crypto";
4
4
  var cryptoKeysByContext = new WeakMap;
@@ -403,4 +403,4 @@ export {
403
403
  setupCrypto
404
404
  };
405
405
 
406
- //# debugId=115FDB623EDC182564756E2164756E21
406
+ //# debugId=56846119A4CC968B64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "import ivm from \"isolated-vm\";\nimport crypto from \"node:crypto\";\n\nexport interface CryptoHandle {\n dispose(): void;\n}\n\n// Host-side key storage for crypto.subtle\nconst cryptoKeysByContext = new WeakMap<ivm.Context, Map<number, crypto.webcrypto.CryptoKey>>();\nlet nextKeyId = 1;\n\nfunction getKeyMapForContext(context: ivm.Context): Map<number, crypto.webcrypto.CryptoKey> {\n let map = cryptoKeysByContext.get(context);\n if (!map) {\n map = new Map();\n cryptoKeysByContext.set(context, map);\n }\n return map;\n}\n\nfunction deserializeAlgorithm(algorithm: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(algorithm)) {\n if (value && typeof value === 'object' && !Array.isArray(value) &&\n Object.keys(value).every(k => /^\\d+$/.test(k))) {\n // Convert {\"0\": n, \"1\": m, ...} back to Uint8Array\n const length = Object.keys(value).length;\n const arr = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n arr[i] = (value as Record<string, number>)[String(i)] ?? 0;\n }\n result[key] = arr;\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * Setup Web Crypto API in an isolated-vm context\n *\n * Provides crypto.getRandomValues and crypto.randomUUID\n *\n * @example\n * const handle = await setupCrypto(context);\n * await context.eval(`\n * const uuid = crypto.randomUUID();\n * const array = new Uint8Array(16);\n * crypto.getRandomValues(array);\n * `);\n */\nexport async function setupCrypto(\n context: ivm.Context\n): Promise<CryptoHandle> {\n const global = context.global;\n\n // Register host callbacks\n global.setSync(\n \"__crypto_randomUUID\",\n new ivm.Callback(() => {\n return crypto.randomUUID();\n })\n );\n\n global.setSync(\n \"__crypto_getRandomValues\",\n new ivm.Callback((byteLength: number) => {\n const buffer = Buffer.alloc(byteLength);\n crypto.randomFillSync(buffer);\n return Array.from(buffer);\n })\n );\n\n // Get key map for this context\n const keyMap = getKeyMapForContext(context);\n\n // crypto.subtle.importKey - async reference\n const importKeyRef = new ivm.Reference(\n async (\n format: string,\n keyDataJson: string,\n algorithmJson: string,\n extractable: boolean,\n keyUsagesJson: string\n ) => {\n const keyData = JSON.parse(keyDataJson) as number[];\n const algorithm = JSON.parse(algorithmJson);\n const keyUsages = JSON.parse(keyUsagesJson) as crypto.webcrypto.KeyUsage[];\n\n try {\n let cryptoKey: crypto.webcrypto.CryptoKey;\n if (format === \"raw\") {\n const importData = new Uint8Array(keyData);\n cryptoKey = await crypto.webcrypto.subtle.importKey(\n \"raw\",\n importData,\n algorithm,\n extractable,\n keyUsages\n );\n } else if (format === \"jwk\") {\n const importData = keyData as unknown as crypto.webcrypto.JsonWebKey;\n cryptoKey = await crypto.webcrypto.subtle.importKey(\n \"jwk\",\n importData,\n algorithm,\n extractable,\n keyUsages\n );\n } else {\n throw new Error(`[NotSupportedError]Unsupported key format: ${format}`);\n }\n\n // Store key on host and return ID\n const keyId = nextKeyId++;\n keyMap.set(keyId, cryptoKey);\n return keyId;\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_importKey_ref\", importKeyRef);\n\n // crypto.subtle.sign - async reference\n const signRef = new ivm.Reference(\n async (algorithmJson: string, keyId: number, dataJson: string) => {\n const algorithm = JSON.parse(algorithmJson);\n const data = new Uint8Array(JSON.parse(dataJson) as number[]);\n\n const cryptoKey = keyMap.get(keyId);\n if (!cryptoKey) {\n throw new Error(\"[InvalidAccessError]Key not found\");\n }\n\n try {\n const signature = await crypto.webcrypto.subtle.sign(\n algorithm,\n cryptoKey,\n data\n );\n return JSON.stringify(Array.from(new Uint8Array(signature)));\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_sign_ref\", signRef);\n\n // crypto.subtle.verify - async reference\n const verifyRef = new ivm.Reference(\n async (\n algorithmJson: string,\n keyId: number,\n signatureJson: string,\n dataJson: string\n ) => {\n const algorithm = JSON.parse(algorithmJson);\n const signature = new Uint8Array(JSON.parse(signatureJson) as number[]);\n const data = new Uint8Array(JSON.parse(dataJson) as number[]);\n\n const cryptoKey = keyMap.get(keyId);\n if (!cryptoKey) {\n throw new Error(\"[InvalidAccessError]Key not found\");\n }\n\n try {\n return await crypto.webcrypto.subtle.verify(\n algorithm,\n cryptoKey,\n signature,\n data\n );\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_verify_ref\", verifyRef);\n\n // crypto.subtle.digest - async reference\n const digestRef = new ivm.Reference(\n async (algorithmJson: string, dataJson: string) => {\n const algorithm = JSON.parse(algorithmJson);\n const data = new Uint8Array(JSON.parse(dataJson) as number[]);\n\n try {\n const hash = await crypto.webcrypto.subtle.digest(algorithm, data);\n return JSON.stringify(Array.from(new Uint8Array(hash)));\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_digest_ref\", digestRef);\n\n // crypto.subtle.deriveBits - async reference\n const deriveBitsRef = new ivm.Reference(\n async (algorithmJson: string, keyId: number, length: number) => {\n const algorithm = deserializeAlgorithm(JSON.parse(algorithmJson));\n\n const cryptoKey = keyMap.get(keyId);\n if (!cryptoKey) {\n throw new Error(\"[InvalidAccessError]Key not found\");\n }\n\n try {\n const bits = await crypto.webcrypto.subtle.deriveBits(\n algorithm as unknown as crypto.webcrypto.EcdhKeyDeriveParams | crypto.webcrypto.HkdfParams | crypto.webcrypto.Pbkdf2Params,\n cryptoKey,\n length\n );\n return JSON.stringify(Array.from(new Uint8Array(bits)));\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_deriveBits_ref\", deriveBitsRef);\n\n // crypto.subtle.deriveKey - async reference\n const deriveKeyRef = new ivm.Reference(\n async (\n algorithmJson: string,\n baseKeyId: number,\n derivedKeyAlgorithmJson: string,\n extractable: boolean,\n keyUsagesJson: string\n ) => {\n const algorithm = deserializeAlgorithm(JSON.parse(algorithmJson));\n const derivedKeyAlgorithm = JSON.parse(derivedKeyAlgorithmJson);\n const keyUsages = JSON.parse(keyUsagesJson) as crypto.webcrypto.KeyUsage[];\n\n const baseKey = keyMap.get(baseKeyId);\n if (!baseKey) {\n throw new Error(\"[InvalidAccessError]Key not found\");\n }\n\n try {\n const derivedKey = await crypto.webcrypto.subtle.deriveKey(\n algorithm as unknown as crypto.webcrypto.EcdhKeyDeriveParams | crypto.webcrypto.HkdfParams | crypto.webcrypto.Pbkdf2Params,\n baseKey,\n derivedKeyAlgorithm,\n extractable,\n keyUsages\n );\n\n // Store derived key on host and return ID\n const keyId = nextKeyId++;\n keyMap.set(keyId, derivedKey);\n return keyId;\n } catch (err) {\n if (err instanceof Error) {\n throw new Error(`[${err.name}]${err.message}`);\n }\n throw err;\n }\n }\n );\n global.setSync(\"__crypto_subtle_deriveKey_ref\", deriveKeyRef);\n\n // Inject the crypto object into the isolate\n const cryptoCode = `\n(function() {\n // DOMException polyfill (Pattern #12)\n if (typeof DOMException === 'undefined') {\n globalThis.DOMException = class DOMException extends Error {\n constructor(message, name) {\n super(message);\n this.name = name || 'DOMException';\n }\n };\n }\n\n // Helper to decode error from host\n function __decodeError(err) {\n if (!(err instanceof Error)) return err;\n const match = err.message.match(/^\\\\[(TypeError|RangeError|NotSupportedError|InvalidAccessError|OperationError|DataError|Error)\\\\](.*)$/);\n if (match) {\n if (['NotSupportedError', 'InvalidAccessError', 'OperationError', 'DataError'].includes(match[1])) {\n return new DOMException(match[2], match[1]);\n }\n const ErrorType = globalThis[match[1]] || Error;\n return new ErrorType(match[2]);\n }\n return err;\n }\n\n // CryptoKey class to wrap key IDs\n const _cryptoKeyIds = new WeakMap();\n\n class CryptoKey {\n constructor(keyId, algorithm, extractable, usages, type) {\n _cryptoKeyIds.set(this, keyId);\n this._algorithm = algorithm;\n this._extractable = extractable;\n this._usages = usages;\n this._type = type || 'secret';\n }\n\n _getKeyId() {\n return _cryptoKeyIds.get(this);\n }\n\n get algorithm() {\n return this._algorithm;\n }\n\n get extractable() {\n return this._extractable;\n }\n\n get usages() {\n return [...this._usages];\n }\n\n get type() {\n return this._type;\n }\n }\n\n globalThis.CryptoKey = CryptoKey;\n\n // Helper to convert data to byte array\n function toByteArray(data) {\n if (typeof data === 'string') {\n return Array.from(new TextEncoder().encode(data));\n }\n if (data instanceof ArrayBuffer) {\n return Array.from(new Uint8Array(data));\n }\n if (ArrayBuffer.isView(data)) {\n return Array.from(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));\n }\n throw new TypeError('Data must be a BufferSource');\n }\n\n // Normalize algorithm to object form\n function normalizeAlgorithm(algorithm) {\n if (typeof algorithm === 'string') {\n return { name: algorithm };\n }\n return algorithm;\n }\n\n globalThis.crypto = {\n randomUUID() {\n return __crypto_randomUUID();\n },\n\n getRandomValues(typedArray) {\n // Validate input is an integer TypedArray\n if (!(typedArray instanceof Int8Array ||\n typedArray instanceof Uint8Array ||\n typedArray instanceof Uint8ClampedArray ||\n typedArray instanceof Int16Array ||\n typedArray instanceof Uint16Array ||\n typedArray instanceof Int32Array ||\n typedArray instanceof Uint32Array ||\n typedArray instanceof BigInt64Array ||\n typedArray instanceof BigUint64Array)) {\n throw new TypeError(\"Argument 1 must be an integer typed array\");\n }\n\n const byteLength = typedArray.byteLength;\n if (byteLength > 65536) {\n throw new DOMException(\n \"The ArrayBufferView's byte length exceeds the number of bytes of entropy available via this API (65536)\",\n \"QuotaExceededError\"\n );\n }\n\n // Get random bytes from host\n const bytes = __crypto_getRandomValues(byteLength);\n\n // Copy bytes into the TypedArray\n const view = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);\n for (let i = 0; i < bytes.length; i++) {\n view[i] = bytes[i];\n }\n\n return typedArray;\n },\n\n subtle: {\n async importKey(format, keyData, algorithm, extractable, keyUsages) {\n try {\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n let keyDataJson;\n\n if (format === 'raw') {\n keyDataJson = JSON.stringify(toByteArray(keyData));\n } else if (format === 'jwk') {\n keyDataJson = JSON.stringify(keyData);\n } else {\n throw new DOMException('Unsupported key format: ' + format, 'NotSupportedError');\n }\n\n const keyId = await __crypto_subtle_importKey_ref.apply(undefined, [\n format,\n keyDataJson,\n JSON.stringify(normalizedAlgo),\n extractable,\n JSON.stringify(keyUsages)\n ], { result: { promise: true, copy: true } });\n\n return new CryptoKey(keyId, normalizedAlgo, extractable, keyUsages);\n } catch (err) {\n throw __decodeError(err);\n }\n },\n\n async sign(algorithm, key, data) {\n try {\n if (!(key instanceof CryptoKey)) {\n throw new TypeError('Key must be a CryptoKey');\n }\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n const signatureBytesJson = await __crypto_subtle_sign_ref.apply(undefined, [\n JSON.stringify(normalizedAlgo),\n key._getKeyId(),\n JSON.stringify(toByteArray(data))\n ], { result: { promise: true, copy: true } });\n const signatureBytes = JSON.parse(signatureBytesJson);\n return new Uint8Array(signatureBytes).buffer;\n } catch (err) {\n throw __decodeError(err);\n }\n },\n\n async verify(algorithm, key, signature, data) {\n try {\n if (!(key instanceof CryptoKey)) {\n throw new TypeError('Key must be a CryptoKey');\n }\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n return await __crypto_subtle_verify_ref.apply(undefined, [\n JSON.stringify(normalizedAlgo),\n key._getKeyId(),\n JSON.stringify(toByteArray(signature)),\n JSON.stringify(toByteArray(data))\n ], { result: { promise: true, copy: true } });\n } catch (err) {\n throw __decodeError(err);\n }\n },\n\n async digest(algorithm, data) {\n try {\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n const hashBytesJson = await __crypto_subtle_digest_ref.apply(undefined, [\n JSON.stringify(normalizedAlgo),\n JSON.stringify(toByteArray(data))\n ], { result: { promise: true, copy: true } });\n const hashBytes = JSON.parse(hashBytesJson);\n return new Uint8Array(hashBytes).buffer;\n } catch (err) {\n throw __decodeError(err);\n }\n },\n\n async deriveBits(algorithm, baseKey, length) {\n try {\n if (!(baseKey instanceof CryptoKey)) {\n throw new TypeError('Key must be a CryptoKey');\n }\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n const bitsBytesJson = await __crypto_subtle_deriveBits_ref.apply(undefined, [\n JSON.stringify(normalizedAlgo),\n baseKey._getKeyId(),\n length\n ], { result: { promise: true, copy: true } });\n const bitsBytes = JSON.parse(bitsBytesJson);\n return new Uint8Array(bitsBytes).buffer;\n } catch (err) {\n throw __decodeError(err);\n }\n },\n\n async deriveKey(algorithm, baseKey, derivedKeyAlgorithm, extractable, keyUsages) {\n try {\n if (!(baseKey instanceof CryptoKey)) {\n throw new TypeError('Key must be a CryptoKey');\n }\n const normalizedAlgo = normalizeAlgorithm(algorithm);\n const normalizedDerivedAlgo = normalizeAlgorithm(derivedKeyAlgorithm);\n const keyId = await __crypto_subtle_deriveKey_ref.apply(undefined, [\n JSON.stringify(normalizedAlgo),\n baseKey._getKeyId(),\n JSON.stringify(normalizedDerivedAlgo),\n extractable,\n JSON.stringify(keyUsages)\n ], { result: { promise: true, copy: true } });\n return new CryptoKey(keyId, normalizedDerivedAlgo, extractable, keyUsages);\n } catch (err) {\n throw __decodeError(err);\n }\n }\n }\n };\n})();\n`;\n\n context.evalSync(cryptoCode);\n\n return {\n dispose() {\n // Clean up key storage for this context\n keyMap.clear();\n },\n };\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "115FDB623EDC182564756E2164756E21",
8
+ "debugId": "56846119A4CC968B64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
- // packages/isolate/src/internal/daemon/callback-fs-handler.ts
1
+ // src/internal/daemon/callback-fs-handler.ts
2
2
  var MIME_TYPES = {
3
3
  txt: "text/plain",
4
4
  html: "text/html",
@@ -312,4 +312,4 @@ export {
312
312
  createCallbackFileSystemHandler
313
313
  };
314
314
 
315
- //# debugId=91DFC141BCEBB47364756E2164756E21
315
+ //# debugId=FDD436071BC937A064756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "/**\n * Callback-based FileSystemHandler adapter.\n *\n * Adapts simple client callbacks (readFile, writeFile, etc.) to the\n * FileSystemHandler interface used by ../fs/index.ts.\n */\n\nimport type { FileSystemHandler } from \"../fs/index.mjs\";\nimport type { ConnectionState, CallbackContext } from \"./types.mjs\";\n\n/** Common MIME type mappings by file extension. */\nconst MIME_TYPES: Record<string, string> = {\n txt: \"text/plain\",\n html: \"text/html\",\n htm: \"text/html\",\n css: \"text/css\",\n js: \"text/javascript\",\n json: \"application/json\",\n xml: \"application/xml\",\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n svg: \"image/svg+xml\",\n pdf: \"application/pdf\",\n};\n\ninterface InvokeClientCallback {\n (\n connection: ConnectionState,\n callbackId: number,\n args: unknown[],\n options?: { signal?: AbortSignal },\n ): Promise<unknown>;\n}\n\ninterface CallbackFsHandlerOptions {\n connection: ConnectionState;\n callbackContext: CallbackContext;\n invokeClientCallback: InvokeClientCallback;\n basePath?: string;\n getSignal?: () => AbortSignal | undefined;\n}\n\n/**\n * Create a FileSystemHandler that invokes client callbacks.\n *\n * Maps WHATWG FileSystem API operations to simple POSIX-like callbacks.\n * Uses callbackContext for dynamic callback ID lookup to support runtime reuse.\n */\nexport function createCallbackFileSystemHandler(\n options: CallbackFsHandlerOptions\n): FileSystemHandler {\n const {\n connection,\n callbackContext,\n invokeClientCallback,\n basePath = \"\",\n getSignal,\n } = options;\n\n const resolvePath = (path: string): string => {\n // Remove leading slash from the path\n const cleanPath = path.startsWith(\"/\") ? path.slice(1) : path;\n // Handle root case\n if (!basePath || basePath === \"/\") {\n return `/${cleanPath}`;\n }\n // Remove trailing slash from basePath\n const cleanBase = basePath.endsWith(\"/\") ? basePath.slice(0, -1) : basePath;\n return `${cleanBase}/${cleanPath}`;\n };\n\n // Helper to get current callback ID (supports runtime reuse)\n const getCallbackId = (name: keyof CallbackContext[\"fs\"]): number | undefined => {\n return callbackContext.fs[name];\n };\n\n // Helper to get current connection (supports runtime reuse and reconnection)\n const getConnection = async (): Promise<ConnectionState> => {\n if (callbackContext.connection) {\n return callbackContext.connection;\n }\n if (callbackContext.reconnectionPromise) {\n return callbackContext.reconnectionPromise.promise;\n }\n // Fall back to the originally captured connection\n return connection;\n };\n\n const invokeFsCallback = async (\n conn: ConnectionState,\n callbackId: number,\n args: unknown[],\n ): Promise<unknown> => {\n return invokeClientCallback(conn, callbackId, args, {\n signal: getSignal?.(),\n });\n };\n\n return {\n async getFileHandle(path: string, opts?: { create?: boolean }): Promise<void> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n if (opts?.create) {\n // Ensure file exists by writing empty content if it doesn't exist\n const writeFileId = getCallbackId(\"writeFile\");\n if (writeFileId !== undefined) {\n try {\n // Check if file exists first\n const statId = getCallbackId(\"stat\");\n if (statId !== undefined) {\n try {\n await invokeFsCallback(conn, statId, [fullPath]);\n // File exists, nothing to do\n return;\n } catch {\n // File doesn't exist, create it\n }\n }\n // Create empty file\n await invokeFsCallback(conn, writeFileId, [\n fullPath,\n new Uint8Array(0),\n ]);\n } catch (err) {\n const error = err as Error;\n throw new Error(`[NotFoundError]${error.message}`);\n }\n }\n return;\n }\n\n // Check file exists\n const statId = getCallbackId(\"stat\");\n if (statId !== undefined) {\n try {\n const result = (await invokeFsCallback(conn, statId, [\n fullPath,\n ])) as { isFile: boolean };\n if (!result.isFile) {\n throw new Error(`[TypeMismatchError]Not a file: ${fullPath}`);\n }\n } catch (err) {\n const error = err as Error;\n if (error.message.includes(\"TypeMismatchError\")) throw error;\n throw new Error(`[NotFoundError]File not found: ${fullPath}`);\n }\n }\n },\n\n async getDirectoryHandle(path: string, opts?: { create?: boolean }): Promise<void> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n if (opts?.create) {\n const mkdirId = getCallbackId(\"mkdir\");\n if (mkdirId !== undefined) {\n try {\n await invokeFsCallback(conn, mkdirId, [\n fullPath,\n { recursive: true },\n ]);\n } catch {\n // Ignore error if directory already exists\n }\n }\n return;\n }\n\n // Check directory exists\n const statId = getCallbackId(\"stat\");\n if (statId !== undefined) {\n try {\n const result = (await invokeFsCallback(conn, statId, [\n fullPath,\n ])) as { isDirectory: boolean };\n if (!result.isDirectory) {\n throw new Error(`[TypeMismatchError]Not a directory: ${fullPath}`);\n }\n } catch (err) {\n const error = err as Error;\n if (error.message.includes(\"TypeMismatchError\")) throw error;\n throw new Error(`[NotFoundError]Directory not found: ${fullPath}`);\n }\n }\n },\n\n async removeEntry(path: string, opts?: { recursive?: boolean }): Promise<void> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n // Check if it's a file or directory\n let isFile = true;\n const statId = getCallbackId(\"stat\");\n if (statId !== undefined) {\n try {\n const result = (await invokeFsCallback(conn, statId, [\n fullPath,\n ])) as { isFile: boolean; isDirectory: boolean };\n isFile = result.isFile;\n } catch {\n throw new Error(`[NotFoundError]Entry not found: ${fullPath}`);\n }\n }\n\n if (isFile) {\n const unlinkId = getCallbackId(\"unlink\");\n if (unlinkId === undefined) {\n throw new Error(`[NotAllowedError]File deletion not supported`);\n }\n await invokeFsCallback(conn, unlinkId, [fullPath]);\n } else {\n const rmdirId = getCallbackId(\"rmdir\");\n if (rmdirId === undefined) {\n throw new Error(`[NotAllowedError]Directory deletion not supported`);\n }\n // Note: recursive option may need special handling\n await invokeFsCallback(conn, rmdirId, [fullPath]);\n }\n },\n\n async readDirectory(\n path: string\n ): Promise<Array<{ name: string; kind: \"file\" | \"directory\" }>> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n const readdirId = getCallbackId(\"readdir\");\n if (readdirId === undefined) {\n throw new Error(`[NotAllowedError]Directory reading not supported`);\n }\n\n const entries = (await invokeFsCallback(conn, readdirId, [\n fullPath,\n ])) as string[];\n\n // We need to stat each entry to determine if it's a file or directory\n const result: Array<{ name: string; kind: \"file\" | \"directory\" }> = [];\n\n const statId = getCallbackId(\"stat\");\n for (const name of entries) {\n const entryPath = fullPath ? `${fullPath}/${name}` : name;\n let kind: \"file\" | \"directory\" = \"file\";\n\n if (statId !== undefined) {\n try {\n const stat = (await invokeFsCallback(conn, statId, [\n entryPath,\n ])) as { isFile: boolean; isDirectory: boolean };\n kind = stat.isDirectory ? \"directory\" : \"file\";\n } catch {\n // Default to file if stat fails\n }\n }\n\n result.push({ name, kind });\n }\n\n return result;\n },\n\n async readFile(\n path: string\n ): Promise<{ data: Uint8Array; size: number; lastModified: number; type: string }> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n const readFileId = getCallbackId(\"readFile\");\n if (readFileId === undefined) {\n throw new Error(`[NotAllowedError]File reading not supported`);\n }\n\n const data = (await invokeFsCallback(conn, readFileId, [\n fullPath,\n ])) as Uint8Array | ArrayBuffer | number[];\n\n // Convert to Uint8Array if needed\n let bytes: Uint8Array;\n if (data instanceof Uint8Array) {\n bytes = data;\n } else if (Array.isArray(data)) {\n bytes = new Uint8Array(data);\n } else if (data instanceof ArrayBuffer) {\n bytes = new Uint8Array(data);\n } else {\n bytes = new Uint8Array(0);\n }\n\n // Get metadata if stat is available\n let size = bytes.length;\n let lastModified = Date.now();\n\n const statId = getCallbackId(\"stat\");\n if (statId !== undefined) {\n try {\n const stat = (await invokeFsCallback(conn, statId, [\n fullPath,\n ])) as { size: number; lastModified?: number };\n size = stat.size;\n if (stat.lastModified) {\n lastModified = stat.lastModified;\n }\n } catch {\n // Use byte length as fallback\n }\n }\n\n // Determine MIME type from extension\n const ext = path.split(\".\").pop()?.toLowerCase() || \"\";\n const type = MIME_TYPES[ext] || \"application/octet-stream\";\n\n return { data: bytes, size, lastModified, type };\n },\n\n async writeFile(path: string, data: Uint8Array, position?: number): Promise<void> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n const writeFileId = getCallbackId(\"writeFile\");\n if (writeFileId === undefined) {\n throw new Error(`[NotAllowedError]File writing not supported`);\n }\n\n // Note: position parameter for partial writes may need special handling\n // Simple implementation overwrites entire file\n if (position !== undefined && position > 0) {\n // For positional writes, we need to read existing content and merge\n const readFileId = getCallbackId(\"readFile\");\n if (readFileId !== undefined) {\n try {\n const existing = (await invokeFsCallback(\n conn,\n readFileId,\n [fullPath]\n )) as Uint8Array | ArrayBuffer | number[];\n\n let existingBytes: Uint8Array;\n if (existing instanceof Uint8Array) {\n existingBytes = existing;\n } else if (Array.isArray(existing)) {\n existingBytes = new Uint8Array(existing);\n } else if (existing instanceof ArrayBuffer) {\n existingBytes = new Uint8Array(existing);\n } else {\n existingBytes = new Uint8Array(0);\n }\n\n // Create merged buffer\n const newSize = Math.max(existingBytes.length, position + data.length);\n const merged = new Uint8Array(newSize);\n merged.set(existingBytes);\n merged.set(data, position);\n\n await invokeFsCallback(conn, writeFileId, [\n fullPath,\n merged,\n ]);\n return;\n } catch {\n // File doesn't exist, create new one at position\n const newData = new Uint8Array(position + data.length);\n newData.set(data, position);\n await invokeFsCallback(conn, writeFileId, [\n fullPath,\n newData,\n ]);\n return;\n }\n }\n }\n\n await invokeFsCallback(conn, writeFileId, [fullPath, data]);\n },\n\n async truncateFile(path: string, size: number): Promise<void> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n const readFileId = getCallbackId(\"readFile\");\n const writeFileId = getCallbackId(\"writeFile\");\n if (readFileId === undefined || writeFileId === undefined) {\n throw new Error(`[NotAllowedError]File truncation not supported`);\n }\n\n // Read existing content\n const existing = (await invokeFsCallback(conn, readFileId, [\n fullPath,\n ])) as Uint8Array | ArrayBuffer | number[];\n\n let existingBytes: Uint8Array;\n if (existing instanceof Uint8Array) {\n existingBytes = existing;\n } else if (Array.isArray(existing)) {\n existingBytes = new Uint8Array(existing);\n } else if (existing instanceof ArrayBuffer) {\n existingBytes = new Uint8Array(existing);\n } else {\n existingBytes = new Uint8Array(0);\n }\n\n // Create truncated buffer\n const truncated = new Uint8Array(size);\n truncated.set(existingBytes.slice(0, size));\n\n await invokeFsCallback(conn, writeFileId, [fullPath, truncated]);\n },\n\n async getFileMetadata(\n path: string\n ): Promise<{ size: number; lastModified: number; type: string }> {\n const fullPath = resolvePath(path);\n const conn = await getConnection();\n\n const statId = getCallbackId(\"stat\");\n if (statId === undefined) {\n throw new Error(`[NotAllowedError]File stat not supported`);\n }\n\n const stat = (await invokeFsCallback(conn, statId, [\n fullPath,\n ])) as { size: number; lastModified?: number; isFile: boolean };\n\n if (!stat.isFile) {\n throw new Error(`[TypeMismatchError]Not a file: ${fullPath}`);\n }\n\n // Determine MIME type from extension\n const ext = path.split(\".\").pop()?.toLowerCase() || \"\";\n const type = MIME_TYPES[ext] || \"application/octet-stream\";\n\n return {\n size: stat.size,\n lastModified: stat.lastModified ?? Date.now(),\n type,\n };\n },\n };\n}\n"
6
6
  ],
7
7
  "mappings": "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",
8
- "debugId": "91DFC141BCEBB47364756E2164756E21",
8
+ "debugId": "FDD436071BC937A064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
- // packages/isolate/src/internal/daemon/connection.ts
1
+ // src/internal/daemon/connection.ts
2
2
  import { AsyncLocalStorage } from "node:async_hooks";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import {
@@ -1928,4 +1928,4 @@ export {
1928
1928
  handleConnection
1929
1929
  };
1930
1930
 
1931
- //# debugId=78A3EC3AE30EE54564756E2164756E21
1931
+ //# debugId=821596E06E80F8D064756E2164756E21