@feng3d/ctc 0.0.10 → 0.0.12

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 (42) hide show
  1. package/README.md +17 -32
  2. package/dist/admin-server.d.ts +65 -12
  3. package/dist/admin-server.d.ts.map +1 -1
  4. package/dist/admin-server.js +291 -564
  5. package/dist/admin-server.js.map +1 -1
  6. package/dist/cli.d.ts +12 -3
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +931 -311
  9. package/dist/cli.js.map +1 -1
  10. package/dist/config.d.ts +5 -1
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +20 -11
  13. package/dist/config.js.map +1 -1
  14. package/dist/controller.d.ts +27 -124
  15. package/dist/controller.d.ts.map +1 -1
  16. package/dist/controller.js +77 -139
  17. package/dist/controller.js.map +1 -1
  18. package/dist/data-channel.d.ts +76 -0
  19. package/dist/data-channel.d.ts.map +1 -0
  20. package/dist/data-channel.js +222 -0
  21. package/dist/data-channel.js.map +1 -0
  22. package/dist/forward-proxy.d.ts +100 -0
  23. package/dist/forward-proxy.d.ts.map +1 -0
  24. package/dist/forward-proxy.js +407 -0
  25. package/dist/forward-proxy.js.map +1 -0
  26. package/dist/handlers/unified-handler.d.ts +33 -75
  27. package/dist/handlers/unified-handler.d.ts.map +1 -1
  28. package/dist/handlers/unified-handler.js +191 -315
  29. package/dist/handlers/unified-handler.js.map +1 -1
  30. package/dist/index.d.ts +3 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +135 -36
  33. package/dist/index.js.map +1 -1
  34. package/dist/ipc-handler.d.ts +52 -0
  35. package/dist/ipc-handler.d.ts.map +1 -0
  36. package/dist/ipc-handler.js +110 -0
  37. package/dist/ipc-handler.js.map +1 -0
  38. package/dist/proxy-manager.d.ts +13 -6
  39. package/dist/proxy-manager.d.ts.map +1 -1
  40. package/dist/proxy-manager.js +58 -23
  41. package/dist/proxy-manager.js.map +1 -1
  42. package/package.json +9 -5
