@ricsam/isolate 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/README.md +257 -18
  2. package/dist/cjs/bridge/diagnostics.cjs +37 -2
  3. package/dist/cjs/bridge/diagnostics.cjs.map +3 -3
  4. package/dist/cjs/bridge/runtime-bindings.cjs +230 -51
  5. package/dist/cjs/bridge/runtime-bindings.cjs.map +3 -3
  6. package/dist/cjs/bridge/sandbox-isolate.cjs +464 -0
  7. package/dist/cjs/bridge/sandbox-isolate.cjs.map +10 -0
  8. package/dist/cjs/host/create-isolate-host.cjs +130 -25
  9. package/dist/cjs/host/create-isolate-host.cjs.map +3 -3
  10. package/dist/cjs/host/nested-host-controller.cjs +369 -0
  11. package/dist/cjs/host/nested-host-controller.cjs.map +10 -0
  12. package/dist/cjs/index.cjs.map +1 -1
  13. package/dist/cjs/internal/browser-source.cjs +102 -0
  14. package/dist/cjs/internal/browser-source.cjs.map +10 -0
  15. package/dist/cjs/internal/client/connection.cjs +163 -172
  16. package/dist/cjs/internal/client/connection.cjs.map +3 -3
  17. package/dist/cjs/internal/daemon/callback-fs-handler.cjs +3 -3
  18. package/dist/cjs/internal/daemon/callback-fs-handler.cjs.map +3 -3
  19. package/dist/cjs/internal/daemon/connection.cjs +156 -13
  20. package/dist/cjs/internal/daemon/connection.cjs.map +3 -3
  21. package/dist/cjs/internal/playwright/client.cjs +4 -2
  22. package/dist/cjs/internal/playwright/client.cjs.map +3 -3
  23. package/dist/cjs/internal/playwright/handler.cjs +298 -25
  24. package/dist/cjs/internal/playwright/handler.cjs.map +3 -3
  25. package/dist/cjs/internal/playwright/index.cjs +54 -8
  26. package/dist/cjs/internal/playwright/index.cjs.map +3 -3
  27. package/dist/cjs/internal/playwright/types.cjs +3 -1
  28. package/dist/cjs/internal/playwright/types.cjs.map +3 -3
  29. package/dist/cjs/internal/protocol/codec.cjs +16 -5
  30. package/dist/cjs/internal/protocol/codec.cjs.map +3 -3
  31. package/dist/cjs/internal/protocol/marshalValue.cjs +37 -6
  32. package/dist/cjs/internal/protocol/marshalValue.cjs.map +3 -3
  33. package/dist/cjs/internal/protocol/types.cjs +2 -1
  34. package/dist/cjs/internal/protocol/types.cjs.map +3 -3
  35. package/dist/cjs/internal/runtime/index.cjs +377 -22
  36. package/dist/cjs/internal/runtime/index.cjs.map +3 -3
  37. package/dist/cjs/internal/typecheck/index.cjs +2 -1
  38. package/dist/cjs/internal/typecheck/index.cjs.map +3 -3
  39. package/dist/cjs/internal/typecheck/isolate-types.cjs +218 -13
  40. package/dist/cjs/internal/typecheck/isolate-types.cjs.map +3 -3
  41. package/dist/cjs/internal/typecheck/typecheck.cjs +2 -3
  42. package/dist/cjs/internal/typecheck/typecheck.cjs.map +3 -3
  43. package/dist/cjs/package.json +1 -1
  44. package/dist/cjs/playwright.cjs +76 -0
  45. package/dist/cjs/playwright.cjs.map +10 -0
  46. package/dist/cjs/runtime/namespaced-runtime.cjs +181 -0
  47. package/dist/cjs/runtime/namespaced-runtime.cjs.map +10 -0
  48. package/dist/cjs/runtime/script-runtime.cjs +14 -12
  49. package/dist/cjs/runtime/script-runtime.cjs.map +3 -3
  50. package/dist/cjs/runtime/test-runtime.cjs +113 -0
  51. package/dist/cjs/runtime/test-runtime.cjs.map +10 -0
  52. package/dist/cjs/server/app-server.cjs +16 -9
  53. package/dist/cjs/server/app-server.cjs.map +3 -3
  54. package/dist/cjs/typecheck/index.cjs +2 -1
  55. package/dist/cjs/typecheck/index.cjs.map +3 -3
  56. package/dist/mjs/bridge/diagnostics.mjs +37 -2
  57. package/dist/mjs/bridge/diagnostics.mjs.map +3 -3
  58. package/dist/mjs/bridge/runtime-bindings.mjs +233 -51
  59. package/dist/mjs/bridge/runtime-bindings.mjs.map +3 -3
  60. package/dist/mjs/bridge/sandbox-isolate.mjs +424 -0
  61. package/dist/mjs/bridge/sandbox-isolate.mjs.map +10 -0
  62. package/dist/mjs/host/create-isolate-host.mjs +132 -25
  63. package/dist/mjs/host/create-isolate-host.mjs.map +3 -3
  64. package/dist/mjs/host/nested-host-controller.mjs +333 -0
  65. package/dist/mjs/host/nested-host-controller.mjs.map +10 -0
  66. package/dist/mjs/index.mjs.map +1 -1
  67. package/dist/mjs/internal/browser-source.mjs +62 -0
  68. package/dist/mjs/internal/browser-source.mjs.map +10 -0
  69. package/dist/mjs/internal/client/connection.mjs +165 -173
  70. package/dist/mjs/internal/client/connection.mjs.map +3 -3
  71. package/dist/mjs/internal/daemon/callback-fs-handler.mjs +3 -3
  72. package/dist/mjs/internal/daemon/callback-fs-handler.mjs.map +3 -3
  73. package/dist/mjs/internal/daemon/connection.mjs +156 -13
  74. package/dist/mjs/internal/daemon/connection.mjs.map +3 -3
  75. package/dist/mjs/internal/playwright/client.mjs +7 -3
  76. package/dist/mjs/internal/playwright/client.mjs.map +3 -3
  77. package/dist/mjs/internal/playwright/handler.mjs +300 -26
  78. package/dist/mjs/internal/playwright/handler.mjs.map +3 -3
  79. package/dist/mjs/internal/playwright/index.mjs +59 -9
  80. package/dist/mjs/internal/playwright/index.mjs.map +3 -3
  81. package/dist/mjs/internal/playwright/types.mjs +3 -1
  82. package/dist/mjs/internal/playwright/types.mjs.map +3 -3
  83. package/dist/mjs/internal/protocol/codec.mjs +16 -5
  84. package/dist/mjs/internal/protocol/codec.mjs.map +3 -3
  85. package/dist/mjs/internal/protocol/marshalValue.mjs +38 -6
  86. package/dist/mjs/internal/protocol/marshalValue.mjs.map +3 -3
  87. package/dist/mjs/internal/protocol/types.mjs +2 -1
  88. package/dist/mjs/internal/protocol/types.mjs.map +3 -3
  89. package/dist/mjs/internal/runtime/index.mjs +377 -22
  90. package/dist/mjs/internal/runtime/index.mjs.map +3 -3
  91. package/dist/mjs/internal/typecheck/index.mjs +3 -1
  92. package/dist/mjs/internal/typecheck/index.mjs.map +3 -3
  93. package/dist/mjs/internal/typecheck/isolate-types.mjs +218 -13
  94. package/dist/mjs/internal/typecheck/isolate-types.mjs.map +3 -3
  95. package/dist/mjs/internal/typecheck/typecheck.mjs +2 -3
  96. package/dist/mjs/internal/typecheck/typecheck.mjs.map +3 -3
  97. package/dist/mjs/package.json +1 -1
  98. package/dist/mjs/playwright.mjs +47 -0
  99. package/dist/mjs/playwright.mjs.map +10 -0
  100. package/dist/mjs/runtime/namespaced-runtime.mjs +143 -0
  101. package/dist/mjs/runtime/namespaced-runtime.mjs.map +10 -0
  102. package/dist/mjs/runtime/script-runtime.mjs +16 -12
  103. package/dist/mjs/runtime/script-runtime.mjs.map +3 -3
  104. package/dist/mjs/runtime/test-runtime.mjs +78 -0
  105. package/dist/mjs/runtime/test-runtime.mjs.map +10 -0
  106. package/dist/mjs/server/app-server.mjs +23 -11
  107. package/dist/mjs/server/app-server.mjs.map +3 -3
  108. package/dist/mjs/typecheck/index.mjs +2 -1
  109. package/dist/mjs/typecheck/index.mjs.map +3 -3
  110. package/dist/types/bridge/diagnostics.d.ts +6 -1
  111. package/dist/types/bridge/runtime-bindings.d.ts +5 -1
  112. package/dist/types/bridge/sandbox-isolate.d.ts +21 -0
  113. package/dist/types/host/nested-host-controller.d.ts +15 -0
  114. package/dist/types/index.d.ts +1 -1
  115. package/dist/types/internal/browser-source.d.ts +10 -0
  116. package/dist/types/internal/client/types.d.ts +9 -0
  117. package/dist/types/internal/daemon/types.d.ts +0 -2
  118. package/dist/types/internal/playwright/client.d.ts +2 -2
  119. package/dist/types/internal/playwright/handler.d.ts +27 -4
  120. package/dist/types/internal/playwright/index.d.ts +2 -2
  121. package/dist/types/internal/playwright/types.d.ts +33 -1
  122. package/dist/types/internal/protocol/codec.d.ts +12 -2
  123. package/dist/types/internal/protocol/marshalValue.d.ts +3 -2
  124. package/dist/types/internal/protocol/types.d.ts +33 -2
  125. package/dist/types/internal/runtime/index.d.ts +5 -0
  126. package/dist/types/internal/typecheck/index.d.ts +1 -1
  127. package/dist/types/internal/typecheck/isolate-types.d.ts +6 -4
  128. package/dist/types/internal/typecheck/typecheck.d.ts +1 -1
  129. package/dist/types/playwright.d.ts +26 -0
  130. package/dist/types/runtime/namespaced-runtime.d.ts +11 -0
  131. package/dist/types/runtime/script-runtime.d.ts +2 -1
  132. package/dist/types/runtime/test-runtime.d.ts +4 -0
  133. package/dist/types/server/app-server.d.ts +2 -1
  134. package/dist/types/types.d.ts +75 -33
  135. package/package.json +8 -3
  136. package/dist/cjs/browser/browser-runtime.cjs +0 -157
  137. package/dist/cjs/browser/browser-runtime.cjs.map +0 -10
  138. package/dist/mjs/browser/browser-runtime.mjs +0 -93
  139. package/dist/mjs/browser/browser-runtime.mjs.map +0 -10
  140. package/dist/types/browser/browser-runtime.d.ts +0 -3
