@ricsam/isolate 0.1.10 → 0.1.12

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 (140) hide show
  1. package/README.md +257 -18
  2. package/dist/cjs/bridge/diagnostics.cjs +37 -2
  3. package/dist/cjs/bridge/diagnostics.cjs.map +3 -3
  4. package/dist/cjs/bridge/runtime-bindings.cjs +230 -51
  5. package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
  6. package/dist/cjs/bridge/sandbox-isolate.cjs +464 -0
  7. package/dist/cjs/bridge/sandbox-isolate.cjs.map +10 -0
  8. package/dist/cjs/host/create-isolate-host.cjs +130 -25
  9. package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
  10. package/dist/cjs/host/nested-host-controller.cjs +369 -0
  11. package/dist/cjs/host/nested-host-controller.cjs.map +10 -0
  12. package/dist/cjs/index.cjs.map +1 -1
  13. package/dist/cjs/internal/browser-source.cjs +102 -0
  14. package/dist/cjs/internal/browser-source.cjs.map +10 -0
  15. package/dist/cjs/internal/client/connection.cjs +163 -172
  16. package/dist/cjs/internal/client/connection.cjs.map +3 -3
  17. package/dist/cjs/internal/daemon/callback-fs-handler.cjs +3 -3
  18. package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +3 -3
  19. package/dist/cjs/internal/daemon/connection.cjs +156 -13
  20. package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
  21. package/dist/cjs/internal/playwright/client.cjs +4 -2
  22. package/dist/cjs/internal/playwright/client.cjs.map +3 -3
  23. package/dist/cjs/internal/playwright/handler.cjs +298 -25
  24. package/dist/cjs/internal/playwright/handler.cjs.map +3 -3
  25. package/dist/cjs/internal/playwright/index.cjs +54 -8
  26. package/dist/cjs/internal/playwright/index.cjs.map +3 -3
  27. package/dist/cjs/internal/playwright/types.cjs +3 -1
  28. package/dist/cjs/internal/playwright/types.cjs.map +3 -3
  29. package/dist/cjs/internal/protocol/codec.cjs +16 -5
  30. package/dist/cjs/internal/protocol/codec.cjs.map +3 -3
  31. package/dist/cjs/internal/protocol/marshalValue.cjs +37 -6
  32. package/dist/cjs/internal/protocol/marshalValue.cjs.map +3 -3
  33. package/dist/cjs/internal/protocol/types.cjs +2 -1
  34. package/dist/cjs/internal/protocol/types.cjs.map +3 -3
  35. package/dist/cjs/internal/runtime/index.cjs +377 -22
  36. package/dist/cjs/internal/runtime/index.cjs.map +3 -3
  37. package/dist/cjs/internal/typecheck/index.cjs +2 -1
  38. package/dist/cjs/internal/typecheck/index.cjs.map +3 -3
  39. package/dist/cjs/internal/typecheck/isolate-types.cjs +218 -13
  40. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
  41. package/dist/cjs/internal/typecheck/typecheck.cjs +2 -3
  42. package/dist/cjs/internal/typecheck/typecheck.cjs.map +3 -3
  43. package/dist/cjs/package.json +1 -1
  44. package/dist/cjs/playwright.cjs +76 -0
  45. package/dist/cjs/playwright.cjs.map +10 -0
  46. package/dist/cjs/runtime/namespaced-runtime.cjs +181 -0
  47. package/dist/cjs/runtime/namespaced-runtime.cjs.map +10 -0
  48. package/dist/cjs/runtime/script-runtime.cjs +14 -12
  49. package/dist/cjs/runtime/script-runtime.cjs.map +3 -3
  50. package/dist/cjs/runtime/test-runtime.cjs +113 -0
  51. package/dist/cjs/runtime/test-runtime.cjs.map +10 -0
  52. package/dist/cjs/server/app-server.cjs +16 -9
  53. package/dist/cjs/server/app-server.cjs.map +3 -3
  54. package/dist/cjs/typecheck/index.cjs +2 -1
  55. package/dist/cjs/typecheck/index.cjs.map +3 -3
  56. package/dist/mjs/bridge/diagnostics.mjs +37 -2
  57. package/dist/mjs/bridge/diagnostics.mjs.map +3 -3
  58. package/dist/mjs/bridge/runtime-bindings.mjs +233 -51
  59. package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
  60. package/dist/mjs/bridge/sandbox-isolate.mjs +424 -0
  61. package/dist/mjs/bridge/sandbox-isolate.mjs.map +10 -0
  62. package/dist/mjs/host/create-isolate-host.mjs +132 -25
  63. package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
  64. package/dist/mjs/host/nested-host-controller.mjs +333 -0
  65. package/dist/mjs/host/nested-host-controller.mjs.map +10 -0
  66. package/dist/mjs/index.mjs.map +1 -1
  67. package/dist/mjs/internal/browser-source.mjs +62 -0
  68. package/dist/mjs/internal/browser-source.mjs.map +10 -0
  69. package/dist/mjs/internal/client/connection.mjs +165 -173
  70. package/dist/mjs/internal/client/connection.mjs.map +3 -3
  71. package/dist/mjs/internal/daemon/callback-fs-handler.mjs +3 -3
  72. package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +3 -3
  73. package/dist/mjs/internal/daemon/connection.mjs +156 -13
  74. package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
  75. package/dist/mjs/internal/playwright/client.mjs +7 -3
  76. package/dist/mjs/internal/playwright/client.mjs.map +3 -3
  77. package/dist/mjs/internal/playwright/handler.mjs +300 -26
  78. package/dist/mjs/internal/playwright/handler.mjs.map +3 -3
  79. package/dist/mjs/internal/playwright/index.mjs +59 -9
  80. package/dist/mjs/internal/playwright/index.mjs.map +3 -3
  81. package/dist/mjs/internal/playwright/types.mjs +3 -1
  82. package/dist/mjs/internal/playwright/types.mjs.map +3 -3
  83. package/dist/mjs/internal/protocol/codec.mjs +16 -5
  84. package/dist/mjs/internal/protocol/codec.mjs.map +3 -3
  85. package/dist/mjs/internal/protocol/marshalValue.mjs +38 -6
  86. package/dist/mjs/internal/protocol/marshalValue.mjs.map +3 -3
  87. package/dist/mjs/internal/protocol/types.mjs +2 -1
  88. package/dist/mjs/internal/protocol/types.mjs.map +3 -3
  89. package/dist/mjs/internal/runtime/index.mjs +377 -22
  90. package/dist/mjs/internal/runtime/index.mjs.map +3 -3
  91. package/dist/mjs/internal/typecheck/index.mjs +3 -1
  92. package/dist/mjs/internal/typecheck/index.mjs.map +3 -3
  93. package/dist/mjs/internal/typecheck/isolate-types.mjs +218 -13
  94. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
  95. package/dist/mjs/internal/typecheck/typecheck.mjs +2 -3
  96. package/dist/mjs/internal/typecheck/typecheck.mjs.map +3 -3
  97. package/dist/mjs/package.json +1 -1
  98. package/dist/mjs/playwright.mjs +47 -0
  99. package/dist/mjs/playwright.mjs.map +10 -0
  100. package/dist/mjs/runtime/namespaced-runtime.mjs +143 -0
  101. package/dist/mjs/runtime/namespaced-runtime.mjs.map +10 -0
  102. package/dist/mjs/runtime/script-runtime.mjs +16 -12
  103. package/dist/mjs/runtime/script-runtime.mjs.map +3 -3
  104. package/dist/mjs/runtime/test-runtime.mjs +78 -0
  105. package/dist/mjs/runtime/test-runtime.mjs.map +10 -0
  106. package/dist/mjs/server/app-server.mjs +23 -11
  107. package/dist/mjs/server/app-server.mjs.map +3 -3
  108. package/dist/mjs/typecheck/index.mjs +2 -1
  109. package/dist/mjs/typecheck/index.mjs.map +3 -3
  110. package/dist/types/bridge/diagnostics.d.ts +6 -1
  111. package/dist/types/bridge/runtime-bindings.d.ts +5 -1
  112. package/dist/types/bridge/sandbox-isolate.d.ts +21 -0
  113. package/dist/types/host/nested-host-controller.d.ts +15 -0
  114. package/dist/types/index.d.ts +1 -1
  115. package/dist/types/internal/browser-source.d.ts +10 -0
  116. package/dist/types/internal/client/types.d.ts +9 -0
  117. package/dist/types/internal/daemon/types.d.ts +0 -2
  118. package/dist/types/internal/playwright/client.d.ts +2 -2
  119. package/dist/types/internal/playwright/handler.d.ts +27 -4
  120. package/dist/types/internal/playwright/index.d.ts +2 -2
  121. package/dist/types/internal/playwright/types.d.ts +33 -1
  122. package/dist/types/internal/protocol/codec.d.ts +12 -2
  123. package/dist/types/internal/protocol/marshalValue.d.ts +3 -2
  124. package/dist/types/internal/protocol/types.d.ts +33 -2
  125. package/dist/types/internal/runtime/index.d.ts +5 -0
  126. package/dist/types/internal/typecheck/index.d.ts +1 -1
  127. package/dist/types/internal/typecheck/isolate-types.d.ts +6 -4
  128. package/dist/types/internal/typecheck/typecheck.d.ts +1 -1
  129. package/dist/types/playwright.d.ts +26 -0
  130. package/dist/types/runtime/namespaced-runtime.d.ts +11 -0
  131. package/dist/types/runtime/script-runtime.d.ts +2 -1
  132. package/dist/types/runtime/test-runtime.d.ts +4 -0
  133. package/dist/types/server/app-server.d.ts +2 -1
  134. package/dist/types/types.d.ts +75 -33
  135. package/package.json +8 -3
  136. package/dist/cjs/browser/browser-runtime.cjs +0 -157
  137. package/dist/cjs/browser/browser-runtime.cjs.map +0 -10
  138. package/dist/mjs/browser/browser-runtime.mjs +0 -93
  139. package/dist/mjs/browser/browser-runtime.mjs.map +0 -10
  140. package/dist/types/browser/browser-runtime.d.ts +0 -3
