@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
@@ -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=2E738B02383FD57664756E2164756E21
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": ";AAuBA;AAAA;AAAA;AAAA;AAAA;",
8
- "debugId": "2E738B02383FD57664756E2164756E21",
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 omit the path option " + "and handle the returned base64 data yourself.");
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 buffer.toString("base64");
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([["page_0", page]]),
805
- contexts: new Map([["ctx_0", page.context()]]),
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
- return async (op) => {
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 = `ctx_${registry.nextContextId++}`;
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 = `page_${registry.nextPageId++}`;
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
- registry.contexts.delete(contextId2);
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 omit the path option " + "and handle the returned base64 data yourself.");
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, value: buffer.toString("base64") };
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
- registry.pages.delete(pageId);
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=20F6479EC05586C664756E2164756E21
1652
+ //# debugId=43FD6984CD8B4A1E64756E2164756E21