@@ -39,11 +39,13 @@ var __export = (target, all) => {
39
39
  // src/internal/playwright/client.ts
40
40
  var exports_client = {};
41
41
  __export(exports_client, {
42
+ getPlaywrightHandlerMetadata: () => import_handler.getPlaywrightHandlerMetadata,
42
43
  getDefaultPlaywrightHandlerMetadata: () => import_handler.getDefaultPlaywrightHandlerMetadata,
43
44
  defaultPlaywrightHandler: () => import_handler.defaultPlaywrightHandler,
44
- createPlaywrightHandler: () => import_handler.createPlaywrightHandler
45
+ createPlaywrightHandler: () => import_handler.createPlaywrightHandler,
46
+ createPlaywrightFactoryHandler: () => import_handler.createPlaywrightFactoryHandler
45
47
  });
46
48
  module.exports = __toCommonJS(exports_client);
47
49
  var import_handler = require("./handler.cjs");
48
50
 
49
- //# debugId=074A4B0BA48AFF2564756E2164756E21
51
+ //# debugId=BD3C24F38A9EF75364756E2164756E21
@@ -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.cjs\";\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent, PlaywrightFileData } from \"../protocol/index.cjs\";\n\n// Re-export handler functions\nexport {\n createPlaywrightHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n} from \"./handler.cjs\";\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.cjs\";\n\nexport type { PlaywrightOperation, PlaywrightResult, PlaywrightEvent, PlaywrightFileData } from \"../protocol/index.cjs\";\n\n// Re-export handler functions\nexport {\n createPlaywrightHandler,\n createPlaywrightFactoryHandler,\n defaultPlaywrightHandler,\n getDefaultPlaywrightHandlerMetadata,\n getPlaywrightHandlerMetadata,\n} from \"./handler.cjs\";\n"
6
6
  ],
