@testivai/witness-cdp 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.

Potentially problematic release.


This version of @testivai/witness-cdp might be problematic. Click here for more details.

Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +405 -0
  3. package/dist/__tests__/setup.d.ts +4 -0
  4. package/dist/__tests__/setup.d.ts.map +1 -0
  5. package/dist/__tests__/setup.js +24 -0
  6. package/dist/__tests__/setup.js.map +1 -0
  7. package/dist/cdp/binding.d.ts +44 -0
  8. package/dist/cdp/binding.d.ts.map +1 -0
  9. package/dist/cdp/binding.js +183 -0
  10. package/dist/cdp/binding.js.map +1 -0
  11. package/dist/cdp/capture.d.ts +42 -0
  12. package/dist/cdp/capture.d.ts.map +1 -0
  13. package/dist/cdp/capture.js +235 -0
  14. package/dist/cdp/capture.js.map +1 -0
  15. package/dist/cdp/client.d.ts +63 -0
  16. package/dist/cdp/client.d.ts.map +1 -0
  17. package/dist/cdp/client.js +279 -0
  18. package/dist/cdp/client.js.map +1 -0
  19. package/dist/cdp/discovery.d.ts +33 -0
  20. package/dist/cdp/discovery.d.ts.map +1 -0
  21. package/dist/cdp/discovery.js +157 -0
  22. package/dist/cdp/discovery.js.map +1 -0
  23. package/dist/commands/auth.d.ts +3 -0
  24. package/dist/commands/auth.d.ts.map +1 -0
  25. package/dist/commands/auth.js +122 -0
  26. package/dist/commands/auth.js.map +1 -0
  27. package/dist/commands/capture.d.ts +3 -0
  28. package/dist/commands/capture.d.ts.map +1 -0
  29. package/dist/commands/capture.js +143 -0
  30. package/dist/commands/capture.js.map +1 -0
  31. package/dist/commands/init.d.ts +3 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +140 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/run.d.ts +3 -0
  36. package/dist/commands/run.d.ts.map +1 -0
  37. package/dist/commands/run.js +307 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/index.d.ts +20 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +77 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/types.d.ts +244 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +7 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/utils/file-naming.d.ts +31 -0
  48. package/dist/utils/file-naming.d.ts.map +1 -0
  49. package/dist/utils/file-naming.js +137 -0
  50. package/dist/utils/file-naming.js.map +1 -0
  51. package/dist/utils/framework-detect.d.ts +31 -0
  52. package/dist/utils/framework-detect.d.ts.map +1 -0
  53. package/dist/utils/framework-detect.js +379 -0
  54. package/dist/utils/framework-detect.js.map +1 -0
  55. package/dist/utils/logger.d.ts +29 -0
  56. package/dist/utils/logger.d.ts.map +1 -0
  57. package/dist/utils/logger.js +114 -0
  58. package/dist/utils/logger.js.map +1 -0
  59. package/dist/utils/process.d.ts +61 -0
  60. package/dist/utils/process.d.ts.map +1 -0
  61. package/dist/utils/process.js +208 -0
  62. package/dist/utils/process.js.map +1 -0
  63. package/package.json +64 -0