@@ -0,0 +1,222 @@
1
+ /**
2
+ * @module data-channel
3
+ *
4
+ * 客户端数据通道模块。
5
+ *
6
+ * 管理与服务端的 TCP 二进制数据通道和 UDP 数据通道连接。
7
+ * TCP 数据通道用于高效传输 HTTP/WS/TCP 的原始二进制数据,
8
+ * UDP 数据通道用于保留 UDP 语义的数据转发。
9
+ */
10
+ import { Socket } from 'net';
11
+ import { createSocket as createUdpSocket } from 'dgram';
12
+ import { EventEmitter } from 'events';
13
+ import { writeTcpAuthFrame, writeDataFrame, writeUdpRegisterFrame, writeUdpKeepaliveFrame, writeUdpDataFrame, parseUdpDataFrame, FrameParser, logger, } from '@feng3d/chuantou-shared';
14
+ /** UDP 保活间隔(毫秒) */
15
+ const UDP_KEEPALIVE_INTERVAL = 15000;
16
+ /**
17
+ * 客户端数据通道
18
+ *
19
+ * 管理与服务端的 TCP 数据通道和 UDP 数据通道。
20
+ *
21
+ * 事件:
22
+ * - `'data'(connectionId, data)` — 收到服务端 TCP 数据帧
23
+ * - `'udpData'(connectionId, data)` — 收到服务端 UDP 数据帧
24
+ * - `'connected'` — TCP 数据通道已连接
25
+ * - `'disconnected'` — TCP 数据通道已断开
26
+ */
27
+ export class DataChannel extends EventEmitter {
28
+ constructor() {
29
+ super(...arguments);
30
+ this.tcpSocket = null;
31
+ this.udpSocket = null;
32
+ this.frameParser = null;
33
+ this.udpKeepaliveTimer = null;
34
+ this.clientId = '';
35
+ this.serverHost = '';
36
+ this.serverPort = 0;
37
+ }
38
+ /**
39
+ * 建立 TCP 数据通道
40
+ *
41
+ * @param serverHost - 服务端地址
42
+ * @param serverPort - 服务端端口(与控制端口相同)
43
+ * @param clientId - 服务端分配的客户端 ID
44
+ */
45
+ async connectTcp(serverHost, serverPort, clientId) {
46
+ this.clientId = clientId;
47
+ this.serverHost = serverHost;
48
+ this.serverPort = serverPort;
49
+ return new Promise((resolve, reject) => {
50
+ const socket = new Socket();
51
+ socket.on('connect', () => {
52
+ // 发送认证帧
53
+ socket.write(writeTcpAuthFrame(clientId));
54
+ });
55
+ // 等待认证响应(1 字节)
56
+ let authenticated = false;
57
+ socket.once('data', (data) => {
58
+ if (data[0] === 0x01) {
59
+ authenticated = true;
60
+ this.tcpSocket = socket;
61
+ // 设置帧解析器
62
+ this.frameParser = new FrameParser();
63
+ this.frameParser.on('frame', (connectionId, frameData) => {
64
+ this.emit('data', connectionId, frameData);
65
+ });
66
+ // 后续数据走帧解析器
67
+ socket.on('data', (chunk) => {
68
+ this.frameParser.push(chunk);
69
+ });
70
+ // 如果认证响应后有额外数据,也推入解析器
71
+ if (data.length > 1) {
72
+ this.frameParser.push(data.subarray(1));
73
+ }
74
+ logger.log('TCP 数据通道已建立');
75
+ this.emit('connected');
76
+ resolve();
77
+ }
78
+ else {
79
+ reject(new Error('TCP 数据通道认证失败'));
80
+ socket.destroy();
81
+ }
82
+ });
83
+ socket.on('close', () => {
84
+ if (authenticated) {
85
+ logger.log('TCP 数据通道已断开');
86
+ this.tcpSocket = null;
87
+ this.frameParser = null;
88
+ this.emit('disconnected');
89
+ }
90
+ });
91
+ socket.on('error', (error) => {
92
+ if (!authenticated) {
93
+ reject(error);
94
+ }
95
+ else {
96
+ logger.error('TCP 数据通道错误:', error.message);
97
+ }
98
+ });
99
+ socket.connect({ host: serverHost, port: serverPort });
100
+ });
101
+ }
102
+ /**
103
+ * 建立 UDP 数据通道
104
+ *
105
+ * @param serverHost - 服务端地址
106
+ * @param serverPort - 服务端端口(与控制端口相同)
107
+ * @param clientId - 服务端分配的客户端 ID
108
+ */
109
+ async connectUdp(serverHost, serverPort, clientId) {
110
+ this.clientId = clientId;
111
+ this.serverHost = serverHost;
112
+ this.serverPort = serverPort;
113
+ return new Promise((resolve, reject) => {
114
+ const socket = createUdpSocket('udp4');
115
+ socket.on('error', (error) => {
116
+ logger.error('UDP 数据通道错误:', error.message);
117
+ reject(error);
118
+ });
119
+ socket.bind(() => {
120
+ // 发送注册帧
121
+ const registerFrame = writeUdpRegisterFrame(clientId);
122
+ socket.send(registerFrame, serverPort, serverHost);
123
+ // 等待确认
124
+ const timeout = setTimeout(() => {
125
+ reject(new Error('UDP 注册超时'));
126
+ socket.close();
127
+ }, 5000);
128
+ socket.once('message', (msg) => {
129
+ clearTimeout(timeout);
130
+ if (msg[0] === 0x01) {
131
+ this.udpSocket = socket;
132
+ // 设置数据接收
133
+ socket.on('message', (data) => {
134
+ const frame = parseUdpDataFrame(data);
135
+ if (frame) {
136
+ this.emit('udpData', frame.connectionId, frame.data);
137
+ }
138
+ });
139
+ // 启动保活
140
+ this.udpKeepaliveTimer = setInterval(() => {
141
+ if (this.udpSocket) {
142
+ const keepalive = writeUdpKeepaliveFrame(clientId);
143
+ this.udpSocket.send(keepalive, serverPort, serverHost);
144
+ }
145
+ }, UDP_KEEPALIVE_INTERVAL);
146
+ logger.log('UDP 数据通道已建立');
147
+ resolve();
148
+ }
149
+ else {
150
+ reject(new Error('UDP 注册失败'));
151
+ socket.close();
152
+ }
153
+ });
154
+ });
155
+ });
156
+ }
157
+ /**
158
+ * 通过 TCP 数据通道发送数据帧
159
+ *
160
+ * @param connectionId - 连接 ID
161
+ * @param data - 要发送的原始数据
162
+ * @returns 是否发送成功
163
+ */
164
+ sendData(connectionId, data) {
165
+ if (this.tcpSocket && !this.tcpSocket.destroyed) {
166
+ return this.tcpSocket.write(writeDataFrame(connectionId, data));
167
+ }
168
+ return false;
169
+ }
170
+ /**
171
+ * 获取 TCP 数据通道 socket(用于 drain 背压处理)
172
+ */
173
+ getTcpSocket() {
174
+ return this.tcpSocket && !this.tcpSocket.destroyed ? this.tcpSocket : null;
175
+ }
176
+ /**
177
+ * 通过 UDP 数据通道发送数据帧
178
+ *
179
+ * @param connectionId - 连接 ID
180
+ * @param data - 要发送的原始数据
181
+ * @returns 是否发送成功
182
+ */
183
+ sendUdpData(connectionId, data) {
184
+ if (this.udpSocket) {
185
+ const frame = writeUdpDataFrame(connectionId, data);
186
+ this.udpSocket.send(frame, this.serverPort, this.serverHost);
187
+ return true;
188
+ }
189
+ return false;
190
+ }
191
+ /** TCP 数据通道是否已连接 */
192
+ get isTcpConnected() {
193
+ return !!this.tcpSocket && !this.tcpSocket.destroyed;
194
+ }
195
+ /** UDP 数据通道是否已连接 */
196
+ get isUdpConnected() {
197
+ return !!this.udpSocket;
198
+ }
199
+ /**
200
+ * 销毁数据通道,释放所有资源
201
+ */
202
+ destroy() {
203
+ if (this.tcpSocket) {
204
+ this.tcpSocket.destroy();
205
+ this.tcpSocket = null;
206
+ }
207
+ if (this.frameParser) {
208
+ this.frameParser.reset();
209
+ this.frameParser = null;
210
+ }
211
+ if (this.udpKeepaliveTimer) {
212
+ clearInterval(this.udpKeepaliveTimer);
213
+ this.udpKeepaliveTimer = null;
214
+ }
215
+ if (this.udpSocket) {
216
+ this.udpSocket.close();
217
+ this.udpSocket = null;
218
+ }
219
+ this.removeAllListeners();
220
+ }
221
+ }
222
+ //# sourceMappingURL=data-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-channel.js","sourceRoot":"","sources":["../src/data-channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @module forward-proxy
3
+ *
4
+ * 正向穿透代理模块。
5
+ *
6
+ * 实现从本地端口到远程客户端端口的穿透功能。
7
+ * 用户连接本地端口 → 通过中继服务器数据通道 → 连接到目标客户端的指定端口。
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ import { ClientListMessage, ForwardProxyEntry } from '@feng3d/chuantou-shared';
11
+ import { Controller } from './controller.js';
12
+ export type { ForwardProxyEntry };
13
+ /**
14
+ * 正向穿透代理类
15
+ *
16
+ * 管理从本地端口到远程客户端的穿透映射。
17
+ * 支持两种角色:
18
+ * - 发起方: 用户连接本地端口,数据转发到目标客户端
19
+ * - 目标方: 接受来自其他客户端的连接,转发到本地服务
20
+ */
21
+ export declare class ForwardProxy extends EventEmitter {
22
+ private controller;
23
+ private proxies;
24
+ private servers;
25
+ private sessions;
26
+ constructor(controller: Controller);
27
+ /**
28
+ * 设置消息处理器
29
+ */
30
+ private setupMessageHandlers;
31
+ /**
32
+ * 设置数据通道处理器
33
+ */
34
+ private setupDataChannelHandlers;
35
+ /**
36
+ * 处理数据通道数据
37
+ */
38
+ private handleDataChannelData;
39
+ /**
40
+ * 注册客户端(正向穿透模式)
41
+ */
42
+ registerAsClient(description?: string): Promise<void>;
43
+ /**
44
+ * 获取在线客户端列表
45
+ */
46
+ getClientList(): Promise<ClientListMessage['payload']>;
47
+ /**
48
+ * 添加正向穿透代理
49
+ */
50
+ addProxy(entry: ForwardProxyEntry): Promise<void>;
51
+ /**
52
+ * 移除正向穿透代理
53
+ */
54
+ removeProxy(localPort: number): Promise<void>;
55
+ /**
56
+ * 移除指定目标的所有代理
57
+ */
58
+ removeByTarget(targetClientId: string): Promise<number>;
59
+ /**
60
+ * 获取所有代理
61
+ */
62
+ getProxies(): ForwardProxyEntry[];
63
+ /**
64
+ * 检查端口是否可用
65
+ */
66
+ private isPortAvailable;
67
+ /**
68
+ * 处理本地连接(发起方)
69
+ */
70
+ private handleLocalConnection;
71
+ /**
72
+ * 处理入站连接请求(目标方)
73
+ */
74
+ private handleIncomingConnection;
75
+ /**
76
+ * 处理连接已建立消息(发起方)
77
+ */
78
+ private handleConnectionEstablished;
79
+ /**
80
+ * 处理代理目标端口请求(目标方)
81
+ */
82
+ private handleProxyTargetPort;
83
+ /**
84
+ * 处理连接错误
85
+ */
86
+ private handleConnectionError;
87
+ /**
88
+ * 清理会话
89
+ */
90
+ private cleanupSession;
91
+ /**
92
+ * 生成会话 ID
93
+ */
94
+ private generateSessionId;
95
+ /**
96
+ * 销毁所有代理
97
+ */
98
+ destroy(): Promise<void>;
99
+ }
100
+ //# sourceMappingURL=forward-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forward-proxy.d.ts","sourceRoot":"","sources":["../src/forward-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAML,iBAAiB,EAQjB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAgBlC;;;;;;;GAOG;AACH,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,OAAO,CAAgC;IAG/C,OAAO,CAAC,QAAQ,CAAqC;gBAEzC,UAAU,EAAE,UAAU;IAWlC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAShC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACG,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB3D;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IAU5D;;OAEG;IACG,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwCvD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnD;;OAEG;IACG,cAAc,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAe7D;;OAEG;IACH,UAAU,IAAI,iBAAiB,EAAE;IAIjC;;OAEG;YACW,eAAe;IAY7B;;OAEG;YACW,qBAAqB;IA4DnC;;OAEG;YACW,wBAAwB;IAkBtC;;OAEG;YACW,2BAA2B;IA8BzC;;OAEG;YACW,qBAAqB;IA8DnC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB/B"}