websocket-proxy-http-request 0.0.1

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 (50) hide show
  1. package/README.md +377 -0
  2. package/bin/README.md +57 -0
  3. package/bin/ws-client-agent.js +134 -0
  4. package/bin/ws-proxy-server.js +113 -0
  5. package/bin/ws-proxy.js +83 -0
  6. package/dist/mock/server.d.ts +7 -0
  7. package/dist/mock/server.d.ts.map +1 -0
  8. package/dist/mock/server.js +212 -0
  9. package/dist/mock/server.js.map +1 -0
  10. package/dist/src/client-agent.d.ts +41 -0
  11. package/dist/src/client-agent.d.ts.map +1 -0
  12. package/dist/src/client-agent.js +303 -0
  13. package/dist/src/client-agent.js.map +1 -0
  14. package/dist/src/config/client-agent.config.d.ts +3 -0
  15. package/dist/src/config/client-agent.config.d.ts.map +1 -0
  16. package/dist/src/config/client-agent.config.js +24 -0
  17. package/dist/src/config/client-agent.config.js.map +1 -0
  18. package/dist/src/config/logger.config.d.ts +3 -0
  19. package/dist/src/config/logger.config.d.ts.map +1 -0
  20. package/dist/src/config/logger.config.js +42 -0
  21. package/dist/src/config/logger.config.js.map +1 -0
  22. package/dist/src/config/proxy-server.config.d.ts +3 -0
  23. package/dist/src/config/proxy-server.config.d.ts.map +1 -0
  24. package/dist/src/config/proxy-server.config.js +23 -0
  25. package/dist/src/config/proxy-server.config.js.map +1 -0
  26. package/dist/src/proxy-server.d.ts +51 -0
  27. package/dist/src/proxy-server.d.ts.map +1 -0
  28. package/dist/src/proxy-server.js +556 -0
  29. package/dist/src/proxy-server.js.map +1 -0
  30. package/dist/src/types/config.d.ts +55 -0
  31. package/dist/src/types/config.d.ts.map +1 -0
  32. package/dist/src/types/config.js +6 -0
  33. package/dist/src/types/config.js.map +1 -0
  34. package/dist/src/types/protocol.d.ts +112 -0
  35. package/dist/src/types/protocol.d.ts.map +1 -0
  36. package/dist/src/types/protocol.js +29 -0
  37. package/dist/src/types/protocol.js.map +1 -0
  38. package/dist/src/utils/args-parser.d.ts +23 -0
  39. package/dist/src/utils/args-parser.d.ts.map +1 -0
  40. package/dist/src/utils/args-parser.js +74 -0
  41. package/dist/src/utils/args-parser.js.map +1 -0
  42. package/dist/src/utils/id-generator.d.ts +12 -0
  43. package/dist/src/utils/id-generator.d.ts.map +1 -0
  44. package/dist/src/utils/id-generator.js +20 -0
  45. package/dist/src/utils/id-generator.js.map +1 -0
  46. package/dist/src/utils/logger.d.ts +31 -0
  47. package/dist/src/utils/logger.d.ts.map +1 -0
  48. package/dist/src/utils/logger.js +159 -0
  49. package/dist/src/utils/logger.js.map +1 -0
  50. package/package.json +65 -0
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * WebSocket Proxy CLI 主入口
5
+ * 支持子命令: proxy-server, client-agent
6
+ */
7
+
8
+ const path = require('path');
9
+ const fs = require('fs');
10
+
11
+ const command = process.argv[2];
12
+ const projectRoot = path.resolve(__dirname, '..');
13
+
14
+ // 命令映射
15
+ const commands = {
16
+ 'proxy-server': path.join(projectRoot, 'dist', 'src', 'proxy-server.js'),
17
+ 'client-agent': path.join(projectRoot, 'dist', 'src', 'client-agent.js'),
18
+ 'server': path.join(projectRoot, 'dist', 'src', 'proxy-server.js'),
19
+ 'client': path.join(projectRoot, 'dist', 'src', 'client-agent.js'),
20
+ };
21
+
22
+ // 显示帮助信息
23
+ function showHelp() {
24
+ console.log('');
25
+ console.log('WebSocket Proxy HTTP Request');
26
+ console.log('');
27
+ console.log('用法:');
28
+ console.log(' npx websocket-proxy-http-request <command>');
29
+ console.log('');
30
+ console.log('命令:');
31
+ console.log(' proxy-server, server 启动代理服务器(外网)');
32
+ console.log(' client-agent, client 启动客户端代理(内网)');
33
+ console.log('');
34
+ console.log('示例:');
35
+ console.log(' npx websocket-proxy-http-request proxy-server');
36
+ console.log(' npx websocket-proxy-http-request client-agent');
37
+ console.log('');
38
+ console.log('注意: 使用前请先运行 npm run build 编译项目');
39
+ console.log('');
40
+ }
41
+
42
+ // 如果没有提供命令,显示帮助
43
+ if (!command) {
44
+ showHelp();
45
+ process.exit(0);
46
+ }
47
+
48
+ // 获取目标文件路径
49
+ const targetFile = commands[command];
50
+
51
+ if (!targetFile) {
52
+ console.error(`❌ 错误: 未知命令 "${command}"`);
53
+ console.error('');
54
+ showHelp();
55
+ process.exit(1);
56
+ }
57
+
58
+ // 检查文件是否存在
59
+ if (!fs.existsSync(targetFile)) {
60
+ console.error('❌ 错误: 找不到编译后的文件');
61
+ console.error(` 路径: ${targetFile}`);
62
+ console.error('');
63
+ console.error('请先运行: npm run build');
64
+ process.exit(1);
65
+ }
66
+
67
+ // 保存原始的 require.main
68
+ const originalMain = require.main;
69
+
70
+ // 临时设置 require.main 为当前模块,这样被加载的模块会认为它是主模块
71
+ require.main = module;
72
+
73
+ // 加载并执行
74
+ try {
75
+ require(targetFile);
76
+ } catch (error) {
77
+ console.error('❌ 启动失败:', error);
78
+ process.exit(1);
79
+ } finally {
80
+ // 恢复原始的 require.main
81
+ require.main = originalMain;
82
+ }
83
+
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Mock本地服务
3
+ * 模拟内网中的HTTP服务
4
+ */
5
+ declare const app: import("express-serve-static-core").Express;
6
+ export default app;
7
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../mock/server.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,QAAA,MAAM,GAAG,6CAAY,CAAC;AA0OtB,eAAe,GAAG,CAAC"}
@@ -0,0 +1,212 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const express_1 = __importDefault(require("express"));
7
+ /**
8
+ * Mock本地服务
9
+ * 模拟内网中的HTTP服务
10
+ */
11
+ const app = (0, express_1.default)();
12
+ app.use(express_1.default.json());
13
+ const PORT = 3000;
14
+ // 模拟用户列表
15
+ const users = [
16
+ { id: 1, name: '张三', age: 25, email: 'zhangsan@example.com' },
17
+ { id: 2, name: '李四', age: 30, email: 'lisi@example.com' },
18
+ { id: 3, name: '王五', age: 28, email: 'wangwu@example.com' },
19
+ ];
20
+ // 模拟订单列表
21
+ let orders = [];
22
+ let orderIdCounter = 1;
23
+ // 日志中间件
24
+ app.use((req, res, next) => {
25
+ console.log(`[Mock Service] ${new Date().toISOString()} ${req.method} ${req.path}`);
26
+ next();
27
+ });
28
+ // 健康检查
29
+ app.get('/health', (req, res) => {
30
+ res.json({
31
+ status: 'ok',
32
+ service: 'mock-local-service',
33
+ timestamp: Date.now(),
34
+ });
35
+ });
36
+ // 获取所有用户
37
+ app.get('/api/users', (req, res) => {
38
+ console.log('[Mock Service] 返回用户列表');
39
+ res.json({
40
+ success: true,
41
+ data: users,
42
+ total: users.length,
43
+ });
44
+ });
45
+ // 获取单个用户
46
+ app.get('/api/users/:id', (req, res) => {
47
+ const id = parseInt(req.params.id);
48
+ const user = users.find((u) => u.id === id);
49
+ if (user) {
50
+ console.log(`[Mock Service] 返回用户: ${user.name}`);
51
+ res.json({
52
+ success: true,
53
+ data: user,
54
+ });
55
+ }
56
+ else {
57
+ console.log(`[Mock Service] 用户不存在: ${id}`);
58
+ res.status(404).json({
59
+ success: false,
60
+ error: '用户不存在',
61
+ });
62
+ }
63
+ });
64
+ // 创建用户
65
+ app.post('/api/users', (req, res) => {
66
+ const { name, age, email } = req.body;
67
+ if (!name || !age) {
68
+ return res.status(400).json({
69
+ success: false,
70
+ error: '缺少必要字段',
71
+ });
72
+ }
73
+ const newUser = {
74
+ id: users.length + 1,
75
+ name,
76
+ age,
77
+ email: email || `${name}@example.com`,
78
+ };
79
+ users.push(newUser);
80
+ console.log(`[Mock Service] 创建用户: ${newUser.name}`);
81
+ res.status(201).json({
82
+ success: true,
83
+ data: newUser,
84
+ message: '用户创建成功',
85
+ });
86
+ });
87
+ // 更新用户
88
+ app.put('/api/users/:id', (req, res) => {
89
+ const id = parseInt(req.params.id);
90
+ const userIndex = users.findIndex((u) => u.id === id);
91
+ if (userIndex === -1) {
92
+ return res.status(404).json({
93
+ success: false,
94
+ error: '用户不存在',
95
+ });
96
+ }
97
+ const { name, age, email } = req.body;
98
+ users[userIndex] = {
99
+ ...users[userIndex],
100
+ ...(name && { name }),
101
+ ...(age && { age }),
102
+ ...(email && { email }),
103
+ };
104
+ console.log(`[Mock Service] 更新用户: ${users[userIndex].name}`);
105
+ res.json({
106
+ success: true,
107
+ data: users[userIndex],
108
+ message: '用户更新成功',
109
+ });
110
+ });
111
+ // 删除用户
112
+ app.delete('/api/users/:id', (req, res) => {
113
+ const id = parseInt(req.params.id);
114
+ const userIndex = users.findIndex((u) => u.id === id);
115
+ if (userIndex === -1) {
116
+ return res.status(404).json({
117
+ success: false,
118
+ error: '用户不存在',
119
+ });
120
+ }
121
+ const deletedUser = users.splice(userIndex, 1)[0];
122
+ console.log(`[Mock Service] 删除用户: ${deletedUser.name}`);
123
+ res.json({
124
+ success: true,
125
+ message: '用户删除成功',
126
+ });
127
+ });
128
+ // 获取订单列表
129
+ app.get('/api/orders', (req, res) => {
130
+ console.log('[Mock Service] 返回订单列表');
131
+ res.json({
132
+ success: true,
133
+ data: orders,
134
+ total: orders.length,
135
+ });
136
+ });
137
+ // 创建订单
138
+ app.post('/api/orders', (req, res) => {
139
+ const { userId, productName, quantity, price } = req.body;
140
+ if (!userId || !productName) {
141
+ return res.status(400).json({
142
+ success: false,
143
+ error: '缺少必要字段',
144
+ });
145
+ }
146
+ const newOrder = {
147
+ id: orderIdCounter++,
148
+ orderId: `ORDER-${Date.now()}`,
149
+ userId,
150
+ productName,
151
+ quantity: quantity || 1,
152
+ price: price || 99.99,
153
+ status: 'pending',
154
+ createdAt: new Date().toISOString(),
155
+ };
156
+ orders.push(newOrder);
157
+ console.log(`[Mock Service] 创建订单: ${newOrder.orderId}`);
158
+ res.status(201).json({
159
+ success: true,
160
+ data: newOrder,
161
+ message: '订单创建成功',
162
+ });
163
+ });
164
+ // 模拟慢响应
165
+ app.get('/api/slow', async (req, res) => {
166
+ const delay = parseInt(req.query.delay) || 2000;
167
+ console.log(`[Mock Service] 模拟慢响应,延迟 ${delay}ms`);
168
+ await new Promise((resolve) => setTimeout(resolve, delay));
169
+ res.json({
170
+ success: true,
171
+ message: `延迟 ${delay}ms 后响应`,
172
+ timestamp: Date.now(),
173
+ });
174
+ });
175
+ // 模拟错误
176
+ app.get('/api/error', (req, res) => {
177
+ console.log('[Mock Service] 模拟服务器错误');
178
+ res.status(500).json({
179
+ success: false,
180
+ error: '服务器内部错误',
181
+ code: 'INTERNAL_ERROR',
182
+ });
183
+ });
184
+ // 404处理
185
+ app.use((req, res) => {
186
+ res.status(404).json({
187
+ success: false,
188
+ error: '接口不存在',
189
+ path: req.path,
190
+ });
191
+ });
192
+ // 启动服务器
193
+ app.listen(PORT, () => {
194
+ console.log('='.repeat(60));
195
+ console.log('🎭 Mock Local Service 已启动');
196
+ console.log('='.repeat(60));
197
+ console.log(`端口: ${PORT}`);
198
+ console.log('可用接口:');
199
+ console.log(' GET /health');
200
+ console.log(' GET /api/users');
201
+ console.log(' GET /api/users/:id');
202
+ console.log(' POST /api/users');
203
+ console.log(' PUT /api/users/:id');
204
+ console.log(' DELETE /api/users/:id');
205
+ console.log(' GET /api/orders');
206
+ console.log(' POST /api/orders');
207
+ console.log(' GET /api/slow?delay=2000');
208
+ console.log(' GET /api/error');
209
+ console.log('='.repeat(60));
210
+ });
211
+ exports.default = app;
212
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../mock/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 客户端代理
3
+ */
4
+ declare class ClientAgent {
5
+ private ws?;
6
+ private reconnectAttempts;
7
+ private reconnectTimer?;
8
+ private isConnecting;
9
+ private shouldReconnect;
10
+ constructor();
11
+ /**
12
+ * 连接到代理服务器
13
+ */
14
+ connect(): void;
15
+ /**
16
+ * 认证
17
+ */
18
+ private authenticate;
19
+ /**
20
+ * 处理消息
21
+ */
22
+ private handleMessage;
23
+ /**
24
+ * 处理请求
25
+ */
26
+ private handleRequest;
27
+ /**
28
+ * 处理心跳ping
29
+ */
30
+ private handleHeartbeatPing;
31
+ /**
32
+ * 安排重连
33
+ */
34
+ private scheduleReconnect;
35
+ /**
36
+ * 断开连接
37
+ */
38
+ disconnect(): void;
39
+ }
40
+ export default ClientAgent;
41
+ //# sourceMappingURL=client-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-agent.d.ts","sourceRoot":"","sources":["../../src/client-agent.ts"],"names":[],"mappings":"AAoBA;;GAEG;AACH,cAAM,WAAW;IACf,OAAO,CAAC,EAAE,CAAC,CAAY;IACvB,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAAC,CAAiB;IACxC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,eAAe,CAAQ;;IAI/B;;OAEG;IACI,OAAO;IAkDd;;OAEG;IACH,OAAO,CAAC,YAAY;IAYpB;;OAEG;YACW,aAAa;IAyB3B;;OAEG;YACW,aAAa;IAmJ3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAY3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAoBzB;;OAEG;IACI,UAAU;CAQlB;AAuBD,eAAe,WAAW,CAAC"}
@@ -0,0 +1,303 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ws_1 = __importDefault(require("ws"));
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const client_agent_config_1 = require("./config/client-agent.config");
9
+ const logger_1 = require("./utils/logger");
10
+ const protocol_1 = require("./types/protocol");
11
+ const wsLogger = (0, logger_1.getLogger)('client.ws');
12
+ const httpLogger = (0, logger_1.getLogger)('client.http');
13
+ const reconnectLogger = (0, logger_1.getLogger)('client.reconnect');
14
+ const requestLogger = (0, logger_1.getLogger)('protocol.request');
15
+ const responseLogger = (0, logger_1.getLogger)('protocol.response');
16
+ /**
17
+ * 客户端代理
18
+ */
19
+ class ClientAgent {
20
+ constructor() {
21
+ this.reconnectAttempts = 0;
22
+ this.isConnecting = false;
23
+ this.shouldReconnect = true;
24
+ }
25
+ /**
26
+ * 连接到代理服务器
27
+ */
28
+ connect() {
29
+ if (this.isConnecting) {
30
+ return;
31
+ }
32
+ this.isConnecting = true;
33
+ wsLogger.info('正在连接到代理服务器', {
34
+ url: client_agent_config_1.clientAgentConfig.proxyWsUrl,
35
+ clientId: client_agent_config_1.clientAgentConfig.clientId,
36
+ });
37
+ this.ws = new ws_1.default(client_agent_config_1.clientAgentConfig.proxyWsUrl);
38
+ this.ws.on('open', () => {
39
+ this.isConnecting = false;
40
+ this.reconnectAttempts = 0;
41
+ wsLogger.info('已连接到代理服务器');
42
+ // 发送认证消息
43
+ this.authenticate();
44
+ });
45
+ this.ws.on('message', (data) => {
46
+ try {
47
+ const message = JSON.parse(data.toString());
48
+ this.handleMessage(message);
49
+ }
50
+ catch (error) {
51
+ wsLogger.error('消息解析失败', { error: error.message });
52
+ }
53
+ });
54
+ this.ws.on('close', (code, reason) => {
55
+ this.isConnecting = false;
56
+ wsLogger.warn('与代理服务器断开连接', {
57
+ code,
58
+ reason: reason.toString(),
59
+ });
60
+ // 自动重连
61
+ if (this.shouldReconnect && client_agent_config_1.clientAgentConfig.reconnectEnabled) {
62
+ this.scheduleReconnect();
63
+ }
64
+ });
65
+ this.ws.on('error', (error) => {
66
+ this.isConnecting = false;
67
+ wsLogger.error('WebSocket错误', { error: error.message });
68
+ });
69
+ }
70
+ /**
71
+ * 认证
72
+ */
73
+ authenticate() {
74
+ const authMessage = {
75
+ type: protocol_1.EMessageType.AUTH,
76
+ token: client_agent_config_1.clientAgentConfig.authToken,
77
+ clientId: client_agent_config_1.clientAgentConfig.clientId,
78
+ timestamp: Date.now(),
79
+ };
80
+ this.ws?.send(JSON.stringify(authMessage));
81
+ wsLogger.info('已发送认证消息');
82
+ }
83
+ /**
84
+ * 处理消息
85
+ */
86
+ async handleMessage(message) {
87
+ switch (message.type) {
88
+ case protocol_1.EMessageType.AUTH_SUCCESS:
89
+ wsLogger.info('认证成功', { message: message.message });
90
+ break;
91
+ case protocol_1.EMessageType.AUTH_FAILED:
92
+ wsLogger.error('认证失败', { message: message.message });
93
+ this.shouldReconnect = false;
94
+ this.ws?.close();
95
+ break;
96
+ case protocol_1.EMessageType.REQUEST:
97
+ await this.handleRequest(message);
98
+ break;
99
+ case protocol_1.EMessageType.HEARTBEAT_PING:
100
+ this.handleHeartbeatPing(message);
101
+ break;
102
+ default:
103
+ wsLogger.warn('未知消息类型', { type: message.type });
104
+ }
105
+ }
106
+ /**
107
+ * 处理请求
108
+ */
109
+ async handleRequest(message) {
110
+ const startTime = Date.now();
111
+ // 打印接收到的请求
112
+ console.log('\n' + '='.repeat(60));
113
+ console.log(`📥 [${new Date().toISOString()}] 收到代理请求 [${message.requestId}]`);
114
+ console.log('='.repeat(60));
115
+ console.log(`方法: ${message.method}`);
116
+ console.log(`URL: ${message.url}`);
117
+ if (message.params) {
118
+ console.log('查询参数:', JSON.stringify(message.params, null, 2));
119
+ }
120
+ if (message.body) {
121
+ console.log('请求体:', JSON.stringify(message.body, null, 2));
122
+ }
123
+ console.log('='.repeat(60));
124
+ requestLogger.info('收到请求消息,开始拆箱', {
125
+ requestId: message.requestId,
126
+ method: message.method,
127
+ url: message.url,
128
+ params: message.params,
129
+ hasBody: !!message.body,
130
+ bodySize: message.body ? JSON.stringify(message.body).length : 0,
131
+ });
132
+ // 使用消息中的完整URL
133
+ const targetUrl = message.url;
134
+ httpLogger.info('向本地服务发起请求', {
135
+ requestId: message.requestId,
136
+ targetUrl,
137
+ method: message.method,
138
+ headers: message.headers,
139
+ body: message.body,
140
+ });
141
+ try {
142
+ const config = {
143
+ method: message.method,
144
+ url: targetUrl,
145
+ headers: message.headers || {},
146
+ data: message.body,
147
+ timeout: 30000,
148
+ validateStatus: () => true, // 接受所有状态码
149
+ };
150
+ const response = await (0, axios_1.default)(config);
151
+ const duration = Date.now() - startTime;
152
+ // 打印响应
153
+ console.log('\n' + '='.repeat(60));
154
+ console.log(`📤 [${new Date().toISOString()}] 收到本地服务响应 [${message.requestId}]`);
155
+ console.log('='.repeat(60));
156
+ console.log(`状态码: ${response.status}`);
157
+ console.log('响应头:', JSON.stringify(response.headers, null, 2));
158
+ console.log('响应体:', JSON.stringify(response.data, null, 2));
159
+ console.log(`耗时: ${duration}ms`);
160
+ console.log('='.repeat(60) + '\n');
161
+ httpLogger.info('收到本地服务响应', {
162
+ requestId: message.requestId,
163
+ status: response.status,
164
+ headers: response.headers,
165
+ body: response.data,
166
+ bodySize: response.data ? JSON.stringify(response.data).length : 0,
167
+ duration,
168
+ });
169
+ // 构造响应消息
170
+ const responseMessage = {
171
+ type: protocol_1.EMessageType.RESPONSE,
172
+ requestId: message.requestId,
173
+ status: response.status,
174
+ headers: response.headers,
175
+ body: response.data,
176
+ timestamp: Date.now(),
177
+ };
178
+ responseLogger.info('装箱响应消息', {
179
+ requestId: message.requestId,
180
+ status: responseMessage.status,
181
+ headers: responseMessage.headers,
182
+ bodySize: responseMessage.body ? JSON.stringify(responseMessage.body).length : 0,
183
+ });
184
+ // 发送响应
185
+ this.ws?.send(JSON.stringify(responseMessage));
186
+ httpLogger.info('响应已发送回代理服务器', {
187
+ requestId: message.requestId,
188
+ status: response.status,
189
+ duration: Date.now() - message.timestamp,
190
+ totalDuration: duration,
191
+ });
192
+ }
193
+ catch (error) {
194
+ const duration = Date.now() - startTime;
195
+ const errorLogger = (0, logger_1.getLogger)('error.network');
196
+ // 打印错误
197
+ console.log('\n' + '='.repeat(60));
198
+ console.log(`❌ [${new Date().toISOString()}] 本地请求失败 [${message.requestId}]`);
199
+ console.log('='.repeat(60));
200
+ console.log('错误:', error.message);
201
+ if (error.response) {
202
+ console.log('响应状态:', error.response.status);
203
+ console.log('响应数据:', JSON.stringify(error.response.data, null, 2));
204
+ }
205
+ if (error.code) {
206
+ console.log('错误代码:', error.code);
207
+ }
208
+ if (error.stack) {
209
+ console.log('堆栈:', error.stack);
210
+ }
211
+ console.log(`耗时: ${duration}ms`);
212
+ console.log('='.repeat(60) + '\n');
213
+ errorLogger.error('本地请求失败', {
214
+ requestId: message.requestId,
215
+ url: targetUrl,
216
+ method: message.method,
217
+ error: error.message,
218
+ errorCode: error.code,
219
+ responseStatus: error.response?.status,
220
+ responseData: error.response?.data,
221
+ stack: error.stack,
222
+ duration,
223
+ });
224
+ // 发送错误响应
225
+ const errorResponse = {
226
+ type: protocol_1.EMessageType.RESPONSE,
227
+ requestId: message.requestId,
228
+ status: error.response?.status || 500,
229
+ headers: error.response?.headers || { 'content-type': 'application/json' },
230
+ body: {
231
+ error: '内网请求失败',
232
+ message: error.message,
233
+ code: error.code,
234
+ },
235
+ timestamp: Date.now(),
236
+ };
237
+ this.ws?.send(JSON.stringify(errorResponse));
238
+ }
239
+ }
240
+ /**
241
+ * 处理心跳ping
242
+ */
243
+ handleHeartbeatPing(message) {
244
+ const heartbeatLogger = (0, logger_1.getLogger)('protocol.heartbeat');
245
+ heartbeatLogger.debug('收到心跳ping,发送pong');
246
+ const pongMessage = {
247
+ type: protocol_1.EMessageType.HEARTBEAT_PONG,
248
+ timestamp: Date.now(),
249
+ };
250
+ this.ws?.send(JSON.stringify(pongMessage));
251
+ }
252
+ /**
253
+ * 安排重连
254
+ */
255
+ scheduleReconnect() {
256
+ if (this.reconnectAttempts >= client_agent_config_1.clientAgentConfig.reconnectMaxAttempts) {
257
+ reconnectLogger.error('重连次数已达上限,停止重连', {
258
+ maxAttempts: client_agent_config_1.clientAgentConfig.reconnectMaxAttempts,
259
+ });
260
+ return;
261
+ }
262
+ this.reconnectAttempts++;
263
+ reconnectLogger.warn('将在几秒后尝试重连', {
264
+ attempt: this.reconnectAttempts,
265
+ maxAttempts: client_agent_config_1.clientAgentConfig.reconnectMaxAttempts,
266
+ interval: client_agent_config_1.clientAgentConfig.reconnectInterval,
267
+ });
268
+ this.reconnectTimer = setTimeout(() => {
269
+ this.connect();
270
+ }, client_agent_config_1.clientAgentConfig.reconnectInterval);
271
+ }
272
+ /**
273
+ * 断开连接
274
+ */
275
+ disconnect() {
276
+ this.shouldReconnect = false;
277
+ if (this.reconnectTimer) {
278
+ clearTimeout(this.reconnectTimer);
279
+ }
280
+ this.ws?.close();
281
+ wsLogger.info('已主动断开连接');
282
+ }
283
+ }
284
+ // 启动客户端
285
+ if (require.main === module) {
286
+ const client = new ClientAgent();
287
+ client.connect();
288
+ console.log('='.repeat(60));
289
+ console.log('🔗 Client Agent 已启动');
290
+ console.log('='.repeat(60));
291
+ console.log(`代理服务器: ${client_agent_config_1.clientAgentConfig.proxyWsUrl}`);
292
+ console.log(`客户端ID: ${client_agent_config_1.clientAgentConfig.clientId}`);
293
+ console.log(`本地目标: ${client_agent_config_1.clientAgentConfig.localTargetProtocol}://${client_agent_config_1.clientAgentConfig.localTargetHost}:${client_agent_config_1.clientAgentConfig.localTargetPort}`);
294
+ console.log('='.repeat(60));
295
+ // 优雅退出
296
+ process.on('SIGINT', () => {
297
+ console.log('\n正在关闭客户端...');
298
+ client.disconnect();
299
+ process.exit(0);
300
+ });
301
+ }
302
+ exports.default = ClientAgent;
303
+ //# sourceMappingURL=client-agent.js.map