@mt0926/node-network-devtools 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.
- package/BUILD.md +204 -0
- package/LICENSE +21 -0
- package/README.md +310 -0
- package/README.zh-CN.md +310 -0
- package/dist/esm/adapters/nextjs.js +123 -0
- package/dist/esm/adapters/nextjs.js.map +1 -0
- package/dist/esm/cdp/cdp-bridge.js +312 -0
- package/dist/esm/cdp/cdp-bridge.js.map +1 -0
- package/dist/esm/cli.js +203 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/config.js +136 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/context/context-manager.js +126 -0
- package/dist/esm/context/context-manager.js.map +1 -0
- package/dist/esm/gui/browser-launcher.js +165 -0
- package/dist/esm/gui/browser-launcher.js.map +1 -0
- package/dist/esm/gui/event-bridge.js +192 -0
- package/dist/esm/gui/event-bridge.js.map +1 -0
- package/dist/esm/gui/port-utils.js +80 -0
- package/dist/esm/gui/port-utils.js.map +1 -0
- package/dist/esm/gui/server.js +227 -0
- package/dist/esm/gui/server.js.map +1 -0
- package/dist/esm/gui/websocket-hub.js +326 -0
- package/dist/esm/gui/websocket-hub.js.map +1 -0
- package/dist/esm/index.js +90 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interceptors/http-patcher.js +203 -0
- package/dist/esm/interceptors/http-patcher.js.map +1 -0
- package/dist/esm/interceptors/undici-patcher.js +324 -0
- package/dist/esm/interceptors/undici-patcher.js.map +1 -0
- package/dist/esm/register.js +132 -0
- package/dist/esm/register.js.map +1 -0
- package/dist/esm/store/ring-buffer.js +236 -0
- package/dist/esm/store/ring-buffer.js.map +1 -0
- package/dist/esm/test-setup.js +7 -0
- package/dist/esm/test-setup.js.map +1 -0
- package/dist/gui/assets/index.css +1 -0
- package/dist/gui/assets/index.js +40 -0
- package/dist/gui/index.html +14 -0
- package/dist/types/adapters/nextjs.d.ts +80 -0
- package/dist/types/adapters/nextjs.d.ts.map +1 -0
- package/dist/types/cdp/cdp-bridge.d.ts +86 -0
- package/dist/types/cdp/cdp-bridge.d.ts.map +1 -0
- package/dist/types/cli.d.ts +8 -0
- package/dist/types/cli.d.ts.map +1 -0
- package/dist/types/config.d.ts +57 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/context/context-manager.d.ts +96 -0
- package/dist/types/context/context-manager.d.ts.map +1 -0
- package/dist/types/gui/browser-launcher.d.ts +52 -0
- package/dist/types/gui/browser-launcher.d.ts.map +1 -0
- package/dist/types/gui/event-bridge.d.ts +36 -0
- package/dist/types/gui/event-bridge.d.ts.map +1 -0
- package/dist/types/gui/port-utils.d.ts +25 -0
- package/dist/types/gui/port-utils.d.ts.map +1 -0
- package/dist/types/gui/server.d.ts +50 -0
- package/dist/types/gui/server.d.ts.map +1 -0
- package/dist/types/gui/websocket-hub.d.ts +67 -0
- package/dist/types/gui/websocket-hub.d.ts.map +1 -0
- package/dist/types/index.d.ts +44 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interceptors/http-patcher.d.ts +32 -0
- package/dist/types/interceptors/http-patcher.d.ts.map +1 -0
- package/dist/types/interceptors/undici-patcher.d.ts +37 -0
- package/dist/types/interceptors/undici-patcher.d.ts.map +1 -0
- package/dist/types/register.d.ts +18 -0
- package/dist/types/register.d.ts.map +1 -0
- package/dist/types/store/ring-buffer.d.ts +148 -0
- package/dist/types/store/ring-buffer.d.ts.map +1 -0
- package/dist/types/test-setup.d.ts +7 -0
- package/dist/types/test-setup.d.ts.map +1 -0
- package/package.json +103 -0
- package/templates/instrumentation.ts +32 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CDP 桥接模块
|
|
3
|
+
*
|
|
4
|
+
* 将请求数据转换为 CDP Network 事件并发送到 Chrome DevTools
|
|
5
|
+
*
|
|
6
|
+
* 注意:Network 事件广播功能需要:
|
|
7
|
+
* 1. Node.js 20.18.0+ 版本
|
|
8
|
+
* 2. --experimental-network-inspection 标志
|
|
9
|
+
* 3. Chrome DevTools 目前还不支持显示这些事件(功能请求待实现)
|
|
10
|
+
*
|
|
11
|
+
* 当前实现会将事件发送到控制台作为备选方案
|
|
12
|
+
*/
|
|
13
|
+
import type { RequestData, ResponseData, ErrorData, TimingData } from '../store/ring-buffer.js';
|
|
14
|
+
/**
|
|
15
|
+
* CDP 堆栈帧
|
|
16
|
+
*/
|
|
17
|
+
export interface CDPCallFrame {
|
|
18
|
+
functionName: string;
|
|
19
|
+
scriptId: string;
|
|
20
|
+
url: string;
|
|
21
|
+
lineNumber: number;
|
|
22
|
+
columnNumber: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* CDP 堆栈追踪
|
|
26
|
+
*/
|
|
27
|
+
export interface CDPStackTrace {
|
|
28
|
+
callFrames: CDPCallFrame[];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* CDP 请求对象
|
|
32
|
+
*/
|
|
33
|
+
export interface CDPRequest {
|
|
34
|
+
url: string;
|
|
35
|
+
method: string;
|
|
36
|
+
headers: Record<string, string>;
|
|
37
|
+
postData?: string;
|
|
38
|
+
hasPostData?: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* CDP 响应对象
|
|
42
|
+
*/
|
|
43
|
+
export interface CDPResponse {
|
|
44
|
+
url: string;
|
|
45
|
+
status: number;
|
|
46
|
+
statusText: string;
|
|
47
|
+
headers: Record<string, string>;
|
|
48
|
+
mimeType: string;
|
|
49
|
+
connectionReused: boolean;
|
|
50
|
+
connectionId: number;
|
|
51
|
+
encodedDataLength: number;
|
|
52
|
+
securityState: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* CDP Bridge 接口
|
|
56
|
+
*/
|
|
57
|
+
export interface ICDPBridge {
|
|
58
|
+
connect(): Promise<void>;
|
|
59
|
+
disconnect(): void;
|
|
60
|
+
isConnected(): boolean;
|
|
61
|
+
emitRequestWillBeSent(request: RequestData): void;
|
|
62
|
+
emitResponseReceived(requestId: string, request: RequestData, response: ResponseData): void;
|
|
63
|
+
emitLoadingFinished(requestId: string, timing?: TimingData): void;
|
|
64
|
+
emitLoadingFailed(requestId: string, error: ErrorData): void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 获取全局 CDP Bridge 实例
|
|
68
|
+
*/
|
|
69
|
+
export declare function getCDPBridge(): ICDPBridge;
|
|
70
|
+
/**
|
|
71
|
+
* 重置全局 CDP Bridge(用于测试)
|
|
72
|
+
*/
|
|
73
|
+
export declare function resetCDPBridge(): void;
|
|
74
|
+
/**
|
|
75
|
+
* 创建新的 CDP Bridge 实例(用于测试)
|
|
76
|
+
*/
|
|
77
|
+
export declare function createCDPBridge(): ICDPBridge;
|
|
78
|
+
/**
|
|
79
|
+
* 检查 Inspector 是否已启用
|
|
80
|
+
*/
|
|
81
|
+
export declare function isInspectorEnabled(): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* 获取 Inspector URL
|
|
84
|
+
*/
|
|
85
|
+
export declare function getInspectorUrl(): string | undefined;
|
|
86
|
+
//# sourceMappingURL=cdp-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-bridge.d.ts","sourceRoot":"","sources":["../../../src/cdp/cdp-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKhG;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,IAAI,CAAC;IACnB,WAAW,IAAI,OAAO,CAAC;IACvB,qBAAqB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAClD,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5F,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAClE,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9D;AAgRD;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAKzC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAM5C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,SAAS,CAMpD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA;;;;GAIG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 配置管理模块
|
|
3
|
+
*
|
|
4
|
+
* 支持通过环境变量和编程方式配置工具行为
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 工具配置接口
|
|
8
|
+
*/
|
|
9
|
+
export interface Config {
|
|
10
|
+
/** 最大存储请求数量,默认 1000 */
|
|
11
|
+
maxRequests: number;
|
|
12
|
+
/** 最大 body 大小(字节),默认 1MB */
|
|
13
|
+
maxBodySize: number;
|
|
14
|
+
/** 是否拦截 http/https 模块,默认 true */
|
|
15
|
+
interceptHttp: boolean;
|
|
16
|
+
/** 是否拦截 undici/fetch,默认 true */
|
|
17
|
+
interceptUndici: boolean;
|
|
18
|
+
/** 忽略的 URL 模式 */
|
|
19
|
+
ignoreUrls: RegExp[];
|
|
20
|
+
/** 要脱敏的请求头,默认 ['authorization', 'cookie'] */
|
|
21
|
+
redactHeaders: string[];
|
|
22
|
+
/** 是否禁用 body 捕获,默认 false */
|
|
23
|
+
disableBodyCapture: boolean;
|
|
24
|
+
/** 是否自动连接 inspector,默认 true */
|
|
25
|
+
autoConnect: boolean;
|
|
26
|
+
/** 指定 inspector 端口 */
|
|
27
|
+
inspectorPort?: number;
|
|
28
|
+
/** 是否启用 GUI 服务器,默认 true */
|
|
29
|
+
guiEnabled: boolean;
|
|
30
|
+
/** GUI 服务器端口,'auto' 表示自动获取可用端口 */
|
|
31
|
+
guiPort: number | 'auto';
|
|
32
|
+
/** WebSocket 端口,'auto' 表示自动获取可用端口 */
|
|
33
|
+
wsPort: number | 'auto';
|
|
34
|
+
/** GUI 服务器监听地址,默认 '127.0.0.1' */
|
|
35
|
+
guiHost: string;
|
|
36
|
+
/** 是否自动打开浏览器,默认 true */
|
|
37
|
+
autoOpen: boolean;
|
|
38
|
+
/** 是否使用 Puppeteer 打开浏览器,默认 false */
|
|
39
|
+
usePuppeteer: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* 获取当前配置
|
|
43
|
+
*/
|
|
44
|
+
export declare function getConfig(): Readonly<Config>;
|
|
45
|
+
/**
|
|
46
|
+
* 设置配置(合并到当前配置)
|
|
47
|
+
*/
|
|
48
|
+
export declare function setConfig(config: Partial<Config>): void;
|
|
49
|
+
/**
|
|
50
|
+
* 重置配置为默认值
|
|
51
|
+
*/
|
|
52
|
+
export declare function resetConfig(): void;
|
|
53
|
+
/**
|
|
54
|
+
* 获取默认配置(用于测试)
|
|
55
|
+
*/
|
|
56
|
+
export declare function getDefaultConfig(): Readonly<Config>;
|
|
57
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,WAAW,MAAM;IAErB,uBAAuB;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IAGpB,iCAAiC;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,gCAAgC;IAChC,eAAe,EAAE,OAAO,CAAC;IAGzB,iBAAiB;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IAGrB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,4BAA4B;IAC5B,kBAAkB,EAAE,OAAO,CAAC;IAG5B,+BAA+B;IAC/B,WAAW,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IAGvB,2BAA2B;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,kCAAkC;IAClC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,qCAAqC;IACrC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,oCAAoC;IACpC,YAAY,EAAE,OAAO,CAAC;CACvB;AA4GD;;GAEG;AACH,wBAAgB,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,CAE5C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAKvD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAElC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAEnD"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 上下文管理器
|
|
3
|
+
*
|
|
4
|
+
* 使用 AsyncLocalStorage 实现请求追踪上下文
|
|
5
|
+
* 支持跨异步边界传递 TraceID
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 追踪上下文接口
|
|
9
|
+
*/
|
|
10
|
+
export interface TraceContext {
|
|
11
|
+
/** 追踪 ID */
|
|
12
|
+
traceId: string;
|
|
13
|
+
/** 父追踪 ID(用于嵌套追踪) */
|
|
14
|
+
parentTraceId?: string;
|
|
15
|
+
/** 上下文创建时间 */
|
|
16
|
+
startTime: number;
|
|
17
|
+
/** 自定义元数据 */
|
|
18
|
+
metadata?: Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 生成唯一的 TraceID
|
|
22
|
+
*/
|
|
23
|
+
export declare function generateTraceId(): string;
|
|
24
|
+
/**
|
|
25
|
+
* 获取当前追踪上下文
|
|
26
|
+
*/
|
|
27
|
+
export declare function getCurrentContext(): TraceContext | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* 获取当前 TraceID
|
|
30
|
+
*/
|
|
31
|
+
export declare function getCurrentTraceId(): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* 开始新的追踪
|
|
34
|
+
*
|
|
35
|
+
* @param traceId 可选的 TraceID,不提供则自动生成
|
|
36
|
+
* @param metadata 可选的元数据
|
|
37
|
+
* @returns 新的追踪上下文
|
|
38
|
+
*/
|
|
39
|
+
export declare function startTrace(traceId?: string, metadata?: Record<string, unknown>): TraceContext;
|
|
40
|
+
/**
|
|
41
|
+
* 在追踪上下文中运行函数
|
|
42
|
+
*
|
|
43
|
+
* @param context 追踪上下文
|
|
44
|
+
* @param fn 要运行的函数
|
|
45
|
+
* @returns 函数的返回值
|
|
46
|
+
*/
|
|
47
|
+
export declare function runWithContext<T>(context: TraceContext, fn: () => T): T;
|
|
48
|
+
/**
|
|
49
|
+
* 在新的追踪上下文中运行函数
|
|
50
|
+
*
|
|
51
|
+
* @param fn 要运行的函数
|
|
52
|
+
* @param traceId 可选的 TraceID
|
|
53
|
+
* @param metadata 可选的元数据
|
|
54
|
+
* @returns 函数的返回值
|
|
55
|
+
*/
|
|
56
|
+
export declare function runWithTrace<T>(fn: () => T, traceId?: string, metadata?: Record<string, unknown>): T;
|
|
57
|
+
/**
|
|
58
|
+
* 在新的追踪上下文中运行异步函数
|
|
59
|
+
*
|
|
60
|
+
* @param fn 要运行的异步函数
|
|
61
|
+
* @param traceId 可选的 TraceID
|
|
62
|
+
* @param metadata 可选的元数据
|
|
63
|
+
* @returns Promise
|
|
64
|
+
*/
|
|
65
|
+
export declare function runWithTraceAsync<T>(fn: () => Promise<T>, traceId?: string, metadata?: Record<string, unknown>): Promise<T>;
|
|
66
|
+
/**
|
|
67
|
+
* 更新当前上下文的元数据
|
|
68
|
+
*
|
|
69
|
+
* @param metadata 要合并的元数据
|
|
70
|
+
*/
|
|
71
|
+
export declare function updateContextMetadata(metadata: Record<string, unknown>): void;
|
|
72
|
+
/**
|
|
73
|
+
* 获取追踪持续时间(毫秒)
|
|
74
|
+
*/
|
|
75
|
+
export declare function getTraceDuration(): number | undefined;
|
|
76
|
+
/**
|
|
77
|
+
* 创建获取当前 TraceID 的回调函数
|
|
78
|
+
* 用于传递给拦截器
|
|
79
|
+
*/
|
|
80
|
+
export declare function createTraceIdGetter(): () => string | undefined;
|
|
81
|
+
/**
|
|
82
|
+
* ContextManager 对象
|
|
83
|
+
*/
|
|
84
|
+
export declare const ContextManager: {
|
|
85
|
+
generateTraceId: typeof generateTraceId;
|
|
86
|
+
getCurrentContext: typeof getCurrentContext;
|
|
87
|
+
getCurrentTraceId: typeof getCurrentTraceId;
|
|
88
|
+
startTrace: typeof startTrace;
|
|
89
|
+
runWithContext: typeof runWithContext;
|
|
90
|
+
runWithTrace: typeof runWithTrace;
|
|
91
|
+
runWithTraceAsync: typeof runWithTraceAsync;
|
|
92
|
+
updateContextMetadata: typeof updateContextMetadata;
|
|
93
|
+
getTraceDuration: typeof getTraceDuration;
|
|
94
|
+
createTraceIdGetter: typeof createTraceIdGetter;
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=context-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context-manager.d.ts","sourceRoot":"","sources":["../../../src/context/context-manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,YAAY;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,qBAAqB;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAKD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,GAAG,SAAS,CAE5D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,SAAS,CAEtD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,YAAY,CAW7F;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,EAAE,EAAE,MAAM,CAAC,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,CAGH;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,CAAC,EACvC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC,CAGZ;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ7E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAMrD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,MAAM,GAAG,SAAS,CAE9D;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;CAW1B,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 浏览器启动器模块
|
|
3
|
+
*
|
|
4
|
+
* 支持使用系统默认浏览器或 Puppeteer 打开 GUI
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 浏览器启动器配置
|
|
8
|
+
*/
|
|
9
|
+
export interface BrowserLauncherConfig {
|
|
10
|
+
useDefaultBrowser: boolean;
|
|
11
|
+
usePuppeteer: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 浏览器启动器接口
|
|
15
|
+
*/
|
|
16
|
+
export interface IBrowserLauncher {
|
|
17
|
+
open(url: string): Promise<void>;
|
|
18
|
+
close(): Promise<void>;
|
|
19
|
+
isOpen(): boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 获取全局浏览器启动器实例
|
|
23
|
+
*/
|
|
24
|
+
export declare function getBrowserLauncher(): IBrowserLauncher;
|
|
25
|
+
/**
|
|
26
|
+
* 重置全局浏览器启动器(用于测试)
|
|
27
|
+
*/
|
|
28
|
+
export declare function resetBrowserLauncher(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* 创建新的浏览器启动器实例(用于测试)
|
|
31
|
+
*/
|
|
32
|
+
export declare function createBrowserLauncher(): IBrowserLauncher;
|
|
33
|
+
/**
|
|
34
|
+
* 构建带 WebSocket 端口参数的 GUI URL
|
|
35
|
+
*/
|
|
36
|
+
export declare function buildGUIUrl(host: string, guiPort: number, wsPort: number): string;
|
|
37
|
+
/**
|
|
38
|
+
* 浏览器启动选项
|
|
39
|
+
*/
|
|
40
|
+
export interface BrowserLauncherOptions {
|
|
41
|
+
/** 是否使用 Puppeteer */
|
|
42
|
+
usePuppeteer?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 打开浏览器(便捷函数)
|
|
46
|
+
*/
|
|
47
|
+
export declare function openBrowser(url: string, options?: BrowserLauncherOptions): Promise<void>;
|
|
48
|
+
/**
|
|
49
|
+
* 关闭浏览器(便捷函数)
|
|
50
|
+
*/
|
|
51
|
+
export declare function closeBrowser(): Promise<void>;
|
|
52
|
+
//# sourceMappingURL=browser-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-launcher.d.ts","sourceRoot":"","sources":["../../../src/gui/browser-launcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,IAAI,OAAO,CAAC;CACnB;AA8GD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,CAKrD;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC,CAK1D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,gBAAgB,CAExD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,qBAAqB;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB9F;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Event Bridge 模块
|
|
3
|
+
*
|
|
4
|
+
* 连接请求拦截器和 WebSocket Hub,实现事件转发
|
|
5
|
+
* 支持暂停/恢复和清空功能
|
|
6
|
+
*/
|
|
7
|
+
import type { RequestData, ResponseData, ErrorData } from '../store/ring-buffer.js';
|
|
8
|
+
import { type IWebSocketHub } from './websocket-hub.js';
|
|
9
|
+
/**
|
|
10
|
+
* Event Bridge 接口
|
|
11
|
+
*/
|
|
12
|
+
export interface IEventBridge {
|
|
13
|
+
emitRequestStart(request: RequestData): void;
|
|
14
|
+
emitRequestComplete(requestId: string, response: ResponseData): void;
|
|
15
|
+
emitRequestError(requestId: string, error: ErrorData): void;
|
|
16
|
+
pause(): void;
|
|
17
|
+
resume(): void;
|
|
18
|
+
isPaused(): boolean;
|
|
19
|
+
clear(): void;
|
|
20
|
+
start(): void;
|
|
21
|
+
stop(): void;
|
|
22
|
+
isRunning(): boolean;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 获取全局 Event Bridge 实例
|
|
26
|
+
*/
|
|
27
|
+
export declare function getEventBridge(): IEventBridge;
|
|
28
|
+
/**
|
|
29
|
+
* 重置全局 Event Bridge(用于测试)
|
|
30
|
+
*/
|
|
31
|
+
export declare function resetEventBridge(): void;
|
|
32
|
+
/**
|
|
33
|
+
* 创建新的 Event Bridge 实例(用于测试)
|
|
34
|
+
*/
|
|
35
|
+
export declare function createEventBridge(wsHub?: IWebSocketHub): IEventBridge;
|
|
36
|
+
//# sourceMappingURL=event-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-bridge.d.ts","sourceRoot":"","sources":["../../../src/gui/event-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpF,OAAO,EAOL,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,MAAM,WAAW,YAAY;IAE3B,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC7C,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IAG5D,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;IACf,QAAQ,IAAI,OAAO,CAAC;IACpB,KAAK,IAAI,IAAI,CAAC;IAGd,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,SAAS,IAAI,OAAO,CAAC;CACtB;AAsLD;;GAEG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAK7C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,YAAY,CAErE"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 端口工具模块
|
|
3
|
+
*
|
|
4
|
+
* 提供获取可用端口的功能
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* 检查端口是否可用
|
|
8
|
+
*/
|
|
9
|
+
export declare function isPortAvailable(port: number, host?: string): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* 获取可用端口
|
|
12
|
+
*
|
|
13
|
+
* @param preferredPort 首选端口,如果为 'auto' 则自动获取
|
|
14
|
+
* @param host 监听地址
|
|
15
|
+
* @param maxAttempts 最大尝试次数
|
|
16
|
+
* @returns 可用端口号
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAvailablePort(preferredPort?: number | 'auto', host?: string, maxAttempts?: number): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* 获取随机可用端口
|
|
21
|
+
*
|
|
22
|
+
* 通过让系统分配端口来获取可用端口
|
|
23
|
+
*/
|
|
24
|
+
export declare function getRandomAvailablePort(host?: string): Promise<number>;
|
|
25
|
+
//# sourceMappingURL=port-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-utils.d.ts","sourceRoot":"","sources":["../../../src/gui/port-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAgB1F;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,aAAa,GAAE,MAAM,GAAG,MAAe,EACvC,IAAI,GAAE,MAAoB,EAC1B,WAAW,GAAE,MAAW,GACvB,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBlF"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GUI Server 模块
|
|
3
|
+
*
|
|
4
|
+
* 提供 HTTP 静态文件服务和 WebSocket 实时通信
|
|
5
|
+
*/
|
|
6
|
+
import { type IWebSocketHub } from './websocket-hub.js';
|
|
7
|
+
import { type IEventBridge } from './event-bridge.js';
|
|
8
|
+
/**
|
|
9
|
+
* GUI 服务器配置
|
|
10
|
+
*/
|
|
11
|
+
export interface GUIServerConfig {
|
|
12
|
+
guiPort: number | 'auto';
|
|
13
|
+
wsPort: number | 'auto';
|
|
14
|
+
host: string;
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
autoOpen: boolean;
|
|
17
|
+
usePuppeteer: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* GUI 服务器接口
|
|
21
|
+
*/
|
|
22
|
+
export interface IGUIServer {
|
|
23
|
+
start(options?: {
|
|
24
|
+
guiPort?: number | 'auto';
|
|
25
|
+
wsPort?: number | 'auto';
|
|
26
|
+
host?: string;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
guiPort: number;
|
|
29
|
+
wsPort: number;
|
|
30
|
+
url: string;
|
|
31
|
+
}>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
isRunning(): boolean;
|
|
34
|
+
getUrl(): string | null;
|
|
35
|
+
getGuiPort(): number | null;
|
|
36
|
+
getWsPort(): number | null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 获取全局 GUI Server 实例
|
|
40
|
+
*/
|
|
41
|
+
export declare function getGUIServer(): IGUIServer;
|
|
42
|
+
/**
|
|
43
|
+
* 重置全局 GUI Server(用于测试)
|
|
44
|
+
*/
|
|
45
|
+
export declare function resetGUIServer(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 创建新的 GUI Server 实例(用于测试)
|
|
48
|
+
*/
|
|
49
|
+
export declare function createGUIServer(wsHub?: IWebSocketHub, eventBridge?: IEventBridge, host?: string): IGUIServer;
|
|
50
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gui/server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAmB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAMtE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,OAAO,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,IAAI,OAAO,CAAC;IACrB,MAAM,IAAI,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,IAAI,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,IAAI,MAAM,GAAG,IAAI,CAAC;CAC5B;AAkOD;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,CAKzC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAKpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,CAAC,EAAE,aAAa,EACrB,WAAW,CAAC,EAAE,YAAY,EAC1B,IAAI,CAAC,EAAE,MAAM,GACZ,UAAU,CAEZ"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WebSocket Hub 模块
|
|
3
|
+
*
|
|
4
|
+
* 管理 WebSocket 客户端连接,广播消息到所有连接的客户端
|
|
5
|
+
*/
|
|
6
|
+
import type { RequestData, ResponseData, ErrorData } from '../store/ring-buffer.js';
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket 消息类型
|
|
9
|
+
*/
|
|
10
|
+
export type WSMessageType = 'request:start' | 'request:complete' | 'request:error' | 'requests:initial' | 'requests:clear' | 'control:pause' | 'control:resume';
|
|
11
|
+
/**
|
|
12
|
+
* WebSocket 消息
|
|
13
|
+
*/
|
|
14
|
+
export interface WSMessage {
|
|
15
|
+
type: WSMessageType;
|
|
16
|
+
payload: unknown;
|
|
17
|
+
timestamp: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* WebSocket Hub 接口
|
|
21
|
+
*/
|
|
22
|
+
export interface IWebSocketHub {
|
|
23
|
+
start(port: number, host?: string): Promise<number>;
|
|
24
|
+
stop(): Promise<void>;
|
|
25
|
+
broadcast(message: WSMessage): void;
|
|
26
|
+
send(clientId: string, message: WSMessage): void;
|
|
27
|
+
getClientCount(): number;
|
|
28
|
+
getClientIds(): string[];
|
|
29
|
+
isRunning(): boolean;
|
|
30
|
+
getPort(): number | null;
|
|
31
|
+
onClientConnect(callback: (clientId: string) => void): void;
|
|
32
|
+
onClientDisconnect(callback: (clientId: string) => void): void;
|
|
33
|
+
onClientMessage(callback: (clientId: string, message: WSMessage) => void): void;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* 获取全局 WebSocket Hub 实例
|
|
37
|
+
*/
|
|
38
|
+
export declare function getWebSocketHub(): IWebSocketHub;
|
|
39
|
+
/**
|
|
40
|
+
* 重置全局 WebSocket Hub(用于测试)
|
|
41
|
+
*/
|
|
42
|
+
export declare function resetWebSocketHub(): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* 创建新的 WebSocket Hub 实例(用于测试)
|
|
45
|
+
*/
|
|
46
|
+
export declare function createWebSocketHub(): IWebSocketHub;
|
|
47
|
+
/**
|
|
48
|
+
* 创建请求开始消息
|
|
49
|
+
*/
|
|
50
|
+
export declare function createRequestStartMessage(request: RequestData): WSMessage;
|
|
51
|
+
/**
|
|
52
|
+
* 创建请求完成消息
|
|
53
|
+
*/
|
|
54
|
+
export declare function createRequestCompleteMessage(requestId: string, response: ResponseData): WSMessage;
|
|
55
|
+
/**
|
|
56
|
+
* 创建请求错误消息
|
|
57
|
+
*/
|
|
58
|
+
export declare function createRequestErrorMessage(requestId: string, error: ErrorData): WSMessage;
|
|
59
|
+
/**
|
|
60
|
+
* 创建初始数据消息
|
|
61
|
+
*/
|
|
62
|
+
export declare function createInitialDataMessage(requests: RequestData[]): WSMessage;
|
|
63
|
+
/**
|
|
64
|
+
* 创建清空请求消息
|
|
65
|
+
*/
|
|
66
|
+
export declare function createClearMessage(): WSMessage;
|
|
67
|
+
//# sourceMappingURL=websocket-hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-hub.d.ts","sourceRoot":"","sources":["../../../src/gui/websocket-hub.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpF;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,eAAe,GACf,kBAAkB,GAClB,eAAe,GACf,kBAAkB,GAClB,gBAAgB,GAChB,eAAe,GACf,gBAAgB,CAAC;AAErB;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,SAAS,CAAC,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IACpC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CAAC;IACjD,cAAc,IAAI,MAAM,CAAC;IACzB,YAAY,IAAI,MAAM,EAAE,CAAC;IACzB,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,IAAI,MAAM,GAAG,IAAI,CAAC;IAGzB,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5D,kBAAkB,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC/D,eAAe,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,KAAK,IAAI,GAAG,IAAI,CAAC;CACjF;AAgOD;;GAEG;AACH,wBAAgB,eAAe,IAAI,aAAa,CAK/C;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAKvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,aAAa,CAElD;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAezE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,SAAS,CAajG;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAUxF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,CAwB3E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,CAM9C"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node Network DevTools
|
|
3
|
+
*
|
|
4
|
+
* Node.js 网络请求监听工具,桥接到 Chrome DevTools Network 面板
|
|
5
|
+
*/
|
|
6
|
+
export { getConfig, setConfig, resetConfig, type Config } from './config.js';
|
|
7
|
+
export { getRequestStore, resetRequestStore, createRequestStore, type IRequestStore, type RequestData, type ResponseData, type ErrorData, type TimingData, type QueryFilter, } from './store/ring-buffer.js';
|
|
8
|
+
export { generateTraceId, getCurrentTraceId, getCurrentContext, startTrace, runWithContext, runWithTrace, runWithTraceAsync, updateContextMetadata, getTraceDuration, createTraceIdGetter, ContextManager, type TraceContext, } from './context/context-manager.js';
|
|
9
|
+
export { HttpPatcher } from './interceptors/http-patcher.js';
|
|
10
|
+
export { UndiciPatcher } from './interceptors/undici-patcher.js';
|
|
11
|
+
export { getCDPBridge, resetCDPBridge, createCDPBridge, isInspectorEnabled, getInspectorUrl, type ICDPBridge, type CDPCallFrame, type CDPStackTrace, type CDPRequest, type CDPResponse, } from './cdp/cdp-bridge.js';
|
|
12
|
+
export { NextJsAdapter, isNextJsEnvironment, getCurrentRoute, runWithRoute, runWithRouteAsync, extractNextJsOptions, extractNextJsMetadata, createInstrumentationConfig, type NextJsMetadata, type NextJsFetchOptions, } from './adapters/nextjs.js';
|
|
13
|
+
export { getGUIServer, resetGUIServer, createGUIServer, type IGUIServer, type GUIServerConfig, } from './gui/server.js';
|
|
14
|
+
export { getWebSocketHub, resetWebSocketHub, createWebSocketHub, createRequestStartMessage, createRequestCompleteMessage, createRequestErrorMessage, createInitialDataMessage, createClearMessage, type IWebSocketHub, type WSMessage, type WSMessageType, } from './gui/websocket-hub.js';
|
|
15
|
+
export { getEventBridge, resetEventBridge, createEventBridge, type IEventBridge, } from './gui/event-bridge.js';
|
|
16
|
+
export { openBrowser, closeBrowser, type BrowserLauncherOptions, } from './gui/browser-launcher.js';
|
|
17
|
+
export { getAvailablePort, isPortAvailable, } from './gui/port-utils.js';
|
|
18
|
+
/**
|
|
19
|
+
* 快速初始化函数
|
|
20
|
+
*
|
|
21
|
+
* 一键安装所有拦截器并连接 CDP Bridge
|
|
22
|
+
*/
|
|
23
|
+
export declare function install(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* 启动 GUI 服务器
|
|
26
|
+
*
|
|
27
|
+
* @param options - GUI 服务器配置
|
|
28
|
+
* @returns GUI 服务器信息
|
|
29
|
+
*/
|
|
30
|
+
export declare function startGUI(options?: {
|
|
31
|
+
guiPort?: number | 'auto';
|
|
32
|
+
wsPort?: number | 'auto';
|
|
33
|
+
host?: string;
|
|
34
|
+
autoOpen?: boolean;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
url: string;
|
|
37
|
+
guiPort: number;
|
|
38
|
+
wsPort: number;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* 停止 GUI 服务器
|
|
42
|
+
*/
|
|
43
|
+
export declare function stopGUI(): Promise<void>;
|
|
44
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,KAAK,MAAM,EACZ,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGjE,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,eAAe,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,WAAW,GACjB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,qBAAqB,EACrB,2BAA2B,EAC3B,KAAK,cAAc,EACnB,KAAK,kBAAkB,GACxB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,eAAe,EACf,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,aAAa,GACnB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,YAAY,GAClB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,WAAW,EACX,YAAY,EACZ,KAAK,sBAAsB,GAC5B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,gBAAgB,EAChB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAE7B;;;;GAIG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAoB7C;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,OAAO,CAAC,EAAE;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAsB5D;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAY7C"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP 模块拦截器
|
|
3
|
+
*
|
|
4
|
+
* 使用 @mswjs/interceptors 库拦截 HTTP 请求
|
|
5
|
+
* 这是一个专门为此设计的库,支持 ESM 和 CJS
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 设置获取 TraceID 的回调
|
|
9
|
+
*/
|
|
10
|
+
export declare function setTraceIdGetter(getter: () => string | undefined): void;
|
|
11
|
+
/**
|
|
12
|
+
* 安装 HTTP 拦截器
|
|
13
|
+
*/
|
|
14
|
+
export declare function install(): void;
|
|
15
|
+
/**
|
|
16
|
+
* 卸载 HTTP 拦截器
|
|
17
|
+
*/
|
|
18
|
+
export declare function uninstall(): void;
|
|
19
|
+
/**
|
|
20
|
+
* 检查是否已安装
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInstalled(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* HttpPatcher 类(用于导出)
|
|
25
|
+
*/
|
|
26
|
+
export declare const HttpPatcher: {
|
|
27
|
+
install: typeof install;
|
|
28
|
+
uninstall: typeof uninstall;
|
|
29
|
+
isInstalled: typeof isInstalled;
|
|
30
|
+
setTraceIdGetter: typeof setTraceIdGetter;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=http-patcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-patcher.d.ts","sourceRoot":"","sources":["../../../src/interceptors/http-patcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAEvE;AAkDD;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAwH9B;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAOhC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;CAKvB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Undici/Fetch 拦截器
|
|
3
|
+
*
|
|
4
|
+
* 拦截 Node.js 原生 fetch API(基于 undici)
|
|
5
|
+
* 使用 Agent.compose() 方法添加拦截器
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* 设置获取 TraceID 的回调
|
|
9
|
+
*/
|
|
10
|
+
export declare function setTraceIdGetter(getter: () => string | undefined): void;
|
|
11
|
+
/**
|
|
12
|
+
* 安装 Undici/Fetch 拦截器
|
|
13
|
+
*/
|
|
14
|
+
export declare function install(): void;
|
|
15
|
+
/**
|
|
16
|
+
* 卸载 Undici/Fetch 拦截器
|
|
17
|
+
*/
|
|
18
|
+
export declare function uninstall(): void;
|
|
19
|
+
/**
|
|
20
|
+
* 检查是否已安装
|
|
21
|
+
*/
|
|
22
|
+
export declare function isInstalled(): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* 检查 undici 是否可用
|
|
25
|
+
*/
|
|
26
|
+
export declare function isUndiciAvailable(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* UndiciPatcher 对象
|
|
29
|
+
*/
|
|
30
|
+
export declare const UndiciPatcher: {
|
|
31
|
+
install: typeof install;
|
|
32
|
+
uninstall: typeof uninstall;
|
|
33
|
+
isInstalled: typeof isInstalled;
|
|
34
|
+
isUndiciAvailable: typeof isUndiciAvailable;
|
|
35
|
+
setTraceIdGetter: typeof setTraceIdGetter;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=undici-patcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"undici-patcher.d.ts","sourceRoot":"","sources":["../../../src/interceptors/undici-patcher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAEvE;AA8QD;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CA8B9B;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAQhC;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAErC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAK3C;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;CAMzB,CAAC"}
|