@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,426 +0,0 @@
1
- /**
2
- * @module admin-server
3
- * @description 客户端管理页面 HTTP 服务器模块。
4
- * 提供一个本地 HTTP 服务,用于查看客户端状态和管理代理映射。
5
- * 支持反向代理模式和正向穿透模式。
6
- */
7
- import { createServer } from 'http';
8
- import { readFile } from 'fs';
9
- import { join, dirname } from 'path';
10
- import { fileURLToPath } from 'url';
11
- /**
12
- * 管理页面服务器类
13
- *
14
- * 在本地启动一个 HTTP 服务器,提供状态查询和代理管理的 API 接口,
15
- * 以及一个可视化的 Web 管理界面。
16
- */
17
- export class AdminServer {
18
- /**
19
- * 创建管理服务器实例
20
- *
21
- * @param config - 服务器配置
22
- * @param getStatus - 获取状态的回调函数
23
- * @param addProxy - 添加反向代理的回调函数
24
- * @param removeProxy - 删除反向代理的回调函数
25
- * @param addForwardProxy - 添加正向穿透的回调函数
26
- * @param removeForwardProxy - 删除正向穿透的回调函数
27
- * @param registerClient - 注册客户端的回调函数
28
- * @param getClientList - 获取客户端列表的回调函数
29
- * @param reconnect - 触发重连的回调函数
30
- */
31
- constructor(config, getStatus, addProxy, removeProxy, addForwardProxy, removeForwardProxy, registerClient, getClientList, sendMessage, reconnect) {
32
- /** 正向穿透代理列表(用于存储运行时的正向穿透配置) */
33
- this.forwardProxies = new Map();
34
- this.port = config.port;
35
- this.host = config.host;
36
- this.startedAt = Date.now();
37
- this.getStatusCallback = getStatus;
38
- this.addProxyCallback = addProxy;
39
- this.removeProxyCallback = removeProxy;
40
- this.addForwardProxyCallback = addForwardProxy;
41
- this.removeForwardProxyCallback = removeForwardProxy;
42
- this.registerClientCallback = registerClient;
43
- this.getClientListCallback = getClientList;
44
- this.sendMessageCallback = sendMessage;
45
- this.reconnectCallback = reconnect;
46
- this.server = createServer((req, res) => this.handleRequest(req, res));
47
- }
48
- /**
49
- * 设置发送消息的回调
50
- */
51
- setSendMessageCallback(callback) {
52
- this.sendMessageCallback = callback;
53
- }
54
- /**
55
- * 设置重连回调
56
- */
57
- setReconnectCallback(callback) {
58
- this.reconnectCallback = callback;
59
- }
60
- /**
61
- * 设置关闭进程回调
62
- */
63
- setShutdownCallback(callback) {
64
- this.shutdownCallback = callback;
65
- }
66
- /**
67
- * 启动服务器
68
- *
69
- * @returns 启动完成的 Promise
70
- */
71
- async start() {
72
- return new Promise((resolve, reject) => {
73
- this.server.listen(this.port, this.host, () => {
74
- console.log(`管理页面已启动: http://${this.host}:${this.port}`);
75
- resolve();
76
- });
77
- this.server.on('error', (error) => {
78
- console.error('管理服务器错误:', error);
79
- reject(error);
80
- });
81
- });
82
- }
83
- /**
84
- * 处理 HTTP 请求
85
- *
86
- * 提供以下端点:
87
- * 反向代理:
88
- * - `GET /` - 管理页面
89
- * - `GET /_ctc/status` - 获取状态
90
- * - `POST /_ctc/proxies` - 添加反向代理
91
- * - `DELETE /_ctc/proxies/:port` - 删除反向代理
92
- * - `POST /_ctc/test-proxy?port=xxx` - 测试反向代理连接
93
- * 正向穿透:
94
- * - `GET /_ctc/forward/list` - 获取正向穿透列表
95
- * - `POST /_ctc/forward/add` - 添加正向穿透
96
- * - `POST /_ctc/forward/remove` - 删除正向穿透
97
- * - `GET /_ctc/forward/clients` - 获取客户端列表
98
- * - `POST /_ctc/forward/register` - 注册到服务器
99
- */
100
- async handleRequest(req, res) {
101
- const url = req.url ?? '/';
102
- // 静态文件服务 - 首页读取模板文件
103
- if (url === '/' && req.method === 'GET') {
104
- readFile(AdminServer.TEMPLATE_PATH, 'utf-8', (err, data) => {
105
- if (err) {
106
- console.error('模板文件读取错误:', err);
107
- res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
108
- res.end('Error loading page');
109
- }
110
- else {
111
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
112
- res.end(data);
113
- }
114
- });
115
- return;
116
- }
117
- // 处理静态文件请求 (支持 .js, .css 等静态资源直接从根路径访问)
118
- if (req.method === 'GET' && url !== '/' && !url.startsWith('/_ctc/')) {
119
- const fileName = url.slice(1); // 去掉开头的 /
120
- const filePath = join(AdminServer.STATIC_DIR, fileName);
121
- readFile(filePath, 'utf-8', (err, data) => {
122
- if (err || !data) {
123
- console.error('静态文件读取错误:', err);
124
- res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
125
- res.end('File not found');
126
- return;
127
- }
128
- const ext = fileName.split('.').pop() || 'html';
129
- const contentType = ext === 'css' ? 'text/css; charset=utf-8' :
130
- ext === 'js' ? 'text/javascript; charset=utf-8' : 'text/html; charset=utf-8';
131
- res.writeHead(200, {
132
- 'Content-Type': contentType,
133
- 'Cache-Control': 'public, max-age=3600'
134
- });
135
- res.end(data);
136
- });
137
- return;
138
- }
139
- // 状态 API
140
- if (url === '/_ctc/status' && req.method === 'GET') {
141
- const status = this.getStatusCallback();
142
- res.writeHead(200, { 'Content-Type': 'application/json' });
143
- res.end(JSON.stringify(status));
144
- return;
145
- }
146
- // ==================== 反向代理 API ====================
147
- // 添加反向代理 API
148
- if (url === '/_ctc/proxies' && req.method === 'POST') {
149
- let body = '';
150
- req.on('data', (chunk) => { body += chunk; });
151
- req.on('end', async () => {
152
- try {
153
- const proxy = JSON.parse(body);
154
- await this.addProxyCallback(proxy);
155
- res.writeHead(200, { 'Content-Type': 'application/json' });
156
- res.end(JSON.stringify({ success: true }));
157
- }
158
- catch (error) {
159
- const errorMessage = error instanceof Error ? error.message : String(error);
160
- res.writeHead(400, { 'Content-Type': 'application/json' });
161
- res.end(JSON.stringify({ error: errorMessage }));
162
- }
163
- });
164
- return;
165
- }
166
- // 删除反向代理 API
167
- if (url.startsWith('/_ctc/proxies/') && req.method === 'DELETE') {
168
- const port = parseInt(url.split('/').pop(), 10);
169
- if (isNaN(port)) {
170
- res.writeHead(400, { 'Content-Type': 'application/json' });
171
- res.end(JSON.stringify({ error: '无效的端口号' }));
172
- return;
173
- }
174
- this.removeProxyCallback(port)
175
- .then(() => {
176
- res.writeHead(200, { 'Content-Type': 'application/json' });
177
- res.end(JSON.stringify({ success: true }));
178
- })
179
- .catch((error) => {
180
- const errorMessage = error instanceof Error ? error.message : String(error);
181
- res.writeHead(400, { 'Content-Type': 'application/json' });
182
- res.end(JSON.stringify({ error: errorMessage }));
183
- });
184
- return;
185
- }
186
- // 测试反向代理 API
187
- if (url.startsWith('/_ctc/test-proxy') && req.method === 'POST') {
188
- const urlObj = new URL(url, `http://${req.headers.host}`);
189
- const portParam = urlObj.searchParams.get('port');
190
- const port = portParam ? parseInt(portParam, 10) : NaN;
191
- if (isNaN(port)) {
192
- res.writeHead(400, { 'Content-Type': 'application/json' });
193
- res.end(JSON.stringify({ error: '无效的端口号' }));
194
- return;
195
- }
196
- // 通过 Controller 发送测试请求到服务端,然后测试连接
197
- try {
198
- // 简单测试:尝试连接本地端口来验证代理是否工作
199
- // 实际测试需要通过服务端发起请求,这里只返回成功状态
200
- const status = this.getStatusCallback();
201
- const proxy = status.proxies.find((p) => p.remotePort === port);
202
- if (!proxy) {
203
- res.writeHead(404, { 'Content-Type': 'application/json' });
204
- res.end(JSON.stringify({ success: false, error: '端口未注册' }));
205
- return;
206
- }
207
- // 测试本地端口是否可连接
208
- const net = await import('net');
209
- const testClient = new net.Socket();
210
- let connected = false;
211
- let error = null;
212
- await new Promise((resolve) => {
213
- testClient.connect({ port: proxy.localPort, host: proxy.localHost || 'localhost' }, () => {
214
- connected = true;
215
- testClient.destroy();
216
- resolve();
217
- });
218
- testClient.on('error', (err) => {
219
- error = err.message;
220
- testClient.destroy();
221
- resolve();
222
- });
223
- // 2秒超时
224
- setTimeout(() => {
225
- if (!connected) {
226
- error = '连接超时';
227
- testClient.destroy();
228
- resolve();
229
- }
230
- }, 2000);
231
- });
232
- if (connected) {
233
- res.writeHead(200, { 'Content-Type': 'application/json' });
234
- res.end(JSON.stringify({
235
- success: true,
236
- message: `本地端口 ${proxy.localPort} 连接成功`,
237
- proxy: { remotePort: port, localPort: proxy.localPort }
238
- }));
239
- }
240
- else {
241
- res.writeHead(200, { 'Content-Type': 'application/json' });
242
- res.end(JSON.stringify({
243
- success: false,
244
- error: `本地端口 ${proxy.localPort} 连接失败: ${error}`
245
- }));
246
- }
247
- }
248
- catch (e) {
249
- const errorMessage = e instanceof Error ? e.message : String(e);
250
- res.writeHead(500, { 'Content-Type': 'application/json' });
251
- res.end(JSON.stringify({ success: false, error: errorMessage }));
252
- }
253
- return;
254
- }
255
- // ==================== 正向穿透 API ====================
256
- // forward list - 列出正向穿透代理
257
- if (url === '/_ctc/forward/list' && req.method === 'GET') {
258
- const proxies = Array.from(this.forwardProxies.entries()).map(([key, value]) => ({
259
- localPort: value.localPort,
260
- targetClientId: value.targetClientId,
261
- targetPort: value.targetPort,
262
- enabled: true,
263
- }));
264
- res.writeHead(200, { 'Content-Type': 'application/json' });
265
- res.end(JSON.stringify({ proxies }));
266
- return;
267
- }
268
- // forward add - 添加正向穿透代理
269
- if (url === '/_ctc/forward/add' && req.method === 'POST') {
270
- let body = '';
271
- req.on('data', (chunk) => { body += chunk; });
272
- req.on('end', async () => {
273
- try {
274
- const data = JSON.parse(body);
275
- const key = `${data.localPort}`;
276
- if (this.addForwardProxyCallback) {
277
- await this.addForwardProxyCallback({
278
- ...data,
279
- enabled: true,
280
- });
281
- }
282
- this.forwardProxies.set(key, {
283
- localPort: data.localPort,
284
- targetClientId: data.targetClientId,
285
- targetPort: data.targetPort,
286
- });
287
- res.writeHead(200, { 'Content-Type': 'application/json' });
288
- res.end(JSON.stringify({ success: true }));
289
- }
290
- catch (error) {
291
- const errorMessage = error instanceof Error ? error.message : String(error);
292
- res.writeHead(400, { 'Content-Type': 'application/json' });
293
- res.end(JSON.stringify({ error: errorMessage }));
294
- }
295
- });
296
- return;
297
- }
298
- // forward remove - 移除正向穿透代理
299
- if (url === '/_ctc/forward/remove' && req.method === 'POST') {
300
- let body = '';
301
- req.on('data', (chunk) => { body += chunk; });
302
- req.on('end', async () => {
303
- try {
304
- const data = JSON.parse(body);
305
- const key = `${data.localPort}`;
306
- const deleted = this.forwardProxies.delete(key);
307
- if (this.removeForwardProxyCallback) {
308
- await this.removeForwardProxyCallback(data.localPort);
309
- }
310
- if (deleted) {
311
- res.writeHead(200, { 'Content-Type': 'application/json' });
312
- res.end(JSON.stringify({ success: true }));
313
- }
314
- else {
315
- res.writeHead(404, { 'Content-Type': 'application/json' });
316
- res.end(JSON.stringify({ error: '代理不存在' }));
317
- }
318
- }
319
- catch (error) {
320
- const errorMessage = error instanceof Error ? error.message : String(error);
321
- res.writeHead(400, { 'Content-Type': 'application/json' });
322
- res.end(JSON.stringify({ error: errorMessage }));
323
- }
324
- });
325
- return;
326
- }
327
- // forward clients - 获取客户端列表
328
- if (url === '/_ctc/forward/clients' && req.method === 'GET') {
329
- if (!this.getClientListCallback) {
330
- res.writeHead(503, { 'Content-Type': 'application/json' });
331
- res.end(JSON.stringify({ error: '服务未就绪' }));
332
- return;
333
- }
334
- try {
335
- const result = await this.getClientListCallback();
336
- res.writeHead(200, { 'Content-Type': 'application/json' });
337
- res.end(JSON.stringify(result));
338
- }
339
- catch (error) {
340
- const errorMessage = error instanceof Error ? error.message : String(error);
341
- res.writeHead(500, { 'Content-Type': 'application/json' });
342
- res.end(JSON.stringify({ error: errorMessage }));
343
- }
344
- return;
345
- }
346
- // forward register - 注册到服务器
347
- if (url === '/_ctc/forward/register' && req.method === 'POST') {
348
- let body = '';
349
- req.on('data', (chunk) => { body += chunk; });
350
- req.on('end', async () => {
351
- try {
352
- const data = JSON.parse(body);
353
- if (!this.registerClientCallback) {
354
- res.writeHead(503, { 'Content-Type': 'application/json' });
355
- res.end(JSON.stringify({ error: '服务未就绪' }));
356
- return;
357
- }
358
- const result = await this.registerClientCallback(data.description);
359
- res.writeHead(200, { 'Content-Type': 'application/json' });
360
- res.end(JSON.stringify(result));
361
- }
362
- catch (error) {
363
- const errorMessage = error instanceof Error ? error.message : String(error);
364
- res.writeHead(400, { 'Content-Type': 'application/json' });
365
- res.end(JSON.stringify({ error: errorMessage }));
366
- }
367
- });
368
- return;
369
- }
370
- // reconnect - 主动重连到服务器
371
- if (url === '/_ctc/reconnect' && req.method === 'POST') {
372
- if (!this.reconnectCallback) {
373
- res.writeHead(503, { 'Content-Type': 'application/json' });
374
- res.end(JSON.stringify({ error: '重连服务未就绪' }));
375
- return;
376
- }
377
- try {
378
- await this.reconnectCallback();
379
- res.writeHead(200, { 'Content-Type': 'application/json' });
380
- res.end(JSON.stringify({ success: true, message: '正在重连...' }));
381
- }
382
- catch (error) {
383
- const errorMessage = error instanceof Error ? error.message : String(error);
384
- res.writeHead(500, { 'Content-Type': 'application/json' });
385
- res.end(JSON.stringify({ error: errorMessage }));
386
- }
387
- return;
388
- }
389
- // shutdown - 优雅关闭客户端进程
390
- if (url === '/_ctc/shutdown' && req.method === 'POST') {
391
- if (!this.shutdownCallback) {
392
- res.writeHead(503, { 'Content-Type': 'application/json' });
393
- res.end(JSON.stringify({ error: '关闭服务未就绪' }));
394
- return;
395
- }
396
- res.writeHead(200, { 'Content-Type': 'application/json' });
397
- res.end(JSON.stringify({ success: true }));
398
- // 响应发送后触发关闭
399
- setTimeout(() => this.shutdownCallback(), 100);
400
- return;
401
- }
402
- // 404
403
- res.writeHead(404);
404
- res.end('Not Found');
405
- }
406
- /**
407
- * 停止服务器
408
- */
409
- async stop() {
410
- return new Promise((resolve) => {
411
- this.server.close(() => {
412
- console.log('管理服务器已停止');
413
- resolve();
414
- });
415
- });
416
- }
417
- }
418
- /**
419
- * 静态文件路径常量
420
- */
421
- AdminServer.STATIC_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', 'admin-ui', 'dist');
422
- /**
423
- * HTML 模板文件路径
424
- */
425
- AdminServer.TEMPLATE_PATH = join(AdminServer.STATIC_DIR, 'index.html');
426
- //# sourceMappingURL=admin-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-server.js","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts DELETED
@@ -1,17 +0,0 @@
1
- /**
2
- * @module app
3
- * @description 客户端应用入口 - 简单的穿透使用示例
4
- *
5
- * 这是一个展示如何使用 @feng3d/ctc 库的示例应用。
6
- * 直接运行此文件将启动一个穿透客户端实例。
7
- *
8
- * 运行方式:
9
- * node dist/app.js # 使用默认配置
10
- * node dist/app.js <server-url> # 指定服务器地址
11
- * node dist/app.js <server-url> <token> # 指定服务器地址和令牌
12
- *
13
- * 示例:
14
- * node dist/app.js ws://localhost:9000 my-token
15
- */
16
- export {};
17
- //# sourceMappingURL=app.d.ts.map
package/dist/app.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
package/dist/app.js DELETED
@@ -1,97 +0,0 @@
1
- /**
2
- * @module app
3
- * @description 客户端应用入口 - 简单的穿透使用示例
4
- *
5
- * 这是一个展示如何使用 @feng3d/ctc 库的示例应用。
6
- * 直接运行此文件将启动一个穿透客户端实例。
7
- *
8
- * 运行方式:
9
- * node dist/app.js # 使用默认配置
10
- * node dist/app.js <server-url> # 指定服务器地址
11
- * node dist/app.js <server-url> <token> # 指定服务器地址和令牌
12
- *
13
- * 示例:
14
- * node dist/app.js ws://localhost:9000 my-token
15
- */
16
- import { Controller } from './controller.js';
17
- import { Config } from './config.js';
18
- import { ProxyManager } from './proxy-manager.js';
19
- import { ForwardProxy } from './forward-proxy.js';
20
- /**
21
- * 应用主函数
22
- */
23
- async function main() {
24
- // 获取命令行参数
25
- const args = process.argv.slice(2);
26
- const serverUrl = args[0] || 'ws://localhost:9000';
27
- const token = args[1] || '';
28
- console.log('=== 穿透客户端应用 ===');
29
- console.log(`服务器: ${serverUrl}`);
30
- console.log(`令牌: ${token || '(未设置)'}`);
31
- console.log('');
32
- // 创建配置
33
- const config = new Config({
34
- serverUrl,
35
- token,
36
- reconnectInterval: 30000,
37
- maxReconnectAttempts: 10,
38
- proxies: [
39
- { remotePort: 8080, localPort: 3000, localHost: 'localhost' },
40
- ],
41
- });
42
- // 创建控制器
43
- const controller = new Controller(config);
44
- // 创建代理管理器
45
- const proxyManager = new ProxyManager(controller);
46
- // 创建正向穿透代理
47
- const forwardProxy = new ForwardProxy(controller);
48
- console.log('正在连接到服务器...');
49
- // 监听事件
50
- controller.on('connected', () => {
51
- console.log('✓ 已连接到服务器');
52
- });
53
- controller.on('disconnected', () => {
54
- console.log('✗ 已断开连接');
55
- });
56
- controller.on('authenticated', () => {
57
- console.log('✓ 认证成功');
58
- });
59
- controller.on('newConnection', (data) => {
60
- console.log(` 新连接: ${data.connectionId.slice(0, 8)}... → :${data.remotePort}`);
61
- });
62
- controller.on('connectionClose', (data) => {
63
- console.log(` 连接关闭: ${data.connectionId.slice(0, 8)}...`);
64
- });
65
- // 处理优雅关闭
66
- const shutdown = async () => {
67
- console.log('\n正在关闭...');
68
- await forwardProxy.destroy();
69
- await proxyManager.destroy();
70
- controller.disconnect();
71
- process.exit(0);
72
- };
73
- process.on('SIGINT', shutdown);
74
- process.on('SIGTERM', shutdown);
75
- try {
76
- // 连接到服务器
77
- await controller.connect();
78
- console.log('\n客户端正在运行,按 Ctrl+C 退出\n');
79
- console.log('已配置的代理:');
80
- for (const proxy of config.proxies) {
81
- console.log(` :${proxy.remotePort} → ${proxy.localHost || 'localhost'}:${proxy.localPort}`);
82
- }
83
- console.log('');
84
- // 保持进程运行
85
- process.stdin.resume();
86
- }
87
- catch (error) {
88
- console.error('启动失败:', error);
89
- process.exit(1);
90
- }
91
- }
92
- // 启动应用
93
- main().catch((error) => {
94
- console.error('未捕获的错误:', error);
95
- process.exit(1);
96
- });
97
- //# sourceMappingURL=app.js.map
package/dist/app.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,UAAU;IACV,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,qBAAqB,CAAC;IACnD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,OAAO,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO;IACP,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;QACxB,SAAS;QACT,KAAK;QACL,iBAAiB,EAAE,KAAK;QACxB,oBAAoB,EAAE,EAAE;QACxB,OAAO,EAAE;YACP,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE;SAC9D;KACF,CAAC,CAAC;IAEH,QAAQ;IACR,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAE1C,UAAU;IACV,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAElD,WAAW;IACX,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAE3B,OAAO;IACP,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;QAClC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC,IAAS,EAAE,EAAE;QAC3C,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC,IAAS,EAAE,EAAE;QAC7C,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,SAAS;IACT,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACzB,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,YAAY,CAAC,OAAO,EAAE,CAAC;QAC7B,UAAU,CAAC,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,SAAS;QACT,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;QAE3B,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,SAAS,IAAI,WAAW,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,SAAS;QACT,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAEzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,OAAO;AACP,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAChC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * @module daemon-entry
3
- *
4
- * 守护进程入口点。
5
- * CLI 的 start 命令会 spawn 此文件作为独立进程。
6
- */
7
- export {};
8
- //# sourceMappingURL=daemon-entry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-entry.d.ts","sourceRoot":"","sources":["../src/daemon-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,15 +0,0 @@
1
- /**
2
- * @module daemon-entry
3
- *
4
- * 守护进程入口点。
5
- * CLI 的 start 命令会 spawn 此文件作为独立进程。
6
- */
7
- import { Config } from './config.js';
8
- import { startDaemon } from './daemon.js';
9
- import { logger } from '@feng3d/chuantou-shared';
10
- // 加载配置并启动守护进程
11
- Config.load().then(config => startDaemon(config)).catch(error => {
12
- logger.error('启动守护进程失败:', error);
13
- process.exit(1);
14
- });
15
- //# sourceMappingURL=daemon-entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon-entry.js","sourceRoot":"","sources":["../src/daemon-entry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,cAAc;AACd,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;IAC9D,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/dist/daemon.d.ts DELETED
@@ -1,32 +0,0 @@
1
- /**
2
- * @module daemon
3
- *
4
- * 守护进程运行逻辑。
5
- * 从 index.ts 分离而来,使 index.ts 成为纯库导出模块。
6
- *
7
- * 该模块提供客户端的独立运行功能,包括:
8
- * - PID 文件管理
9
- * - 单实例检查
10
- * - 代理配置管理
11
- * - 核心组件编排(Controller、ProxyManager、ForwardProxy)
12
- * - IPC 通信
13
- * - 信号处理与优雅关闭
14
- */
15
- import { Config } from './config.js';
16
- /**
17
- * 启动守护进程。
18
- *
19
- * 执行以下步骤:
20
- * 1. 从配置文件或命令行参数加载配置
21
- * 2. 验证配置合法性
22
- * 3. 单实例检查
23
- * 4. 创建控制器并连接服务器
24
- * 5. 认证成功后注册所有代理隧道
25
- * 6. 启动 IPC 通信处理
26
- * 7. 监听进程信号实现优雅关闭
27
- *
28
- * @param config - 客户端配置,如未提供则从默认路径加载
29
- * @returns 无返回值的 Promise
30
- */
31
- export declare function startDaemon(config?: Config): Promise<void>;
32
- //# sourceMappingURL=daemon.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../src/daemon.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiGrC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoThE"}