browser-debugger-cli 0.5.1 → 0.6.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.
- package/README.md +50 -4
- package/dist/__tests__/smoke/error-handling.smoke.test.js +0 -11
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
- package/dist/cdp/protocol.d.ts +121 -0
- package/dist/cdp/protocol.d.ts.map +1 -0
- package/dist/cdp/protocol.js +215 -0
- package/dist/cdp/protocol.js.map +1 -0
- package/dist/cdp/schema.d.ts +159 -0
- package/dist/cdp/schema.d.ts.map +1 -0
- package/dist/cdp/schema.js +256 -0
- package/dist/cdp/schema.js.map +1 -0
- package/dist/cdp/types.d.ts +139 -0
- package/dist/cdp/types.d.ts.map +1 -0
- package/dist/cdp/types.js +7 -0
- package/dist/cdp/types.js.map +1 -0
- package/dist/commands/cdp.d.ts +10 -1
- package/dist/commands/cdp.d.ts.map +1 -1
- package/dist/commands/cdp.js +363 -26
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.js +3 -3
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/dom.d.ts.map +1 -1
- package/dist/commands/dom.js +1 -0
- package/dist/commands/dom.js.map +1 -1
- package/dist/commands/domEvalHelpers.d.ts +2 -15
- package/dist/commands/domEvalHelpers.d.ts.map +1 -1
- package/dist/commands/domEvalHelpers.js +1 -1
- package/dist/commands/domEvalHelpers.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +12 -6
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts +2 -0
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +13 -1
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +2 -2
- package/dist/commands/shared/commonOptions.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +21 -12
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.js +2 -2
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +9 -6
- package/dist/commands/tail.js.map +1 -1
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +15 -2
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/domOperations.d.ts.map +1 -1
- package/dist/connection/domOperations.js +3 -1
- package/dist/connection/domOperations.js.map +1 -1
- package/dist/connection/handlers.d.ts +34 -2
- package/dist/connection/handlers.d.ts.map +1 -1
- package/dist/connection/handlers.js +28 -2
- package/dist/connection/handlers.js.map +1 -1
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +14 -2
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts.map +1 -1
- package/dist/connection/pageReadiness.js +6 -6
- package/dist/connection/pageReadiness.js.map +1 -1
- package/dist/connection/typed-cdp.d.ts +144 -0
- package/dist/connection/typed-cdp.d.ts.map +1 -0
- package/dist/connection/typed-cdp.js +120 -0
- package/dist/connection/typed-cdp.js.map +1 -0
- package/dist/daemon/worker/commandRegistry.d.ts.map +1 -1
- package/dist/daemon/worker/commandRegistry.js.map +1 -1
- package/dist/telemetry/__tests__/network.contract.test.js +124 -93
- package/dist/telemetry/__tests__/network.contract.test.js.map +1 -1
- package/dist/telemetry/console.d.ts.map +1 -1
- package/dist/telemetry/console.js +3 -2
- package/dist/telemetry/console.js.map +1 -1
- package/dist/telemetry/dialogs.d.ts.map +1 -1
- package/dist/telemetry/dialogs.js.map +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +3 -1
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/telemetry/navigation.d.ts.map +1 -1
- package/dist/telemetry/navigation.js.map +1 -1
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js.map +1 -1
- package/dist/types.d.ts +0 -141
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/messages/commands.d.ts +1 -0
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +1 -0
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/ui/messages/errors.d.ts +30 -3
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +36 -8
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/ui/messages/session.d.ts.map +1 -1
- package/dist/ui/messages/session.js +5 -4
- package/dist/ui/messages/session.js.map +1 -1
- package/dist/ui/messages/validation.d.ts +22 -4
- package/dist/ui/messages/validation.d.ts.map +1 -1
- package/dist/ui/messages/validation.js +26 -5
- package/dist/ui/messages/validation.js.map +1 -1
- package/package.json +2 -1
- package/dist/cli/commands/__tests__/start.unit.test.d.ts +0 -2
- package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +0 -1
- package/dist/cli/commands/__tests__/start.unit.test.js +0 -131
- package/dist/cli/commands/__tests__/start.unit.test.js.map +0 -1
- package/dist/cli/commands/cleanup.d.ts +0 -9
- package/dist/cli/commands/cleanup.d.ts.map +0 -1
- package/dist/cli/commands/cleanup.js +0 -148
- package/dist/cli/commands/cleanup.js.map +0 -1
- package/dist/cli/commands/details.d.ts +0 -9
- package/dist/cli/commands/details.d.ts.map +0 -1
- package/dist/cli/commands/details.js +0 -120
- package/dist/cli/commands/details.js.map +0 -1
- package/dist/cli/commands/peek.d.ts +0 -9
- package/dist/cli/commands/peek.d.ts.map +0 -1
- package/dist/cli/commands/peek.js +0 -64
- package/dist/cli/commands/peek.js.map +0 -1
- package/dist/cli/commands/query.d.ts +0 -9
- package/dist/cli/commands/query.d.ts.map +0 -1
- package/dist/cli/commands/query.js +0 -125
- package/dist/cli/commands/query.js.map +0 -1
- package/dist/cli/commands/start.d.ts +0 -83
- package/dist/cli/commands/start.d.ts.map +0 -1
- package/dist/cli/commands/start.js +0 -204
- package/dist/cli/commands/start.js.map +0 -1
- package/dist/cli/commands/status.d.ts +0 -9
- package/dist/cli/commands/status.d.ts.map +0 -1
- package/dist/cli/commands/status.js +0 -75
- package/dist/cli/commands/status.js.map +0 -1
- package/dist/cli/commands/stop.d.ts +0 -9
- package/dist/cli/commands/stop.d.ts.map +0 -1
- package/dist/cli/commands/stop.js +0 -133
- package/dist/cli/commands/stop.js.map +0 -1
- package/dist/cli/formatters/detailsFormatter.d.ts +0 -10
- package/dist/cli/formatters/detailsFormatter.d.ts.map +0 -1
- package/dist/cli/formatters/detailsFormatter.js +0 -63
- package/dist/cli/formatters/detailsFormatter.js.map +0 -1
- package/dist/cli/formatters/previewFormatter.d.ts +0 -27
- package/dist/cli/formatters/previewFormatter.d.ts.map +0 -1
- package/dist/cli/formatters/previewFormatter.js +0 -155
- package/dist/cli/formatters/previewFormatter.js.map +0 -1
- package/dist/cli/formatters/statusFormatter.d.ts +0 -42
- package/dist/cli/formatters/statusFormatter.d.ts.map +0 -1
- package/dist/cli/formatters/statusFormatter.js +0 -126
- package/dist/cli/formatters/statusFormatter.js.map +0 -1
- package/dist/cli/handlers/ChromeBootstrap.d.ts +0 -24
- package/dist/cli/handlers/ChromeBootstrap.d.ts.map +0 -1
- package/dist/cli/handlers/ChromeBootstrap.js +0 -50
- package/dist/cli/handlers/ChromeBootstrap.js.map +0 -1
- package/dist/cli/handlers/OutputBuilder.d.ts +0 -59
- package/dist/cli/handlers/OutputBuilder.d.ts.map +0 -1
- package/dist/cli/handlers/OutputBuilder.js +0 -136
- package/dist/cli/handlers/OutputBuilder.js.map +0 -1
- package/dist/cli/handlers/OutputWriter.d.ts +0 -15
- package/dist/cli/handlers/OutputWriter.d.ts.map +0 -1
- package/dist/cli/handlers/OutputWriter.js +0 -34
- package/dist/cli/handlers/OutputWriter.js.map +0 -1
- package/dist/cli/handlers/PreviewWriter.d.ts +0 -52
- package/dist/cli/handlers/PreviewWriter.d.ts.map +0 -1
- package/dist/cli/handlers/PreviewWriter.js +0 -118
- package/dist/cli/handlers/PreviewWriter.js.map +0 -1
- package/dist/cli/handlers/SessionLock.d.ts +0 -16
- package/dist/cli/handlers/SessionLock.d.ts.map +0 -1
- package/dist/cli/handlers/SessionLock.js +0 -35
- package/dist/cli/handlers/SessionLock.js.map +0 -1
- package/dist/cli/handlers/SessionLoop.d.ts +0 -19
- package/dist/cli/handlers/SessionLoop.d.ts.map +0 -1
- package/dist/cli/handlers/SessionLoop.js +0 -47
- package/dist/cli/handlers/SessionLoop.js.map +0 -1
- package/dist/cli/handlers/ShutdownController.d.ts +0 -41
- package/dist/cli/handlers/ShutdownController.d.ts.map +0 -1
- package/dist/cli/handlers/ShutdownController.js +0 -94
- package/dist/cli/handlers/ShutdownController.js.map +0 -1
- package/dist/cli/handlers/SignalHandler.d.ts +0 -35
- package/dist/cli/handlers/SignalHandler.d.ts.map +0 -1
- package/dist/cli/handlers/SignalHandler.js +0 -81
- package/dist/cli/handlers/SignalHandler.js.map +0 -1
- package/dist/cli/handlers/TargetSetup.d.ts +0 -42
- package/dist/cli/handlers/TargetSetup.d.ts.map +0 -1
- package/dist/cli/handlers/TargetSetup.js +0 -87
- package/dist/cli/handlers/TargetSetup.js.map +0 -1
- package/dist/cli/handlers/sessionController.d.ts +0 -62
- package/dist/cli/handlers/sessionController.d.ts.map +0 -1
- package/dist/cli/handlers/sessionController.js +0 -316
- package/dist/cli/handlers/sessionController.js.map +0 -1
- package/dist/cli/registry.d.ts +0 -11
- package/dist/cli/registry.d.ts.map +0 -1
- package/dist/cli/registry.js +0 -21
- package/dist/cli/registry.js.map +0 -1
- package/dist/collectors/console.d.ts +0 -19
- package/dist/collectors/console.d.ts.map +0 -1
- package/dist/collectors/console.js +0 -87
- package/dist/collectors/console.js.map +0 -1
- package/dist/collectors/dom.d.ts +0 -21
- package/dist/collectors/dom.d.ts.map +0 -1
- package/dist/collectors/dom.js +0 -99
- package/dist/collectors/dom.js.map +0 -1
- package/dist/collectors/network.d.ts +0 -32
- package/dist/collectors/network.d.ts.map +0 -1
- package/dist/collectors/network.js +0 -191
- package/dist/collectors/network.js.map +0 -1
- package/dist/connection/tabs.d.ts +0 -52
- package/dist/connection/tabs.d.ts.map +0 -1
- package/dist/connection/tabs.js +0 -227
- package/dist/connection/tabs.js.map +0 -1
- package/dist/help/machineReadableHelp.d.ts +0 -100
- package/dist/help/machineReadableHelp.d.ts.map +0 -1
- package/dist/help/machineReadableHelp.js +0 -139
- package/dist/help/machineReadableHelp.js.map +0 -1
- package/dist/session/BdgSession.d.ts +0 -91
- package/dist/session/BdgSession.d.ts.map +0 -1
- package/dist/session/BdgSession.js +0 -230
- package/dist/session/BdgSession.js.map +0 -1
- package/dist/ui/errors/SystemErrors.d.ts +0 -22
- package/dist/ui/errors/SystemErrors.d.ts.map +0 -1
- package/dist/ui/errors/SystemErrors.js +0 -23
- package/dist/ui/errors/SystemErrors.js.map +0 -1
- package/dist/ui/errors.d.ts +0 -39
- package/dist/ui/errors.d.ts.map +0 -1
- package/dist/ui/errors.js +0 -48
- package/dist/ui/errors.js.map +0 -1
- package/dist/ui/messages/deprecation.d.ts +0 -30
- package/dist/ui/messages/deprecation.d.ts.map +0 -1
- package/dist/ui/messages/deprecation.js +0 -49
- package/dist/ui/messages/deprecation.js.map +0 -1
- package/dist/ui/messages/index.d.ts +0 -12
- package/dist/ui/messages/index.d.ts.map +0 -1
- package/dist/ui/messages/index.js +0 -12
- package/dist/ui/messages/index.js.map +0 -1
- package/dist/utils/__tests__/filters.unit.test.d.ts +0 -2
- package/dist/utils/__tests__/filters.unit.test.d.ts.map +0 -1
- package/dist/utils/__tests__/filters.unit.test.js +0 -239
- package/dist/utils/__tests__/filters.unit.test.js.map +0 -1
- package/dist/utils/cdpHandlers.d.ts +0 -31
- package/dist/utils/cdpHandlers.d.ts.map +0 -1
- package/dist/utils/cdpHandlers.js +0 -38
- package/dist/utils/cdpHandlers.js.map +0 -1
- package/dist/utils/chromeDiagnostics.d.ts +0 -16
- package/dist/utils/chromeDiagnostics.d.ts.map +0 -1
- package/dist/utils/chromeDiagnostics.js +0 -37
- package/dist/utils/chromeDiagnostics.js.map +0 -1
- package/dist/utils/errors.d.ts +0 -82
- package/dist/utils/errors.d.ts.map +0 -1
- package/dist/utils/errors.js +0 -88
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/filters.d.ts +0 -148
- package/dist/utils/filters.d.ts.map +0 -1
- package/dist/utils/filters.js +0 -358
- package/dist/utils/filters.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -98
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -93
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/pageReadiness.d.ts +0 -46
- package/dist/utils/pageReadiness.d.ts.map +0 -1
- package/dist/utils/pageReadiness.js +0 -270
- package/dist/utils/pageReadiness.js.map +0 -1
- package/dist/utils/session.d.ts +0 -200
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -498
- package/dist/utils/session.js.map +0 -1
- package/dist/utils/validation.d.ts +0 -12
- package/dist/utils/validation.d.ts.map +0 -1
- package/dist/utils/validation.js +0 -20
- package/dist/utils/validation.js.map +0 -1
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { CDPConnection } from '../connection/cdp.js';
|
|
2
|
-
import type { NetworkRequest, CleanupFunction } from '../types.js';
|
|
3
|
-
export interface NetworkCollectionOptions {
|
|
4
|
-
includeAll?: boolean;
|
|
5
|
-
fetchAllBodies?: boolean;
|
|
6
|
-
fetchBodiesInclude?: string[];
|
|
7
|
-
fetchBodiesExclude?: string[];
|
|
8
|
-
networkInclude?: string[];
|
|
9
|
-
networkExclude?: string[];
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Start collecting network requests via CDP Network domain.
|
|
13
|
-
*
|
|
14
|
-
* Tracks all HTTP requests and responses, including headers and bodies (for JSON/text responses).
|
|
15
|
-
* Implements automatic cleanup of stale requests to prevent memory leaks during long sessions.
|
|
16
|
-
*
|
|
17
|
-
* @param cdp - CDP connection instance
|
|
18
|
-
* @param requests - Array to populate with completed network requests
|
|
19
|
-
* @param options - Collection options
|
|
20
|
-
* @returns Cleanup function to remove event handlers and clear state
|
|
21
|
-
*
|
|
22
|
-
* @remarks
|
|
23
|
-
* - Chrome buffer limits: 50MB total, 10MB per resource, 1MB POST data (with fallback)
|
|
24
|
-
* - Stale requests (incomplete after 60s) are removed from tracking but NOT added to output
|
|
25
|
-
* - Request limit of 10,000 prevents memory issues in long-running sessions
|
|
26
|
-
* - Response bodies are automatically skipped for images, fonts, CSS, and source maps (see DEFAULT_SKIP_BODY_PATTERNS)
|
|
27
|
-
* - Response bodies larger than 5MB are skipped with a placeholder message
|
|
28
|
-
* - By default, common tracking/analytics domains are filtered out (use includeAll to disable)
|
|
29
|
-
* - Pattern precedence: include patterns always trump exclude patterns
|
|
30
|
-
*/
|
|
31
|
-
export declare function startNetworkCollection(cdp: CDPConnection, requests: NetworkRequest[], options?: NetworkCollectionOptions): Promise<CleanupFunction>;
|
|
32
|
-
//# sourceMappingURL=network.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"network.d.ts","sourceRoot":"","sources":["../../src/collectors/network.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAUzD,OAAO,KAAK,EACV,cAAc,EACd,eAAe,EAMhB,MAAM,SAAS,CAAC;AAIjB,MAAM,WAAW,wBAAwB;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,GAAE,wBAA6B,GACrC,OAAO,CAAC,eAAe,CAAC,CAuN1B"}
|
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { MAX_NETWORK_REQUESTS, STALE_REQUEST_TIMEOUT, STALE_REQUEST_CLEANUP_INTERVAL, MAX_RESPONSE_SIZE, CHROME_NETWORK_BUFFER_TOTAL, CHROME_NETWORK_BUFFER_PER_RESOURCE, CHROME_POST_DATA_LIMIT, } from '../constants.js';
|
|
2
|
-
import { CDPHandlerRegistry } from '../utils/cdpHandlers.js';
|
|
3
|
-
import { shouldExcludeDomain, shouldExcludeUrl, shouldFetchBody } from '../utils/filters.js';
|
|
4
|
-
/**
|
|
5
|
-
* Start collecting network requests via CDP Network domain.
|
|
6
|
-
*
|
|
7
|
-
* Tracks all HTTP requests and responses, including headers and bodies (for JSON/text responses).
|
|
8
|
-
* Implements automatic cleanup of stale requests to prevent memory leaks during long sessions.
|
|
9
|
-
*
|
|
10
|
-
* @param cdp - CDP connection instance
|
|
11
|
-
* @param requests - Array to populate with completed network requests
|
|
12
|
-
* @param options - Collection options
|
|
13
|
-
* @returns Cleanup function to remove event handlers and clear state
|
|
14
|
-
*
|
|
15
|
-
* @remarks
|
|
16
|
-
* - Chrome buffer limits: 50MB total, 10MB per resource, 1MB POST data (with fallback)
|
|
17
|
-
* - Stale requests (incomplete after 60s) are removed from tracking but NOT added to output
|
|
18
|
-
* - Request limit of 10,000 prevents memory issues in long-running sessions
|
|
19
|
-
* - Response bodies are automatically skipped for images, fonts, CSS, and source maps (see DEFAULT_SKIP_BODY_PATTERNS)
|
|
20
|
-
* - Response bodies larger than 5MB are skipped with a placeholder message
|
|
21
|
-
* - By default, common tracking/analytics domains are filtered out (use includeAll to disable)
|
|
22
|
-
* - Pattern precedence: include patterns always trump exclude patterns
|
|
23
|
-
*/
|
|
24
|
-
export async function startNetworkCollection(cdp, requests, options = {}) {
|
|
25
|
-
const { includeAll = false, fetchAllBodies = false, fetchBodiesInclude = [], fetchBodiesExclude = [], networkInclude = [], networkExclude = [], } = options;
|
|
26
|
-
const requestMap = new Map();
|
|
27
|
-
const registry = new CDPHandlerRegistry();
|
|
28
|
-
// Counters for PERF logging
|
|
29
|
-
let bodiesFetched = 0;
|
|
30
|
-
let bodiesSkipped = 0;
|
|
31
|
-
// Enable network tracking with buffer limits (if supported)
|
|
32
|
-
// These parameters are optional and experimental, but widely supported in Chrome 58+
|
|
33
|
-
// See docs/chrome-cdp-compatibility.md for details
|
|
34
|
-
try {
|
|
35
|
-
await cdp.send('Network.enable', {
|
|
36
|
-
maxTotalBufferSize: CHROME_NETWORK_BUFFER_TOTAL,
|
|
37
|
-
maxResourceBufferSize: CHROME_NETWORK_BUFFER_PER_RESOURCE,
|
|
38
|
-
maxPostDataSize: CHROME_POST_DATA_LIMIT,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
catch {
|
|
42
|
-
// Fallback to basic Network.enable if buffer parameters not supported
|
|
43
|
-
console.error('Network buffer limits not supported, using default settings');
|
|
44
|
-
await cdp.send('Network.enable');
|
|
45
|
-
}
|
|
46
|
-
// Periodic cleanup of stale requests (see JSDoc @remarks for behavior)
|
|
47
|
-
const cleanupInterval = setInterval(() => {
|
|
48
|
-
const now = Date.now();
|
|
49
|
-
const staleRequests = [];
|
|
50
|
-
requestMap.forEach((value, requestId) => {
|
|
51
|
-
if (now - value.timestamp > STALE_REQUEST_TIMEOUT) {
|
|
52
|
-
staleRequests.push(requestId);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
if (staleRequests.length > 0) {
|
|
56
|
-
console.error(`Cleaning up ${staleRequests.length} stale network requests`);
|
|
57
|
-
staleRequests.forEach((requestId) => requestMap.delete(requestId));
|
|
58
|
-
}
|
|
59
|
-
}, STALE_REQUEST_CLEANUP_INTERVAL);
|
|
60
|
-
// Listen for requests
|
|
61
|
-
registry.register(cdp, 'Network.requestWillBeSent', (params) => {
|
|
62
|
-
if (requestMap.size >= MAX_NETWORK_REQUESTS) {
|
|
63
|
-
console.error(`Warning: Network request limit reached (${MAX_NETWORK_REQUESTS}), dropping new requests`);
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const request = {
|
|
67
|
-
requestId: params.requestId,
|
|
68
|
-
url: params.request.url,
|
|
69
|
-
method: params.request.method,
|
|
70
|
-
timestamp: params.timestamp,
|
|
71
|
-
requestHeaders: params.request.headers,
|
|
72
|
-
requestBody: params.request.postData,
|
|
73
|
-
};
|
|
74
|
-
requestMap.set(params.requestId, {
|
|
75
|
-
request,
|
|
76
|
-
timestamp: Date.now(),
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
// Listen for responses
|
|
80
|
-
registry.register(cdp, 'Network.responseReceived', (params) => {
|
|
81
|
-
const entry = requestMap.get(params.requestId);
|
|
82
|
-
if (entry) {
|
|
83
|
-
entry.request.status = params.response.status;
|
|
84
|
-
entry.request.mimeType = params.response.mimeType;
|
|
85
|
-
entry.request.responseHeaders = params.response.headers;
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
// Listen for finished requests
|
|
89
|
-
registry.register(cdp, 'Network.loadingFinished', (params) => {
|
|
90
|
-
const entry = requestMap.get(params.requestId);
|
|
91
|
-
if (entry && requests.length < MAX_NETWORK_REQUESTS) {
|
|
92
|
-
const request = entry.request;
|
|
93
|
-
// Apply domain filtering
|
|
94
|
-
if (shouldExcludeDomain(request.url, includeAll)) {
|
|
95
|
-
requestMap.delete(params.requestId);
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
// Apply URL pattern filtering
|
|
99
|
-
if (shouldExcludeUrl(request.url, {
|
|
100
|
-
includePatterns: networkInclude,
|
|
101
|
-
excludePatterns: networkExclude,
|
|
102
|
-
})) {
|
|
103
|
-
requestMap.delete(params.requestId);
|
|
104
|
-
return;
|
|
105
|
-
}
|
|
106
|
-
// Determine if we should fetch the response body
|
|
107
|
-
const isSizeAcceptable = params.encodedDataLength <= MAX_RESPONSE_SIZE;
|
|
108
|
-
const isTextResponse = (request.mimeType?.includes('json') ?? false) ||
|
|
109
|
-
(request.mimeType?.includes('javascript') ?? false) ||
|
|
110
|
-
(request.mimeType?.includes('text') ?? false) ||
|
|
111
|
-
(request.mimeType?.includes('html') ?? false);
|
|
112
|
-
if (isTextResponse && isSizeAcceptable) {
|
|
113
|
-
// Check if we should fetch body based on patterns
|
|
114
|
-
const shouldFetch = shouldFetchBody(request.url, request.mimeType, {
|
|
115
|
-
fetchAllBodies,
|
|
116
|
-
includePatterns: fetchBodiesInclude,
|
|
117
|
-
excludePatterns: fetchBodiesExclude,
|
|
118
|
-
});
|
|
119
|
-
if (shouldFetch) {
|
|
120
|
-
bodiesFetched++;
|
|
121
|
-
// Fetch response body asynchronously
|
|
122
|
-
void cdp
|
|
123
|
-
.send('Network.getResponseBody', { requestId: params.requestId })
|
|
124
|
-
.then((response) => {
|
|
125
|
-
const typedResponse = response;
|
|
126
|
-
request.responseBody = typedResponse.body;
|
|
127
|
-
})
|
|
128
|
-
.catch(() => {
|
|
129
|
-
// Response body not available (e.g., 204 No Content, redirects, etc.)
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
bodiesSkipped++;
|
|
134
|
-
request.responseBody = '[SKIPPED: Auto-optimization (see DEFAULT_SKIP_BODY_PATTERNS)]';
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
else if (isTextResponse && !isSizeAcceptable) {
|
|
138
|
-
bodiesSkipped++;
|
|
139
|
-
// Mark large responses as skipped
|
|
140
|
-
request.responseBody = `[SKIPPED: Response too large (${(params.encodedDataLength / 1024 / 1024).toFixed(2)}MB > ${MAX_RESPONSE_SIZE / 1024 / 1024}MB)]`;
|
|
141
|
-
}
|
|
142
|
-
requests.push(request);
|
|
143
|
-
requestMap.delete(params.requestId);
|
|
144
|
-
}
|
|
145
|
-
else if (requests.length >= MAX_NETWORK_REQUESTS) {
|
|
146
|
-
console.error(`Warning: Network request limit reached (${MAX_NETWORK_REQUESTS})`);
|
|
147
|
-
requestMap.delete(params.requestId);
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
// Listen for failed requests
|
|
151
|
-
registry.register(cdp, 'Network.loadingFailed', (params) => {
|
|
152
|
-
const entry = requestMap.get(params.requestId);
|
|
153
|
-
if (entry && requests.length < MAX_NETWORK_REQUESTS) {
|
|
154
|
-
// Apply domain filtering
|
|
155
|
-
if (shouldExcludeDomain(entry.request.url, includeAll)) {
|
|
156
|
-
requestMap.delete(params.requestId);
|
|
157
|
-
return;
|
|
158
|
-
}
|
|
159
|
-
// Apply URL pattern filtering
|
|
160
|
-
if (shouldExcludeUrl(entry.request.url, {
|
|
161
|
-
includePatterns: networkInclude,
|
|
162
|
-
excludePatterns: networkExclude,
|
|
163
|
-
})) {
|
|
164
|
-
requestMap.delete(params.requestId);
|
|
165
|
-
return;
|
|
166
|
-
}
|
|
167
|
-
entry.request.status = 0; // Indicate failure
|
|
168
|
-
requests.push(entry.request);
|
|
169
|
-
requestMap.delete(params.requestId);
|
|
170
|
-
}
|
|
171
|
-
else if (requests.length >= MAX_NETWORK_REQUESTS) {
|
|
172
|
-
requestMap.delete(params.requestId);
|
|
173
|
-
}
|
|
174
|
-
});
|
|
175
|
-
// Return cleanup function
|
|
176
|
-
return () => {
|
|
177
|
-
// Log PERF metrics
|
|
178
|
-
const totalBodyDecisions = bodiesFetched + bodiesSkipped;
|
|
179
|
-
if (totalBodyDecisions > 0) {
|
|
180
|
-
const percentageSkipped = ((bodiesSkipped / totalBodyDecisions) * 100).toFixed(1);
|
|
181
|
-
console.error(`[PERF] Network bodies: ${bodiesFetched} fetched, ${bodiesSkipped} skipped (${percentageSkipped}% reduction)`);
|
|
182
|
-
}
|
|
183
|
-
// Clear interval
|
|
184
|
-
clearInterval(cleanupInterval);
|
|
185
|
-
// Remove event handlers
|
|
186
|
-
registry.cleanup(cdp);
|
|
187
|
-
// Clear request map
|
|
188
|
-
requestMap.clear();
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
//# sourceMappingURL=network.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"network.js","sourceRoot":"","sources":["../../src/collectors/network.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import type { CDPConnection } from './cdp.js';
|
|
2
|
-
import type { CDPTarget } from '../types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Find the best matching target from a list of tabs.
|
|
5
|
-
*
|
|
6
|
-
* @param normalizedUrl - Target URL to find (must be pre-normalized)
|
|
7
|
-
* @param targets - List of available targets
|
|
8
|
-
* @returns Best matching target or null if no match found
|
|
9
|
-
*/
|
|
10
|
-
export declare function findBestTarget(normalizedUrl: string, targets: CDPTarget[]): CDPTarget | null;
|
|
11
|
-
/**
|
|
12
|
-
* Create a new tab with the specified URL using CDP.
|
|
13
|
-
*
|
|
14
|
-
* @param normalizedUrl - URL to open in the new tab (must be pre-normalized)
|
|
15
|
-
* @param cdp - CDP connection instance
|
|
16
|
-
* @returns Target information for the new tab
|
|
17
|
-
* @throws Error if tab creation fails via both CDP and HTTP fallback methods
|
|
18
|
-
*/
|
|
19
|
-
export declare function createNewTab(normalizedUrl: string, cdp: CDPConnection): Promise<CDPTarget>;
|
|
20
|
-
/**
|
|
21
|
-
* Navigate an existing tab to a new URL using CDP.
|
|
22
|
-
*
|
|
23
|
-
* @param targetId - CDP target ID to navigate
|
|
24
|
-
* @param normalizedUrl - URL to navigate to (must be pre-normalized)
|
|
25
|
-
* @param cdp - CDP connection instance
|
|
26
|
-
* @throws Error if navigation fails (e.g., network error, invalid URL, blocked by browser)
|
|
27
|
-
*/
|
|
28
|
-
export declare function navigateToUrl(targetId: string, normalizedUrl: string, cdp: CDPConnection): Promise<void>;
|
|
29
|
-
/**
|
|
30
|
-
* Wait for a target to be ready (URL matches expected).
|
|
31
|
-
*
|
|
32
|
-
* @param targetId - CDP target ID to wait for
|
|
33
|
-
* @param normalizedUrl - Expected URL (must be pre-normalized)
|
|
34
|
-
* @param cdp - CDP connection instance
|
|
35
|
-
* @param maxWaitMs - Maximum time to wait in milliseconds
|
|
36
|
-
* @throws Error if target doesn't become ready within maxWaitMs timeout
|
|
37
|
-
*/
|
|
38
|
-
export declare function waitForTargetReady(targetId: string, normalizedUrl: string, cdp: CDPConnection, maxWaitMs?: number): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* Create a new tab or find existing tab with the target URL.
|
|
41
|
-
*
|
|
42
|
-
* This is the main entry point for tab management.
|
|
43
|
-
* It tries to find an existing tab first, and if not found,
|
|
44
|
-
* creates a new one.
|
|
45
|
-
*
|
|
46
|
-
* @param url - Target URL (will be normalized once at entry)
|
|
47
|
-
* @param cdp - CDP connection instance
|
|
48
|
-
* @param reuseTab - If true, navigate existing tab instead of creating new one
|
|
49
|
-
* @returns Target information
|
|
50
|
-
*/
|
|
51
|
-
export declare function createOrFindTarget(url: string, cdp: CDPConnection, reuseTab?: boolean): Promise<CDPTarget>;
|
|
52
|
-
//# sourceMappingURL=tabs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.d.ts","sourceRoot":"","sources":["../../src/connection/tabs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAiEzC;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,GAAG,IAAI,CA8B5F;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAyDhG;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,aAAa,EAClB,SAAS,SAAQ,GAChB,OAAO,CAAC,IAAI,CAAC,CAkCf;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,aAAa,EAClB,QAAQ,UAAQ,GACf,OAAO,CAAC,SAAS,CAAC,CAwCpB"}
|
package/dist/connection/tabs.js
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { normalizeUrl } from '../utils/url.js';
|
|
2
|
-
/**
|
|
3
|
-
* Score how well a tab matches the search URL.
|
|
4
|
-
* Higher score = better match.
|
|
5
|
-
*
|
|
6
|
-
* @param tab - Target to score
|
|
7
|
-
* @param searchUrl - Normalized URL to match against
|
|
8
|
-
* @returns Match score (0-100)
|
|
9
|
-
*/
|
|
10
|
-
function scoreTabMatch(tab, searchUrl) {
|
|
11
|
-
// Exact match = best score
|
|
12
|
-
if (tab.url === searchUrl) {
|
|
13
|
-
return 100;
|
|
14
|
-
}
|
|
15
|
-
// Try URL-based matching
|
|
16
|
-
try {
|
|
17
|
-
const tabUrlObj = new URL(tab.url);
|
|
18
|
-
const searchUrlObj = new URL(searchUrl);
|
|
19
|
-
// Same host + path = excellent score
|
|
20
|
-
if (tabUrlObj.host === searchUrlObj.host && tabUrlObj.pathname === searchUrlObj.pathname) {
|
|
21
|
-
return 90;
|
|
22
|
-
}
|
|
23
|
-
// Same host + path prefix = good score
|
|
24
|
-
if (tabUrlObj.host === searchUrlObj.host &&
|
|
25
|
-
tabUrlObj.pathname.startsWith(searchUrlObj.pathname)) {
|
|
26
|
-
return 70;
|
|
27
|
-
}
|
|
28
|
-
// Same host = decent score
|
|
29
|
-
if (tabUrlObj.host === searchUrlObj.host) {
|
|
30
|
-
return 50;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch {
|
|
34
|
-
// URL parsing failed, fall back to substring matching
|
|
35
|
-
}
|
|
36
|
-
// Substring match = weak score
|
|
37
|
-
if (tab.url.includes(searchUrl)) {
|
|
38
|
-
return 30;
|
|
39
|
-
}
|
|
40
|
-
return 0; // No match
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Find the best matching target from a list of tabs.
|
|
44
|
-
*
|
|
45
|
-
* @param normalizedUrl - Target URL to find (must be pre-normalized)
|
|
46
|
-
* @param targets - List of available targets
|
|
47
|
-
* @returns Best matching target or null if no match found
|
|
48
|
-
*/
|
|
49
|
-
export function findBestTarget(normalizedUrl, targets) {
|
|
50
|
-
const searchUrl = normalizedUrl;
|
|
51
|
-
// Filter for page targets only
|
|
52
|
-
const pageTargets = targets.filter((t) => t.type === 'page');
|
|
53
|
-
if (pageTargets.length === 0) {
|
|
54
|
-
return null;
|
|
55
|
-
}
|
|
56
|
-
// Score all targets
|
|
57
|
-
const scored = pageTargets
|
|
58
|
-
.map((t) => ({ target: t, score: scoreTabMatch(t, searchUrl) }))
|
|
59
|
-
.filter(({ score }) => score > 0)
|
|
60
|
-
.sort((a, b) => b.score - a.score);
|
|
61
|
-
if (scored.length === 0) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
// Warn if multiple tabs have same score
|
|
65
|
-
const first = scored[0];
|
|
66
|
-
const second = scored[1];
|
|
67
|
-
if (scored.length > 1 && first && second && first.score === second.score && first.score < 100) {
|
|
68
|
-
console.error(`Warning: Multiple tabs match equally (score ${first.score}), using: ${first.target.url}`);
|
|
69
|
-
}
|
|
70
|
-
return first ? first.target : null;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Create a new tab with the specified URL using CDP.
|
|
74
|
-
*
|
|
75
|
-
* @param normalizedUrl - URL to open in the new tab (must be pre-normalized)
|
|
76
|
-
* @param cdp - CDP connection instance
|
|
77
|
-
* @returns Target information for the new tab
|
|
78
|
-
* @throws Error if tab creation fails via both CDP and HTTP fallback methods
|
|
79
|
-
*/
|
|
80
|
-
export async function createNewTab(normalizedUrl, cdp) {
|
|
81
|
-
const port = cdp.getPort();
|
|
82
|
-
let createdTargetId = null;
|
|
83
|
-
try {
|
|
84
|
-
const response = (await cdp.send('Target.createTarget', {
|
|
85
|
-
url: normalizedUrl,
|
|
86
|
-
newWindow: false, // Open as tab, not window
|
|
87
|
-
}));
|
|
88
|
-
createdTargetId = response.targetId;
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
console.error('CDP Target.createTarget failed, attempting HTTP fallback...', error);
|
|
92
|
-
}
|
|
93
|
-
if (createdTargetId) {
|
|
94
|
-
try {
|
|
95
|
-
const listResponse = await fetch(`http://127.0.0.1:${port}/json/list`);
|
|
96
|
-
if (!listResponse.ok) {
|
|
97
|
-
throw new Error(`Failed to list targets: ${listResponse.status} ${listResponse.statusText}`);
|
|
98
|
-
}
|
|
99
|
-
const targets = (await listResponse.json());
|
|
100
|
-
const target = targets.find((t) => t.id === createdTargetId);
|
|
101
|
-
if (!target) {
|
|
102
|
-
throw new Error(`Created target ${createdTargetId} not found in Chrome target list`);
|
|
103
|
-
}
|
|
104
|
-
return target;
|
|
105
|
-
}
|
|
106
|
-
catch (resolveError) {
|
|
107
|
-
throw new Error(`Failed to resolve created tab: ${resolveError instanceof Error ? resolveError.message : String(resolveError)}`);
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
// Fallback to HTTP endpoint method
|
|
111
|
-
try {
|
|
112
|
-
const createResponse = await fetch(`http://127.0.0.1:${port}/json/new?${encodeURIComponent(normalizedUrl)}`);
|
|
113
|
-
if (!createResponse.ok) {
|
|
114
|
-
throw new Error(`HTTP /json/new failed: ${createResponse.statusText}`);
|
|
115
|
-
}
|
|
116
|
-
const target = (await createResponse.json());
|
|
117
|
-
return target;
|
|
118
|
-
}
|
|
119
|
-
catch (httpError) {
|
|
120
|
-
throw new Error(`Failed to create new tab: ${httpError instanceof Error ? httpError.message : String(httpError)}`);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Navigate an existing tab to a new URL using CDP.
|
|
125
|
-
*
|
|
126
|
-
* @param targetId - CDP target ID to navigate
|
|
127
|
-
* @param normalizedUrl - URL to navigate to (must be pre-normalized)
|
|
128
|
-
* @param cdp - CDP connection instance
|
|
129
|
-
* @throws Error if navigation fails (e.g., network error, invalid URL, blocked by browser)
|
|
130
|
-
*/
|
|
131
|
-
export async function navigateToUrl(targetId, normalizedUrl, cdp) {
|
|
132
|
-
// Attach to target
|
|
133
|
-
const sessionResponse = (await cdp.send('Target.attachToTarget', {
|
|
134
|
-
targetId,
|
|
135
|
-
flatten: true,
|
|
136
|
-
}));
|
|
137
|
-
// Navigate
|
|
138
|
-
const navResponse = (await cdp.send('Page.navigate', { url: normalizedUrl }, sessionResponse.sessionId));
|
|
139
|
-
if (navResponse.errorText) {
|
|
140
|
-
throw new Error(`Navigation failed: ${navResponse.errorText}`);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Wait for a target to be ready (URL matches expected).
|
|
145
|
-
*
|
|
146
|
-
* @param targetId - CDP target ID to wait for
|
|
147
|
-
* @param normalizedUrl - Expected URL (must be pre-normalized)
|
|
148
|
-
* @param cdp - CDP connection instance
|
|
149
|
-
* @param maxWaitMs - Maximum time to wait in milliseconds
|
|
150
|
-
* @throws Error if target doesn't become ready within maxWaitMs timeout
|
|
151
|
-
*/
|
|
152
|
-
export async function waitForTargetReady(targetId, normalizedUrl, cdp, maxWaitMs = 15000) {
|
|
153
|
-
const startTime = Date.now();
|
|
154
|
-
while (Date.now() - startTime < maxWaitMs) {
|
|
155
|
-
try {
|
|
156
|
-
// Fetch current targets
|
|
157
|
-
const response = await fetch(`http://127.0.0.1:${cdp.getPort()}/json/list`);
|
|
158
|
-
const targets = (await response.json());
|
|
159
|
-
const target = targets.find((t) => t.id === targetId);
|
|
160
|
-
if (target) {
|
|
161
|
-
// Check if URL matches or is loading
|
|
162
|
-
if (target.url === normalizedUrl ||
|
|
163
|
-
target.url.startsWith(normalizedUrl) ||
|
|
164
|
-
target.url === 'about:blank' // Still loading
|
|
165
|
-
) {
|
|
166
|
-
// Wait a bit more if still on about:blank
|
|
167
|
-
if (target.url === 'about:blank') {
|
|
168
|
-
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
return; // Target is ready!
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
catch {
|
|
176
|
-
// Target doesn't exist yet or fetch failed, keep waiting
|
|
177
|
-
}
|
|
178
|
-
await new Promise((resolve) => setTimeout(resolve, 200));
|
|
179
|
-
}
|
|
180
|
-
throw new Error(`Target did not become ready within ${maxWaitMs}ms`);
|
|
181
|
-
}
|
|
182
|
-
/**
|
|
183
|
-
* Create a new tab or find existing tab with the target URL.
|
|
184
|
-
*
|
|
185
|
-
* This is the main entry point for tab management.
|
|
186
|
-
* It tries to find an existing tab first, and if not found,
|
|
187
|
-
* creates a new one.
|
|
188
|
-
*
|
|
189
|
-
* @param url - Target URL (will be normalized once at entry)
|
|
190
|
-
* @param cdp - CDP connection instance
|
|
191
|
-
* @param reuseTab - If true, navigate existing tab instead of creating new one
|
|
192
|
-
* @returns Target information
|
|
193
|
-
*/
|
|
194
|
-
export async function createOrFindTarget(url, cdp, reuseTab = false) {
|
|
195
|
-
// Normalize URL once at entry point
|
|
196
|
-
const normalizedUrl = normalizeUrl(url);
|
|
197
|
-
// Only look for existing tabs if reuseTab is true
|
|
198
|
-
if (reuseTab) {
|
|
199
|
-
// Try to find existing target via CDP
|
|
200
|
-
const targetsResponse = (await cdp.send('Target.getTargets'));
|
|
201
|
-
const targets = targetsResponse.targetInfos.map((info) => ({
|
|
202
|
-
id: info.targetId,
|
|
203
|
-
type: info.type,
|
|
204
|
-
url: info.url,
|
|
205
|
-
title: info.title,
|
|
206
|
-
webSocketDebuggerUrl: '', // Not needed for this operation
|
|
207
|
-
}));
|
|
208
|
-
const existingTarget = findBestTarget(normalizedUrl, targets);
|
|
209
|
-
if (existingTarget) {
|
|
210
|
-
console.error(`Found existing tab: ${existingTarget.url}`);
|
|
211
|
-
// If URLs don't match exactly, navigate
|
|
212
|
-
if (existingTarget.url !== normalizedUrl) {
|
|
213
|
-
console.error(`Navigating tab to: ${normalizedUrl}`);
|
|
214
|
-
await navigateToUrl(existingTarget.id, normalizedUrl, cdp);
|
|
215
|
-
await waitForTargetReady(existingTarget.id, normalizedUrl, cdp);
|
|
216
|
-
}
|
|
217
|
-
return existingTarget;
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
// No matching tab found (or reuseTab=false), create new one
|
|
221
|
-
console.error(`Creating new tab for: ${normalizedUrl}`);
|
|
222
|
-
const newTarget = await createNewTab(normalizedUrl, cdp);
|
|
223
|
-
// Wait for tab to start loading
|
|
224
|
-
await waitForTargetReady(newTarget.id, normalizedUrl, cdp);
|
|
225
|
-
return newTarget;
|
|
226
|
-
}
|
|
227
|
-
//# sourceMappingURL=tabs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tabs.js","sourceRoot":"","sources":["../../src/connection/tabs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Machine-readable help generation using Commander.js introspection API.
|
|
3
|
-
*
|
|
4
|
-
* @module help/machineReadableHelp
|
|
5
|
-
*/
|
|
6
|
-
import type { Command } from 'commander';
|
|
7
|
-
/**
|
|
8
|
-
* Option metadata for machine-readable help.
|
|
9
|
-
*/
|
|
10
|
-
export interface OptionMetadata {
|
|
11
|
-
/** Option flags (e.g., "-j, --json") */
|
|
12
|
-
flags: string;
|
|
13
|
-
/** Option description */
|
|
14
|
-
description: string;
|
|
15
|
-
/** Whether option is required */
|
|
16
|
-
required: boolean;
|
|
17
|
-
/** Whether option has an optional value */
|
|
18
|
-
optional: boolean;
|
|
19
|
-
/** Default value if any */
|
|
20
|
-
defaultValue?: unknown;
|
|
21
|
-
/** Description of default value */
|
|
22
|
-
defaultValueDescription?: string;
|
|
23
|
-
/** Allowed choices if restricted */
|
|
24
|
-
choices?: readonly string[];
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Argument metadata for machine-readable help.
|
|
28
|
-
*/
|
|
29
|
-
export interface ArgumentMetadata {
|
|
30
|
-
/** Argument name */
|
|
31
|
-
name: string;
|
|
32
|
-
/** Argument description */
|
|
33
|
-
description: string;
|
|
34
|
-
/** Whether argument is required */
|
|
35
|
-
required: boolean;
|
|
36
|
-
/** Whether argument accepts multiple values */
|
|
37
|
-
variadic: boolean;
|
|
38
|
-
/** Default value if any */
|
|
39
|
-
defaultValue?: unknown;
|
|
40
|
-
/** Allowed choices if restricted */
|
|
41
|
-
choices?: readonly string[];
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Command metadata for machine-readable help.
|
|
45
|
-
*/
|
|
46
|
-
export interface CommandMetadata {
|
|
47
|
-
/** Command name */
|
|
48
|
-
name: string;
|
|
49
|
-
/** Command aliases */
|
|
50
|
-
aliases: readonly string[];
|
|
51
|
-
/** Command description */
|
|
52
|
-
description: string;
|
|
53
|
-
/** Command usage string */
|
|
54
|
-
usage: string;
|
|
55
|
-
/** Command arguments */
|
|
56
|
-
arguments: ArgumentMetadata[];
|
|
57
|
-
/** Command options */
|
|
58
|
-
options: OptionMetadata[];
|
|
59
|
-
/** Subcommands */
|
|
60
|
-
subcommands: CommandMetadata[];
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Root machine-readable help structure.
|
|
64
|
-
*/
|
|
65
|
-
export interface MachineReadableHelp {
|
|
66
|
-
/** CLI name */
|
|
67
|
-
name: string;
|
|
68
|
-
/** CLI version */
|
|
69
|
-
version: string;
|
|
70
|
-
/** CLI description */
|
|
71
|
-
description: string;
|
|
72
|
-
/** Root command metadata */
|
|
73
|
-
command: CommandMetadata;
|
|
74
|
-
/** Exit code documentation */
|
|
75
|
-
exitCodes: {
|
|
76
|
-
/** Exit code value */
|
|
77
|
-
code: number;
|
|
78
|
-
/** Exit code name */
|
|
79
|
-
name: string;
|
|
80
|
-
/** Exit code description */
|
|
81
|
-
description: string;
|
|
82
|
-
}[];
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Generates machine-readable help from a Commander program.
|
|
86
|
-
*
|
|
87
|
-
* @param program - Commander program instance
|
|
88
|
-
* @returns Machine-readable help structure
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* import { program } from 'commander';
|
|
93
|
-
* import { generateMachineReadableHelp } from './help/machineReadableHelp.js';
|
|
94
|
-
*
|
|
95
|
-
* const help = generateMachineReadableHelp(program);
|
|
96
|
-
* console.log(JSON.stringify(help, null, 2));
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
99
|
-
export declare function generateMachineReadableHelp(program: Command): MachineReadableHelp;
|
|
100
|
-
//# sourceMappingURL=machineReadableHelp.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"machineReadableHelp.d.ts","sourceRoot":"","sources":["../../src/help/machineReadableHelp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAoB,MAAM,WAAW,CAAC;AAI3D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,yBAAyB;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,iCAAiC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,2CAA2C;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mCAAmC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oCAAoC;IACpC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,OAAO,CAAC;IAClB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oCAAoC;IACpC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,wBAAwB;IACxB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,sBAAsB;IACtB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,kBAAkB;IAClB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,eAAe;IACf,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,OAAO,EAAE,eAAe,CAAC;IACzB,8BAA8B;IAC9B,SAAS,EAAE;QACT,sBAAsB;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,qBAAqB;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,4BAA4B;QAC5B,WAAW,EAAE,MAAM,CAAC;KACrB,EAAE,CAAC;CACL;AAuDD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,mBAAmB,CAkEjF"}
|