@ricsam/isolate 0.1.11 → 0.1.13

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 (73) hide show
  1. package/README.md +101 -1
  2. package/dist/cjs/bridge/runtime-bindings.cjs +36 -8
  3. package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
  4. package/dist/cjs/bridge/sandbox-isolate.cjs +157 -2
  5. package/dist/cjs/bridge/sandbox-isolate.cjs.map +3 -3
  6. package/dist/cjs/host/create-isolate-host.cjs +85 -1
  7. package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
  8. package/dist/cjs/host/nested-host-controller.cjs +95 -5
  9. package/dist/cjs/host/nested-host-controller.cjs.map +3 -3
  10. package/dist/cjs/index.cjs.map +1 -1
  11. package/dist/cjs/internal/browser-source.cjs +16 -5
  12. package/dist/cjs/internal/browser-source.cjs.map +3 -3
  13. package/dist/cjs/internal/client/connection.cjs +20 -9
  14. package/dist/cjs/internal/client/connection.cjs.map +3 -3
  15. package/dist/cjs/internal/daemon/connection.cjs +28 -10
  16. package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
  17. package/dist/cjs/internal/protocol/types.cjs +2 -1
  18. package/dist/cjs/internal/protocol/types.cjs.map +3 -3
  19. package/dist/cjs/internal/runtime/index.cjs +5 -2
  20. package/dist/cjs/internal/runtime/index.cjs.map +3 -3
  21. package/dist/cjs/internal/typecheck/isolate-types.cjs +82 -1
  22. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
  23. package/dist/cjs/package.json +1 -1
  24. package/dist/cjs/playwright.cjs +76 -0
  25. package/dist/cjs/playwright.cjs.map +10 -0
  26. package/dist/cjs/runtime/namespaced-runtime.cjs +184 -0
  27. package/dist/cjs/runtime/namespaced-runtime.cjs.map +10 -0
  28. package/dist/cjs/runtime/test-event-subscriptions.cjs +76 -0
  29. package/dist/cjs/runtime/test-event-subscriptions.cjs.map +10 -0
  30. package/dist/cjs/runtime/test-runtime.cjs +26 -3
  31. package/dist/cjs/runtime/test-runtime.cjs.map +3 -3
  32. package/dist/mjs/bridge/runtime-bindings.mjs +36 -8
  33. package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
  34. package/dist/mjs/bridge/sandbox-isolate.mjs +157 -2
  35. package/dist/mjs/bridge/sandbox-isolate.mjs.map +3 -3
  36. package/dist/mjs/host/create-isolate-host.mjs +85 -1
  37. package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
  38. package/dist/mjs/host/nested-host-controller.mjs +95 -5
  39. package/dist/mjs/host/nested-host-controller.mjs.map +3 -3
  40. package/dist/mjs/index.mjs.map +1 -1
  41. package/dist/mjs/internal/browser-source.mjs +16 -5
  42. package/dist/mjs/internal/browser-source.mjs.map +3 -3
  43. package/dist/mjs/internal/client/connection.mjs +20 -9
  44. package/dist/mjs/internal/client/connection.mjs.map +3 -3
  45. package/dist/mjs/internal/daemon/connection.mjs +28 -10
  46. package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
  47. package/dist/mjs/internal/protocol/types.mjs +2 -1
  48. package/dist/mjs/internal/protocol/types.mjs.map +3 -3
  49. package/dist/mjs/internal/runtime/index.mjs +5 -2
  50. package/dist/mjs/internal/runtime/index.mjs.map +3 -3
  51. package/dist/mjs/internal/typecheck/isolate-types.mjs +82 -1
  52. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
  53. package/dist/mjs/package.json +1 -1
  54. package/dist/mjs/playwright.mjs +47 -0
  55. package/dist/mjs/playwright.mjs.map +10 -0
  56. package/dist/mjs/runtime/namespaced-runtime.mjs +146 -0
  57. package/dist/mjs/runtime/namespaced-runtime.mjs.map +10 -0
  58. package/dist/mjs/runtime/test-event-subscriptions.mjs +36 -0
  59. package/dist/mjs/runtime/test-event-subscriptions.mjs.map +10 -0
  60. package/dist/mjs/runtime/test-runtime.mjs +26 -3
  61. package/dist/mjs/runtime/test-runtime.mjs.map +3 -3
  62. package/dist/types/bridge/sandbox-isolate.d.ts +9 -3
  63. package/dist/types/host/nested-host-controller.d.ts +5 -1
  64. package/dist/types/index.d.ts +1 -1
  65. package/dist/types/internal/browser-source.d.ts +1 -2
  66. package/dist/types/internal/client/types.d.ts +4 -0
  67. package/dist/types/internal/protocol/types.d.ts +8 -1
  68. package/dist/types/internal/typecheck/isolate-types.d.ts +2 -2
  69. package/dist/types/playwright.d.ts +26 -0
  70. package/dist/types/runtime/namespaced-runtime.d.ts +13 -0
  71. package/dist/types/runtime/test-event-subscriptions.d.ts +12 -0
  72. package/dist/types/types.d.ts +51 -3
  73. package/package.json +6 -1
