craftdriver 0.0.3 → 0.2.0

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 (192) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +186 -10
  3. package/bin/craftdriver.mjs +26 -0
  4. package/dist/cli/client.d.ts +17 -0
  5. package/dist/cli/client.d.ts.map +1 -0
  6. package/dist/cli/client.js +88 -0
  7. package/dist/cli/client.js.map +1 -0
  8. package/dist/cli/daemon.d.ts +15 -0
  9. package/dist/cli/daemon.d.ts.map +1 -0
  10. package/dist/cli/daemon.js +145 -0
  11. package/dist/cli/daemon.js.map +1 -0
  12. package/dist/cli/defaults.d.ts +10 -0
  13. package/dist/cli/defaults.d.ts.map +1 -0
  14. package/dist/cli/defaults.js +42 -0
  15. package/dist/cli/defaults.js.map +1 -0
  16. package/dist/cli/dispatcher.d.ts +28 -0
  17. package/dist/cli/dispatcher.d.ts.map +1 -0
  18. package/dist/cli/dispatcher.js +319 -0
  19. package/dist/cli/dispatcher.js.map +1 -0
  20. package/dist/cli/index.d.ts +2 -0
  21. package/dist/cli/index.d.ts.map +1 -0
  22. package/dist/cli/index.js +404 -0
  23. package/dist/cli/index.js.map +1 -0
  24. package/dist/cli/init.d.ts +24 -0
  25. package/dist/cli/init.d.ts.map +1 -0
  26. package/dist/cli/init.js +192 -0
  27. package/dist/cli/init.js.map +1 -0
  28. package/dist/cli/mcp/artifacts.d.ts +43 -0
  29. package/dist/cli/mcp/artifacts.d.ts.map +1 -0
  30. package/dist/cli/mcp/artifacts.js +104 -0
  31. package/dist/cli/mcp/artifacts.js.map +1 -0
  32. package/dist/cli/mcp/server.d.ts +34 -0
  33. package/dist/cli/mcp/server.d.ts.map +1 -0
  34. package/dist/cli/mcp/server.js +214 -0
  35. package/dist/cli/mcp/server.js.map +1 -0
  36. package/dist/cli/mcp/tools.d.ts +34 -0
  37. package/dist/cli/mcp/tools.d.ts.map +1 -0
  38. package/dist/cli/mcp/tools.js +236 -0
  39. package/dist/cli/mcp/tools.js.map +1 -0
  40. package/dist/cli/parseArgs.d.ts +37 -0
  41. package/dist/cli/parseArgs.d.ts.map +1 -0
  42. package/dist/cli/parseArgs.js +215 -0
  43. package/dist/cli/parseArgs.js.map +1 -0
  44. package/dist/cli/protocol.d.ts +34 -0
  45. package/dist/cli/protocol.d.ts.map +1 -0
  46. package/dist/cli/protocol.js +2 -0
  47. package/dist/cli/protocol.js.map +1 -0
  48. package/dist/cli/selector.d.ts +29 -0
  49. package/dist/cli/selector.d.ts.map +1 -0
  50. package/dist/cli/selector.js +100 -0
  51. package/dist/cli/selector.js.map +1 -0
  52. package/dist/cli/snapshot.d.ts +48 -0
  53. package/dist/cli/snapshot.d.ts.map +1 -0
  54. package/dist/cli/snapshot.js +179 -0
  55. package/dist/cli/snapshot.js.map +1 -0
  56. package/dist/index.d.ts +14 -1
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +17 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/lib/a11y.d.ts +81 -0
  61. package/dist/lib/a11y.d.ts.map +1 -0
  62. package/dist/lib/a11y.js +171 -0
  63. package/dist/lib/a11y.js.map +1 -0
  64. package/dist/lib/bidi/connection.d.ts +62 -0
  65. package/dist/lib/bidi/connection.d.ts.map +1 -0
  66. package/dist/lib/bidi/connection.js +227 -0
  67. package/dist/lib/bidi/connection.js.map +1 -0
  68. package/dist/lib/bidi/index.d.ts +101 -0
  69. package/dist/lib/bidi/index.d.ts.map +1 -0
  70. package/dist/lib/bidi/index.js +163 -0
  71. package/dist/lib/bidi/index.js.map +1 -0
  72. package/dist/lib/bidi/logs.d.ts +104 -0
  73. package/dist/lib/bidi/logs.d.ts.map +1 -0
  74. package/dist/lib/bidi/logs.js +273 -0
  75. package/dist/lib/bidi/logs.js.map +1 -0
  76. package/dist/lib/bidi/network.d.ts +165 -0
  77. package/dist/lib/bidi/network.d.ts.map +1 -0
  78. package/dist/lib/bidi/network.js +477 -0
  79. package/dist/lib/bidi/network.js.map +1 -0
  80. package/dist/lib/bidi/storage.d.ts +83 -0
  81. package/dist/lib/bidi/storage.d.ts.map +1 -0
  82. package/dist/lib/bidi/storage.js +299 -0
  83. package/dist/lib/bidi/storage.js.map +1 -0
  84. package/dist/lib/bidi/types.d.ts +323 -0
  85. package/dist/lib/bidi/types.d.ts.map +1 -0
  86. package/dist/lib/bidi/types.js +6 -0
  87. package/dist/lib/bidi/types.js.map +1 -0
  88. package/dist/lib/browser.d.ts +776 -13
  89. package/dist/lib/browser.d.ts.map +1 -1
  90. package/dist/lib/browser.js +1547 -70
  91. package/dist/lib/browser.js.map +1 -1
  92. package/dist/lib/browserContext.d.ts +486 -0
  93. package/dist/lib/browserContext.d.ts.map +1 -0
  94. package/dist/lib/browserContext.js +937 -0
  95. package/dist/lib/browserContext.js.map +1 -0
  96. package/dist/lib/builder.d.ts +3 -0
  97. package/dist/lib/builder.d.ts.map +1 -1
  98. package/dist/lib/builder.js +31 -4
  99. package/dist/lib/builder.js.map +1 -1
  100. package/dist/lib/by.d.ts +18 -2
  101. package/dist/lib/by.d.ts.map +1 -1
  102. package/dist/lib/by.js +20 -2
  103. package/dist/lib/by.js.map +1 -1
  104. package/dist/lib/chrome.d.ts +13 -1
  105. package/dist/lib/chrome.d.ts.map +1 -1
  106. package/dist/lib/chrome.js +13 -17
  107. package/dist/lib/chrome.js.map +1 -1
  108. package/dist/lib/clock.d.ts +115 -0
  109. package/dist/lib/clock.d.ts.map +1 -0
  110. package/dist/lib/clock.js +407 -0
  111. package/dist/lib/clock.js.map +1 -0
  112. package/dist/lib/driver.d.ts +45 -0
  113. package/dist/lib/driver.d.ts.map +1 -1
  114. package/dist/lib/driver.js +129 -1
  115. package/dist/lib/driver.js.map +1 -1
  116. package/dist/lib/driverManager.d.ts +25 -0
  117. package/dist/lib/driverManager.d.ts.map +1 -0
  118. package/dist/lib/driverManager.js +399 -0
  119. package/dist/lib/driverManager.js.map +1 -0
  120. package/dist/lib/elementHandle.d.ts +69 -2
  121. package/dist/lib/elementHandle.d.ts.map +1 -1
  122. package/dist/lib/elementHandle.js +215 -40
  123. package/dist/lib/elementHandle.js.map +1 -1
  124. package/dist/lib/errors.d.ts +71 -0
  125. package/dist/lib/errors.d.ts.map +1 -0
  126. package/dist/lib/errors.js +73 -0
  127. package/dist/lib/errors.js.map +1 -0
  128. package/dist/lib/expect.d.ts +6 -1
  129. package/dist/lib/expect.d.ts.map +1 -1
  130. package/dist/lib/expect.js +55 -37
  131. package/dist/lib/expect.js.map +1 -1
  132. package/dist/lib/firefox.d.ts +18 -0
  133. package/dist/lib/firefox.d.ts.map +1 -0
  134. package/dist/lib/firefox.js +33 -0
  135. package/dist/lib/firefox.js.map +1 -0
  136. package/dist/lib/frame.d.ts +57 -0
  137. package/dist/lib/frame.d.ts.map +1 -0
  138. package/dist/lib/frame.js +277 -0
  139. package/dist/lib/frame.js.map +1 -0
  140. package/dist/lib/keyboard.d.ts +1 -1
  141. package/dist/lib/keyboard.d.ts.map +1 -1
  142. package/dist/lib/keyboard.js +1 -1
  143. package/dist/lib/keyboard.js.map +1 -1
  144. package/dist/lib/locator.d.ts +71 -2
  145. package/dist/lib/locator.d.ts.map +1 -1
  146. package/dist/lib/locator.js +289 -31
  147. package/dist/lib/locator.js.map +1 -1
  148. package/dist/lib/mouse.d.ts +1 -1
  149. package/dist/lib/mouse.d.ts.map +1 -1
  150. package/dist/lib/mouse.js +1 -1
  151. package/dist/lib/mouse.js.map +1 -1
  152. package/dist/lib/page.d.ts +107 -0
  153. package/dist/lib/page.d.ts.map +1 -0
  154. package/dist/lib/page.js +388 -0
  155. package/dist/lib/page.js.map +1 -0
  156. package/dist/lib/tracing.d.ts +128 -0
  157. package/dist/lib/tracing.d.ts.map +1 -0
  158. package/dist/lib/tracing.js +272 -0
  159. package/dist/lib/tracing.js.map +1 -0
  160. package/dist/lib/wait.d.ts.map +1 -1
  161. package/dist/lib/wait.js +14 -1
  162. package/dist/lib/wait.js.map +1 -1
  163. package/dist/lib/webelement.d.ts +2 -0
  164. package/dist/lib/webelement.d.ts.map +1 -1
  165. package/dist/lib/webelement.js +18 -0
  166. package/dist/lib/webelement.js.map +1 -1
  167. package/docs/accessibility.md +177 -0
  168. package/docs/api-reference.md +71 -0
  169. package/docs/assertions.md +182 -0
  170. package/docs/bidi-features.md +462 -0
  171. package/docs/browser-api.md +673 -0
  172. package/docs/browser-context.md +522 -0
  173. package/docs/cli.md +233 -0
  174. package/docs/clock.md +245 -0
  175. package/docs/dialogs.md +143 -0
  176. package/docs/driver-configuration.md +64 -0
  177. package/docs/element-api.md +219 -0
  178. package/docs/emulation.md +155 -0
  179. package/docs/error-codes.md +67 -0
  180. package/docs/getting-started.md +168 -0
  181. package/docs/keyboard-mouse.md +250 -0
  182. package/docs/mcp.md +250 -0
  183. package/docs/mobile-emulation.md +194 -0
  184. package/docs/screenshots.md +146 -0
  185. package/docs/selectors.md +382 -0
  186. package/docs/session-management.md +229 -0
  187. package/docs/tracing.md +282 -0
  188. package/package.json +25 -5
  189. package/skills/craftdriver/SKILL.md +84 -0
  190. package/skills/craftdriver/cheatsheet.md +194 -0
  191. package/skills/craftdriver/cli.md +104 -0
  192. package/skills/craftdriver/patterns.md +139 -0
