@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
@@ -0,0 +1,424 @@
1
+ // src/bridge/sandbox-isolate.ts
2
+ import { ISOLATE_BROWSER_DESCRIPTOR_PROPERTY } from "../internal/browser-source.mjs";
3
+ var SANDBOX_ISOLATE_MODULE_SPECIFIER = "@ricsam/isolate";
4
+ var SANDBOX_ISOLATE_MODULE_SOURCE = `
5
+ const __isolateBrowserDescriptorProperty = ${JSON.stringify(ISOLATE_BROWSER_DESCRIPTOR_PROPERTY)};
6
+
7
+ function __normalizeBrowserHandle(value) {
8
+ if (
9
+ value &&
10
+ typeof value === "object" &&
11
+ value[__isolateBrowserDescriptorProperty]
12
+ ) {
13
+ return {
14
+ [__isolateBrowserDescriptorProperty]: value[__isolateBrowserDescriptorProperty],
15
+ };
16
+ }
17
+ return value;
18
+ }
19
+
20
+ function __normalizeBindings(bindings) {
21
+ if (!bindings || typeof bindings !== "object") {
22
+ return {};
23
+ }
24
+
25
+ const normalized = { ...bindings };
26
+ if ("browser" in normalized) {
27
+ normalized.browser = __normalizeBrowserHandle(normalized.browser);
28
+ }
29
+ return normalized;
30
+ }
31
+
32
+ function __normalizeRuntimeOptions(options) {
33
+ const normalized = options ? { ...options } : {};
34
+ normalized.bindings = __normalizeBindings(normalized.bindings);
35
+ return normalized;
36
+ }
37
+
38
+ function __normalizeNamespacedRuntimeOptions(key, options) {
39
+ return {
40
+ key,
41
+ options: __normalizeRuntimeOptions(options),
42
+ };
43
+ }
44
+
45
+ async function __serializeRequest(requestLike) {
46
+ const request = requestLike instanceof Request
47
+ ? requestLike
48
+ : new Request(requestLike);
49
+ const headers = [];
50
+ request.headers.forEach((value, key) => {
51
+ headers.push([key, value]);
52
+ });
53
+ let body = null;
54
+ if (request.body) {
55
+ const cloned = request.clone();
56
+ body = Array.from(new Uint8Array(await cloned.arrayBuffer()));
57
+ }
58
+ return {
59
+ url: request.url,
60
+ method: request.method,
61
+ headers,
62
+ body,
63
+ };
64
+ }
65
+
66
+ function __normalizeEvalOptions(options) {
67
+ if (typeof options === "string") {
68
+ return { filename: options };
69
+ }
70
+ return options ?? null;
71
+ }
72
+
73
+ async function __waitForNestedCallbacks() {
74
+ await new Promise((resolve) => setTimeout(resolve, 0));
75
+ }
76
+
77
+ class NestedScriptRuntime {
78
+ #resourceId;
79
+
80
+ constructor(resourceId) {
81
+ this.#resourceId = resourceId;
82
+ }
83
+
84
+ async eval(code, options) {
85
+ await __isolateHost_callResource(
86
+ "runtime",
87
+ this.#resourceId,
88
+ "eval",
89
+ [code, __normalizeEvalOptions(options)],
90
+ );
91
+ await __waitForNestedCallbacks();
92
+ }
93
+
94
+ async dispose(options) {
95
+ await __isolateHost_callResource(
96
+ "runtime",
97
+ this.#resourceId,
98
+ "dispose",
99
+ [options ?? null],
100
+ );
101
+ await __waitForNestedCallbacks();
102
+ }
103
+
104
+ async diagnostics() {
105
+ return await __isolateHost_callResource(
106
+ "runtime",
107
+ this.#resourceId,
108
+ "diagnostics",
109
+ [],
110
+ );
111
+ }
112
+
113
+ events = {
114
+ on: (event, handler) => {
115
+ const subscriptionPromise = __isolateHost_callResource(
116
+ "runtime",
117
+ this.#resourceId,
118
+ "events.on",
119
+ [event, handler],
120
+ );
121
+ return () => {
122
+ void subscriptionPromise
123
+ .then((subscriptionId) => __isolateHost_callResource(
124
+ "runtime",
125
+ this.#resourceId,
126
+ "events.off",
127
+ [subscriptionId],
128
+ ))
129
+ .catch(() => {});
130
+ };
131
+ },
132
+ emit: async (event, payload) => {
133
+ await __isolateHost_callResource(
134
+ "runtime",
135
+ this.#resourceId,
136
+ "events.emit",
137
+ [event, payload],
138
+ );
139
+ await __waitForNestedCallbacks();
140
+ },
141
+ };
142
+ }
143
+
144
+ class NestedAppServer {
145
+ #resourceId;
146
+
147
+ constructor(resourceId) {
148
+ this.#resourceId = resourceId;
149
+ }
150
+
151
+ async handle(request, options) {
152
+ const serializedRequest = await __serializeRequest(request);
153
+ const result = await __isolateHost_callResource(
154
+ "appServer",
155
+ this.#resourceId,
156
+ "handle",
157
+ [
158
+ serializedRequest,
159
+ options
160
+ ? {
161
+ requestId: options.requestId,
162
+ metadata: options.metadata,
163
+ }
164
+ : null,
165
+ ],
166
+ );
167
+ await __waitForNestedCallbacks();
168
+ return result;
169
+ }
170
+
171
+ ws = {
172
+ open: async (connectionId) => {
173
+ await __isolateHost_callResource(
174
+ "appServer",
175
+ this.#resourceId,
176
+ "ws.open",
177
+ [connectionId],
178
+ );
179
+ await __waitForNestedCallbacks();
180
+ },
181
+ message: async (connectionId, data) => {
182
+ await __isolateHost_callResource(
183
+ "appServer",
184
+ this.#resourceId,
185
+ "ws.message",
186
+ [connectionId, data],
187
+ );
188
+ await __waitForNestedCallbacks();
189
+ },
190
+ close: async (connectionId, code, reason) => {
191
+ await __isolateHost_callResource(
192
+ "appServer",
193
+ this.#resourceId,
194
+ "ws.close",
195
+ [connectionId, code, reason],
196
+ );
197
+ await __waitForNestedCallbacks();
198
+ },
199
+ error: async (connectionId, error) => {
200
+ await __isolateHost_callResource(
201
+ "appServer",
202
+ this.#resourceId,
203
+ "ws.error",
204
+ [connectionId, error],
205
+ );
206
+ await __waitForNestedCallbacks();
207
+ },
208
+ };
209
+
210
+ async reload(reason) {
211
+ await __isolateHost_callResource(
212
+ "appServer",
213
+ this.#resourceId,
214
+ "reload",
215
+ [reason ?? null],
216
+ );
217
+ await __waitForNestedCallbacks();
218
+ }
219
+
220
+ async dispose(options) {
221
+ await __isolateHost_callResource(
222
+ "appServer",
223
+ this.#resourceId,
224
+ "dispose",
225
+ [options ?? null],
226
+ );
227
+ await __waitForNestedCallbacks();
228
+ }
229
+
230
+ async diagnostics() {
231
+ return await __isolateHost_callResource(
232
+ "appServer",
233
+ this.#resourceId,
234
+ "diagnostics",
235
+ [],
236
+ );
237
+ }
238
+ }
239
+
240
+ class NestedTestRuntime {
241
+ #resourceId;
242
+
243
+ constructor(resourceId) {
244
+ this.#resourceId = resourceId;
245
+ }
246
+
247
+ async run(code, options) {
248
+ const result = await __isolateHost_callResource(
249
+ "testRuntime",
250
+ this.#resourceId,
251
+ "run",
252
+ [code, options ?? null],
253
+ );
254
+ await __waitForNestedCallbacks();
255
+ return result;
256
+ }
257
+
258
+ async diagnostics() {
259
+ return await __isolateHost_callResource(
260
+ "testRuntime",
261
+ this.#resourceId,
262
+ "diagnostics",
263
+ [],
264
+ );
265
+ }
266
+
267
+ async dispose(options) {
268
+ await __isolateHost_callResource(
269
+ "testRuntime",
270
+ this.#resourceId,
271
+ "dispose",
272
+ [options ?? null],
273
+ );
274
+ await __waitForNestedCallbacks();
275
+ }
276
+ }
277
+
278
+ class NestedNamespacedRuntime {
279
+ #resourceId;
280
+
281
+ constructor(resourceId) {
282
+ this.#resourceId = resourceId;
283
+ }
284
+
285
+ async eval(code, options) {
286
+ await __isolateHost_callResource(
287
+ "namespacedRuntime",
288
+ this.#resourceId,
289
+ "eval",
290
+ [code, __normalizeEvalOptions(options)],
291
+ );
292
+ await __waitForNestedCallbacks();
293
+ }
294
+
295
+ async runTests(code, options) {
296
+ const result = await __isolateHost_callResource(
297
+ "namespacedRuntime",
298
+ this.#resourceId,
299
+ "runTests",
300
+ [code, options ?? null],
301
+ );
302
+ await __waitForNestedCallbacks();
303
+ return result;
304
+ }
305
+
306
+ async diagnostics() {
307
+ return await __isolateHost_callResource(
308
+ "namespacedRuntime",
309
+ this.#resourceId,
310
+ "diagnostics",
311
+ [],
312
+ );
313
+ }
314
+
315
+ async dispose(options) {
316
+ await __isolateHost_callResource(
317
+ "namespacedRuntime",
318
+ this.#resourceId,
319
+ "dispose",
320
+ [options ?? null],
321
+ );
322
+ await __waitForNestedCallbacks();
323
+ }
324
+
325
+ events = {
326
+ on: (event, handler) => {
327
+ const subscriptionPromise = __isolateHost_callResource(
328
+ "namespacedRuntime",
329
+ this.#resourceId,
330
+ "events.on",
331
+ [event, handler],
332
+ );
333
+ return () => {
334
+ void subscriptionPromise
335
+ .then((subscriptionId) => __isolateHost_callResource(
336
+ "namespacedRuntime",
337
+ this.#resourceId,
338
+ "events.off",
339
+ [subscriptionId],
340
+ ))
341
+ .catch(() => {});
342
+ };
343
+ },
344
+ emit: async (event, payload) => {
345
+ await __isolateHost_callResource(
346
+ "namespacedRuntime",
347
+ this.#resourceId,
348
+ "events.emit",
349
+ [event, payload],
350
+ );
351
+ await __waitForNestedCallbacks();
352
+ },
353
+ };
354
+ }
355
+
356
+ export function createIsolateHost() {
357
+ let hostIdPromise;
358
+
359
+ const ensureHostId = async () => {
360
+ if (!hostIdPromise) {
361
+ hostIdPromise = __isolateHost_createHost();
362
+ }
363
+ return await hostIdPromise;
364
+ };
365
+
366
+ return {
367
+ async createRuntime(options) {
368
+ const hostId = await ensureHostId();
369
+ const resourceId = await __isolateHost_createResource(
370
+ hostId,
371
+ "runtime",
372
+ __normalizeRuntimeOptions(options),
373
+ );
374
+ return new NestedScriptRuntime(resourceId);
375
+ },
376
+ async createAppServer(options) {
377
+ const hostId = await ensureHostId();
378
+ const resourceId = await __isolateHost_createResource(
379
+ hostId,
380
+ "appServer",
381
+ __normalizeRuntimeOptions(options),
382
+ );
383
+ return new NestedAppServer(resourceId);
384
+ },
385
+ async createTestRuntime(options) {
386
+ const hostId = await ensureHostId();
387
+ const resourceId = await __isolateHost_createResource(
388
+ hostId,
389
+ "testRuntime",
390
+ __normalizeRuntimeOptions(options),
391
+ );
392
+ return new NestedTestRuntime(resourceId);
393
+ },
394
+ async getNamespacedRuntime(key, options) {
395
+ const hostId = await ensureHostId();
396
+ const resourceId = await __isolateHost_createResource(
397
+ hostId,
398
+ "namespacedRuntime",
399
+ __normalizeNamespacedRuntimeOptions(key, options),
400
+ );
401
+ return new NestedNamespacedRuntime(resourceId);
402
+ },
403
+ async disposeNamespace(key, options) {
404
+ const hostId = await ensureHostId();
405
+ await __isolateHost_disposeNamespace(hostId, key, options ?? null);
406
+ await __waitForNestedCallbacks();
407
+ },
408
+ async diagnostics() {
409
+ return await __isolateHost_hostDiagnostics(await ensureHostId());
410
+ },
411
+ async close() {
412
+ const hostId = await ensureHostId();
413
+ await __isolateHost_closeHost(hostId);
414
+ await __waitForNestedCallbacks();
415
+ },
416
+ };
417
+ }
418
+ `;
419
+ export {
420
+ SANDBOX_ISOLATE_MODULE_SPECIFIER,
421
+ SANDBOX_ISOLATE_MODULE_SOURCE
422
+ };
423
+
424
+ //# debugId=9515F8C057E1AA7164756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/bridge/sandbox-isolate.ts"],
4
+ "sourcesContent": [
5
+ "import { ISOLATE_BROWSER_DESCRIPTOR_PROPERTY } from \"../internal/browser-source.mjs\";\nimport type {\n CreateAppServerOptions,\n CreateNamespacedRuntimeOptions,\n CreateRuntimeOptions,\n CreateTestRuntimeOptions,\n HostCallContext,\n} from \"../types.mjs\";\n\nexport const SANDBOX_ISOLATE_MODULE_SPECIFIER = \"@ricsam/isolate\";\n\nexport type NestedResourceKind =\n | \"runtime\"\n | \"appServer\"\n | \"testRuntime\"\n | \"namespacedRuntime\";\n\nexport interface NestedHostBindings {\n createHost(context: HostCallContext): Promise<string>;\n closeHost(hostId: string, context: HostCallContext): Promise<void>;\n diagnostics(\n hostId: string,\n context: HostCallContext,\n ): Promise<{ runtimes: number; servers: number; connected: boolean }>;\n createResource(\n hostId: string,\n kind: NestedResourceKind,\n options:\n | CreateRuntimeOptions\n | CreateAppServerOptions\n | CreateTestRuntimeOptions\n | {\n key: string;\n options: CreateNamespacedRuntimeOptions;\n },\n context: HostCallContext,\n ): Promise<string>;\n disposeNamespace(\n hostId: string,\n key: string,\n options: { reason?: string } | undefined,\n context: HostCallContext,\n ): Promise<void>;\n callResource(\n kind: NestedResourceKind,\n resourceId: string,\n method: string,\n args: unknown[],\n context: HostCallContext,\n ): Promise<unknown>;\n}\n\nexport const SANDBOX_ISOLATE_MODULE_SOURCE = `\nconst __isolateBrowserDescriptorProperty = ${JSON.stringify(ISOLATE_BROWSER_DESCRIPTOR_PROPERTY)};\n\nfunction __normalizeBrowserHandle(value) {\n if (\n value &&\n typeof value === \"object\" &&\n value[__isolateBrowserDescriptorProperty]\n ) {\n return {\n [__isolateBrowserDescriptorProperty]: value[__isolateBrowserDescriptorProperty],\n };\n }\n return value;\n}\n\nfunction __normalizeBindings(bindings) {\n if (!bindings || typeof bindings !== \"object\") {\n return {};\n }\n\n const normalized = { ...bindings };\n if (\"browser\" in normalized) {\n normalized.browser = __normalizeBrowserHandle(normalized.browser);\n }\n return normalized;\n}\n\nfunction __normalizeRuntimeOptions(options) {\n const normalized = options ? { ...options } : {};\n normalized.bindings = __normalizeBindings(normalized.bindings);\n return normalized;\n}\n\nfunction __normalizeNamespacedRuntimeOptions(key, options) {\n return {\n key,\n options: __normalizeRuntimeOptions(options),\n };\n}\n\nasync function __serializeRequest(requestLike) {\n const request = requestLike instanceof Request\n ? requestLike\n : new Request(requestLike);\n const headers = [];\n request.headers.forEach((value, key) => {\n headers.push([key, value]);\n });\n let body = null;\n if (request.body) {\n const cloned = request.clone();\n body = Array.from(new Uint8Array(await cloned.arrayBuffer()));\n }\n return {\n url: request.url,\n method: request.method,\n headers,\n body,\n };\n}\n\nfunction __normalizeEvalOptions(options) {\n if (typeof options === \"string\") {\n return { filename: options };\n }\n return options ?? null;\n}\n\nasync function __waitForNestedCallbacks() {\n await new Promise((resolve) => setTimeout(resolve, 0));\n}\n\nclass NestedScriptRuntime {\n #resourceId;\n\n constructor(resourceId) {\n this.#resourceId = resourceId;\n }\n\n async eval(code, options) {\n await __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"eval\",\n [code, __normalizeEvalOptions(options)],\n );\n await __waitForNestedCallbacks();\n }\n\n async dispose(options) {\n await __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"dispose\",\n [options ?? null],\n );\n await __waitForNestedCallbacks();\n }\n\n async diagnostics() {\n return await __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"diagnostics\",\n [],\n );\n }\n\n events = {\n on: (event, handler) => {\n const subscriptionPromise = __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"events.on\",\n [event, handler],\n );\n return () => {\n void subscriptionPromise\n .then((subscriptionId) => __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"events.off\",\n [subscriptionId],\n ))\n .catch(() => {});\n };\n },\n emit: async (event, payload) => {\n await __isolateHost_callResource(\n \"runtime\",\n this.#resourceId,\n \"events.emit\",\n [event, payload],\n );\n await __waitForNestedCallbacks();\n },\n };\n}\n\nclass NestedAppServer {\n #resourceId;\n\n constructor(resourceId) {\n this.#resourceId = resourceId;\n }\n\n async handle(request, options) {\n const serializedRequest = await __serializeRequest(request);\n const result = await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"handle\",\n [\n serializedRequest,\n options\n ? {\n requestId: options.requestId,\n metadata: options.metadata,\n }\n : null,\n ],\n );\n await __waitForNestedCallbacks();\n return result;\n }\n\n ws = {\n open: async (connectionId) => {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"ws.open\",\n [connectionId],\n );\n await __waitForNestedCallbacks();\n },\n message: async (connectionId, data) => {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"ws.message\",\n [connectionId, data],\n );\n await __waitForNestedCallbacks();\n },\n close: async (connectionId, code, reason) => {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"ws.close\",\n [connectionId, code, reason],\n );\n await __waitForNestedCallbacks();\n },\n error: async (connectionId, error) => {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"ws.error\",\n [connectionId, error],\n );\n await __waitForNestedCallbacks();\n },\n };\n\n async reload(reason) {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"reload\",\n [reason ?? null],\n );\n await __waitForNestedCallbacks();\n }\n\n async dispose(options) {\n await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"dispose\",\n [options ?? null],\n );\n await __waitForNestedCallbacks();\n }\n\n async diagnostics() {\n return await __isolateHost_callResource(\n \"appServer\",\n this.#resourceId,\n \"diagnostics\",\n [],\n );\n }\n}\n\nclass NestedTestRuntime {\n #resourceId;\n\n constructor(resourceId) {\n this.#resourceId = resourceId;\n }\n\n async run(code, options) {\n const result = await __isolateHost_callResource(\n \"testRuntime\",\n this.#resourceId,\n \"run\",\n [code, options ?? null],\n );\n await __waitForNestedCallbacks();\n return result;\n }\n\n async diagnostics() {\n return await __isolateHost_callResource(\n \"testRuntime\",\n this.#resourceId,\n \"diagnostics\",\n [],\n );\n }\n\n async dispose(options) {\n await __isolateHost_callResource(\n \"testRuntime\",\n this.#resourceId,\n \"dispose\",\n [options ?? null],\n );\n await __waitForNestedCallbacks();\n }\n}\n\nclass NestedNamespacedRuntime {\n #resourceId;\n\n constructor(resourceId) {\n this.#resourceId = resourceId;\n }\n\n async eval(code, options) {\n await __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"eval\",\n [code, __normalizeEvalOptions(options)],\n );\n await __waitForNestedCallbacks();\n }\n\n async runTests(code, options) {\n const result = await __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"runTests\",\n [code, options ?? null],\n );\n await __waitForNestedCallbacks();\n return result;\n }\n\n async diagnostics() {\n return await __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"diagnostics\",\n [],\n );\n }\n\n async dispose(options) {\n await __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"dispose\",\n [options ?? null],\n );\n await __waitForNestedCallbacks();\n }\n\n events = {\n on: (event, handler) => {\n const subscriptionPromise = __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"events.on\",\n [event, handler],\n );\n return () => {\n void subscriptionPromise\n .then((subscriptionId) => __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"events.off\",\n [subscriptionId],\n ))\n .catch(() => {});\n };\n },\n emit: async (event, payload) => {\n await __isolateHost_callResource(\n \"namespacedRuntime\",\n this.#resourceId,\n \"events.emit\",\n [event, payload],\n );\n await __waitForNestedCallbacks();\n },\n };\n}\n\nexport function createIsolateHost() {\n let hostIdPromise;\n\n const ensureHostId = async () => {\n if (!hostIdPromise) {\n hostIdPromise = __isolateHost_createHost();\n }\n return await hostIdPromise;\n };\n\n return {\n async createRuntime(options) {\n const hostId = await ensureHostId();\n const resourceId = await __isolateHost_createResource(\n hostId,\n \"runtime\",\n __normalizeRuntimeOptions(options),\n );\n return new NestedScriptRuntime(resourceId);\n },\n async createAppServer(options) {\n const hostId = await ensureHostId();\n const resourceId = await __isolateHost_createResource(\n hostId,\n \"appServer\",\n __normalizeRuntimeOptions(options),\n );\n return new NestedAppServer(resourceId);\n },\n async createTestRuntime(options) {\n const hostId = await ensureHostId();\n const resourceId = await __isolateHost_createResource(\n hostId,\n \"testRuntime\",\n __normalizeRuntimeOptions(options),\n );\n return new NestedTestRuntime(resourceId);\n },\n async getNamespacedRuntime(key, options) {\n const hostId = await ensureHostId();\n const resourceId = await __isolateHost_createResource(\n hostId,\n \"namespacedRuntime\",\n __normalizeNamespacedRuntimeOptions(key, options),\n );\n return new NestedNamespacedRuntime(resourceId);\n },\n async disposeNamespace(key, options) {\n const hostId = await ensureHostId();\n await __isolateHost_disposeNamespace(hostId, key, options ?? null);\n await __waitForNestedCallbacks();\n },\n async diagnostics() {\n return await __isolateHost_hostDiagnostics(await ensureHostId());\n },\n async close() {\n const hostId = await ensureHostId();\n await __isolateHost_closeHost(hostId);\n await __waitForNestedCallbacks();\n },\n };\n}\n`;\n"
6
+ ],
7
+ "mappings": ";AAAA;AASO,IAAM,mCAAmC;AA2CzC,IAAM,gCAAgC;AAAA,6CACA,KAAK,UAAU,mCAAmC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
8
+ "debugId": "9515F8C057E1AA7164756E2164756E21",
9
+ "names": []
10
+ }
@@ -3,11 +3,16 @@ import fs from "node:fs";
3
3
  import path from "node:path";