@@ -70,11 +70,14 @@ var import_node_fs = __toESM(require("node:fs"));
70
70
  var import_node_path = __toESM(require("node:path"));
71
71
  var import_node_child_process = require("node:child_process");
72
72
  var import_client = require("../internal/client/index.cjs");
73
+ var import_browser_source = require("../internal/browser-source.cjs");
73
74
  var import_diagnostics = require("../bridge/diagnostics.cjs");
74
75
  var import_runtime_bindings = require("../bridge/runtime-bindings.cjs");
75
- var import_browser_runtime = require("../browser/browser-runtime.cjs");
76
+ var import_namespaced_runtime = require("../runtime/namespaced-runtime.cjs");
76
77
  var import_script_runtime = require("../runtime/script-runtime.cjs");
78
+ var import_test_runtime = require("../runtime/test-runtime.cjs");
77
79
  var import_app_server = require("../server/app-server.cjs");
80
+ var import_nested_host_controller = require("./nested-host-controller.cjs");
78
81
  function resolveDefaultDaemonEntrypoint() {
79
82
  const localPath = import_node_path.default.resolve("/home/runner/work/isolate/isolate/src/host", "../daemon.ts");
80
83
  if (import_node_fs.default.existsSync(localPath)) {
@@ -93,6 +96,21 @@ async function waitForSocket(socketPath, timeoutMs) {
93
96
  }
94
97
  throw new Error(`Daemon socket not available after ${timeoutMs}ms`);
95
98
  }
99
+ function createNamedError(name, message) {
100
+ const error = new Error(message);
101
+ error.name = name;
102
+ return error;
103
+ }
104
+ function normalizeNamespaceInUseError(error, key) {
105
+ if (error instanceof Error && error.name === "NamespaceInUseError") {
106
+ return error;
107
+ }
108
+ const message = error instanceof Error ? error.message : String(error ?? "");
109
+ if (/already has an active runtime|creation already in progress/i.test(message)) {
110
+ return createNamedError("NamespaceInUseError", `Namespace "${key}" already has a live runtime.`);
111
+ }
112
+ return error instanceof Error ? error : new Error(message);
113
+ }
96
114
 
97
115
  class HostImpl {
98
116
  options;
@@ -101,36 +119,34 @@ class HostImpl {
101
119
  connectionPromise = null;
102
120
  servers = new Set;
103
121
  runtimes = new Set;
122
+ namespacedRuntimes = new Map;
123
+ pendingNamespacedKeys = new Set;
104
124
  constructor(options) {
105
125
  this.options = options ?? {};
106
126
  }
107
127
  async createAppServer(options) {
108
- const server = await import_app_server.createAppServerAdapter(() => this.getConnection(), options);
109
- this.servers.add(server);
110
- return server;
128
+ return await this.createAppServerInternal(options);
111
129
  }
112
130
  async createRuntime(options) {
113
- const diagnostics = import_diagnostics.createRuntimeDiagnostics();
114
- let runtimeId = options.key ?? "runtime";
115
- const bindingsAdapter = import_runtime_bindings.createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics);
116
- const runtime = await this.createRemoteRuntime({
117
- ...bindingsAdapter.runtimeOptions,
118
- cwd: options.cwd,
119
- memoryLimitMB: options.memoryLimitMB,
120
- executionTimeout: options.executionTimeout,
121
- testEnvironment: options.features?.tests ?? false
122
- }, options.key);
123
- runtimeId = runtime.id;
124
- const adapter = import_script_runtime.createScriptRuntimeAdapter(runtime, diagnostics, {
125
- onBeforeDispose: (reason) => bindingsAdapter.abort(reason)
126
- });
127
- this.runtimes.add(adapter);
128
- return adapter;
131
+ return await this.createRuntimeInternal(options);
132
+ }
133
+ async createTestRuntime(options) {
134
+ return await this.createTestRuntimeInternal(options);
129
135
  }
130
- async createBrowserRuntime(options) {
131
- const browserRuntime = await import_browser_runtime.createBrowserRuntimeAdapter(async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key), options);
132
- this.runtimes.add(browserRuntime);
133
- return browserRuntime;
136
+ async getNamespacedRuntime(key, options) {
137
+ return await this.createNamespacedRuntimeInternal(key, options);
138
+ }
139
+ async disposeNamespace(key, options) {
140
+ this.pendingNamespacedKeys.delete(key);
141
+ const runtime = this.namespacedRuntimes.get(key);
142
+ if (runtime) {
143
+ runtime.invalidate(options?.reason ? `Namespace "${key}" was disposed: ${options.reason}` : `Namespace "${key}" was disposed.`);
144
+ this.namespacedRuntimes.delete(key);
145
+ }
146
+ const connection = await this.getConnection();
147
+ await connection.disposeNamespace(key, {
148
+ reason: options?.reason
149
+ });
134
150
  }
135
151
  async diagnostics() {
136
152
  return {
@@ -140,6 +156,11 @@ class HostImpl {
140
156
  };
141
157
  }
142
158
  async close() {
159
+ for (const [key, runtime] of this.namespacedRuntimes) {
160
+ runtime.invalidate(`Host closed while namespace "${key}" was active.`);
161
+ }
162
+ this.namespacedRuntimes.clear();
163
+ this.pendingNamespacedKeys.clear();
143
164
  if (this.connection) {
144
165
  await this.connection.close().catch(() => {});
145
166
  }
@@ -161,6 +182,90 @@ class HostImpl {
161
182
  });
162
183
  }
163
184
  }
185
+ async createRuntimeInternal(options) {
186
+ const diagnostics = import_diagnostics.createRuntimeDiagnostics();
187
+ let runtimeId = options.key ?? "runtime";
188
+ const browserSource = import_browser_source.createBrowserSourceFromBindings(options.bindings.browser);
189
+ const bindingsAdapter = import_runtime_bindings.createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics, {
190
+ nestedHost: this.createNestedBindings(browserSource)
191
+ });
192
+ const runtime = await this.createRemoteRuntime({
193
+ ...bindingsAdapter.runtimeOptions,
194
+ cwd: options.cwd,
195
+ memoryLimitMB: options.memoryLimitMB,
196
+ executionTimeout: options.executionTimeout
197
+ }, options.key);
198
+ runtimeId = runtime.id;
199
+ const adapter = import_script_runtime.createScriptRuntimeAdapter(runtime, diagnostics, {
200
+ hasBrowser: Boolean(options.bindings.browser),
201
+ onBeforeDispose: (reason) => bindingsAdapter.abort(reason)
202
+ });
203
+ this.runtimes.add(adapter);
204
+ return adapter;
205
+ }
206
+ async createTestRuntimeInternal(options) {
207
+ const testRuntime = await import_test_runtime.createTestRuntimeAdapter(async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key), options, {
208
+ nestedHost: this.createNestedBindings(import_browser_source.createBrowserSourceFromBindings(options.bindings.browser))
209
+ });
210
+ this.runtimes.add(testRuntime);
211
+ return testRuntime;
212
+ }
213
+ async createNamespacedRuntimeInternal(key, options) {
214
+ if (this.pendingNamespacedKeys.has(key) || this.namespacedRuntimes.has(key)) {
215
+ throw createNamedError("NamespaceInUseError", `Namespace "${key}" already has a live runtime.`);
216
+ }
217
+ this.pendingNamespacedKeys.add(key);
218
+ const diagnostics = import_diagnostics.createRuntimeDiagnostics();
219
+ let runtimeId = key;
220
+ const browserSource = import_browser_source.createBrowserSourceFromBindings(options.bindings.browser);
221
+ const bindingsAdapter = import_runtime_bindings.createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics, {
222
+ nestedHost: this.createNestedBindings(browserSource)
223
+ });
224
+ try {
225
+ const runtime = await this.createRemoteRuntime({
226
+ ...bindingsAdapter.runtimeOptions,
227
+ cwd: options.cwd,
228
+ memoryLimitMB: options.memoryLimitMB,
229
+ executionTimeout: options.executionTimeout,
230
+ testEnvironment: true
231
+ }, key);
232
+ runtimeId = runtime.id;
233
+ let adapter;
234
+ adapter = import_namespaced_runtime.createNamespacedRuntimeAdapter(runtime, diagnostics, {
235
+ hasBrowser: Boolean(options.bindings.browser),
236
+ abortBindings: (reason) => bindingsAdapter.abort(reason),
237
+ onRelease: () => {
238
+ if (this.namespacedRuntimes.get(key) === adapter) {
239
+ this.namespacedRuntimes.delete(key);
240
+ }
241
+ }
242
+ });
243
+ this.namespacedRuntimes.set(key, adapter);
244
+ this.runtimes.add(adapter);
245
+ return adapter;
246
+ } catch (error) {
247
+ throw normalizeNamespaceInUseError(error, key);
248
+ } finally {
249
+ this.pendingNamespacedKeys.delete(key);
250
+ }
251
+ }
252
+ async createAppServerInternal(options) {
253
+ const server = await import_app_server.createAppServerAdapter(() => this.getConnection(), options, {
254
+ nestedHost: this.createNestedBindings(import_browser_source.createBrowserSourceFromBindings(options.bindings.browser))
255
+ });
256
+ this.servers.add(server);
257
+ return server;
258
+ }
259
+ createNestedBindings(defaultBrowserSource) {
260
+ return import_nested_host_controller.createNestedHostBindings({
261
+ createRuntime: async (options) => await this.createRuntimeInternal(options),
262
+ createAppServer: async (options) => await this.createAppServerInternal(options),
263
+ createTestRuntime: async (options) => await this.createTestRuntimeInternal(options),
264
+ getNamespacedRuntime: async (key, options) => await this.createNamespacedRuntimeInternal(key, options),
265
+ disposeNamespace: async (key, options) => await this.disposeNamespace(key, options),
266
+ isConnected: () => this.connection?.isConnected() ?? false
267
+ }, defaultBrowserSource);
268
+ }
164
269
  async createRemoteRuntime(options, key) {
165
270
  const connection = await this.getConnection();
166
271
  if (key) {
@@ -232,4 +337,4 @@ async function createIsolateHost(options) {
232
337
  return new HostImpl(options);
233
338
  }
234
339
 
235
- //# debugId=C171316CAF8E438664756E2164756E21
340
+ //# debugId=C33F7BE7F5125BD164756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/host/create-isolate-host.ts"],
4
4
  "sourcesContent": [
5
- "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { connect, type DaemonConnection, type RemoteRuntime, type RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { createBrowserRuntimeAdapter } from \"../browser/browser-runtime.cjs\";\nimport { createScriptRuntimeAdapter } from \"../runtime/script-runtime.cjs\";\nimport { createAppServerAdapter } from \"../server/app-server.cjs\";\nimport type { CreateBrowserRuntimeOptions, CreateIsolateHostOptions, CreateRuntimeOptions, IsolateHost } from \"../types.cjs\";\n\nfunction resolveDefaultDaemonEntrypoint(): string | null {\n const localPath = path.resolve(import.meta.dirname, \"../daemon.ts\");\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n return null;\n}\n\nasync function waitForSocket(socketPath: string, timeoutMs: number): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n throw new Error(`Daemon socket not available after ${timeoutMs}ms`);\n}\n\nclass HostImpl implements IsolateHost {\n private readonly options: CreateIsolateHostOptions;\n private daemonProcess: ChildProcess | null = null;\n private connection: DaemonConnection | null = null;\n private connectionPromise: Promise<DaemonConnection> | null = null;\n private readonly servers = new Set<object>();\n private readonly runtimes = new Set<object>();\n\n constructor(options?: CreateIsolateHostOptions) {\n this.options = options ?? {};\n }\n\n async createAppServer(options: CreateRuntimeOptions & { key: string; entry: string; entryFilename?: string; webSockets?: { onCommand?: (command: { type: \"message\" | \"close\"; connectionId: string; data?: string | ArrayBuffer; code?: number; reason?: string }) => void } }) {\n const server = await createAppServerAdapter(() => this.getConnection(), options);\n this.servers.add(server);\n return server;\n }\n\n async createRuntime(options: CreateRuntimeOptions) {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"runtime\";\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n );\n const runtime = await this.createRemoteRuntime(\n {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: options.features?.tests ?? false,\n },\n options.key,\n );\n runtimeId = runtime.id;\n const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {\n onBeforeDispose: (reason) => bindingsAdapter.abort(reason),\n });\n this.runtimes.add(adapter);\n return adapter;\n }\n\n async createBrowserRuntime(options: CreateBrowserRuntimeOptions) {\n const browserRuntime = await createBrowserRuntimeAdapter(\n async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key),\n options,\n );\n this.runtimes.add(browserRuntime);\n return browserRuntime;\n }\n\n async diagnostics() {\n return {\n runtimes: this.runtimes.size,\n servers: this.servers.size,\n connected: this.connection?.isConnected() ?? false,\n };\n }\n\n async close(): Promise<void> {\n if (this.connection) {\n await this.connection.close().catch(() => {});\n }\n this.connection = null;\n this.connectionPromise = null;\n\n if (this.daemonProcess) {\n const process = this.daemonProcess;\n this.daemonProcess = null;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n process.kill(\"SIGKILL\");\n resolve();\n }, 5000);\n process.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n process.kill(\"SIGTERM\");\n });\n }\n }\n\n private async createRemoteRuntime(options: RuntimeOptions, key?: string): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n if (key) {\n return await connection.createNamespace(key).createRuntime(options);\n }\n return await connection.createRuntime(options);\n }\n\n private async getConnection(): Promise<DaemonConnection> {\n if (this.connection?.isConnected()) {\n return this.connection;\n }\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = (async () => {\n await this.ensureDaemon();\n this.connection = await connect({\n socket: this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\",\n timeout: this.options.daemon?.timeoutMs ?? 5000,\n });\n return this.connection;\n })();\n\n return await this.connectionPromise.finally(() => {\n this.connectionPromise = null;\n });\n }\n\n private async ensureDaemon(): Promise<void> {\n if (this.connection?.isConnected()) {\n return;\n }\n\n if (this.options.daemon?.autoStart === false) {\n return;\n }\n\n if (this.daemonProcess) {\n return;\n }\n\n const socketPath = this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\";\n const entrypoint = this.options.daemon?.entrypoint ?? resolveDefaultDaemonEntrypoint();\n\n try {\n if (fs.existsSync(socketPath)) {\n fs.unlinkSync(socketPath);\n }\n } catch {\n // ignore stale socket cleanup failures\n }\n\n const cli = entrypoint\n ? [\"node\", \"--experimental-strip-types\", entrypoint, \"--socket\", socketPath]\n : [\"isolate-daemon\", \"--socket\", socketPath];\n const cwd = this.options.daemon?.cwd ?? (entrypoint ? path.resolve(import.meta.dirname, \"../..\") : process.cwd());\n this.daemonProcess = spawn(cli[0]!, cli.slice(1), {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n NODE_OPTIONS: \"\",\n },\n });\n\n this.daemonProcess.stdout?.on(\"data\", (data: Buffer) => {\n console.log(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.stderr?.on(\"data\", (data: Buffer) => {\n console.error(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.on(\"exit\", () => {\n this.daemonProcess = null;\n this.connection = null;\n this.connectionPromise = null;\n });\n\n await waitForSocket(socketPath, this.options.daemon?.timeoutMs ?? 10_000);\n }\n}\n\nexport async function createIsolateHost(options?: CreateIsolateHostOptions): Promise<IsolateHost> {\n return new HostImpl(options);\n}\n"
5
+ "import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { connect, type DaemonConnection, type RemoteRuntime, type RuntimeOptions } from \"../internal/client/index.cjs\";\nimport {\n createBrowserSourceFromBindings,\n type BrowserSource,\n} from \"../internal/browser-source.cjs\";\nimport { createRuntimeDiagnostics } from \"../bridge/diagnostics.cjs\";\nimport { createRuntimeBindingsAdapter } from \"../bridge/runtime-bindings.cjs\";\nimport { createNamespacedRuntimeAdapter } from \"../runtime/namespaced-runtime.cjs\";\nimport { createScriptRuntimeAdapter } from \"../runtime/script-runtime.cjs\";\nimport { createTestRuntimeAdapter } from \"../runtime/test-runtime.cjs\";\nimport { createAppServerAdapter } from \"../server/app-server.cjs\";\nimport { createNestedHostBindings } from \"./nested-host-controller.cjs\";\nimport type {\n AppServer,\n CreateAppServerOptions,\n CreateIsolateHostOptions,\n CreateNamespacedRuntimeOptions,\n CreateRuntimeOptions,\n CreateTestRuntimeOptions,\n IsolateHost,\n NamespacedRuntime,\n ScriptRuntime,\n TestRuntime,\n} from \"../types.cjs\";\n\nfunction resolveDefaultDaemonEntrypoint(): string | null {\n const localPath = path.resolve(import.meta.dirname, \"../daemon.ts\");\n if (fs.existsSync(localPath)) {\n return localPath;\n }\n return null;\n}\n\nasync function waitForSocket(socketPath: string, timeoutMs: number): Promise<void> {\n const startTime = Date.now();\n while (Date.now() - startTime < timeoutMs) {\n if (fs.existsSync(socketPath)) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, 50));\n }\n\n throw new Error(`Daemon socket not available after ${timeoutMs}ms`);\n}\n\nfunction createNamedError(name: string, message: string): Error {\n const error = new Error(message);\n error.name = name;\n return error;\n}\n\nfunction normalizeNamespaceInUseError(error: unknown, key: string): Error {\n if (error instanceof Error && error.name === \"NamespaceInUseError\") {\n return error;\n }\n\n const message =\n error instanceof Error ? error.message : String(error ?? \"\");\n if (/already has an active runtime|creation already in progress/i.test(message)) {\n return createNamedError(\n \"NamespaceInUseError\",\n `Namespace \"${key}\" already has a live runtime.`,\n );\n }\n\n return error instanceof Error ? error : new Error(message);\n}\n\nclass HostImpl implements IsolateHost {\n private readonly options: CreateIsolateHostOptions;\n private daemonProcess: ChildProcess | null = null;\n private connection: DaemonConnection | null = null;\n private connectionPromise: Promise<DaemonConnection> | null = null;\n private readonly servers = new Set<object>();\n private readonly runtimes = new Set<object>();\n private readonly namespacedRuntimes = new Map<string, ReturnType<typeof createNamespacedRuntimeAdapter>>();\n private readonly pendingNamespacedKeys = new Set<string>();\n\n constructor(options?: CreateIsolateHostOptions) {\n this.options = options ?? {};\n }\n\n async createAppServer(options: CreateAppServerOptions) {\n return await this.createAppServerInternal(options);\n }\n\n async createRuntime(options: CreateRuntimeOptions) {\n return await this.createRuntimeInternal(options);\n }\n\n async createTestRuntime(options: CreateTestRuntimeOptions) {\n return await this.createTestRuntimeInternal(options);\n }\n\n async getNamespacedRuntime(\n key: string,\n options: CreateNamespacedRuntimeOptions,\n ) {\n return await this.createNamespacedRuntimeInternal(key, options);\n }\n\n async disposeNamespace(key: string, options?: { reason?: string }) {\n this.pendingNamespacedKeys.delete(key);\n const runtime = this.namespacedRuntimes.get(key);\n if (runtime) {\n runtime.invalidate(\n options?.reason\n ? `Namespace \"${key}\" was disposed: ${options.reason}`\n : `Namespace \"${key}\" was disposed.`,\n );\n this.namespacedRuntimes.delete(key);\n }\n\n const connection = await this.getConnection();\n await connection.disposeNamespace(key, {\n reason: options?.reason,\n });\n }\n\n async diagnostics() {\n return {\n runtimes: this.runtimes.size,\n servers: this.servers.size,\n connected: this.connection?.isConnected() ?? false,\n };\n }\n\n async close(): Promise<void> {\n for (const [key, runtime] of this.namespacedRuntimes) {\n runtime.invalidate(`Host closed while namespace \"${key}\" was active.`);\n }\n this.namespacedRuntimes.clear();\n this.pendingNamespacedKeys.clear();\n\n if (this.connection) {\n await this.connection.close().catch(() => {});\n }\n this.connection = null;\n this.connectionPromise = null;\n\n if (this.daemonProcess) {\n const process = this.daemonProcess;\n this.daemonProcess = null;\n await new Promise<void>((resolve) => {\n const timeout = setTimeout(() => {\n process.kill(\"SIGKILL\");\n resolve();\n }, 5000);\n process.once(\"exit\", () => {\n clearTimeout(timeout);\n resolve();\n });\n process.kill(\"SIGTERM\");\n });\n }\n }\n\n private async createRuntimeInternal(\n options: CreateRuntimeOptions,\n ): Promise<ScriptRuntime> {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"runtime\";\n const browserSource = createBrowserSourceFromBindings(options.bindings.browser);\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n {\n nestedHost: this.createNestedBindings(browserSource),\n },\n );\n const runtime = await this.createRemoteRuntime(\n {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n },\n options.key,\n );\n runtimeId = runtime.id;\n const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {\n hasBrowser: Boolean(options.bindings.browser),\n onBeforeDispose: (reason) => bindingsAdapter.abort(reason),\n });\n this.runtimes.add(adapter);\n return adapter;\n }\n\n private async createTestRuntimeInternal(\n options: CreateTestRuntimeOptions,\n ): Promise<TestRuntime> {\n const testRuntime = await createTestRuntimeAdapter(\n async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key),\n options,\n {\n nestedHost: this.createNestedBindings(\n createBrowserSourceFromBindings(options.bindings.browser),\n ),\n },\n );\n this.runtimes.add(testRuntime);\n return testRuntime;\n }\n\n private async createNamespacedRuntimeInternal(\n key: string,\n options: CreateNamespacedRuntimeOptions,\n ): Promise<NamespacedRuntime> {\n if (this.pendingNamespacedKeys.has(key) || this.namespacedRuntimes.has(key)) {\n throw createNamedError(\n \"NamespaceInUseError\",\n `Namespace \"${key}\" already has a live runtime.`,\n );\n }\n\n this.pendingNamespacedKeys.add(key);\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = key;\n const browserSource = createBrowserSourceFromBindings(options.bindings.browser);\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n {\n nestedHost: this.createNestedBindings(browserSource),\n },\n );\n\n try {\n const runtime = await this.createRemoteRuntime(\n {\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: true,\n },\n key,\n );\n runtimeId = runtime.id;\n\n let adapter: ReturnType<typeof createNamespacedRuntimeAdapter>;\n adapter = createNamespacedRuntimeAdapter(runtime, diagnostics, {\n hasBrowser: Boolean(options.bindings.browser),\n abortBindings: (reason) => bindingsAdapter.abort(reason),\n onRelease: () => {\n if (this.namespacedRuntimes.get(key) === adapter) {\n this.namespacedRuntimes.delete(key);\n }\n },\n });\n\n this.namespacedRuntimes.set(key, adapter);\n this.runtimes.add(adapter);\n return adapter;\n } catch (error) {\n throw normalizeNamespaceInUseError(error, key);\n } finally {\n this.pendingNamespacedKeys.delete(key);\n }\n }\n\n private async createAppServerInternal(\n options: CreateAppServerOptions,\n ): Promise<AppServer> {\n const server = await createAppServerAdapter(\n () => this.getConnection(),\n options,\n {\n nestedHost: this.createNestedBindings(\n createBrowserSourceFromBindings(options.bindings.browser),\n ),\n },\n );\n this.servers.add(server);\n return server;\n }\n\n private createNestedBindings(\n defaultBrowserSource: BrowserSource | undefined,\n ) {\n return createNestedHostBindings(\n {\n createRuntime: async (options) => await this.createRuntimeInternal(options),\n createAppServer: async (options) =>\n await this.createAppServerInternal(options),\n createTestRuntime: async (options) =>\n await this.createTestRuntimeInternal(options),\n getNamespacedRuntime: async (key, options) =>\n await this.createNamespacedRuntimeInternal(key, options),\n disposeNamespace: async (key, options) =>\n await this.disposeNamespace(key, options),\n isConnected: () => this.connection?.isConnected() ?? false,\n },\n defaultBrowserSource,\n );\n }\n\n private async createRemoteRuntime(options: RuntimeOptions, key?: string): Promise<RemoteRuntime> {\n const connection = await this.getConnection();\n if (key) {\n return await connection.createNamespace(key).createRuntime(options);\n }\n return await connection.createRuntime(options);\n }\n\n private async getConnection(): Promise<DaemonConnection> {\n if (this.connection?.isConnected()) {\n return this.connection;\n }\n if (this.connectionPromise) {\n return this.connectionPromise;\n }\n\n this.connectionPromise = (async () => {\n await this.ensureDaemon();\n this.connection = await connect({\n socket: this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\",\n timeout: this.options.daemon?.timeoutMs ?? 5000,\n });\n return this.connection;\n })();\n\n return await this.connectionPromise.finally(() => {\n this.connectionPromise = null;\n });\n }\n\n private async ensureDaemon(): Promise<void> {\n if (this.connection?.isConnected()) {\n return;\n }\n\n if (this.options.daemon?.autoStart === false) {\n return;\n }\n\n if (this.daemonProcess) {\n return;\n }\n\n const socketPath = this.options.daemon?.socketPath ?? \"/tmp/isolate.sock\";\n const entrypoint = this.options.daemon?.entrypoint ?? resolveDefaultDaemonEntrypoint();\n\n try {\n if (fs.existsSync(socketPath)) {\n fs.unlinkSync(socketPath);\n }\n } catch {\n // ignore stale socket cleanup failures\n }\n\n const cli = entrypoint\n ? [\"node\", \"--experimental-strip-types\", entrypoint, \"--socket\", socketPath]\n : [\"isolate-daemon\", \"--socket\", socketPath];\n const cwd = this.options.daemon?.cwd ?? (entrypoint ? path.resolve(import.meta.dirname, \"../..\") : process.cwd());\n this.daemonProcess = spawn(cli[0]!, cli.slice(1), {\n cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: {\n ...process.env,\n NODE_OPTIONS: \"\",\n },\n });\n\n this.daemonProcess.stdout?.on(\"data\", (data: Buffer) => {\n console.log(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.stderr?.on(\"data\", (data: Buffer) => {\n console.error(\"[isolate-host]\", data.toString().trim());\n });\n this.daemonProcess.on(\"exit\", () => {\n this.daemonProcess = null;\n this.connection = null;\n this.connectionPromise = null;\n });\n\n await waitForSocket(socketPath, this.options.daemon?.timeoutMs ?? 10_000);\n }\n}\n\nexport async function createIsolateHost(options?: CreateIsolateHostOptions): Promise<IsolateHost> {\n return new HostImpl(options);\n}\n"
6
6
  ],
7
- "mappings": "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",
8
- "debugId": "C171316CAF8E438664756E2164756E21",
7
+ "mappings": "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",
8
+ "debugId": "C33F7BE7F5125BD164756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -0,0 +1,369 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropNames = Object.getOwnPropertyNames;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ function __accessProp(key) {
6
+ return this[key];
7
+ }
8
+ var __toCommonJS = (from) => {
9
+ var entry = (__moduleCache ??= new WeakMap).get(from), desc;
10
+ if (entry)
11
+ return entry;
12
+ entry = __defProp({}, "__esModule", { value: true });
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (var key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(entry, key))
16
+ __defProp(entry, key, {
17
+ get: __accessProp.bind(from, key),
18
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
19
+ });
20
+ }
21
+ __moduleCache.set(from, entry);
22
+ return entry;
23
+ };
24
+ var __moduleCache;
25
+ var __returnValue = (v) => v;
26
+ function __exportSetter(name, newValue) {
27
+ this[name] = __returnValue.bind(null, newValue);
28
+ }
29
+ var __export = (target, all) => {
30
+ for (var name in all)
31
+ __defProp(target, name, {
32
+ get: all[name],
33
+ enumerable: true,
34
+ configurable: true,
35
+ set: __exportSetter.bind(all, name)
36
+ });
37
+ };
38
+
39
+ // src/host/nested-host-controller.ts
40
+ var exports_nested_host_controller = {};
41
+ __export(exports_nested_host_controller, {
42
+ createNestedHostBindings: () => createNestedHostBindings
43
+ });
44
+ module.exports = __toCommonJS(exports_nested_host_controller);
45
+ var import_node_crypto = require("node:crypto");
46
+ var import_browser_source = require("../internal/browser-source.cjs");
47
+ function toRequest(serialized) {
48
+ return new Request(serialized.url, {
49
+ method: serialized.method ?? "GET",
50
+ headers: serialized.headers,
51
+ body: serialized.body ? new Uint8Array(serialized.body) : null
52
+ });
53
+ }
54
+ function normalizeBindings(bindings, defaultBrowserSource) {
55
+ const normalized = {
56
+ console: bindings?.console,
57
+ fetch: bindings?.fetch,
58
+ files: bindings?.files,
59
+ modules: bindings?.modules,
60
+ tools: bindings?.tools
61
+ };
62
+ if (!bindings || !("browser" in bindings) || bindings.browser === undefined) {
63
+ return normalized;
64
+ }
65
+ if (import_browser_source.isDefaultBrowserDescriptor(bindings.browser)) {
66
+ normalized.browser = import_browser_source.requireBrowserSource(defaultBrowserSource, "Nested browser bindings");
67
+ return normalized;
68
+ }
69
+ const browserSource = import_browser_source.createBrowserSourceFromUnknown(bindings.browser);
70
+ if (!browserSource) {
71
+ throw new Error("Nested browser bindings must use the sandbox browser handle, a Playwright handler, or expose createContext()/createPage().");
72
+ }
73
+ normalized.browser = browserSource;
74
+ return normalized;
75
+ }
76
+ function normalizeRuntimeOptions(options, defaultBrowserSource) {
77
+ return {
78
+ ...options,
79
+ bindings: normalizeBindings(options.bindings, defaultBrowserSource)
80
+ };
81
+ }
82
+ function normalizeAppServerOptions(options, defaultBrowserSource) {
83
+ return {
84
+ ...options,
85
+ bindings: normalizeBindings(options.bindings, defaultBrowserSource)
86
+ };
87
+ }
88
+ function normalizeNamespacedRuntimeOptions(options, defaultBrowserSource) {
89
+ return {
90
+ ...options,
91
+ bindings: normalizeBindings(options.bindings, defaultBrowserSource)
92
+ };
93
+ }
94
+ function toError(value) {
95
+ if (value instanceof Error) {
96
+ return value;
97
+ }
98
+ if (value && typeof value === "object" && "message" in value && typeof value.message === "string") {
99
+ const error = new Error(value.message);
100
+ if ("name" in value && typeof value.name === "string") {
101
+ error.name = value.name;
102
+ }
103
+ return error;
104
+ }
105
+ return new Error(String(value));
106
+ }
107
+ function createNestedHostBindings(factory, defaultBrowserSource) {
108
+ const hosts = new Map;
109
+ const resources = new Map;
110
+ const requireHost = (hostId) => {
111
+ const host = hosts.get(hostId);
112
+ if (!host || host.closed) {
113
+ throw new Error(`Nested host ${hostId} is not available.`);
114
+ }
115
+ return host;
116
+ };
117
+ const requireResource = (resourceId, expectedKind) => {
118
+ const resource = resources.get(resourceId);
119
+ if (!resource || resource.kind !== expectedKind) {
120
+ throw new Error(`Nested resource ${resourceId} is not available for ${expectedKind}.`);
121
+ }
122
+ return resource;
123
+ };
124
+ const unregisterResource = (resourceId) => {
125
+ const record = resources.get(resourceId);
126
+ if (!record) {
127
+ return;
128
+ }
129
+ const host = hosts.get(record.hostId);
130
+ if (host) {
131
+ if (record.kind === "appServer") {
132
+ host.serverIds.delete(resourceId);
133
+ } else {
134
+ host.runtimeIds.delete(resourceId);
135
+ }
136
+ }
137
+ if (record.kind === "runtime" || record.kind === "namespacedRuntime") {
138
+ for (const unsubscribe of record.subscriptions.values()) {
139
+ unsubscribe();
140
+ }
141
+ record.subscriptions.clear();
142
+ }
143
+ resources.delete(resourceId);
144
+ };
145
+ const disposeResource = async (resourceId, options) => {
146
+ const record = resources.get(resourceId);
147
+ if (!record) {
148
+ return;
149
+ }
150
+ try {
151
+ await record.resource.dispose(options);
152
+ } finally {
153
+ unregisterResource(resourceId);
154
+ }
155
+ };
156
+ return {
157
+ async createHost() {
158
+ const hostId = import_node_crypto.randomUUID();
159
+ hosts.set(hostId, {
160
+ runtimeIds: new Set,
161
+ serverIds: new Set,
162
+ closed: false
163
+ });
164
+ return hostId;
165
+ },
166
+ async closeHost(hostId) {
167
+ const host = requireHost(hostId);
168
+ host.closed = true;
169
+ const resourceIds = [
170
+ ...host.serverIds,
171
+ ...host.runtimeIds
172
+ ];
173
+ await Promise.allSettled(resourceIds.map(async (resourceId) => {
174
+ await disposeResource(resourceId, {
175
+ hard: true,
176
+ reason: "Nested isolate host closed"
177
+ });
178
+ }));
179
+ hosts.delete(hostId);
180
+ },
181
+ async diagnostics(hostId) {
182
+ const host = requireHost(hostId);
183
+ return {
184
+ runtimes: host.runtimeIds.size,
185
+ servers: host.serverIds.size,
186
+ connected: factory.isConnected()
187
+ };
188
+ },
189
+ async createResource(hostId, kind, rawOptions) {
190
+ const host = requireHost(hostId);
191
+ switch (kind) {
192
+ case "runtime": {
193
+ const options = normalizeRuntimeOptions(rawOptions, defaultBrowserSource);
194
+ const resource = await factory.createRuntime(options);
195
+ const resourceId = import_node_crypto.randomUUID();
196
+ resources.set(resourceId, {
197
+ kind,
198
+ hostId,
199
+ resource,
200
+ subscriptions: new Map
201
+ });
202
+ host.runtimeIds.add(resourceId);
203
+ return resourceId;
204
+ }
205
+ case "appServer": {
206
+ const options = normalizeAppServerOptions(rawOptions, defaultBrowserSource);
207
+ const resource = await factory.createAppServer(options);
208
+ const resourceId = import_node_crypto.randomUUID();
209
+ resources.set(resourceId, {
210
+ kind,
211
+ hostId,
212
+ resource
213
+ });
214
+ host.serverIds.add(resourceId);
215
+ return resourceId;
216
+ }
217
+ case "testRuntime": {
218
+ const options = normalizeRuntimeOptions(rawOptions, defaultBrowserSource);
219
+ const resource = await factory.createTestRuntime(options);
220
+ const resourceId = import_node_crypto.randomUUID();
221
+ resources.set(resourceId, {
222
+ kind,
223
+ hostId,
224
+ resource
225
+ });
226
+ host.runtimeIds.add(resourceId);
227
+ return resourceId;
228
+ }
229
+ case "namespacedRuntime": {
230
+ const namespacedOptions = rawOptions;
231
+ const resource = await factory.getNamespacedRuntime(namespacedOptions.key, normalizeNamespacedRuntimeOptions(namespacedOptions.options, defaultBrowserSource));
232
+ const resourceId = import_node_crypto.randomUUID();
233
+ resources.set(resourceId, {
234
+ kind,
235
+ hostId,
236
+ resource,
237
+ subscriptions: new Map
238
+ });
239
+ host.runtimeIds.add(resourceId);
240
+ return resourceId;
241
+ }
242
+ }
243
+ },
244
+ async callResource(kind, resourceId, method, args) {
245
+ const record = requireResource(resourceId, kind);
246
+ switch (kind) {
247
+ case "runtime": {
248
+ const runtimeRecord = record;
249
+ switch (method) {
250
+ case "eval":
251
+ await runtimeRecord.resource.eval(args[0], args[1] ?? undefined);
252
+ return;
253
+ case "dispose":
254
+ await disposeResource(resourceId, args[0] ?? {});
255
+ return;
256
+ case "diagnostics":
257
+ return await runtimeRecord.resource.diagnostics();
258
+ case "events.on": {
259
+ const subscriptionId = import_node_crypto.randomUUID();
260
+ const unsubscribe = runtimeRecord.resource.events.on(args[0], args[1]);
261
+ runtimeRecord.subscriptions.set(subscriptionId, unsubscribe);
262
+ return subscriptionId;
263
+ }
264
+ case "events.off": {
265
+ const subscriptionId = args[0];
266
+ const unsubscribe = runtimeRecord.subscriptions.get(subscriptionId);
267
+ if (unsubscribe) {
268
+ unsubscribe();
269
+ runtimeRecord.subscriptions.delete(subscriptionId);
270
+ }
271
+ return;
272
+ }
273
+ case "events.emit":
274
+ await runtimeRecord.resource.events.emit(args[0], args[1]);
275
+ return;
276
+ default:
277
+ throw new Error(`Unsupported nested runtime method: ${method}`);
278
+ }
279
+ }
280
+ case "appServer": {
281
+ const server = record.resource;
282
+ switch (method) {
283
+ case "handle": {
284
+ const result = await server.handle(toRequest(args[0]), args[1] ?? undefined);
285
+ return result;
286
+ }
287
+ case "ws.open":
288
+ await server.ws.open(args[0]);
289
+ return;
290
+ case "ws.message":
291
+ await server.ws.message(args[0], args[1]);
292
+ return;
293
+ case "ws.close":
294
+ await server.ws.close(args[0], args[1], args[2]);
295
+ return;
296
+ case "ws.error":
297
+ await server.ws.error(args[0], toError(args[1]));
298
+ return;
299
+ case "reload":
300
+ await server.reload(args[0] ?? undefined);
301
+ return;
302
+ case "dispose":
303
+ await disposeResource(resourceId, args[0] ?? {});
304
+ return;
305
+ case "diagnostics":
306
+ return await server.diagnostics();
307
+ default:
308
+ throw new Error(`Unsupported nested app server method: ${method}`);
309
+ }
310
+ }
311
+ case "testRuntime": {
312
+ const runtime = record.resource;
313
+ switch (method) {
314
+ case "run":
315
+ return await runtime.run(args[0], args[1] ?? undefined);
316
+ case "dispose":
317
+ await disposeResource(resourceId, args[0] ?? {});
318
+ return;
319
+ case "diagnostics":
320
+ return await runtime.diagnostics();
321
+ default:
322
+ throw new Error(`Unsupported nested test runtime method: ${method}`);
323
+ }
324
+ }
325
+ case "namespacedRuntime": {
326
+ const runtimeRecord = record;
327
+ switch (method) {
328
+ case "eval":
329
+ await runtimeRecord.resource.eval(args[0], args[1] ?? undefined);
330
+ return;
331
+ case "runTests":
332
+ return await runtimeRecord.resource.runTests(args[0], args[1] ?? undefined);
333
+ case "dispose":
334
+ await disposeResource(resourceId, args[0] ?? {});
335
+ return;
336
+ case "diagnostics":
337
+ return await runtimeRecord.resource.diagnostics();
338
+ case "events.on": {
339
+ const subscriptionId = import_node_crypto.randomUUID();
340
+ const unsubscribe = runtimeRecord.resource.events.on(args[0], args[1]);
341
+ runtimeRecord.subscriptions.set(subscriptionId, unsubscribe);
342
+ return subscriptionId;
343
+ }
344
+ case "events.off": {
345
+ const subscriptionId = args[0];
346
+ const unsubscribe = runtimeRecord.subscriptions.get(subscriptionId);
347
+ if (unsubscribe) {
348
+ unsubscribe();
349
+ runtimeRecord.subscriptions.delete(subscriptionId);
350
+ }
351
+ return;
352
+ }
353
+ case "events.emit":
354
+ await runtimeRecord.resource.events.emit(args[0], args[1]);
355
+ return;
356
+ default:
357
+ throw new Error(`Unsupported nested namespaced runtime method: ${method}`);
358
+ }
359
+ }
360
+ }
361
+ },
362
+ async disposeNamespace(hostId, key, options) {
363
+ requireHost(hostId);
364
+ await factory.disposeNamespace(key, options);
365
+ }
366
+ };
367
+ }
368
+
369
+ //# debugId=1BF823129CE941AC64756E2164756E21