@feng3d/cts 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,150 @@
1
+ # @feng3d/cts
2
+
3
+ **cts** 是 **穿透服务器**(Chuantou Server)的缩写。
4
+
5
+ 内网穿透转发系统的服务端,负责接收公网请求并转发给内网客户端。
6
+
7
+ ## 特性
8
+
9
+ - WebSocket 控制通道
10
+ - 动态端口分配
11
+ - 自动心跳检测
12
+ - 多客户端支持
13
+ - Token 认证
14
+ - TLS 加密支持
15
+ - 开机自启动
16
+ - Web 状态监控
17
+
18
+ ## 快速开始
19
+
20
+ 推荐使用 `npx` 直接运行,无需全局安装:
21
+
22
+ ```bash
23
+ # 启动服务器
24
+ npx @feng3d/cts start -p 9000 -t "my-token"
25
+
26
+ # 查询状态
27
+ npx @feng3d/cts status
28
+
29
+ # 停止服务器
30
+ npx @feng3d/cts stop
31
+ ```
32
+
33
+ ## 命令说明
34
+
35
+ ### `start` - 启动服务器
36
+
37
+ ```bash
38
+ npx @feng3d/cts start [选项]
39
+ ```
40
+
41
+ **常用示例:**
42
+
43
+ ```bash
44
+ # 默认配置启动
45
+ npx @feng3d/cts start
46
+
47
+ # 指定端口和 token
48
+ npx @feng3d/cts start -p 9000 -t "my-token"
49
+
50
+ # 多个 token(逗号分隔)
51
+ npx @feng3d/cts start -p 9000 -t "token1,token2,token3"
52
+
53
+ # 完整参数示例
54
+ npx @feng3d/cts start -p 9000 -a 0.0.0.0 -t "my-token" --heartbeat-interval 30000 --session-timeout 60000
55
+
56
+ # 启动后打开浏览器监控页面
57
+ npx @feng3d/cts start -p 9000 -t "my-token" --open
58
+
59
+ # 不注册开机自启动
60
+ npx @feng3d/cts start --no-boot
61
+ ```
62
+
63
+ **参数说明:**
64
+
65
+ | 参数 | 说明 | 默认值 |
66
+ |------|------|--------|
67
+ | `-p, --port <port>` | 控制端口 | `9000` |
68
+ | `-a, --host <address>` | 监听地址 | `0.0.0.0` |
69
+ | `-t, --tokens <tokens>` | 认证令牌(逗号分隔) | - |
70
+ | `--tls-key <path>` | TLS 私钥文件路径 | - |
71
+ | `--tls-cert <path>` | TLS 证书文件路径 | - |
72
+ | `--heartbeat-interval <ms>` | 心跳间隔(毫秒) | `30000` |
73
+ | `--session-timeout <ms>` | 会话超时(毫秒) | `60000` |
74
+ | `-o, --open` | 启动后在浏览器中打开状态页面 | - |
75
+ | `--no-boot` | 不注册开机自启动 | - |
76
+
77
+ ### `status` - 查询服务器状态
78
+
79
+ ```bash
80
+ npx @feng3d/cts status
81
+ ```
82
+
83
+ **输出示例:**
84
+
85
+ ```
86
+ 穿透服务器状态
87
+ 运行中: 是
88
+ 主机: 0.0.0.0:9000
89
+ TLS: 已禁用
90
+ 运行时长: 3600秒
91
+ 客户端: 2
92
+ 端口: 4
93
+ 连接数: 12
94
+ 开机自启: 已注册
95
+ ```
96
+
97
+ ### `stop` - 停止服务器
98
+
99
+ ```bash
100
+ npx @feng3d/cts stop
101
+ ```
102
+
103
+ 停止服务器并取消开机自启动。
104
+
105
+ ## Web 状态监控
106
+
107
+ 服务器启动后,可以通过浏览器访问状态监控页面:
108
+
109
+ ```
110
+ http://127.0.0.1:9000/
111
+ ```
112
+
113
+ 状态页面显示:
114
+ - 服务器运行状态(运行中/已停止)
115
+ - 监听地址和端口
116
+ - 运行时长
117
+ - 已认证客户端数量
118
+ - 已注册端口数量
119
+ - 活跃连接数
120
+ - TLS 状态
121
+ - 客户端会话列表
122
+ - 每 3 秒自动刷新
123
+
124
+ 使用 `--open` 参数启动时可自动打开浏览器:
125
+ ```bash
126
+ npx @feng3d/cts start --open
127
+ ```
128
+
129
+ ## 多 Token 配置
130
+
131
+ 支持配置多个认证令牌,允许不同的客户端使用各自的令牌连接:
132
+
133
+ ```bash
134
+ # 三个客户端使用不同的 token
135
+ npx @feng3d/cts start -t "client1-token,client2-token,client3-token"
136
+ ```
137
+
138
+ 每个客户端连接时使用对应的 token 即可认证成功。
139
+
140
+ ## 架构
141
+
142
+ ```
143
+ 公网用户请求 -> 服务端监听端口 -> WebSocket 控制通道 -> 内网客户端 -> 本地服务
144
+ ```
145
+
146
+ **每个代理端口同时支持 HTTP 和 WebSocket 协议**,客户端无需指定协议类型。
147
+
148
+ ## 许可证
149
+
150
+ ISC
package/dist/boot.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @module boot
3
+ * @description 开机自启动管理模块。
4
+ * 提供跨平台的开机自启动注册、注销和状态查询功能。
5
+ * Windows 使用注册表 Run 键 + VBS 静默启动,Linux 使用 systemd --user 用户级服务。
6
+ */
7
+ /**
8
+ * 启动信息接口
9
+ *
10
+ * 保存启动命令的完整信息,用于重建开机自启动任务。
11
+ */
12
+ export interface StartupInfo {
13
+ /** Node.js 可执行文件的绝对路径 */
14
+ nodePath: string;
15
+ /** CLI 脚本文件的绝对路径 */
16
+ scriptPath: string;
17
+ /** 传递给 _serve 命令的参数数组 */
18
+ args: string[];
19
+ }
20
+ /**
21
+ * 注册开机自启动
22
+ *
23
+ * 将启动信息持久化到磁盘,并根据操作系统注册开机启动任务。
24
+ * Windows 使用注册表 Run 键 + VBS 静默启动,Linux 使用 systemd --user 服务。
25
+ *
26
+ * @param info - 启动信息(Node路径、脚本路径、启动参数)
27
+ */
28
+ export declare function registerBoot(info: StartupInfo): void;
29
+ /**
30
+ * 取消开机自启动
31
+ *
32
+ * 根据操作系统注销开机启动任务,并清理启动配置文件。
33
+ */
34
+ export declare function unregisterBoot(): void;
35
+ /**
36
+ * 查询是否已注册开机自启动
37
+ *
38
+ * @returns 是否已注册
39
+ */
40
+ export declare function isBootRegistered(): boolean;
41
+ //# sourceMappingURL=boot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAcH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAgKD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAUpD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAQrC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAK1C"}
package/dist/boot.js ADDED
@@ -0,0 +1,204 @@
1
+ /**
2
+ * @module boot
3
+ * @description 开机自启动管理模块。
4
+ * 提供跨平台的开机自启动注册、注销和状态查询功能。
5
+ * Windows 使用注册表 Run 键 + VBS 静默启动,Linux 使用 systemd --user 用户级服务。
6
+ */
7
+ import { execSync } from 'child_process';
8
+ import { writeFileSync, readFileSync, unlinkSync, mkdirSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { homedir, platform } from 'os';
11
+ /** 数据目录路径 */
12
+ const DATA_DIR = join(homedir(), '.chuantou');
13
+ /** 启动配置文件路径 */
14
+ const STARTUP_FILE = join(DATA_DIR, 'startup.json');
15
+ /** 任务/服务名称 */
16
+ const TASK_NAME = 'feng3d-cts';
17
+ /**
18
+ * 保存启动信息到文件
19
+ */
20
+ function saveStartupInfo(info) {
21
+ mkdirSync(DATA_DIR, { recursive: true });
22
+ writeFileSync(STARTUP_FILE, JSON.stringify(info, null, 2));
23
+ }
24
+ /**
25
+ * 读取启动信息
26
+ */
27
+ function loadStartupInfo() {
28
+ try {
29
+ return JSON.parse(readFileSync(STARTUP_FILE, 'utf-8'));
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * 删除启动信息文件
37
+ */
38
+ function removeStartupInfo() {
39
+ try {
40
+ unlinkSync(STARTUP_FILE);
41
+ }
42
+ catch {
43
+ // ignore
44
+ }
45
+ }
46
+ // ====== Windows 实现(注册表 Run 键)======
47
+ /** Windows 注册表 Run 键路径 */
48
+ const WIN_REG_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run';
49
+ /** 获取 Windows 启动 VBS 脚本路径 */
50
+ function getStartupScriptPath() {
51
+ return join(DATA_DIR, `${TASK_NAME}.vbs`);
52
+ }
53
+ function registerWindows(info) {
54
+ // 生成 .vbs 启动脚本(使用 WScript.Shell.Run 以隐藏窗口方式启动)
55
+ const serveArgs = info.args.map((a) => (a.includes(' ') ? `""${a}""` : a)).join(' ');
56
+ const command = `""${info.nodePath}"" ""${info.scriptPath}"" _serve ${serveArgs}`;
57
+ const scriptContent = `Set WshShell = CreateObject("WScript.Shell")\r\nWshShell.Run "${command}", 0, False\r\n`;
58
+ const scriptPath = getStartupScriptPath();
59
+ mkdirSync(DATA_DIR, { recursive: true });
60
+ writeFileSync(scriptPath, scriptContent);
61
+ // 通过注册表 Run 键注册开机自启动(无需管理员权限)
62
+ execSync(`reg add "${WIN_REG_KEY}" /v "${TASK_NAME}" /t REG_SZ /d "wscript.exe \\"${scriptPath}\\"" /f`, { stdio: 'ignore', shell: 'cmd.exe' });
63
+ }
64
+ function unregisterWindows() {
65
+ try {
66
+ execSync(`reg delete "${WIN_REG_KEY}" /v "${TASK_NAME}" /f`, { stdio: 'ignore', shell: 'cmd.exe' });
67
+ }
68
+ catch {
69
+ // ignore
70
+ }
71
+ try {
72
+ unlinkSync(getStartupScriptPath());
73
+ }
74
+ catch {
75
+ // ignore
76
+ }
77
+ }
78
+ function isRegisteredWindows() {
79
+ try {
80
+ execSync(`reg query "${WIN_REG_KEY}" /v "${TASK_NAME}"`, { stdio: 'ignore', shell: 'cmd.exe' });
81
+ return true;
82
+ }
83
+ catch {
84
+ return false;
85
+ }
86
+ }
87
+ // ====== Linux 实现(systemd --user)======
88
+ function getServiceFilePath() {
89
+ return join(homedir(), '.config', 'systemd', 'user', `${TASK_NAME}.service`);
90
+ }
91
+ function registerLinux(info) {
92
+ const serviceDir = join(homedir(), '.config', 'systemd', 'user');
93
+ mkdirSync(serviceDir, { recursive: true });
94
+ const serveArgs = info.args.map((a) => (a.includes(' ') ? `"${a}"` : a)).join(' ');
95
+ const command = `${info.nodePath} ${info.scriptPath} _serve ${serveArgs}`;
96
+ const logFile = join(DATA_DIR, 'server.log');
97
+ const unit = `[Unit]
98
+ Description=feng3d-cts 穿透内网穿透服务端
99
+ After=network.target
100
+
101
+ [Service]
102
+ Type=simple
103
+ ExecStart=${command}
104
+ Restart=on-failure
105
+ RestartSec=5
106
+ StandardOutput=append:${logFile}
107
+ StandardError=append:${logFile}
108
+
109
+ [Install]
110
+ WantedBy=default.target
111
+ `;
112
+ writeFileSync(getServiceFilePath(), unit);
113
+ execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
114
+ execSync(`systemctl --user enable ${TASK_NAME}.service`, { stdio: 'ignore' });
115
+ // 尝试启用 linger,使服务在用户未登录时也能运行
116
+ try {
117
+ execSync('loginctl enable-linger', { stdio: 'ignore' });
118
+ }
119
+ catch {
120
+ // ignore - 用户可手动运行 sudo loginctl enable-linger $USER
121
+ }
122
+ }
123
+ function unregisterLinux() {
124
+ try {
125
+ execSync(`systemctl --user disable ${TASK_NAME}.service`, { stdio: 'ignore' });
126
+ }
127
+ catch {
128
+ // ignore
129
+ }
130
+ try {
131
+ unlinkSync(getServiceFilePath());
132
+ }
133
+ catch {
134
+ // ignore
135
+ }
136
+ try {
137
+ execSync('systemctl --user daemon-reload', { stdio: 'ignore' });
138
+ }
139
+ catch {
140
+ // ignore
141
+ }
142
+ }
143
+ function isRegisteredLinux() {
144
+ try {
145
+ const result = execSync(`systemctl --user is-enabled ${TASK_NAME}.service`, {
146
+ encoding: 'utf-8',
147
+ });
148
+ return result.trim() === 'enabled';
149
+ }
150
+ catch {
151
+ return false;
152
+ }
153
+ }
154
+ // ====== 公共 API ======
155
+ /**
156
+ * 注册开机自启动
157
+ *
158
+ * 将启动信息持久化到磁盘,并根据操作系统注册开机启动任务。
159
+ * Windows 使用注册表 Run 键 + VBS 静默启动,Linux 使用 systemd --user 服务。
160
+ *
161
+ * @param info - 启动信息(Node路径、脚本路径、启动参数)
162
+ */
163
+ export function registerBoot(info) {
164
+ saveStartupInfo(info);
165
+ const os = platform();
166
+ if (os === 'win32') {
167
+ registerWindows(info);
168
+ }
169
+ else if (os === 'linux') {
170
+ registerLinux(info);
171
+ }
172
+ else {
173
+ throw new Error(`不支持在 ${os} 上注册开机自启动`);
174
+ }
175
+ }
176
+ /**
177
+ * 取消开机自启动
178
+ *
179
+ * 根据操作系统注销开机启动任务,并清理启动配置文件。
180
+ */
181
+ export function unregisterBoot() {
182
+ const os = platform();
183
+ if (os === 'win32') {
184
+ unregisterWindows();
185
+ }
186
+ else if (os === 'linux') {
187
+ unregisterLinux();
188
+ }
189
+ removeStartupInfo();
190
+ }
191
+ /**
192
+ * 查询是否已注册开机自启动
193
+ *
194
+ * @returns 是否已注册
195
+ */
196
+ export function isBootRegistered() {
197
+ const os = platform();
198
+ if (os === 'win32')
199
+ return isRegisteredWindows();
200
+ if (os === 'linux')
201
+ return isRegisteredLinux();
202
+ return false;
203
+ }
204
+ //# sourceMappingURL=boot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @module cli
4
+ * @description 穿透服务端命令行工具模块。
5
+ * 提供 `feng3d-cts` CLI 命令,支持通过命令行启动、停止和查询转发服务器状态。
6
+ * `start` 以后台守护进程方式运行服务器并注册开机自启动。
7
+ * 使用 PID 文件跟踪运行中的服务器实例,以实现跨进程的状态管理。
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG"}