7
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,IAJP;",
8
- "debugId": "074A4B0BA48AFF2564756E2164756E21",
7
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,IANP;",
8
+ "debugId": "BD3C24F38A9EF75364756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -39,18 +39,259 @@ var __export = (target, all) => {
39
39
  // src/internal/playwright/handler.ts
40
40
  var exports_handler = {};
41
41
  __export(exports_handler, {
42
+ getPlaywrightHandlerMetadata: () => getPlaywrightHandlerMetadata,
42
43
  getLocator: () => getLocator,
43
44
  getDefaultPlaywrightHandlerMetadata: () => getDefaultPlaywrightHandlerMetadata,
44
45
  executePageExpectAssertion: () => executePageExpectAssertion,
45
46
  executeLocatorAction: () => executeLocatorAction,
46
47
  executeExpectAssertion: () => executeExpectAssertion,
47
48
  defaultPlaywrightHandler: () => defaultPlaywrightHandler,
48
- createPlaywrightHandler: () => createPlaywrightHandler
49
+ createPlaywrightHandler: () => createPlaywrightHandler,
50
+ createPlaywrightFactoryHandler: () => createPlaywrightFactoryHandler
49
51
  });
50
52
  module.exports = __toCommonJS(exports_handler);
51
53
  var import_types = require("./types.cjs");
