@bctrl/sdk 1.0.1 → 1.0.3

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