@feng3d/chuantou-shared 0.0.9 → 0.0.11

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 CHANGED
@@ -1,11 +1,13 @@
1
1
  # @feng3d/chuantou-shared
2
2
 
3
- 内网穿透转发系统的共享类型定义和消息协议。
3
+ 内网穿透转发系统的共享类型定义、消息协议和数据通道帧协议。
4
4
 
5
5
  ## 特性
6
6
 
7
7
  - 完整的 TypeScript 类型定义
8
- - 服务端和客户端通用的消息协议
8
+ - 服务端和客户端通用的 JSON 消息协议(控制通道)
9
+ - 数据通道二进制帧协议(TCP 帧 + UDP 帧)
10
+ - FrameParser 流式帧解析器
9
11
  - 代理配置类型
10
12
  - 连接管理类型
11
13
 
@@ -44,7 +46,28 @@ interface ProxyConfig {
44
46
 
45
47
  **推荐**:本地地址为 localhost 时推荐省略,使用 `8080:3000` 而非 `8080:3000:localhost`。
46
48
 
47
- 每个代理端口同时支持 HTTPWebSocket 协议,无需单独指定协议类型。
49
+ 每个代理端口同时支持 HTTP/WebSocket/TCP/UDP 协议,无需单独指定协议类型。
50
+
51
+ ### ConnectionProtocol
52
+
53
+ 连接协议类型:
54
+
55
+ ```typescript
56
+ type ConnectionProtocol = 'http' | 'websocket' | 'tcp' | 'udp';
57
+ ```
58
+
59
+ ### ConnectionInfo
60
+
61
+ 连接信息接口:
62
+
63
+ ```typescript
64
+ interface ConnectionInfo {
65
+ id: string; // 连接唯一 ID
66
+ remoteAddress: string; // 远程客户端 IP
67
+ protocol: ConnectionProtocol; // 协议类型
68
+ createdAt: number; // 创建时间戳
69
+ }
70
+ ```
48
71
 
49
72
  ### ClientConfig
50
73
 
@@ -74,7 +97,9 @@ interface ServerConfig {
74
97
  }
75
98
  ```
76
99
 
77
- ## 消息类型
100
+ ## 消息类型(控制通道)
101
+
102
+ 控制通道使用 JSON 消息,通过 WebSocket 传输:
78
103
 
79
104
  - `AUTH` - 客户端认证
80
105
  - `AUTH_RESP` - 认证响应
@@ -83,10 +108,87 @@ interface ServerConfig {
83
108
  - `UNREGISTER` - 注销代理服务
84
109
  - `HEARTBEAT` - 心跳
85
110
  - `HEARTBEAT_RESP` - 心跳响应
86
- - `NEW_CONNECTION` - 新连接通知
111
+ - `NEW_CONNECTION` - 新连接通知(包含 protocol 字段:`http`/`websocket`/`tcp`/`udp`)
87
112
  - `CONNECTION_CLOSE` - 连接关闭通知
88
113
  - `CONNECTION_ERROR` - 连接错误通知
89
114
 
115
+ ## 数据通道帧协议
116
+
117
+ 数据通道使用二进制帧协议,分为 TCP 数据通道和 UDP 数据通道。
118
+
119
+ ### TCP 数据通道
120
+
121
+ TCP 数据通道用于高效传输 HTTP/WebSocket/TCP 的原始二进制数据。
122
+
123
+ **认证帧**(客户端 → 服务端,建立连接时发送一次):
124
+
125
+ ```
126
+ [0xFD][0x01][36 字节 clientId]
127
+ ```
128
+
129
+ **认证响应**(服务端 → 客户端,1 字节):
130
+
131
+ ```
132
+ 0x01 = 成功,0x00 = 失败
133
+ ```
134
+
135
+ **数据帧**(双向传输):
136
+
137
+ ```
138
+ [4 字节 帧长度 (Big-Endian)][36 字节 connectionId][N 字节 数据]
139
+ ```
140
+
141
+ 帧长度 = 36 + N(connectionId 长度 + 数据长度)。
142
+
143
+ ### UDP 数据通道
144
+
145
+ UDP 数据通道用于保留 UDP 语义的数据转发。
146
+
147
+ **注册帧**(客户端 → 服务端):
148
+
149
+ ```
150
+ [0xFD][0x02][36 字节 clientId]
151
+ ```
152
+
153
+ **保活帧**(客户端 → 服务端,每 15 秒发送一次):
154
+
155
+ ```
156
+ [0xFD][0x03][36 字节 clientId]
157
+ ```
158
+
159
+ **数据帧**(双向传输):
160
+
161
+ ```
162
+ [36 字节 connectionId][N 字节 数据]
163
+ ```
164
+
165
+ ### 相关导出
166
+
167
+ ```typescript
168
+ // TCP 帧函数
169
+ writeTcpAuthFrame(clientId: string): Buffer
170
+ writeDataFrame(connectionId: string, data: Buffer): Buffer
171
+ parseTcpAuthFrame(data: Buffer): string | null
172
+ isDataChannelAuth(data: Buffer): boolean
173
+
174
+ // UDP 帧函数
175
+ writeUdpRegisterFrame(clientId: string): Buffer
176
+ writeUdpKeepaliveFrame(clientId: string): Buffer
177
+ writeUdpDataFrame(connectionId: string, data: Buffer): Buffer
178
+ parseUdpDataFrame(buffer: Buffer): { connectionId: string; data: Buffer } | null
179
+ parseUdpControlFrame(buffer: Buffer): { type: 'register' | 'keepalive'; clientId: string } | null
180
+
181
+ // TCP 流式帧解析器
182
+ class FrameParser extends EventEmitter {
183
+ push(chunk: Buffer): void // 推入 TCP 数据块
184
+ reset(): void // 重置解析器状态
185
+ // 事件: 'frame' (connectionId: string, data: Buffer)
186
+ }
187
+
188
+ // 常量
189
+ AUTH_RESPONSE = { SUCCESS: Buffer<[0x01]>, FAILURE: Buffer<[0x00]> }
190
+ ```
191
+
90
192
  ## 许可证
91
193
 
92
194
  ISC
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @module data-channel
3
+ *
4
+ * 二进制数据通道协议定义与工具。
5
+ *
6
+ * 定义了 TCP 数据通道和 UDP 数据通道的帧格式、魔数常量,
7
+ * 以及帧的构建与解析工具,用于在穿透服务端与客户端之间高效传输原始二进制数据。
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ /** connectionId 的固定长度(UUID v4 字符串 36 字节) */
11
+ export declare const CONNECTION_ID_LENGTH = 36;
12
+ /** clientId 的固定长度(UUID v4 字符串 36 字节) */
13
+ export declare const CLIENT_ID_LENGTH = 36;
14
+ /** 帧长度字段的字节数 */
15
+ export declare const FRAME_LENGTH_SIZE = 4;
16
+ /**
17
+ * 数据通道魔数常量
18
+ *
19
+ * 用于在协议复用时区分不同类型的连接和消息。
20
+ */
21
+ export declare const DATA_CHANNEL_MAGIC: {
22
+ /** TCP 数据通道认证握手魔数 */
23
+ readonly TCP_AUTH: Buffer<ArrayBuffer>;
24
+ /** UDP 数据通道注册魔数 */
25
+ readonly UDP_REGISTER: Buffer<ArrayBuffer>;
26
+ /** UDP 保活魔数 */
27
+ readonly UDP_KEEPALIVE: Buffer<ArrayBuffer>;
28
+ };
29
+ /** TCP 认证响应 */
30
+ export declare const AUTH_RESPONSE: {
31
+ readonly SUCCESS: Buffer<ArrayBuffer>;
32
+ readonly FAILURE: Buffer<ArrayBuffer>;
33
+ };
34
+ /**
35
+ * 构建 TCP 数据通道认证帧
36
+ *
37
+ * @param clientId - 客户端 ID(36 字节 UUID 字符串)
38
+ * @returns 认证帧 Buffer:[0xFD][0x01][36B clientId]
39
+ */
40
+ export declare function writeTcpAuthFrame(clientId: string): Buffer;
41
+ /**
42
+ * 构建 TCP 数据帧
43
+ *
44
+ * @param connectionId - 连接 ID(36 字节 UUID 字符串)
45
+ * @param data - 要发送的原始数据
46
+ * @returns 数据帧 Buffer:[4B 帧长度 BE][36B connectionId][NB data]
47
+ */
48
+ export declare function writeDataFrame(connectionId: string, data: Buffer): Buffer;
49
+ /**
50
+ * TCP 数据帧解析器
51
+ *
52
+ * 从 TCP 流中解析二进制数据帧,处理 TCP 粘包/拆包问题。
53
+ * 当解析出完整帧时触发 `'frame'` 事件。
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const parser = new FrameParser();
58
+ * parser.on('frame', (connectionId, data) => { ... });
59
+ * socket.on('data', (chunk) => parser.push(chunk));
60
+ * ```
61
+ */
62
+ export declare class FrameParser extends EventEmitter {
63
+ private buffer;
64
+ /**
65
+ * 向解析器推入数据块
66
+ *
67
+ * @param chunk - 从 TCP 流接收到的数据块
68
+ */
69
+ push(chunk: Buffer): void;
70
+ private parse;
71
+ /** 重置解析器状态 */
72
+ reset(): void;
73
+ }
74
+ /**
75
+ * 构建 UDP 注册帧
76
+ *
77
+ * @param clientId - 客户端 ID
78
+ * @returns 注册帧 Buffer:[0xFD][0x02][36B clientId]
79
+ */
80
+ export declare function writeUdpRegisterFrame(clientId: string): Buffer;
81
+ /**
82
+ * 构建 UDP 保活帧
83
+ *
84
+ * @param clientId - 客户端 ID
85
+ * @returns 保活帧 Buffer:[0xFD][0x03][36B clientId]
86
+ */
87
+ export declare function writeUdpKeepaliveFrame(clientId: string): Buffer;
88
+ /**
89
+ * 构建 UDP 数据帧
90
+ *
91
+ * @param connectionId - 连接 ID
92
+ * @param data - 要发送的原始数据
93
+ * @returns 数据帧 Buffer:[36B connectionId][NB data]
94
+ */
95
+ export declare function writeUdpDataFrame(connectionId: string, data: Buffer): Buffer;
96
+ /**
97
+ * 解析 UDP 数据帧
98
+ *
99
+ * @param buffer - 收到的 UDP 数据包
100
+ * @returns 解析后的 connectionId 和数据,或 null(如果是控制帧或格式无效)
101
+ */
102
+ export declare function parseUdpDataFrame(buffer: Buffer): {
103
+ connectionId: string;
104
+ data: Buffer;
105
+ } | null;
106
+ /**
107
+ * 解析 UDP 控制帧(注册/保活)
108
+ *
109
+ * @param buffer - 收到的 UDP 数据包
110
+ * @returns 解析结果:类型和 clientId,或 null
111
+ */
112
+ export declare function parseUdpControlFrame(buffer: Buffer): {
113
+ type: 'register' | 'keepalive';
114
+ clientId: string;
115
+ } | null;
116
+ /**
117
+ * 检测 TCP 连接是否为数据通道认证
118
+ *
119
+ * 检查数据的前两个字节是否为 TCP 数据通道魔数。
120
+ *
121
+ * @param data - TCP 连接的初始数据
122
+ * @returns 是否为数据通道连接
123
+ */
124
+ export declare function isDataChannelAuth(data: Buffer): boolean;
125
+ /**
126
+ * 解析 TCP 数据通道认证帧
127
+ *
128
+ * @param data - 初始数据(至少 38 字节:2B 魔数 + 36B clientId)
129
+ * @returns clientId,或 null
130
+ */
131
+ export declare function parseTcpAuthFrame(data: Buffer): string | null;
132
+ //# sourceMappingURL=data-channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-channel.d.ts","sourceRoot":"","sources":["../src/data-channel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,4CAA4C;AAC5C,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,wCAAwC;AACxC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC,gBAAgB;AAChB,eAAO,MAAM,iBAAiB,IAAI,CAAC;AAEnC;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;IAC7B,qBAAqB;;IAErB,mBAAmB;;IAEnB,eAAe;;CAEP,CAAC;AAEX,eAAe;AACf,eAAO,MAAM,aAAa;;;CAGhB,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOzE;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,MAAM,CAA2B;IAEzC;;;;OAIG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKzB,OAAO,CAAC,KAAK;IAsBb,cAAc;IACd,KAAK,IAAI,IAAI;CAGd;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK9D;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK/D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW/F;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,UAAU,GAAG,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAchH;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI7D"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * @module data-channel
3
+ *
4
+ * 二进制数据通道协议定义与工具。
5
+ *
6
+ * 定义了 TCP 数据通道和 UDP 数据通道的帧格式、魔数常量,
7
+ * 以及帧的构建与解析工具,用于在穿透服务端与客户端之间高效传输原始二进制数据。
8
+ */
9
+ import { EventEmitter } from 'events';
10
+ /** connectionId 的固定长度(UUID v4 字符串 36 字节) */
11
+ export const CONNECTION_ID_LENGTH = 36;
12
+ /** clientId 的固定长度(UUID v4 字符串 36 字节) */
13
+ export const CLIENT_ID_LENGTH = 36;
14
+ /** 帧长度字段的字节数 */
15
+ export const FRAME_LENGTH_SIZE = 4;
16
+ /**
17
+ * 数据通道魔数常量
18
+ *
19
+ * 用于在协议复用时区分不同类型的连接和消息。
20
+ */
21
+ export const DATA_CHANNEL_MAGIC = {
22
+ /** TCP 数据通道认证握手魔数 */
23
+ TCP_AUTH: Buffer.from([0xFD, 0x01]),
24
+ /** UDP 数据通道注册魔数 */
25
+ UDP_REGISTER: Buffer.from([0xFD, 0x02]),
26
+ /** UDP 保活魔数 */
27
+ UDP_KEEPALIVE: Buffer.from([0xFD, 0x03]),
28
+ };
29
+ /** TCP 认证响应 */
30
+ export const AUTH_RESPONSE = {
31
+ SUCCESS: Buffer.from([0x01]),
32
+ FAILURE: Buffer.from([0x00]),
33
+ };
34
+ /**
35
+ * 构建 TCP 数据通道认证帧
36
+ *
37
+ * @param clientId - 客户端 ID(36 字节 UUID 字符串)
38
+ * @returns 认证帧 Buffer:[0xFD][0x01][36B clientId]
39
+ */
40
+ export function writeTcpAuthFrame(clientId) {
41
+ const buf = Buffer.alloc(2 + CLIENT_ID_LENGTH);
42
+ DATA_CHANNEL_MAGIC.TCP_AUTH.copy(buf, 0);
43
+ buf.write(clientId, 2, CLIENT_ID_LENGTH, 'utf-8');
44
+ return buf;
45
+ }
46
+ /**
47
+ * 构建 TCP 数据帧
48
+ *
49
+ * @param connectionId - 连接 ID(36 字节 UUID 字符串)
50
+ * @param data - 要发送的原始数据
51
+ * @returns 数据帧 Buffer:[4B 帧长度 BE][36B connectionId][NB data]
52
+ */
53
+ export function writeDataFrame(connectionId, data) {
54
+ const payloadLength = CONNECTION_ID_LENGTH + data.length;
55
+ const buf = Buffer.alloc(FRAME_LENGTH_SIZE + payloadLength);
56
+ buf.writeUInt32BE(payloadLength, 0);
57
+ buf.write(connectionId, FRAME_LENGTH_SIZE, CONNECTION_ID_LENGTH, 'utf-8');
58
+ data.copy(buf, FRAME_LENGTH_SIZE + CONNECTION_ID_LENGTH);
59
+ return buf;
60
+ }
61
+ /**
62
+ * TCP 数据帧解析器
63
+ *
64
+ * 从 TCP 流中解析二进制数据帧,处理 TCP 粘包/拆包问题。
65
+ * 当解析出完整帧时触发 `'frame'` 事件。
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * const parser = new FrameParser();
70
+ * parser.on('frame', (connectionId, data) => { ... });
71
+ * socket.on('data', (chunk) => parser.push(chunk));
72
+ * ```
73
+ */
74
+ export class FrameParser extends EventEmitter {
75
+ constructor() {
76
+ super(...arguments);
77
+ this.buffer = Buffer.alloc(0);
78
+ }
79
+ /**
80
+ * 向解析器推入数据块
81
+ *
82
+ * @param chunk - 从 TCP 流接收到的数据块
83
+ */
84
+ push(chunk) {
85
+ this.buffer = Buffer.concat([this.buffer, chunk]);
86
+ this.parse();
87
+ }
88
+ parse() {
89
+ while (true) {
90
+ // 至少需要 4 字节读取帧长度
91
+ if (this.buffer.length < FRAME_LENGTH_SIZE)
92
+ break;
93
+ const payloadLength = this.buffer.readUInt32BE(0);
94
+ // 等待完整帧
95
+ const totalLength = FRAME_LENGTH_SIZE + payloadLength;
96
+ if (this.buffer.length < totalLength)
97
+ break;
98
+ // 解析 connectionId 和数据
99
+ const connectionId = this.buffer.toString('utf-8', FRAME_LENGTH_SIZE, FRAME_LENGTH_SIZE + CONNECTION_ID_LENGTH);
100
+ const data = this.buffer.subarray(FRAME_LENGTH_SIZE + CONNECTION_ID_LENGTH, totalLength);
101
+ this.emit('frame', connectionId, Buffer.from(data));
102
+ // 移除已解析的帧
103
+ this.buffer = this.buffer.subarray(totalLength);
104
+ }
105
+ }
106
+ /** 重置解析器状态 */
107
+ reset() {
108
+ this.buffer = Buffer.alloc(0);
109
+ }
110
+ }
111
+ /**
112
+ * 构建 UDP 注册帧
113
+ *
114
+ * @param clientId - 客户端 ID
115
+ * @returns 注册帧 Buffer:[0xFD][0x02][36B clientId]
116
+ */
117
+ export function writeUdpRegisterFrame(clientId) {
118
+ const buf = Buffer.alloc(2 + CLIENT_ID_LENGTH);
119
+ DATA_CHANNEL_MAGIC.UDP_REGISTER.copy(buf, 0);
120
+ buf.write(clientId, 2, CLIENT_ID_LENGTH, 'utf-8');
121
+ return buf;
122
+ }
123
+ /**
124
+ * 构建 UDP 保活帧
125
+ *
126
+ * @param clientId - 客户端 ID
127
+ * @returns 保活帧 Buffer:[0xFD][0x03][36B clientId]
128
+ */
129
+ export function writeUdpKeepaliveFrame(clientId) {
130
+ const buf = Buffer.alloc(2 + CLIENT_ID_LENGTH);
131
+ DATA_CHANNEL_MAGIC.UDP_KEEPALIVE.copy(buf, 0);
132
+ buf.write(clientId, 2, CLIENT_ID_LENGTH, 'utf-8');
133
+ return buf;
134
+ }
135
+ /**
136
+ * 构建 UDP 数据帧
137
+ *
138
+ * @param connectionId - 连接 ID
139
+ * @param data - 要发送的原始数据
140
+ * @returns 数据帧 Buffer:[36B connectionId][NB data]
141
+ */
142
+ export function writeUdpDataFrame(connectionId, data) {
143
+ const buf = Buffer.alloc(CONNECTION_ID_LENGTH + data.length);
144
+ buf.write(connectionId, 0, CONNECTION_ID_LENGTH, 'utf-8');
145
+ data.copy(buf, CONNECTION_ID_LENGTH);
146
+ return buf;
147
+ }
148
+ /**
149
+ * 解析 UDP 数据帧
150
+ *
151
+ * @param buffer - 收到的 UDP 数据包
152
+ * @returns 解析后的 connectionId 和数据,或 null(如果是控制帧或格式无效)
153
+ */
154
+ export function parseUdpDataFrame(buffer) {
155
+ if (buffer.length < CONNECTION_ID_LENGTH)
156
+ return null;
157
+ // 检查是否为控制帧(魔数开头)
158
+ if (buffer[0] === 0xFD && buffer.length >= 2) {
159
+ return null; // 控制帧,不是数据帧
160
+ }
161
+ const connectionId = buffer.toString('utf-8', 0, CONNECTION_ID_LENGTH);
162
+ const data = buffer.subarray(CONNECTION_ID_LENGTH);
163
+ return { connectionId, data: Buffer.from(data) };
164
+ }
165
+ /**
166
+ * 解析 UDP 控制帧(注册/保活)
167
+ *
168
+ * @param buffer - 收到的 UDP 数据包
169
+ * @returns 解析结果:类型和 clientId,或 null
170
+ */
171
+ export function parseUdpControlFrame(buffer) {
172
+ if (buffer.length < 2 + CLIENT_ID_LENGTH)
173
+ return null;
174
+ if (buffer[0] !== 0xFD)
175
+ return null;
176
+ const clientId = buffer.toString('utf-8', 2, 2 + CLIENT_ID_LENGTH);
177
+ if (buffer[1] === 0x02) {
178
+ return { type: 'register', clientId };
179
+ }
180
+ if (buffer[1] === 0x03) {
181
+ return { type: 'keepalive', clientId };
182
+ }
183
+ return null;
184
+ }
185
+ /**
186
+ * 检测 TCP 连接是否为数据通道认证
187
+ *
188
+ * 检查数据的前两个字节是否为 TCP 数据通道魔数。
189
+ *
190
+ * @param data - TCP 连接的初始数据
191
+ * @returns 是否为数据通道连接
192
+ */
193
+ export function isDataChannelAuth(data) {
194
+ return data.length >= 2 && data[0] === 0xFD && data[1] === 0x01;
195
+ }
196
+ /**
197
+ * 解析 TCP 数据通道认证帧
198
+ *
199
+ * @param data - 初始数据(至少 38 字节:2B 魔数 + 36B clientId)
200
+ * @returns clientId,或 null
201
+ */
202
+ export function parseTcpAuthFrame(data) {
203
+ if (data.length < 2 + CLIENT_ID_LENGTH)
204
+ return null;
205
+ if (!isDataChannelAuth(data))
206
+ return null;
207
+ return data.toString('utf-8', 2, 2 + CLIENT_ID_LENGTH);
208
+ }
209
+ //# 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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"}
package/dist/index.d.ts CHANGED
@@ -12,4 +12,6 @@ export * from './messages.js';
12
12
  export * from './protocol.js';
13
13
  /** 导出日志工具 */
14
14
  export * from './logger.js';
15
+ /** 导出数据通道二进制帧协议工具 */
16
+ export * from './data-channel.js';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC;AAC5B,qBAAqB;AACrB,cAAc,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -12,4 +12,6 @@ export * from './messages.js';
12
12
  export * from './protocol.js';
13
13
  /** 导出日志工具 */
14
14
  export * from './logger.js';
15
+ /** 导出数据通道二进制帧协议工具 */
16
+ export * from './data-channel.js';
15
17
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,2BAA2B;AAC3B,cAAc,eAAe,CAAC;AAC9B,6BAA6B;AAC7B,cAAc,eAAe,CAAC;AAC9B,aAAa;AACb,cAAc,aAAa,CAAC;AAC5B,qBAAqB;AACrB,cAAc,mBAAmB,CAAC"}
@@ -6,12 +6,14 @@
6
6
  * 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
7
7
  * 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
8
8
  * 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
9
+ *
10
+ * 注意:实际数据传输已移至独立的二进制 TCP 数据通道和 UDP 数据通道,
11
+ * WebSocket 控制通道仅用于控制消息。
9
12
  */
10
13
  /**
11
14
  * 消息类型枚举
12
15
  *
13
- * 定义穿透代理协议中所有消息的类型标识,
14
- * 涵盖认证、控制和连接通知三大类消息。
16
+ * 定义穿透代理协议中所有控制消息的类型标识。
15
17
  */
16
18
  export declare enum MessageType {
17
19
  /** 客户端发送的认证请求消息 */
@@ -38,9 +40,9 @@ export declare enum MessageType {
38
40
  /**
39
41
  * 协议类型
40
42
  *
41
- * 穿透代理支持的传输协议类型,可选 HTTP 或 WebSocket。
43
+ * 穿透代理支持的传输协议类型。
42
44
  */
43
- export type Protocol = 'http' | 'websocket';
45
+ export type Protocol = 'http' | 'websocket' | 'tcp' | 'udp';
44
46
  /**
45
47
  * 基础消息接口
46
48
  *
@@ -72,6 +74,7 @@ export interface AuthMessage extends Message {
72
74
  * 认证响应消息
73
75
  *
74
76
  * 服务端对客户端认证请求的响应,表明认证是否成功。
77
+ * 认证成功后会包含服务端分配的 clientId,客户端需要用此 ID 建立数据通道。
75
78
  */
76
79
  export interface AuthRespMessage extends Message {
77
80
  /** 消息类型,固定为 {@link MessageType.AUTH_RESP} */
@@ -80,6 +83,8 @@ export interface AuthRespMessage extends Message {
80
83
  payload: {
81
84
  /** 认证是否成功 */
82
85
  success: boolean;
86
+ /** 服务端分配的客户端 ID(认证成功时返回,用于建立数据通道) */
87
+ clientId?: string;
83
88
  /** 认证失败时的错误描述信息 */
84
89
  error?: string;
85
90
  };
@@ -88,7 +93,7 @@ export interface AuthRespMessage extends Message {
88
93
  * 注册代理服务消息
89
94
  *
90
95
  * 客户端向服务端请求注册一条代理隧道,指定远程端口到本地服务的映射。
91
- * 每个端口同时支持 HTTP 和 WebSocket 协议。
96
+ * 每个端口同时支持 HTTP、WebSocket、TCPUDP 所有协议。
92
97
  */
93
98
  export interface RegisterMessage extends Message {
94
99
  /** 消息类型,固定为 {@link MessageType.REGISTER} */
@@ -165,20 +170,11 @@ export interface HeartbeatRespMessage extends Message {
165
170
  timestamp: number;
166
171
  };
167
172
  }
168
- /**
169
- * HTTP 请求头信息
170
- *
171
- * 表示 HTTP 请求或响应的头部字段映射,值可以是单个字符串、字符串数组或未定义。
172
- */
173
- export interface HttpHeaders {
174
- /** HTTP 头部字段,键为头部名称,值为头部内容 */
175
- [key: string]: string | string[] | undefined;
176
- }
177
173
  /**
178
174
  * 新连接通知消息
179
175
  *
180
- * 当外部用户连接到服务端的代理端口时,服务端向客户端发送此消息通知新连接的到来,
181
- * 并携带连接的详细信息(HTTP 请求数据或 WebSocket 握手头)。
176
+ * 当外部用户连接到服务端的代理端口时,服务端向客户端发送此消息通知新连接的到来。
177
+ * 实际数据传输通过独立的二进制数据通道进行。
182
178
  */
183
179
  export interface NewConnectionMessage extends Message {
184
180
  /** 消息类型,固定为 {@link MessageType.NEW_CONNECTION} */
@@ -189,31 +185,12 @@ export interface NewConnectionMessage extends Message {
189
185
  connectionId: string;
190
186
  /** 连接使用的传输协议类型 */
191
187
  protocol: Protocol;
192
- /** HTTP 请求方法(仅 HTTP 协议时存在),如 GET、POST 等 */
193
- method?: string;
194
- /** HTTP 请求的 URL 路径(仅 HTTP 协议时存在) */
195
- url?: string;
196
- /** HTTP 请求头(仅 HTTP 协议时存在) */
197
- headers?: HttpHeaders;
198
- /** HTTP 请求体(仅 HTTP 协议时存在) */
199
- body?: string | Buffer;
200
- /** WebSocket 握手请求头(仅 WebSocket 协议时存在) */
201
- wsHeaders?: HttpHeaders;
188
+ /** 服务端监听的远程端口号 */
189
+ remotePort: number;
190
+ /** 外部客户端的远程地址 */
191
+ remoteAddress?: string;
202
192
  };
203
193
  }
204
- /**
205
- * HTTP 响应数据
206
- *
207
- * 描述一个 HTTP 响应的结构,包含状态码、响应头和可选的响应体。
208
- */
209
- export interface HttpResponseData {
210
- /** HTTP 响应状态码 */
211
- statusCode: number;
212
- /** HTTP 响应头 */
213
- headers: HttpHeaders;
214
- /** HTTP 响应体 */
215
- body?: string | Buffer;
216
- }
217
194
  /**
218
195
  * 连接关闭消息
219
196
  *
@@ -246,8 +223,6 @@ export interface ConnectionErrorMessage extends Message {
246
223
  }
247
224
  /**
248
225
  * 所有消息类型的联合类型
249
- *
250
- * 包含穿透代理协议中所有具体消息类型的联合,可用于消息处理函数的参数类型。
251
226
  */
252
227
  export type AnyMessage = AuthMessage | AuthRespMessage | RegisterMessage | RegisterRespMessage | UnregisterMessage | HeartbeatMessage | HeartbeatRespMessage | NewConnectionMessage | ConnectionCloseMessage | ConnectionErrorMessage;
253
228
  /**
@@ -262,9 +237,7 @@ export declare function isMessage(obj: unknown): obj is Message;
262
237
  /**
263
238
  * 检查消息是否为指定类型
264
239
  *
265
- * 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
266
- *
267
- * @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
240
+ * @typeParam T - 目标消息类型
268
241
  * @param msg - 待检查的消息对象
269
242
  * @param type - 期望的消息类型标识
270
243
  * @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
@@ -274,12 +247,11 @@ export declare function isMessageType<T extends AnyMessage>(msg: Message, type:
274
247
  * 创建消息
275
248
  *
276
249
  * 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
277
- * 若未提供消息 ID,将自动生成一个唯一 ID。
278
250
  *
279
- * @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
251
+ * @typeParam T - 目标消息类型
280
252
  * @param type - 消息类型标识
281
253
  * @param payload - 消息负载数据
282
- * @param id - 可选的消息唯一标识符,若不提供则自动生成
254
+ * @param id - 可选的消息唯一标识符
283
255
  * @returns 包含完整字段的消息对象
284
256
  */
285
257
  export declare function createMessage<T extends Omit<AnyMessage, 'id'>>(type: T['type'], payload: T['payload'], id?: string): T & {
@@ -288,16 +260,12 @@ export declare function createMessage<T extends Omit<AnyMessage, 'id'>>(type: T[
288
260
  /**
289
261
  * 生成消息ID
290
262
  *
291
- * 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
292
- *
293
263
  * @returns 唯一的消息 ID 字符串
294
264
  */
295
265
  export declare function generateMessageId(): string;
296
266
  /**
297
267
  * 序列化消息
298
268
  *
299
- * 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
300
- *
301
269
  * @param msg - 要序列化的消息对象
302
270
  * @returns 消息的 JSON 字符串表示
303
271
  */
@@ -305,9 +273,6 @@ export declare function serializeMessage(msg: Message): string;
305
273
  /**
306
274
  * 反序列化消息
307
275
  *
308
- * 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
309
- * 将抛出错误。
310
- *
311
276
  * @param data - 要反序列化的 JSON 字符串
312
277
  * @returns 解析后的消息对象
313
278
  * @throws 当 JSON 解析失败或消息格式无效时抛出错误
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
package/dist/messages.js CHANGED
@@ -6,12 +6,14 @@
6
6
  * 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
7
7
  * 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
8
8
  * 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
9
+ *
10
+ * 注意:实际数据传输已移至独立的二进制 TCP 数据通道和 UDP 数据通道,
11
+ * WebSocket 控制通道仅用于控制消息。
9
12
  */
10
13
  /**
11
14
  * 消息类型枚举
12
15
  *
13
- * 定义穿透代理协议中所有消息的类型标识,
14
- * 涵盖认证、控制和连接通知三大类消息。
16
+ * 定义穿透代理协议中所有控制消息的类型标识。
15
17
  */
16
18
  export var MessageType;
17
19
  (function (MessageType) {
@@ -54,9 +56,7 @@ export function isMessage(obj) {
54
56
  /**
55
57
  * 检查消息是否为指定类型
56
58
  *
57
- * 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
58
- *
59
- * @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
59
+ * @typeParam T - 目标消息类型
60
60
  * @param msg - 待检查的消息对象
61
61
  * @param type - 期望的消息类型标识
62
62
  * @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
@@ -68,12 +68,11 @@ export function isMessageType(msg, type) {
68
68
  * 创建消息
69
69
  *
70
70
  * 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
71
- * 若未提供消息 ID,将自动生成一个唯一 ID。
72
71
  *
73
- * @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
72
+ * @typeParam T - 目标消息类型
74
73
  * @param type - 消息类型标识
75
74
  * @param payload - 消息负载数据
76
- * @param id - 可选的消息唯一标识符,若不提供则自动生成
75
+ * @param id - 可选的消息唯一标识符
77
76
  * @returns 包含完整字段的消息对象
78
77
  */
79
78
  export function createMessage(type, payload, id) {
@@ -86,8 +85,6 @@ export function createMessage(type, payload, id) {
86
85
  /**
87
86
  * 生成消息ID
88
87
  *
89
- * 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
90
- *
91
88
  * @returns 唯一的消息 ID 字符串
92
89
  */
93
90
  export function generateMessageId() {
@@ -96,8 +93,6 @@ export function generateMessageId() {
96
93
  /**
97
94
  * 序列化消息
98
95
  *
99
- * 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
100
- *
101
96
  * @param msg - 要序列化的消息对象
102
97
  * @returns 消息的 JSON 字符串表示
103
98
  */
@@ -107,9 +102,6 @@ export function serializeMessage(msg) {
107
102
  /**
108
103
  * 反序列化消息
109
104
  *
110
- * 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
111
- * 将抛出错误。
112
- *
113
105
  * @param data - 要反序列化的 JSON 字符串
114
106
  * @returns 解析后的消息对象
115
107
  * @throws 当 JSON 解析失败或消息格式无效时抛出错误
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,CAAN,IAAY,WAuBX;AAvBD,WAAY,WAAW;IACrB,mBAAmB;IACnB,4BAAa,CAAA;IACb,mBAAmB;IACnB,sCAAuB,CAAA;IAEvB,qBAAqB;IACrB,oCAAqB,CAAA;IACrB,qBAAqB;IACrB,wCAAyB,CAAA;IACzB,mBAAmB;IACnB,8CAA+B,CAAA;IAC/B,iBAAiB;IACjB,sCAAuB,CAAA;IACvB,mBAAmB;IACnB,gDAAiC,CAAA;IAEjC,oBAAoB;IACpB,gDAAiC,CAAA;IACjC,eAAe;IACf,oDAAqC,CAAA;IACrC,eAAe;IACf,oDAAqC,CAAA;AACvC,CAAC,EAvBW,WAAW,KAAX,WAAW,QAuBtB;AAkPD;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,GAAuB,CAAC;IACpC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAY,EACZ,IAAe;IAEf,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAe,EACf,OAAqB,EACrB,EAAW;IAEX,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,EAAE,IAAI,iBAAiB,EAAE;QAC7B,OAAO;KACc,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,CAAN,IAAY,WAuBX;AAvBD,WAAY,WAAW;IACrB,mBAAmB;IACnB,4BAAa,CAAA;IACb,mBAAmB;IACnB,sCAAuB,CAAA;IAEvB,qBAAqB;IACrB,oCAAqB,CAAA;IACrB,qBAAqB;IACrB,wCAAyB,CAAA;IACzB,mBAAmB;IACnB,8CAA+B,CAAA;IAC/B,iBAAiB;IACjB,sCAAuB,CAAA;IACvB,mBAAmB;IACnB,gDAAiC,CAAA;IAEjC,oBAAoB;IACpB,gDAAiC,CAAA;IACjC,eAAe;IACf,oDAAqC,CAAA;IACrC,eAAe;IACf,oDAAqC,CAAA;AACvC,CAAC,EAvBW,WAAW,KAAX,WAAW,QAuBtB;AAqND;;;;;;;GAOG;AACH,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,GAAG,GAAG,GAAuB,CAAC;IACpC,OAAO,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,CAAC;AACpE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAY,EACZ,IAAe;IAEf,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAe,EACf,OAAqB,EACrB,EAAW;IAEX,OAAO;QACL,IAAI;QACJ,EAAE,EAAE,EAAE,IAAI,iBAAiB,EAAE;QAC7B,OAAO;KACc,CAAC;AAC1B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -110,11 +110,17 @@ export declare const DEFAULT_CONFIG: {
110
110
  /** 数据传输缓冲区大小,单位字节(默认 64KB) */
111
111
  readonly BUFFER_SIZE: number;
112
112
  };
113
+ /**
114
+ * 连接协议类型
115
+ *
116
+ * 运行时自动检测的传输协议类型。
117
+ */
118
+ export type ConnectionProtocol = 'http' | 'websocket' | 'tcp' | 'udp';
113
119
  /**
114
120
  * 代理配置接口
115
121
  *
116
122
  * 描述单条代理隧道的配置,指定远程端口到本地端口的映射关系。
117
- * 每个端口同时支持 HTTP 和 WebSocket 协议,无需单独指定。
123
+ * 每个端口同时支持 HTTP、WebSocketTCP 所有协议。
118
124
  */
119
125
  export interface ProxyConfig {
120
126
  /** 服务端监听的远程端口号,外部用户通过此端口访问代理服务 */
@@ -179,7 +185,7 @@ export interface ConnectionInfo {
179
185
  /** 发起连接的远程客户端 IP 地址 */
180
186
  remoteAddress: string;
181
187
  /** 该连接使用的传输协议类型 */
182
- protocol: 'http' | 'websocket';
188
+ protocol: 'http' | 'websocket' | 'tcp' | 'udp';
183
189
  /** 连接建立的时间戳(Unix 毫秒) */
184
190
  createdAt: number;
185
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng3d/chuantou-shared",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "scripts": {
17
17
  "build": "tsc",
18
- "watch": "tsc --watch"
18
+ "watch": "tsc --watch --pretty"
19
19
  },
20
20
  "devDependencies": {
21
21
  "typescript": "^5.3.3"