52
54
  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.";
53
55
  var MIXED_INPUT_FILES_ERROR = "setInputFiles() does not support mixing file paths and inline file objects in the same array.";
56
+ function cloneCollectedData(collectedData) {
57
+ return {
58
+ browserConsoleLogs: [...collectedData.browserConsoleLogs],
59
+ pageErrors: [...collectedData.pageErrors],
60
+ networkRequests: [...collectedData.networkRequests],
61
+ networkResponses: [...collectedData.networkResponses],
62
+ requestFailures: [...collectedData.requestFailures]
63
+ };
64
+ }
65
+ function createPlaywrightCollector(registry) {
66
+ const emitEvent = (event) => {
67
+ for (const callback of registry.eventSubscribers) {
68
+ try {
69
+ callback(event);
70
+ } catch {}
71
+ }
72
+ };
73
+ const getRequestId = (request) => {
74
+ let requestId = registry.requestIds.get(request);
75
+ if (!requestId) {
76
+ requestId = `req_${registry.nextRequestId++}`;
77
+ registry.requestIds.set(request, requestId);
78
+ }
79
+ return requestId;
80
+ };
81
+ const toLocation = (location) => {
82
+ if (!location || !location.url && location.lineNumber == null && location.columnNumber == null) {
83
+ return;
84
+ }
85
+ return {
86
+ url: location.url || undefined,
87
+ lineNumber: location.lineNumber != null ? location.lineNumber + 1 : undefined,
88
+ columnNumber: location.columnNumber != null ? location.columnNumber + 1 : undefined
89
+ };
90
+ };
91
+ const registerContext = (context, preferredId, includeExistingPages = true) => {
92
+ const existingId = registry.contextIdsByObject.get(context);
93
+ if (existingId) {
94
+ return existingId;
95
+ }
96
+ const contextId = preferredId ?? `ctx_${registry.nextContextId++}`;
97
+ registry.contexts.set(contextId, {
98
+ context,
99
+ pageIds: new Set
100
+ });
101
+ registry.contextIdsByObject.set(context, contextId);
102
+ const onPage = (page) => {
103
+ registerPage(page, contextId);
104
+ };
105
+ const onClose = () => {
106
+ unregisterContext(contextId);
107
+ };
108
+ context.on("page", onPage);
109
+ context.on("close", onClose);
110
+ registry.contextListenerCleanups.set(contextId, () => {
111
+ context.removeListener("page", onPage);
112
+ context.removeListener("close", onClose);
113
+ });
114
+ if (includeExistingPages) {
115
+ for (const page of context.pages()) {
116
+ registerPage(page, contextId);
117
+ }
118
+ }
119
+ return contextId;
120
+ };
121
+ const unregisterPage = (pageId) => {
122
+ const record = registry.pages.get(pageId);
123
+ if (!record) {
124
+ return;
125
+ }
126
+ registry.pageListenerCleanups.get(pageId)?.();
127
+ registry.pageListenerCleanups.delete(pageId);
128
+ registry.pageIdsByObject.delete(record.page);
129
+ registry.pages.delete(pageId);
130
+ registry.contexts.get(record.contextId)?.pageIds.delete(pageId);
131
+ };
132
+ const unregisterContext = (contextId) => {
133
+ const record = registry.contexts.get(contextId);
134
+ if (!record) {
135
+ return;
136
+ }
137
+ for (const pageId of [...record.pageIds]) {
138
+ unregisterPage(pageId);
139
+ }
140
+ registry.contextListenerCleanups.get(contextId)?.();
141
+ registry.contextListenerCleanups.delete(contextId);
142
+ registry.contextIdsByObject.delete(record.context);
143
+ registry.contexts.delete(contextId);
144
+ };
145
+ const registerPage = (page, preferredContextId, preferredPageId) => {
146
+ const existingId = registry.pageIdsByObject.get(page);
147
+ if (existingId) {
148
+ const existingRecord = registry.pages.get(existingId);
149
+ if (existingRecord && preferredContextId) {
150
+ registry.contexts.get(preferredContextId)?.pageIds.add(existingId);
151
+ }
152
+ return existingId;
153
+ }
154
+ const contextId = preferredContextId ?? registry.contextIdsByObject.get(page.context()) ?? registerContext(page.context());
155
+ const pageId = preferredPageId ?? `page_${registry.nextPageId++}`;
156
+ registry.pages.set(pageId, {
157
+ page,
158
+ contextId
159
+ });
160
+ registry.pageIdsByObject.set(page, pageId);
161
+ registry.contexts.get(contextId)?.pageIds.add(pageId);
162
+ const requestHandler = (request) => {
163
+ const info = {
164
+ contextId,
165
+ pageId,
166
+ requestId: getRequestId(request),
167
+ url: request.url(),
168
+ method: request.method(),
169
+ headers: request.headers(),
170
+ postData: request.postData() ?? undefined,
171
+ resourceType: request.resourceType(),
172
+ timestamp: Date.now()
173
+ };
174
+ registry.collectedData.networkRequests.push(info);
175
+ emitEvent({
176
+ type: "networkRequest",
177
+ ...info
178
+ });
179
+ };
180
+ const responseHandler = (response) => {
181
+ const request = response.request();
182
+ const info = {
183
+ contextId,
184
+ pageId,
185
+ requestId: getRequestId(request),
186
+ url: response.url(),
187
+ status: response.status(),
188
+ statusText: response.statusText(),
189
+ headers: response.headers(),
190
+ resourceType: request.resourceType(),
191
+ timestamp: Date.now()
192
+ };
193
+ registry.collectedData.networkResponses.push(info);
194
+ emitEvent({
195
+ type: "networkResponse",
196
+ ...info
197
+ });
198
+ };
199
+ const requestFailedHandler = (request) => {
200
+ const info = {
201
+ contextId,
202
+ pageId,
203
+ requestId: getRequestId(request),
204
+ url: request.url(),
205
+ method: request.method(),
206
+ failureText: request.failure()?.errorText || "request failed",
207
+ resourceType: request.resourceType(),
208
+ timestamp: Date.now()
209
+ };
210
+ registry.collectedData.requestFailures.push(info);
211
+ emitEvent({
212
+ type: "requestFailure",
213
+ ...info
214
+ });
215
+ };
216
+ const consoleHandler = (msg) => {
217
+ const args = msg.args().map((arg) => String(arg));
218
+ const entry = {
219
+ contextId,
220
+ pageId,
221
+ level: msg.type(),
222
+ stdout: args.join(" "),
223
+ location: toLocation(msg.location()),
224
+ timestamp: Date.now()
225
+ };
226
+ registry.collectedData.browserConsoleLogs.push(entry);
227
+ emitEvent({
228
+ type: "browserConsoleLog",
229
+ ...entry
230
+ });
231
+ };
232
+ const pageErrorHandler = (error) => {
233
+ const entry = {
234
+ contextId,
235
+ pageId,
236
+ name: error.name,
237
+ message: error.message,
238
+ stack: error.stack,
239
+ timestamp: Date.now()
240
+ };
241
+ registry.collectedData.pageErrors.push(entry);
242
+ emitEvent({
243
+ type: "pageError",
244
+ ...entry
245
+ });
246
+ };
247
+ const closeHandler = () => {
248
+ unregisterPage(pageId);
249
+ };
250
+ page.on("request", requestHandler);
251
+ page.on("response", responseHandler);
252
+ page.on("requestfailed", requestFailedHandler);
253
+ page.on("console", consoleHandler);
254
+ page.on("pageerror", pageErrorHandler);
255
+ page.on("close", closeHandler);
256
+ registry.pageListenerCleanups.set(pageId, () => {
257
+ page.removeListener("request", requestHandler);
258
+ page.removeListener("response", responseHandler);
259
+ page.removeListener("requestfailed", requestFailedHandler);
260
+ page.removeListener("console", consoleHandler);
261
+ page.removeListener("pageerror", pageErrorHandler);
262
+ page.removeListener("close", closeHandler);
263
+ });
264
+ return pageId;
265
+ };
266
+ return {
267
+ registerContext,
268
+ registerPage,
269
+ unregisterContext,
270
+ unregisterPage,
271
+ getCollectedData() {
272
+ return cloneCollectedData(registry.collectedData);
273
+ },
274
+ getTrackedResources() {
275
+ return {
276
+ contexts: [...registry.contexts.keys()],
277
+ pages: [...registry.pages.keys()]
278
+ };
279
+ },
280
+ clearCollectedData() {
281
+ registry.collectedData.browserConsoleLogs.length = 0;
282
+ registry.collectedData.pageErrors.length = 0;
283
+ registry.collectedData.networkRequests.length = 0;
284
+ registry.collectedData.networkResponses.length = 0;
285
+ registry.collectedData.requestFailures.length = 0;
286
+ },
287
+ onEvent(callback) {
288
+ registry.eventSubscribers.add(callback);
289
+ return () => {
290
+ registry.eventSubscribers.delete(callback);
291
+ };
292
+ }
293
+ };
294
+ }
54
295
  function isSerializedInputFilePayload(value) {
55
296
  if (!value || typeof value !== "object") {
56
297
  return false;
@@ -406,11 +647,11 @@ async function executeLocatorAction(locator, action, actionArg, timeout, fileIO)
406
647
  });
