@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.
- package/LICENSE +21 -0
- package/README.md +405 -0
- package/dist/__tests__/setup.d.ts +4 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +24 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/cdp/binding.d.ts +44 -0
- package/dist/cdp/binding.d.ts.map +1 -0
- package/dist/cdp/binding.js +183 -0
- package/dist/cdp/binding.js.map +1 -0
- package/dist/cdp/capture.d.ts +42 -0
- package/dist/cdp/capture.d.ts.map +1 -0
- package/dist/cdp/capture.js +235 -0
- package/dist/cdp/capture.js.map +1 -0
- package/dist/cdp/client.d.ts +63 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +279 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/discovery.d.ts +33 -0
- package/dist/cdp/discovery.d.ts.map +1 -0
- package/dist/cdp/discovery.js +157 -0
- package/dist/cdp/discovery.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +122 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/capture.d.ts +3 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +143 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +140 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +307 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +244 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/file-naming.d.ts +31 -0
- package/dist/utils/file-naming.d.ts.map +1 -0
- package/dist/utils/file-naming.js +137 -0
- package/dist/utils/file-naming.js.map +1 -0
- package/dist/utils/framework-detect.d.ts +31 -0
- package/dist/utils/framework-detect.d.ts.map +1 -0
- package/dist/utils/framework-detect.js +379 -0
- package/dist/utils/framework-detect.js.map +1 -0
- package/dist/utils/logger.d.ts +29 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +114 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/process.d.ts +61 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +208 -0
- package/dist/utils/process.js.map +1 -0
- 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"}
|