4
4
  import { spawn } from "node:child_process";
5
5
  import { connect } from "../internal/client/index.mjs";
6
+ import {
7
+ createBrowserSourceFromBindings
8
+ } from "../internal/browser-source.mjs";
6
9
  import { createRuntimeDiagnostics } from "../bridge/diagnostics.mjs";
7
10
  import { createRuntimeBindingsAdapter } from "../bridge/runtime-bindings.mjs";
8
- import { createBrowserRuntimeAdapter } from "../browser/browser-runtime.mjs";
11
+ import { createNamespacedRuntimeAdapter } from "../runtime/namespaced-runtime.mjs";
9
12
  import { createScriptRuntimeAdapter } from "../runtime/script-runtime.mjs";
13
+ import { createTestRuntimeAdapter } from "../runtime/test-runtime.mjs";
10
14
  import { createAppServerAdapter } from "../server/app-server.mjs";
15
+ import { createNestedHostBindings } from "./nested-host-controller.mjs";
11
16
  function resolveDefaultDaemonEntrypoint() {
12
17
  const localPath = path.resolve(import.meta.dirname, "../daemon.ts");
13
18
  if (fs.existsSync(localPath)) {
@@ -26,6 +31,21 @@ async function waitForSocket(socketPath, timeoutMs) {
26
31
  }
27
32
  throw new Error(`Daemon socket not available after ${timeoutMs}ms`);
28
33
  }
34
+ function createNamedError(name, message) {
35
+ const error = new Error(message);
36
+ error.name = name;
37
+ return error;
38
+ }
39
+ function normalizeNamespaceInUseError(error, key) {
40
+ if (error instanceof Error && error.name === "NamespaceInUseError") {
41
+ return error;
42
+ }
43
+ const message = error instanceof Error ? error.message : String(error ?? "");
44
+ if (/already has an active runtime|creation already in progress/i.test(message)) {
45
+ return createNamedError("NamespaceInUseError", `Namespace "${key}" already has a live runtime.`);
46
+ }
47
+ return error instanceof Error ? error : new Error(message);
48
+ }
29
49
 
30
50
  class HostImpl {
31
51
  options;
@@ -34,36 +54,34 @@ class HostImpl {
34
54
  connectionPromise = null;
35
55
  servers = new Set;
36
56
  runtimes = new Set;
57
+ namespacedRuntimes = new Map;
58
+ pendingNamespacedKeys = new Set;
37
59
  constructor(options) {
38
60
  this.options = options ?? {};
39
61
  }
40
62
  async createAppServer(options) {
41
- const server = await createAppServerAdapter(() => this.getConnection(), options);
42
- this.servers.add(server);
43
- return server;
63
+ return await this.createAppServerInternal(options);
44
64
  }
45
65
  async createRuntime(options) {
46
- const diagnostics = createRuntimeDiagnostics();
47
- let runtimeId = options.key ?? "runtime";
48
- const bindingsAdapter = createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics);
49
- const runtime = await this.createRemoteRuntime({
50
- ...bindingsAdapter.runtimeOptions,
51
- cwd: options.cwd,
52
- memoryLimitMB: options.memoryLimitMB,
53
- executionTimeout: options.executionTimeout,
54
- testEnvironment: options.features?.tests ?? false
55
- }, options.key);
56
- runtimeId = runtime.id;
57
- const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {
58
- onBeforeDispose: (reason) => bindingsAdapter.abort(reason)
59
- });
60
- this.runtimes.add(adapter);
61
- return adapter;
66
+ return await this.createRuntimeInternal(options);
67
+ }
68
+ async createTestRuntime(options) {
69
+ return await this.createTestRuntimeInternal(options);
62
70
  }
63
- async createBrowserRuntime(options) {
64
- const browserRuntime = await createBrowserRuntimeAdapter(async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key), options);
65
- this.runtimes.add(browserRuntime);
66
- return browserRuntime;
71
+ async getNamespacedRuntime(key, options) {
72
+ return await this.createNamespacedRuntimeInternal(key, options);
73
+ }
74
+ async disposeNamespace(key, options) {
75
+ this.pendingNamespacedKeys.delete(key);
76
+ const runtime = this.namespacedRuntimes.get(key);
77
+ if (runtime) {
78
+ runtime.invalidate(options?.reason ? `Namespace "${key}" was disposed: ${options.reason}` : `Namespace "${key}" was disposed.`);
79
+ this.namespacedRuntimes.delete(key);
80
+ }
81
+ const connection = await this.getConnection();
82
+ await connection.disposeNamespace(key, {
83
+ reason: options?.reason
84
+ });
67
85
  }
68
86
  async diagnostics() {
69
87
  return {
@@ -73,6 +91,11 @@ class HostImpl {
73
91
  };
74
92
  }
75
93
  async close() {
94
+ for (const [key, runtime] of this.namespacedRuntimes) {
95
+ runtime.invalidate(`Host closed while namespace "${key}" was active.`);
96
+ }
97
+ this.namespacedRuntimes.clear();
98
+ this.pendingNamespacedKeys.clear();
76
99
  if (this.connection) {
77
100
  await this.connection.close().catch(() => {});
78
101
  }
@@ -94,6 +117,90 @@ class HostImpl {
94
117
  });
95
118
  }
96
119
  }
