@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.
- package/README.md +257 -18
- package/dist/cjs/bridge/diagnostics.cjs +37 -2
- package/dist/cjs/bridge/diagnostics.cjs.map +3 -3
- package/dist/cjs/bridge/runtime-bindings.cjs +230 -51
- package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
- package/dist/cjs/bridge/sandbox-isolate.cjs +464 -0
- package/dist/cjs/bridge/sandbox-isolate.cjs.map +10 -0
- package/dist/cjs/host/create-isolate-host.cjs +130 -25
- package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
- package/dist/cjs/host/nested-host-controller.cjs +369 -0
- package/dist/cjs/host/nested-host-controller.cjs.map +10 -0
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/internal/browser-source.cjs +102 -0
- package/dist/cjs/internal/browser-source.cjs.map +10 -0
- package/dist/cjs/internal/client/connection.cjs +163 -172
- package/dist/cjs/internal/client/connection.cjs.map +3 -3
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs +3 -3
- package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +3 -3
- package/dist/cjs/internal/daemon/connection.cjs +156 -13
- package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
- package/dist/cjs/internal/playwright/client.cjs +4 -2
- package/dist/cjs/internal/playwright/client.cjs.map +3 -3
- package/dist/cjs/internal/playwright/handler.cjs +298 -25
- package/dist/cjs/internal/playwright/handler.cjs.map +3 -3
- package/dist/cjs/internal/playwright/index.cjs +54 -8
- package/dist/cjs/internal/playwright/index.cjs.map +3 -3
- package/dist/cjs/internal/playwright/types.cjs +3 -1
- package/dist/cjs/internal/playwright/types.cjs.map +3 -3
- package/dist/cjs/internal/protocol/codec.cjs +16 -5
- package/dist/cjs/internal/protocol/codec.cjs.map +3 -3
- package/dist/cjs/internal/protocol/marshalValue.cjs +37 -6
- package/dist/cjs/internal/protocol/marshalValue.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 +377 -22
- package/dist/cjs/internal/runtime/index.cjs.map +3 -3
- package/dist/cjs/internal/typecheck/index.cjs +2 -1
- package/dist/cjs/internal/typecheck/index.cjs.map +3 -3
- package/dist/cjs/internal/typecheck/isolate-types.cjs +218 -13
- package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
- package/dist/cjs/internal/typecheck/typecheck.cjs +2 -3
- package/dist/cjs/internal/typecheck/typecheck.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 +181 -0
- package/dist/cjs/runtime/namespaced-runtime.cjs.map +10 -0
- package/dist/cjs/runtime/script-runtime.cjs +14 -12
- package/dist/cjs/runtime/script-runtime.cjs.map +3 -3
- package/dist/cjs/runtime/test-runtime.cjs +113 -0
- package/dist/cjs/runtime/test-runtime.cjs.map +10 -0
- package/dist/cjs/server/app-server.cjs +16 -9
- package/dist/cjs/server/app-server.cjs.map +3 -3
- package/dist/cjs/typecheck/index.cjs +2 -1
- package/dist/cjs/typecheck/index.cjs.map +3 -3
- package/dist/mjs/bridge/diagnostics.mjs +37 -2
- package/dist/mjs/bridge/diagnostics.mjs.map +3 -3
- package/dist/mjs/bridge/runtime-bindings.mjs +233 -51
- package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
- package/dist/mjs/bridge/sandbox-isolate.mjs +424 -0
- package/dist/mjs/bridge/sandbox-isolate.mjs.map +10 -0
- package/dist/mjs/host/create-isolate-host.mjs +132 -25
- package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
- package/dist/mjs/host/nested-host-controller.mjs +333 -0
- package/dist/mjs/host/nested-host-controller.mjs.map +10 -0
- package/dist/mjs/index.mjs.map +1 -1
- package/dist/mjs/internal/browser-source.mjs +62 -0
- package/dist/mjs/internal/browser-source.mjs.map +10 -0
- package/dist/mjs/internal/client/connection.mjs +165 -173
- package/dist/mjs/internal/client/connection.mjs.map +3 -3
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs +3 -3
- package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +3 -3
- package/dist/mjs/internal/daemon/connection.mjs +156 -13
- package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
- package/dist/mjs/internal/playwright/client.mjs +7 -3
- package/dist/mjs/internal/playwright/client.mjs.map +3 -3
- package/dist/mjs/internal/playwright/handler.mjs +300 -26
- package/dist/mjs/internal/playwright/handler.mjs.map +3 -3
- package/dist/mjs/internal/playwright/index.mjs +59 -9
- package/dist/mjs/internal/playwright/index.mjs.map +3 -3
- package/dist/mjs/internal/playwright/types.mjs +3 -1
- package/dist/mjs/internal/playwright/types.mjs.map +3 -3
- package/dist/mjs/internal/protocol/codec.mjs +16 -5
- package/dist/mjs/internal/protocol/codec.mjs.map +3 -3
- package/dist/mjs/internal/protocol/marshalValue.mjs +38 -6
- package/dist/mjs/internal/protocol/marshalValue.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 +377 -22
- package/dist/mjs/internal/runtime/index.mjs.map +3 -3
- package/dist/mjs/internal/typecheck/index.mjs +3 -1
- package/dist/mjs/internal/typecheck/index.mjs.map +3 -3
- package/dist/mjs/internal/typecheck/isolate-types.mjs +218 -13
- package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
- package/dist/mjs/internal/typecheck/typecheck.mjs +2 -3
- package/dist/mjs/internal/typecheck/typecheck.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 +143 -0
- package/dist/mjs/runtime/namespaced-runtime.mjs.map +10 -0
- package/dist/mjs/runtime/script-runtime.mjs +16 -12
- package/dist/mjs/runtime/script-runtime.mjs.map +3 -3
- package/dist/mjs/runtime/test-runtime.mjs +78 -0
- package/dist/mjs/runtime/test-runtime.mjs.map +10 -0
- package/dist/mjs/server/app-server.mjs +23 -11
- package/dist/mjs/server/app-server.mjs.map +3 -3
- package/dist/mjs/typecheck/index.mjs +2 -1
- package/dist/mjs/typecheck/index.mjs.map +3 -3
- package/dist/types/bridge/diagnostics.d.ts +6 -1
- package/dist/types/bridge/runtime-bindings.d.ts +5 -1
- package/dist/types/bridge/sandbox-isolate.d.ts +21 -0
- package/dist/types/host/nested-host-controller.d.ts +15 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/internal/browser-source.d.ts +10 -0
- package/dist/types/internal/client/types.d.ts +9 -0
- package/dist/types/internal/daemon/types.d.ts +0 -2
- package/dist/types/internal/playwright/client.d.ts +2 -2
- package/dist/types/internal/playwright/handler.d.ts +27 -4
- package/dist/types/internal/playwright/index.d.ts +2 -2
- package/dist/types/internal/playwright/types.d.ts +33 -1
- package/dist/types/internal/protocol/codec.d.ts +12 -2
- package/dist/types/internal/protocol/marshalValue.d.ts +3 -2
- package/dist/types/internal/protocol/types.d.ts +33 -2
- package/dist/types/internal/runtime/index.d.ts +5 -0
- package/dist/types/internal/typecheck/index.d.ts +1 -1
- package/dist/types/internal/typecheck/isolate-types.d.ts +6 -4
- package/dist/types/internal/typecheck/typecheck.d.ts +1 -1
- package/dist/types/playwright.d.ts +26 -0
- package/dist/types/runtime/namespaced-runtime.d.ts +11 -0
- package/dist/types/runtime/script-runtime.d.ts +2 -1
- package/dist/types/runtime/test-runtime.d.ts +4 -0
- package/dist/types/server/app-server.d.ts +2 -1
- package/dist/types/types.d.ts +75 -33
- package/package.json +8 -3
- package/dist/cjs/browser/browser-runtime.cjs +0 -157
- package/dist/cjs/browser/browser-runtime.cjs.map +0 -10
- package/dist/mjs/browser/browser-runtime.mjs +0 -93
- package/dist/mjs/browser/browser-runtime.mjs.map +0 -10
- package/dist/types/browser/browser-runtime.d.ts +0 -3
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
// src/internal/playwright/client.ts
|
|
2
2
|
import {
|
|
3
3
|
createPlaywrightHandler,
|
|
4
|
+
createPlaywrightFactoryHandler,
|
|
4
5
|
defaultPlaywrightHandler,
|
|
5
|
-
getDefaultPlaywrightHandlerMetadata
|
|
6
|
+
getDefaultPlaywrightHandlerMetadata,
|
|
7
|
+
getPlaywrightHandlerMetadata
|
|
6
8
|
} from "./handler.mjs";
|
|
7
9
|
export {
|
|
10
|
+
getPlaywrightHandlerMetadata,
|
|
8
11
|
getDefaultPlaywrightHandlerMetadata,
|
|
9
12
|
defaultPlaywrightHandler,
|
|
10
|
-
createPlaywrightHandler
|
|
13
|
+
createPlaywrightHandler,
|
|
14
|
+
createPlaywrightFactoryHandler
|
|
11
15
|
};
|
|
12
16
|
|
|
13
|
-
//# debugId=
|
|
17
|
+
//# debugId=8379B5CAA32F100364756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/internal/playwright/client.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"/**\n * Client-safe exports for ./index.ts\n * This module can be imported without loading isolated-vm\n */\n\n// Re-export types from types.ts\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n DefaultPlaywrightHandler,\n DefaultPlaywrightHandlerMetadata,\n DefaultPlaywrightHandlerOptions,\n PlaywrightSetupOptions,\n PlaywrightHandle,\n PlaywrightCallback,\n} from \"./types.mjs\";\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent, PlaywrightFileData } from \"../protocol/index.mjs\";\n\n// Re-export handler functions\nexport {\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"./handler.mjs\";\n"
|
|
5
|
+
"/**\n * Client-safe exports for ./index.ts\n * This module can be imported without loading isolated-vm\n */\n\n// Re-export types from types.ts\nexport type {\n NetworkRequestInfo,\n NetworkResponseInfo,\n BrowserConsoleLogEntry,\n PageErrorInfo,\n RequestFailureInfo,\n DefaultPlaywrightHandler,\n DefaultPlaywrightHandlerMetadata,\n DefaultPlaywrightHandlerOptions,\n PlaywrightCollector,\n PlaywrightHandlerMetadata,\n PlaywrightSetupOptions,\n PlaywrightHandle,\n PlaywrightCallback,\n} from \"./types.mjs\";\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent, PlaywrightFileData } from \"../protocol/index.mjs\";\n\n// Re-export handler functions\nexport {\n createPlaywrightHandler,\n createPlaywrightFactoryHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n getPlaywrightHandlerMetadata,\n} from \"./handler.mjs\";\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": ";AAyBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;",
|
|
8
|
+
"debugId": "8379B5CAA32F100364756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -1,9 +1,249 @@
|
|
|
1
1
|
// src/internal/playwright/handler.ts
|
|
2
2
|
import {
|
|
3
|
-
DEFAULT_PLAYWRIGHT_HANDLER_META
|
|
3
|
+
DEFAULT_PLAYWRIGHT_HANDLER_META,
|
|
4
|
+
PLAYWRIGHT_HANDLER_META
|
|
4
5
|
} from "./types.mjs";
|
|
5
6
|
var INPUT_FILES_VALIDATION_ERROR = "setInputFiles() expects a file path string, an array of file path strings, " + "a single inline file object ({ name, mimeType, buffer }), or an array of inline file objects.";
|
|
6
7
|
var MIXED_INPUT_FILES_ERROR = "setInputFiles() does not support mixing file paths and inline file objects in the same array.";
|
|
8
|
+
function cloneCollectedData(collectedData) {
|
|
9
|
+
return {
|
|
10
|
+
browserConsoleLogs: [...collectedData.browserConsoleLogs],
|
|
11
|
+
pageErrors: [...collectedData.pageErrors],
|
|
12
|
+
networkRequests: [...collectedData.networkRequests],
|
|
13
|
+
networkResponses: [...collectedData.networkResponses],
|
|
14
|
+
requestFailures: [...collectedData.requestFailures]
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function createPlaywrightCollector(registry) {
|
|
18
|
+
const emitEvent = (event) => {
|
|
19
|
+
for (const callback of registry.eventSubscribers) {
|
|
20
|
+
try {
|
|
21
|
+
callback(event);
|
|
22
|
+
} catch {}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const getRequestId = (request) => {
|
|
26
|
+
let requestId = registry.requestIds.get(request);
|
|
27
|
+
if (!requestId) {
|
|
28
|
+
requestId = `req_${registry.nextRequestId++}`;
|
|
29
|
+
registry.requestIds.set(request, requestId);
|
|
30
|
+
}
|
|
31
|
+
return requestId;
|
|
32
|
+
};
|
|
33
|
+
const toLocation = (location) => {
|
|
34
|
+
if (!location || !location.url && location.lineNumber == null && location.columnNumber == null) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
url: location.url || undefined,
|
|
39
|
+
lineNumber: location.lineNumber != null ? location.lineNumber + 1 : undefined,
|
|
40
|
+
columnNumber: location.columnNumber != null ? location.columnNumber + 1 : undefined
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
const registerContext = (context, preferredId, includeExistingPages = true) => {
|
|
44
|
+
const existingId = registry.contextIdsByObject.get(context);
|
|
45
|
+
if (existingId) {
|
|
46
|
+
return existingId;
|
|
47
|
+
}
|
|
48
|
+
const contextId = preferredId ?? `ctx_${registry.nextContextId++}`;
|
|
49
|
+
registry.contexts.set(contextId, {
|
|
50
|
+
context,
|
|
51
|
+
pageIds: new Set
|
|
52
|
+
});
|
|
53
|
+
registry.contextIdsByObject.set(context, contextId);
|
|
54
|
+
const onPage = (page) => {
|
|
55
|
+
registerPage(page, contextId);
|
|
56
|
+
};
|
|
57
|
+
const onClose = () => {
|
|
58
|
+
unregisterContext(contextId);
|
|
59
|
+
};
|
|
60
|
+
context.on("page", onPage);
|
|
61
|
+
context.on("close", onClose);
|
|
62
|
+
registry.contextListenerCleanups.set(contextId, () => {
|
|
63
|
+
context.removeListener("page", onPage);
|
|
64
|
+
context.removeListener("close", onClose);
|
|
65
|
+
});
|
|
66
|
+
if (includeExistingPages) {
|
|
67
|
+
for (const page of context.pages()) {
|
|
68
|
+
registerPage(page, contextId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return contextId;
|
|
72
|
+
};
|
|
73
|
+
const unregisterPage = (pageId) => {
|
|
74
|
+
const record = registry.pages.get(pageId);
|
|
75
|
+
if (!record) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
registry.pageListenerCleanups.get(pageId)?.();
|
|
79
|
+
registry.pageListenerCleanups.delete(pageId);
|
|
80
|
+
registry.pageIdsByObject.delete(record.page);
|
|
81
|
+
registry.pages.delete(pageId);
|
|
82
|
+
registry.contexts.get(record.contextId)?.pageIds.delete(pageId);
|
|
83
|
+
};
|
|
84
|
+
const unregisterContext = (contextId) => {
|
|
85
|
+
const record = registry.contexts.get(contextId);
|
|
86
|
+
if (!record) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
for (const pageId of [...record.pageIds]) {
|
|
90
|
+
unregisterPage(pageId);
|
|
91
|
+
}
|
|
92
|
+
registry.contextListenerCleanups.get(contextId)?.();
|
|
93
|
+
registry.contextListenerCleanups.delete(contextId);
|
|
94
|
+
registry.contextIdsByObject.delete(record.context);
|
|
95
|
+
registry.contexts.delete(contextId);
|
|
96
|
+
};
|
|
97
|
+
const registerPage = (page, preferredContextId, preferredPageId) => {
|
|
98
|
+
const existingId = registry.pageIdsByObject.get(page);
|
|
99
|
+
if (existingId) {
|
|
100
|
+
const existingRecord = registry.pages.get(existingId);
|
|
101
|
+
if (existingRecord && preferredContextId) {
|
|
102
|
+
registry.contexts.get(preferredContextId)?.pageIds.add(existingId);
|
|
103
|
+
}
|
|
104
|
+
return existingId;
|
|
105
|
+
}
|
|
106
|
+
const contextId = preferredContextId ?? registry.contextIdsByObject.get(page.context()) ?? registerContext(page.context());
|
|
107
|
+
const pageId = preferredPageId ?? `page_${registry.nextPageId++}`;
|
|
108
|
+
registry.pages.set(pageId, {
|
|
109
|
+
page,
|
|
110
|
+
contextId
|
|
111
|
+
});
|
|
112
|
+
registry.pageIdsByObject.set(page, pageId);
|
|
113
|
+
registry.contexts.get(contextId)?.pageIds.add(pageId);
|
|
114
|
+
const requestHandler = (request) => {
|
|
115
|
+
const info = {
|
|
116
|
+
contextId,
|
|
117
|
+
pageId,
|
|
118
|
+
requestId: getRequestId(request),
|
|
119
|
+
url: request.url(),
|
|
120
|
+
method: request.method(),
|
|
121
|
+
headers: request.headers(),
|
|
122
|
+
postData: request.postData() ?? undefined,
|
|
123
|
+
resourceType: request.resourceType(),
|
|
124
|
+
timestamp: Date.now()
|
|
125
|
+
};
|
|
126
|
+
registry.collectedData.networkRequests.push(info);
|
|
127
|
+
emitEvent({
|
|
128
|
+
type: "networkRequest",
|
|
129
|
+
...info
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
const responseHandler = (response) => {
|
|
133
|
+
const request = response.request();
|
|
134
|
+
const info = {
|
|
135
|
+
contextId,
|
|
136
|
+
pageId,
|
|
137
|
+
requestId: getRequestId(request),
|
|
138
|
+
url: response.url(),
|
|
139
|
+
status: response.status(),
|
|
140
|
+
statusText: response.statusText(),
|
|
141
|
+
headers: response.headers(),
|
|
142
|
+
resourceType: request.resourceType(),
|
|
143
|
+
timestamp: Date.now()
|
|
144
|
+
};
|
|
145
|
+
registry.collectedData.networkResponses.push(info);
|
|
146
|
+
emitEvent({
|
|
147
|
+
type: "networkResponse",
|
|
148
|
+
...info
|
|
149
|
+
});
|
|
150
|
+
};
|
|
151
|
+
const requestFailedHandler = (request) => {
|
|
152
|
+
const info = {
|
|
153
|
+
contextId,
|
|
154
|
+
pageId,
|
|
155
|
+
requestId: getRequestId(request),
|
|
156
|
+
url: request.url(),
|
|
157
|
+
method: request.method(),
|
|
158
|
+
failureText: request.failure()?.errorText || "request failed",
|
|
159
|
+
resourceType: request.resourceType(),
|
|
160
|
+
timestamp: Date.now()
|
|
161
|
+
};
|
|
162
|
+
registry.collectedData.requestFailures.push(info);
|
|
163
|
+
emitEvent({
|
|
164
|
+
type: "requestFailure",
|
|
165
|
+
...info
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
const consoleHandler = (msg) => {
|
|
169
|
+
const args = msg.args().map((arg) => String(arg));
|
|
170
|
+
const entry = {
|
|
171
|
+
contextId,
|
|
172
|
+
pageId,
|
|
173
|
+
level: msg.type(),
|
|
174
|
+
stdout: args.join(" "),
|
|
175
|
+
location: toLocation(msg.location()),
|
|
176
|
+
timestamp: Date.now()
|
|
177
|
+
};
|
|
178
|
+
registry.collectedData.browserConsoleLogs.push(entry);
|
|
179
|
+
emitEvent({
|
|
180
|
+
type: "browserConsoleLog",
|
|
181
|
+
...entry
|
|
182
|
+
});
|
|
183
|
+
};
|
|
184
|
+
const pageErrorHandler = (error) => {
|
|
185
|
+
const entry = {
|
|
186
|
+
contextId,
|
|
187
|
+
pageId,
|
|
188
|
+
name: error.name,
|
|
189
|
+
message: error.message,
|
|
190
|
+
stack: error.stack,
|
|
191
|
+
timestamp: Date.now()
|
|
192
|
+
};
|
|
193
|
+
registry.collectedData.pageErrors.push(entry);
|
|
194
|
+
emitEvent({
|
|
195
|
+
type: "pageError",
|
|
196
|
+
...entry
|
|
197
|
+
});
|
|
198
|
+
};
|
|
199
|
+
const closeHandler = () => {
|
|
200
|
+
unregisterPage(pageId);
|
|
201
|
+
};
|
|
202
|
+
page.on("request", requestHandler);
|
|
203
|
+
page.on("response", responseHandler);
|
|
204
|
+
page.on("requestfailed", requestFailedHandler);
|
|
205
|
+
page.on("console", consoleHandler);
|
|
206
|
+
page.on("pageerror", pageErrorHandler);
|
|
207
|
+
page.on("close", closeHandler);
|
|
208
|
+
registry.pageListenerCleanups.set(pageId, () => {
|
|
209
|
+
page.removeListener("request", requestHandler);
|
|
210
|
+
page.removeListener("response", responseHandler);
|
|
211
|
+
page.removeListener("requestfailed", requestFailedHandler);
|
|
212
|
+
page.removeListener("console", consoleHandler);
|
|
213
|
+
page.removeListener("pageerror", pageErrorHandler);
|
|
214
|
+
page.removeListener("close", closeHandler);
|
|
215
|
+
});
|
|
216
|
+
return pageId;
|
|
217
|
+
};
|
|
218
|
+
return {
|
|
219
|
+
registerContext,
|
|
220
|
+
registerPage,
|
|
221
|
+
unregisterContext,
|
|
222
|
+
unregisterPage,
|
|
223
|
+
getCollectedData() {
|
|
224
|
+
return cloneCollectedData(registry.collectedData);
|
|
225
|
+
},
|
|
226
|
+
getTrackedResources() {
|
|
227
|
+
return {
|
|
228
|
+
contexts: [...registry.contexts.keys()],
|
|
229
|
+
pages: [...registry.pages.keys()]
|
|
230
|
+
};
|
|
231
|
+
},
|
|
232
|
+
clearCollectedData() {
|
|
233
|
+
registry.collectedData.browserConsoleLogs.length = 0;
|
|
234
|
+
registry.collectedData.pageErrors.length = 0;
|
|
235
|
+
registry.collectedData.networkRequests.length = 0;
|
|
236
|
+
registry.collectedData.networkResponses.length = 0;
|
|
237
|
+
registry.collectedData.requestFailures.length = 0;
|
|
238
|
+
},
|
|
239
|
+
onEvent(callback) {
|
|
240
|
+
registry.eventSubscribers.add(callback);
|
|
241
|
+
return () => {
|
|
242
|
+
registry.eventSubscribers.delete(callback);
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
};
|
|
246
|
+
}
|
|
7
247
|
function isSerializedInputFilePayload(value) {
|
|
8
248
|
if (!value || typeof value !== "object") {
|
|
9
249
|
return false;
|
|
@@ -359,11 +599,11 @@ async function executeLocatorAction(locator, action, actionArg, timeout, fileIO)
|
|
|
359
599
|
});
|
|
360
600
|
if (opts?.path) {
|
|
361
601
|
if (!fileIO?.writeFile) {
|
|
362
|
-
throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or
|
|
602
|
+
throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or remove the path option.");
|
|
363
603
|
}
|
|
364
604
|
await fileIO.writeFile(opts.path, buffer);
|
|
365
605
|
}
|
|
366
|
-
return
|
|
606
|
+
return;
|
|
367
607
|
}
|
|
368
608
|
case "dragTo": {
|
|
369
609
|
const targetInfo = actionArg;
|
|
@@ -801,25 +1041,53 @@ function createPlaywrightHandler(page, options) {
|
|
|
801
1041
|
writeFile: options?.writeFile
|
|
802
1042
|
};
|
|
803
1043
|
const registry = {
|
|
804
|
-
pages: new Map
|
|
805
|
-
contexts: new Map
|
|
1044
|
+
pages: new Map,
|
|
1045
|
+
contexts: new Map,
|
|
1046
|
+
pageIdsByObject: new WeakMap,
|
|
1047
|
+
contextIdsByObject: new WeakMap,
|
|
806
1048
|
nextPageId: 1,
|
|
807
1049
|
nextContextId: 1,
|
|
1050
|
+
nextRequestId: 1,
|
|
808
1051
|
pendingResponses: new Map,
|
|
809
1052
|
pendingRequests: new Map,
|
|
810
|
-
nextListenerId: 0
|
|
1053
|
+
nextListenerId: 0,
|
|
1054
|
+
requestIds: new WeakMap,
|
|
1055
|
+
pageListenerCleanups: new Map,
|
|
1056
|
+
contextListenerCleanups: new Map,
|
|
1057
|
+
eventSubscribers: new Set,
|
|
1058
|
+
collectedData: {
|
|
1059
|
+
browserConsoleLogs: [],
|
|
1060
|
+
pageErrors: [],
|
|
1061
|
+
networkRequests: [],
|
|
1062
|
+
networkResponses: [],
|
|
1063
|
+
requestFailures: []
|
|
1064
|
+
}
|
|
811
1065
|
};
|
|
812
|
-
|
|
1066
|
+
const collector = createPlaywrightCollector(registry);
|
|
1067
|
+
if (page) {
|
|
1068
|
+
collector.registerContext(page.context(), "ctx_0", false);
|
|
1069
|
+
collector.registerPage(page, "ctx_0", "page_0");
|
|
1070
|
+
}
|
|
1071
|
+
const handler = async (op) => {
|
|
813
1072
|
try {
|
|
814
1073
|
switch (op.type) {
|
|
1074
|
+
case "contexts":
|
|
1075
|
+
return { ok: true, value: [...registry.contexts.keys()] };
|
|
1076
|
+
case "pages": {
|
|
1077
|
+
const contextId2 = op.contextId ?? "ctx_0";
|
|
1078
|
+
const context = registry.contexts.get(contextId2);
|
|
1079
|
+
if (!context) {
|
|
1080
|
+
return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
|
|
1081
|
+
}
|
|
1082
|
+
return { ok: true, value: [...context.pageIds] };
|
|
1083
|
+
}
|
|
815
1084
|
case "newContext": {
|
|
816
1085
|
if (!options?.createContext) {
|
|
817
1086
|
return { ok: false, error: { name: "Error", message: "createContext callback not provided. Configure createContext in playwright options to enable browser.newContext()." } };
|
|
818
1087
|
}
|
|
819
1088
|
const [contextOptions] = op.args;
|
|
820
1089
|
const newContext = await options.createContext(contextOptions);
|
|
821
|
-
const contextId2 =
|
|
822
|
-
registry.contexts.set(contextId2, newContext);
|
|
1090
|
+
const contextId2 = collector.registerContext(newContext);
|
|
823
1091
|
return { ok: true, value: { contextId: contextId2 } };
|
|
824
1092
|
}
|
|
825
1093
|
case "newPage": {
|
|
@@ -831,9 +1099,8 @@ function createPlaywrightHandler(page, options) {
|
|
|
831
1099
|
if (!targetContext2) {
|
|
832
1100
|
return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
|
|
833
1101
|
}
|
|
834
|
-
const newPage = await options.createPage(targetContext2);
|
|
835
|
-
const pageId2 =
|
|
836
|
-
registry.pages.set(pageId2, newPage);
|
|
1102
|
+
const newPage = await options.createPage(targetContext2.context);
|
|
1103
|
+
const pageId2 = collector.registerPage(newPage, contextId2);
|
|
837
1104
|
return { ok: true, value: { pageId: pageId2 } };
|
|
838
1105
|
}
|
|
839
1106
|
case "closeContext": {
|
|
@@ -842,23 +1109,18 @@ function createPlaywrightHandler(page, options) {
|
|
|
842
1109
|
if (!context) {
|
|
843
1110
|
return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
|
|
844
1111
|
}
|
|
845
|
-
await context.close();
|
|
846
|
-
|
|
847
|
-
for (const [pid, p] of registry.pages) {
|
|
848
|
-
if (p.context() === context) {
|
|
849
|
-
registry.pages.delete(pid);
|
|
850
|
-
}
|
|
851
|
-
}
|
|
1112
|
+
await context.context.close();
|
|
1113
|
+
collector.unregisterContext(contextId2);
|
|
852
1114
|
return { ok: true };
|
|
853
1115
|
}
|
|
854
1116
|
}
|
|
855
1117
|
const pageId = op.pageId ?? "page_0";
|
|
856
|
-
const targetPage = registry.pages.get(pageId);
|
|
1118
|
+
const targetPage = registry.pages.get(pageId)?.page;
|
|
857
1119
|
if (!targetPage) {
|
|
858
1120
|
return { ok: false, error: { name: "Error", message: `Page ${pageId} not found` } };
|
|
859
1121
|
}
|
|
860
1122
|
const contextId = op.contextId ?? "ctx_0";
|
|
861
|
-
const targetContext = registry.contexts.get(contextId);
|
|
1123
|
+
const targetContext = registry.contexts.get(contextId)?.context;
|
|
862
1124
|
switch (op.type) {
|
|
863
1125
|
case "goto": {
|
|
864
1126
|
const [url, waitUntil] = op.args;
|
|
@@ -1218,11 +1480,11 @@ function createPlaywrightHandler(page, options) {
|
|
|
1218
1480
|
});
|
|
1219
1481
|
if (screenshotOptions?.path) {
|
|
1220
1482
|
if (!fileIO.writeFile) {
|
|
1221
|
-
throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or
|
|
1483
|
+
throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or remove the path option.");
|
|
1222
1484
|
}
|
|
1223
1485
|
await fileIO.writeFile(screenshotOptions.path, buffer);
|
|
1224
1486
|
}
|
|
1225
|
-
return { ok: true
|
|
1487
|
+
return { ok: true };
|
|
1226
1488
|
}
|
|
1227
1489
|
case "setViewportSize": {
|
|
1228
1490
|
const [size] = op.args;
|
|
@@ -1304,7 +1566,7 @@ function createPlaywrightHandler(page, options) {
|
|
|
1304
1566
|
}
|
|
1305
1567
|
case "close": {
|
|
1306
1568
|
await targetPage.close();
|
|
1307
|
-
|
|
1569
|
+
collector.unregisterPage(pageId);
|
|
1308
1570
|
return { ok: true };
|
|
1309
1571
|
}
|
|
1310
1572
|
case "isClosed": {
|
|
@@ -1356,23 +1618,35 @@ function createPlaywrightHandler(page, options) {
|
|
|
1356
1618
|
return { ok: false, error: { name: error.name, message: error.message } };
|
|
1357
1619
|
}
|
|
1358
1620
|
};
|
|
1621
|
+
handler[PLAYWRIGHT_HANDLER_META] = {
|
|
1622
|
+
collector
|
|
1623
|
+
};
|
|
1624
|
+
return handler;
|
|
1359
1625
|
}
|
|
1360
1626
|
function defaultPlaywrightHandler(page, options) {
|
|
1361
1627
|
const handler = createPlaywrightHandler(page, options);
|
|
1362
1628
|
handler[DEFAULT_PLAYWRIGHT_HANDLER_META] = { page, options };
|
|
1363
1629
|
return handler;
|
|
1364
1630
|
}
|
|
1631
|
+
function createPlaywrightFactoryHandler(options) {
|
|
1632
|
+
return createPlaywrightHandler(undefined, options);
|
|
1633
|
+
}
|
|
1634
|
+
function getPlaywrightHandlerMetadata(handler) {
|
|
1635
|
+
return handler[PLAYWRIGHT_HANDLER_META];
|
|
1636
|
+
}
|
|
1365
1637
|
function getDefaultPlaywrightHandlerMetadata(handler) {
|
|
1366
1638
|
return handler[DEFAULT_PLAYWRIGHT_HANDLER_META];
|
|
1367
1639
|
}
|
|
1368
1640
|
export {
|
|
1641
|
+
getPlaywrightHandlerMetadata,
|
|
1369
1642
|
getLocator,
|
|
1370
1643
|
getDefaultPlaywrightHandlerMetadata,
|
|
1371
1644
|
executePageExpectAssertion,
|
|
1372
1645
|
executeLocatorAction,
|
|
1373
1646
|
executeExpectAssertion,
|
|
1374
1647
|
defaultPlaywrightHandler,
|
|
1375
|
-
createPlaywrightHandler
|
|
1648
|
+
createPlaywrightHandler,
|
|
1649
|
+
createPlaywrightFactoryHandler
|
|
1376
1650
|
};
|
|
1377
1651
|
|
|
1378
|
-
//# debugId=
|
|
1652
|
+
//# debugId=43FD6984CD8B4A1E64756E2164756E21
|