407
648
  if (opts?.path) {
408
649
  if (!fileIO?.writeFile) {
409
- throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or omit the path option " + "and handle the returned base64 data yourself.");
650
+ 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.");
410
651
  }
411
652
  await fileIO.writeFile(opts.path, buffer);
412
653
  }
413
- return buffer.toString("base64");
654
+ return;
414
655
  }
415
656
  case "dragTo": {
416
657
  const targetInfo = actionArg;
@@ -848,25 +1089,53 @@ function createPlaywrightHandler(page, options) {
848
1089
  writeFile: options?.writeFile
849
1090
  };
850
1091
  const registry = {
851
- pages: new Map([["page_0", page]]),
852
- contexts: new Map([["ctx_0", page.context()]]),
1092
+ pages: new Map,
1093
+ contexts: new Map,
1094
+ pageIdsByObject: new WeakMap,
1095
+ contextIdsByObject: new WeakMap,
853
1096
  nextPageId: 1,
854
1097
  nextContextId: 1,
1098
+ nextRequestId: 1,
855
1099
  pendingResponses: new Map,
856
1100
  pendingRequests: new Map,
857
- nextListenerId: 0
1101
+ nextListenerId: 0,
1102
+ requestIds: new WeakMap,
1103
+ pageListenerCleanups: new Map,
1104
+ contextListenerCleanups: new Map,
1105
+ eventSubscribers: new Set,
1106
+ collectedData: {
1107
+ browserConsoleLogs: [],
1108
+ pageErrors: [],
1109
+ networkRequests: [],
1110
+ networkResponses: [],
1111
+ requestFailures: []
1112
+ }
858
1113
  };
859
- return async (op) => {
1114
+ const collector = createPlaywrightCollector(registry);
1115
+ if (page) {
1116
+ collector.registerContext(page.context(), "ctx_0", false);
1117
+ collector.registerPage(page, "ctx_0", "page_0");
1118
+ }
1119
+ const handler = async (op) => {
860
1120
  try {
861
1121
  switch (op.type) {
1122
+ case "contexts":
1123
+ return { ok: true, value: [...registry.contexts.keys()] };
1124
+ case "pages": {
1125
+ const contextId2 = op.contextId ?? "ctx_0";
1126
+ const context = registry.contexts.get(contextId2);
1127
+ if (!context) {
1128
+ return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
1129
+ }
1130
+ return { ok: true, value: [...context.pageIds] };
1131
+ }
862
1132
  case "newContext": {
863
1133
  if (!options?.createContext) {
864
1134
  return { ok: false, error: { name: "Error", message: "createContext callback not provided. Configure createContext in playwright options to enable browser.newContext()." } };
865
1135
  }
866
1136
  const [contextOptions] = op.args;
867
1137
  const newContext = await options.createContext(contextOptions);
868
- const contextId2 = `ctx_${registry.nextContextId++}`;
869
- registry.contexts.set(contextId2, newContext);
1138
+ const contextId2 = collector.registerContext(newContext);
870
1139
  return { ok: true, value: { contextId: contextId2 } };
871
1140
  }
872
1141
  case "newPage": {
@@ -878,9 +1147,8 @@ function createPlaywrightHandler(page, options) {
878
1147
  if (!targetContext2) {
879
1148
  return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
880
1149
  }
881
- const newPage = await options.createPage(targetContext2);
882
- const pageId2 = `page_${registry.nextPageId++}`;
883
- registry.pages.set(pageId2, newPage);
1150
+ const newPage = await options.createPage(targetContext2.context);
1151
+ const pageId2 = collector.registerPage(newPage, contextId2);
884
1152
  return { ok: true, value: { pageId: pageId2 } };
885
1153
  }
886
1154
  case "closeContext": {
@@ -889,23 +1157,18 @@ function createPlaywrightHandler(page, options) {
889
1157
  if (!context) {
890
1158
  return { ok: false, error: { name: "Error", message: `Context ${contextId2} not found` } };
891
1159
  }
892
- await context.close();
893
- registry.contexts.delete(contextId2);
894
- for (const [pid, p] of registry.pages) {
895
- if (p.context() === context) {
896
- registry.pages.delete(pid);
897
- }
898
- }
1160
+ await context.context.close();
1161
+ collector.unregisterContext(contextId2);
899
1162
  return { ok: true };
900
1163
  }
901
1164
  }
902
1165
  const pageId = op.pageId ?? "page_0";
903
- const targetPage = registry.pages.get(pageId);
1166
+ const targetPage = registry.pages.get(pageId)?.page;
904
1167
  if (!targetPage) {
905
1168
  return { ok: false, error: { name: "Error", message: `Page ${pageId} not found` } };
906
1169
  }
907
1170
  const contextId = op.contextId ?? "ctx_0";
908
- const targetContext = registry.contexts.get(contextId);
1171
+ const targetContext = registry.contexts.get(contextId)?.context;
909
1172
  switch (op.type) {
910
1173
  case "goto": {
911
1174
  const [url, waitUntil] = op.args;
@@ -1265,11 +1528,11 @@ function createPlaywrightHandler(page, options) {
1265
1528
  });
1266
1529
  if (screenshotOptions?.path) {
1267
1530
  if (!fileIO.writeFile) {
1268
- throw new Error("screenshot() with path option requires a writeFile callback to be provided. " + "Either provide a writeFile callback in defaultPlaywrightHandler options, or omit the path option " + "and handle the returned base64 data yourself.");
1531
+ 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.");
1269
1532
  }
1270
1533
  await fileIO.writeFile(screenshotOptions.path, buffer);
1271
1534
  }
1272
- return { ok: true, value: buffer.toString("base64") };
1535
+ return { ok: true };
1273
1536
  }
1274
1537
  case "setViewportSize": {
1275
1538
  const [size] = op.args;
@@ -1351,7 +1614,7 @@ function createPlaywrightHandler(page, options) {
1351
1614
  }
1352
1615
  case "close": {
1353
1616
  await targetPage.close();
1354
- registry.pages.delete(pageId);
1617
+ collector.unregisterPage(pageId);
1355
1618
  return { ok: true };
1356
1619
  }
1357
1620
  case "isClosed": {
@@ -1403,14 +1666,24 @@ function createPlaywrightHandler(page, options) {
1403
1666
  return { ok: false, error: { name: error.name, message: error.message } };
1404
1667
  }
1405
1668
  };
1669
+ handler[import_types.PLAYWRIGHT_HANDLER_META] = {
1670
+ collector
1671
+ };
1672
+ return handler;
1406
1673
  }
1407
1674
  function defaultPlaywrightHandler(page, options) {
1408
1675
  const handler = createPlaywrightHandler(page, options);
1409
1676
  handler[import_types.DEFAULT_PLAYWRIGHT_HANDLER_META] = { page, options };
1410
1677
  return handler;
1411
1678
  }
1679
+ function createPlaywrightFactoryHandler(options) {
1680
+ return createPlaywrightHandler(undefined, options);
1681
+ }
1682
+ function getPlaywrightHandlerMetadata(handler) {
1683
+ return handler[import_types.PLAYWRIGHT_HANDLER_META];
1684
+ }
1412
1685
  function getDefaultPlaywrightHandlerMetadata(handler) {
1413
1686
  return handler[import_types.DEFAULT_PLAYWRIGHT_HANDLER_META];
1414
1687
  }
1415
1688
 
1416
- //# debugId=1EA18A56C336D40464756E2164756E21
1689
+ //# debugId=1E1ED47A7B37F25964756E2164756E21