@@ -0,0 +1,76 @@
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/playwright.ts
40
+ var exports_playwright = {};
41
+ __export(exports_playwright, {
42
+ getPlaywrightHandlerMetadata: () => import_client2.getPlaywrightHandlerMetadata,
43
+ getDefaultPlaywrightHandlerMetadata: () => import_client2.getDefaultPlaywrightHandlerMetadata,
44
+ defaultPlaywrightHandler: () => import_client2.defaultPlaywrightHandler,
45
+ createPlaywrightSessionHandler: () => createPlaywrightSessionHandler,
46
+ createPlaywrightHandler: () => import_client2.createPlaywrightHandler,
47
+ PLAYWRIGHT_HANDLER_META: () => import_types.PLAYWRIGHT_HANDLER_META,
48
+ DEFAULT_PLAYWRIGHT_HANDLER_META: () => import_types.DEFAULT_PLAYWRIGHT_HANDLER_META
49
+ });
50
+ module.exports = __toCommonJS(exports_playwright);
51
+ var import_client = require("./internal/playwright/client.cjs");
52
+ var import_types = require("./internal/playwright/types.cjs");
53
+ var import_client2 = require("./internal/playwright/client.cjs");
54
+ function createPlaywrightSessionHandler(options = {}) {
55
+ const handler = import_client.createPlaywrightFactoryHandler({
56
+ timeout: options.timeout,
57
+ createContext: options.createContext,
58
+ createPage: options.createPage,
59
+ readFile: options.readFile,
60
+ writeFile: options.writeFile,
61
+ evaluatePredicate: options.evaluatePredicate
62
+ });
63
+ const metadata = import_client.getPlaywrightHandlerMetadata(handler);
64
+ if (!metadata?.collector) {
65
+ throw new Error("Playwright session handler metadata is unavailable for the generated handler.");
66
+ }
67
+ return {
68
+ handler,
69
+ getCollectedData: () => metadata.collector.getCollectedData(),
70
+ getTrackedResources: () => metadata.collector.getTrackedResources(),
71
+ clearCollectedData: () => metadata.collector.clearCollectedData(),
72
+ onEvent: (callback) => metadata.collector.onEvent(callback)
73
+ };
74
+ }
75
+
76
+ //# debugId=E253F3040135B8E464756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/playwright.ts"],
4
+ "sourcesContent": [
5
+ "import {\n createPlaywrightFactoryHandler,\n getPlaywrightHandlerMetadata,\n type PlaywrightCallback,\n} from \"./internal/playwright/client.cjs\";\nimport type {\n CollectedData,\n PlaywrightEvent,\n PlaywrightFileData,\n PlaywrightOperation,\n PlaywrightResult,\n} from \"./internal/protocol/index.cjs\";\n\nexport type PlaywrightSessionHandlerCallback = PlaywrightCallback;\n\nexport interface CreatePlaywrightSessionHandlerOptions<\n TContext = unknown,\n TPage = unknown,\n TContextOptions = unknown,\n> {\n timeout?: number;\n createContext?: (\n options?: TContextOptions,\n ) => Promise<TContext> | TContext;\n createPage?: (context: TContext) => Promise<TPage> | TPage;\n readFile?: (\n filePath: string,\n ) => Promise<PlaywrightFileData> | PlaywrightFileData;\n writeFile?: (\n filePath: string,\n data: Buffer,\n ) => Promise<void> | void;\n evaluatePredicate?: (predicateId: number, data: unknown) => boolean;\n}\n\nexport interface PlaywrightSessionHandler {\n handler: PlaywrightSessionHandlerCallback;\n getCollectedData(): CollectedData;\n getTrackedResources(): { contexts: string[]; pages: string[] };\n clearCollectedData(): void;\n onEvent(callback: (event: PlaywrightEvent) => void): () => void;\n}\n\nexport {\n DEFAULT_PLAYWRIGHT_HANDLER_META,\n PLAYWRIGHT_HANDLER_META,\n} from \"./internal/playwright/types.cjs\";\n\nexport type {\n BrowserConsoleLogEntry,\n DefaultPlaywrightHandler,\n DefaultPlaywrightHandlerMetadata,\n DefaultPlaywrightHandlerOptions,\n NetworkRequestInfo,\n NetworkResponseInfo,\n PageErrorInfo,\n PlaywrightCollector,\n PlaywrightHandlerMetadata,\n PlaywrightHandle,\n RequestFailureInfo,\n} from \"./internal/playwright/client.cjs\";\n\nexport type {\n CollectedData,\n PlaywrightEvent,\n PlaywrightFileData,\n PlaywrightOperation,\n PlaywrightResult,\n};\n\nexport {\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n getPlaywrightHandlerMetadata,\n} from \"./internal/playwright/client.cjs\";\n\nexport function createPlaywrightSessionHandler<\n TContext = unknown,\n TPage = unknown,\n TContextOptions = unknown,\n>(\n options: CreatePlaywrightSessionHandlerOptions<\n TContext,\n TPage,\n TContextOptions\n > = {},\n): PlaywrightSessionHandler {\n const handler = createPlaywrightFactoryHandler({\n timeout: options.timeout,\n createContext: options.createContext,\n createPage: options.createPage,\n readFile: options.readFile,\n writeFile: options.writeFile,\n evaluatePredicate: options.evaluatePredicate,\n } as Parameters<typeof createPlaywrightFactoryHandler>[0]);\n const metadata = getPlaywrightHandlerMetadata(handler);\n\n if (!metadata?.collector) {\n throw new Error(\n \"Playwright session handler metadata is unavailable for the generated handler.\",\n );\n }\n\n return {\n handler: handler as (\n op: PlaywrightOperation,\n ) => Promise<PlaywrightResult>,\n getCollectedData: () => metadata.collector.getCollectedData(),\n getTrackedResources: () => metadata.collector.getTrackedResources(),\n clearCollectedData: () => metadata.collector.clearCollectedData(),\n onEvent: (callback) => metadata.collector.onEvent(callback),\n };\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,IAJP;AA8CO,IAHP;AAgCO,IALP;AAOO,SAAS,8BAIf,CACC,UAII,CAAC,GACqB;AAAA,EAC1B,MAAM,UAAU,6CAA+B;AAAA,IAC7C,SAAS,QAAQ;AAAA,IACjB,eAAe,QAAQ;AAAA,IACvB,YAAY,QAAQ;AAAA,IACpB,UAAU,QAAQ;AAAA,IAClB,WAAW,QAAQ;AAAA,IACnB,mBAAmB,QAAQ;AAAA,EAC7B,CAAyD;AAAA,EACzD,MAAM,WAAW,2CAA6B,OAAO;AAAA,EAErD,IAAI,CAAC,UAAU,WAAW;AAAA,IACxB,MAAM,IAAI,MACR,+EACF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL;AAAA,IAGA,kBAAkB,MAAM,SAAS,UAAU,iBAAiB;AAAA,IAC5D,qBAAqB,MAAM,SAAS,UAAU,oBAAoB;AAAA,IAClE,oBAAoB,MAAM,SAAS,UAAU,mBAAmB;AAAA,IAChE,SAAS,CAAC,aAAa,SAAS,UAAU,QAAQ,QAAQ;AAAA,EAC5D;AAAA;",
8
+ "debugId": "E253F3040135B8E464756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,184 @@
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/runtime/namespaced-runtime.ts
40
+ var exports_namespaced_runtime = {};
41
+ __export(exports_namespaced_runtime, {
42
+ createNamespacedRuntimeAdapter: () => createNamespacedRuntimeAdapter
43
+ });
44
+ module.exports = __toCommonJS(exports_namespaced_runtime);
45
+ var import_diagnostics = require("../bridge/diagnostics.cjs");
46
+ var import_client = require("../internal/client/index.cjs");
47
+ function createStateError(state, reason) {
48
+ if (state === "invalidated") {
49
+ const error2 = new Error(reason && reason.length > 0 ? `Namespaced runtime is no longer available: ${reason}` : "Namespaced runtime is no longer available.");
50
+ error2.name = "NamespacedRuntimeInvalidatedError";
51
+ return error2;
52
+ }
53
+ const error = new Error("Namespaced runtime has already been disposed.");
54
+ error.name = "NamespacedRuntimeDisposedError";
55
+ return error;
56
+ }
57
+ function createNamespacedRuntimeAdapter(runtime, diagnostics, options) {
58
+ let state = "active";
59
+ let lastRun;
60
+ let invalidationReason;
61
+ let released = false;
62
+ const subscriptions = new Set;
63
+ const release = () => {
64
+ if (released) {
65
+ return;
66
+ }
67
+ released = true;
68
+ for (const unsubscribe of subscriptions) {
69
+ unsubscribe();
70
+ }
71
+ subscriptions.clear();
72
+ options?.testEvents.clear();
73
+ options?.onRelease?.();
74
+ };
75
+ const ensureActive = () => {
76
+ if (state !== "active") {
77
+ throw createStateError(state, invalidationReason);
78
+ }
79
+ };
80
+ options.testEvents.setEnsureUsable(ensureActive);
81
+ return {
82
+ async eval(code, evalOptions) {
83
+ ensureActive();
84
+ diagnostics.lifecycleState = "active";
85
+ try {
86
+ await runtime.eval(code, {
87
+ filename: evalOptions?.filename,
88
+ executionTimeout: evalOptions?.executionTimeout
89
+ });
90
+ } catch (error) {
91
+ diagnostics.lastError = error instanceof Error ? error.message : String(error);
92
+ throw error;
93
+ } finally {
94
+ diagnostics.lifecycleState = "idle";
95
+ }
96
+ },
97
+ async runTests(code, runOptions) {
98
+ ensureActive();
99
+ diagnostics.lifecycleState = "active";
100
+ try {
101
+ await runtime.testEnvironment.reset();
102
+ await runtime.eval(code, {
103
+ filename: runOptions?.filename,
104
+ executionTimeout: runOptions?.timeoutMs
105
+ });
106
+ lastRun = await runtime.testEnvironment.runTests(runOptions?.timeoutMs);
107
+ return lastRun;
108
+ } catch (error) {
109
+ diagnostics.lastError = error instanceof Error ? error.message : String(error);
110
+ throw error;
111
+ } finally {
112
+ diagnostics.lifecycleState = "idle";
113
+ }
114
+ },
115
+ async diagnostics() {
116
+ ensureActive();
117
+ const runtimeDiagnostics = {
118
+ ...diagnostics,
119
+ reused: runtime.reused
120
+ };
121
+ const collectedData = options?.hasBrowser ? runtime.playwright.getCollectedData() : undefined;
122
+ const trackedResources = options?.hasBrowser ? runtime.playwright.getTrackedResources() : undefined;
123
+ return {
124
+ runtime: runtimeDiagnostics,
125
+ browser: collectedData ? import_diagnostics.createBrowserDiagnostics(collectedData, trackedResources) : undefined,
126
+ test: {
127
+ enabled: true,
128
+ registeredTests: await runtime.testEnvironment.getTestCount(),
129
+ lastRun
130
+ }
131
+ };
132
+ },
133
+ async dispose(disposeOptions) {
134
+ if (state === "invalidated" || state === "disposed") {
135
+ release();
136
+ return;
137
+ }
138
+ state = "disposed";
139
+ diagnostics.lifecycleState = "disposing";
140
+ try {
141
+ options?.abortBindings?.(disposeOptions?.reason);
142
+ await runtime.dispose(disposeOptions);
143
+ } catch (error) {
144
+ if (!import_client.isBenignDisposeError(error)) {
145
+ diagnostics.lastError = error instanceof Error ? error.message : String(error);
146
+ throw error;
147
+ }
148
+ } finally {
149
+ diagnostics.lifecycleState = "idle";
150
+ release();
151
+ }
152
+ },
153
+ invalidate(reason) {
154
+ if (state === "disposed" || state === "invalidated") {
155
+ release();
156
+ return;
157
+ }
158
+ state = "invalidated";
159
+ invalidationReason = reason;
160
+ diagnostics.lifecycleState = "idle";
161
+ options?.abortBindings?.(reason);
162
+ release();
163
+ },
164
+ test: options.testEvents.api,
165
+ events: {
166
+ on: (event, handler) => {
167
+ ensureActive();
168
+ const unsubscribe = runtime.on(event, handler);
169
+ subscriptions.add(unsubscribe);
170
+ return () => {
171
+ if (subscriptions.delete(unsubscribe)) {
172
+ unsubscribe();
173
+ }
174
+ };
175
+ },
176
+ emit: async (event, payload) => {
177
+ ensureActive();
178
+ runtime.emit(event, payload);
179
+ }
180
+ }
181
+ };
182
+ }
183
+
184
+ //# debugId=B2B656F046B5119964756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/runtime/namespaced-runtime.ts"],
4
+ "sourcesContent": [
5
+ "import {\n createBrowserDiagnostics,\n type MutableRuntimeDiagnostics,\n} from \"../bridge/diagnostics.cjs\";\nimport { isBenignDisposeError, type RemoteRuntime } from \"../internal/client/index.cjs\";\nimport type { TestEventSubscriptions } from \"./test-event-subscriptions.cjs\";\nimport type {\n NamespacedRuntime,\n RunResults,\n TestRuntimeDiagnostics,\n} from \"../types.cjs\";\n\ntype RuntimeState = \"active\" | \"disposed\" | \"invalidated\";\n\nexport interface NamespacedRuntimeAdapter extends NamespacedRuntime {\n invalidate(reason?: string): void;\n}\n\nfunction createStateError(state: RuntimeState, reason?: string): Error {\n if (state === \"invalidated\") {\n const error = new Error(\n reason && reason.length > 0\n ? `Namespaced runtime is no longer available: ${reason}`\n : \"Namespaced runtime is no longer available.\",\n );\n error.name = \"NamespacedRuntimeInvalidatedError\";\n return error;\n }\n\n const error = new Error(\"Namespaced runtime has already been disposed.\");\n error.name = \"NamespacedRuntimeDisposedError\";\n return error;\n}\n\nexport function createNamespacedRuntimeAdapter(\n runtime: RemoteRuntime,\n diagnostics: MutableRuntimeDiagnostics,\n options: {\n hasBrowser?: boolean;\n abortBindings?: (reason?: string) => void;\n onRelease?: () => void;\n testEvents: TestEventSubscriptions;\n },\n): NamespacedRuntimeAdapter {\n let state: RuntimeState = \"active\";\n let lastRun: RunResults | undefined;\n let invalidationReason: string | undefined;\n let released = false;\n const subscriptions = new Set<() => void>();\n\n const release = () => {\n if (released) {\n return;\n }\n released = true;\n for (const unsubscribe of subscriptions) {\n unsubscribe();\n }\n subscriptions.clear();\n options?.testEvents.clear();\n options?.onRelease?.();\n };\n\n const ensureActive = (): void => {\n if (state !== \"active\") {\n throw createStateError(state, invalidationReason);\n }\n };\n options.testEvents.setEnsureUsable(ensureActive);\n\n return {\n async eval(code, evalOptions) {\n ensureActive();\n diagnostics.lifecycleState = \"active\";\n try {\n await runtime.eval(code, {\n filename: evalOptions?.filename,\n executionTimeout: evalOptions?.executionTimeout,\n });\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n async runTests(code, runOptions) {\n ensureActive();\n diagnostics.lifecycleState = \"active\";\n try {\n await runtime.testEnvironment.reset();\n await runtime.eval(code, {\n filename: runOptions?.filename,\n executionTimeout: runOptions?.timeoutMs,\n });\n lastRun = await runtime.testEnvironment.runTests(runOptions?.timeoutMs);\n return lastRun;\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n async diagnostics(): Promise<TestRuntimeDiagnostics> {\n ensureActive();\n const runtimeDiagnostics = {\n ...diagnostics,\n reused: runtime.reused,\n };\n const collectedData = options?.hasBrowser\n ? runtime.playwright.getCollectedData()\n : undefined;\n const trackedResources = options?.hasBrowser\n ? runtime.playwright.getTrackedResources()\n : undefined;\n\n return {\n runtime: runtimeDiagnostics,\n browser: collectedData\n ? createBrowserDiagnostics(collectedData, trackedResources)\n : undefined,\n test: {\n enabled: true as const,\n registeredTests: await runtime.testEnvironment.getTestCount(),\n lastRun,\n },\n };\n },\n async dispose(disposeOptions) {\n if (state === \"invalidated\" || state === \"disposed\") {\n release();\n return;\n }\n\n state = \"disposed\";\n diagnostics.lifecycleState = \"disposing\";\n try {\n options?.abortBindings?.(disposeOptions?.reason);\n await runtime.dispose(disposeOptions);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n } finally {\n diagnostics.lifecycleState = \"idle\";\n release();\n }\n },\n invalidate(reason) {\n if (state === \"disposed\" || state === \"invalidated\") {\n release();\n return;\n }\n state = \"invalidated\";\n invalidationReason = reason;\n diagnostics.lifecycleState = \"idle\";\n options?.abortBindings?.(reason);\n release();\n },\n test: options.testEvents.api,\n events: {\n on: (event, handler) => {\n ensureActive();\n const unsubscribe = runtime.on(event, handler);\n subscriptions.add(unsubscribe);\n return () => {\n if (subscriptions.delete(unsubscribe)) {\n unsubscribe();\n }\n };\n },\n emit: async (event, payload) => {\n ensureActive();\n runtime.emit(event, payload);\n },\n },\n };\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "B2B656F046B5119964756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,76 @@
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/runtime/test-event-subscriptions.ts
40
+ var exports_test_event_subscriptions = {};
41
+ __export(exports_test_event_subscriptions, {
42
+ createTestEventSubscriptions: () => createTestEventSubscriptions
43
+ });
44
+ module.exports = __toCommonJS(exports_test_event_subscriptions);
45
+ function createTestEventSubscriptions(ensureUsable) {
46
+ let currentEnsureUsable = ensureUsable;
47
+ const handlers = new Set;
48
+ return {
49
+ api: {
50
+ onEvent(handler) {
51
+ currentEnsureUsable?.();
52
+ handlers.add(handler);
53
+ return () => {
54
+ handlers.delete(handler);
55
+ };
56
+ }
57
+ },
58
+ emit(event) {
59
+ for (const handler of handlers) {
60
+ try {
61
+ handler(event);
62
+ } catch (error) {
63
+ console.error("[isolate-test] Test event handler failed.", error);
64
+ }
65
+ }
66
+ },
67
+ clear() {
68
+ handlers.clear();
69
+ },
70
+ setEnsureUsable(nextEnsureUsable) {
71
+ currentEnsureUsable = nextEnsureUsable;
72
+ }
73
+ };
74
+ }
75
+
76
+ //# debugId=E524F058E4A8586664756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/runtime/test-event-subscriptions.ts"],
4
+ "sourcesContent": [
5
+ "import type { TestEvent } from \"../types.cjs\";\n\ninterface TestEventApi {\n onEvent(handler: (event: TestEvent) => void): () => void;\n}\n\nexport interface TestEventSubscriptions {\n readonly api: TestEventApi;\n emit(event: TestEvent): void;\n clear(): void;\n setEnsureUsable(ensureUsable?: () => void): void;\n}\n\nexport function createTestEventSubscriptions(\n ensureUsable?: () => void,\n): TestEventSubscriptions {\n let currentEnsureUsable = ensureUsable;\n const handlers = new Set<(event: TestEvent) => void>();\n\n return {\n api: {\n onEvent(handler) {\n currentEnsureUsable?.();\n handlers.add(handler);\n return () => {\n handlers.delete(handler);\n };\n },\n },\n emit(event) {\n for (const handler of handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(\"[isolate-test] Test event handler failed.\", error);\n }\n }\n },\n clear() {\n handlers.clear();\n },\n setEnsureUsable(nextEnsureUsable) {\n currentEnsureUsable = nextEnsureUsable;\n },\n };\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaO,SAAS,4BAA4B,CAC1C,cACwB;AAAA,EACxB,IAAI,sBAAsB;AAAA,EAC1B,MAAM,WAAW,IAAI;AAAA,EAErB,OAAO;AAAA,IACL,KAAK;AAAA,MACH,OAAO,CAAC,SAAS;AAAA,QACf,sBAAsB;AAAA,QACtB,SAAS,IAAI,OAAO;AAAA,QACpB,OAAO,MAAM;AAAA,UACX,SAAS,OAAO,OAAO;AAAA;AAAA;AAAA,IAG7B;AAAA,IACA,IAAI,CAAC,OAAO;AAAA,MACV,WAAW,WAAW,UAAU;AAAA,QAC9B,IAAI;AAAA,UACF,QAAQ,KAAK;AAAA,UACb,OAAO,OAAO;AAAA,UACd,QAAQ,MAAM,6CAA6C,KAAK;AAAA;AAAA,MAEpE;AAAA;AAAA,IAEF,KAAK,GAAG;AAAA,MACN,SAAS,MAAM;AAAA;AAAA,IAEjB,eAAe,CAAC,kBAAkB;AAAA,MAChC,sBAAsB;AAAA;AAAA,EAE1B;AAAA;",
8
+ "debugId": "E524F058E4A8586664756E2164756E21",
9
+ "names": []
10
+ }
@@ -45,21 +45,36 @@ module.exports = __toCommonJS(exports_test_runtime);
45
45
  var import_diagnostics = require("../bridge/diagnostics.cjs");
46
46
  var import_runtime_bindings = require("../bridge/runtime-bindings.cjs");
47
47
  var import_client = require("../internal/client/index.cjs");
48
+ var import_test_event_subscriptions = require("./test-event-subscriptions.cjs");
49
+ function createDisposedTestRuntimeError() {
50
+ return new Error("Test runtime has already been disposed.");
51
+ }
48
52
  async function createTestRuntimeAdapter(createRuntime, options, adapterOptions) {
49
53
  const diagnostics = import_diagnostics.createRuntimeDiagnostics();
54
+ const testEvents = import_test_event_subscriptions.createTestEventSubscriptions();
50
55
  let runtimeId = options.key ?? "test-runtime";
56
+ let isDisposed = false;
51
57
  const bindingsAdapter = import_runtime_bindings.createRuntimeBindingsAdapter(options.bindings, () => runtimeId, diagnostics, adapterOptions);
52
58
  const runtime = await createRuntime({
53
59
  ...bindingsAdapter.runtimeOptions,
54
60
  cwd: options.cwd,
55
61
  memoryLimitMB: options.memoryLimitMB,
56
62
  executionTimeout: options.executionTimeout,
57
- testEnvironment: true
63
+ testEnvironment: {
64
+ onEvent: (event) => testEvents.emit(event)
65
+ }
58
66
  });
59
67
  runtimeId = runtime.id;
60
68
  let lastRun;
69
+ const ensureActive = () => {
70
+ if (isDisposed) {
71
+ throw createDisposedTestRuntimeError();
72
+ }
73
+ };
74
+ testEvents.setEnsureUsable(ensureActive);
61
75
  return {
62
76
  async run(code, runOptions) {
77
+ ensureActive();
63
78
  diagnostics.lifecycleState = "active";
64
79
  try {
65
80
  await runtime.testEnvironment.reset();
@@ -77,6 +92,7 @@ async function createTestRuntimeAdapter(createRuntime, options, adapterOptions)
77
92
  }
78
93
  },
79
94
  async diagnostics() {
95
+ ensureActive();
80
96
  const runtimeDiagnostics = {
81
97
  ...diagnostics,
82
98
  reused: runtime.reused
@@ -94,6 +110,11 @@ async function createTestRuntimeAdapter(createRuntime, options, adapterOptions)
94
110
  };
95
111
  },
96
112
  async dispose(disposeOptions) {
113
+ if (isDisposed) {
114
+ testEvents.clear();
115
+ return;
116
+ }
117
+ isDisposed = true;
97
118
  diagnostics.lifecycleState = "disposing";
98
119
  try {
99
120
  bindingsAdapter.abort(disposeOptions?.reason);
@@ -105,9 +126,11 @@ async function createTestRuntimeAdapter(createRuntime, options, adapterOptions)
105
126
  }
106
127
  } finally {
107
128
  diagnostics.lifecycleState = "idle";
129
+ testEvents.clear();
108
130
  }
109
- }
131
+ },
132
+ test: testEvents.api
110
133
  };
111
134
  }
