@mt0926/node-network-devtools 0.2.0 → 0.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +134 -109
  2. package/README.zh-CN.md +62 -108
  3. package/dist/cjs/adapters/axios.js +2 -0
  4. package/dist/cjs/adapters/axios.js.map +1 -0
  5. package/dist/cjs/adapters/nextjs.js +133 -0
  6. package/dist/cjs/adapters/nextjs.js.map +1 -0
  7. package/dist/cjs/config.js +150 -0
  8. package/dist/cjs/config.js.map +1 -0
  9. package/dist/cjs/context/context-manager.js +139 -0
  10. package/dist/cjs/context/context-manager.js.map +1 -0
  11. package/dist/cjs/gui/browser-detector.js +263 -0
  12. package/dist/cjs/gui/browser-detector.js.map +1 -0
  13. package/dist/cjs/gui/browser-launcher.js +365 -0
  14. package/dist/cjs/gui/browser-launcher.js.map +1 -0
  15. package/dist/cjs/gui/event-bridge.js +197 -0
  16. package/dist/cjs/gui/event-bridge.js.map +1 -0
  17. package/dist/cjs/gui/port-utils.js +85 -0
  18. package/dist/cjs/gui/port-utils.js.map +1 -0
  19. package/dist/cjs/gui/server.js +267 -0
  20. package/dist/cjs/gui/server.js.map +1 -0
  21. package/dist/cjs/gui/websocket-hub.js +336 -0
  22. package/dist/cjs/gui/websocket-hub.js.map +1 -0
  23. package/dist/cjs/index.js +170 -0
  24. package/dist/cjs/index.js.map +1 -0
  25. package/dist/cjs/interceptors/http-patcher.js +275 -0
  26. package/dist/cjs/interceptors/http-patcher.js.map +1 -0
  27. package/dist/cjs/interceptors/undici-patcher.js +362 -0
  28. package/dist/cjs/interceptors/undici-patcher.js.map +1 -0
  29. package/dist/cjs/package.json +3 -0
  30. package/dist/cjs/register.js +95 -0
  31. package/dist/cjs/register.js.map +1 -0
  32. package/dist/cjs/store/ring-buffer.js +241 -0
  33. package/dist/cjs/store/ring-buffer.js.map +1 -0
  34. package/dist/cjs/test-setup.js +8 -0
  35. package/dist/cjs/test-setup.js.map +1 -0
  36. package/dist/cjs/utils/module-compat.js +83 -0
  37. package/dist/cjs/utils/module-compat.js.map +1 -0
  38. package/dist/esm/gui/server.js +41 -6
  39. package/dist/esm/gui/server.js.map +1 -1
  40. package/dist/esm/index.js +1 -1
  41. package/dist/esm/interceptors/undici-patcher.js +9 -4
  42. package/dist/esm/interceptors/undici-patcher.js.map +1 -1
  43. package/dist/esm/utils/module-compat.js +78 -0
  44. package/dist/esm/utils/module-compat.js.map +1 -0
  45. package/dist/gui/assets/index.css +1 -1
  46. package/dist/gui/assets/index.js +10 -10
  47. package/dist/types/gui/server.d.ts.map +1 -1
  48. package/dist/types/index.d.ts +1 -1
  49. package/dist/types/interceptors/undici-patcher.d.ts.map +1 -1
  50. package/dist/types/utils/module-compat.d.ts +34 -0
  51. package/dist/types/utils/module-compat.d.ts.map +1 -0
  52. package/package.json +42 -35
  53. package/dist/esm/cli.js +0 -203
  54. package/dist/esm/cli.js.map +0 -1
  55. package/dist/types/cli.d.ts +0 -8
  56. package/dist/types/cli.d.ts.map +0 -1
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Node Network DevTools
4
+ *
5
+ * Node.js 网络请求监听工具,通过 Web GUI 实时监控请求
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.isPortAvailable = exports.getAvailablePort = exports.closeBrowser = exports.openBrowser = exports.createEventBridge = exports.resetEventBridge = exports.getEventBridge = exports.createClearMessage = exports.createInitialDataMessage = exports.createRequestErrorMessage = exports.createRequestCompleteMessage = exports.createRequestStartMessage = exports.createWebSocketHub = exports.resetWebSocketHub = exports.getWebSocketHub = exports.createGUIServer = exports.resetGUIServer = exports.getGUIServer = exports.createInstrumentationConfig = exports.extractNextJsMetadata = exports.extractNextJsOptions = exports.runWithRouteAsync = exports.runWithRoute = exports.getCurrentRoute = exports.isNextJsEnvironment = exports.NextJsAdapter = exports.UndiciPatcher = exports.HttpPatcher = exports.ContextManager = exports.createTraceIdGetter = exports.getTraceDuration = exports.updateContextMetadata = exports.runWithTraceAsync = exports.runWithTrace = exports.runWithContext = exports.startTrace = exports.getCurrentContext = exports.getCurrentTraceId = exports.generateTraceId = exports.createRequestStore = exports.resetRequestStore = exports.getRequestStore = exports.resetConfig = exports.setConfig = exports.getConfig = void 0;
42
+ exports.install = install;
43
+ exports.startGUI = startGUI;
44
+ exports.stopGUI = stopGUI;
45
+ // 配置模块
46
+ var config_js_1 = require("./config.js");
47
+ Object.defineProperty(exports, "getConfig", { enumerable: true, get: function () { return config_js_1.getConfig; } });
48
+ Object.defineProperty(exports, "setConfig", { enumerable: true, get: function () { return config_js_1.setConfig; } });
49
+ Object.defineProperty(exports, "resetConfig", { enumerable: true, get: function () { return config_js_1.resetConfig; } });
50
+ // 请求存储
51
+ var ring_buffer_js_1 = require("./store/ring-buffer.js");
52
+ Object.defineProperty(exports, "getRequestStore", { enumerable: true, get: function () { return ring_buffer_js_1.getRequestStore; } });
53
+ Object.defineProperty(exports, "resetRequestStore", { enumerable: true, get: function () { return ring_buffer_js_1.resetRequestStore; } });
54
+ Object.defineProperty(exports, "createRequestStore", { enumerable: true, get: function () { return ring_buffer_js_1.createRequestStore; } });
55
+ // 上下文管理
56
+ var context_manager_js_1 = require("./context/context-manager.js");
57
+ Object.defineProperty(exports, "generateTraceId", { enumerable: true, get: function () { return context_manager_js_1.generateTraceId; } });
58
+ Object.defineProperty(exports, "getCurrentTraceId", { enumerable: true, get: function () { return context_manager_js_1.getCurrentTraceId; } });
59
+ Object.defineProperty(exports, "getCurrentContext", { enumerable: true, get: function () { return context_manager_js_1.getCurrentContext; } });
60
+ Object.defineProperty(exports, "startTrace", { enumerable: true, get: function () { return context_manager_js_1.startTrace; } });
61
+ Object.defineProperty(exports, "runWithContext", { enumerable: true, get: function () { return context_manager_js_1.runWithContext; } });
62
+ Object.defineProperty(exports, "runWithTrace", { enumerable: true, get: function () { return context_manager_js_1.runWithTrace; } });
63
+ Object.defineProperty(exports, "runWithTraceAsync", { enumerable: true, get: function () { return context_manager_js_1.runWithTraceAsync; } });
64
+ Object.defineProperty(exports, "updateContextMetadata", { enumerable: true, get: function () { return context_manager_js_1.updateContextMetadata; } });
65
+ Object.defineProperty(exports, "getTraceDuration", { enumerable: true, get: function () { return context_manager_js_1.getTraceDuration; } });
66
+ Object.defineProperty(exports, "createTraceIdGetter", { enumerable: true, get: function () { return context_manager_js_1.createTraceIdGetter; } });
67
+ Object.defineProperty(exports, "ContextManager", { enumerable: true, get: function () { return context_manager_js_1.ContextManager; } });
68
+ // HTTP 拦截器
69
+ var http_patcher_js_1 = require("./interceptors/http-patcher.js");
70
+ Object.defineProperty(exports, "HttpPatcher", { enumerable: true, get: function () { return http_patcher_js_1.HttpPatcher; } });
71
+ // Undici/Fetch 拦截器
72
+ var undici_patcher_js_1 = require("./interceptors/undici-patcher.js");
73
+ Object.defineProperty(exports, "UndiciPatcher", { enumerable: true, get: function () { return undici_patcher_js_1.UndiciPatcher; } });
74
+ // Next.js 适配器
75
+ var nextjs_js_1 = require("./adapters/nextjs.js");
76
+ Object.defineProperty(exports, "NextJsAdapter", { enumerable: true, get: function () { return nextjs_js_1.NextJsAdapter; } });
77
+ Object.defineProperty(exports, "isNextJsEnvironment", { enumerable: true, get: function () { return nextjs_js_1.isNextJsEnvironment; } });
78
+ Object.defineProperty(exports, "getCurrentRoute", { enumerable: true, get: function () { return nextjs_js_1.getCurrentRoute; } });
79
+ Object.defineProperty(exports, "runWithRoute", { enumerable: true, get: function () { return nextjs_js_1.runWithRoute; } });
80
+ Object.defineProperty(exports, "runWithRouteAsync", { enumerable: true, get: function () { return nextjs_js_1.runWithRouteAsync; } });
81
+ Object.defineProperty(exports, "extractNextJsOptions", { enumerable: true, get: function () { return nextjs_js_1.extractNextJsOptions; } });
82
+ Object.defineProperty(exports, "extractNextJsMetadata", { enumerable: true, get: function () { return nextjs_js_1.extractNextJsMetadata; } });
83
+ Object.defineProperty(exports, "createInstrumentationConfig", { enumerable: true, get: function () { return nextjs_js_1.createInstrumentationConfig; } });
84
+ // GUI 服务器
85
+ var server_js_1 = require("./gui/server.js");
86
+ Object.defineProperty(exports, "getGUIServer", { enumerable: true, get: function () { return server_js_1.getGUIServer; } });
87
+ Object.defineProperty(exports, "resetGUIServer", { enumerable: true, get: function () { return server_js_1.resetGUIServer; } });
88
+ Object.defineProperty(exports, "createGUIServer", { enumerable: true, get: function () { return server_js_1.createGUIServer; } });
89
+ // WebSocket Hub
90
+ var websocket_hub_js_1 = require("./gui/websocket-hub.js");
91
+ Object.defineProperty(exports, "getWebSocketHub", { enumerable: true, get: function () { return websocket_hub_js_1.getWebSocketHub; } });
92
+ Object.defineProperty(exports, "resetWebSocketHub", { enumerable: true, get: function () { return websocket_hub_js_1.resetWebSocketHub; } });
93
+ Object.defineProperty(exports, "createWebSocketHub", { enumerable: true, get: function () { return websocket_hub_js_1.createWebSocketHub; } });
94
+ Object.defineProperty(exports, "createRequestStartMessage", { enumerable: true, get: function () { return websocket_hub_js_1.createRequestStartMessage; } });
95
+ Object.defineProperty(exports, "createRequestCompleteMessage", { enumerable: true, get: function () { return websocket_hub_js_1.createRequestCompleteMessage; } });
96
+ Object.defineProperty(exports, "createRequestErrorMessage", { enumerable: true, get: function () { return websocket_hub_js_1.createRequestErrorMessage; } });
97
+ Object.defineProperty(exports, "createInitialDataMessage", { enumerable: true, get: function () { return websocket_hub_js_1.createInitialDataMessage; } });
98
+ Object.defineProperty(exports, "createClearMessage", { enumerable: true, get: function () { return websocket_hub_js_1.createClearMessage; } });
99
+ // Event Bridge
100
+ var event_bridge_js_1 = require("./gui/event-bridge.js");
101
+ Object.defineProperty(exports, "getEventBridge", { enumerable: true, get: function () { return event_bridge_js_1.getEventBridge; } });
102
+ Object.defineProperty(exports, "resetEventBridge", { enumerable: true, get: function () { return event_bridge_js_1.resetEventBridge; } });
103
+ Object.defineProperty(exports, "createEventBridge", { enumerable: true, get: function () { return event_bridge_js_1.createEventBridge; } });
104
+ // 浏览器启动器
105
+ var browser_launcher_js_1 = require("./gui/browser-launcher.js");
106
+ Object.defineProperty(exports, "openBrowser", { enumerable: true, get: function () { return browser_launcher_js_1.openBrowser; } });
107
+ Object.defineProperty(exports, "closeBrowser", { enumerable: true, get: function () { return browser_launcher_js_1.closeBrowser; } });
108
+ // 端口工具
109
+ var port_utils_js_1 = require("./gui/port-utils.js");
110
+ Object.defineProperty(exports, "getAvailablePort", { enumerable: true, get: function () { return port_utils_js_1.getAvailablePort; } });
111
+ Object.defineProperty(exports, "isPortAvailable", { enumerable: true, get: function () { return port_utils_js_1.isPortAvailable; } });
112
+ /**
113
+ * 快速初始化函数
114
+ *
115
+ * 一键安装所有拦截器
116
+ */
117
+ async function install() {
118
+ const { getConfig } = await Promise.resolve().then(() => __importStar(require('./config.js')));
119
+ const { HttpPatcher } = await Promise.resolve().then(() => __importStar(require('./interceptors/http-patcher.js')));
120
+ const { UndiciPatcher } = await Promise.resolve().then(() => __importStar(require('./interceptors/undici-patcher.js')));
121
+ const config = getConfig();
122
+ if (config.interceptHttp) {
123
+ HttpPatcher.install();
124
+ }
125
+ if (config.interceptUndici) {
126
+ UndiciPatcher.install();
127
+ }
128
+ }
129
+ /**
130
+ * 启动 GUI 服务器
131
+ *
132
+ * @param options - GUI 服务器配置
133
+ * @returns GUI 服务器信息
134
+ */
135
+ async function startGUI(options) {
136
+ const { getConfig } = await Promise.resolve().then(() => __importStar(require('./config.js')));
137
+ const { getGUIServer } = await Promise.resolve().then(() => __importStar(require('./gui/server.js')));
138
+ const { getEventBridge } = await Promise.resolve().then(() => __importStar(require('./gui/event-bridge.js')));
139
+ const { openBrowser } = await Promise.resolve().then(() => __importStar(require('./gui/browser-launcher.js')));
140
+ const config = getConfig();
141
+ const guiServer = getGUIServer();
142
+ const result = await guiServer.start({
143
+ guiPort: options?.guiPort ?? 'auto',
144
+ wsPort: options?.wsPort ?? 'auto',
145
+ host: options?.host ?? '127.0.0.1',
146
+ });
147
+ // 启动 Event Bridge
148
+ const eventBridge = getEventBridge();
149
+ eventBridge.start();
150
+ // 自动打开浏览器(优先使用 options,否则使用配置)
151
+ const shouldAutoOpen = options?.autoOpen !== undefined ? options.autoOpen : config.autoOpen;
152
+ if (shouldAutoOpen) {
153
+ await openBrowser(result.url);
154
+ }
155
+ return result;
156
+ }
157
+ /**
158
+ * 停止 GUI 服务器
159
+ */
160
+ async function stopGUI() {
161
+ const { getGUIServer } = await Promise.resolve().then(() => __importStar(require('./gui/server.js')));
162
+ const { getEventBridge } = await Promise.resolve().then(() => __importStar(require('./gui/event-bridge.js')));
163
+ const { closeBrowser } = await Promise.resolve().then(() => __importStar(require('./gui/browser-launcher.js')));
164
+ const eventBridge = getEventBridge();
165
+ eventBridge.stop();
166
+ const guiServer = getGUIServer();
167
+ await guiServer.stop();
168
+ await closeBrowser();
169
+ }
170
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ /**
3
+ * HTTP 模块拦截器
4
+ *
5
+ * 使用 @mswjs/interceptors 库拦截 HTTP 请求
6
+ * 这是一个专门为此设计的库,支持 ESM 和 CJS
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.HttpPatcher = void 0;
10
+ exports.setTraceIdGetter = setTraceIdGetter;
11
+ exports.install = install;
12
+ exports.uninstall = uninstall;
13
+ exports.isInstalled = isInstalled;
14
+ const ClientRequest_1 = require("@mswjs/interceptors/ClientRequest");
15
+ const nanoid_1 = require("nanoid");
16
+ const ring_buffer_js_1 = require("../store/ring-buffer.js");
17
+ const config_js_1 = require("../config.js");
18
+ const event_bridge_js_1 = require("../gui/event-bridge.js");
19
+ let installed = false;
20
+ let interceptor = null;
21
+ // 用于获取当前 TraceID 的回调(由 ContextManager 设置)
22
+ let getTraceIdCallback = null;
23
+ /**
24
+ * 设置获取 TraceID 的回调
25
+ */
26
+ function setTraceIdGetter(getter) {
27
+ getTraceIdCallback = getter;
28
+ }
29
+ /**
30
+ * 生成请求 ID
31
+ */
32
+ function generateRequestId() {
33
+ return `req_${(0, nanoid_1.nanoid)(12)}`;
34
+ }
35
+ /**
36
+ * 捕获堆栈追踪
37
+ */
38
+ function captureStackTrace() {
39
+ const err = new Error();
40
+ const stack = err.stack || '';
41
+ // 过滤掉内部栈帧
42
+ const lines = stack.split('\n');
43
+ const filteredLines = lines.filter(line => {
44
+ if (line.trim().startsWith('Error'))
45
+ return false;
46
+ if (line.includes('http-patcher'))
47
+ return false;
48
+ if (line.includes('node:http'))
49
+ return false;
50
+ if (line.includes('node:https'))
51
+ return false;
52
+ if (line.includes('node:_http'))
53
+ return false;
54
+ if (line.includes('@mswjs/interceptors'))
55
+ return false;
56
+ return true;
57
+ });
58
+ return filteredLines.join('\n');
59
+ }
60
+ /**
61
+ * 将 headers 转换为 Record 格式
62
+ */
63
+ function headersToRecord(headers) {
64
+ const result = {};
65
+ headers.forEach((value, key) => {
66
+ result[key.toLowerCase()] = value;
67
+ });
68
+ return result;
69
+ }
70
+ // 存储请求元数据
71
+ const requestMetadata = new Map();
72
+ /**
73
+ * 安装 HTTP 拦截器
74
+ */
75
+ function install() {
76
+ if (installed) {
77
+ console.log('[http-patcher] ⚠️ HTTP 拦截器已经安装,跳过');
78
+ return;
79
+ }
80
+ console.log('[http-patcher] 🔧 开始安装 HTTP 拦截器...');
81
+ // 🔧 Monkey-patch URL 构造函数来捕获 axios 代理场景的错误
82
+ const OriginalURL = globalThis.URL;
83
+ const urlCreationErrors = new WeakSet();
84
+ globalThis.URL = function PatchedURL(url, base) {
85
+ try {
86
+ return new OriginalURL(url, base);
87
+ }
88
+ catch (error) {
89
+ // 检测是否是 axios 代理场景导致的 URL 错误
90
+ // 模式:http://proxy-host:port/http://target-host/path
91
+ const duplicateUrlPattern = /^(https?:\/\/[^\/]+?)(https?:\/\/.+)$/;
92
+ const match = url.match(duplicateUrlPattern);
93
+ if (match) {
94
+ const targetUrl = match[2];
95
+ console.log('[http-patcher] 🔧 检测到 axios 代理 URL 错误,自动修复:');
96
+ console.log(' 错误 URL:', url);
97
+ console.log(' 修复为:', targetUrl);
98
+ // 使用目标 URL 重新创建
99
+ const fixedUrl = new OriginalURL(targetUrl, base);
100
+ urlCreationErrors.add(fixedUrl);
101
+ return fixedUrl;
102
+ }
103
+ // 其他错误继续抛出
104
+ throw error;
105
+ }
106
+ };
107
+ // 保留 URL 的静态方法和属性
108
+ Object.setPrototypeOf(globalThis.URL, OriginalURL);
109
+ Object.setPrototypeOf(globalThis.URL.prototype, OriginalURL.prototype);
110
+ interceptor = new ClientRequest_1.ClientRequestInterceptor();
111
+ // 监听请求事件
112
+ interceptor.on('request', async ({ request, requestId }) => {
113
+ const config = (0, config_js_1.getConfig)();
114
+ let url = request.url;
115
+ // 🔍 调试日志:HTTP 拦截器
116
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
117
+ console.log('[http-patcher] 🔍 HTTP 请求拦截调试:');
118
+ console.log(' 请求 URL:', url);
119
+ console.log(' 请求方法:', request.method);
120
+ console.log(' 拦截器 ID:', requestId);
121
+ console.log(' interceptHttp 配置:', config.interceptHttp);
122
+ // 🔧 检测 axios 代理场景导致的 URL 重复拼接
123
+ // 模式:http://proxy-host:port/http://target-host/path
124
+ // 或:http://proxy-host:porthttps://target-host/path(没有斜杠)
125
+ const duplicateUrlPattern = /^(https?:\/\/[^\/]+?)(https?:\/\/.+)$/;
126
+ const match = url.match(duplicateUrlPattern);
127
+ if (match) {
128
+ const proxyUrl = match[1];
129
+ const targetUrl = match[2];
130
+ console.log(' 🔧 检测到 URL 重复拼接(axios + 代理场景)');
131
+ console.log(' 原始 URL:', url);
132
+ console.log(' 代理地址:', proxyUrl);
133
+ console.log(' 目标 URL:', targetUrl);
134
+ console.log(' ⚠️ 跳过拦截,避免干扰 axios 代理请求');
135
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
136
+ // 直接返回,不记录此请求
137
+ return;
138
+ }
139
+ if (!config.interceptHttp) {
140
+ console.log(' ⚠️ HTTP 拦截已禁用,跳过处理');
141
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
142
+ return;
143
+ }
144
+ // 检查是否应该忽略此 URL
145
+ for (const pattern of config.ignoreUrls) {
146
+ if (pattern.test(url)) {
147
+ console.log(' ⚠️ URL 匹配忽略规则,跳过:', pattern);
148
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
149
+ return;
150
+ }
151
+ }
152
+ console.log(' ✅ 请求将被拦截和记录');
153
+ console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
154
+ const myRequestId = generateRequestId();
155
+ const stackTrace = captureStackTrace();
156
+ const traceId = getTraceIdCallback?.() || `trace_${(0, nanoid_1.nanoid)(16)}`;
157
+ const timestamp = Date.now();
158
+ // 获取请求体
159
+ let body;
160
+ if (!config.disableBodyCapture && request.body) {
161
+ try {
162
+ const clonedRequest = request.clone();
163
+ const arrayBuffer = await clonedRequest.arrayBuffer();
164
+ body = Buffer.from(arrayBuffer);
165
+ }
166
+ catch {
167
+ // 忽略错误
168
+ }
169
+ }
170
+ // 存储请求数据
171
+ const requestData = {
172
+ id: myRequestId,
173
+ traceId,
174
+ url,
175
+ method: request.method,
176
+ headers: headersToRecord(request.headers),
177
+ body,
178
+ stackTrace,
179
+ timestamp,
180
+ };
181
+ (0, ring_buffer_js_1.getRequestStore)().add(requestData);
182
+ console.log('[http-patcher] 请求已添加到存储:', myRequestId, url);
183
+ // 通知 Event Bridge
184
+ try {
185
+ const eventBridge = (0, event_bridge_js_1.getEventBridge)();
186
+ if (eventBridge.isRunning()) {
187
+ eventBridge.emitRequestStart(requestData);
188
+ }
189
+ }
190
+ catch {
191
+ // 忽略 Event Bridge 错误
192
+ }
193
+ // 存储元数据以便在响应时使用
194
+ requestMetadata.set(requestId, {
195
+ requestId: myRequestId,
196
+ traceId,
197
+ stackTrace,
198
+ timestamp,
199
+ });
200
+ });
201
+ // 监听响应事件
202
+ interceptor.on('response', async ({ response, requestId }) => {
203
+ const metadata = requestMetadata.get(requestId);
204
+ if (!metadata)
205
+ return;
206
+ const config = (0, config_js_1.getConfig)();
207
+ // 获取响应体
208
+ let responseBody;
209
+ if (!config.disableBodyCapture) {
210
+ try {
211
+ const clonedResponse = response.clone();
212
+ const arrayBuffer = await clonedResponse.arrayBuffer();
213
+ responseBody = Buffer.from(arrayBuffer);
214
+ }
215
+ catch {
216
+ // 忽略错误
217
+ }
218
+ }
219
+ const responseData = {
220
+ statusCode: response.status,
221
+ statusMessage: response.statusText,
222
+ headers: headersToRecord(response.headers),
223
+ body: responseBody,
224
+ };
225
+ (0, ring_buffer_js_1.getRequestStore)().updateResponse(metadata.requestId, responseData);
226
+ // 通知 Event Bridge
227
+ try {
228
+ const eventBridge = (0, event_bridge_js_1.getEventBridge)();
229
+ if (eventBridge.isRunning()) {
230
+ eventBridge.emitRequestComplete(metadata.requestId, responseData);
231
+ }
232
+ }
233
+ catch {
234
+ // 忽略 Event Bridge 错误
235
+ }
236
+ // 更新时序数据
237
+ (0, ring_buffer_js_1.getRequestStore)().updateTiming(metadata.requestId, {
238
+ start: metadata.timestamp,
239
+ total: Date.now() - metadata.timestamp,
240
+ });
241
+ // 清理元数据
242
+ requestMetadata.delete(requestId);
243
+ });
244
+ // 启用拦截器
245
+ interceptor.apply();
246
+ installed = true;
247
+ console.log('[http-patcher] ✅ HTTP 拦截器安装成功');
248
+ }
249
+ /**
250
+ * 卸载 HTTP 拦截器
251
+ */
252
+ function uninstall() {
253
+ if (!installed || !interceptor)
254
+ return;
255
+ interceptor.dispose();
256
+ interceptor = null;
257
+ requestMetadata.clear();
258
+ installed = false;
259
+ }
260
+ /**
261
+ * 检查是否已安装
262
+ */
263
+ function isInstalled() {
264
+ return installed;
265
+ }
266
+ /**
267
+ * HttpPatcher 类(用于导出)
268
+ */
269
+ exports.HttpPatcher = {
270
+ install,
271
+ uninstall,
272
+ isInstalled,
273
+ setTraceIdGetter,
274
+ };
275
+ //# sourceMappingURL=http-patcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-patcher.js","sourceRoot":"","sources":["../../../src/interceptors/http-patcher.ts"],"names":[],"mappings":"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"}