120
+ async createRuntimeInternal(options) {
121
+ const diagnostics = createRuntimeDiagnostics();
122
+ let runtimeId = options.key ?? "runtime";
123
+ const browserSource = createBrowserSourceFromBindings(options.bindings.browser);
124
+ const bindingsAdapter = createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics, {
125
+ nestedHost: this.createNestedBindings(browserSource)
126
+ });
127
+ const runtime = await this.createRemoteRuntime({
128
+ ...bindingsAdapter.runtimeOptions,
129
+ cwd: options.cwd,
130
+ memoryLimitMB: options.memoryLimitMB,
131
+ executionTimeout: options.executionTimeout
132
+ }, options.key);
133
+ runtimeId = runtime.id;
134
+ const adapter = createScriptRuntimeAdapter(runtime, diagnostics, {
135
+ hasBrowser: Boolean(options.bindings.browser),
136
+ onBeforeDispose: (reason) => bindingsAdapter.abort(reason)
137
+ });
138
+ this.runtimes.add(adapter);
139
+ return adapter;
140
+ }
141
+ async createTestRuntimeInternal(options) {
142
+ const testRuntime = await createTestRuntimeAdapter(async (runtimeOptions) => await this.createRemoteRuntime(runtimeOptions, options.key), options, {
143
+ nestedHost: this.createNestedBindings(createBrowserSourceFromBindings(options.bindings.browser))
144
+ });
145
+ this.runtimes.add(testRuntime);
146
+ return testRuntime;
147
+ }
148
+ async createNamespacedRuntimeInternal(key, options) {
149
+ if (this.pendingNamespacedKeys.has(key) || this.namespacedRuntimes.has(key)) {
150
+ throw createNamedError("NamespaceInUseError", `Namespace "${key}" already has a live runtime.`);
151
+ }
152
+ this.pendingNamespacedKeys.add(key);
153
+ const diagnostics = createRuntimeDiagnostics();
154
+ let runtimeId = key;
155
+ const browserSource = createBrowserSourceFromBindings(options.bindings.browser);
156
+ const bindingsAdapter = createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics, {
157
+ nestedHost: this.createNestedBindings(browserSource)
158
+ });
159
+ try {
160
+ const runtime = await this.createRemoteRuntime({
161
+ ...bindingsAdapter.runtimeOptions,
162
+ cwd: options.cwd,
163
+ memoryLimitMB: options.memoryLimitMB,
164
+ executionTimeout: options.executionTimeout,
165
+ testEnvironment: true
166
+ }, key);
167
+ runtimeId = runtime.id;
168
+ let adapter;
169
+ adapter = createNamespacedRuntimeAdapter(runtime, diagnostics, {
170
+ hasBrowser: Boolean(options.bindings.browser),
171
+ abortBindings: (reason) => bindingsAdapter.abort(reason),
172
+ onRelease: () => {
173
+ if (this.namespacedRuntimes.get(key) === adapter) {
174
+ this.namespacedRuntimes.delete(key);
175
+ }
176
+ }
177
+ });
178
+ this.namespacedRuntimes.set(key, adapter);
179
+ this.runtimes.add(adapter);
180
+ return adapter;
181
+ } catch (error) {
182
+ throw normalizeNamespaceInUseError(error, key);
183
+ } finally {
184
+ this.pendingNamespacedKeys.delete(key);
185
+ }
186
+ }
187
+ async createAppServerInternal(options) {
188
+ const server = await createAppServerAdapter(() => this.getConnection(), options, {
189
+ nestedHost: this.createNestedBindings(createBrowserSourceFromBindings(options.bindings.browser))
190
+ });
191
+ this.servers.add(server);
192
+ return server;
193
+ }
194
+ createNestedBindings(defaultBrowserSource) {
195
+ return createNestedHostBindings({
196
+ createRuntime: async (options) => await this.createRuntimeInternal(options),
197
+ createAppServer: async (options) => await this.createAppServerInternal(options),
198
+ createTestRuntime: async (options) => await this.createTestRuntimeInternal(options),
199
+ getNamespacedRuntime: async (key, options) => await this.createNamespacedRuntimeInternal(key, options),
200
+ disposeNamespace: async (key, options) => await this.disposeNamespace(key, options),
201
+ isConnected: () => this.connection?.isConnected() ?? false
202
+ }, defaultBrowserSource);
203
+ }
97
204
  async createRemoteRuntime(options, key) {
98
205
  const connection = await this.getConnection();
99
206
  if (key) {
@@ -168,4 +275,4 @@ export {
168
275
  createIsolateHost
169
276
  };
170
277
 
171
- //# debugId=C74F5A138F5E977364756E2164756E21
278
+ //# debugId=A2B0180C1C69A0B864756E2164756E21