@feng3d/ctc 0.0.19 → 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/README.md +82 -106
- package/dist/cli.d.ts +13 -11
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +188 -1067
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +18 -55
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +42 -188
- package/dist/config.js.map +1 -1
- package/dist/controller.d.ts +47 -5
- package/dist/controller.d.ts.map +1 -1
- package/dist/controller.js +10 -15
- package/dist/controller.js.map +1 -1
- package/dist/handlers/unified-handler.d.ts.map +1 -1
- package/dist/handlers/unified-handler.js +3 -1
- package/dist/handlers/unified-handler.js.map +1 -1
- package/dist/index.d.ts +20 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -328
- package/dist/index.js.map +1 -1
- package/dist/proxy-manager.d.ts +32 -32
- package/dist/proxy-manager.d.ts.map +1 -1
- package/dist/proxy-manager.js +81 -66
- package/dist/proxy-manager.js.map +1 -1
- package/package.json +5 -6
- package/admin-ui/dist/app.js +0 -29
- package/admin-ui/dist/index.html +0 -222
- package/admin-ui/dist/style.css +0 -1
- package/dist/admin-server.d.ts +0 -143
- package/dist/admin-server.d.ts.map +0 -1
- package/dist/admin-server.js +0 -407
- package/dist/admin-server.js.map +0 -1
- package/dist/forward-proxy.d.ts +0 -100
- package/dist/forward-proxy.d.ts.map +0 -1
- package/dist/forward-proxy.js +0 -407
- package/dist/forward-proxy.js.map +0 -1
- package/dist/ipc-handler.d.ts +0 -52
- package/dist/ipc-handler.d.ts.map +0 -1
- package/dist/ipc-handler.js +0 -110
- package/dist/ipc-handler.js.map +0 -1
package/dist/controller.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { WebSocket } from 'ws';
|
|
10
10
|
import { EventEmitter } from 'events';
|
|
11
|
-
import { MessageType, createMessage, logger, } from '@feng3d/chuantou-shared';
|
|
11
|
+
import { MessageType, createMessage, DEFAULT_CONFIG, logger, } from '@feng3d/chuantou-shared';
|
|
12
12
|
import { DataChannel } from './data-channel.js';
|
|
13
13
|
/**
|
|
14
14
|
* 客户端控制器类。
|
|
@@ -142,7 +142,7 @@ export class Controller extends EventEmitter {
|
|
|
142
142
|
});
|
|
143
143
|
this.sendMessage(heartbeatMsg);
|
|
144
144
|
}
|
|
145
|
-
},
|
|
145
|
+
}, DEFAULT_CONFIG.HEARTBEAT_INTERVAL);
|
|
146
146
|
}
|
|
147
147
|
stopHeartbeat() {
|
|
148
148
|
if (this.heartbeatTimer) {
|
|
@@ -156,27 +156,28 @@ export class Controller extends EventEmitter {
|
|
|
156
156
|
}
|
|
157
157
|
// 检查是否已达到最大重连次数
|
|
158
158
|
if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
|
|
159
|
-
logger.error(`已达到最大重连次数 (${this.
|
|
159
|
+
logger.error(`已达到最大重连次数 (${this.config.maxReconnectAttempts}),停止重连`);
|
|
160
160
|
this.emit('maxReconnectAttemptsReached');
|
|
161
161
|
return;
|
|
162
162
|
}
|
|
163
163
|
const delay = this.calculateReconnectDelay();
|
|
164
|
-
|
|
164
|
+
this.reconnectAttempts++;
|
|
165
|
+
logger.log(`将在 ${delay}ms 后尝试第 ${this.reconnectAttempts} 次重连...`);
|
|
165
166
|
this.reconnectTimer = setTimeout(() => {
|
|
166
167
|
this.reconnectTimer = null;
|
|
167
|
-
this.reconnectAttempts++;
|
|
168
168
|
this.connect().catch((error) => {
|
|
169
169
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
170
170
|
logger.error('重连失败:', errorMessage);
|
|
171
|
-
this.scheduleReconnect();
|
|
172
171
|
});
|
|
173
172
|
}, delay);
|
|
174
173
|
}
|
|
175
174
|
calculateReconnectDelay() {
|
|
176
175
|
const baseDelay = this.config.reconnectInterval;
|
|
177
|
-
const maxDelay = 60000;
|
|
176
|
+
const maxDelay = 60000; // 最大 60 秒
|
|
178
177
|
const delay = Math.min(baseDelay * Math.pow(2, this.reconnectAttempts), maxDelay);
|
|
179
|
-
|
|
178
|
+
// 添加一些随机抖动
|
|
179
|
+
const jitter = Math.random() * 1000;
|
|
180
|
+
return Math.floor(delay + jitter);
|
|
180
181
|
}
|
|
181
182
|
/**
|
|
182
183
|
* 处理控制消息(仅控制消息,数据通过 DataChannel 传输)
|
|
@@ -191,8 +192,6 @@ export class Controller extends EventEmitter {
|
|
|
191
192
|
case MessageType.AUTH_RESP:
|
|
192
193
|
case MessageType.REGISTER_RESP:
|
|
193
194
|
case MessageType.HEARTBEAT_RESP:
|
|
194
|
-
case MessageType.CLIENT_REGISTER_RESP:
|
|
195
|
-
case MessageType.CLIENT_LIST:
|
|
196
195
|
this.handleResponse(message);
|
|
197
196
|
break;
|
|
198
197
|
case MessageType.NEW_CONNECTION:
|
|
@@ -204,10 +203,6 @@ export class Controller extends EventEmitter {
|
|
|
204
203
|
case MessageType.CONNECTION_ERROR:
|
|
205
204
|
this.emit('connectionError', message);
|
|
206
205
|
break;
|
|
207
|
-
case MessageType.INCOMING_CONNECTION:
|
|
208
|
-
case MessageType.CONNECTION_ESTABLISHED:
|
|
209
|
-
// 这些消息通过 controlMessage 事件处理
|
|
210
|
-
break;
|
|
211
206
|
default:
|
|
212
207
|
logger.warn(`未知消息类型: ${msgType}`);
|
|
213
208
|
}
|
|
@@ -231,7 +226,7 @@ export class Controller extends EventEmitter {
|
|
|
231
226
|
this.pendingRequests.delete(message.id);
|
|
232
227
|
reject(new Error('请求超时'));
|
|
233
228
|
}, timeout);
|
|
234
|
-
this.pendingRequests.set(message.id, { resolve, reject, timeout: timer });
|
|
229
|
+
this.pendingRequests.set(message.id, { resolve: resolve, reject, timeout: timer });
|
|
235
230
|
this.sendMessage(message);
|
|
236
231
|
});
|
|
237
232
|
}
|
package/dist/controller.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,WAAW,EACX,aAAa,
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/unified-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAoF,MAAM,yBAAyB,CAAC;AAKxI;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAc;IAE5B,yCAAyC;IACzC,OAAO,CAAC,mBAAmB,CAAkC;IAE7D,yDAAyD;IACzD,OAAO,CAAC,eAAe,CAAwE;IAE/F,uCAAuC;IACvC,OAAO,CAAC,kBAAkB,CAAoC;IAE9D,yCAAyC;IACzC,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,8BAA8B;IAC9B,OAAO,CAAC,mBAAmB,CAA0B;gBAEzC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAiCvD;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"unified-handler.d.ts","sourceRoot":"","sources":["../../src/handlers/unified-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAGtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,WAAW,EAAoF,MAAM,yBAAyB,CAAC;AAKxI;;;;;;GAMG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAc;IAE5B,yCAAyC;IACzC,OAAO,CAAC,mBAAmB,CAAkC;IAE7D,yDAAyD;IACzD,OAAO,CAAC,eAAe,CAAwE;IAE/F,uCAAuC;IACvC,OAAO,CAAC,kBAAkB,CAAoC;IAE9D,yCAAyC;IACzC,OAAO,CAAC,iBAAiB,CAA0B;IAEnD,8BAA8B;IAC9B,OAAO,CAAC,mBAAmB,CAA0B;gBAEzC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAiCvD;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAyD3B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,gBAAgB;IASxB;;OAEG;IACH,OAAO,IAAI,IAAI;CAiBhB"}
|
|
@@ -100,7 +100,9 @@ export class UnifiedHandler extends EventEmitter {
|
|
|
100
100
|
this.backedUpConnections.delete(connectionId);
|
|
101
101
|
});
|
|
102
102
|
socket.on('error', (error) => {
|
|
103
|
-
|
|
103
|
+
// Windows 上 ECONNREFUSED 等错误的 message 可能为空,补充 code/syscall 便于排查
|
|
104
|
+
const detail = error.message || error.code || `errno=${error.errno}`;
|
|
105
|
+
logger.error(`本地 TCP 错误 ${connectionId} (${this.config.localHost || 'localhost'}:${this.config.localPort}): ${detail}`);
|
|
104
106
|
this.notifyServerClose(connectionId);
|
|
105
107
|
this.localTcpConnections.delete(connectionId);
|
|
106
108
|
this.pendingDataBuffers.delete(connectionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unified-handler.js","sourceRoot":"","sources":["../../src/handlers/unified-handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"unified-handler.js","sourceRoot":"","sources":["../../src/handlers/unified-handler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @feng3d/ctc
|
|
3
3
|
*
|
|
4
|
-
* 穿透(Chuantou
|
|
4
|
+
* 穿透(Chuantou)内网穿透客户端库。
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* 提供客户端核心功能的纯库导出,可作为依赖引入使用。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { Controller, ProxyManager } from '@feng3d/ctc';
|
|
11
|
+
*
|
|
12
|
+
* const controller = new Controller({
|
|
13
|
+
* serverUrl: 'ws://localhost:9000/control',
|
|
14
|
+
* token: 'your-token',
|
|
15
|
+
* reconnectInterval: 5000,
|
|
16
|
+
* maxReconnectAttempts: Infinity,
|
|
17
|
+
* });
|
|
18
|
+
* await controller.connect();
|
|
19
|
+
* ```
|
|
9
20
|
*/
|
|
10
21
|
/**
|
|
11
|
-
*
|
|
22
|
+
* 核心类与函数导出
|
|
12
23
|
*/
|
|
13
|
-
export {
|
|
24
|
+
export { loadConfig, saveConfig, getConfigFile } from './config.js';
|
|
14
25
|
export { Controller } from './controller.js';
|
|
26
|
+
export type { ControllerConfig } from './controller.js';
|
|
15
27
|
export { ProxyManager } from './proxy-manager.js';
|
|
16
|
-
export { AdminServer } from './admin-server.js';
|
|
17
28
|
export { UnifiedHandler } from './handlers/unified-handler.js';
|
|
18
|
-
export { IpcHandler } from './ipc-handler.js';
|
|
19
|
-
export { ForwardProxy } from './forward-proxy.js';
|
|
20
|
-
export type { ClientConfig, ProxyConfig, ForwardProxyConfig } from '@feng3d/chuantou-shared';
|
|
21
29
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
* 该函数是 {@link main} 的公开包装,用于被 CLI 模块调用以启动客户端。
|
|
25
|
-
*
|
|
26
|
-
* @returns 无返回值的 Promise
|
|
30
|
+
* 类型导出
|
|
27
31
|
*/
|
|
28
|
-
export
|
|
32
|
+
export type { ClientConfig, ProxyConfig } from '@feng3d/chuantou-shared';
|
|
29
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;GAEG;AACH,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,339 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module @feng3d/ctc
|
|
3
3
|
*
|
|
4
|
-
* 穿透(Chuantou
|
|
4
|
+
* 穿透(Chuantou)内网穿透客户端库。
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
/** 客户端目录 */
|
|
21
|
-
const CLIENT_DIR = join(homedir(), '.chuantou', 'client');
|
|
22
|
-
/** PID 文件 */
|
|
23
|
-
const PID_FILE = join(CLIENT_DIR, 'client.pid');
|
|
24
|
-
/**
|
|
25
|
-
* 读取 PID 文件
|
|
26
|
-
*/
|
|
27
|
-
function readPidFile() {
|
|
28
|
-
try {
|
|
29
|
-
return JSON.parse(readFileSync(PID_FILE, 'utf-8'));
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* 写入 PID 文件
|
|
37
|
-
*/
|
|
38
|
-
function writePidFile(info) {
|
|
39
|
-
mkdirSync(CLIENT_DIR, { recursive: true });
|
|
40
|
-
writeFileSync(PID_FILE, JSON.stringify(info, null, 2));
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* 检查指定 PID 的进程是否存活
|
|
44
|
-
*/
|
|
45
|
-
function isProcessAlive(pid) {
|
|
46
|
-
try {
|
|
47
|
-
process.kill(pid, 0); // 发送信号 0 检查进程是否存在
|
|
48
|
-
return true;
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
return false;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* 单实例检查
|
|
56
|
-
* @returns true 表示应该继续启动,false 表示已有实例在运行,应该退出
|
|
57
|
-
*/
|
|
58
|
-
function checkSingleInstance(serverUrl, adminPort) {
|
|
59
|
-
const info = readPidFile();
|
|
60
|
-
if (!info) {
|
|
61
|
-
// PID 文件不存在,创建新的
|
|
62
|
-
writePidFile({
|
|
63
|
-
pid: process.pid,
|
|
64
|
-
serverUrl,
|
|
65
|
-
adminPort,
|
|
66
|
-
startedAt: Date.now(),
|
|
67
|
-
});
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
// 检查记录的进程是否存活
|
|
71
|
-
if (isProcessAlive(info.pid)) {
|
|
72
|
-
// 进程存活,检查是否是同一个配置
|
|
73
|
-
if (info.serverUrl === serverUrl && info.adminPort === adminPort) {
|
|
74
|
-
logger.log('客户端已在运行中,退出当前启动');
|
|
75
|
-
logger.log(` 现有实例 PID: ${info.pid}`);
|
|
76
|
-
logger.log(` 服务器: ${info.serverUrl}`);
|
|
77
|
-
logger.log(` 管理页面: http://127.0.0.1:${info.adminPort}`);
|
|
78
|
-
return false;
|
|
79
|
-
}
|
|
80
|
-
// 配置不同,记录警告但继续启动(覆盖旧实例)
|
|
81
|
-
logger.warn(`检测到不同配置的实例 (PID: ${info.pid}),将替换为新配置`);
|
|
82
|
-
}
|
|
83
|
-
// 旧进程不存在或配置不同,更新 PID 文件
|
|
84
|
-
writePidFile({
|
|
85
|
-
pid: process.pid,
|
|
86
|
-
serverUrl,
|
|
87
|
-
adminPort,
|
|
88
|
-
startedAt: Date.now(),
|
|
89
|
-
});
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 更新配置文件中的代理列表
|
|
6
|
+
* 提供客户端核心功能的纯库导出,可作为依赖引入使用。
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```ts
|
|
10
|
+
* import { Controller, ProxyManager } from '@feng3d/ctc';
|
|
11
|
+
*
|
|
12
|
+
* const controller = new Controller({
|
|
13
|
+
* serverUrl: 'ws://localhost:9000/control',
|
|
14
|
+
* token: 'your-token',
|
|
15
|
+
* reconnectInterval: 5000,
|
|
16
|
+
* maxReconnectAttempts: Infinity,
|
|
17
|
+
* });
|
|
18
|
+
* await controller.connect();
|
|
19
|
+
* ```
|
|
94
20
|
*/
|
|
95
|
-
async function updateConfigProxies(proxies) {
|
|
96
|
-
const config = await Config.load();
|
|
97
|
-
config.proxies = proxies;
|
|
98
|
-
const configPath = join(homedir(), '.chuantou', 'client', 'config.json');
|
|
99
|
-
writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8', (err) => {
|
|
100
|
-
if (err) {
|
|
101
|
-
logger.error('更新配置文件失败:', err);
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
logger.log('配置文件已更新');
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
21
|
/**
|
|
109
|
-
*
|
|
22
|
+
* 核心类与函数导出
|
|
110
23
|
*/
|
|
111
|
-
export {
|
|
24
|
+
export { loadConfig, saveConfig, getConfigFile } from './config.js';
|
|
112
25
|
export { Controller } from './controller.js';
|
|
113
26
|
export { ProxyManager } from './proxy-manager.js';
|
|
114
|
-
export { AdminServer } from './admin-server.js';
|
|
115
27
|
export { UnifiedHandler } from './handlers/unified-handler.js';
|
|
116
|
-
export { IpcHandler } from './ipc-handler.js';
|
|
117
|
-
export { ForwardProxy } from './forward-proxy.js';
|
|
118
|
-
/**
|
|
119
|
-
* 客户端主入口函数(独立运行模式)。
|
|
120
|
-
*
|
|
121
|
-
* 执行以下步骤:
|
|
122
|
-
* 1. 从配置文件或命令行参数加载配置
|
|
123
|
-
* 2. 验证配置合法性
|
|
124
|
-
* 3. 创建控制器并连接服务器
|
|
125
|
-
* 4. 认证成功后注册所有代理隧道
|
|
126
|
-
* 5. 启动本地 HTTP 管理页面服务器
|
|
127
|
-
* 6. 监听进程信号实现优雅关闭
|
|
128
|
-
*
|
|
129
|
-
* @returns 无返回值的 Promise
|
|
130
|
-
*/
|
|
131
|
-
async function main() {
|
|
132
|
-
logger.log('正在启动穿透客户端...');
|
|
133
|
-
// 加载配置(从用户目录 .chuantou/client.json 或命令行参数)
|
|
134
|
-
const config = await Config.load();
|
|
135
|
-
// 单实例检查:防止多个客户端实例同时运行
|
|
136
|
-
if (!checkSingleInstance(config.serverUrl, config.adminPort)) {
|
|
137
|
-
process.exit(0);
|
|
138
|
-
}
|
|
139
|
-
// 验证配置
|
|
140
|
-
config.validate();
|
|
141
|
-
logger.log('配置已加载:');
|
|
142
|
-
logger.log(` 服务器地址: ${config.serverUrl}`);
|
|
143
|
-
logger.log(` 代理数量: 已配置 ${config.proxies.length} 个`);
|
|
144
|
-
for (const proxy of config.proxies) {
|
|
145
|
-
logger.log(` - :${proxy.remotePort} -> ${proxy.localHost || 'localhost'}:${proxy.localPort}`);
|
|
146
|
-
}
|
|
147
|
-
// 记录启动时间
|
|
148
|
-
const startTime = Date.now();
|
|
149
|
-
// 创建控制器
|
|
150
|
-
const controller = new Controller(config);
|
|
151
|
-
// 创建代理管理器
|
|
152
|
-
const proxyManager = new ProxyManager(controller);
|
|
153
|
-
// 创建正向穿透代理
|
|
154
|
-
const forwardProxy = new ForwardProxy(controller);
|
|
155
|
-
// 已注册的代理配置列表(用于管理页面)
|
|
156
|
-
const registeredProxies = [];
|
|
157
|
-
let nextProxyIndex = 1;
|
|
158
|
-
for (const p of config.proxies) {
|
|
159
|
-
registeredProxies.push({ ...p, index: nextProxyIndex++ });
|
|
160
|
-
}
|
|
161
|
-
// 创建管理页面服务器
|
|
162
|
-
const adminServerConfig = { port: config.adminPort, host: '127.0.0.1' };
|
|
163
|
-
// 获取状态回调
|
|
164
|
-
const getStatusCallback = () => {
|
|
165
|
-
// 获取实际在 ProxyManager 中注册的端口
|
|
166
|
-
const actualRegisteredPorts = proxyManager.getRegisteredPorts();
|
|
167
|
-
// 返回所有配置的代理(去重),并标记注册状态
|
|
168
|
-
const actualRegisteredProxies = registeredProxies
|
|
169
|
-
.filter((p, index, self) => {
|
|
170
|
-
// 去重:只保留第一次出现的端口
|
|
171
|
-
return index === self.findIndex(other => other.remotePort === p.remotePort);
|
|
172
|
-
})
|
|
173
|
-
.map(p => ({ ...p, registered: actualRegisteredPorts.includes(p.remotePort) }));
|
|
174
|
-
const status = {
|
|
175
|
-
running: true,
|
|
176
|
-
serverUrl: config.serverUrl,
|
|
177
|
-
connected: controller.isConnected(),
|
|
178
|
-
authenticated: controller.isAuthenticated(),
|
|
179
|
-
uptime: Date.now() - startTime,
|
|
180
|
-
proxies: actualRegisteredProxies,
|
|
181
|
-
reconnectAttempts: controller.getReconnectAttempts(),
|
|
182
|
-
};
|
|
183
|
-
// 添加正向穿透相关信息
|
|
184
|
-
try {
|
|
185
|
-
const forwardProxies = forwardProxy.getProxies();
|
|
186
|
-
status.forwardProxies = forwardProxies;
|
|
187
|
-
status.isRegistered = true; // 假设已注册(实际应从 Controller 获取)
|
|
188
|
-
status.clientId = controller.getClientId();
|
|
189
|
-
}
|
|
190
|
-
catch (e) {
|
|
191
|
-
// 如果获取失败,返回基础状态
|
|
192
|
-
}
|
|
193
|
-
return status;
|
|
194
|
-
};
|
|
195
|
-
// 添加代理回调
|
|
196
|
-
const addProxyCallback = async (proxy) => {
|
|
197
|
-
await proxyManager.registerProxy(proxy);
|
|
198
|
-
registeredProxies.push({ ...proxy, index: nextProxyIndex++ });
|
|
199
|
-
// 同步更新配置文件
|
|
200
|
-
await updateConfigProxies(registeredProxies.map(p => ({ remotePort: p.remotePort, localPort: p.localPort, localHost: p.localHost })));
|
|
201
|
-
};
|
|
202
|
-
// 删除代理回调
|
|
203
|
-
const removeProxyCallback = async (remotePort) => {
|
|
204
|
-
await proxyManager.unregisterProxy(remotePort);
|
|
205
|
-
const index = registeredProxies.findIndex(p => p.remotePort === remotePort);
|
|
206
|
-
if (index !== -1) {
|
|
207
|
-
registeredProxies.splice(index, 1);
|
|
208
|
-
}
|
|
209
|
-
// 同步更新配置文件
|
|
210
|
-
await updateConfigProxies(registeredProxies);
|
|
211
|
-
};
|
|
212
|
-
// 添加正向穿透回调
|
|
213
|
-
const addForwardProxyCallback = async (entry) => {
|
|
214
|
-
await forwardProxy.addProxy(entry);
|
|
215
|
-
};
|
|
216
|
-
// 删除正向穿透回调
|
|
217
|
-
const removeForwardProxyCallback = async (localPort) => {
|
|
218
|
-
await forwardProxy.removeProxy(localPort);
|
|
219
|
-
};
|
|
220
|
-
// 注册客户端回调
|
|
221
|
-
const registerClientCallback = async (description) => {
|
|
222
|
-
return await forwardProxy.registerAsClient(description);
|
|
223
|
-
};
|
|
224
|
-
// 获取客户端列表回调
|
|
225
|
-
const getClientListCallback = async () => {
|
|
226
|
-
return await forwardProxy.getClientList();
|
|
227
|
-
};
|
|
228
|
-
// 重连回调
|
|
229
|
-
const reconnectCallback = async () => {
|
|
230
|
-
logger.log('收到手动重连请求');
|
|
231
|
-
// 先断开现有连接
|
|
232
|
-
controller.disconnect();
|
|
233
|
-
// 然后重新连接
|
|
234
|
-
await controller.connect();
|
|
235
|
-
};
|
|
236
|
-
// 创建管理页面服务器
|
|
237
|
-
const adminServer = new AdminServer(adminServerConfig, getStatusCallback, addProxyCallback, removeProxyCallback, addForwardProxyCallback, removeForwardProxyCallback, registerClientCallback, getClientListCallback, undefined, // sendMessage 会在后面设置
|
|
238
|
-
reconnectCallback);
|
|
239
|
-
// 设置发送消息回调(用于正向穿透向服务端发送消息)
|
|
240
|
-
adminServer.setSendMessageCallback(async (message) => {
|
|
241
|
-
return await controller.sendRequest(message);
|
|
242
|
-
});
|
|
243
|
-
// 监听控制器事件
|
|
244
|
-
controller.on('connected', () => {
|
|
245
|
-
logger.log('已连接到服务器');
|
|
246
|
-
});
|
|
247
|
-
controller.on('disconnected', () => {
|
|
248
|
-
logger.log('已断开与服务器的连接');
|
|
249
|
-
});
|
|
250
|
-
controller.on('authenticated', async () => {
|
|
251
|
-
logger.log('已认证,正在注册代理...');
|
|
252
|
-
// 获取实际在 ProxyManager 中注册的端口
|
|
253
|
-
const actualRegisteredPorts = proxyManager.getRegisteredPorts();
|
|
254
|
-
// 注册所有代理(只注册尚未实际注册的)
|
|
255
|
-
for (const proxyConfig of config.proxies) {
|
|
256
|
-
if (actualRegisteredPorts.includes(proxyConfig.remotePort)) {
|
|
257
|
-
logger.log(`代理 :${proxyConfig.remotePort} 已注册,跳过`);
|
|
258
|
-
continue;
|
|
259
|
-
}
|
|
260
|
-
try {
|
|
261
|
-
await proxyManager.registerProxy(proxyConfig);
|
|
262
|
-
}
|
|
263
|
-
catch (error) {
|
|
264
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
265
|
-
logger.error(`注册代理失败: ${errorMessage}`);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
});
|
|
269
|
-
// 设置 IPC 请求监听(用于处理 CLI 添加代理的请求)
|
|
270
|
-
const ipcHandler = new IpcHandler({
|
|
271
|
-
requestDir: join(homedir(), '.chuantou', 'proxy-requests'),
|
|
272
|
-
controller,
|
|
273
|
-
proxyManager,
|
|
274
|
-
registeredProxies,
|
|
275
|
-
});
|
|
276
|
-
ipcHandler.start();
|
|
277
|
-
// 启动管理页面服务器(立即启动,不等待认证)
|
|
278
|
-
try {
|
|
279
|
-
await adminServer.start();
|
|
280
|
-
}
|
|
281
|
-
catch (error) {
|
|
282
|
-
logger.error('管理页面启动失败:', error);
|
|
283
|
-
}
|
|
284
|
-
// 优雅关闭
|
|
285
|
-
const shutdown = async () => {
|
|
286
|
-
ipcHandler.stop();
|
|
287
|
-
logger.log('\n正在关闭...');
|
|
288
|
-
await adminServer.stop();
|
|
289
|
-
await proxyManager.destroy();
|
|
290
|
-
controller.disconnect();
|
|
291
|
-
// 清理 PID 文件(只有当前进程是 PID 文件中的进程时才清理)
|
|
292
|
-
const pidInfo = readPidFile();
|
|
293
|
-
if (pidInfo && pidInfo.pid === process.pid) {
|
|
294
|
-
try {
|
|
295
|
-
unlinkSync(PID_FILE);
|
|
296
|
-
}
|
|
297
|
-
catch {
|
|
298
|
-
// ignore
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
process.exit(0);
|
|
302
|
-
};
|
|
303
|
-
process.on('SIGINT', shutdown);
|
|
304
|
-
process.on('SIGTERM', shutdown);
|
|
305
|
-
// 未捕获异常处理 - 崩溃时记录退出码
|
|
306
|
-
process.on('uncaughtException', (error) => {
|
|
307
|
-
logger.error('未捕获异常:', error);
|
|
308
|
-
// 写入非零退出码,让父进程知道是异常退出
|
|
309
|
-
process.exit(1);
|
|
310
|
-
});
|
|
311
|
-
process.on('unhandledRejection', (reason, promise) => {
|
|
312
|
-
logger.error('未处理的 Promise 拒绝:', reason);
|
|
313
|
-
// 写入非零退出码
|
|
314
|
-
process.exit(1);
|
|
315
|
-
});
|
|
316
|
-
// 连接到服务器(不会抛出连接失败的异常,会自动重连)
|
|
317
|
-
await controller.connect();
|
|
318
|
-
}
|
|
319
|
-
// 检查是否作为主模块运行
|
|
320
|
-
// 使用更简单的方式:通过检查是否直接运行此文件
|
|
321
|
-
const isMainModule = process.argv[1] && process.argv[1].endsWith('index.js');
|
|
322
|
-
if (isMainModule) {
|
|
323
|
-
main().catch((error) => {
|
|
324
|
-
logger.error('启动客户端失败:', error);
|
|
325
|
-
// 注意:main() 内部已经处理了资源清理
|
|
326
|
-
process.exit(1);
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
/**
|
|
330
|
-
* 导出运行函数供 CLI 使用。
|
|
331
|
-
*
|
|
332
|
-
* 该函数是 {@link main} 的公开包装,用于被 CLI 模块调用以启动客户端。
|
|
333
|
-
*
|
|
334
|
-
* @returns 无返回值的 Promise
|
|
335
|
-
*/
|
|
336
|
-
export async function run() {
|
|
337
|
-
return main();
|
|
338
|
-
}
|
|
339
28
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC"}
|