@cjwddz/mirror 1.1.0 → 2.0.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 (97) hide show
  1. package/README.md +154 -256
  2. package/dist/cli/cli-commands.d.ts +30 -0
  3. package/dist/cli/cli-commands.d.ts.map +1 -0
  4. package/dist/cli/cli-commands.js +391 -0
  5. package/dist/cli/cli-commands.js.map +1 -0
  6. package/dist/cli/client.d.ts +19 -0
  7. package/dist/cli/client.d.ts.map +1 -0
  8. package/dist/cli/client.js +107 -0
  9. package/dist/cli/client.js.map +1 -0
  10. package/dist/cli/index-new.d.ts +6 -0
  11. package/dist/cli/index-new.d.ts.map +1 -0
  12. package/dist/cli/index-new.js +116 -0
  13. package/dist/cli/index-new.js.map +1 -0
  14. package/dist/cli/index.d.ts +1 -1
  15. package/dist/cli/index.js +100 -41
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/server.d.ts +19 -0
  18. package/dist/cli/server.d.ts.map +1 -0
  19. package/dist/cli/server.js +77 -0
  20. package/dist/cli/server.js.map +1 -0
  21. package/dist/core/http-tunnel-client.d.ts +64 -0
  22. package/dist/core/http-tunnel-client.d.ts.map +1 -0
  23. package/dist/core/http-tunnel-client.js +315 -0
  24. package/dist/core/http-tunnel-client.js.map +1 -0
  25. package/dist/core/http-tunnel-protocol.d.ts +104 -0
  26. package/dist/core/http-tunnel-protocol.d.ts.map +1 -0
  27. package/dist/core/http-tunnel-protocol.js +29 -0
  28. package/dist/core/http-tunnel-protocol.js.map +1 -0
  29. package/dist/core/http-tunnel-server.d.ts +79 -0
  30. package/dist/core/http-tunnel-server.d.ts.map +1 -0
  31. package/dist/core/http-tunnel-server.js +375 -0
  32. package/dist/core/http-tunnel-server.js.map +1 -0
  33. package/dist/core/rule-manager.d.ts +71 -0
  34. package/dist/core/rule-manager.d.ts.map +1 -0
  35. package/dist/core/rule-manager.js +165 -0
  36. package/dist/core/rule-manager.js.map +1 -0
  37. package/dist/index.d.ts +4 -8
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +4 -8
  40. package/dist/index.js.map +1 -1
  41. package/package.json +14 -10
  42. package/dist/cli/exec.d.ts +0 -9
  43. package/dist/cli/exec.d.ts.map +0 -1
  44. package/dist/cli/exec.js +0 -32
  45. package/dist/cli/exec.js.map +0 -1
  46. package/dist/cli/host-impl.d.ts +0 -58
  47. package/dist/cli/host-impl.d.ts.map +0 -1
  48. package/dist/cli/host-impl.js +0 -547
  49. package/dist/cli/host-impl.js.map +0 -1
  50. package/dist/cli/host.d.ts +0 -9
  51. package/dist/cli/host.d.ts.map +0 -1
  52. package/dist/cli/host.js +0 -57
  53. package/dist/cli/host.js.map +0 -1
  54. package/dist/cli/link.d.ts +0 -10
  55. package/dist/cli/link.d.ts.map +0 -1
  56. package/dist/cli/link.js +0 -105
  57. package/dist/cli/link.js.map +0 -1
  58. package/dist/cli/logs.d.ts +0 -8
  59. package/dist/cli/logs.d.ts.map +0 -1
  60. package/dist/cli/logs.js +0 -48
  61. package/dist/cli/logs.js.map +0 -1
  62. package/dist/cli/shell.d.ts +0 -6
  63. package/dist/cli/shell.d.ts.map +0 -1
  64. package/dist/cli/shell.js +0 -53
  65. package/dist/cli/shell.js.map +0 -1
  66. package/dist/cli/status.d.ts +0 -6
  67. package/dist/cli/status.d.ts.map +0 -1
  68. package/dist/cli/status.js +0 -33
  69. package/dist/cli/status.js.map +0 -1
  70. package/dist/cli/stop.d.ts +0 -6
  71. package/dist/cli/stop.d.ts.map +0 -1
  72. package/dist/cli/stop.js +0 -18
  73. package/dist/cli/stop.js.map +0 -1
  74. package/dist/cli/ui/MirrorUI.d.ts +0 -22
  75. package/dist/cli/ui/MirrorUI.d.ts.map +0 -1
  76. package/dist/cli/ui/MirrorUI.js +0 -71
  77. package/dist/cli/ui/MirrorUI.js.map +0 -1
  78. package/dist/cli/ui/interactive-terminal.d.ts +0 -3
  79. package/dist/cli/ui/interactive-terminal.d.ts.map +0 -1
  80. package/dist/cli/ui/interactive-terminal.js +0 -150
  81. package/dist/cli/ui/interactive-terminal.js.map +0 -1
  82. package/dist/cli/watch.d.ts +0 -6
  83. package/dist/cli/watch.d.ts.map +0 -1
  84. package/dist/cli/watch.js +0 -29
  85. package/dist/cli/watch.js.map +0 -1
  86. package/dist/core/daemon.d.ts +0 -154
  87. package/dist/core/daemon.d.ts.map +0 -1
  88. package/dist/core/daemon.js +0 -590
  89. package/dist/core/daemon.js.map +0 -1
  90. package/dist/core/process-manager.d.ts +0 -19
  91. package/dist/core/process-manager.d.ts.map +0 -1
  92. package/dist/core/process-manager.js +0 -76
  93. package/dist/core/process-manager.js.map +0 -1
  94. package/dist/transport/pty.d.ts +0 -7
  95. package/dist/transport/pty.d.ts.map +0 -1
  96. package/dist/transport/pty.js +0 -26
  97. package/dist/transport/pty.js.map +0 -1
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Mirror CLI 命令实现
3
+ */
4
+ import { WebSocket } from 'ws';
5
+ import { RuleManager } from '../core/rule-manager.js';
6
+ // 全局变量,用于管理连接状态
7
+ let tunnelWs = null;
8
+ let ruleManager = null;
9
+ let isConnected = false;
10
+ // 进程管理:防止多个 mirror 进程同时运行
11
+ const LOCK_FILE = process.env.HOME + '/.mirror/.lock';
12
+ /**
13
+ * 检查锁文件,确保只有一个 mirror 客户端在运行
14
+ */
15
+ async function checkLockFile() {
16
+ try {
17
+ const fs = await import('fs');
18
+ const path = await import('path');
19
+ const lockDir = path.dirname(LOCK_FILE);
20
+ // 确保目录存在
21
+ if (!fs.existsSync(lockDir)) {
22
+ fs.mkdirSync(lockDir, { recursive: true });
23
+ }
24
+ // 检查锁文件是否存在
25
+ if (fs.existsSync(LOCK_FILE)) {
26
+ const pid = parseInt(fs.readFileSync(LOCK_FILE, 'utf-8'), 10);
27
+ // 检查进程是否还在运行
28
+ try {
29
+ process.kill(pid, 0);
30
+ console.error(`[!] Another mirror client is already running (PID: ${pid})`);
31
+ console.error('[!] Please stop it first with: mirror stop');
32
+ return false;
33
+ }
34
+ catch {
35
+ // 进程不存在,可以删除锁文件
36
+ fs.unlinkSync(LOCK_FILE);
37
+ }
38
+ }
39
+ // 创建锁文件
40
+ fs.writeFileSync(LOCK_FILE, process.pid.toString());
41
+ return true;
42
+ }
43
+ catch (error) {
44
+ console.error('[!] Failed to create lock file:', error);
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * 清理锁文件
50
+ */
51
+ async function cleanupLockFile() {
52
+ try {
53
+ const fs = await import('fs');
54
+ if (fs.existsSync(LOCK_FILE)) {
55
+ fs.unlinkSync(LOCK_FILE);
56
+ }
57
+ }
58
+ catch (error) {
59
+ // 忽略错误
60
+ }
61
+ }
62
+ /**
63
+ * link 命令:连接服务端
64
+ */
65
+ export async function linkCommand(server, options) {
66
+ console.log('Mirror HTTP Tunnel Client');
67
+ console.log('=========================\n');
68
+ // 检查锁文件
69
+ const lockCheck = await checkLockFile();
70
+ if (!lockCheck) {
71
+ process.exit(1);
72
+ }
73
+ // 创建规则管理器
74
+ ruleManager = new RuleManager();
75
+ // 检查是否已有服务器配置
76
+ const existingConfig = ruleManager.getServer();
77
+ if (existingConfig.server && existingConfig.server !== server) {
78
+ console.log(`[!] 已有不同服务器配置: ${existingConfig.server}`);
79
+ console.log(`[*] 正在连接到新服务器: ${server}`);
80
+ }
81
+ // 保存服务器配置
82
+ ruleManager.setServer(server, options.token);
83
+ console.log(`[*] Server: ${server}`);
84
+ if (options.token) {
85
+ console.log(`[*] Token: ${options.token}`);
86
+ }
87
+ // 构建 WebSocket URL
88
+ let wsUrl = `wss://${server}`;
89
+ if (!server.includes(':')) {
90
+ wsUrl = `wss://${server}:7332`;
91
+ }
92
+ else {
93
+ const [host, port] = server.split(':');
94
+ wsUrl = `wss://${host}:${port}`;
95
+ }
96
+ // 添加 token
97
+ if (options.token) {
98
+ const separator = wsUrl.includes('?') ? '&' : '?';
99
+ wsUrl = `${wsUrl}${separator}token=${options.token}`;
100
+ }
101
+ console.log(`[*] Connecting to ${wsUrl}...`);
102
+ try {
103
+ tunnelWs = new WebSocket(wsUrl);
104
+ tunnelWs.on('open', () => {
105
+ console.log('[✓] Connected to server\n');
106
+ isConnected = true;
107
+ // 发送规则同步
108
+ syncRules();
109
+ });
110
+ tunnelWs.on('message', (data) => {
111
+ handleTunnelMessage(data);
112
+ });
113
+ tunnelWs.on('close', (code, reason) => {
114
+ const reasonStr = reason ? reason.toString() : 'Unknown reason';
115
+ console.log(`[!] Disconnected from server: ${reasonStr} (code: ${code})\n`);
116
+ isConnected = false;
117
+ cleanupLockFile();
118
+ process.exit(0);
119
+ });
120
+ tunnelWs.on('error', (error) => {
121
+ console.error('[!] Connection error:', error.message);
122
+ cleanupLockFile();
123
+ process.exit(1);
124
+ });
125
+ // 处理进程退出
126
+ const exitHandler = () => {
127
+ console.log('\n[*] Disconnecting...');
128
+ if (tunnelWs) {
129
+ tunnelWs.close();
130
+ }
131
+ cleanupLockFile();
132
+ process.exit(0);
133
+ };
134
+ process.on('SIGINT', exitHandler);
135
+ process.on('SIGTERM', exitHandler);
136
+ // 防止进程退出
137
+ await new Promise(() => { });
138
+ }
139
+ catch (error) {
140
+ console.error('[!] Failed to connect:', error);
141
+ cleanupLockFile();
142
+ process.exit(1);
143
+ }
144
+ }
145
+ /**
146
+ * add 命令:添加代理规则
147
+ */
148
+ export async function addCommand(domainPath, target) {
149
+ console.log('Mirror - Add Proxy Rule');
150
+ console.log('========================\n');
151
+ // 解析 domain 和 path
152
+ const domainMatch = domainPath.match(/^([^/]+)(.*)$/);
153
+ if (!domainMatch) {
154
+ console.error('[!] Invalid domain/path format');
155
+ console.error('[!] Usage: mirror add <domain/path> <target>');
156
+ console.error('[!] Example: mirror add example.com/api localhost:3001');
157
+ process.exit(1);
158
+ }
159
+ const domain = domainMatch[1];
160
+ const path = domainMatch[2] || '/';
161
+ // 验证参数
162
+ if (!domain || !target) {
163
+ console.error('[!] Missing required arguments');
164
+ console.error('[!] Usage: mirror add <domain/path> <target>');
165
+ console.error('[!] Example: mirror add example.com/api localhost:3001');
166
+ process.exit(1);
167
+ }
168
+ console.log(`[*] Domain: ${domain}`);
169
+ console.log(`[*] Path: ${path}`);
170
+ console.log(`[*] Target: ${target}\n`);
171
+ // 创建规则管理器
172
+ const ruleManager = new RuleManager();
173
+ // 添加规则
174
+ const rule = ruleManager.addRule(domain, path, target);
175
+ if (rule) {
176
+ console.log('[✓] Rule added successfully\n');
177
+ console.log(` ID: ${rule.id}`);
178
+ console.log(` ${rule.domain}${rule.path} -> ${rule.target}`);
179
+ // 根据路径长度显示优先级
180
+ const pathLength = rule.path.replace(/\/$/, '').length || 1;
181
+ let priorityText = '中';
182
+ if (pathLength > 1) {
183
+ priorityText = '高';
184
+ }
185
+ else if (rule.path === '/') {
186
+ priorityText = '低';
187
+ }
188
+ console.log(` 优先级: ${priorityText} (路径长度: ${pathLength})\n`);
189
+ }
190
+ else {
191
+ console.error('[!] Failed to add rule\n');
192
+ process.exit(1);
193
+ }
194
+ // 如果已连接,同步规则
195
+ if (isConnected && tunnelWs) {
196
+ console.log('[*] Syncing rules to server...');
197
+ syncRules();
198
+ }
199
+ }
200
+ /**
201
+ * remove 命令:删除代理规则
202
+ */
203
+ export async function removeCommand(ruleId) {
204
+ console.log('Mirror - Remove Proxy Rule');
205
+ console.log('===========================\n');
206
+ const ruleManager = new RuleManager();
207
+ if (ruleId) {
208
+ // 删除指定规则
209
+ const id = parseInt(ruleId, 10);
210
+ if (isNaN(id)) {
211
+ console.error('[!] Invalid rule ID:', ruleId);
212
+ process.exit(1);
213
+ }
214
+ const rules = ruleManager.getRules();
215
+ const rule = rules.find(r => r.id === id);
216
+ if (!rule) {
217
+ console.error(`[!] Rule not found: ${id}`);
218
+ process.exit(1);
219
+ }
220
+ ruleManager.removeRule(id);
221
+ console.log(`[✓] Rule removed: ${rule.domain}${rule.path} -> ${rule.target}\n`);
222
+ }
223
+ else {
224
+ // 删除所有规则
225
+ const count = ruleManager.getRules().length;
226
+ ruleManager.removeRule();
227
+ console.log(`[✓] All rules removed (${count} rules)\n`);
228
+ }
229
+ // 如果已连接,同步规则
230
+ if (isConnected && tunnelWs) {
231
+ console.log('[*] Syncing rules to server...');
232
+ syncRules();
233
+ }
234
+ }
235
+ /**
236
+ * list 命令:查看代理规则
237
+ */
238
+ export async function listCommand() {
239
+ console.log('Mirror - Proxy Rules');
240
+ console.log('====================\n');
241
+ const ruleManager = new RuleManager();
242
+ const rules = ruleManager.getRules();
243
+ if (rules.length === 0) {
244
+ console.log('[!] No rules configured\n');
245
+ return;
246
+ }
247
+ console.log(`Total: ${rules.length} rule(s)\n`);
248
+ for (const rule of rules) {
249
+ const priorityLabel = rule.priority === 'high' ? '高' : '低';
250
+ const priorityNote = rule.priority === 'high' ? '(路径规则)' : '(域名规则)';
251
+ console.log(`[${rule.id}] ${rule.domain}${rule.path} -> ${rule.target}`);
252
+ console.log(` Priority: ${priorityLabel}${priorityNote}`);
253
+ console.log(` Created: ${new Date(rule.createdAt).toLocaleString()}`);
254
+ console.log();
255
+ }
256
+ }
257
+ /**
258
+ * stop 命令:断开连接
259
+ */
260
+ export async function stopCommand() {
261
+ console.log('Mirror - Stop Connection');
262
+ console.log('========================\n');
263
+ // 检查锁文件
264
+ try {
265
+ const fs = await import('fs');
266
+ const lockFile = process.env.HOME + '/.mirror/.lock';
267
+ if (!fs.existsSync(lockFile)) {
268
+ console.log('[!] No mirror client is running\n');
269
+ process.exit(0);
270
+ }
271
+ const pid = parseInt(fs.readFileSync(lockFile, 'utf-8'), 10);
272
+ try {
273
+ // 发送 SIGTERM 信号
274
+ process.kill(pid, 'SIGTERM');
275
+ console.log(`[✓] Sending stop signal to mirror client (PID: ${pid})\n`);
276
+ }
277
+ catch {
278
+ console.log(`[!] Mirror client (PID: ${pid}) is not responding\n`);
279
+ console.log('[!] Cleaning up lock file...');
280
+ fs.unlinkSync(lockFile);
281
+ console.log('[✓] Lock file removed\n');
282
+ }
283
+ }
284
+ catch (error) {
285
+ console.error('[!] Error:', error);
286
+ }
287
+ process.exit(0);
288
+ }
289
+ /**
290
+ * status 命令:查看连接状态
291
+ */
292
+ export async function statusCommand() {
293
+ console.log('Mirror - Connection Status');
294
+ console.log('==========================\n');
295
+ try {
296
+ const fs = await import('fs');
297
+ const lockFile = process.env.HOME + '/.mirror/.lock';
298
+ const ruleManager = new RuleManager();
299
+ // 检查进程状态
300
+ if (fs.existsSync(lockFile)) {
301
+ const pid = parseInt(fs.readFileSync(lockFile, 'utf-8'), 10);
302
+ try {
303
+ process.kill(pid, 0);
304
+ console.log('[✓] Mirror client is running');
305
+ console.log(` PID: ${pid}\n`);
306
+ }
307
+ catch {
308
+ console.log('[!] Mirror client is not running (stale lock file)');
309
+ console.log('[!] Cleaning up lock file...');
310
+ fs.unlinkSync(lockFile);
311
+ console.log('[✓] Lock file removed\n');
312
+ }
313
+ }
314
+ else {
315
+ console.log('[!] Mirror client is not running\n');
316
+ }
317
+ // 显示服务器配置
318
+ const config = ruleManager.getServer();
319
+ if (config.server) {
320
+ console.log('Server Configuration:');
321
+ console.log(` Server: ${config.server}`);
322
+ if (config.token) {
323
+ console.log(` Token: ${config.token.substring(0, 8)}...`);
324
+ }
325
+ console.log();
326
+ }
327
+ else {
328
+ console.log('[!] No server configured\n');
329
+ }
330
+ // 显示规则
331
+ const rules = ruleManager.getRules();
332
+ if (rules.length > 0) {
333
+ console.log(`Proxy Rules (${rules.length} configured):`);
334
+ for (const rule of rules) {
335
+ const priority = rule.priority === 'high' ? '高' : '低';
336
+ console.log(` [${rule.id}] ${rule.domain}${rule.path} -> ${rule.target} (${priority})`);
337
+ }
338
+ console.log();
339
+ }
340
+ else {
341
+ console.log('[!] No proxy rules configured\n');
342
+ }
343
+ }
344
+ catch (error) {
345
+ console.error('[!] Error:', error);
346
+ }
347
+ process.exit(0);
348
+ }
349
+ /**
350
+ * 同步规则到服务端
351
+ */
352
+ function syncRules() {
353
+ if (!ruleManager || !tunnelWs) {
354
+ return;
355
+ }
356
+ const rules = ruleManager.getRules();
357
+ const syncMessage = {
358
+ type: 'RULES_SYNC',
359
+ rules: rules,
360
+ };
361
+ tunnelWs.send(JSON.stringify(syncMessage));
362
+ }
363
+ /**
364
+ * 处理隧道消息
365
+ */
366
+ function handleTunnelMessage(data) {
367
+ try {
368
+ const message = JSON.parse(data.toString());
369
+ switch (message.type) {
370
+ case 'WELCOME':
371
+ console.log(`[✓] ${message.message}`);
372
+ console.log(`[*] Server version: ${message.serverVersion}\n`);
373
+ break;
374
+ case 'RULES_ACK':
375
+ if (message.success) {
376
+ console.log(`[✓] Rules synchronized: ${message.count} rule(s)\n`);
377
+ }
378
+ else {
379
+ console.error(`[!] Failed to sync rules: ${message.message}\n`);
380
+ }
381
+ break;
382
+ default:
383
+ // 其他消息类型暂时忽略
384
+ break;
385
+ }
386
+ }
387
+ catch (error) {
388
+ console.error('[!] Error handling message:', error);
389
+ }
390
+ }
391
+ //# sourceMappingURL=cli-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-commands.js","sourceRoot":"","sources":["../../src/cli/cli-commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Mirror HTTP Tunnel Client CLI 命令
3
+ * 连接到服务端,将 HTTP 请求转发到本地服务
4
+ */
5
+ /**
6
+ * 客户端配置选项
7
+ */
8
+ export interface ClientOptions {
9
+ serverUrl: string;
10
+ targetUrl: string;
11
+ token?: string;
12
+ reconnectInterval: number;
13
+ maxRetries: number;
14
+ }
15
+ /**
16
+ * 启动 HTTP 隧道客户端
17
+ */
18
+ export declare function clientCommand(options: ClientOptions): Promise<void>;
19
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/cli/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqHzE"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Mirror HTTP Tunnel Client CLI 命令
3
+ * 连接到服务端,将 HTTP 请求转发到本地服务
4
+ */
5
+ import { WebSocket } from 'ws';
6
+ import { HttpTunnelClient } from '../core/http-tunnel-client.js';
7
+ /**
8
+ * 启动 HTTP 隧道客户端
9
+ */
10
+ export async function clientCommand(options) {
11
+ const { serverUrl, targetUrl, token, reconnectInterval, maxRetries } = options;
12
+ console.log('Mirror HTTP Tunnel Client');
13
+ console.log('=========================\n');
14
+ console.log(`[*] Server URL: ${serverUrl}`);
15
+ console.log(`[*] Target URL: ${targetUrl}`);
16
+ if (token) {
17
+ console.log(`[*] Authentication token: ${token}`);
18
+ }
19
+ console.log();
20
+ let tunnelWs = null;
21
+ let tunnelClient = null;
22
+ let retryCount = 0;
23
+ /**
24
+ * 连接到服务器
25
+ */
26
+ const connect = () => {
27
+ // 构建 WebSocket URL(添加 token)
28
+ let wsUrl = serverUrl;
29
+ if (token) {
30
+ const urlObj = new URL(wsUrl);
31
+ if (!urlObj.searchParams.has('token')) {
32
+ const separator = wsUrl.includes('?') ? '&' : '?';
33
+ wsUrl = `${wsUrl}${separator}token=${token}`;
34
+ }
35
+ }
36
+ console.log(`[*] Connecting to server (attempt ${retryCount + 1}/${maxRetries})...`);
37
+ tunnelWs = new WebSocket(wsUrl);
38
+ tunnelWs.on('open', () => {
39
+ console.log('[✓] WebSocket connected\n');
40
+ retryCount = 0; // 重置重试计数器
41
+ // 等待欢迎消息后再创建 HTTP 隧道客户端
42
+ });
43
+ tunnelWs.on('message', (data) => {
44
+ try {
45
+ const message = JSON.parse(data.toString());
46
+ // 处理欢迎消息
47
+ if (message.type === 'WELCOME') {
48
+ console.log(`[✓] ${message.message}`);
49
+ console.log(`[*] Server version: ${message.serverVersion}`);
50
+ console.log('[*] HTTP tunnel is now active\n');
51
+ // 收到欢迎消息后,创建 HTTP 隧道客户端
52
+ if (!tunnelClient && tunnelWs) {
53
+ tunnelClient = new HttpTunnelClient({
54
+ targetUrl,
55
+ tunnelWs,
56
+ });
57
+ }
58
+ }
59
+ }
60
+ catch (error) {
61
+ // 忽略解析错误
62
+ }
63
+ });
64
+ tunnelWs.on('close', (code, reason) => {
65
+ const reasonStr = reason ? reason.toString() : 'Unknown reason';
66
+ console.log(`[!] Disconnected from server: ${reasonStr} (code: ${code})\n`);
67
+ if (tunnelClient) {
68
+ tunnelClient.close();
69
+ tunnelClient = null;
70
+ }
71
+ // 尝试重新连接
72
+ if (retryCount < maxRetries) {
73
+ retryCount++;
74
+ console.log(`[*] Reconnecting in ${reconnectInterval / 1000} seconds...`);
75
+ setTimeout(connect, reconnectInterval);
76
+ }
77
+ else {
78
+ console.log('[!] Max retry attempts reached. Giving up.');
79
+ process.exit(1);
80
+ }
81
+ });
82
+ tunnelWs.on('error', (error) => {
83
+ console.error('[!] Connection error:', error.message);
84
+ // 不要退出,让 close 事件处理重连
85
+ });
86
+ };
87
+ // 初始连接
88
+ connect();
89
+ // 处理进程退出
90
+ const cleanup = () => {
91
+ console.log('\n[*] Shutting down...');
92
+ if (tunnelClient) {
93
+ tunnelClient.close();
94
+ tunnelClient = null;
95
+ }
96
+ if (tunnelWs) {
97
+ tunnelWs.close();
98
+ tunnelWs = null;
99
+ }
100
+ process.exit(0);
101
+ };
102
+ process.on('SIGINT', cleanup);
103
+ process.on('SIGTERM', cleanup);
104
+ // 防止进程退出
105
+ await new Promise(() => { });
106
+ }
107
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/cli/client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAcjE;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAE/E,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,EAAE,CAAC,CAAC;IAE5C,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,QAAQ,GAAqB,IAAI,CAAC;IACtC,IAAI,YAAY,GAA4B,IAAI,CAAC;IACjD,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB;;OAEG;IACH,MAAM,OAAO,GAAG,GAAS,EAAE;QACzB,6BAA6B;QAC7B,IAAI,KAAK,GAAG,SAAS,CAAC;QACtB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClD,KAAK,GAAG,GAAG,KAAK,GAAG,SAAS,SAAS,KAAK,EAAE,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,UAAU,GAAG,CAAC,IAAI,UAAU,MAAM,CAAC,CAAC;QAErF,QAAQ,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC;QAEhC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACvB,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU;YAC1B,wBAAwB;QAC1B,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAE5C,SAAS;gBACT,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;oBAC5D,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;oBAE/C,wBAAwB;oBACxB,IAAI,CAAC,YAAY,IAAI,QAAQ,EAAE,CAAC;wBAC9B,YAAY,GAAG,IAAI,gBAAgB,CAAC;4BAClC,SAAS;4BACT,QAAQ;yBACT,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,SAAS;YACX,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,iCAAiC,SAAS,WAAW,IAAI,KAAK,CAAC,CAAC;YAE5E,IAAI,YAAY,EAAE,CAAC;gBACjB,YAAY,CAAC,KAAK,EAAE,CAAC;gBACrB,YAAY,GAAG,IAAI,CAAC;YACtB,CAAC;YAED,SAAS;YACT,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;gBAC5B,UAAU,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,uBAAuB,iBAAiB,GAAG,IAAI,aAAa,CAAC,CAAC;gBAC1E,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACtD,sBAAsB;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;IACP,OAAO,EAAE,CAAC;IAEV,SAAS;IACT,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,CAAC,KAAK,EAAE,CAAC;YACrB,YAAY,GAAG,IAAI,CAAC;QACtB,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE/B,SAAS;IACT,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Mirror CLI 入口 - HTTP 隧道工具(新版)
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=index-new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-new.d.ts","sourceRoot":"","sources":["../../src/cli/index-new.ts"],"names":[],"mappings":";AAEA;;GAEG"}