@feng3d/ctc 0.0.20 → 0.2.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.
Files changed (56) hide show
  1. package/README.md +82 -106
  2. package/dist/cli.d.ts +13 -12
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +190 -966
  5. package/dist/cli.js.map +1 -1
  6. package/dist/config.d.ts +18 -51
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +42 -180
  9. package/dist/config.js.map +1 -1
  10. package/dist/controller.d.ts +47 -5
  11. package/dist/controller.d.ts.map +1 -1
  12. package/dist/controller.js +10 -23
  13. package/dist/controller.js.map +1 -1
  14. package/dist/handlers/unified-handler.d.ts.map +1 -1
  15. package/dist/handlers/unified-handler.js +3 -1
  16. package/dist/handlers/unified-handler.js.map +1 -1
  17. package/dist/index.d.ts +7 -5
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +5 -4
  20. package/dist/index.js.map +1 -1
  21. package/dist/proxy-manager.d.ts +32 -32
  22. package/dist/proxy-manager.d.ts.map +1 -1
  23. package/dist/proxy-manager.js +81 -111
  24. package/dist/proxy-manager.js.map +1 -1
  25. package/package.json +5 -10
  26. package/admin-ui/dist/app.js +0 -29
  27. package/admin-ui/dist/index.html +0 -222
  28. package/admin-ui/dist/style.css +0 -1
  29. package/dist/admin-server.d.ts +0 -149
  30. package/dist/admin-server.d.ts.map +0 -1
  31. package/dist/admin-server.js +0 -426
  32. package/dist/admin-server.js.map +0 -1
  33. package/dist/app.d.ts +0 -17
  34. package/dist/app.d.ts.map +0 -1
  35. package/dist/app.js +0 -97
  36. package/dist/app.js.map +0 -1
  37. package/dist/daemon-entry.d.ts +0 -8
  38. package/dist/daemon-entry.d.ts.map +0 -1
  39. package/dist/daemon-entry.js +0 -15
  40. package/dist/daemon-entry.js.map +0 -1
  41. package/dist/daemon.d.ts +0 -32
  42. package/dist/daemon.d.ts.map +0 -1
  43. package/dist/daemon.js +0 -370
  44. package/dist/daemon.js.map +0 -1
  45. package/dist/forward-proxy.d.ts +0 -100
  46. package/dist/forward-proxy.d.ts.map +0 -1
  47. package/dist/forward-proxy.js +0 -407
  48. package/dist/forward-proxy.js.map +0 -1
  49. package/dist/ipc-handler.d.ts +0 -124
  50. package/dist/ipc-handler.d.ts.map +0 -1
  51. package/dist/ipc-handler.js +0 -305
  52. package/dist/ipc-handler.js.map +0 -1
  53. package/dist/process-utils.d.ts +0 -31
  54. package/dist/process-utils.d.ts.map +0 -1
  55. package/dist/process-utils.js +0 -87
  56. package/dist/process-utils.js.map +0 -1
