@cjwddz/mirror 1.2.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,462 @@
1
+ /**
2
+ * Mirror CLI 命令实现
3
+ */
4
+ import { WebSocket, WebSocketServer } from 'ws';
5
+ import { RuleManager } from '../core/rule-manager.js';
6
+ import { HttpTunnelServer } from '../core/http-tunnel-server.js';
7
+ // 全局变量,用于管理连接状态
8
+ let tunnelWs = null;
9
+ let ruleManager = null;
10
+ let isConnected = false;
11
+ // 进程管理:防止多个 mirror 进程同时运行
12
+ const LOCK_FILE = process.env.HOME + '/.mirror/.lock';
13
+ /**
14
+ * 检查锁文件,确保只有一个 mirror 客户端在运行
15
+ */
16
+ async function checkLockFile() {
17
+ try {
18
+ const fs = await import('fs');
19
+ const path = await import('path');
20
+ const lockDir = path.dirname(LOCK_FILE);
21
+ // 确保目录存在
22
+ if (!fs.existsSync(lockDir)) {
23
+ fs.mkdirSync(lockDir, { recursive: true });
24
+ }
25
+ // 检查锁文件是否存在
26
+ if (fs.existsSync(LOCK_FILE)) {
27
+ const pid = parseInt(fs.readFileSync(LOCK_FILE, 'utf-8'), 10);
28
+ // 检查进程是否还在运行
29
+ try {
30
+ process.kill(pid, 0);
31
+ console.error(`[!] Another mirror client is already running (PID: ${pid})`);
32
+ console.error('[!] Please stop it first with: mirror stop');
33
+ return false;
34
+ }
35
+ catch {
36
+ // 进程不存在,可以删除锁文件
37
+ fs.unlinkSync(LOCK_FILE);
38
+ }
39
+ }
40
+ // 创建锁文件
41
+ fs.writeFileSync(LOCK_FILE, process.pid.toString());
42
+ return true;
43
+ }
44
+ catch (error) {
45
+ console.error('[!] Failed to create lock file:', error);
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * 清理锁文件
51
+ */
52
+ async function cleanupLockFile() {
53
+ try {
54
+ const fs = await import('fs');
55
+ if (fs.existsSync(LOCK_FILE)) {
56
+ fs.unlinkSync(LOCK_FILE);
57
+ }
58
+ }
59
+ catch (error) {
60
+ // 忽略错误
61
+ }
62
+ }
63
+ /**
64
+ * link 命令:连接服务端
65
+ */
66
+ export async function linkCommand(server, options) {
67
+ console.log('Mirror HTTP Tunnel Client');
68
+ console.log('=========================\n');
69
+ // 检查锁文件
70
+ const lockCheck = await checkLockFile();
71
+ if (!lockCheck) {
72
+ process.exit(1);
73
+ }
74
+ // 创建规则管理器
75
+ ruleManager = new RuleManager();
76
+ // 检查是否已有服务器配置
77
+ const existingConfig = ruleManager.getServer();
78
+ if (existingConfig.server && existingConfig.server !== server) {
79
+ console.log(`[!] 已有不同服务器配置: ${existingConfig.server}`);
80
+ console.log(`[*] 正在连接到新服务器: ${server}`);
81
+ }
82
+ // 保存服务器配置
83
+ ruleManager.setServer(server, options.token);
84
+ console.log(`[*] Server: ${server}`);
85
+ if (options.token) {
86
+ console.log(`[*] Token: ${options.token}`);
87
+ }
88
+ // 构建 WebSocket URL
89
+ let wsUrl = `wss://${server}`;
90
+ if (!server.includes(':')) {
91
+ wsUrl = `wss://${server}:7332`;
92
+ }
93
+ else {
94
+ const [host, port] = server.split(':');
95
+ wsUrl = `wss://${host}:${port}`;
96
+ }
97
+ // 添加 token
98
+ if (options.token) {
99
+ const separator = wsUrl.includes('?') ? '&' : '?';
100
+ wsUrl = `${wsUrl}${separator}token=${options.token}`;
101
+ }
102
+ console.log(`[*] Connecting to ${wsUrl}...`);
103
+ try {
104
+ tunnelWs = new WebSocket(wsUrl);
105
+ tunnelWs.on('open', () => {
106
+ console.log('[✓] Connected to server\n');
107
+ isConnected = true;
108
+ // 发送规则同步
109
+ syncRules();
110
+ });
111
+ tunnelWs.on('message', (data) => {
112
+ handleTunnelMessage(data);
113
+ });
114
+ tunnelWs.on('close', (code, reason) => {
115
+ const reasonStr = reason ? reason.toString() : 'Unknown reason';
116
+ console.log(`[!] Disconnected from server: ${reasonStr} (code: ${code})\n`);
117
+ isConnected = false;
118
+ cleanupLockFile();
119
+ process.exit(0);
120
+ });
121
+ tunnelWs.on('error', (error) => {
122
+ console.error('[!] Connection error:', error.message);
123
+ cleanupLockFile();
124
+ process.exit(1);
125
+ });
126
+ // 处理进程退出
127
+ const exitHandler = () => {
128
+ console.log('\n[*] Disconnecting...');
129
+ if (tunnelWs) {
130
+ tunnelWs.close();
131
+ }
132
+ cleanupLockFile();
133
+ process.exit(0);
134
+ };
135
+ process.on('SIGINT', exitHandler);
136
+ process.on('SIGTERM', exitHandler);
137
+ // 防止进程退出
138
+ await new Promise(() => { });
139
+ }
140
+ catch (error) {
141
+ console.error('[!] Failed to connect:', error);
142
+ cleanupLockFile();
143
+ process.exit(1);
144
+ }
145
+ }
146
+ /**
147
+ * add 命令:添加代理规则
148
+ */
149
+ export async function addCommand(domainPath, target) {
150
+ console.log('Mirror - Add Proxy Rule');
151
+ console.log('========================\n');
152
+ // 解析 domain 和 path
153
+ const domainMatch = domainPath.match(/^([^/]+)(.*)$/);
154
+ if (!domainMatch) {
155
+ console.error('[!] Invalid domain/path format');
156
+ console.error('[!] Usage: mirror add <domain/path> <target>');
157
+ console.error('[!] Example: mirror add example.com/api localhost:3001');
158
+ process.exit(1);
159
+ }
160
+ const domain = domainMatch[1];
161
+ const path = domainMatch[2] || '/';
162
+ // 验证参数
163
+ if (!domain || !target) {
164
+ console.error('[!] Missing required arguments');
165
+ console.error('[!] Usage: mirror add <domain/path> <target>');
166
+ console.error('[!] Example: mirror add example.com/api localhost:3001');
167
+ process.exit(1);
168
+ }
169
+ console.log(`[*] Domain: ${domain}`);
170
+ console.log(`[*] Path: ${path}`);
171
+ console.log(`[*] Target: ${target}\n`);
172
+ // 创建规则管理器
173
+ const ruleManager = new RuleManager();
174
+ // 添加规则
175
+ const rule = ruleManager.addRule(domain, path, target);
176
+ if (rule) {
177
+ console.log('[✓] Rule added successfully\n');
178
+ console.log(` ID: ${rule.id}`);
179
+ console.log(` ${rule.domain}${rule.path} -> ${rule.target}`);
180
+ // 根据路径长度显示优先级
181
+ const pathLength = rule.path.replace(/\/$/, '').length || 1;
182
+ let priorityText = '中';
183
+ if (pathLength > 1) {
184
+ priorityText = '高';
185
+ }
186
+ else if (rule.path === '/') {
187
+ priorityText = '低';
188
+ }
189
+ console.log(` 优先级: ${priorityText} (路径长度: ${pathLength})\n`);
190
+ }
191
+ else {
192
+ console.error('[!] Failed to add rule\n');
193
+ process.exit(1);
194
+ }
195
+ // 如果已连接,同步规则
196
+ if (isConnected && tunnelWs) {
197
+ console.log('[*] Syncing rules to server...');
198
+ syncRules();
199
+ }
200
+ }
201
+ /**
202
+ * remove 命令:删除代理规则
203
+ */
204
+ export async function removeCommand(ruleId) {
205
+ console.log('Mirror - Remove Proxy Rule');
206
+ console.log('===========================\n');
207
+ const ruleManager = new RuleManager();
208
+ if (ruleId) {
209
+ // 删除指定规则
210
+ const id = parseInt(ruleId, 10);
211
+ if (isNaN(id)) {
212
+ console.error('[!] Invalid rule ID:', ruleId);
213
+ process.exit(1);
214
+ }
215
+ const rules = ruleManager.getRules();
216
+ const rule = rules.find(r => r.id === id);
217
+ if (!rule) {
218
+ console.error(`[!] Rule not found: ${id}`);
219
+ process.exit(1);
220
+ }
221
+ ruleManager.removeRule(id);
222
+ console.log(`[✓] Rule removed: ${rule.domain}${rule.path} -> ${rule.target}\n`);
223
+ }
224
+ else {
225
+ // 删除所有规则
226
+ const count = ruleManager.getRules().length;
227
+ ruleManager.removeRule();
228
+ console.log(`[✓] All rules removed (${count} rules)\n`);
229
+ }
230
+ // 如果已连接,同步规则
231
+ if (isConnected && tunnelWs) {
232
+ console.log('[*] Syncing rules to server...');
233
+ syncRules();
234
+ }
235
+ }
236
+ /**
237
+ * list 命令:查看代理规则
238
+ */
239
+ export async function listCommand() {
240
+ console.log('Mirror - Proxy Rules');
241
+ console.log('====================\n');
242
+ const ruleManager = new RuleManager();
243
+ const rules = ruleManager.getRules();
244
+ if (rules.length === 0) {
245
+ console.log('[!] No rules configured\n');
246
+ return;
247
+ }
248
+ console.log(`Total: ${rules.length} rule(s)\n`);
249
+ for (const rule of rules) {
250
+ const priorityLabel = rule.priority === 'high' ? '高' : '低';
251
+ const priorityNote = rule.priority === 'high' ? '(路径规则)' : '(域名规则)';
252
+ console.log(`[${rule.id}] ${rule.domain}${rule.path} -> ${rule.target}`);
253
+ console.log(` Priority: ${priorityLabel}${priorityNote}`);
254
+ console.log(` Created: ${new Date(rule.createdAt).toLocaleString()}`);
255
+ console.log();
256
+ }
257
+ }
258
+ /**
259
+ * stop 命令:断开连接
260
+ */
261
+ export async function stopCommand() {
262
+ console.log('Mirror - Stop Connection');
263
+ console.log('========================\n');
264
+ // 检查锁文件
265
+ try {
266
+ const fs = await import('fs');
267
+ const lockFile = process.env.HOME + '/.mirror/.lock';
268
+ if (!fs.existsSync(lockFile)) {
269
+ console.log('[!] No mirror client is running\n');
270
+ process.exit(0);
271
+ }
272
+ const pid = parseInt(fs.readFileSync(lockFile, 'utf-8'), 10);
273
+ try {
274
+ // 发送 SIGTERM 信号
275
+ process.kill(pid, 'SIGTERM');
276
+ console.log(`[✓] Sending stop signal to mirror client (PID: ${pid})\n`);
277
+ }
278
+ catch {
279
+ console.log(`[!] Mirror client (PID: ${pid}) is not responding\n`);
280
+ console.log('[!] Cleaning up lock file...');
281
+ fs.unlinkSync(lockFile);
282
+ console.log('[✓] Lock file removed\n');
283
+ }
284
+ }
285
+ catch (error) {
286
+ console.error('[!] Error:', error);
287
+ }
288
+ process.exit(0);
289
+ }
290
+ /**
291
+ * status 命令:查看连接状态
292
+ */
293
+ export async function statusCommand() {
294
+ console.log('Mirror - Connection Status');
295
+ console.log('==========================\n');
296
+ try {
297
+ const fs = await import('fs');
298
+ const lockFile = process.env.HOME + '/.mirror/.lock';
299
+ const ruleManager = new RuleManager();
300
+ // 检查进程状态
301
+ if (fs.existsSync(lockFile)) {
302
+ const pid = parseInt(fs.readFileSync(lockFile, 'utf-8'), 10);
303
+ try {
304
+ process.kill(pid, 0);
305
+ console.log('[✓] Mirror client is running');
306
+ console.log(` PID: ${pid}\n`);
307
+ }
308
+ catch {
309
+ console.log('[!] Mirror client is not running (stale lock file)');
310
+ console.log('[!] Cleaning up lock file...');
311
+ fs.unlinkSync(lockFile);
312
+ console.log('[✓] Lock file removed\n');
313
+ }
314
+ }
315
+ else {
316
+ console.log('[!] Mirror client is not running\n');
317
+ }
318
+ // 显示服务器配置
319
+ const config = ruleManager.getServer();
320
+ if (config.server) {
321
+ console.log('Server Configuration:');
322
+ console.log(` Server: ${config.server}`);
323
+ if (config.token) {
324
+ console.log(` Token: ${config.token.substring(0, 8)}...`);
325
+ }
326
+ console.log();
327
+ }
328
+ else {
329
+ console.log('[!] No server configured\n');
330
+ }
331
+ // 显示规则
332
+ const rules = ruleManager.getRules();
333
+ if (rules.length > 0) {
334
+ console.log(`Proxy Rules (${rules.length} configured):`);
335
+ for (const rule of rules) {
336
+ const priority = rule.priority === 'high' ? '高' : '低';
337
+ console.log(` [${rule.id}] ${rule.domain}${rule.path} -> ${rule.target} (${priority})`);
338
+ }
339
+ console.log();
340
+ }
341
+ else {
342
+ console.log('[!] No proxy rules configured\n');
343
+ }
344
+ }
345
+ catch (error) {
346
+ console.error('[!] Error:', error);
347
+ }
348
+ process.exit(0);
349
+ }
350
+ /**
351
+ * server 命令:启动 HTTP 隧道服务端
352
+ */
353
+ export async function serverCommand(options) {
354
+ const { port, host, tunnelPort, token, timeout } = options;
355
+ console.log('Mirror HTTP Tunnel Server');
356
+ console.log('=========================\n');
357
+ // 创建 WebSocket 服务器(用于隧道连接)
358
+ const wss = new WebSocketServer({ port: tunnelPort, host });
359
+ console.log(`[*] WebSocket tunnel server listening on ${host}:${tunnelPort}`);
360
+ if (token) {
361
+ console.log(`[*] Authentication token: ${token}`);
362
+ }
363
+ // 创建 HTTP 隧道服务端
364
+ const tunnelServer = new HttpTunnelServer({
365
+ port,
366
+ host,
367
+ timeout,
368
+ });
369
+ // 启动 HTTP 服务器
370
+ await tunnelServer.start();
371
+ console.log(`[*] HTTP server listening on http://${host}:${port}\n`);
372
+ console.log('[*] Waiting for client connection...\n');
373
+ // 处理 WebSocket 隧道连接
374
+ wss.on('connection', (ws, req) => {
375
+ // 验证 token(如果配置了)
376
+ const url = new URL(req.url || '', `http://${req.headers.host}`);
377
+ const clientToken = url.searchParams.get('token');
378
+ if (token && clientToken !== token) {
379
+ console.log('[!] Client rejected: invalid token');
380
+ ws.close(1008, 'Invalid token');
381
+ return;
382
+ }
383
+ const clientIp = req.socket.remoteAddress || 'unknown';
384
+ console.log(`[✓] New client connected from ${clientIp}`);
385
+ // 设置隧道连接(会自动关闭旧连接)
386
+ tunnelServer.setTunnelConnection(ws);
387
+ console.log('[*] HTTP tunnel is now active\n');
388
+ // 处理客户端断开
389
+ ws.on('close', () => {
390
+ console.log('[!] Client disconnected');
391
+ console.log('[*] HTTP tunnel is inactive\n');
392
+ });
393
+ ws.on('error', (error) => {
394
+ console.error('[!] Client error:', error);
395
+ });
396
+ // 发送欢迎消息
397
+ ws.send(JSON.stringify({
398
+ type: 'WELCOME',
399
+ message: 'Connected to Mirror HTTP Tunnel Server',
400
+ serverVersion: '2.0.0',
401
+ }));
402
+ });
403
+ // 处理 WebSocket 服务器错误
404
+ wss.on('error', (error) => {
405
+ console.error('[!] WebSocket server error:', error);
406
+ process.exit(1);
407
+ });
408
+ // 处理进程退出
409
+ const cleanup = async () => {
410
+ console.log('\n[*] Shutting down...');
411
+ await tunnelServer.stop();
412
+ wss.close();
413
+ process.exit(0);
414
+ };
415
+ process.on('SIGINT', cleanup);
416
+ process.on('SIGTERM', cleanup);
417
+ // 防止进程退出
418
+ await new Promise(() => { });
419
+ }
420
+ /**
421
+ * 同步规则到服务端
422
+ */
423
+ function syncRules() {
424
+ if (!ruleManager || !tunnelWs) {
425
+ return;
426
+ }
427
+ const rules = ruleManager.getRules();
428
+ const syncMessage = {
429
+ type: 'RULES_SYNC',
430
+ rules: rules,
431
+ };
432
+ tunnelWs.send(JSON.stringify(syncMessage));
433
+ }
434
+ /**
435
+ * 处理隧道消息
436
+ */
437
+ function handleTunnelMessage(data) {
438
+ try {
439
+ const message = JSON.parse(data.toString());
440
+ switch (message.type) {
441
+ case 'WELCOME':
442
+ console.log(`[✓] ${message.message}`);
443
+ console.log(`[*] Server version: ${message.serverVersion}\n`);
444
+ break;
445
+ case 'RULES_ACK':
446
+ if (message.success) {
447
+ console.log(`[✓] Rules synchronized: ${message.count} rule(s)\n`);
448
+ }
449
+ else {
450
+ console.error(`[!] Failed to sync rules: ${message.message}\n`);
451
+ }
452
+ break;
453
+ default:
454
+ // 其他消息类型暂时忽略
455
+ break;
456
+ }
457
+ }
458
+ catch (error) {
459
+ console.error('[!] Error handling message:', error);
460
+ }
461
+ }
462
+ //# 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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"}
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Mirror CLI 入口 - HTTP 隧道工具
3
+ * Mirror CLI 入口 - HTTP 隧道工具(新版)
4
4
  */
5
5
  export {};
6
6
  //# sourceMappingURL=index.d.ts.map
package/dist/cli/index.js CHANGED
@@ -1,15 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * Mirror CLI 入口 - HTTP 隧道工具
3
+ * Mirror CLI 入口 - HTTP 隧道工具(新版)
4
4
  */
5
5
  import { Command } from 'commander';
6
- import { serverCommand } from './server.js';
7
- import { clientCommand } from './client.js';
8
6
  import { readFile } from 'fs/promises';
9
7
  import { join, dirname } from 'path';
10
8
  import { existsSync } from 'fs';
11
9
  import { fileURLToPath } from 'url';
12
10
  import { execSync } from 'child_process';
11
+ import { linkCommand, addCommand, removeCommand, listCommand, stopCommand, statusCommand, serverCommand } from './cli-commands.js';
13
12
  const program = new Command();
14
13
  async function getPackageVersion() {
15
14
  try {
@@ -64,12 +63,49 @@ async function getPackageVersion() {
64
63
  }
65
64
  // 动态获取版本号
66
65
  const version = await getPackageVersion();
67
- program.name('mirror').description('HTTP 隧道工具 - 将本地服务暴露到公网').version(version);
66
+ program
67
+ .name('mirror')
68
+ .description('HTTP 隧道工具 - 将本地服务暴露到公网(支持多服务代理)')
69
+ .version(version);
70
+ // link 命令:连接服务端
71
+ program
72
+ .command('link')
73
+ .description('连接到 Mirror 服务端')
74
+ .argument('<server>', '服务端地址,格式: mirror.tri-bank.online')
75
+ .option('-t, --token <token>', '认证令牌')
76
+ .action(linkCommand);
77
+ // add 命令:添加代理规则
78
+ program
79
+ .command('add <domainPath> <target>')
80
+ .description('添加代理规则(格式:domain/path target)')
81
+ .action(addCommand);
82
+ // remove 命令:删除代理规则
83
+ program
84
+ .command('remove')
85
+ .description('删除代理规则(未指定ID则删除全部)')
86
+ .argument('[ruleId]', '规则ID(可选)')
87
+ .action(removeCommand);
88
+ // list 命令:查看代理规则
89
+ program
90
+ .command('list')
91
+ .description('查看所有代理规则')
92
+ .action(listCommand);
93
+ // stop 命令:断开连接
94
+ program
95
+ .command('stop')
96
+ .description('断开与服务端的连接')
97
+ .action(stopCommand);
98
+ // status 命令:查看连接状态
99
+ program
100
+ .command('status')
101
+ .description('查看当前连接状态')
102
+ .action(statusCommand);
103
+ // server 命令:启动服务端
68
104
  program
69
105
  .command('server')
70
106
  .description('启动 HTTP 隧道服务端(接收 HTTP 请求并转发给客户端)')
71
107
  .option('-p, --port <port>', 'HTTP 服务端口(默认 80)', '80')
72
- .option('-t, --tunnel-port <port>', 'WebSocket 隧道端口(默认 7332)', '7332')
108
+ .option('-t, --tunnel-port <port>', 'WebSocket 隧道端口(默认 3000)', '3000')
73
109
  .option('--host <host>', '监听地址(默认 0.0.0.0)', '0.0.0.0')
74
110
  .option('--token <token>', '认证令牌(可选)')
75
111
  .option('--timeout <ms>', '请求超时时间(毫秒)', '30000')
@@ -80,20 +116,5 @@ program
80
116
  token: options.token,
81
117
  timeout: parseInt(options.timeout, 10),
82
118
  }));
83
- program
84
- .command('client')
85
- .description('启动 HTTP 隧道客户端(连接到服务端并转发到本地服务)')
86
- .argument('<serverUrl>', '服务端 WebSocket 地址,格式: ws://host[:port]')
87
- .argument('<targetUrl>', '本地服务地址,格式: http://localhost:port')
88
- .option('-t, --token <token>', '认证令牌(可选)')
89
- .option('--reconnect-interval <ms>', '重连间隔(毫秒)', '5000')
90
- .option('--max-retries <number>', '最大重试次数', '10')
91
- .action((serverUrl, targetUrl, options) => clientCommand({
92
- serverUrl,
93
- targetUrl,
94
- token: options.token,
95
- reconnectInterval: parseInt(options.reconnectInterval, 10),
96
- maxRetries: parseInt(options.maxRetries, 10),
97
- }));
98
119
  program.parse();
99
120
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -87,9 +87,9 @@ export class HttpTunnelClient {
87
87
  */
88
88
  async handleHttpRequest(message) {
89
89
  try {
90
- const { requestId, method, url: requestUrl, headers, body } = message;
91
- // 构建完整的目标 URL
92
- const targetUrl = this.buildTargetUrl(requestUrl);
90
+ const { requestId, method, url: requestUrl, headers, body, target } = message;
91
+ // 构建目标 URL
92
+ const targetUrl = target ? `http://${target}` : this.buildTargetUrl(requestUrl);
93
93
  // 请求体
94
94
  const bodyBuffer = body ? Buffer.from(body, 'base64') : undefined;
95
95
  // 发送请求到本地服务