craftdriver 0.0.1 → 0.1.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 (55) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +69 -5
  3. package/dist/index.d.ts +2 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +3 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/bidi/connection.d.ts +62 -0
  8. package/dist/lib/bidi/connection.d.ts.map +1 -0
  9. package/dist/lib/bidi/connection.js +227 -0
  10. package/dist/lib/bidi/connection.js.map +1 -0
  11. package/dist/lib/bidi/index.d.ts +76 -0
  12. package/dist/lib/bidi/index.d.ts.map +1 -0
  13. package/dist/lib/bidi/index.js +114 -0
  14. package/dist/lib/bidi/index.js.map +1 -0
  15. package/dist/lib/bidi/logs.d.ts +104 -0
  16. package/dist/lib/bidi/logs.d.ts.map +1 -0
  17. package/dist/lib/bidi/logs.js +273 -0
  18. package/dist/lib/bidi/logs.js.map +1 -0
  19. package/dist/lib/bidi/network.d.ts +92 -0
  20. package/dist/lib/bidi/network.d.ts.map +1 -0
  21. package/dist/lib/bidi/network.js +259 -0
  22. package/dist/lib/bidi/network.js.map +1 -0
  23. package/dist/lib/bidi/storage.d.ts +81 -0
  24. package/dist/lib/bidi/storage.d.ts.map +1 -0
  25. package/dist/lib/bidi/storage.js +292 -0
  26. package/dist/lib/bidi/storage.js.map +1 -0
  27. package/dist/lib/bidi/types.d.ts +302 -0
  28. package/dist/lib/bidi/types.d.ts.map +1 -0
  29. package/dist/lib/bidi/types.js +6 -0
  30. package/dist/lib/bidi/types.js.map +1 -0
  31. package/dist/lib/browser.d.ts +179 -2
  32. package/dist/lib/browser.d.ts.map +1 -1
  33. package/dist/lib/browser.js +220 -11
  34. package/dist/lib/browser.js.map +1 -1
  35. package/dist/lib/driver.d.ts +2 -0
  36. package/dist/lib/driver.d.ts.map +1 -1
  37. package/dist/lib/driver.js +9 -1
  38. package/dist/lib/driver.js.map +1 -1
  39. package/dist/lib/elementHandle.d.ts +23 -7
  40. package/dist/lib/elementHandle.d.ts.map +1 -1
  41. package/dist/lib/elementHandle.js +84 -9
  42. package/dist/lib/elementHandle.js.map +1 -1
  43. package/dist/lib/expect.d.ts +45 -0
  44. package/dist/lib/expect.d.ts.map +1 -1
  45. package/dist/lib/expect.js +299 -11
  46. package/dist/lib/expect.js.map +1 -1
  47. package/dist/lib/service.d.ts +2 -1
  48. package/dist/lib/service.d.ts.map +1 -1
  49. package/dist/lib/service.js +23 -8
  50. package/dist/lib/service.js.map +1 -1
  51. package/dist/lib/webelement.d.ts +12 -0
  52. package/dist/lib/webelement.d.ts.map +1 -1
  53. package/dist/lib/webelement.js +62 -0
  54. package/dist/lib/webelement.js.map +1 -1
  55. package/package.json +7 -2
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) YEAR FULL NAME
3
+ Copyright (c) 2026 Dimitar Topuzov
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -6,8 +6,6 @@ Think of it as a modern take on Selenium with automatic waits and ergonomic API,
6
6
 
7
7
  ## Getting started
8
8
 
9
- Install from npm (package coming soon):
10
-
11
9
  ```bash
12
10
  npm install craftdriver
13
11
  ```
@@ -19,14 +17,80 @@ import { Browser } from 'craftdriver';
19
17
 
20
18
  const browser = await Browser.launch({ browserName: 'chrome' });
21
19
  await browser.navigateTo('http://127.0.0.1:8080/login.html');
22
- await browser.type('#username', 'testuser');
23
- await browser.type('#password', 'secret');
20
+ await browser.fill('#username', 'testuser');
21
+ await browser.fill('#password', 'secret');
24
22
  await browser.click('#submit');
25
23
  await browser.expect('#result').toHaveText('Welcome testuser');
26
24
  await browser.quit();