@@ -1,305 +0,0 @@
1
- /**
2
- * @module ipc-handler
3
- *
4
- * IPC 请求处理模块。
5
- *
6
- * 通过文件系统实现进程间通信(IPC),允许 CLI 向运行中的客户端进程
7
- * 发送管理请求。请求通过 JSON 文件传递,响应通过 .resp 文件返回。
8
- *
9
- * 支持的请求类型:
10
- * - get-status: 获取客户端状态
11
- * - add-proxy: 添加反向代理
12
- * - remove-proxy: 删除反向代理
13
- * - clear-proxies: 清除所有代理
14
- * - forward-list: 正向穿透列表
15
- * - forward-add: 添加正向穿透
16
- * - forward-remove: 删除正向穿透
17
- * - forward-clients: 在线客户端列表
18
- * - forward-register: 注册为可发现客户端
19
- */
20
- import { readFileSync, writeFileSync, readdirSync, mkdirSync, unlinkSync } from 'fs';
21
- import { join } from 'path';
22
- import { logger } from '@feng3d/chuantou-shared';
23
- /**
24
- * IPC 请求处理器,处理来自 CLI 的文件系统 IPC 请求。
25
- *
26
- * 通过定时扫描请求目录,发现新的请求文件后处理并写入响应文件。
27
- * 使用 processingFiles 集合防止同一请求被重复处理。
28
- */
29
- export class IpcHandler {
30
- constructor(options) {
31
- this.processingFiles = new Set();
32
- this.timer = null;
33
- this.requestDir = options.requestDir;
34
- this.controller = options.controller;
35
- this.proxyManager = options.proxyManager;
36
- this.registeredProxies = options.registeredProxies;
37
- this.forwardProxy = options.forwardProxy;
38
- this.getStatus = options.getStatus;
39
- this.updateConfigProxies = options.updateConfigProxies;
40
- }
41
- /**
42
- * 启动 IPC 请求监听,每 500ms 扫描一次请求目录。
43
- */
44
- start() {
45
- mkdirSync(this.requestDir, { recursive: true });
46
- this.timer = setInterval(() => this.checkRequests(), 500);
47
- }
48
- /**
49
- * 停止 IPC 请求监听。
50
- */
51
- stop() {
52
- if (this.timer) {
53
- clearInterval(this.timer);
54
- this.timer = null;
55
- }
56
- }
57
- /**
58
- * 扫描请求目录,处理新的请求文件。
59
- * 已在处理中的文件会被跳过,防止重复处理。
60
- */
61
- checkRequests() {
62
- try {
63
- const files = readdirSync(this.requestDir);
64
- for (const file of files) {
65
- if (file.endsWith('.json') && !this.processingFiles.has(file)) {
66
- this.processingFiles.add(file);
67
- const requestPath = join(this.requestDir, file);
68
- this.handleRequest(requestPath).finally(() => {
69
- this.processingFiles.delete(file);
70
- // 处理完成后删除请求文件
71
- try {
72
- unlinkSync(requestPath);
73
- }
74
- catch {
75
- // ignore
76
- }
77
- });
78
- }
79
- }
80
- }
81
- catch {
82
- // 忽略目录读取错误
83
- }
84
- }
85
- /**
86
- * 处理单个 IPC 请求文件。
87
- *
88
- * 读取请求文件 → 根据类型分发处理 → 写入响应文件。
89
- * 无论成功或失败,始终写入响应文件,确保 CLI 不会超时等待。
90
- */
91
- async handleRequest(requestFilePath) {
92
- const responsePath = requestFilePath.replace('.json', '.resp');
93
- try {
94
- const requestData = JSON.parse(readFileSync(requestFilePath, 'utf-8'));
95
- const responseType = requestData.type;
96
- let response;
97
- switch (responseType) {
98
- case 'get-status':
99
- response = await this.handleGetStatus();
100
- break;
101
- case 'add-proxy':
102
- response = await this.handleAddProxy(requestData.proxy);
103
- break;
104
- case 'remove-proxy':
105
- response = await this.handleRemoveProxy(requestData.remotePort);
106
- break;
107
- case 'clear-proxies':
108
- response = await this.handleClearProxies();
109
- break;
110
- case 'forward-list':
111
- response = await this.handleForwardList();
112
- break;
113
- case 'forward-add':
114
- response = await this.handleForwardAdd(requestData.forwardEntry);
115
- break;
116
- case 'forward-remove':
117
- response = await this.handleForwardRemove(requestData.localPort);
118
- break;
119
- case 'forward-clients':
120
- response = await this.handleForwardClients();
121
- break;
122
- case 'forward-register':
123
- response = await this.handleForwardRegister(requestData.description);
124
- break;
125
- default:
126
- response = { success: false, error: `未知的请求类型: ${responseType}` };
127
- }
128
- writeFileSync(responsePath, JSON.stringify(response));
129
- }
130
- catch (error) {
131
- logger.error('处理 IPC 请求时出错:', error);
132
- // 确保即使在外层异常时也写入响应文件,避免 CLI 超时
133
- try {
134
- const errorMessage = error instanceof Error ? error.message : String(error);
135
- writeFileSync(responsePath, JSON.stringify({ success: false, error: errorMessage }));
136
- }
137
- catch {
138
- // 无法写入响应文件 - 忽略
139
- }
140
- }
141
- }
142
- /**
143
- * 处理获取状态请求
144
- */
145
- async handleGetStatus() {
146
- return {
147
- success: true,
148
- status: this.getStatus(),
149
- };
150
- }
151
- /**
152
- * 处理添加代理请求
153
- */
154
- async handleAddProxy(proxy) {
155
- logger.log(`收到添加代理请求: :${proxy.remotePort} -> ${proxy.localHost || 'localhost'}:${proxy.localPort}`);
156
- if (!this.controller.isAuthenticated()) {
157
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
158
- }
159
- try {
160
- await this.proxyManager.registerProxy(proxy);
161
- this.registeredProxies.push({ ...proxy });
162
- // 同步更新配置文件
163
- await this.updateConfigProxies(this.registeredProxies);
164
- logger.log(`代理已通过 IPC 添加: :${proxy.remotePort}`);
165
- return { success: true };
166
- }
167
- catch (error) {
168
- const errorMessage = error instanceof Error ? error.message : String(error);
169
- logger.error(`通过 IPC 添加代理失败: ${errorMessage}`);
170
- return { success: false, error: errorMessage };
171
- }
172
- }
173
- /**
174
- * 处理删除代理请求
175
- */
176
- async handleRemoveProxy(remotePort) {
177
- logger.log(`收到删除代理请求: :${remotePort}`);
178
- if (!this.controller.isAuthenticated()) {
179
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
180
- }
181
- try {
182
- await this.proxyManager.unregisterProxy(remotePort);
183
- const index = this.registeredProxies.findIndex(p => p.remotePort === remotePort);
184
- if (index !== -1) {
185
- this.registeredProxies.splice(index, 1);
186
- }
187
- // 同步更新配置文件
188
- await this.updateConfigProxies(this.registeredProxies);
189
- logger.log(`代理已通过 IPC 删除: :${remotePort}`);
190
- return { success: true };
191
- }
192
- catch (error) {
193
- const errorMessage = error instanceof Error ? error.message : String(error);
194
- logger.error(`通过 IPC 删除代理失败: ${errorMessage}`);
195
- return { success: false, error: errorMessage };
196
- }
197
- }
198
- /**
199
- * 处理清除所有代理请求
200
- */
201
- async handleClearProxies() {
202
- logger.log('收到清除所有代理请求');
203
- if (!this.controller.isAuthenticated()) {
204
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
205
- }
206
- try {
207
- // 逐个删除代理
208
- const ports = this.registeredProxies.map(p => p.remotePort);
209
- for (const port of ports) {
210
- await this.proxyManager.unregisterProxy(port);
211
- }
212
- this.registeredProxies.length = 0;
213
- // 同步更新配置文件
214
- await this.updateConfigProxies([]);
215
- logger.log('所有代理已通过 IPC 清除');
216
- return { success: true };
217
- }
218
- catch (error) {
219
- const errorMessage = error instanceof Error ? error.message : String(error);
220
- logger.error(`通过 IPC 清除代理失败: ${errorMessage}`);
221
- return { success: false, error: errorMessage };
222
- }
223
- }
224
- /**
225
- * 处理正向穿透列表请求
226
- */
227
- async handleForwardList() {
228
- try {
229
- const proxies = this.forwardProxy.getProxies();
230
- return { success: true, proxies };
231
- }
232
- catch (error) {
233
- const errorMessage = error instanceof Error ? error.message : String(error);
234
- return { success: false, error: errorMessage };
235
- }
236
- }
237
- /**
238
- * 处理添加正向穿透请求
239
- */
240
- async handleForwardAdd(entry) {
241
- logger.log(`收到添加正向穿透请求: :${entry.localPort} -> ${entry.targetClientId}:${entry.targetPort}`);
242
- if (!this.controller.isAuthenticated()) {
243
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
244
- }
245
- try {
246
- await this.forwardProxy.addProxy(entry);
247
- return { success: true };
248
- }
249
- catch (error) {
250
- const errorMessage = error instanceof Error ? error.message : String(error);
251
- logger.error(`通过 IPC 添加正向穿透失败: ${errorMessage}`);
252
- return { success: false, error: errorMessage };
253
- }
254
- }
255
- /**
256
- * 处理删除正向穿透请求
257
- */
258
- async handleForwardRemove(localPort) {
259
- logger.log(`收到删除正向穿透请求: :${localPort}`);
260
- try {
261
- await this.forwardProxy.removeProxy(localPort);
262
- return { success: true };
263
- }
264
- catch (error) {
265
- const errorMessage = error instanceof Error ? error.message : String(error);
266
- logger.error(`通过 IPC 删除正向穿透失败: ${errorMessage}`);
267
- return { success: false, error: errorMessage };
268
- }
269
- }
270
- /**
271
- * 处理获取在线客户端列表请求
272
- */
273
- async handleForwardClients() {
274
- if (!this.controller.isAuthenticated()) {
275
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
276
- }
277
- try {
278
- const clients = await this.forwardProxy.getClientList();
279
- return { success: true, clients };
280
- }
281
- catch (error) {
282
- const errorMessage = error instanceof Error ? error.message : String(error);
283
- logger.error(`通过 IPC 获取客户端列表失败: ${errorMessage}`);
284
- return { success: false, error: errorMessage };
285
- }
286
- }
287
- /**
288
- * 处理注册为可发现客户端请求
289
- */
290
- async handleForwardRegister(description) {
291
- if (!this.controller.isAuthenticated()) {
292
- return { success: false, error: '客户端未连接到服务器,请稍后重试' };
293
- }
294
- try {
295
- await this.forwardProxy.registerAsClient(description);
296
- return { success: true };
297
- }
298
- catch (error) {
299
- const errorMessage = error instanceof Error ? error.message : String(error);
300
- logger.error(`通过 IPC 注册客户端失败: ${errorMessage}`);
301
- return { success: false, error: errorMessage };
302
- }
303
- }
304
- }
305
- //# sourceMappingURL=ipc-handler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ipc-handler.js","sourceRoot":"","sources":["../src/ipc-handler.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- /**
2
- * @module process-utils
3
- *
4
- * 进程管理工具函数。
5
- * 提供进程存活检查和降级关闭能力,供 CLI stop 命令和 checkSingleInstance 复用。
6
- */
7
- /**
8
- * 检查指定 PID 的进程是否存活。
9
- * 使用信号 0 检测,跨平台兼容。
10
- */
11
- export declare function isProcessAlive(pid: number): boolean;
12
- /**
13
- * killProcess 的返回结果
14
- */
15
- export interface KillProcessResult {
16
- /** 是否成功关闭(或进程已不存在) */
17
- success: boolean;
18
- /** 关闭方式 */
19
- method: 'kill' | 'already-dead' | 'failed';
20
- /** 错误信息(仅 failed 时有值) */
21
- error?: string;
22
- }
23
- /**
24
- * 降级关闭进程。
25
- *
26
- * 1. 先检查进程是否存活
27
- * 2. 通过 taskkill/SIGTERM 关闭
28
- * 3. 兜底:再次检查进程是否已不存在
29
- */
30
- export declare function killProcess(pid: number): Promise<KillProcessResult>;
31
- //# sourceMappingURL=process-utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-utils.d.ts","sourceRoot":"","sources":["../src/process-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAwCD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,sBAAsB;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW;IACX,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,QAAQ,CAAC;IAC3C,yBAAyB;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBzE"}
@@ -1,87 +0,0 @@
1
- /**
2
- * @module process-utils
3
- *
4
- * 进程管理工具函数。
5
- * 提供进程存活检查和降级关闭能力,供 CLI stop 命令和 checkSingleInstance 复用。
6
- */
7
- import { platform } from 'os';
8
- import { execSync } from 'child_process';
9
- /**
10
- * 检查指定 PID 的进程是否存活。
11
- * 使用信号 0 检测,跨平台兼容。
12
- */
13
- export function isProcessAlive(pid) {
14
- try {
15
- process.kill(pid, 0);
16
- return true;
17
- }
18
- catch {
19
- return false;
20
- }
21
- }
22
- /**
23
- * 等待指定 PID 的进程退出。
24
- * @param pid - 进程 ID
25
- * @param timeoutMs - 最大等待时间(毫秒)
26
- * @returns true 表示进程已退出
27
- */
28
- async function waitForProcessExit(pid, timeoutMs) {
29
- const start = Date.now();
30
- while (Date.now() - start < timeoutMs) {
31
- if (!isProcessAlive(pid))
32
- return true;
33
- await new Promise(resolve => setTimeout(resolve, 100));
34
- }
35
- return !isProcessAlive(pid);
36
- }
37
- /**
38
- * 通过 taskkill (Windows) 或 SIGTERM (其他平台) 关闭进程。
39
- * @returns `{ success: boolean; error?: string }` 包含错误信息
40
- */
41
- function killByPid(pid) {
42
- try {
43
- if (platform() === 'win32') {
44
- execSync(`taskkill /F /PID ${pid}`, { stdio: 'pipe' });
45
- }
46
- else {
47
- process.kill(pid, 'SIGTERM');
48
- }
49
- return { success: true };
50
- }
51
- catch (err) {
52
- // 提取有意义的错误信息
53
- let error = err.message || String(err);
54
- if (err.stderr) {
55
- const stderr = err.stderr.toString().trim();
56
- if (stderr)
57
- error = stderr;
58
- }
59
- return { success: false, error };
60
- }
61
- }
62
- /**
63
- * 降级关闭进程。
64
- *
65
- * 1. 先检查进程是否存活
66
- * 2. 通过 taskkill/SIGTERM 关闭
67
- * 3. 兜底:再次检查进程是否已不存在
68
- */
69
- export async function killProcess(pid) {
70
- // 1. 先检查进程是否存活
71
- if (!isProcessAlive(pid)) {
72
- return { success: true, method: 'already-dead' };
73
- }
74
- // 2. taskkill / SIGTERM
75
- const killResult = killByPid(pid);
76
- if (killResult.success) {
77
- // 等待进程退出
78
- await waitForProcessExit(pid, 2000);
79
- return { success: true, method: 'kill' };
80
- }
81
- // 3. 兜底:再次检查进程是否已不存在
82
- if (!isProcessAlive(pid)) {
83
- return { success: true, method: 'already-dead' };
84
- }
85
- return { success: false, method: 'failed', error: killResult.error };
86
- }
87
- //# sourceMappingURL=process-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"process-utils.js","sourceRoot":"","sources":["../src/process-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,SAAiB;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC;QACtC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAS,SAAS,CAAC,GAAW;IAC5B,IAAI,CAAC;QACH,IAAI,QAAQ,EAAE,KAAK,OAAO,EAAE,CAAC;YAC3B,QAAQ,CAAC,oBAAoB,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,aAAa;QACb,IAAI,KAAK,GAAG,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,MAAM;gBAAE,KAAK,GAAG,MAAM,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAcD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC3C,eAAe;IACf,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACnD,CAAC;IAED,wBAAwB;IACxB,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,SAAS;QACT,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;AACvE,CAAC"}