@bctrl/sdk 1.0.1 → 1.0.2

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 (279) hide show
  1. package/README.md +24 -29
  2. package/dist/bctrl.d.ts +22 -36
  3. package/dist/bctrl.js +40 -75
  4. package/dist/browsers.d.ts +24 -0
  5. package/dist/browsers.js +82 -0
  6. package/dist/errors.d.ts +49 -43
  7. package/dist/errors.js +83 -120
  8. package/dist/files.d.ts +31 -0
  9. package/dist/files.js +97 -0
  10. package/dist/http.d.ts +18 -0
  11. package/dist/http.js +135 -0
  12. package/dist/index.d.ts +9 -12
  13. package/dist/index.js +8 -23
  14. package/dist/invocations.d.ts +24 -0
  15. package/dist/invocations.js +66 -0
  16. package/dist/pagination.d.ts +2 -0
  17. package/dist/pagination.js +13 -0
  18. package/dist/runs.d.ts +38 -0
  19. package/dist/runs.js +99 -0
  20. package/dist/runtimes.d.ts +73 -0
  21. package/dist/runtimes.js +205 -0
  22. package/dist/spaces.d.ts +41 -0
  23. package/dist/spaces.js +96 -0
  24. package/dist/types.d.ts +386 -0
  25. package/dist/types.js +1 -0
  26. package/dist/utils.d.ts +4 -0
  27. package/dist/utils.js +27 -0
  28. package/dist/version.js +2 -2
  29. package/package.json +12 -31
  30. package/dist/agents/browser-use/index.d.ts +0 -1
  31. package/dist/agents/browser-use/index.js +0 -9
  32. package/dist/agents/browser-use/namespace.d.ts +0 -39
  33. package/dist/agents/browser-use/namespace.js +0 -93
  34. package/dist/agents/index.d.ts +0 -2
  35. package/dist/agents/index.js +0 -17
  36. package/dist/agents/stagehand/core.d.ts +0 -93
  37. package/dist/agents/stagehand/core.js +0 -144
  38. package/dist/agents/stagehand/index.d.ts +0 -3
  39. package/dist/agents/stagehand/index.js +0 -24
  40. package/dist/agents/stagehand/namespace.d.ts +0 -51
  41. package/dist/agents/stagehand/namespace.js +0 -65
  42. package/dist/ai-credentials/client.d.ts +0 -12
  43. package/dist/ai-credentials/client.js +0 -70
  44. package/dist/ai-credentials/index.d.ts +0 -1
  45. package/dist/ai-credentials/index.js +0 -1
  46. package/dist/base/event-binding.d.ts +0 -7
  47. package/dist/base/event-binding.js +0 -23
  48. package/dist/base/types.d.ts +0 -109
  49. package/dist/base/types.js +0 -4
  50. package/dist/browser-extensions/client.d.ts +0 -15
  51. package/dist/browser-extensions/client.js +0 -72
  52. package/dist/browser-extensions/index.d.ts +0 -2
  53. package/dist/browser-extensions/index.js +0 -1
  54. package/dist/browser-profiles/client.d.ts +0 -11
  55. package/dist/browser-profiles/client.js +0 -63
  56. package/dist/browser-profiles/index.d.ts +0 -1
  57. package/dist/browser-profiles/index.js +0 -1
  58. package/dist/captcha/index.d.ts +0 -1
  59. package/dist/captcha/index.js +0 -1
  60. package/dist/captcha/namespace.d.ts +0 -34
  61. package/dist/captcha/namespace.js +0 -41
  62. package/dist/client/index.d.ts +0 -1
  63. package/dist/client/index.js +0 -1
  64. package/dist/client/rpc.d.ts +0 -83
  65. package/dist/client/rpc.js +0 -354
  66. package/dist/config.d.ts +0 -5
  67. package/dist/config.js +0 -28
  68. package/dist/constants/browser.d.ts +0 -2
  69. package/dist/constants/browser.js +0 -1
  70. package/dist/contracts/agent-tools.d.ts +0 -45
  71. package/dist/contracts/agent-tools.js +0 -31
  72. package/dist/contracts/automation.d.ts +0 -265
  73. package/dist/contracts/automation.js +0 -109
  74. package/dist/contracts/browser-management.d.ts +0 -179
  75. package/dist/contracts/browser-management.js +0 -95
  76. package/dist/contracts/browser-use.d.ts +0 -136
  77. package/dist/contracts/browser-use.js +0 -93
  78. package/dist/contracts/captcha.d.ts +0 -114
  79. package/dist/contracts/captcha.js +0 -40
  80. package/dist/contracts/desktop.d.ts +0 -223
  81. package/dist/contracts/desktop.js +0 -121
  82. package/dist/contracts/drivers/playwright.d.ts +0 -2008
  83. package/dist/contracts/drivers/playwright.js +0 -2033
  84. package/dist/contracts/drivers/puppeteer.d.ts +0 -1221
  85. package/dist/contracts/drivers/puppeteer.js +0 -941
  86. package/dist/contracts/drivers/selenium.d.ts +0 -156
  87. package/dist/contracts/drivers/selenium.js +0 -61
  88. package/dist/contracts/drivers/stagehand.d.ts +0 -155
  89. package/dist/contracts/drivers/stagehand.js +0 -7
  90. package/dist/contracts/extensions.d.ts +0 -13
  91. package/dist/contracts/extensions.js +0 -9
  92. package/dist/contracts/index.d.ts +0 -13
  93. package/dist/contracts/index.js +0 -13
  94. package/dist/contracts/public-api.d.ts +0 -360
  95. package/dist/contracts/public-api.js +0 -17
  96. package/dist/contracts/runtime.d.ts +0 -81
  97. package/dist/contracts/runtime.js +0 -16
  98. package/dist/contracts/stagehand.d.ts +0 -253
  99. package/dist/contracts/stagehand.js +0 -145
  100. package/dist/contracts/storage.d.ts +0 -51
  101. package/dist/contracts/storage.js +0 -56
  102. package/dist/contracts/vault.d.ts +0 -119
  103. package/dist/contracts/vault.js +0 -112
  104. package/dist/contracts/version.d.ts +0 -3
  105. package/dist/contracts/version.js +0 -16
  106. package/dist/desktop.d.ts +0 -2
  107. package/dist/desktop.js +0 -3
  108. package/dist/drivers/desktop/index.d.ts +0 -65
  109. package/dist/drivers/desktop/index.js +0 -68
  110. package/dist/drivers/desktop/session.d.ts +0 -313
  111. package/dist/drivers/desktop/session.js +0 -432
  112. package/dist/drivers/playwright/event-emitter.d.ts +0 -160
  113. package/dist/drivers/playwright/event-emitter.js +0 -297
  114. package/dist/drivers/playwright/generated/api-request-context.d.ts +0 -137
  115. package/dist/drivers/playwright/generated/api-request-context.js +0 -154
  116. package/dist/drivers/playwright/generated/api-response.d.ts +0 -119
  117. package/dist/drivers/playwright/generated/api-response.js +0 -123
  118. package/dist/drivers/playwright/generated/browser-context.d.ts +0 -284
  119. package/dist/drivers/playwright/generated/browser-context.js +0 -458
  120. package/dist/drivers/playwright/generated/browser.d.ts +0 -120
  121. package/dist/drivers/playwright/generated/browser.js +0 -151
  122. package/dist/drivers/playwright/generated/clock.d.ts +0 -80
  123. package/dist/drivers/playwright/generated/clock.js +0 -94
  124. package/dist/drivers/playwright/generated/console-message.d.ts +0 -94
  125. package/dist/drivers/playwright/generated/console-message.js +0 -89
  126. package/dist/drivers/playwright/generated/coverage.d.ts +0 -57
  127. package/dist/drivers/playwright/generated/coverage.js +0 -66
  128. package/dist/drivers/playwright/generated/dialog.d.ts +0 -79
  129. package/dist/drivers/playwright/generated/dialog.js +0 -80
  130. package/dist/drivers/playwright/generated/element-handle.d.ts +0 -399
  131. package/dist/drivers/playwright/generated/element-handle.js +0 -501
  132. package/dist/drivers/playwright/generated/frame-locator.d.ts +0 -34
  133. package/dist/drivers/playwright/generated/frame-locator.js +0 -63
  134. package/dist/drivers/playwright/generated/frame.d.ts +0 -557
  135. package/dist/drivers/playwright/generated/frame.js +0 -634
  136. package/dist/drivers/playwright/generated/js-handle.d.ts +0 -72
  137. package/dist/drivers/playwright/generated/js-handle.js +0 -92
  138. package/dist/drivers/playwright/generated/keyboard.d.ts +0 -103
  139. package/dist/drivers/playwright/generated/keyboard.js +0 -113
  140. package/dist/drivers/playwright/generated/locator.d.ts +0 -795
  141. package/dist/drivers/playwright/generated/locator.js +0 -974
  142. package/dist/drivers/playwright/generated/mouse.d.ts +0 -97
  143. package/dist/drivers/playwright/generated/mouse.js +0 -109
  144. package/dist/drivers/playwright/generated/page.d.ts +0 -762
  145. package/dist/drivers/playwright/generated/page.js +0 -988
  146. package/dist/drivers/playwright/generated/touchscreen.d.ts +0 -34
  147. package/dist/drivers/playwright/generated/touchscreen.js +0 -37
  148. package/dist/drivers/playwright/generated/tracing.d.ts +0 -78
  149. package/dist/drivers/playwright/generated/tracing.js +0 -80
  150. package/dist/drivers/playwright/generated/worker.d.ts +0 -53
  151. package/dist/drivers/playwright/generated/worker.js +0 -59
  152. package/dist/drivers/playwright/index.d.ts +0 -19
  153. package/dist/drivers/playwright/index.js +0 -20
  154. package/dist/drivers/playwright/remote-base.d.ts +0 -62
  155. package/dist/drivers/playwright/remote-base.js +0 -86
  156. package/dist/drivers/playwright/types.d.ts +0 -148
  157. package/dist/drivers/playwright/types.js +0 -8
  158. package/dist/drivers/puppeteer/errors.d.ts +0 -50
  159. package/dist/drivers/puppeteer/errors.js +0 -71
  160. package/dist/drivers/puppeteer/event-emitter.d.ts +0 -145
  161. package/dist/drivers/puppeteer/event-emitter.js +0 -259
  162. package/dist/drivers/puppeteer/generated/accessibility.d.ts +0 -77
  163. package/dist/drivers/puppeteer/generated/accessibility.js +0 -74
  164. package/dist/drivers/puppeteer/generated/browser-context.d.ts +0 -116
  165. package/dist/drivers/puppeteer/generated/browser-context.js +0 -168
  166. package/dist/drivers/puppeteer/generated/browser.d.ts +0 -169
  167. package/dist/drivers/puppeteer/generated/browser.js +0 -246
  168. package/dist/drivers/puppeteer/generated/console-message.d.ts +0 -54
  169. package/dist/drivers/puppeteer/generated/console-message.js +0 -69
  170. package/dist/drivers/puppeteer/generated/coverage.d.ts +0 -49
  171. package/dist/drivers/puppeteer/generated/coverage.js +0 -57
  172. package/dist/drivers/puppeteer/generated/dialog.d.ts +0 -46
  173. package/dist/drivers/puppeteer/generated/dialog.js +0 -60
  174. package/dist/drivers/puppeteer/generated/element-handle.d.ts +0 -261
  175. package/dist/drivers/puppeteer/generated/element-handle.js +0 -341
  176. package/dist/drivers/puppeteer/generated/file-chooser.d.ts +0 -34
  177. package/dist/drivers/puppeteer/generated/file-chooser.js +0 -43
  178. package/dist/drivers/puppeteer/generated/frame.d.ts +0 -221
  179. package/dist/drivers/puppeteer/generated/frame.js +0 -302
  180. package/dist/drivers/puppeteer/generated/http-request.d.ts +0 -195
  181. package/dist/drivers/puppeteer/generated/http-request.js +0 -243
  182. package/dist/drivers/puppeteer/generated/http-response.d.ts +0 -142
  183. package/dist/drivers/puppeteer/generated/http-response.js +0 -169
  184. package/dist/drivers/puppeteer/generated/js-handle.d.ts +0 -104
  185. package/dist/drivers/puppeteer/generated/js-handle.js +0 -125
  186. package/dist/drivers/puppeteer/generated/keyboard.d.ts +0 -79
  187. package/dist/drivers/puppeteer/generated/keyboard.js +0 -89
  188. package/dist/drivers/puppeteer/generated/locator.d.ts +0 -141
  189. package/dist/drivers/puppeteer/generated/locator.js +0 -164
  190. package/dist/drivers/puppeteer/generated/mouse.d.ts +0 -74
  191. package/dist/drivers/puppeteer/generated/mouse.js +0 -94
  192. package/dist/drivers/puppeteer/generated/page.d.ts +0 -604
  193. package/dist/drivers/puppeteer/generated/page.js +0 -776
  194. package/dist/drivers/puppeteer/generated/target.d.ts +0 -105
  195. package/dist/drivers/puppeteer/generated/target.js +0 -123
  196. package/dist/drivers/puppeteer/generated/touchscreen.d.ts +0 -87
  197. package/dist/drivers/puppeteer/generated/touchscreen.js +0 -103
  198. package/dist/drivers/puppeteer/generated/tracing.d.ts +0 -38
  199. package/dist/drivers/puppeteer/generated/tracing.js +0 -43
  200. package/dist/drivers/puppeteer/generated/web-worker.d.ts +0 -63
  201. package/dist/drivers/puppeteer/generated/web-worker.js +0 -73
  202. package/dist/drivers/puppeteer/index.d.ts +0 -21
  203. package/dist/drivers/puppeteer/index.js +0 -23
  204. package/dist/drivers/puppeteer/remote-base.d.ts +0 -57
  205. package/dist/drivers/puppeteer/remote-base.js +0 -79
  206. package/dist/drivers/puppeteer/types.d.ts +0 -178
  207. package/dist/drivers/puppeteer/types.js +0 -8
  208. package/dist/drivers/selenium/driver.d.ts +0 -28
  209. package/dist/drivers/selenium/driver.js +0 -169
  210. package/dist/drivers/selenium/element.d.ts +0 -34
  211. package/dist/drivers/selenium/element.js +0 -73
  212. package/dist/drivers/selenium/index.d.ts +0 -3
  213. package/dist/drivers/selenium/index.js +0 -5
  214. package/dist/drivers/selenium/types.d.ts +0 -2
  215. package/dist/drivers/selenium/types.js +0 -12
  216. package/dist/drivers/stagehand/generated/context.d.ts +0 -127
  217. package/dist/drivers/stagehand/generated/context.js +0 -153
  218. package/dist/drivers/stagehand/generated/locator.d.ts +0 -324
  219. package/dist/drivers/stagehand/generated/locator.js +0 -368
  220. package/dist/drivers/stagehand/generated/page.d.ts +0 -377
  221. package/dist/drivers/stagehand/generated/page.js +0 -439
  222. package/dist/drivers/stagehand/generated/response.d.ts +0 -197
  223. package/dist/drivers/stagehand/generated/response.js +0 -232
  224. package/dist/drivers/stagehand/index.d.ts +0 -5
  225. package/dist/drivers/stagehand/index.js +0 -8
  226. package/dist/drivers/stagehand/types.d.ts +0 -1
  227. package/dist/drivers/stagehand/types.js +0 -7
  228. package/dist/extensions/client.d.ts +0 -47
  229. package/dist/extensions/client.js +0 -154
  230. package/dist/extensions/index.d.ts +0 -1
  231. package/dist/extensions/index.js +0 -1
  232. package/dist/internal/dev-client.d.ts +0 -5
  233. package/dist/internal/dev-client.js +0 -9
  234. package/dist/internal/rpc-targets.d.ts +0 -17
  235. package/dist/internal/rpc-targets.js +0 -58
  236. package/dist/internal/serialization.d.ts +0 -32
  237. package/dist/internal/serialization.js +0 -42
  238. package/dist/internal/transport.d.ts +0 -24
  239. package/dist/internal/transport.js +0 -29
  240. package/dist/playwright.d.ts +0 -1
  241. package/dist/playwright.js +0 -2
  242. package/dist/puppeteer.d.ts +0 -1
  243. package/dist/puppeteer.js +0 -2
  244. package/dist/selenium.d.ts +0 -1
  245. package/dist/selenium.js +0 -2
  246. package/dist/stagehand.d.ts +0 -1
  247. package/dist/stagehand.js +0 -2
  248. package/dist/storage/client.d.ts +0 -151
  249. package/dist/storage/client.js +0 -329
  250. package/dist/storage/index.d.ts +0 -2
  251. package/dist/storage/index.js +0 -4
  252. package/dist/telemetry.d.ts +0 -18
  253. package/dist/telemetry.js +0 -93
  254. package/dist/updates/client.d.ts +0 -8
  255. package/dist/updates/client.js +0 -128
  256. package/dist/updates/index.d.ts +0 -1
  257. package/dist/updates/index.js +0 -1
  258. package/dist/utils/http.d.ts +0 -39
  259. package/dist/utils/http.js +0 -88
  260. package/dist/utils/index.d.ts +0 -4
  261. package/dist/utils/index.js +0 -4
  262. package/dist/utils/logger.d.ts +0 -27
  263. package/dist/utils/logger.js +0 -74
  264. package/dist/utils/schema.d.ts +0 -17
  265. package/dist/utils/schema.js +0 -31
  266. package/dist/utils/url.d.ts +0 -5
  267. package/dist/utils/url.js +0 -7
  268. package/dist/vault/client.d.ts +0 -43
  269. package/dist/vault/client.js +0 -123
  270. package/dist/vault/index.d.ts +0 -1
  271. package/dist/vault/index.js +0 -1
  272. package/dist/workspaces/browser-runtime.d.ts +0 -251
  273. package/dist/workspaces/browser-runtime.js +0 -1025
  274. package/dist/workspaces/client.d.ts +0 -48
  275. package/dist/workspaces/client.js +0 -222
  276. package/dist/workspaces/index.d.ts +0 -2
  277. package/dist/workspaces/index.js +0 -2
  278. package/dist/workspaces/runtime-event-pump.d.ts +0 -65
  279. package/dist/workspaces/runtime-event-pump.js +0 -716
@@ -1,716 +0,0 @@
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
- }