27
25
  ```
28
26
 
29
- See [DOCUMENTATION.md](DOCUMENTATION.md) for more details.
27
+ Mobile emulation:
28
+
29
+ ```ts
30
+ const browser = await Browser.launch({
31
+ browserName: 'chrome',
32
+ mobileEmulation: 'iPhone 14',
33
+ });
34
+ ```
35
+
36
+ Network mocking:
37
+
38
+ ```ts
39
+ const browser = await Browser.launch({
40
+ browserName: 'chrome',
41
+ enableBiDi: true,
42
+ });
43
+
44
+ await browser.network.mock('**/api/users', {
45
+ status: 200,
46
+ body: { users: [] },
47
+ });
48
+ ```
49
+
50
+ Session persistence:
51
+
52
+ ```ts
53
+ await browser.saveState('./session.json');
54
+
55
+ // Later: restore with storageState option
56
+ const browser2 = await Browser.launch({
57
+ browserName: 'chrome',
58
+ storageState: './session.json',
59
+ });
60
+ ```
61
+
62
+ ## Feature Overview
63
+
64
+ ### Core Features
65
+
66
+ - **Simple API** - Easy to use, works as expected
67
+ - **TypeScript-first** - Full type definitions included
68
+ - **Flexible locators** - CSS, XPath, text, role, and semantic selectors that stay stable
69
+ - **Bulletproof interactions** - Reliable element, mouse, and keyboard control
70
+ - **Auto-waiting** - Smart waits built into all actions
71
+ - **Real browsers** - Test on actual Chrome, Edge, and other W3C-compliant browsers
72
+ - **Mobile emulation** - Test responsive designs with device presets (iPhone, Pixel, iPad)
73
+
74
+ ### Advanced Features (BiDi)
75
+
76
+ - **Session persistence** - Save/load cookies and localStorage
77
+ - **Network mocking** - Intercept and mock HTTP requests
78
+ - **Console/Error logs** - Capture browser console messages
79
+
80
+ ## Documentation
81
+
82
+ | Guide | Description |
83
+ | -------------------------------------------------- | --------------------------------------------------- |
84
+ | [Getting Started](./docs/getting-started.md) | Installation, prerequisites, and first test |
85
+ | [Browser API](./docs/browser-api.md) | Core browser control: navigation, clicks, forms |
86
+ | [Element API](./docs/element-api.md) | ElementHandle methods for interacting with elements |
87
+ | [Selectors](./docs/selectors.md) | CSS, XPath, and semantic locators (By helpers) |
88
+ | [Assertions](./docs/assertions.md) | Built-in expect API for testing |
89
+ | [Keyboard & Mouse](./docs/keyboard-mouse.md) | Low-level input simulation |
90
+ | [Session Management](./docs/session-management.md) | Cookies, localStorage, and session persistence |
91
+ | [Screenshots](./docs/screenshots.md) | Capturing page and element screenshots |
92
+ | [Mobile Emulation](./docs/mobile-emulation.md) | Test with mobile device viewports and touch events |
93
+ | [BiDi Features](./docs/bidi-features.md) | Network mocking and console log capture |
30
94
 
31
95
  ## Contributing
32
96
 
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- export { Browser, type LaunchOptions } from './lib/browser.js';
1
+ export { Browser, devices, type LaunchOptions, type MobileEmulation, type DeviceMetrics, type DeviceName, } from './lib/browser.js';
2
2
  export { Key } from './lib/keys.js';
3
3
  export { By } from './lib/by.js';
4
+ export { BiDiSession, BiDiConnection, NetworkInterceptor, LogMonitor, SessionStateManager, type SessionState, type StorageStateOptions, type MockResponse, type InterceptedRequest, type ConsoleMessage, type JavaScriptError, type LogMessage, } from './lib/bidi/index.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,OAAO,EACP,OAAO,EACP,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAGjC,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  // Public entrypoint: expose the simplified Browser API only
2
- export { Browser } from './lib/browser.js';
2
+ export { Browser, devices, } from './lib/browser.js';
3
3
  export { Key } from './lib/keys.js';
4
4
  export { By } from './lib/by.js';
5
+ // BiDi features - network interception, logging, session state
6
+ export { BiDiSession, BiDiConnection, NetworkInterceptor, LogMonitor, SessionStateManager, } from './lib/bidi/index.js';
5
7
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EAAE,OAAO,EAAsB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,OAAO,EACL,OAAO,EACP,OAAO,GAKR,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,+DAA+D;AAC/D,OAAO,EACL,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,UAAU,EACV,mBAAmB,GAQpB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * WebDriver BiDi WebSocket connection manager
3
+ * Handles bidirectional communication with the browser
4
+ */
5
+ export type EventHandler = (params: Record<string, unknown>) => void;
6
+ export interface ConnectionOptions {
7
+ /** Connection timeout in ms (default: 30000) */
8
+ timeout?: number;
9
+ /** Auto-reconnect on disconnect */
10
+ autoReconnect?: boolean;
11
+ }
12
+ export declare class BiDiConnection {
13
+ private ws;
14
+ private messageId;
15
+ private pending;
16
+ private eventHandlers;
17
+ private connected;
18
+ private wsUrl;
19
+ private options;
20
+ constructor(options?: ConnectionOptions);
21
+ /**
22
+ * Connect to WebDriver BiDi WebSocket endpoint
23
+ */
24
+ connect(wsUrl: string): Promise<void>;
25
+ /**
26
+ * Check if connected to BiDi endpoint
27
+ */
28
+ isConnected(): boolean;
29
+ /**
30
+ * Send a BiDi command and wait for response
31
+ */
32
+ send<T = unknown>(method: string, params?: Record<string, unknown>): Promise<T>;
33
+ /**
34
+ * Subscribe to BiDi events
35
+ */
36
+ subscribe(events: string[], contexts?: string[]): Promise<void>;
37
+ /**
38
+ * Unsubscribe from BiDi events
39
+ */
40
+ unsubscribe(events: string[], contexts?: string[]): Promise<void>;
41
+ /**
42
+ * Add event listener for specific BiDi event
43
+ */
44
+ on(event: string, handler: EventHandler): () => void;
45
+ /**
46
+ * Remove event listener
47
+ */
48
+ off(event: string, handler: EventHandler): void;
49
+ /**
50
+ * Wait for a specific event (one-time)
51
+ */
52
+ once<T = Record<string, unknown>>(event: string, predicate?: (params: Record<string, unknown>) => boolean, timeout?: number): Promise<T>;
53
+ /**
54
+ * Close the connection
55
+ */
56
+ close(): Promise<void>;
57
+ private handleMessage;
58
+ private handleResponse;
59
+ private handleEvent;
60
+ private rejectAllPending;
61
+ }
62
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/lib/bidi/connection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;AAErE,MAAM,WAAW,iBAAiB;IAChC,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAGX;IACJ,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,OAAO,CAAoB;gBAEvB,OAAO,GAAE,iBAAsB;IAO3C;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C3C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IA6BzF;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvE;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI;IAYpD;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAI/C;;OAEG;IACH,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,EACxD,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,CAAC,CAAC;IAmBb;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,WAAW;IAyBnB,OAAO,CAAC,gBAAgB;CAMzB"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * WebDriver BiDi WebSocket connection manager
3
+ * Handles bidirectional communication with the browser
4
+ */
5
+ import { WebSocket } from 'ws';
6
+ export class BiDiConnection {
7
+ ws = null;
8
+ messageId = 0;
9
+ pending = new Map();
10
+ eventHandlers = new Map();
11
+ connected = false;
12
+ wsUrl = '';
13
+ options;
14
+ constructor(options = {}) {
15
+ this.options = {
16
+ timeout: options.timeout ?? 30000,
17
+ autoReconnect: options.autoReconnect ?? false,
18
+ };
19
+ }
20
+ /**
21
+ * Connect to WebDriver BiDi WebSocket endpoint
22
+ */
23
+ async connect(wsUrl) {
24
+ if (this.connected && this.ws) {
25
+ return;
26
+ }
27
+ this.wsUrl = wsUrl;
28
+ return new Promise((resolve, reject) => {
29
+ const timeout = setTimeout(() => {
30
+ reject(new Error(`BiDi connection timeout after ${this.options.timeout}ms`));
31
+ }, this.options.timeout);
32
+ try {
33
+ this.ws = new WebSocket(wsUrl);
34
+ this.ws.on('open', () => {
35
+ clearTimeout(timeout);
36
+ this.connected = true;
37
+ resolve();
38
+ });
39
+ this.ws.on('message', (data) => {
40
+ this.handleMessage(data.toString());
41
+ });
42
+ this.ws.on('close', () => {
43
+ this.connected = false;
44
+ this.rejectAllPending(new Error('WebSocket connection closed'));
45
+ if (this.options.autoReconnect && this.wsUrl) {
46
+ setTimeout(() => this.connect(this.wsUrl).catch(() => { }), 1000);
47
+ }
48
+ });
49
+ this.ws.on('error', (err) => {
50
+ clearTimeout(timeout);
51
+ this.connected = false;
52
+ reject(err);
53
+ });
54
+ }
55
+ catch (err) {
56
+ clearTimeout(timeout);
57
+ reject(err);
58
+ }
59
+ });
60
+ }
61
+ /**
62
+ * Check if connected to BiDi endpoint
63
+ */
64
+ isConnected() {
65
+ return this.connected && this.ws?.readyState === WebSocket.OPEN;
66
+ }
67
+ /**
68
+ * Send a BiDi command and wait for response
69
+ */
70
+ async send(method, params = {}) {
71
+ if (!this.isConnected()) {
72
+ throw new Error('BiDi connection not established');
73
+ }
74
+ const id = ++this.messageId;
75
+ const command = { id, method, params };
76
+ return new Promise((resolve, reject) => {
77
+ const timeout = setTimeout(() => {
78
+ this.pending.delete(id);
79
+ reject(new Error(`BiDi command timeout: ${method}`));
80
+ }, this.options.timeout);
81
+ this.pending.set(id, {
82
+ resolve: (value) => {
83
+ clearTimeout(timeout);
84
+ resolve(value);
85
+ },
86
+ reject: (err) => {
87
+ clearTimeout(timeout);
88
+ reject(err);
89
+ },
90
+ });
91
+ this.ws.send(JSON.stringify(command));
92
+ });
93
+ }
94
+ /**
95
+ * Subscribe to BiDi events
96
+ */
97
+ async subscribe(events, contexts) {
98
+ const params = { events };
99
+ if (contexts?.length) {
100
+ params.contexts = contexts;
101
+ }
102
+ await this.send('session.subscribe', params);
103
+ }
104
+ /**
105
+ * Unsubscribe from BiDi events
106
+ */
107
+ async unsubscribe(events, contexts) {
108
+ const params = { events };
109
+ if (contexts?.length) {
110
+ params.contexts = contexts;
111
+ }
112
+ await this.send('session.unsubscribe', params);
113
+ }
114
+ /**
115
+ * Add event listener for specific BiDi event
116
+ */
117
+ on(event, handler) {
118
+ if (!this.eventHandlers.has(event)) {
119
+ this.eventHandlers.set(event, new Set());
120
+ }
121
+ this.eventHandlers.get(event).add(handler);
122
+ // Return unsubscribe function
123
+ return () => {
124
+ this.eventHandlers.get(event)?.delete(handler);
125
+ };
126
+ }
127
+ /**
128
+ * Remove event listener
129
+ */
130
+ off(event, handler) {
131
+ this.eventHandlers.get(event)?.delete(handler);
132
+ }
133
+ /**
134
+ * Wait for a specific event (one-time)
135
+ */
136
+ once(event, predicate, timeout) {
137
+ return new Promise((resolve, reject) => {
138
+ const timeoutId = timeout
139
+ ? setTimeout(() => {
140
+ unsubscribe();
141
+ reject(new Error(`Timeout waiting for event: ${event}`));
142
+ }, timeout)
143
+ : null;
144
+ const unsubscribe = this.on(event, (params) => {
145
+ if (!predicate || predicate(params)) {
146
+ if (timeoutId)
147
+ clearTimeout(timeoutId);
148
+ unsubscribe();
149
+ resolve(params);
150
+ }
151
+ });
152
+ });
153
+ }
154
+ /**
155
+ * Close the connection
156
+ */
157
+ async close() {
158
+ if (this.ws) {
159
+ this.ws.close();
160
+ this.ws = null;
161
+ this.connected = false;
162
+ this.rejectAllPending(new Error('Connection closed'));
163
+ }
164
+ }
165
+ handleMessage(data) {
166
+ let message;
167
+ try {
168
+ message = JSON.parse(data);
169
+ }
170
+ catch {
171
+ console.error('Failed to parse BiDi message:', data);
172
+ return;
173
+ }
174
+ if ('id' in message && message.id !== undefined) {
175
+ // Command response
176
+ this.handleResponse(message);
177
+ }
178
+ else if (message.type === 'event') {
179
+ // Event
180
+ this.handleEvent(message);
181
+ }
182
+ }
183
+ handleResponse(response) {
184
+ const pending = this.pending.get(response.id);
185
+ if (!pending)
186
+ return;
187
+ this.pending.delete(response.id);
188
+ if (response.type === 'error') {
189
+ pending.reject(new Error(`BiDi error [${response.error}]: ${response.message}`));
190
+ }
191
+ else {
192
+ pending.resolve(response.result);
193
+ }
194
+ }
195
+ handleEvent(event) {
196
+ const handlers = this.eventHandlers.get(event.method);
197
+ if (handlers) {
198
+ for (const handler of handlers) {
199
+ try {
200
+ handler(event.params);
201
+ }
202
+ catch (err) {
203
+ console.error(`Error in BiDi event handler for ${event.method}:`, err);
204
+ }
205
+ }
206
+ }
207
+ // Also emit to wildcard handlers
208
+ const wildcardHandlers = this.eventHandlers.get('*');
209
+ if (wildcardHandlers) {
210
+ for (const handler of wildcardHandlers) {
211
+ try {
212
+ handler({ method: event.method, ...event.params });
213
+ }
214
+ catch (err) {
215
+ console.error('Error in BiDi wildcard event handler:', err);
216
+ }
217
+ }
218
+ }
219
+ }
220
+ rejectAllPending(error) {
221
+ for (const [, pending] of this.pending) {
222
+ pending.reject(error);
223
+ }
224
+ this.pending.clear();
225
+ }
226
+ }
227
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/lib/bidi/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * BiDi Session Manager
3
+ * Central manager for BiDi features with Classic WebDriver fallback
4
+ */
5
+ import { BiDiConnection } from './connection.js';
6
+ import { NetworkInterceptor } from './network.js';
7
+ import { LogMonitor } from './logs.js';
8
+ import { SessionStateManager, type StorageStateOptions } from './storage.js';
9
+ import type { Driver } from '../driver.js';
10
+ import type { SessionState } from './types.js';
11
+ export interface BiDiSessionOptions {
12
+ /** WebSocket URL for BiDi connection */
13
+ wsUrl?: string;
14
+ /** Auto-initialize BiDi features */
15
+ autoInitialize?: boolean;
16
+ }
17
+ export declare class BiDiSession {
18
+ private connection;
19
+ private driver;
20
+ private context?;
21
+ private _network?;
22
+ private _logs?;
23
+ private _storage?;
24
+ private initialized;
25
+ constructor(driver: Driver, options?: BiDiSessionOptions);
26
+ /**
27
+ * Connect to BiDi WebSocket endpoint
28
+ */
29
+ connect(wsUrl: string): Promise<void>;
30
+ /**
31
+ * Check if BiDi is connected
32
+ */
33
+ isConnected(): boolean;
34
+ /**
35
+ * Get the BiDi connection (for advanced usage)
36
+ */
37
+ getConnection(): BiDiConnection;
38
+ /**
39
+ * Network interception API
40
+ */
41
+ get network(): NetworkInterceptor;
42
+ /**
43
+ * Log monitoring API
44
+ */
45
+ get logs(): LogMonitor;
46
+ /**
47
+ * Session state/storage API
48
+ */
49
+ get storage(): SessionStateManager;
50
+ /**
51
+ * Save session state to file (cookies + localStorage)
52
+ */
53
+ saveState(path: string, options?: StorageStateOptions): Promise<SessionState>;
54
+ /**
55
+ * Load session state from file
56
+ */
57
+ loadState(path: string): Promise<void>;
58
+ /**
59
+ * Subscribe to BiDi events
60
+ */
61
+ subscribe(events: string[]): Promise<void>;
62
+ /**
63
+ * Add event listener
64
+ */
65
+ on(event: string, handler: (params: Record<string, unknown>) => void): () => void;
66
+ /**
67
+ * Close BiDi connection
68
+ */
69
+ close(): Promise<void>;
70
+ }
71
+ export { BiDiConnection } from './connection.js';
72
+ export { NetworkInterceptor, type MockResponse, type InterceptedRequest } from './network.js';
73
+ export { LogMonitor, type ConsoleMessage, type JavaScriptError, type LogMessage } from './logs.js';
74
+ export { SessionStateManager, type StorageStateOptions } from './storage.js';
75
+ export * from './types.js';
76
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/bidi/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAmB,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,UAAU,CAAiB;IACnC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAkB;IAClC,OAAO,CAAC,QAAQ,CAAC,CAAqB;IACtC,OAAO,CAAC,KAAK,CAAC,CAAa;IAC3B,OAAO,CAAC,QAAQ,CAAC,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB;IAK5D;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,aAAa,IAAI,cAAc;IAI/B;;OAEG;IACH,IAAI,OAAO,IAAI,kBAAkB,CAKhC;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,UAAU,CAKrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,mBAAmB,CASjC;IAID;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAInF;;OAEG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAI7B;AAGD,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAC7E,cAAc,YAAY,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * BiDi Session Manager
3
+ * Central manager for BiDi features with Classic WebDriver fallback
4
+ */
5
+ import { BiDiConnection } from './connection.js';
6
+ import { NetworkInterceptor } from './network.js';
7
+ import { LogMonitor } from './logs.js';
8
+ import { SessionStateManager } from './storage.js';
9
+ export class BiDiSession {
10
+ connection;
11
+ driver;
12
+ context;
13
+ _network;
14
+ _logs;
15
+ _storage;
16
+ initialized = false;
17
+ constructor(driver, options = {}) {
18
+ this.driver = driver;
19
+ this.connection = new BiDiConnection();
20
+ }
21
+ /**
22
+ * Connect to BiDi WebSocket endpoint
23
+ */
24
+ async connect(wsUrl) {
25
+ await this.connection.connect(wsUrl);
26
+ // Get the current browsing context
27
+ const result = await this.connection.send('browsingContext.getTree', {});
28
+ if (result.contexts?.[0]) {
29
+ this.context = result.contexts[0].context;
30
+ }
31
+ // Eagerly initialize log monitoring so console/error capture starts immediately
32
+ this._logs = new LogMonitor(this.connection, this.context);
33
+ await this._logs.initialize();
34
+ this.initialized = true;
35
+ }
36
+ /**
37
+ * Check if BiDi is connected
38
+ */
39
+ isConnected() {
40
+ return this.connection.isConnected();
41
+ }
42
+ /**
43
+ * Get the BiDi connection (for advanced usage)
44
+ */
45
+ getConnection() {
46
+ return this.connection;
47
+ }
48
+ /**
49
+ * Network interception API
50
+ */
51
+ get network() {
52
+ if (!this._network) {
53
+ this._network = new NetworkInterceptor(this.connection, this.context);
54
+ }
55
+ return this._network;
56
+ }
57
+ /**
58
+ * Log monitoring API
59
+ */
60
+ get logs() {
61
+ if (!this._logs) {
62
+ this._logs = new LogMonitor(this.connection, this.context);
63
+ }
64
+ return this._logs;
65
+ }
66
+ /**
67
+ * Session state/storage API
68
+ */
69
+ get storage() {
70
+ if (!this._storage) {
71
+ this._storage = new SessionStateManager(this.driver, this.isConnected() ? this.connection : null, this.context);
72
+ }
73
+ return this._storage;
74
+ }
75
+ // === Convenience methods ===
76
+ /**
77
+ * Save session state to file (cookies + localStorage)
78
+ */
79
+ async saveState(path, options) {
80
+ return this.storage.saveState(path, options);
81
+ }
82
+ /**
83
+ * Load session state from file
84
+ */
85
+ async loadState(path) {
86
+ return this.storage.loadState(path);
87
+ }
88
+ /**
89
+ * Subscribe to BiDi events
90
+ */
91
+ async subscribe(events) {
92
+ await this.connection.subscribe(events);
93
+ }
94
+ /**
95
+ * Add event listener
96
+ */
97
+ on(event, handler) {
98
+ return this.connection.on(event, handler);
99
+ }
100
+ /**
101
+ * Close BiDi connection
102
+ */
103
+ async close() {
104
+ await this.connection.close();
105
+ this.initialized = false;
106
+ }
107
+ }
108
+ // Export all BiDi modules
109
+ export { BiDiConnection } from './connection.js';
110
+ export { NetworkInterceptor } from './network.js';
111
+ export { LogMonitor } from './logs.js';
112
+ export { SessionStateManager } from './storage.js';
113
+ export * from './types.js';
114
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/bidi/index.ts"],"names":[],"mappings":"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"}