@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.
- package/README.md +101 -1
- package/dist/cjs/bridge/runtime-bindings.cjs +36 -8
- package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
- package/dist/cjs/bridge/sandbox-isolate.cjs +157 -2
- package/dist/cjs/bridge/sandbox-isolate.cjs.map +3 -3
- package/dist/cjs/host/create-isolate-host.cjs +85 -1
- package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
- package/dist/cjs/host/nested-host-controller.cjs +95 -5
- package/dist/cjs/host/nested-host-controller.cjs.map +3 -3
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal/browser-source.cjs +16 -5
- package/dist/cjs/internal/browser-source.cjs.map +3 -3
- package/dist/cjs/internal/client/connection.cjs +20 -9
- package/dist/cjs/internal/client/connection.cjs.map +3 -3
- package/dist/cjs/internal/daemon/connection.cjs +28 -10
- package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
- package/dist/cjs/internal/protocol/types.cjs +2 -1
- package/dist/cjs/internal/protocol/types.cjs.map +3 -3
- package/dist/cjs/internal/runtime/index.cjs +5 -2
- package/dist/cjs/internal/runtime/index.cjs.map +3 -3
- package/dist/cjs/internal/typecheck/isolate-types.cjs +82 -1
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/playwright.cjs +76 -0
- package/dist/cjs/playwright.cjs.map +10 -0
- package/dist/cjs/runtime/namespaced-runtime.cjs +184 -0
- package/dist/cjs/runtime/namespaced-runtime.cjs.map +10 -0
- package/dist/cjs/runtime/test-event-subscriptions.cjs +76 -0
- package/dist/cjs/runtime/test-event-subscriptions.cjs.map +10 -0
- package/dist/cjs/runtime/test-runtime.cjs +26 -3
- package/dist/cjs/runtime/test-runtime.cjs.map +3 -3
- package/dist/mjs/bridge/runtime-bindings.mjs +36 -8
- package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
- package/dist/mjs/bridge/sandbox-isolate.mjs +157 -2
- package/dist/mjs/bridge/sandbox-isolate.mjs.map +3 -3
- package/dist/mjs/host/create-isolate-host.mjs +85 -1
- package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
- package/dist/mjs/host/nested-host-controller.mjs +95 -5
- package/dist/mjs/host/nested-host-controller.mjs.map +3 -3
- package/dist/mjs/index.mjs.map +1 -1
- package/dist/mjs/internal/browser-source.mjs +16 -5
- package/dist/mjs/internal/browser-source.mjs.map +3 -3
- package/dist/mjs/internal/client/connection.mjs +20 -9
- package/dist/mjs/internal/client/connection.mjs.map +3 -3
- package/dist/mjs/internal/daemon/connection.mjs +28 -10
- package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
- package/dist/mjs/internal/protocol/types.mjs +2 -1
- package/dist/mjs/internal/protocol/types.mjs.map +3 -3
- package/dist/mjs/internal/runtime/index.mjs +5 -2
- package/dist/mjs/internal/runtime/index.mjs.map +3 -3
- package/dist/mjs/internal/typecheck/isolate-types.mjs +82 -1
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
- package/dist/mjs/package.json +1 -1
- package/dist/mjs/playwright.mjs +47 -0
- package/dist/mjs/playwright.mjs.map +10 -0
- package/dist/mjs/runtime/namespaced-runtime.mjs +146 -0
- package/dist/mjs/runtime/namespaced-runtime.mjs.map +10 -0
- package/dist/mjs/runtime/test-event-subscriptions.mjs +36 -0
- package/dist/mjs/runtime/test-event-subscriptions.mjs.map +10 -0
- package/dist/mjs/runtime/test-runtime.mjs +26 -3
- package/dist/mjs/runtime/test-runtime.mjs.map +3 -3
- package/dist/types/bridge/sandbox-isolate.d.ts +9 -3
- package/dist/types/host/nested-host-controller.d.ts +5 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/internal/browser-source.d.ts +1 -2
- package/dist/types/internal/client/types.d.ts +4 -0
- package/dist/types/internal/protocol/types.d.ts +8 -1
- package/dist/types/internal/typecheck/isolate-types.d.ts +2 -2
- package/dist/types/playwright.d.ts +26 -0
- package/dist/types/runtime/namespaced-runtime.d.ts +13 -0
- package/dist/types/runtime/test-event-subscriptions.d.ts +12 -0
- package/dist/types/types.d.ts +51 -3
- 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:
|
|
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=
|
|
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:
|
|
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,
|
|
8
|
-
"debugId": "
|
|
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
|
|
444
|
-
|
|
445
|
-
await
|
|
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=
|
|
486
|
+
//# debugId=0DD0C4D7159651C164756E2164756E21
|