@feng3d/ctc 0.0.6

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 ADDED
@@ -0,0 +1,195 @@
1
+ # @feng3d/ctc
2
+
3
+ **ctc** 是 **穿透客户端**(Chuantou Client)的缩写。
4
+
5
+ 内网穿透转发系统的客户端,运行在内网机器上,将本地服务暴露到公网。
6
+
7
+ ## 特性
8
+
9
+ - WebSocket 控制通道
10
+ - 自动重连机制
11
+ - **每个端口同时支持 HTTP 和 WebSocket 代理**
12
+ - 多代理支持
13
+ - 单实例模式:支持动态添加代理映射
14
+
15
+ ## 快速开始
16
+
17
+ 推荐使用 `npx` 直接运行,无需全局安装:
18
+
19
+ ```bash
20
+ # 启动客户端(连接本地服务器测试)
21
+ npx @feng3d/ctc start -s ws://localhost:9000 -t "my-token" -p "8080:3000:localhost"
22
+
23
+ # 查询状态
24
+ npx @feng3d/ctc status
25
+
26
+ # 列出代理映射
27
+ npx @feng3d/ctc list
28
+
29
+ # 停止客户端
30
+ npx @feng3d/ctc stop
31
+ ```
32
+
33
+ ## 命令说明
34
+
35
+ ### `start` - 启动客户端
36
+
37
+ ```bash
38
+ npx @feng3d/ctc start [选项]
39
+ ```
40
+
41
+ **单实例模式**:只允许一个客户端实例运行。如果客户端已运行,后续的 `start` 命令会向已运行的进程添加新的代理映射。
42
+
43
+ **常用示例:**
44
+
45
+ ```bash
46
+ # 指定服务器地址和认证令牌
47
+ npx @feng3d/ctc start -s ws://your-server.com:9000 -t "my-token"
48
+
49
+ # 添加单个代理映射:远程8080端口代理到本地3000端口
50
+ npx @feng3d/ctc start -s ws://your-server.com:9000 -t "my-token" -p "8080:3000:localhost"
51
+
52
+ # 添加多个代理映射
53
+ npx @feng3d/ctc start -s ws://your-server.com:9000 -t "my-token" -p "8080:3000:localhost,8081:3001,8082:8080"
54
+
55
+ # 完整参数示例:指定服务器、令牌、代理和重连配置
56
+ npx @feng3d/ctc start -s ws://your-server.com:9000 -t "my-token" -p "8080:3000:localhost" --reconnect-interval 5000 --max-reconnect 10
57
+ ```
58
+
59
+ **参数说明:**
60
+
61
+ | 参数 | 说明 | 示例 | 默认值 |
62
+ |------|------|------|--------|
63
+ | `-s, --server <url>` | 服务器地址(必填) | `ws://your-server.com:9000` | - |
64
+ | `-t, --token <token>` | 认证令牌(必填) | `my-token` | - |
65
+ | `-p, --proxies <proxies>` | 代理配置(逗号分隔),格式:`远程端口:本地端口:本地地址` | `8080:3000:localhost` | - |
66
+ | `--reconnect-interval <ms>` | 重连间隔(毫秒) | `5000` | `5000` |
67
+ | `--max-reconnect <number>` | 最大重连次数 | `10` | `10` |
68
+ | `--no-daemon` | 前台运行(不作为后台守护进程) | - | - |
69
+ | `-o, --open` | 启动后在浏览器中打开管理页面 | - | - |
70
+
71
+ ### `status` - 查询客户端状态
72
+
73
+ ```bash
74
+ npx @feng3d/ctc status
75
+ ```
76
+
77
+ **输出示例:**
78
+
79
+ ```
80
+ 穿透客户端状态
81
+ 运行中: 是
82
+ 服务器: ws://your-server.com:9000
83
+ PID: 12345
84
+ 运行时长: 5分30秒
85
+ 代理数量: 2
86
+ ```
87
+
88
+ ### `list` - 列出代理映射
89
+
90
+ ```bash
91
+ npx @feng3d/ctc list
92
+ ```
93
+
94
+ **输出示例:**
95
+
96
+ ```
97
+ 当前代理映射:
98
+ :8080 -> localhost:3000
99
+ :8081 -> localhost:3001
100
+ ```
101
+
102
+ ### `stop` - 停止客户端
103
+
104
+ ```bash
105
+ npx @feng3d/ctc stop
106
+ ```
107
+
108
+ 停止客户端并清理所有代理映射。
109
+
110
+ ## Web 管理页面
111
+
112
+ 客户端启动后,可以通过浏览器访问本地管理页面:
113
+
114
+ ```
115
+ http://127.0.0.1:9001/
116
+ ```
117
+
118
+ 管理页面提供以下功能:
119
+ - 查看客户端连接状态(服务器地址、连接状态、认证状态)
120
+ - 查看运行时长和重连次数
121
+ - 查看所有已注册的代理映射
122
+ - 动态添加新的代理映射
123
+ - 删除现有代理映射
124
+ - 每 3 秒自动刷新状态
125
+
126
+ 使用 `--open` 参数启动时可自动打开浏览器:
127
+
128
+ ```bash
129
+ npx @feng3d/ctc start --open
130
+ ```
131
+
132
+ ## 单实例模式
133
+
134
+ 客户端采用单实例模式设计:
135
+
136
+ 1. **首次启动**:启动后台守护进程,建立与服务器的连接
137
+ 2. **再次启动**:如果客户端已运行,则向已运行进程添加新的代理映射
138
+ 3. **不同服务器**:如果尝试连接到不同的服务器,会提示错误
139
+
140
+ 这种设计简化了多代理的管理,无需为每组代理配置单独启动客户端。
141
+
142
+ ## 代理配置格式
143
+
144
+ ```
145
+ remotePort:localPort[:localHost]
146
+ ```
147
+
148
+ - `remotePort` - 公网端口
149
+ - `localPort` - 本地端口
150
+ - `localHost` - 本地地址(可选,默认:localhost)
151
+
152
+ **推荐**:本地地址为 localhost 时推荐省略,使用 `8080:3000` 而非 `8080:3000:localhost`。
153
+
154
+ 每个代理端口同时支持 HTTP 和 WebSocket 协议。
155
+
156
+ **示例:**
157
+
158
+ ```
159
+ # HTTP 代理
160
+ 8080:3000:localhost
161
+
162
+ # WebSocket 代理(同一端口)
163
+ 8080:3000:localhost
164
+
165
+ # 完整格式
166
+ 8082:8080:192.168.1.100
167
+
168
+ # 多个代理(逗号分隔)
169
+ 8080:3000:localhost,8081:3001,8082:8080
170
+ ```
171
+
172
+ ## 作为库使用
173
+
174
+ ```typescript
175
+ import { Controller, ProxyManager } from '@feng3d/ctc';
176
+ import type { Config } from '@feng3d/chuantou-shared';
177
+
178
+ const config: Config = {
179
+ serverUrl: 'ws://your-server.com:9000',
180
+ token: 'my-token',
181
+ reconnectInterval: 5000,
182
+ maxReconnectAttempts: 10,
183
+ proxies: [
184
+ { remotePort: 8080, localPort: 3000, localHost: 'localhost' },
185
+ { remotePort: 8081, localPort: 3001, localHost: 'localhost' }
186
+ ]
187
+ };
188
+
189
+ const controller = new Controller(config);
190
+ await controller.connect();
191
+ ```
192
+
193
+ ## 许可证
194
+
195
+ ISC
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @module admin-server
3
+ * @description 客户端管理页面 HTTP 服务器模块。
4
+ * 提供一个本地 HTTP 服务,用于查看客户端状态和管理代理映射。
5
+ */
6
+ import { ProxyConfig } from '@feng3d/chuantou-shared';
7
+ /**
8
+ * 客户端状态信息接口
9
+ */
10
+ export interface ClientStatus {
11
+ /** 是否正在运行 */
12
+ running: boolean;
13
+ /** 服务器地址 */
14
+ serverUrl: string;
15
+ /** 是否已连接 */
16
+ connected: boolean;
17
+ /** 是否已认证 */
18
+ authenticated: boolean;
19
+ /** 运行时长(毫秒) */
20
+ uptime: number;
21
+ /** 已注册的代理列表 */
22
+ proxies: ProxyConfig[];
23
+ /** 重连次数 */
24
+ reconnectAttempts: number;
25
+ }
26
+ /**
27
+ * 管理页面服务器配置接口
28
+ */
29
+ export interface AdminServerConfig {
30
+ /** 监听端口 */
31
+ port: number;
32
+ /** 监听地址 */
33
+ host: string;
34
+ }
35
+ /**
36
+ * 管理页面服务器类
37
+ *
38
+ * 在本地启动一个 HTTP 服务器,提供状态查询和代理管理的 API 接口,
39
+ * 以及一个可视化的 Web 管理界面。
40
+ */
41
+ export declare class AdminServer {
42
+ /** HTTP 服务器实例 */
43
+ private server;
44
+ /** 监听端口 */
45
+ private port;
46
+ /** 监听地址 */
47
+ private host;
48
+ /** 启动时间 */
49
+ private startedAt;
50
+ /** 获取状态回调函数 */
51
+ private getStatusCallback;
52
+ /** 添加代理回调函数 */
53
+ private addProxyCallback;
54
+ /** 删除代理回调函数 */
55
+ private removeProxyCallback;
56
+ /**
57
+ * 状态页面 HTML 模板
58
+ */
59
+ private static readonly STATUS_HTML;
60
+ /**
61
+ * 创建管理服务器实例
62
+ *
63
+ * @param config - 服务器配置
64
+ * @param getStatus - 获取状态的回调函数
65
+ * @param addProxy - 添加代理的回调函数
66
+ * @param removeProxy - 删除代理的回调函数
67
+ */
68
+ constructor(config: AdminServerConfig, getStatus: () => ClientStatus, addProxy: (proxy: ProxyConfig) => Promise<void>, removeProxy: (remotePort: number) => Promise<void>);
69
+ /**
70
+ * 启动服务器
71
+ *
72
+ * @returns 启动完成的 Promise
73
+ */
74
+ start(): Promise<void>;
75
+ /**
76
+ * 处理 HTTP 请求
77
+ *
78
+ * 提供以下端点:
79
+ * - `GET /` - 管理页面
80
+ * - `GET /_ctc/status` - 获取状态
81
+ * - `POST /_ctc/proxies` - 添加代理
82
+ * - `DELETE /_ctc/proxies/:port` - 删除代理
83
+ */
84
+ private handleRequest;
85
+ /**
86
+ * 停止服务器
87
+ */
88
+ stop(): Promise<void>;
89
+ }
90
+ //# sourceMappingURL=admin-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-server.d.ts","sourceRoot":"","sources":["../src/admin-server.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,aAAa;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe;IACf,MAAM,EAAE,MAAM,CAAC;IACf,eAAe;IACf,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,WAAW;IACX,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,iBAAiB;IACjB,OAAO,CAAC,MAAM,CAAkC;IAChD,WAAW;IACX,OAAO,CAAC,IAAI,CAAS;IACrB,WAAW;IACX,OAAO,CAAC,IAAI,CAAS;IACrB,WAAW;IACX,OAAO,CAAC,SAAS,CAAS;IAC1B,eAAe;IACf,OAAO,CAAC,iBAAiB,CAAqB;IAC9C,eAAe;IACf,OAAO,CAAC,gBAAgB,CAAwC;IAChE,eAAe;IACf,OAAO,CAAC,mBAAmB,CAAwC;IAEnE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAqiBnC;IAEA;;;;;;;OAOG;gBAED,MAAM,EAAE,iBAAiB,EACzB,SAAS,EAAE,MAAM,YAAY,EAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,EAC/C,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC;IAYpD;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAc5B;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAgErB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ5B"}