112
135
 
113
- //# debugId=C4A9F9798611162364756E2164756E21
136
+ //# debugId=3C3652D67988D41064756E2164756E21
@@ -2,9 +2,9 @@
2
2
  "version": 3,
3
3
  "sources": ["../../../src/runtime/test-runtime.ts"],
4
4
  "sourcesContent": [
5
- "import {\n createBrowserDiagnostics,\n createRuntimeDiagnostics,\n} from \"../bridge/diagnostics.cjs\";\nimport {\n createRuntimeBindingsAdapter,\n type RuntimeBindingsAdapterOptions,\n} from \"../bridge/runtime-bindings.cjs\";\nimport type { RemoteRuntime, RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { isBenignDisposeError } from \"../internal/client/index.cjs\";\nimport type {\n CreateTestRuntimeOptions,\n RunResults,\n TestRuntime,\n} from \"../types.cjs\";\n\nexport async function createTestRuntimeAdapter(\n createRuntime: (options: RuntimeOptions) => Promise<RemoteRuntime>,\n options: CreateTestRuntimeOptions,\n adapterOptions?: RuntimeBindingsAdapterOptions,\n): Promise<TestRuntime> {\n const diagnostics = createRuntimeDiagnostics();\n let runtimeId = options.key ?? \"test-runtime\";\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n adapterOptions,\n );\n const runtime = await createRuntime({\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: true,\n });\n runtimeId = runtime.id;\n\n let lastRun: RunResults | undefined;\n\n return {\n async run(code, runOptions) {\n diagnostics.lifecycleState = \"active\";\n try {\n await runtime.testEnvironment.reset();\n await runtime.eval(code, {\n filename: runOptions?.filename,\n executionTimeout: runOptions?.timeoutMs,\n });\n lastRun = await runtime.testEnvironment.runTests(runOptions?.timeoutMs);\n return lastRun;\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n async diagnostics() {\n const runtimeDiagnostics = {\n ...diagnostics,\n reused: runtime.reused,\n };\n const collectedData = options.bindings.browser\n ? runtime.playwright.getCollectedData()\n : undefined;\n const trackedResources = options.bindings.browser\n ? runtime.playwright.getTrackedResources()\n : undefined;\n return {\n runtime: runtimeDiagnostics,\n browser: collectedData\n ? createBrowserDiagnostics(collectedData, trackedResources)\n : undefined,\n test: {\n enabled: true as const,\n registeredTests: await runtime.testEnvironment.getTestCount(),\n lastRun,\n },\n };\n },\n async dispose(disposeOptions) {\n diagnostics.lifecycleState = \"disposing\";\n try {\n bindingsAdapter.abort(disposeOptions?.reason);\n await runtime.dispose(disposeOptions);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n };\n}\n"
5
+ "import {\n createBrowserDiagnostics,\n createRuntimeDiagnostics,\n} from \"../bridge/diagnostics.cjs\";\nimport {\n createRuntimeBindingsAdapter,\n type RuntimeBindingsAdapterOptions,\n} from \"../bridge/runtime-bindings.cjs\";\nimport type { RemoteRuntime, RuntimeOptions } from \"../internal/client/index.cjs\";\nimport { isBenignDisposeError } from \"../internal/client/index.cjs\";\nimport { createTestEventSubscriptions } from \"./test-event-subscriptions.cjs\";\nimport type {\n CreateTestRuntimeOptions,\n RunResults,\n TestRuntime,\n} from \"../types.cjs\";\n\nfunction createDisposedTestRuntimeError(): Error {\n return new Error(\"Test runtime has already been disposed.\");\n}\n\nexport async function createTestRuntimeAdapter(\n createRuntime: (options: RuntimeOptions) => Promise<RemoteRuntime>,\n options: CreateTestRuntimeOptions,\n adapterOptions?: RuntimeBindingsAdapterOptions,\n): Promise<TestRuntime> {\n const diagnostics = createRuntimeDiagnostics();\n const testEvents = createTestEventSubscriptions();\n let runtimeId = options.key ?? \"test-runtime\";\n let isDisposed = false;\n const bindingsAdapter = createRuntimeBindingsAdapter(\n options.bindings,\n () => runtimeId,\n diagnostics,\n adapterOptions,\n );\n const runtime = await createRuntime({\n ...bindingsAdapter.runtimeOptions,\n cwd: options.cwd,\n memoryLimitMB: options.memoryLimitMB,\n executionTimeout: options.executionTimeout,\n testEnvironment: {\n onEvent: (event) => testEvents.emit(event),\n },\n });\n runtimeId = runtime.id;\n\n let lastRun: RunResults | undefined;\n const ensureActive = (): void => {\n if (isDisposed) {\n throw createDisposedTestRuntimeError();\n }\n };\n testEvents.setEnsureUsable(ensureActive);\n\n return {\n async run(code, runOptions) {\n ensureActive();\n diagnostics.lifecycleState = \"active\";\n try {\n await runtime.testEnvironment.reset();\n await runtime.eval(code, {\n filename: runOptions?.filename,\n executionTimeout: runOptions?.timeoutMs,\n });\n lastRun = await runtime.testEnvironment.runTests(runOptions?.timeoutMs);\n return lastRun;\n } catch (error) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n } finally {\n diagnostics.lifecycleState = \"idle\";\n }\n },\n async diagnostics() {\n ensureActive();\n const runtimeDiagnostics = {\n ...diagnostics,\n reused: runtime.reused,\n };\n const collectedData = options.bindings.browser\n ? runtime.playwright.getCollectedData()\n : undefined;\n const trackedResources = options.bindings.browser\n ? runtime.playwright.getTrackedResources()\n : undefined;\n return {\n runtime: runtimeDiagnostics,\n browser: collectedData\n ? createBrowserDiagnostics(collectedData, trackedResources)\n : undefined,\n test: {\n enabled: true as const,\n registeredTests: await runtime.testEnvironment.getTestCount(),\n lastRun,\n },\n };\n },\n async dispose(disposeOptions) {\n if (isDisposed) {\n testEvents.clear();\n return;\n }\n\n isDisposed = true;\n diagnostics.lifecycleState = \"disposing\";\n try {\n bindingsAdapter.abort(disposeOptions?.reason);\n await runtime.dispose(disposeOptions);\n } catch (error) {\n if (!isBenignDisposeError(error)) {\n diagnostics.lastError = error instanceof Error ? error.message : String(error);\n throw error;\n }\n } finally {\n diagnostics.lifecycleState = \"idle\";\n testEvents.clear();\n }\n },\n test: testEvents.api,\n };\n}\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAHP;AAOO,IAHP;AAKqC,IAArC;AAOA,eAAsB,wBAAwB,CAC5C,eACA,SACA,gBACsB;AAAA,EACtB,MAAM,cAAc,4CAAyB;AAAA,EAC7C,IAAI,YAAY,QAAQ,OAAO;AAAA,EAC/B,MAAM,kBAAkB,qDACtB,QAAQ,UACR,MAAM,WACN,aACA,cACF;AAAA,EACA,MAAM,UAAU,MAAM,cAAc;AAAA,OAC/B,gBAAgB;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,IAC1B,iBAAiB;AAAA,EACnB,CAAC;AAAA,EACD,YAAY,QAAQ;AAAA,EAEpB,IAAI;AAAA,EAEJ,OAAO;AAAA,SACC,IAAG,CAAC,MAAM,YAAY;AAAA,MAC1B,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,MAAM,QAAQ,gBAAgB,MAAM;AAAA,QACpC,MAAM,QAAQ,KAAK,MAAM;AAAA,UACvB,UAAU,YAAY;AAAA,UACtB,kBAAkB,YAAY;AAAA,QAChC,CAAC;AAAA,QACD,UAAU,MAAM,QAAQ,gBAAgB,SAAS,YAAY,SAAS;AAAA,QACtE,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,YAAY,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC7E,MAAM;AAAA,gBACN;AAAA,QACA,YAAY,iBAAiB;AAAA;AAAA;AAAA,SAG3B,YAAW,GAAG;AAAA,MAClB,MAAM,qBAAqB;AAAA,WACtB;AAAA,QACH,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,MAAM,gBAAgB,QAAQ,SAAS,UACnC,QAAQ,WAAW,iBAAiB,IACpC;AAAA,MACJ,MAAM,mBAAmB,QAAQ,SAAS,UACtC,QAAQ,WAAW,oBAAoB,IACvC;AAAA,MACJ,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,gBACL,4CAAyB,eAAe,gBAAgB,IACxD;AAAA,QACJ,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,iBAAiB,MAAM,QAAQ,gBAAgB,aAAa;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA;AAAA,SAEI,QAAO,CAAC,gBAAgB;AAAA,MAC5B,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,gBAAgB,MAAM,gBAAgB,MAAM;AAAA,QAC5C,MAAM,QAAQ,QAAQ,cAAc;AAAA,QACpC,OAAO,OAAO;AAAA,QACd,IAAI,CAAC,mCAAqB,KAAK,GAAG;AAAA,UAChC,YAAY,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC7E,MAAM;AAAA,QACR;AAAA,gBACA;AAAA,QACA,YAAY,iBAAiB;AAAA;AAAA;AAAA,EAGnC;AAAA;",
8
- "debugId": "C4A9F9798611162364756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGO,IAHP;AAOO,IAHP;AAKqC,IAArC;AAC6C,IAA7C;AAOA,SAAS,8BAA8B,GAAU;AAAA,EAC/C,OAAO,IAAI,MAAM,yCAAyC;AAAA;AAG5D,eAAsB,wBAAwB,CAC5C,eACA,SACA,gBACsB;AAAA,EACtB,MAAM,cAAc,4CAAyB;AAAA,EAC7C,MAAM,aAAa,6DAA6B;AAAA,EAChD,IAAI,YAAY,QAAQ,OAAO;AAAA,EAC/B,IAAI,aAAa;AAAA,EACjB,MAAM,kBAAkB,qDACtB,QAAQ,UACR,MAAM,WACN,aACA,cACF;AAAA,EACA,MAAM,UAAU,MAAM,cAAc;AAAA,OAC/B,gBAAgB;AAAA,IACnB,KAAK,QAAQ;AAAA,IACb,eAAe,QAAQ;AAAA,IACvB,kBAAkB,QAAQ;AAAA,IAC1B,iBAAiB;AAAA,MACf,SAAS,CAAC,UAAU,WAAW,KAAK,KAAK;AAAA,IAC3C;AAAA,EACF,CAAC;AAAA,EACD,YAAY,QAAQ;AAAA,EAEpB,IAAI;AAAA,EACJ,MAAM,eAAe,MAAY;AAAA,IAC/B,IAAI,YAAY;AAAA,MACd,MAAM,+BAA+B;AAAA,IACvC;AAAA;AAAA,EAEF,WAAW,gBAAgB,YAAY;AAAA,EAEvC,OAAO;AAAA,SACC,IAAG,CAAC,MAAM,YAAY;AAAA,MAC1B,aAAa;AAAA,MACb,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,MAAM,QAAQ,gBAAgB,MAAM;AAAA,QACpC,MAAM,QAAQ,KAAK,MAAM;AAAA,UACvB,UAAU,YAAY;AAAA,UACtB,kBAAkB,YAAY;AAAA,QAChC,CAAC;AAAA,QACD,UAAU,MAAM,QAAQ,gBAAgB,SAAS,YAAY,SAAS;AAAA,QACtE,OAAO;AAAA,QACP,OAAO,OAAO;AAAA,QACd,YAAY,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,QAC7E,MAAM;AAAA,gBACN;AAAA,QACA,YAAY,iBAAiB;AAAA;AAAA;AAAA,SAG3B,YAAW,GAAG;AAAA,MAClB,aAAa;AAAA,MACb,MAAM,qBAAqB;AAAA,WACtB;AAAA,QACH,QAAQ,QAAQ;AAAA,MAClB;AAAA,MACA,MAAM,gBAAgB,QAAQ,SAAS,UACnC,QAAQ,WAAW,iBAAiB,IACpC;AAAA,MACJ,MAAM,mBAAmB,QAAQ,SAAS,UACtC,QAAQ,WAAW,oBAAoB,IACvC;AAAA,MACJ,OAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,gBACL,4CAAyB,eAAe,gBAAgB,IACxD;AAAA,QACJ,MAAM;AAAA,UACJ,SAAS;AAAA,UACT,iBAAiB,MAAM,QAAQ,gBAAgB,aAAa;AAAA,UAC5D;AAAA,QACF;AAAA,MACF;AAAA;AAAA,SAEI,QAAO,CAAC,gBAAgB;AAAA,MAC5B,IAAI,YAAY;AAAA,QACd,WAAW,MAAM;AAAA,QACjB;AAAA,MACF;AAAA,MAEA,aAAa;AAAA,MACb,YAAY,iBAAiB;AAAA,MAC7B,IAAI;AAAA,QACF,gBAAgB,MAAM,gBAAgB,MAAM;AAAA,QAC5C,MAAM,QAAQ,QAAQ,cAAc;AAAA,QACpC,OAAO,OAAO;AAAA,QACd,IAAI,CAAC,mCAAqB,KAAK,GAAG;AAAA,UAChC,YAAY,YAAY,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC7E,MAAM;AAAA,QACR;AAAA,gBACA;AAAA,QACA,YAAY,iBAAiB;AAAA,QAC7B,WAAW,MAAM;AAAA;AAAA;AAAA,IAGrB,MAAM,WAAW;AAAA,EACnB;AAAA;",
8
+ "debugId": "3C3652D67988D41064756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -134,9 +134,9 @@ function createRuntimeBindingsAdapter(bindings, getRuntimeId, diagnostics, optio
134
134
  return {
135
135
  runtimeOptions: {
136
136
  console: bindings.console?.onEntry ? {
137
- onEntry: (entry) => {
137
+ onEntry: async (entry) => {
138
138
  const context = contextFactory.createHostCallContext(`console:${crypto.randomUUID()}`);
139
- bindings.console?.onEntry?.(entry, context);
139
+ await bindings.console?.onEntry?.(entry, context);
140
140
  }
141
141
  } : undefined,
142
142
  fetch: bindings.fetch ? async (url, init) => {
@@ -298,6 +298,22 @@ function createBrowserPlaywrightOptions(browser, createHostCallContext) {
298
298
  if (!browser) {
299
299
  return;
300
300
  }
301
+ const hasHandler = typeof browser.handler === "function";
302
+ const hasFactoryBindings = typeof browser.createContext === "function" || typeof browser.createPage === "function" || typeof browser.readFile === "function" || typeof browser.writeFile === "function";
303
+ if (hasHandler && hasFactoryBindings) {
304
+ throw new Error("browser bindings must use either handler-first or factory-first mode, not both.");
305
+ }
306
+ if (hasHandler) {
307
+ return {
308
+ handler: browser.handler,
309
+ hasDefaultPage: false,
310
+ console: browser.captureConsole ?? false,
311
+ onEvent: browser.onEvent ? async (event) => {
312
+ const context = createHostCallContext(`browser:event:${event.type}:${crypto.randomUUID()}`);
313
+ await browser.onEvent?.(event, context);
314
+ } : undefined
315
+ };
316
+ }
301
317
  return {
302
318
  handler: createPlaywrightFactoryHandler({
303
319
  createContext: browser.createContext ? async (options) => {
@@ -324,9 +340,9 @@ function createBrowserPlaywrightOptions(browser, createHostCallContext) {
324
340
  }),
325
341
  hasDefaultPage: false,
326
342
  console: browser.captureConsole ?? false,
327
- onEvent: browser.onEvent ? (event) => {
343
+ onEvent: browser.onEvent ? async (event) => {
328
344
  const context = createHostCallContext(`browser:event:${event.type}:${crypto.randomUUID()}`);
329
- browser.onEvent?.(event, context);
345
+ await browser.onEvent?.(event, context);
330
346
  } : undefined
331
347
  };
332
348
  }
@@ -385,6 +401,7 @@ function createCustomFunctions(tools, nestedHost, createHostCallContext, diagnos
385
401
  "__isolateHost_closeHost",
386
402
  "__isolateHost_hostDiagnostics",
387
403
  "__isolateHost_createResource",
404
+ "__isolateHost_disposeNamespace",
388
405
  "__isolateHost_callResource",
389
406
  "__isolateHost_drainCallbacks"
390
407
  ];
@@ -426,6 +443,16 @@ function createCustomFunctions(tools, nestedHost, createHostCallContext, diagnos
426
443
  return await nestedHost.createResource(hostId, kind, resourceOptions, context);
427
444
  }
428
445
  };
446
+ definitions.__isolateHost_disposeNamespace = {
447
+ type: "async",
448
+ fn: async (...args) => {
449
+ const hostId = args[0];
450
+ const key = args[1];
451
+ const options = args[2] ?? undefined;
452
+ const context = createHostCallContext(`nestedHost:disposeNamespace:${crypto.randomUUID()}`);
453
+ await nestedHost.disposeNamespace(hostId, key, options, context);
454
+ }
455
+ };
429
456
  definitions.__isolateHost_callResource = {
430
457
  type: "async",
431
458
  fn: async (...args) => {
@@ -440,9 +467,10 @@ function createCustomFunctions(tools, nestedHost, createHostCallContext, diagnos
440
467
  definitions.__isolateHost_drainCallbacks = {
441
468
  type: "async",
442
469
  fn: async (...args) => {
443
- const callback = args[0];
444
- if (typeof callback === "function") {
445
- await callback();
470
+ const settleTurns = typeof args[0] === "number" && Number.isFinite(args[0]) && args[0] > 0 ? Math.floor(args[0]) : 1;
471
+ for (let index = 0;index < settleTurns; index += 1) {
472
+ await Promise.resolve();
473
+ await new Promise((resolve) => setTimeout(resolve, 0));
446
474
  }
447
475
  }
448
476
  };
@@ -455,4 +483,4 @@ export {
455
483
  createRuntimeBindingsAdapter
456
484
  };
457
485
 
458
- //# debugId=4C74BFDFE8D2E89C64756E2164756E21
486
+ //# debugId=0DD0C4D7159651C164756E2164756E21