@@ -0,0 +1,42 @@
1
+ import { CdpClient } from './client';
2
+ import { SnapshotPayload } from '../types';
3
+ /**
4
+ * CDP Capture functionality
5
+ */
6
+ export declare class CdpCapture {
7
+ private client;
8
+ constructor(client: CdpClient);
9
+ /**
10
+ * Capture a complete snapshot (screenshot + DOM + layout)
11
+ */
12
+ captureSnapshot(snapshotName: string, testName?: string): Promise<SnapshotPayload>;
13
+ /**
14
+ * Capture screenshot as base64
15
+ */
16
+ private captureScreenshot;
17
+ /**
18
+ * Capture DOM content
19
+ */
20
+ private captureDom;
21
+ /**
22
+ * Capture layout information
23
+ */
24
+ private captureLayout;
25
+ /**
26
+ * Capture performance timings
27
+ */
28
+ private capturePerformanceTimings;
29
+ /**
30
+ * Get current page URL
31
+ */
32
+ private getCurrentUrl;
33
+ /**
34
+ * Get viewport dimensions
35
+ */
36
+ private getViewport;
37
+ /**
38
+ * Capture Lighthouse audit (if available)
39
+ */
40
+ captureLighthouse(): Promise<any | undefined>;
41
+ }
42
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/cdp/capture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,eAAe,EAAkC,MAAM,UAAU,CAAC;AAG3E;;GAEG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,SAAS;IAErC;;OAEG;IACG,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuCxF;;OAEG;YACW,iBAAiB;IAmB/B;;OAEG;YACW,UAAU;IA2BxB;;OAEG;YACW,aAAa;IAkC3B;;OAEG;YACW,yBAAyB;IAyDvC;;OAEG;YACW,aAAa;IAc3B;;OAEG;YACW,WAAW;IAqBzB;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;CAMpD"}
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CdpCapture = void 0;
4
+ const logger_1 = require("../utils/logger");
5
+ const common_1 = require("@testivai/common");
6
+ /**
7
+ * CDP Capture functionality
8
+ */
9
+ class CdpCapture {
10
+ constructor(client) {
11
+ this.client = client;
12
+ }
13
+ /**
14
+ * Capture a complete snapshot (screenshot + DOM + layout)
15
+ */
16
+ async captureSnapshot(snapshotName, testName) {
17
+ const timestamp = Date.now();
18
+ logger_1.logger.capture(snapshotName);
19
+ // Get current URL
20
+ const url = await this.getCurrentUrl();
21
+ // Get viewport information
22
+ const viewport = await this.getViewport();
23
+ // Capture screenshot
24
+ const screenshotData = await this.captureScreenshot();
25
+ // Capture DOM
26
+ const dom = await this.captureDom();
27
+ // Capture layout
28
+ const layout = await this.captureLayout();
29
+ // Capture performance timings (optional)
30
+ const performanceTimings = await this.capturePerformanceTimings();
31
+ const snapshot = {
32
+ dom,
33
+ layout,
34
+ timestamp,
35
+ testName: testName || 'test',
36
+ snapshotName,
37
+ url,
38
+ viewport,
39
+ screenshotData,
40
+ performanceTimings,
41
+ };
42
+ logger_1.logger.debug(`Captured snapshot: ${snapshotName}`);
43
+ return snapshot;
44
+ }
45
+ /**
46
+ * Capture screenshot as base64
47
+ */
48
+ async captureScreenshot() {
49
+ try {
50
+ const result = await this.client.send('Page.captureScreenshot', {
51
+ format: 'png',
52
+ fromSurface: true,
53
+ captureBeyondViewport: true,
54
+ });
55
+ if (!result.data) {
56
+ throw new Error('No screenshot data received');
57
+ }
58
+ return result.data;
59
+ }
60
+ catch (error) {
61
+ logger_1.logger.error('Failed to capture screenshot:', error);
62
+ throw error;
63
+ }
64
+ }
65
+ /**
66
+ * Capture DOM content
67
+ */
68
+ async captureDom() {
69
+ try {
70
+ // Get document root
71
+ const { root } = await this.client.send('DOM.getDocument');
72
+ // Get outer HTML of the document
73
+ const result = await this.client.send('DOM.getOuterHTML', {
74
+ nodeId: root.nodeId,
75
+ });
76
+ if (!result.outerHTML) {
77
+ throw new Error('No DOM content received');
78
+ }
79
+ // Try to compress if large
80
+ const compressionResult = await common_1.compressionHelper.compress(result.outerHTML);
81
+ const html = typeof compressionResult.data === 'string'
82
+ ? compressionResult.data
83
+ : compressionResult.data.toString('utf-8');
84
+ return { html };
85
+ }
86
+ catch (error) {
87
+ logger_1.logger.error('Failed to capture DOM:', error);
88
+ throw error;
89
+ }
90
+ }
91
+ /**
92
+ * Capture layout information
93
+ */
94
+ async captureLayout() {
95
+ try {
96
+ // Get layout of the body element using getBoundingClientRect
97
+ const result = await this.client.send('Runtime.evaluate', {
98
+ expression: `
99
+ (function() {
100
+ const body = document.body;
101
+ const rect = body.getBoundingClientRect();
102
+ return {
103
+ x: rect.x,
104
+ y: rect.y,
105
+ width: rect.width,
106
+ height: rect.height,
107
+ top: rect.top,
108
+ left: rect.left,
109
+ right: rect.right,
110
+ bottom: rect.bottom
111
+ };
112
+ })()
113
+ `,
114
+ returnByValue: true,
115
+ });
116
+ if (!result.result.value) {
117
+ throw new Error('No layout data received');
118
+ }
119
+ return result.result.value;
120
+ }
121
+ catch (error) {
122
+ logger_1.logger.error('Failed to capture layout:', error);
123
+ throw error;
124
+ }
125
+ }
126
+ /**
127
+ * Capture performance timings
128
+ */
129
+ async capturePerformanceTimings() {
130
+ try {
131
+ const result = await this.client.send('Runtime.evaluate', {
132
+ expression: `
133
+ (function() {
134
+ const timing = performance.timing;
135
+ const navigation = performance.navigation;
136
+
137
+ // Calculate metrics
138
+ const metrics = {
139
+ navigationStart: timing.navigationStart,
140
+ domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,
141
+ loadComplete: timing.loadEventEnd - timing.navigationStart,
142
+ };
143
+
144
+ // Try to get Web Vitals if available
145
+ if (window.performance && window.performance.getEntriesByType) {
146
+ const paintEntries = performance.getEntriesByType('paint');
147
+ if (paintEntries) {
148
+ paintEntries.forEach((entry) => {
149
+ if (entry.name === 'first-contentful-paint') {
150
+ metrics.firstContentfulPaint = entry.startTime;
151
+ }
152
+ });
153
+ }
154
+
155
+ const lcpEntries = performance.getEntriesByType('largest-contentful-paint');
156
+ if (lcpEntries && lcpEntries.length > 0) {
157
+ metrics.largestContentfulPaint = lcpEntries[lcpEntries.length - 1].startTime;
158
+ }
159
+
160
+ const clsEntries = performance.getEntriesByType('layout-shift');
161
+ if (clsEntries) {
162
+ let clsValue = 0;
163
+ clsEntries.forEach((entry) => {
164
+ if (!entry.hadRecentInput) {
165
+ clsValue += entry.value;
166
+ }
167
+ });
168
+ metrics.cumulativeLayoutShift = clsValue;
169
+ }
170
+ }
171
+
172
+ return metrics;
173
+ })()
174
+ `,
175
+ returnByValue: true,
176
+ });
177
+ return result.result.value;
178
+ }
179
+ catch (error) {
180
+ logger_1.logger.debug('Failed to capture performance timings:', error);
181
+ // Performance capture is optional, so don't throw
182
+ return undefined;
183
+ }
184
+ }
185
+ /**
186
+ * Get current page URL
187
+ */
188
+ async getCurrentUrl() {
189
+ try {
190
+ const result = await this.client.send('Runtime.evaluate', {
191
+ expression: 'window.location.href',
192
+ returnByValue: true,
193
+ });
194
+ return result.result.value || 'about:blank';
195
+ }
196
+ catch (error) {
197
+ logger_1.logger.debug('Failed to get current URL:', error);
198
+ return 'unknown';
199
+ }
200
+ }
201
+ /**
202
+ * Get viewport dimensions
203
+ */
204
+ async getViewport() {
205
+ try {
206
+ const result = await this.client.send('Runtime.evaluate', {
207
+ expression: `
208
+ (function() {
209
+ return {
210
+ width: window.innerWidth,
211
+ height: window.innerHeight
212
+ };
213
+ })()
214
+ `,
215
+ returnByValue: true,
216
+ });
217
+ return result.result.value || { width: 0, height: 0 };
218
+ }
219
+ catch (error) {
220
+ logger_1.logger.debug('Failed to get viewport:', error);
221
+ return { width: 0, height: 0 };
222
+ }
223
+ }
224
+ /**
225
+ * Capture Lighthouse audit (if available)
226
+ */
227
+ async captureLighthouse() {
228
+ // Lighthouse capture is not implemented in CDP SDK
229
+ // This would require additional setup and dependencies
230
+ // Returning undefined for now
231
+ return undefined;
232
+ }
233
+ }
234
+ exports.CdpCapture = CdpCapture;
235
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/cdp/capture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { Client } from 'chrome-remote-interface';
2
+ import { EventEmitter } from 'events';
3
+ import { CdpConnectionInfo } from '../types';
4
+ /**
5
+ * Chrome DevTools Protocol client wrapper
6
+ */
7
+ export declare class CdpClient extends EventEmitter {
8
+ private client;
9
+ private connectionInfo;
10
+ private isConnected;
11
+ private reconnectAttempts;
12
+ private maxReconnectAttempts;
13
+ private reconnectDelay;
14
+ /**
15
+ * Connect to Chrome DevTools Protocol
16
+ */
17
+ connect(port?: number): Promise<void>;
18
+ /**
19
+ * Disconnect from CDP
20
+ */
21
+ disconnect(): Promise<void>;
22
+ /**
23
+ * Check if connected
24
+ */
25
+ isClientConnected(): boolean;
26
+ /**
27
+ * Get the raw CDP client
28
+ */
29
+ getClient(): Client | null;
30
+ /**
31
+ * Get connection info
32
+ */
33
+ getConnectionInfo(): CdpConnectionInfo | null;
34
+ /**
35
+ * Enable a domain
36
+ */
37
+ enableDomain(domain: string): Promise<void>;
38
+ /**
39
+ * Send a command to CDP
40
+ */
41
+ send<T = any>(method: string, params?: any): Promise<T>;
42
+ /**
43
+ * Get available targets (tabs/pages)
44
+ */
45
+ getTargets(): Promise<any[]>;
46
+ /**
47
+ * Attach to a specific target
48
+ */
49
+ attachToTarget(targetId: string): Promise<void>;
50
+ /**
51
+ * Create a new tab
52
+ */
53
+ createTarget(url?: string): Promise<string>;
54
+ /**
55
+ * Close a target
56
+ */
57
+ closeTarget(targetId: string): Promise<void>;
58
+ /**
59
+ * Set up event listeners for specific domains
60
+ */
61
+ setupEventListeners(): void;
62
+ }
63
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"AAAA,OAAY,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C;;GAEG;AACH,qBAAa,SAAU,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAO;IAE7B;;OAEG;IACG,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgD3C;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAejC;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B;;OAEG;IACH,iBAAiB,IAAI,iBAAiB,GAAG,IAAI;IAI7C;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjD;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAe7D;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAelC;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAerD;;OAEG;IACG,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBhE;;OAEG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD;;OAEG;IACH,mBAAmB,IAAI,IAAI;CA8C5B"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.CdpClient = void 0;
40
+ const chrome_remote_interface_1 = __importDefault(require("chrome-remote-interface"));
41
+ const events_1 = require("events");
42
+ const logger_1 = require("../utils/logger");
43
+ /**
44
+ * Chrome DevTools Protocol client wrapper
45
+ */
46
+ class CdpClient extends events_1.EventEmitter {
47
+ constructor() {
48
+ super(...arguments);
49
+ this.client = null;
50
+ this.connectionInfo = null;
51
+ this.isConnected = false;
52
+ this.reconnectAttempts = 0;
53
+ this.maxReconnectAttempts = 3;
54
+ this.reconnectDelay = 500;
55
+ }
56
+ /**
57
+ * Connect to Chrome DevTools Protocol
58
+ */
59
+ async connect(port) {
60
+ try {
61
+ // Import here to avoid issues if chrome-remote-interface is not available
62
+ const { CdpDiscovery } = await Promise.resolve().then(() => __importStar(require('./discovery')));
63
+ // Discover CDP endpoint
64
+ this.connectionInfo = await CdpDiscovery.discover(port);
65
+ // Connect to the WebSocket
66
+ this.client = await (0, chrome_remote_interface_1.default)({
67
+ target: this.connectionInfo.webSocketDebuggerUrl,
68
+ });
69
+ // Set up event handlers
70
+ if (this.client) {
71
+ this.client.on('disconnect', () => {
72
+ this.isConnected = false;
73
+ this.emit('disconnect');
74
+ logger_1.logger.debug('CDP client disconnected');
75
+ });
76
+ this.client.on('event', (method, params) => {
77
+ this.emit('event', method, params);
78
+ });
79
+ }
80
+ this.isConnected = true;
81
+ this.reconnectAttempts = 0;
82
+ logger_1.logger.connected(port || 9222);
83
+ this.emit('connect', this.client);
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error(`Failed to connect to CDP: ${error}`);
87
+ // Try to reconnect if we haven't exceeded max attempts
88
+ if (this.reconnectAttempts < this.maxReconnectAttempts) {
89
+ this.reconnectAttempts++;
90
+ logger_1.logger.debug(`Reconnecting attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts}...`);
91
+ await new Promise(resolve => setTimeout(resolve, this.reconnectDelay));
92
+ return this.connect(port);
93
+ }
94
+ throw error;
95
+ }
96
+ }
97
+ /**
98
+ * Disconnect from CDP
99
+ */
100
+ async disconnect() {
101
+ if (this.client) {
102
+ try {
103
+ await this.client.close();
104
+ this.client = null;
105
+ this.isConnected = false;
106
+ this.connectionInfo = null;
107
+ logger_1.logger.disconnected();
108
+ this.emit('disconnect');
109
+ }
110
+ catch (error) {
111
+ logger_1.logger.error(`Error disconnecting from CDP: ${error}`);
112
+ }
113
+ }
114
+ }
115
+ /**
116
+ * Check if connected
117
+ */
118
+ isClientConnected() {
119
+ return this.isConnected && this.client !== null;
120
+ }
121
+ /**
122
+ * Get the raw CDP client
123
+ */
124
+ getClient() {
125
+ return this.client;
126
+ }
127
+ /**
128
+ * Get connection info
129
+ */
130
+ getConnectionInfo() {
131
+ return this.connectionInfo;
132
+ }
133
+ /**
134
+ * Enable a domain
135
+ */
136
+ async enableDomain(domain) {
137
+ if (!this.client) {
138
+ throw new Error('Not connected to CDP');
139
+ }
140
+ try {
141
+ await this.client.send(`${domain}.enable`);
142
+ logger_1.logger.debug(`Enabled domain: ${domain}`);
143
+ }
144
+ catch (error) {
145
+ logger_1.logger.error(`Failed to enable domain ${domain}: ${error}`);
146
+ throw error;
147
+ }
148
+ }
149
+ /**
150
+ * Send a command to CDP
151
+ */
152
+ async send(method, params) {
153
+ if (!this.client) {
154
+ throw new Error('Not connected to CDP');
155
+ }
156
+ try {
157
+ const result = await this.client.send(method, params);
158
+ logger_1.logger.debug(`CDP command: ${method}`, params);
159
+ return result;
160
+ }
161
+ catch (error) {
162
+ logger_1.logger.error(`CDP command failed: ${method}`, error);
163
+ throw error;
164
+ }
165
+ }
166
+ /**
167
+ * Get available targets (tabs/pages)
168
+ */
169
+ async getTargets() {
170
+ if (!this.client) {
171
+ throw new Error('Not connected to CDP');
172
+ }
173
+ try {
174
+ const { Target } = this.client;
175
+ const targets = await Target.getTargets();
176
+ return targets.targetInfos;
177
+ }
178
+ catch (error) {
179
+ logger_1.logger.error('Failed to get targets:', error);
180
+ throw error;
181
+ }
182
+ }
183
+ /**
184
+ * Attach to a specific target
185
+ */
186
+ async attachToTarget(targetId) {
187
+ if (!this.client) {
188
+ throw new Error('Not connected to CDP');
189
+ }
190
+ try {
191
+ const { Target } = this.client;
192
+ await Target.attachToTarget({ targetId, flatten: true });
193
+ logger_1.logger.debug(`Attached to target: ${targetId}`);
194
+ }
195
+ catch (error) {
196
+ logger_1.logger.error(`Failed to attach to target ${targetId}:`, error);
197
+ throw error;
198
+ }
199
+ }
200
+ /**
201
+ * Create a new tab
202
+ */
203
+ async createTarget(url = 'about:blank') {
204
+ if (!this.client) {
205
+ throw new Error('Not connected to CDP');
206
+ }
207
+ try {
208
+ const { Target } = this.client;
209
+ const result = await Target.createTarget({ url });
210
+ logger_1.logger.debug(`Created new target: ${result.targetId}`);
211
+ return result.targetId;
212
+ }
213
+ catch (error) {
214
+ logger_1.logger.error('Failed to create target:', error);
215
+ throw error;
216
+ }
217
+ }
218
+ /**
219
+ * Close a target
220
+ */
221
+ async closeTarget(targetId) {
222
+ if (!this.client) {
223
+ throw new Error('Not connected to CDP');
224
+ }
225
+ try {
226
+ const { Target } = this.client;
227
+ await Target.closeTarget({ targetId });
228
+ logger_1.logger.debug(`Closed target: ${targetId}`);
229
+ }
230
+ catch (error) {
231
+ logger_1.logger.error(`Failed to close target ${targetId}:`, error);
232
+ throw error;
233
+ }
234
+ }
235
+ /**
236
+ * Set up event listeners for specific domains
237
+ */
238
+ setupEventListeners() {
239
+ if (!this.client) {
240
+ return;
241
+ }
242
+ // Page events
243
+ if (this.client.Page) {
244
+ this.client.Page.frameNavigated((params) => {
245
+ this.emit('frameNavigated', params);
246
+ logger_1.logger.debug('Frame navigated:', params.frame.id);
247
+ });
248
+ this.client.Page.loadEventFired(() => {
249
+ this.emit('loadEventFired');
250
+ logger_1.logger.debug('Load event fired');
251
+ });
252
+ }
253
+ // Runtime events
254
+ if (this.client.Runtime) {
255
+ this.client.Runtime.bindingCalled((params) => {
256
+ this.emit('bindingCalled', params);
257
+ logger_1.logger.bindingCalled(params.name, params.payload);
258
+ });
259
+ this.client.Runtime.consoleAPICalled((params) => {
260
+ this.emit('consoleAPICalled', params);
261
+ });
262
+ this.client.Runtime.exceptionThrown((params) => {
263
+ this.emit('exceptionThrown', params);
264
+ logger_1.logger.error('Runtime exception:', params.exceptionDetails);
265
+ });
266
+ }
267
+ // Network events
268
+ if (this.client.Network) {
269
+ this.client.Network.requestWillBeSent((params) => {
270
+ this.emit('requestWillBeSent', params);
271
+ });
272
+ this.client.Network.responseReceived((params) => {
273
+ this.emit('responseReceived', params);
274
+ });
275
+ }
276
+ }
277
+ }
278
+ exports.CdpClient = CdpClient;
279
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cdp/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { CdpConnectionInfo } from '../types';
2
+ /**
3
+ * Auto-discover Chrome DevTools Protocol endpoint
4
+ */
5
+ export declare class CdpDiscovery {
6
+ /**
7
+ * Discover CDP endpoint on available ports
8
+ */
9
+ static discover(port?: number): Promise<CdpConnectionInfo>;
10
+ /**
11
+ * Try to connect to a specific port
12
+ */
13
+ private static tryPort;
14
+ /**
15
+ * Check if a port is available
16
+ */
17
+ static isPortAvailable(port: number): Promise<boolean>;
18
+ /**
19
+ * Get launch instructions for Chrome
20
+ */
21
+ static getLaunchInstructions(port?: number): string[];
22
+ }
23
+ /**
24
+ * Custom error for CDP discovery failures
25
+ */
26
+ export declare class CdpDiscoveryError extends Error {
27
+ constructor();
28
+ /**
29
+ * Get user-friendly error message with instructions
30
+ */
31
+ getInstructions(): string[];
32
+ }
33
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/cdp/discovery.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAQ7C;;GAEG;AACH,qBAAa,YAAY;IACvB;;OAEG;WACU,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqChE;;OAEG;mBACkB,OAAO;IA6C5B;;OAEG;WACU,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5D;;OAEG;IACH,MAAM,CAAC,qBAAqB,CAAC,IAAI,GAAE,MAAa,GAAG,MAAM,EAAE;CAgC5D;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;;IAM1C;;OAEG;IACH,eAAe,IAAI,MAAM,EAAE;CAG5B"}