@bctrl/sdk 1.0.1

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 (260) hide show
  1. package/README.md +75 -0
  2. package/dist/agents/browser-use/index.d.ts +1 -0
  3. package/dist/agents/browser-use/index.js +9 -0
  4. package/dist/agents/browser-use/namespace.d.ts +39 -0
  5. package/dist/agents/browser-use/namespace.js +93 -0
  6. package/dist/agents/index.d.ts +2 -0
  7. package/dist/agents/index.js +17 -0
  8. package/dist/agents/stagehand/core.d.ts +93 -0
  9. package/dist/agents/stagehand/core.js +144 -0
  10. package/dist/agents/stagehand/index.d.ts +3 -0
  11. package/dist/agents/stagehand/index.js +24 -0
  12. package/dist/agents/stagehand/namespace.d.ts +51 -0
  13. package/dist/agents/stagehand/namespace.js +65 -0
  14. package/dist/ai-credentials/client.d.ts +12 -0
  15. package/dist/ai-credentials/client.js +70 -0
  16. package/dist/ai-credentials/index.d.ts +1 -0
  17. package/dist/ai-credentials/index.js +1 -0
  18. package/dist/base/event-binding.d.ts +7 -0
  19. package/dist/base/event-binding.js +23 -0
  20. package/dist/base/types.d.ts +109 -0
  21. package/dist/base/types.js +4 -0
  22. package/dist/bctrl.d.ts +37 -0
  23. package/dist/bctrl.js +77 -0
  24. package/dist/browser-extensions/client.d.ts +15 -0
  25. package/dist/browser-extensions/client.js +72 -0
  26. package/dist/browser-extensions/index.d.ts +2 -0
  27. package/dist/browser-extensions/index.js +1 -0
  28. package/dist/browser-profiles/client.d.ts +11 -0
  29. package/dist/browser-profiles/client.js +63 -0
  30. package/dist/browser-profiles/index.d.ts +1 -0
  31. package/dist/browser-profiles/index.js +1 -0
  32. package/dist/captcha/index.d.ts +1 -0
  33. package/dist/captcha/index.js +1 -0
  34. package/dist/captcha/namespace.d.ts +34 -0
  35. package/dist/captcha/namespace.js +41 -0
  36. package/dist/client/index.d.ts +1 -0
  37. package/dist/client/index.js +1 -0
  38. package/dist/client/rpc.d.ts +83 -0
  39. package/dist/client/rpc.js +354 -0
  40. package/dist/config.d.ts +5 -0
  41. package/dist/config.js +28 -0
  42. package/dist/constants/browser.d.ts +2 -0
  43. package/dist/constants/browser.js +1 -0
  44. package/dist/contracts/agent-tools.d.ts +45 -0
  45. package/dist/contracts/agent-tools.js +31 -0
  46. package/dist/contracts/automation.d.ts +265 -0
  47. package/dist/contracts/automation.js +109 -0
  48. package/dist/contracts/browser-management.d.ts +179 -0
  49. package/dist/contracts/browser-management.js +95 -0
  50. package/dist/contracts/browser-use.d.ts +136 -0
  51. package/dist/contracts/browser-use.js +93 -0
  52. package/dist/contracts/captcha.d.ts +114 -0
  53. package/dist/contracts/captcha.js +40 -0
  54. package/dist/contracts/desktop.d.ts +223 -0
  55. package/dist/contracts/desktop.js +121 -0
  56. package/dist/contracts/drivers/playwright.d.ts +2008 -0
  57. package/dist/contracts/drivers/playwright.js +2033 -0
  58. package/dist/contracts/drivers/puppeteer.d.ts +1221 -0
  59. package/dist/contracts/drivers/puppeteer.js +941 -0
  60. package/dist/contracts/drivers/selenium.d.ts +156 -0
  61. package/dist/contracts/drivers/selenium.js +61 -0
  62. package/dist/contracts/drivers/stagehand.d.ts +155 -0
  63. package/dist/contracts/drivers/stagehand.js +7 -0
  64. package/dist/contracts/extensions.d.ts +13 -0
  65. package/dist/contracts/extensions.js +9 -0
  66. package/dist/contracts/index.d.ts +13 -0
  67. package/dist/contracts/index.js +13 -0
  68. package/dist/contracts/public-api.d.ts +360 -0
  69. package/dist/contracts/public-api.js +17 -0
  70. package/dist/contracts/runtime.d.ts +81 -0
  71. package/dist/contracts/runtime.js +16 -0
  72. package/dist/contracts/stagehand.d.ts +253 -0
  73. package/dist/contracts/stagehand.js +145 -0
  74. package/dist/contracts/storage.d.ts +51 -0
  75. package/dist/contracts/storage.js +56 -0
  76. package/dist/contracts/vault.d.ts +119 -0
  77. package/dist/contracts/vault.js +112 -0
  78. package/dist/contracts/version.d.ts +3 -0
  79. package/dist/contracts/version.js +16 -0
  80. package/dist/desktop.d.ts +2 -0
  81. package/dist/desktop.js +3 -0
  82. package/dist/drivers/desktop/index.d.ts +65 -0
  83. package/dist/drivers/desktop/index.js +68 -0
  84. package/dist/drivers/desktop/session.d.ts +313 -0
  85. package/dist/drivers/desktop/session.js +432 -0
  86. package/dist/drivers/playwright/event-emitter.d.ts +160 -0
  87. package/dist/drivers/playwright/event-emitter.js +297 -0
  88. package/dist/drivers/playwright/generated/api-request-context.d.ts +137 -0
  89. package/dist/drivers/playwright/generated/api-request-context.js +154 -0
  90. package/dist/drivers/playwright/generated/api-response.d.ts +119 -0
  91. package/dist/drivers/playwright/generated/api-response.js +123 -0
  92. package/dist/drivers/playwright/generated/browser-context.d.ts +284 -0
  93. package/dist/drivers/playwright/generated/browser-context.js +458 -0
  94. package/dist/drivers/playwright/generated/browser.d.ts +120 -0
  95. package/dist/drivers/playwright/generated/browser.js +151 -0
  96. package/dist/drivers/playwright/generated/clock.d.ts +80 -0
  97. package/dist/drivers/playwright/generated/clock.js +94 -0
  98. package/dist/drivers/playwright/generated/console-message.d.ts +94 -0
  99. package/dist/drivers/playwright/generated/console-message.js +89 -0
  100. package/dist/drivers/playwright/generated/coverage.d.ts +57 -0
  101. package/dist/drivers/playwright/generated/coverage.js +66 -0
  102. package/dist/drivers/playwright/generated/dialog.d.ts +79 -0
  103. package/dist/drivers/playwright/generated/dialog.js +80 -0
  104. package/dist/drivers/playwright/generated/element-handle.d.ts +399 -0
  105. package/dist/drivers/playwright/generated/element-handle.js +501 -0
  106. package/dist/drivers/playwright/generated/frame-locator.d.ts +34 -0
  107. package/dist/drivers/playwright/generated/frame-locator.js +63 -0
  108. package/dist/drivers/playwright/generated/frame.d.ts +557 -0
  109. package/dist/drivers/playwright/generated/frame.js +634 -0
  110. package/dist/drivers/playwright/generated/js-handle.d.ts +72 -0
  111. package/dist/drivers/playwright/generated/js-handle.js +92 -0
  112. package/dist/drivers/playwright/generated/keyboard.d.ts +103 -0
  113. package/dist/drivers/playwright/generated/keyboard.js +113 -0
  114. package/dist/drivers/playwright/generated/locator.d.ts +795 -0
  115. package/dist/drivers/playwright/generated/locator.js +974 -0
  116. package/dist/drivers/playwright/generated/mouse.d.ts +97 -0
  117. package/dist/drivers/playwright/generated/mouse.js +109 -0
  118. package/dist/drivers/playwright/generated/page.d.ts +762 -0
  119. package/dist/drivers/playwright/generated/page.js +988 -0
  120. package/dist/drivers/playwright/generated/touchscreen.d.ts +34 -0
  121. package/dist/drivers/playwright/generated/touchscreen.js +37 -0
  122. package/dist/drivers/playwright/generated/tracing.d.ts +78 -0
  123. package/dist/drivers/playwright/generated/tracing.js +80 -0
  124. package/dist/drivers/playwright/generated/worker.d.ts +53 -0
  125. package/dist/drivers/playwright/generated/worker.js +59 -0
  126. package/dist/drivers/playwright/index.d.ts +19 -0
  127. package/dist/drivers/playwright/index.js +20 -0
  128. package/dist/drivers/playwright/remote-base.d.ts +62 -0
  129. package/dist/drivers/playwright/remote-base.js +86 -0
  130. package/dist/drivers/playwright/types.d.ts +148 -0
  131. package/dist/drivers/playwright/types.js +8 -0
  132. package/dist/drivers/puppeteer/errors.d.ts +50 -0
  133. package/dist/drivers/puppeteer/errors.js +71 -0
  134. package/dist/drivers/puppeteer/event-emitter.d.ts +145 -0
  135. package/dist/drivers/puppeteer/event-emitter.js +259 -0
  136. package/dist/drivers/puppeteer/generated/accessibility.d.ts +77 -0
  137. package/dist/drivers/puppeteer/generated/accessibility.js +74 -0
  138. package/dist/drivers/puppeteer/generated/browser-context.d.ts +116 -0
  139. package/dist/drivers/puppeteer/generated/browser-context.js +168 -0
  140. package/dist/drivers/puppeteer/generated/browser.d.ts +169 -0
  141. package/dist/drivers/puppeteer/generated/browser.js +246 -0
  142. package/dist/drivers/puppeteer/generated/console-message.d.ts +54 -0
  143. package/dist/drivers/puppeteer/generated/console-message.js +69 -0
  144. package/dist/drivers/puppeteer/generated/coverage.d.ts +49 -0
  145. package/dist/drivers/puppeteer/generated/coverage.js +57 -0
  146. package/dist/drivers/puppeteer/generated/dialog.d.ts +46 -0
  147. package/dist/drivers/puppeteer/generated/dialog.js +60 -0
  148. package/dist/drivers/puppeteer/generated/element-handle.d.ts +261 -0
  149. package/dist/drivers/puppeteer/generated/element-handle.js +341 -0
  150. package/dist/drivers/puppeteer/generated/file-chooser.d.ts +34 -0
  151. package/dist/drivers/puppeteer/generated/file-chooser.js +43 -0
  152. package/dist/drivers/puppeteer/generated/frame.d.ts +221 -0
  153. package/dist/drivers/puppeteer/generated/frame.js +302 -0
  154. package/dist/drivers/puppeteer/generated/http-request.d.ts +195 -0
  155. package/dist/drivers/puppeteer/generated/http-request.js +243 -0
  156. package/dist/drivers/puppeteer/generated/http-response.d.ts +142 -0
  157. package/dist/drivers/puppeteer/generated/http-response.js +169 -0
  158. package/dist/drivers/puppeteer/generated/js-handle.d.ts +104 -0
  159. package/dist/drivers/puppeteer/generated/js-handle.js +125 -0
  160. package/dist/drivers/puppeteer/generated/keyboard.d.ts +79 -0
  161. package/dist/drivers/puppeteer/generated/keyboard.js +89 -0
  162. package/dist/drivers/puppeteer/generated/locator.d.ts +141 -0
  163. package/dist/drivers/puppeteer/generated/locator.js +164 -0
  164. package/dist/drivers/puppeteer/generated/mouse.d.ts +74 -0
  165. package/dist/drivers/puppeteer/generated/mouse.js +94 -0
  166. package/dist/drivers/puppeteer/generated/page.d.ts +604 -0
  167. package/dist/drivers/puppeteer/generated/page.js +776 -0
  168. package/dist/drivers/puppeteer/generated/target.d.ts +105 -0
  169. package/dist/drivers/puppeteer/generated/target.js +123 -0
  170. package/dist/drivers/puppeteer/generated/touchscreen.d.ts +87 -0
  171. package/dist/drivers/puppeteer/generated/touchscreen.js +103 -0
  172. package/dist/drivers/puppeteer/generated/tracing.d.ts +38 -0
  173. package/dist/drivers/puppeteer/generated/tracing.js +43 -0
  174. package/dist/drivers/puppeteer/generated/web-worker.d.ts +63 -0
  175. package/dist/drivers/puppeteer/generated/web-worker.js +73 -0
  176. package/dist/drivers/puppeteer/index.d.ts +21 -0
  177. package/dist/drivers/puppeteer/index.js +23 -0
  178. package/dist/drivers/puppeteer/remote-base.d.ts +57 -0
  179. package/dist/drivers/puppeteer/remote-base.js +79 -0
  180. package/dist/drivers/puppeteer/types.d.ts +178 -0
  181. package/dist/drivers/puppeteer/types.js +8 -0
  182. package/dist/drivers/selenium/driver.d.ts +28 -0
  183. package/dist/drivers/selenium/driver.js +169 -0
  184. package/dist/drivers/selenium/element.d.ts +34 -0
  185. package/dist/drivers/selenium/element.js +73 -0
  186. package/dist/drivers/selenium/index.d.ts +3 -0
  187. package/dist/drivers/selenium/index.js +5 -0
  188. package/dist/drivers/selenium/types.d.ts +2 -0
  189. package/dist/drivers/selenium/types.js +12 -0
  190. package/dist/drivers/stagehand/generated/context.d.ts +127 -0
  191. package/dist/drivers/stagehand/generated/context.js +153 -0
  192. package/dist/drivers/stagehand/generated/locator.d.ts +324 -0
  193. package/dist/drivers/stagehand/generated/locator.js +368 -0
  194. package/dist/drivers/stagehand/generated/page.d.ts +377 -0
  195. package/dist/drivers/stagehand/generated/page.js +439 -0
  196. package/dist/drivers/stagehand/generated/response.d.ts +197 -0
  197. package/dist/drivers/stagehand/generated/response.js +232 -0
  198. package/dist/drivers/stagehand/index.d.ts +5 -0
  199. package/dist/drivers/stagehand/index.js +8 -0
  200. package/dist/drivers/stagehand/types.d.ts +1 -0
  201. package/dist/drivers/stagehand/types.js +7 -0
  202. package/dist/errors.d.ts +47 -0
  203. package/dist/errors.js +157 -0
  204. package/dist/extensions/client.d.ts +47 -0
  205. package/dist/extensions/client.js +154 -0
  206. package/dist/extensions/index.d.ts +1 -0
  207. package/dist/extensions/index.js +1 -0
  208. package/dist/index.d.ts +12 -0
  209. package/dist/index.js +23 -0
  210. package/dist/internal/dev-client.d.ts +5 -0
  211. package/dist/internal/dev-client.js +9 -0
  212. package/dist/internal/rpc-targets.d.ts +17 -0
  213. package/dist/internal/rpc-targets.js +58 -0
  214. package/dist/internal/serialization.d.ts +32 -0
  215. package/dist/internal/serialization.js +42 -0
  216. package/dist/internal/transport.d.ts +24 -0
  217. package/dist/internal/transport.js +29 -0
  218. package/dist/playwright.d.ts +1 -0
  219. package/dist/playwright.js +2 -0
  220. package/dist/puppeteer.d.ts +1 -0
  221. package/dist/puppeteer.js +2 -0
  222. package/dist/selenium.d.ts +1 -0
  223. package/dist/selenium.js +2 -0
  224. package/dist/stagehand.d.ts +1 -0
  225. package/dist/stagehand.js +2 -0
  226. package/dist/storage/client.d.ts +151 -0
  227. package/dist/storage/client.js +329 -0
  228. package/dist/storage/index.d.ts +2 -0
  229. package/dist/storage/index.js +4 -0
  230. package/dist/telemetry.d.ts +18 -0
  231. package/dist/telemetry.js +93 -0
  232. package/dist/updates/client.d.ts +8 -0
  233. package/dist/updates/client.js +128 -0
  234. package/dist/updates/index.d.ts +1 -0
  235. package/dist/updates/index.js +1 -0
  236. package/dist/utils/http.d.ts +39 -0
  237. package/dist/utils/http.js +88 -0
  238. package/dist/utils/index.d.ts +4 -0
  239. package/dist/utils/index.js +4 -0
  240. package/dist/utils/logger.d.ts +27 -0
  241. package/dist/utils/logger.js +74 -0
  242. package/dist/utils/schema.d.ts +17 -0
  243. package/dist/utils/schema.js +31 -0
  244. package/dist/utils/url.d.ts +5 -0
  245. package/dist/utils/url.js +7 -0
  246. package/dist/vault/client.d.ts +43 -0
  247. package/dist/vault/client.js +123 -0
  248. package/dist/vault/index.d.ts +1 -0
  249. package/dist/vault/index.js +1 -0
  250. package/dist/version.d.ts +1 -0
  251. package/dist/version.js +4 -0
  252. package/dist/workspaces/browser-runtime.d.ts +251 -0
  253. package/dist/workspaces/browser-runtime.js +1025 -0
  254. package/dist/workspaces/client.d.ts +48 -0
  255. package/dist/workspaces/client.js +222 -0
  256. package/dist/workspaces/index.d.ts +2 -0
  257. package/dist/workspaces/index.js +2 -0
  258. package/dist/workspaces/runtime-event-pump.d.ts +65 -0
  259. package/dist/workspaces/runtime-event-pump.js +716 -0
  260. package/package.json +56 -0