@@ -0,0 +1,477 @@
1
+ /**
2
+ * BiDi Network Interceptor
3
+ * Provides request interception, mocking, and modification capabilities
4
+ */
5
+ export class NetworkInterceptor {
6
+ connection;
7
+ intercepts = new Map();
8
+ handlers = new Map();
9
+ subscribed = false;
10
+ context;
11
+ requestListeners = [];
12
+ responseListeners = [];
13
+ /** Set of request IDs currently in-flight (sent but not yet completed/errored). */
14
+ inFlightRequests = new Set();
15
+ /** Callbacks to notify when inFlightRequests changes — used by waitForNetworkIdle. */
16
+ idleListeners = [];
17
+ constructor(connection, context) {
18
+ this.connection = connection;
19
+ this.context = context;
20
+ }
21
+ /**
22
+ * Initialize network event subscriptions
23
+ */
24
+ async initialize() {
25
+ if (this.subscribed)
26
+ return;
27
+ // Subscribe to network events
28
+ await this.connection.subscribe([
29
+ 'network.beforeRequestSent',
30
+ 'network.responseStarted',
31
+ 'network.responseCompleted',
32
+ 'network.fetchError',
33
+ 'network.authRequired',
34
+ ]);
35
+ // Handle intercepted requests + track in-flight
36
+ this.connection.on('network.beforeRequestSent', async (params) => {
37
+ const event = params;
38
+ // Track in-flight (before intercept handling, so count is always accurate)
39
+ this.inFlightRequests.add(event.request.request);
40
+ await this.handleBeforeRequestSent(event);
41
+ // Notify passive request listeners (waitForRequest)
42
+ if (this.requestListeners.length > 0) {
43
+ const req = {
44
+ id: event.request.request,
45
+ url: event.request.url,
46
+ method: event.request.method,
47
+ headers: this.headersToObject(event.request.headers),
48
+ isBlocked: event.isBlocked,
49
+ context: event.context,
50
+ };
51
+ for (const l of [...this.requestListeners])
52
+ l(req);
53
+ }
54
+ });
55
+ // Track completed responses + notify waitForResponse listeners
56
+ this.connection.on('network.responseCompleted', (params) => {
57
+ const event = params;
58
+ this.inFlightRequests.delete(event.request.request);
59
+ this._notifyIdleListeners();
60
+ if (this.responseListeners.length > 0) {
61
+ const res = {
62
+ url: event.response.url,
63
+ status: event.response.status,
64
+ statusText: event.response.statusText,
65
+ headers: this.headersToObject(event.response.headers),
66
+ mimeType: event.response.mimeType,
67
+ fromCache: event.response.fromCache,
68
+ request: {
69
+ id: event.request.request,
70
+ url: event.request.url,
71
+ method: event.request.method,
72
+ headers: this.headersToObject(event.request.headers),
73
+ },
74
+ };
75
+ for (const l of [...this.responseListeners])
76
+ l(res);
77
+ }
78
+ });
79
+ // Track fetch errors (request failed before a response)
80
+ this.connection.on('network.fetchError', (params) => {
81
+ const reqId = params?.request?.request;
82
+ if (reqId) {
83
+ this.inFlightRequests.delete(reqId);
84
+ this._notifyIdleListeners();
85
+ }
86
+ });
87
+ this.subscribed = true;
88
+ }
89
+ /**
90
+ * Add a network intercept for specific URL patterns
91
+ */
92
+ async intercept(patterns, handler, phases = ['beforeRequestSent'], contexts) {
93
+ await this.initialize();
94
+ const urlPatterns = this.normalizePatterns(patterns);
95
+ const ctxs = contexts ?? (this.context ? [this.context] : undefined);
96
+ const result = await this.connection.send('network.addIntercept', {
97
+ phases,
98
+ urlPatterns,
99
+ ...(ctxs ? { contexts: ctxs } : {}),
100
+ });
101
+ const interceptId = result.intercept;
102
+ this.intercepts.set(interceptId, {
103
+ id: interceptId,
104
+ patterns: urlPatterns,
105
+ phases,
106
+ handler,
107
+ });
108
+ this.handlers.set(interceptId, handler);
109
+ return interceptId;
110
+ }
111
+ /**
112
+ * Mock all requests matching pattern with a fixed response
113
+ */
114
+ async mock(pattern, response) {
115
+ const handler = (req) => {
116
+ if (typeof response === 'function') {
117
+ return response(req);
118
+ }
119
+ return response;
120
+ };
121
+ return this.intercept(pattern, handler);
122
+ }
123
+ /**
124
+ * Block all requests matching pattern
125
+ */
126
+ async block(pattern) {
127
+ return this.intercept(pattern, () => ({
128
+ status: 0,
129
+ body: '',
130
+ }));
131
+ }
132
+ /**
133
+ * Modify request headers for matching patterns
134
+ */
135
+ async setExtraHeaders(headers, contexts) {
136
+ const headerList = Object.entries(headers).map(([name, value]) => ({
137
+ name,
138
+ value: { type: 'string', value },
139
+ }));
140
+ await this.connection.send('network.setExtraHeaders', {
141
+ headers: headerList,
142
+ ...(contexts ? { contexts } : {}),
143
+ });
144
+ }
145
+ /**
146
+ * Continue a blocked request (optionally with modifications)
147
+ */
148
+ async continueRequest(requestId, options) {
149
+ const params = { request: requestId };
150
+ if (options?.url)
151
+ params.url = options.url;
152
+ if (options?.method)
153
+ params.method = options.method;
154
+ if (options?.headers) {
155
+ params.headers = Object.entries(options.headers).map(([name, value]) => ({
156
+ name,
157
+ value: { type: 'string', value },
158
+ }));
159
+ }
160
+ if (options?.body) {
161
+ params.body = { type: 'string', value: options.body };
162
+ }
163
+ await this.connection.send('network.continueRequest', params);
164
+ }
165
+ /**
166
+ * Provide a custom response for a blocked request
167
+ */
168
+ async provideResponse(requestId, response) {
169
+ const params = { request: requestId };
170
+ if (response.status !== undefined)
171
+ params.statusCode = response.status;
172
+ if (response.statusText)
173
+ params.reasonPhrase = response.statusText;
174
+ if (response.headers) {
175
+ params.headers = Object.entries(response.headers).map(([name, value]) => ({
176
+ name,
177
+ value: { type: 'string', value },
178
+ }));
179
+ }
180
+ if (response.body !== undefined) {
181
+ let bodyStr;
182
+ let bodyType = 'string';
183
+ if (typeof response.body === 'string') {
184
+ bodyStr = response.body;
185
+ }
186
+ else if (Buffer.isBuffer(response.body)) {
187
+ bodyStr = response.body.toString('base64');
188
+ bodyType = 'base64';
189
+ }
190
+ else {
191
+ // Object - serialize as JSON
192
+ bodyStr = JSON.stringify(response.body);
193
+ }
194
+ params.body = { type: bodyType, value: bodyStr };
195
+ }
196
+ await this.connection.send('network.provideResponse', params);
197
+ }
198
+ /**
199
+ * Fail a blocked request
200
+ */
201
+ async failRequest(requestId) {
202
+ await this.connection.send('network.failRequest', { request: requestId });
203
+ }
204
+ /**
205
+ * Number of network requests currently in-flight (sent but no response yet).
206
+ * Used to implement `waitForNetworkIdle`.
207
+ */
208
+ get inFlightCount() {
209
+ return this.inFlightRequests.size;
210
+ }
211
+ /**
212
+ * Resolves when no network requests have been in-flight for `idleDuration` ms.
213
+ * Event-driven: subscribes to network events internally; no polling.
214
+ *
215
+ * @param idleDuration Milliseconds of network silence required (default: 500)
216
+ */
217
+ async waitForNetworkIdle(opts) {
218
+ await this.initialize();
219
+ // Validate-or-fallback to bound timer durations (defends against resource
220
+ // exhaustion from a hostile / buggy caller). CodeQL does not treat
221
+ // Math.min as a sanitizer, so we use explicit range checks.
222
+ const MAX_IDLE_MS = 60_000;
223
+ const MAX_TIMEOUT_MS = 300_000;
224
+ const reqIdle = opts?.idleDuration;
225
+ const reqTimeout = opts?.timeout;
226
+ const idleDuration = typeof reqIdle === 'number' && reqIdle >= 0 && reqIdle <= MAX_IDLE_MS ? reqIdle : 500;
227
+ const timeout = typeof reqTimeout === 'number' && reqTimeout >= 0 && reqTimeout <= MAX_TIMEOUT_MS
228
+ ? reqTimeout
229
+ : 30_000;
230
+ return new Promise((resolve, reject) => {
231
+ let idleTimer;
232
+ const timeoutTimer = setTimeout(() => {
233
+ cleanup();
234
+ reject(new Error(`waitForNetworkIdle() timed out after ${timeout}ms`));
235
+ }, timeout);
236
+ const scheduleIdle = () => {
237
+ if (idleTimer)
238
+ clearTimeout(idleTimer);
239
+ if (this.inFlightRequests.size === 0) {
240
+ idleTimer = setTimeout(() => { cleanup(); resolve(); }, idleDuration);
241
+ }
242
+ };
243
+ const onNetworkChange = () => scheduleIdle();
244
+ const cleanup = () => {
245
+ clearTimeout(timeoutTimer);
246
+ if (idleTimer)
247
+ clearTimeout(idleTimer);
248
+ this.idleListeners = this.idleListeners.filter(l => l !== onNetworkChange);
249
+ };
250
+ this.idleListeners.push(onNetworkChange);
251
+ // Kick off immediately in case already idle
252
+ scheduleIdle();
253
+ });
254
+ }
255
+ _notifyIdleListeners() {
256
+ for (const l of [...this.idleListeners])
257
+ l();
258
+ }
259
+ on(event, listener) {
260
+ if (event === 'request') {
261
+ const fn = listener;
262
+ this.requestListeners.push(fn);
263
+ // Ensure subscriptions are active so events arrive
264
+ this.initialize().catch(() => { });
265
+ return () => {
266
+ this.requestListeners = this.requestListeners.filter((l) => l !== fn);
267
+ };
268
+ }
269
+ const fn = listener;
270
+ this.responseListeners.push(fn);
271
+ this.initialize().catch(() => { });
272
+ return () => {
273
+ this.responseListeners = this.responseListeners.filter((l) => l !== fn);
274
+ };
275
+ }
276
+ /**
277
+ * Wait for the first request matching a URL glob or predicate.
278
+ * Must be registered **before** the action that triggers the request.
279
+ */
280
+ waitForRequest(pattern, opts) {
281
+ return this._waitFor('request', pattern, opts);
282
+ }
283
+ /**
284
+ * Wait for the first completed response matching a URL glob or predicate.
285
+ * Must be registered **before** the action that triggers the request.
286
+ *
287
+ * @example
288
+ * ```ts
289
+ * const [res] = await Promise.all([
290
+ * browser.waitForResponse('/api/users'),
291
+ * browser.click('#load-btn'),
292
+ * ]);
293
+ * expect(res.status).toBe(200);
294
+ * ```
295
+ */
296
+ waitForResponse(pattern, opts) {
297
+ return this._waitFor('response', pattern, opts);
298
+ }
299
+ _waitFor(kind, pattern, opts) {
300
+ const timeout = opts?.timeout ?? 30000;
301
+ const matcher = typeof pattern === 'function'
302
+ ? pattern
303
+ : (v) => this._matchesGlob(v.url, pattern);
304
+ return new Promise((resolve, reject) => {
305
+ let done = false;
306
+ const timer = setTimeout(() => {
307
+ if (done)
308
+ return;
309
+ done = true;
310
+ cleanup();
311
+ const desc = typeof pattern === 'string' ? `"${pattern}"` : '[predicate]';
312
+ reject(new Error(`waitFor${kind === 'request' ? 'Request' : 'Response'}(${desc}) timed out after ${timeout}ms`));
313
+ }, timeout);
314
+ const listener = (v) => {
315
+ if (done)
316
+ return;
317
+ if (matcher(v)) {
318
+ done = true;
319
+ cleanup();
320
+ resolve(v);
321
+ }
322
+ };
323
+ const cleanup = () => {
324
+ clearTimeout(timer);
325
+ if (kind === 'request') {
326
+ this.requestListeners = this.requestListeners.filter(l => l !== listener);
327
+ }
328
+ else {
329
+ this.responseListeners = this.responseListeners.filter(l => l !== listener);
330
+ }
331
+ };
332
+ if (kind === 'request') {
333
+ this.requestListeners.push(listener);
334
+ }
335
+ else {
336
+ this.responseListeners.push(listener);
337
+ }
338
+ // Ensure we are subscribed so events arrive
339
+ this.initialize().catch(reject);
340
+ });
341
+ }
342
+ _matchesGlob(url, pattern) {
343
+ // Re-use the same logic as normalizePatterns but do a JS-side string match
344
+ // so callers can use Playwright-style ** globs without relying on BiDi
345
+ // pattern registration.
346
+ let pathname;
347
+ try {
348
+ pathname = new URL(url).pathname;
349
+ }
350
+ catch {
351
+ pathname = url;
352
+ }
353
+ if (pattern.includes('**') || pattern.includes('*')) {
354
+ let pat = pattern;
355
+ pat = pat.replace(/^\*\*/, '');
356
+ pat = pat.replace(/\/?\*\*$/, '');
357
+ pat = pat.replace(/\/?\*$/, '');
358
+ pat = pat.replace(/\*/g, '');
359
+ if (!pat.startsWith('/'))
360
+ pat = '/' + pat;
361
+ pat = pat.replace(/\/+/g, '/');
362
+ return pathname.includes(pat);
363
+ }
364
+ // Exact string match against full URL
365
+ return url === pattern || url.startsWith(pattern);
366
+ }
367
+ /**
368
+ * Remove an intercept
369
+ */
370
+ async removeIntercept(interceptId) {
371
+ await this.connection.send('network.removeIntercept', { intercept: interceptId });
372
+ this.intercepts.delete(interceptId);
373
+ this.handlers.delete(interceptId);
374
+ }
375
+ /**
376
+ * Remove all intercepts
377
+ */
378
+ async removeAllIntercepts() {
379
+ const ids = [...this.intercepts.keys()];
380
+ for (const id of ids) {
381
+ await this.removeIntercept(id);
382
+ }
383
+ }
384
+ /**
385
+ * Set cache behavior
386
+ */
387
+ async setCacheBehavior(behavior, contexts) {
388
+ await this.connection.send('network.setCacheBehavior', {
389
+ cacheBehavior: behavior,
390
+ ...(contexts ? { contexts } : {}),
391
+ });
392
+ }
393
+ async handleBeforeRequestSent(event) {
394
+ if (!event.isBlocked || !event.intercepts?.length)
395
+ return;
396
+ const requestId = event.request.request;
397
+ // Find matching handler
398
+ for (const interceptId of event.intercepts) {
399
+ const handler = this.handlers.get(interceptId);
400
+ if (!handler)
401
+ continue;
402
+ const interceptedRequest = {
403
+ id: requestId,
404
+ url: event.request.url,
405
+ method: event.request.method,
406
+ headers: this.headersToObject(event.request.headers),
407
+ isBlocked: event.isBlocked,
408
+ context: event.context,
409
+ };
410
+ try {
411
+ const result = await handler(interceptedRequest);
412
+ if (result) {
413
+ // Provide mock response
414
+ await this.provideResponse(requestId, result);
415
+ }
416
+ else {
417
+ // Continue with original request
418
+ await this.continueRequest(requestId);
419
+ }
420
+ return;
421
+ }
422
+ catch (err) {
423
+ console.error('Error in network intercept handler:', err);
424
+ await this.continueRequest(requestId);
425
+ return;
426
+ }
427
+ }
428
+ // No handler found, continue request
429
+ await this.continueRequest(requestId);
430
+ }
431
+ normalizePatterns(patterns) {
432
+ // Handle single UrlPattern object
433
+ if (typeof patterns === 'object' && !Array.isArray(patterns) && 'type' in patterns) {
434
+ return [patterns];
435
+ }
436
+ const arr = Array.isArray(patterns) ? patterns : [patterns];
437
+ return arr.map((p) => {
438
+ if (typeof p === 'string') {
439
+ // BiDi URL patterns don't support wildcards - they use exact component matching
440
+ // Extract pathname from glob-style patterns for simple prefix matching
441
+ if (p.includes('**') || p.includes('*')) {
442
+ // Extract pathname from glob pattern
443
+ // e.g., "**/api/users" -> pathname: "/api/users"
444
+ // Note: BiDi will only match exact pathnames, not prefixes
445
+ let pathname = p;
446
+ // Remove leading **
447
+ pathname = pathname.replace(/^\*\*/, '');
448
+ // Remove trailing wildcards (can't do prefix matching in BiDi)
449
+ pathname = pathname.replace(/\/?\*\*$/, '');
450
+ pathname = pathname.replace(/\/?\*$/, '');
451
+ // Remove any remaining wildcards
452
+ pathname = pathname.replace(/\*/g, '');
453
+ if (!pathname.startsWith('/')) {
454
+ pathname = '/' + pathname;
455
+ }
456
+ // Clean up double slashes
457
+ pathname = pathname.replace(/\/+/g, '/');
458
+ return {
459
+ type: 'pattern',
460
+ pathname,
461
+ };
462
+ }
463
+ // For full URLs, use UrlPatternString
464
+ return { type: 'string', pattern: p };
465
+ }
466
+ return p;
467
+ });
468
+ }
469
+ headersToObject(headers) {
470
+ const result = {};
471
+ for (const h of headers) {
472
+ result[h.name] = h.value.value;
473
+ }
474
+ return result;
475
+ }
476
+ }
477
+ //# sourceMappingURL=network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network.js","sourceRoot":"","sources":["../../../src/lib/bidi/network.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Session State Manager
3
+ * Playwright-style session persistence - save login state, cookies, localStorage
4
+ */
5
+ import type { BiDiConnection } from './connection.js';
6
+ import type { Driver } from '../driver.js';
7
+ import type { BrowsingContext, Cookie, CookieInput, SessionState } from './types.js';
8
+ export interface StorageStateOptions {
9
+ /** Include cookies in saved state (default: true) */
10
+ includeCookies?: boolean;
11
+ /** Include localStorage in saved state (default: true) */
12
+ includeLocalStorage?: boolean;
13
+ /** Include sessionStorage in saved state (default: false) */
14
+ includeSessionStorage?: boolean;
15
+ /** Specific origins to capture (default: all) */
16
+ origins?: string[];
17
+ }
18
+ export declare class SessionStateManager {
19
+ private connection;
20
+ private driver;
21
+ private context?;
22
+ constructor(driver: Driver, connection: BiDiConnection | null, context?: BrowsingContext);
23
+ /**
24
+ * Save current session state to a file (Playwright-style)
25
+ * Captures cookies and optionally localStorage/sessionStorage
26
+ */
27
+ saveState(path: string, options?: StorageStateOptions): Promise<SessionState>;
28
+ /**
29
+ * Load session state from a file
30
+ */
31
+ loadState(path: string): Promise<void>;
32
+ /**
33
+ * Get current session state
34
+ */
35
+ getState(options?: StorageStateOptions): Promise<SessionState>;
36
+ /**
37
+ * Set session state (cookies + storage)
38
+ */
39
+ setState(state: SessionState): Promise<void>;
40
+ /**
41
+ * Get all cookies using BiDi or fallback to Classic
42
+ */
43
+ getCookies(filter?: {
44
+ domain?: string;
45
+ name?: string;
46
+ }): Promise<Cookie[]>;
47
+ /**
48
+ * Set cookies using BiDi or fallback to Classic
49
+ */
50
+ setCookies(cookies: Cookie[] | CookieInput[]): Promise<void>;
51
+ /**
52
+ * Clear all cookies
53
+ */
54
+ clearCookies(filter?: {
55
+ domain?: string;
56
+ name?: string;
57
+ }): Promise<void>;
58
+ /**
59
+ * Add a single cookie
60
+ */
61
+ addCookie(cookie: {
62
+ name: string;
63
+ value: string;
64
+ domain?: string;
65
+ path?: string;
66
+ secure?: boolean;
67
+ httpOnly?: boolean;
68
+ sameSite?: 'Strict' | 'Lax' | 'None';
69
+ expiry?: number | Date;
70
+ }): Promise<void>;
71
+ private getCookiesBiDi;
72
+ private getCookiesClassic;
73
+ private setCookiesBiDi;
74
+ private setCookiesClassic;
75
+ private normalizeCookie;
76
+ private normalizeCookieValue;
77
+ private getLocalStorage;
78
+ private getSessionStorage;
79
+ private setLocalStorage;
80
+ private setSessionStorage;
81
+ private getCurrentDomain;
82
+ }
83
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/lib/bidi/storage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EACV,eAAe,EACf,MAAM,EACN,WAAW,EACX,YAAY,EAKb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,mBAAmB;IAClC,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0DAA0D;IAC1D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,6DAA6D;IAC7D,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,UAAU,CAAwB;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAkB;gBAEtB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,cAAc,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,eAAe;IAMxF;;;OAGG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IAMvF;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5C;;OAEG;IACG,QAAQ,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;IA6BxE;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlD;;OAEG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAOhF;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQlE;;OAEG;IACG,YAAY,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9E;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;QACrC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KACxB,GAAG,OAAO,CAAC,IAAI,CAAC;YAsBH,cAAc;YAgBd,iBAAiB;YAyCjB,cAAc;YAiCd,iBAAiB;IAkB/B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;YAId,eAAe;YAuBf,iBAAiB;YAuBjB,eAAe;YAef,iBAAiB;YAcjB,gBAAgB;CAG/B"}