@@ -0,0 +1,716 @@
1
+ import { setRemoteListenerBinding, } from '../base/event-binding.js';
2
+ const WAIT_TIMEOUT_MS = 30_000;
3
+ const ERROR_RETRY_DELAY_MS = 250;
4
+ function asRecord(value) {
5
+ if (!value || typeof value !== 'object' || Array.isArray(value))
6
+ return null;
7
+ return value;
8
+ }
9
+ function asString(value) {
10
+ return typeof value === 'string' ? value : null;
11
+ }
12
+ function asNumber(value) {
13
+ if (typeof value !== 'number' || !Number.isFinite(value))
14
+ return null;
15
+ return value;
16
+ }
17
+ function asBoolean(value) {
18
+ return typeof value === 'boolean' ? value : null;
19
+ }
20
+ function sleep(ms, signal) {
21
+ return new Promise((resolve) => {
22
+ if (signal.aborted) {
23
+ resolve();
24
+ return;
25
+ }
26
+ const timer = setTimeout(() => {
27
+ signal.removeEventListener('abort', onAbort);
28
+ resolve();
29
+ }, ms);
30
+ const onAbort = () => {
31
+ clearTimeout(timer);
32
+ signal.removeEventListener('abort', onAbort);
33
+ resolve();
34
+ };
35
+ signal.addEventListener('abort', onAbort, { once: true });
36
+ });
37
+ }
38
+ function isAbortError(error) {
39
+ return error instanceof Error && error.name === 'AbortError';
40
+ }
41
+ function cursorFromEvent(event) {
42
+ if (!event.createdAt || !event.id)
43
+ return null;
44
+ return `${event.createdAt}|${event.id}`;
45
+ }
46
+ class SyntheticConsoleMessage {
47
+ level;
48
+ textValue;
49
+ locationValue;
50
+ constructor(level, textValue, locationValue) {
51
+ this.level = level;
52
+ this.textValue = textValue;
53
+ this.locationValue = locationValue;
54
+ }
55
+ type() {
56
+ return this.level;
57
+ }
58
+ text() {
59
+ return this.textValue;
60
+ }
61
+ location() {
62
+ return this.locationValue;
63
+ }
64
+ stackTrace() {
65
+ return [];
66
+ }
67
+ args() {
68
+ return [];
69
+ }
70
+ page() {
71
+ return null;
72
+ }
73
+ worker() {
74
+ return null;
75
+ }
76
+ }
77
+ class SyntheticDialog {
78
+ dialogType;
79
+ dialogMessage;
80
+ dialogDefaultValue;
81
+ invoke;
82
+ constructor(dialogType, dialogMessage, dialogDefaultValue, invoke) {
83
+ this.dialogType = dialogType;
84
+ this.dialogMessage = dialogMessage;
85
+ this.dialogDefaultValue = dialogDefaultValue;
86
+ this.invoke = invoke;
87
+ }
88
+ async accept(promptText) {
89
+ if (!this.invoke) {
90
+ throw new Error('Dialog actions are not available for this event');
91
+ }
92
+ await this.invoke('accept', promptText);
93
+ }
94
+ async dismiss() {
95
+ if (!this.invoke) {
96
+ throw new Error('Dialog actions are not available for this event');
97
+ }
98
+ await this.invoke('dismiss');
99
+ }
100
+ type() {
101
+ return this.dialogType;
102
+ }
103
+ message() {
104
+ return this.dialogMessage;
105
+ }
106
+ defaultValue() {
107
+ return this.dialogDefaultValue;
108
+ }
109
+ }
110
+ class SyntheticFrame {
111
+ frameUrl;
112
+ frameName;
113
+ constructor(frameUrl, frameName = null) {
114
+ this.frameUrl = frameUrl;
115
+ this.frameName = frameName;
116
+ }
117
+ url() {
118
+ return this.frameUrl;
119
+ }
120
+ name() {
121
+ return this.frameName ?? '';
122
+ }
123
+ }
124
+ class SyntheticResponse {
125
+ responseUrl;
126
+ responseStatus;
127
+ responseStatusText;
128
+ responseHeaders;
129
+ responseRequest;
130
+ constructor(responseUrl, responseStatus, responseStatusText, responseHeaders, responseRequest = null) {
131
+ this.responseUrl = responseUrl;
132
+ this.responseStatus = responseStatus;
133
+ this.responseStatusText = responseStatusText;
134
+ this.responseHeaders = responseHeaders;
135
+ this.responseRequest = responseRequest;
136
+ }
137
+ url() {
138
+ return this.responseUrl;
139
+ }
140
+ status() {
141
+ return this.responseStatus;
142
+ }
143
+ statusText() {
144
+ return this.responseStatusText;
145
+ }
146
+ ok() {
147
+ return this.responseStatus >= 200 && this.responseStatus < 300;
148
+ }
149
+ headers() {
150
+ return this.responseHeaders;
151
+ }
152
+ request() {
153
+ return this.responseRequest;
154
+ }
155
+ }
156
+ class SyntheticRequest {
157
+ requestUrl;
158
+ requestMethod;
159
+ requestResourceType;
160
+ requestHeaders;
161
+ requestErrorText;
162
+ requestTiming;
163
+ requestResponse;
164
+ constructor(requestUrl, requestMethod, requestResourceType, requestHeaders, requestErrorText, requestResponse = null, requestTiming = null) {
165
+ this.requestUrl = requestUrl;
166
+ this.requestMethod = requestMethod;
167
+ this.requestResourceType = requestResourceType;
168
+ this.requestHeaders = requestHeaders;
169
+ this.requestErrorText = requestErrorText;
170
+ this.requestTiming = requestTiming;
171
+ this.requestResponse = requestResponse;
172
+ }
173
+ url() {
174
+ return this.requestUrl;
175
+ }
176
+ method() {
177
+ return this.requestMethod;
178
+ }
179
+ resourceType() {
180
+ return this.requestResourceType;
181
+ }
182
+ headers() {
183
+ return this.requestHeaders;
184
+ }
185
+ failure() {
186
+ if (!this.requestErrorText)
187
+ return null;
188
+ return { errorText: this.requestErrorText };
189
+ }
190
+ response() {
191
+ return this.requestResponse;
192
+ }
193
+ setResponse(response) {
194
+ this.requestResponse = response;
195
+ }
196
+ timing() {
197
+ return this.requestTiming;
198
+ }
199
+ }
200
+ class SyntheticDownload {
201
+ downloadUrl;
202
+ downloadSuggestedFilename;
203
+ downloadPath;
204
+ constructor(downloadUrl, downloadSuggestedFilename, downloadPath) {
205
+ this.downloadUrl = downloadUrl;
206
+ this.downloadSuggestedFilename = downloadSuggestedFilename;
207
+ this.downloadPath = downloadPath;
208
+ }
209
+ url() {
210
+ return this.downloadUrl;
211
+ }
212
+ suggestedFilename() {
213
+ return this.downloadSuggestedFilename;
214
+ }
215
+ async path() {
216
+ return this.downloadPath;
217
+ }
218
+ }
219
+ class SyntheticFileChooser {
220
+ multiple;
221
+ constructor(multiple) {
222
+ this.multiple = multiple;
223
+ }
224
+ isMultiple() {
225
+ return this.multiple;
226
+ }
227
+ }
228
+ class SyntheticWebSocket {
229
+ socketUrl;
230
+ constructor(socketUrl) {
231
+ this.socketUrl = socketUrl;
232
+ }
233
+ url() {
234
+ return this.socketUrl;
235
+ }
236
+ }
237
+ class SyntheticWorker {
238
+ workerUrl;
239
+ constructor(workerUrl) {
240
+ this.workerUrl = workerUrl;
241
+ }
242
+ url() {
243
+ return this.workerUrl;
244
+ }
245
+ }
246
+ export class RuntimeEventPump {
247
+ waiter;
248
+ pageEmitters = new Set();
249
+ pageEmitterRecords = new WeakMap();
250
+ contextEmitters = new Set();
251
+ contextEmitterRecords = new WeakMap();
252
+ activeBindingCounts = new Map();
253
+ activeBackendTypeCounts = new Map();
254
+ activeBindingTotal = 0;
255
+ cursor = null;
256
+ disposed = false;
257
+ currentEventTypesKey = null;
258
+ waitAbortController = null;
259
+ waitPromise = null;
260
+ constructor(waiter) {
261
+ this.waiter = waiter;
262
+ }
263
+ registerPageEmitter(registration) {
264
+ if (this.disposed)
265
+ return;
266
+ const emitterKey = registration.emitter;
267
+ if (this.pageEmitterRecords.has(emitterKey))
268
+ return;
269
+ const record = {
270
+ ...registration,
271
+ activeBackendTypes: new Set(),
272
+ backendTypeToEvent: new Map(Object.entries(registration.eventMap).map(([eventName, backendType]) => [
273
+ backendType,
274
+ eventName,
275
+ ])),
276
+ };
277
+ this.pageEmitters.add(record);
278
+ this.pageEmitterRecords.set(emitterKey, record);
279
+ const binding = {
280
+ onFirstListener: (eventName) => {
281
+ const backendType = record.eventMap[eventName];
282
+ if (!backendType || record.activeBackendTypes.has(backendType))
283
+ return;
284
+ record.activeBackendTypes.add(backendType);
285
+ this.incrementBinding('page', record.pageId, backendType);
286
+ },
287
+ onNoListeners: (eventName) => {
288
+ const backendType = record.eventMap[eventName];
289
+ if (!backendType || !record.activeBackendTypes.has(backendType))
290
+ return;
291
+ record.activeBackendTypes.delete(backendType);
292
+ this.decrementBinding('page', record.pageId, backendType);
293
+ },
294
+ };
295
+ setRemoteListenerBinding(registration.emitter, binding);
296
+ for (const [eventName, backendType] of Object.entries(registration.eventMap)) {
297
+ if (registration.emitter.listenerCount(eventName) <= 0)
298
+ continue;
299
+ if (record.activeBackendTypes.has(backendType))
300
+ continue;
301
+ record.activeBackendTypes.add(backendType);
302
+ this.incrementBinding('page', record.pageId, backendType);
303
+ }
304
+ }
305
+ registerContextEmitter(registration) {
306
+ if (this.disposed)
307
+ return;
308
+ const emitterKey = registration.emitter;
309
+ if (this.contextEmitterRecords.has(emitterKey))
310
+ return;
311
+ const record = {
312
+ ...registration,
313
+ activeBackendTypes: new Set(),
314
+ backendTypeToEvent: new Map(Object.entries(registration.eventMap).map(([eventName, backendType]) => [
315
+ backendType,
316
+ eventName,
317
+ ])),
318
+ };
319
+ this.contextEmitters.add(record);
320
+ this.contextEmitterRecords.set(emitterKey, record);
321
+ const binding = {
322
+ onFirstListener: (eventName) => {
323
+ const backendType = record.eventMap[eventName];
324
+ if (!backendType || record.activeBackendTypes.has(backendType))
325
+ return;
326
+ record.activeBackendTypes.add(backendType);
327
+ this.incrementBinding('context', record.contextId, backendType);
328
+ },
329
+ onNoListeners: (eventName) => {
330
+ const backendType = record.eventMap[eventName];
331
+ if (!backendType || !record.activeBackendTypes.has(backendType))
332
+ return;
333
+ record.activeBackendTypes.delete(backendType);
334
+ this.decrementBinding('context', record.contextId, backendType);
335
+ },
336
+ };
337
+ setRemoteListenerBinding(registration.emitter, binding);
338
+ for (const [eventName, backendType] of Object.entries(registration.eventMap)) {
339
+ if (registration.emitter.listenerCount(eventName) <= 0)
340
+ continue;
341
+ if (record.activeBackendTypes.has(backendType))
342
+ continue;
343
+ record.activeBackendTypes.add(backendType);
344
+ this.incrementBinding('context', record.contextId, backendType);
345
+ }
346
+ }
347
+ async close() {
348
+ if (this.disposed)
349
+ return;
350
+ this.disposed = true;
351
+ if (this.waitAbortController) {
352
+ this.waitAbortController.abort();
353
+ this.waitAbortController = null;
354
+ }
355
+ for (const record of this.pageEmitters) {
356
+ setRemoteListenerBinding(record.emitter, null);
357
+ record.activeBackendTypes.clear();
358
+ }
359
+ for (const record of this.contextEmitters) {
360
+ setRemoteListenerBinding(record.emitter, null);
361
+ record.activeBackendTypes.clear();
362
+ }
363
+ this.pageEmitters.clear();
364
+ this.contextEmitters.clear();
365
+ this.activeBindingCounts.clear();
366
+ this.activeBackendTypeCounts.clear();
367
+ this.activeBindingTotal = 0;
368
+ this.currentEventTypesKey = null;
369
+ if (this.waitPromise) {
370
+ try {
371
+ await this.waitPromise;
372
+ }
373
+ catch {
374
+ // Ignore shutdown race errors.
375
+ }
376
+ this.waitPromise = null;
377
+ }
378
+ }
379
+ bindingKey(scope, id, backendType) {
380
+ return `${scope}:${id}::${backendType}`;
381
+ }
382
+ activeBackendTypes() {
383
+ return Array.from(this.activeBackendTypeCounts.entries())
384
+ .filter(([, count]) => count > 0)
385
+ .map(([backendType]) => backendType)
386
+ .sort();
387
+ }
388
+ backendTypesKey(eventTypes) {
389
+ return eventTypes.join(',');
390
+ }
391
+ updateCursor(cursor) {
392
+ if (typeof cursor !== 'string' || cursor.trim().length === 0)
393
+ return;
394
+ this.cursor = cursor.trim();
395
+ }
396
+ incrementBinding(scope, id, backendType) {
397
+ const key = this.bindingKey(scope, id, backendType);
398
+ const next = (this.activeBindingCounts.get(key) ?? 0) + 1;
399
+ this.activeBindingCounts.set(key, next);
400
+ const typeNext = (this.activeBackendTypeCounts.get(backendType) ?? 0) + 1;
401
+ this.activeBackendTypeCounts.set(backendType, typeNext);
402
+ if (next === 1) {
403
+ this.activeBindingTotal += 1;
404
+ }
405
+ this.reconfigureLoopIfNeeded();
406
+ }
407
+ decrementBinding(scope, id, backendType) {
408
+ const key = this.bindingKey(scope, id, backendType);
409
+ const current = this.activeBindingCounts.get(key) ?? 0;
410
+ if (current <= 0)
411
+ return;
412
+ if (current === 1) {
413
+ this.activeBindingCounts.delete(key);
414
+ this.activeBindingTotal = Math.max(0, this.activeBindingTotal - 1);
415
+ }
416
+ else {
417
+ this.activeBindingCounts.set(key, current - 1);
418
+ }
419
+ const typeCurrent = this.activeBackendTypeCounts.get(backendType) ?? 0;
420
+ if (typeCurrent <= 1) {
421
+ this.activeBackendTypeCounts.delete(backendType);
422
+ }
423
+ else {
424
+ this.activeBackendTypeCounts.set(backendType, typeCurrent - 1);
425
+ }
426
+ this.reconfigureLoopIfNeeded();
427
+ }
428
+ reconfigureLoopIfNeeded() {
429
+ if (this.disposed)
430
+ return;
431
+ if (this.activeBindingTotal === 0) {
432
+ if (this.waitAbortController) {
433
+ this.waitAbortController.abort();
434
+ }
435
+ return;
436
+ }
437
+ const desiredKey = this.backendTypesKey(this.activeBackendTypes());
438
+ if (!this.waitPromise) {
439
+ this.ensureLoop();
440
+ return;
441
+ }
442
+ if (this.currentEventTypesKey !== desiredKey && this.waitAbortController) {
443
+ this.waitAbortController.abort();
444
+ }
445
+ }
446
+ ensureLoop() {
447
+ if (this.disposed)
448
+ return;
449
+ if (this.activeBindingTotal === 0)
450
+ return;
451
+ if (this.waitPromise)
452
+ return;
453
+ const eventTypes = this.activeBackendTypes();
454
+ if (eventTypes.length === 0)
455
+ return;
456
+ const controller = new AbortController();
457
+ this.waitAbortController = controller;
458
+ this.currentEventTypesKey = this.backendTypesKey(eventTypes);
459
+ const loopPromise = this.runWaitLoop(controller.signal, eventTypes).finally(() => {
460
+ if (this.waitPromise === loopPromise) {
461
+ this.waitPromise = null;
462
+ }
463
+ if (this.waitAbortController === controller) {
464
+ this.waitAbortController = null;
465
+ }
466
+ this.currentEventTypesKey = null;
467
+ if (!this.disposed && this.activeBindingTotal > 0) {
468
+ this.ensureLoop();
469
+ }
470
+ });
471
+ this.waitPromise = loopPromise;
472
+ }
473
+ async runWaitLoop(signal, eventTypes) {
474
+ while (!signal.aborted && !this.disposed && this.activeBindingTotal > 0) {
475
+ try {
476
+ const result = await this.waiter.wait({
477
+ ...(this.cursor ? { after: this.cursor } : {}),
478
+ timeoutMs: WAIT_TIMEOUT_MS,
479
+ eventTypes,
480
+ }, { signal });
481
+ this.updateCursor(result.cursor);
482
+ if (result.event) {
483
+ this.dispatchRuntimeEvent(result.event);
484
+ if (!result.cursor) {
485
+ this.updateCursor(cursorFromEvent(result.event));
486
+ }
487
+ }
488
+ }
489
+ catch (error) {
490
+ if (signal.aborted || this.disposed || this.activeBindingTotal === 0) {
491
+ return;
492
+ }
493
+ if (isAbortError(error)) {
494
+ return;
495
+ }
496
+ await sleep(ERROR_RETRY_DELAY_MS, signal);
497
+ }
498
+ }
499
+ }
500
+ dispatchRuntimeEvent(event) {
501
+ const eventData = asRecord(event.eventData);
502
+ if (event.eventType.startsWith('context.')) {
503
+ const contextId = asString(eventData?.contextId);
504
+ if (contextId) {
505
+ this.dispatchContextEvent(event, contextId, eventData);
506
+ }
507
+ return;
508
+ }
509
+ const pageId = asString(eventData?.pageId);
510
+ if (pageId) {
511
+ this.dispatchPageEvent(event, pageId, eventData);
512
+ return;
513
+ }
514
+ const contextId = asString(eventData?.contextId);
515
+ if (contextId) {
516
+ this.dispatchContextEvent(event, contextId, eventData);
517
+ }
518
+ }
519
+ dispatchPageEvent(event, pageId, eventData) {
520
+ const records = Array.from(this.pageEmitters).filter((record) => record.pageId === pageId);
521
+ if (records.length === 0)
522
+ return;
523
+ const isPageClosedEvent = event.eventType === 'page.closed';
524
+ for (const record of records) {
525
+ const pageEventName = record.backendTypeToEvent.get(event.eventType);
526
+ if (!pageEventName)
527
+ continue;
528
+ if (isPageClosedEvent && typeof record.emitter.markClosed === 'function') {
529
+ record.emitter.markClosed();
530
+ }
531
+ if (record.emitter.listenerCount(pageEventName) > 0) {
532
+ const payload = this.buildPagePayload(record, event.eventType, eventData);
533
+ record.emitter.emit(pageEventName, payload);
534
+ }
535
+ if (isPageClosedEvent) {
536
+ this.unregisterPageEmitter(record);
537
+ }
538
+ }
539
+ }
540
+ dispatchContextEvent(event, contextId, eventData) {
541
+ const records = Array.from(this.contextEmitters).filter((record) => record.contextId === contextId);
542
+ if (records.length === 0)
543
+ return;
544
+ const isContextClosedEvent = event.eventType === 'context.closed';
545
+ for (const record of records) {
546
+ const contextEventName = record.backendTypeToEvent.get(event.eventType);
547
+ if (!contextEventName)
548
+ continue;
549
+ const maybeMarkClosed = record.emitter.markClosed;
550
+ if (isContextClosedEvent && typeof maybeMarkClosed === 'function') {
551
+ maybeMarkClosed.call(record.emitter);
552
+ }
553
+ if (record.emitter.listenerCount(contextEventName) > 0) {
554
+ const payload = this.buildContextPayload(record, event.eventType, eventData);
555
+ record.emitter.emit(contextEventName, payload);
556
+ }
557
+ if (isContextClosedEvent) {
558
+ this.unregisterContextEmitter(record);
559
+ }
560
+ }
561
+ }
562
+ unregisterPageEmitter(record) {
563
+ if (!this.pageEmitters.has(record))
564
+ return;
565
+ setRemoteListenerBinding(record.emitter, null);
566
+ this.pageEmitters.delete(record);
567
+ this.pageEmitterRecords.delete(record.emitter);
568
+ const activeBackendTypes = Array.from(record.activeBackendTypes);
569
+ for (const backendType of activeBackendTypes) {
570
+ this.decrementBinding('page', record.pageId, backendType);
571
+ }
572
+ record.activeBackendTypes.clear();
573
+ }
574
+ unregisterContextEmitter(record) {
575
+ if (!this.contextEmitters.has(record))
576
+ return;
577
+ setRemoteListenerBinding(record.emitter, null);
578
+ this.contextEmitters.delete(record);
579
+ this.contextEmitterRecords.delete(record.emitter);
580
+ const activeBackendTypes = Array.from(record.activeBackendTypes);
581
+ for (const backendType of activeBackendTypes) {
582
+ this.decrementBinding('context', record.contextId, backendType);
583
+ }
584
+ record.activeBackendTypes.clear();
585
+ }
586
+ createPageForEvent(record, pageId) {
587
+ if (!record.createPage)
588
+ return null;
589
+ try {
590
+ return record.createPage(pageId);
591
+ }
592
+ catch {
593
+ return null;
594
+ }
595
+ }
596
+ buildPagePayload(record, backendType, eventData) {
597
+ switch (backendType) {
598
+ case 'console': {
599
+ const level = asString(eventData?.level) ?? 'log';
600
+ const textValue = asString(eventData?.text) ?? '';
601
+ const location = asRecord(eventData?.location) ?? {};
602
+ return new SyntheticConsoleMessage(level, textValue, location);
603
+ }
604
+ case 'page.error': {
605
+ const message = asString(eventData?.message) ?? 'Page error';
606
+ const error = new Error(message);
607
+ const stack = asString(eventData?.stack);
608
+ if (stack)
609
+ error.stack = stack;
610
+ return error;
611
+ }
612
+ case 'page.request': {
613
+ const url = asString(eventData?.url) ?? '';
614
+ const method = asString(eventData?.method) ?? 'GET';
615
+ const resourceType = asString(eventData?.resourceType) ?? 'other';
616
+ const headers = asRecord(eventData?.headers) ?? {};
617
+ return new SyntheticRequest(url, method, resourceType, headers, null);
618
+ }
619
+ case 'page.request_failed': {
620
+ const url = asString(eventData?.url) ?? '';
621
+ const method = asString(eventData?.method) ?? 'GET';
622
+ const resourceType = asString(eventData?.resourceType) ?? 'other';
623
+ const errorText = asString(eventData?.errorText) ?? null;
624
+ const headers = asRecord(eventData?.headers) ?? {};
625
+ return new SyntheticRequest(url, method, resourceType, headers, errorText);
626
+ }
627
+ case 'page.request_finished': {
628
+ const url = asString(eventData?.url) ?? '';
629
+ const method = asString(eventData?.method) ?? 'GET';
630
+ const resourceType = asString(eventData?.resourceType) ?? 'other';
631
+ const headers = asRecord(eventData?.headers) ?? {};
632
+ const timing = asRecord(eventData?.timing);
633
+ const request = new SyntheticRequest(url, method, resourceType, headers, null, null, timing);
634
+ const status = asNumber(eventData?.status);
635
+ const statusText = asString(eventData?.statusText);
636
+ if (status !== null || statusText !== null) {
637
+ const response = new SyntheticResponse(url, status ?? 0, statusText ?? '', {}, request);
638
+ request.setResponse(response);
639
+ }
640
+ return request;
641
+ }
642
+ case 'page.response': {
643
+ const url = asString(eventData?.url) ?? '';
644
+ const method = asString(eventData?.method) ?? 'GET';
645
+ const resourceType = asString(eventData?.resourceType) ?? 'other';
646
+ const responseHeaders = asRecord(eventData?.headers) ?? {};
647
+ const request = new SyntheticRequest(url, method, resourceType, {}, null);
648
+ const response = new SyntheticResponse(url, asNumber(eventData?.status) ?? 0, asString(eventData?.statusText) ?? '', responseHeaders, request);
649
+ request.setResponse(response);
650
+ return response;
651
+ }
652
+ case 'page.dialog': {
653
+ const type = asString(eventData?.dialogType) ?? 'alert';
654
+ const message = asString(eventData?.message) ?? '';
655
+ const defaultValue = asString(eventData?.defaultValue) ?? '';
656
+ const dialogId = asString(eventData?.dialogId);
657
+ const invoke = dialogId && record.callDialogAction
658
+ ? async (action, promptText) => {
659
+ await record.callDialogAction?.(dialogId, action, promptText);
660
+ }
661
+ : undefined;
662
+ return new SyntheticDialog(type, message, defaultValue, invoke);
663
+ }
664
+ case 'page.navigated': {
665
+ return new SyntheticFrame(asString(eventData?.url) ?? '', asString(eventData?.frameName));
666
+ }
667
+ case 'page.frame_attached':
668
+ case 'page.frame_detached': {
669
+ return new SyntheticFrame(asString(eventData?.frameUrl) ?? '', asString(eventData?.frameName));
670
+ }
671
+ case 'page.popup': {
672
+ const popupPageId = asString(eventData?.popupPageId);
673
+ if (!popupPageId)
674
+ return eventData;
675
+ const popupPage = this.createPageForEvent(record, popupPageId);
676
+ return popupPage ?? eventData;
677
+ }
678
+ case 'page.download': {
679
+ const url = asString(eventData?.url) ?? '';
680
+ const suggestedFilename = asString(eventData?.suggestedFilename) ?? '';
681
+ const path = asString(eventData?.path);
682
+ return new SyntheticDownload(url, suggestedFilename, path ?? null);
683
+ }
684
+ case 'page.filechooser': {
685
+ const isMultiple = asBoolean(eventData?.isMultiple) ?? false;
686
+ return new SyntheticFileChooser(isMultiple);
687
+ }
688
+ case 'page.domcontentloaded':
689
+ case 'page.load':
690
+ case 'page.crash':
691
+ case 'page.closed':
692
+ return undefined;
693
+ case 'page.websocket':
694
+ return new SyntheticWebSocket(asString(eventData?.wsUrl) ?? '');
695
+ case 'page.worker':
696
+ return new SyntheticWorker(asString(eventData?.workerUrl) ?? '');
697
+ default:
698
+ return eventData;
699
+ }
700
+ }
701
+ buildContextPayload(record, backendType, eventData) {
702
+ switch (backendType) {
703
+ case 'context.page_created': {
704
+ const pageId = asString(eventData?.pageId);
705
+ if (!pageId)
706
+ return eventData;
707
+ const page = this.createPageForEvent(record, pageId);
708
+ return page ?? eventData;
709
+ }
710
+ case 'context.closed':
711
+ return undefined;
712
+ default:
713
+ return eventData;
714
+ }
715
+ }
716
+ }