@feng3d/chuantou-shared 0.0.4 → 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 CHANGED
@@ -23,18 +23,9 @@ import { MessageType, ProxyConfig, ClientConfig } from '@feng3d/chuantou-shared'
23
23
  // 创建代理配置
24
24
  const proxyConfig: ProxyConfig = {
25
25
  remotePort: 8080,
26
- protocol: 'http',
27
26
  localPort: 3000,
28
27
  localHost: 'localhost'
29
28
  };
30
-
31
- // 创建消息
32
- const message = createMessage(MessageType.REGISTER, {
33
- remotePort: 8080,
34
- protocol: 'http',
35
- localPort: 3000,
36
- localHost: 'localhost'
37
- });
38
29
  ```
39
30
 
40
31
  ## 类型
@@ -46,12 +37,15 @@ const message = createMessage(MessageType.REGISTER, {
46
37
  ```typescript
47
38
  interface ProxyConfig {
48
39
  remotePort: number; // 公网端口
49
- protocol: 'http' | 'websocket'; // 协议类型
50
40
  localPort: number; // 本地端口
51
- localHost?: string; // 本地地址
41
+ localHost?: string; // 本地地址(默认:localhost)
52
42
  }
53
43
  ```
54
44
 
45
+ **推荐**:本地地址为 localhost 时推荐省略,使用 `8080:3000` 而非 `8080:3000:localhost`。
46
+
47
+ 每个代理端口同时支持 HTTP 和 WebSocket 协议,无需单独指定协议类型。
48
+
55
49
  ### ClientConfig
56
50
 
57
51
  客户端配置接口:
package/dist/index.d.ts CHANGED
@@ -1,3 +1,15 @@
1
+ /**
2
+ * @module shared
3
+ *
4
+ * 穿透代理共享模块入口。
5
+ *
6
+ * 本模块统一导出穿透代理系统中客户端与服务端共用的所有类型定义、
7
+ * 消息结构、协议常量和工具函数,作为 `@chuantou/shared` 包的公共 API 入口。
8
+ */
9
+ /** 导出所有消息类型、消息接口及消息工具函数 */
1
10
  export * from './messages.js';
11
+ /** 导出协议常量、错误码、默认配置及各类配置接口 */
2
12
  export * from './protocol.js';
13
+ /** 导出日志工具 */
14
+ export * from './logger.js';
3
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,eAAe,CAAC;AAE9B,cAAc,eAAe,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"}
package/dist/index.js CHANGED
@@ -1,5 +1,15 @@
1
- // 导出所有消息类型
1
+ /**
2
+ * @module shared
3
+ *
4
+ * 穿透代理共享模块入口。
5
+ *
6
+ * 本模块统一导出穿透代理系统中客户端与服务端共用的所有类型定义、
7
+ * 消息结构、协议常量和工具函数,作为 `@chuantou/shared` 包的公共 API 入口。
8
+ */
9
+ /** 导出所有消息类型、消息接口及消息工具函数 */
2
10
  export * from './messages.js';
3
- // 导出协议定义
11
+ /** 导出协议常量、错误码、默认配置及各类配置接口 */
4
12
  export * from './protocol.js';
13
+ /** 导出日志工具 */
14
+ export * from './logger.js';
5
15
  //# 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,WAAW;AACX,cAAc,eAAe,CAAC;AAC9B,SAAS;AACT,cAAc,eAAe,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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @module logger
3
+ *
4
+ * 日志工具模块,提供带时间戳的日志输出功能。
5
+ */
6
+ /**
7
+ * 带时间戳的日志工具
8
+ */
9
+ export declare const logger: {
10
+ /**
11
+ * 输出信息日志
12
+ *
13
+ * @param message - 日志消息
14
+ */
15
+ log: (...message: unknown[]) => void;
16
+ /**
17
+ * 输出信息日志(别名)
18
+ *
19
+ * @param message - 日志消息
20
+ */
21
+ info: (...message: unknown[]) => void;
22
+ /**
23
+ * 输出警告日志
24
+ *
25
+ * @param message - 日志消息
26
+ */
27
+ warn: (...message: unknown[]) => void;
28
+ /**
29
+ * 输出错误日志
30
+ *
31
+ * @param message - 日志消息
32
+ */
33
+ error: (...message: unknown[]) => void;
34
+ };
35
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH;;GAEG;AACH,eAAO,MAAM,MAAM;IACjB;;;;OAIG;sBACe,OAAO,EAAE,KAAG,IAAI;IAIlC;;;;OAIG;uBACgB,OAAO,EAAE,KAAG,IAAI;IAInC;;;;OAIG;uBACgB,OAAO,EAAE,KAAG,IAAI;IAInC;;;;OAIG;wBACiB,OAAO,EAAE,KAAG,IAAI;CAGrC,CAAC"}
package/dist/logger.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * @module logger
3
+ *
4
+ * 日志工具模块,提供带时间戳的日志输出功能。
5
+ */
6
+ /**
7
+ * 格式化当前时间为日志时间戳
8
+ *
9
+ * @returns 格式化的时间字符串,格式为 HH:MM:SS.mmm
10
+ */
11
+ function formatTimestamp() {
12
+ const now = new Date();
13
+ const hours = String(now.getHours()).padStart(2, '0');
14
+ const minutes = String(now.getMinutes()).padStart(2, '0');
15
+ const seconds = String(now.getSeconds()).padStart(2, '0');
16
+ const ms = String(now.getMilliseconds()).padStart(3, '0');
17
+ return `${hours}:${minutes}:${seconds}.${ms}`;
18
+ }
19
+ /**
20
+ * 带时间戳的日志工具
21
+ */
22
+ export const logger = {
23
+ /**
24
+ * 输出信息日志
25
+ *
26
+ * @param message - 日志消息
27
+ */
28
+ log: (...message) => {
29
+ console.log(`[${formatTimestamp()}]`, ...message);
30
+ },
31
+ /**
32
+ * 输出信息日志(别名)
33
+ *
34
+ * @param message - 日志消息
35
+ */
36
+ info: (...message) => {
37
+ console.log(`[${formatTimestamp()}]`, ...message);
38
+ },
39
+ /**
40
+ * 输出警告日志
41
+ *
42
+ * @param message - 日志消息
43
+ */
44
+ warn: (...message) => {
45
+ console.warn(`[${formatTimestamp()}]`, ...message);
46
+ },
47
+ /**
48
+ * 输出错误日志
49
+ *
50
+ * @param message - 日志消息
51
+ */
52
+ error: (...message) => {
53
+ console.error(`[${formatTimestamp()}]`, ...message);
54
+ },
55
+ };
56
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,SAAS,eAAe;IACtB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IACvB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;AAChD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;;;OAIG;IACH,GAAG,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,IAAI,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;;OAIG;IACH,KAAK,EAAE,CAAC,GAAG,OAAkB,EAAQ,EAAE;QACrC,OAAO,CAAC,KAAK,CAAC,IAAI,eAAe,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC;IACtD,CAAC;CACF,CAAC"}
@@ -1,176 +1,316 @@
1
+ /**
2
+ * @module messages
3
+ *
4
+ * 穿透代理消息定义模块。
5
+ *
6
+ * 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
7
+ * 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
8
+ * 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
9
+ */
1
10
  /**
2
11
  * 消息类型枚举
12
+ *
13
+ * 定义穿透代理协议中所有消息的类型标识,
14
+ * 涵盖认证、控制和连接通知三大类消息。
3
15
  */
4
16
  export declare enum MessageType {
17
+ /** 客户端发送的认证请求消息 */
5
18
  AUTH = "auth",
19
+ /** 服务端返回的认证响应消息 */
6
20
  AUTH_RESP = "auth_resp",
21
+ /** 客户端发送的代理注册请求消息 */
7
22
  REGISTER = "register",
23
+ /** 客户端发送的代理注销请求消息 */
8
24
  UNREGISTER = "unregister",
25
+ /** 服务端返回的注册响应消息 */
9
26
  REGISTER_RESP = "register_resp",
27
+ /** 客户端发送的心跳消息 */
10
28
  HEARTBEAT = "heartbeat",
29
+ /** 服务端返回的心跳响应消息 */
11
30
  HEARTBEAT_RESP = "heartbeat_resp",
31
+ /** 服务端发送的新连接通知消息 */
12
32
  NEW_CONNECTION = "new_connection",
33
+ /** 连接关闭通知消息 */
13
34
  CONNECTION_CLOSE = "connection_close",
35
+ /** 连接错误通知消息 */
14
36
  CONNECTION_ERROR = "connection_error"
15
37
  }
16
38
  /**
17
39
  * 协议类型
40
+ *
41
+ * 穿透代理支持的传输协议类型,可选 HTTP 或 WebSocket。
18
42
  */
19
43
  export type Protocol = 'http' | 'websocket';
20
44
  /**
21
45
  * 基础消息接口
46
+ *
47
+ * 所有消息的公共基类,定义了消息的类型、唯一标识和负载数据。
22
48
  */
23
49
  export interface Message {
50
+ /** 消息类型标识,参见 {@link MessageType} */
24
51
  type: MessageType;
52
+ /** 消息的唯一标识符,用于请求-响应配对 */
25
53
  id: string;
54
+ /** 消息的负载数据,具体结构取决于消息类型 */
26
55
  payload: unknown;
27
56
  }
28
57
  /**
29
58
  * 认证消息
59
+ *
60
+ * 客户端在建立控制通道后发送的第一条消息,携带认证令牌。
30
61
  */
31
62
  export interface AuthMessage extends Message {
63
+ /** 消息类型,固定为 {@link MessageType.AUTH} */
32
64
  type: MessageType.AUTH;
65
+ /** 认证消息负载 */
33
66
  payload: {
67
+ /** 客户端的认证令牌 */
34
68
  token: string;
35
69
  };
36
70
  }
37
71
  /**
38
72
  * 认证响应消息
73
+ *
74
+ * 服务端对客户端认证请求的响应,表明认证是否成功。
39
75
  */
40
76
  export interface AuthRespMessage extends Message {
77
+ /** 消息类型,固定为 {@link MessageType.AUTH_RESP} */
41
78
  type: MessageType.AUTH_RESP;
79
+ /** 认证响应负载 */
42
80
  payload: {
81
+ /** 认证是否成功 */
43
82
  success: boolean;
83
+ /** 认证失败时的错误描述信息 */
44
84
  error?: string;
45
85
  };
46
86
  }
47
87
  /**
48
88
  * 注册代理服务消息
89
+ *
90
+ * 客户端向服务端请求注册一条代理隧道,指定远程端口到本地服务的映射。
91
+ * 每个端口同时支持 HTTP 和 WebSocket 协议。
49
92
  */
50
93
  export interface RegisterMessage extends Message {
94
+ /** 消息类型,固定为 {@link MessageType.REGISTER} */
51
95
  type: MessageType.REGISTER;
96
+ /** 注册请求负载 */
52
97
  payload: {
98
+ /** 请求在服务端监听的远程端口号 */
53
99
  remotePort: number;
54
- protocol: Protocol;
100
+ /** 本地服务监听的端口号 */
55
101
  localPort: number;
102
+ /** 本地服务的主机地址,默认为 localhost */
56
103
  localHost?: string;
57
104
  };
58
105
  }
59
106
  /**
60
107
  * 注册响应消息
108
+ *
109
+ * 服务端对客户端注册请求的响应,表明注册是否成功及分配的远程端口信息。
61
110
  */
62
111
  export interface RegisterRespMessage extends Message {
112
+ /** 消息类型,固定为 {@link MessageType.REGISTER_RESP} */
63
113
  type: MessageType.REGISTER_RESP;
114
+ /** 注册响应负载 */
64
115
  payload: {
116
+ /** 注册是否成功 */
65
117
  success: boolean;
118
+ /** 服务端实际分配的远程端口号 */
66
119
  remotePort?: number;
120
+ /** 可通过此 URL 访问代理服务的完整地址 */
67
121
  remoteUrl?: string;
122
+ /** 注册失败时的错误描述信息 */
68
123
  error?: string;
69
124
  };
70
125
  }
71
126
  /**
72
127
  * 注销代理服务消息
128
+ *
129
+ * 客户端向服务端请求注销一条已注册的代理隧道。
73
130
  */
74
131
  export interface UnregisterMessage extends Message {
132
+ /** 消息类型,固定为 {@link MessageType.UNREGISTER} */
75
133
  type: MessageType.UNREGISTER;
134
+ /** 注销请求负载 */
76
135
  payload: {
136
+ /** 要注销的远程端口号 */
77
137
  remotePort: number;
78
138
  };
79
139
  }
80
140
  /**
81
141
  * 心跳消息
142
+ *
143
+ * 客户端定期发送的心跳消息,用于保持控制通道连接活跃。
82
144
  */
83
145
  export interface HeartbeatMessage extends Message {
146
+ /** 消息类型,固定为 {@link MessageType.HEARTBEAT} */
84
147
  type: MessageType.HEARTBEAT;
148
+ /** 心跳消息负载 */
85
149
  payload: {
150
+ /** 发送心跳时的时间戳(Unix 毫秒) */
86
151
  timestamp: number;
87
152
  };
88
153
  }
89
154
  /**
90
155
  * 心跳响应消息
156
+ *
157
+ * 服务端对客户端心跳消息的响应。
91
158
  */
92
159
  export interface HeartbeatRespMessage extends Message {
160
+ /** 消息类型,固定为 {@link MessageType.HEARTBEAT_RESP} */
93
161
  type: MessageType.HEARTBEAT_RESP;
162
+ /** 心跳响应负载 */
94
163
  payload: {
164
+ /** 服务端响应时的时间戳(Unix 毫秒) */
95
165
  timestamp: number;
96
166
  };
97
167
  }
98
168
  /**
99
- * HTTP请求头信息
169
+ * HTTP 请求头信息
170
+ *
171
+ * 表示 HTTP 请求或响应的头部字段映射,值可以是单个字符串、字符串数组或未定义。
100
172
  */
101
173
  export interface HttpHeaders {
174
+ /** HTTP 头部字段,键为头部名称,值为头部内容 */
102
175
  [key: string]: string | string[] | undefined;
103
176
  }
104
177
  /**
105
178
  * 新连接通知消息
179
+ *
180
+ * 当外部用户连接到服务端的代理端口时,服务端向客户端发送此消息通知新连接的到来,
181
+ * 并携带连接的详细信息(HTTP 请求数据或 WebSocket 握手头)。
106
182
  */
107
183
  export interface NewConnectionMessage extends Message {
184
+ /** 消息类型,固定为 {@link MessageType.NEW_CONNECTION} */
108
185
  type: MessageType.NEW_CONNECTION;
186
+ /** 新连接通知负载 */
109
187
  payload: {
188
+ /** 新连接的唯一标识符 */
110
189
  connectionId: string;
190
+ /** 连接使用的传输协议类型 */
111
191
  protocol: Protocol;
192
+ /** HTTP 请求方法(仅 HTTP 协议时存在),如 GET、POST 等 */
112
193
  method?: string;
194
+ /** HTTP 请求的 URL 路径(仅 HTTP 协议时存在) */
113
195
  url?: string;
196
+ /** HTTP 请求头(仅 HTTP 协议时存在) */
114
197
  headers?: HttpHeaders;
198
+ /** HTTP 请求体(仅 HTTP 协议时存在) */
115
199
  body?: string | Buffer;
200
+ /** WebSocket 握手请求头(仅 WebSocket 协议时存在) */
116
201
  wsHeaders?: HttpHeaders;
117
202
  };
118
203
  }
119
204
  /**
120
- * HTTP响应数据
205
+ * HTTP 响应数据
206
+ *
207
+ * 描述一个 HTTP 响应的结构,包含状态码、响应头和可选的响应体。
121
208
  */
122
209
  export interface HttpResponseData {
210
+ /** HTTP 响应状态码 */
123
211
  statusCode: number;
212
+ /** HTTP 响应头 */
124
213
  headers: HttpHeaders;
214
+ /** HTTP 响应体 */
125
215
  body?: string | Buffer;
126
216
  }
127
217
  /**
128
218
  * 连接关闭消息
219
+ *
220
+ * 通知对方某个代理连接已关闭。
129
221
  */
130
222
  export interface ConnectionCloseMessage extends Message {
223
+ /** 消息类型,固定为 {@link MessageType.CONNECTION_CLOSE} */
131
224
  type: MessageType.CONNECTION_CLOSE;
225
+ /** 连接关闭负载 */
132
226
  payload: {
227
+ /** 已关闭的连接的唯一标识符 */
133
228
  connectionId: string;
134
229
  };
135
230
  }
136
231
  /**
137
232
  * 连接错误消息
233
+ *
234
+ * 通知对方某个代理连接发生了错误。
138
235
  */
139
236
  export interface ConnectionErrorMessage extends Message {
237
+ /** 消息类型,固定为 {@link MessageType.CONNECTION_ERROR} */
140
238
  type: MessageType.CONNECTION_ERROR;
239
+ /** 连接错误负载 */
141
240
  payload: {
241
+ /** 发生错误的连接的唯一标识符 */
142
242
  connectionId: string;
243
+ /** 错误描述信息 */
143
244
  error: string;
144
245
  };
145
246
  }
146
247
  /**
147
248
  * 所有消息类型的联合类型
249
+ *
250
+ * 包含穿透代理协议中所有具体消息类型的联合,可用于消息处理函数的参数类型。
148
251
  */
149
252
  export type AnyMessage = AuthMessage | AuthRespMessage | RegisterMessage | RegisterRespMessage | UnregisterMessage | HeartbeatMessage | HeartbeatRespMessage | NewConnectionMessage | ConnectionCloseMessage | ConnectionErrorMessage;
150
253
  /**
151
254
  * 消息类型守卫
255
+ *
256
+ * 检查一个未知对象是否符合 {@link Message} 接口的基本结构。
257
+ *
258
+ * @param obj - 待检查的未知对象
259
+ * @returns 如果对象包含有效的 `type` 和 `id` 字段则返回 `true`
152
260
  */
153
261
  export declare function isMessage(obj: unknown): obj is Message;
154
262
  /**
155
263
  * 检查消息是否为指定类型
264
+ *
265
+ * 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
266
+ *
267
+ * @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
268
+ * @param msg - 待检查的消息对象
269
+ * @param type - 期望的消息类型标识
270
+ * @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
156
271
  */
157
272
  export declare function isMessageType<T extends AnyMessage>(msg: Message, type: T['type']): msg is T;
158
273
  /**
159
274
  * 创建消息
275
+ *
276
+ * 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
277
+ * 若未提供消息 ID,将自动生成一个唯一 ID。
278
+ *
279
+ * @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
280
+ * @param type - 消息类型标识
281
+ * @param payload - 消息负载数据
282
+ * @param id - 可选的消息唯一标识符,若不提供则自动生成
283
+ * @returns 包含完整字段的消息对象
160
284
  */
161
285
  export declare function createMessage<T extends Omit<AnyMessage, 'id'>>(type: T['type'], payload: T['payload'], id?: string): T & {
162
286
  id: string;
163
287
  };
164
288
  /**
165
289
  * 生成消息ID
290
+ *
291
+ * 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
292
+ *
293
+ * @returns 唯一的消息 ID 字符串
166
294
  */
167
295
  export declare function generateMessageId(): string;
168
296
  /**
169
297
  * 序列化消息
298
+ *
299
+ * 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
300
+ *
301
+ * @param msg - 要序列化的消息对象
302
+ * @returns 消息的 JSON 字符串表示
170
303
  */
171
304
  export declare function serializeMessage(msg: Message): string;
172
305
  /**
173
306
  * 反序列化消息
307
+ *
308
+ * 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
309
+ * 将抛出错误。
310
+ *
311
+ * @param data - 要反序列化的 JSON 字符串
312
+ * @returns 解析后的消息对象
313
+ * @throws 当 JSON 解析失败或消息格式无效时抛出错误
174
314
  */
175
315
  export declare function deserializeMessage(data: string): Message;
176
316
  //# sourceMappingURL=messages.d.ts.map
@@ -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
@@ -1,24 +1,48 @@
1
+ /**
2
+ * @module messages
3
+ *
4
+ * 穿透代理消息定义模块。
5
+ *
6
+ * 本模块定义了穿透代理系统中客户端与服务端之间通过 WebSocket 控制通道传输的所有消息类型,
7
+ * 包括认证消息、控制消息(注册/注销/心跳)、连接通知消息等,
8
+ * 以及消息的创建、序列化、反序列化和类型守卫等工具函数。
9
+ */
1
10
  /**
2
11
  * 消息类型枚举
12
+ *
13
+ * 定义穿透代理协议中所有消息的类型标识,
14
+ * 涵盖认证、控制和连接通知三大类消息。
3
15
  */
4
16
  export var MessageType;
5
17
  (function (MessageType) {
6
- // 认证消息
18
+ /** 客户端发送的认证请求消息 */
7
19
  MessageType["AUTH"] = "auth";
20
+ /** 服务端返回的认证响应消息 */
8
21
  MessageType["AUTH_RESP"] = "auth_resp";
9
- // 控制消息
22
+ /** 客户端发送的代理注册请求消息 */
10
23
  MessageType["REGISTER"] = "register";
24
+ /** 客户端发送的代理注销请求消息 */
11
25
  MessageType["UNREGISTER"] = "unregister";
26
+ /** 服务端返回的注册响应消息 */
12
27
  MessageType["REGISTER_RESP"] = "register_resp";
28
+ /** 客户端发送的心跳消息 */
13
29
  MessageType["HEARTBEAT"] = "heartbeat";
30
+ /** 服务端返回的心跳响应消息 */
14
31
  MessageType["HEARTBEAT_RESP"] = "heartbeat_resp";
15
- // 连接通知
32
+ /** 服务端发送的新连接通知消息 */
16
33
  MessageType["NEW_CONNECTION"] = "new_connection";
34
+ /** 连接关闭通知消息 */
17
35
  MessageType["CONNECTION_CLOSE"] = "connection_close";
36
+ /** 连接错误通知消息 */
18
37
  MessageType["CONNECTION_ERROR"] = "connection_error";
19
38
  })(MessageType || (MessageType = {}));
20
39
  /**
21
40
  * 消息类型守卫
41
+ *
42
+ * 检查一个未知对象是否符合 {@link Message} 接口的基本结构。
43
+ *
44
+ * @param obj - 待检查的未知对象
45
+ * @returns 如果对象包含有效的 `type` 和 `id` 字段则返回 `true`
22
46
  */
23
47
  export function isMessage(obj) {
24
48
  if (typeof obj !== 'object' || obj === null) {
@@ -29,12 +53,28 @@ export function isMessage(obj) {
29
53
  }
30
54
  /**
31
55
  * 检查消息是否为指定类型
56
+ *
57
+ * 类型守卫函数,判断一条消息是否属于特定的消息类型,并在类型系统中收窄类型。
58
+ *
59
+ * @typeParam T - 目标消息类型,必须是 {@link AnyMessage} 的子类型
60
+ * @param msg - 待检查的消息对象
61
+ * @param type - 期望的消息类型标识
62
+ * @returns 如果消息的 `type` 字段与期望类型匹配则返回 `true`
32
63
  */
33
64
  export function isMessageType(msg, type) {
34
65
  return msg.type === type;
35
66
  }
36
67
  /**
37
68
  * 创建消息
69
+ *
70
+ * 工厂函数,根据指定的消息类型和负载数据创建一条新的消息实例。
71
+ * 若未提供消息 ID,将自动生成一个唯一 ID。
72
+ *
73
+ * @typeParam T - 目标消息类型(不含 `id` 字段),必须是 {@link AnyMessage} 的子类型
74
+ * @param type - 消息类型标识
75
+ * @param payload - 消息负载数据
76
+ * @param id - 可选的消息唯一标识符,若不提供则自动生成
77
+ * @returns 包含完整字段的消息对象
38
78
  */
39
79
  export function createMessage(type, payload, id) {
40
80
  return {
@@ -45,29 +85,45 @@ export function createMessage(type, payload, id) {
45
85
  }
46
86
  /**
47
87
  * 生成消息ID
88
+ *
89
+ * 生成一个格式为 `msg_{timestamp}_{random}` 的唯一消息标识符。
90
+ *
91
+ * @returns 唯一的消息 ID 字符串
48
92
  */
49
93
  export function generateMessageId() {
50
94
  return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 11)}`;
51
95
  }
52
96
  /**
53
97
  * 序列化消息
98
+ *
99
+ * 将消息对象转换为 JSON 字符串,用于通过 WebSocket 发送。
100
+ *
101
+ * @param msg - 要序列化的消息对象
102
+ * @returns 消息的 JSON 字符串表示
54
103
  */
55
104
  export function serializeMessage(msg) {
56
105
  return JSON.stringify(msg);
57
106
  }
58
107
  /**
59
108
  * 反序列化消息
109
+ *
110
+ * 将 JSON 字符串解析为消息对象。如果字符串不是有效的 JSON 或解析后的对象不符合消息格式,
111
+ * 将抛出错误。
112
+ *
113
+ * @param data - 要反序列化的 JSON 字符串
114
+ * @returns 解析后的消息对象
115
+ * @throws 当 JSON 解析失败或消息格式无效时抛出错误
60
116
  */
61
117
  export function deserializeMessage(data) {
62
118
  try {
63
119
  const msg = JSON.parse(data);
64
120
  if (!isMessage(msg)) {
65
- throw new Error('Invalid message format');
121
+ throw new Error('无效的消息格式');
66
122
  }
67
123
  return msg;
68
124
  }
69
125
  catch (error) {
70
- throw new Error(`Failed to deserialize message: ${error}`);
126
+ throw new Error(`消息反序列化失败: ${error}`);
71
127
  }
72
128
  }
73
129
  //# sourceMappingURL=messages.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAN,IAAY,WAgBX;AAhBD,WAAY,WAAW;IACrB,OAAO;IACP,4BAAa,CAAA;IACb,sCAAuB,CAAA;IAEvB,OAAO;IACP,oCAAqB,CAAA;IACrB,wCAAyB,CAAA;IACzB,8CAA+B,CAAA;IAC/B,sCAAuB,CAAA;IACvB,gDAAiC,CAAA;IAEjC,OAAO;IACP,gDAAiC,CAAA;IACjC,oDAAqC,CAAA;IACrC,oDAAqC,CAAA;AACvC,CAAC,EAhBW,WAAW,KAAX,WAAW,QAgBtB;AAmKD;;GAEG;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;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAY,EACZ,IAAe;IAEf,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3B,CAAC;AAED;;GAEG;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;;GAEG;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;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;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,wBAAwB,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC"}
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,110 +1,205 @@
1
+ /**
2
+ * @module protocol
3
+ *
4
+ * 穿透代理协议定义模块。
5
+ *
6
+ * 本模块定义了穿透代理系统的核心协议常量、错误码、默认配置以及各类配置接口。
7
+ * 包括服务端与客户端通信所需的协议版本、控制通道路径、心跳参数、端口范围等关键配置,
8
+ * 以及代理配置、服务器配置、客户端配置、连接信息等数据结构的类型定义。
9
+ */
1
10
  /**
2
11
  * 协议常量
12
+ *
13
+ * 定义穿透代理系统的基础协议参数。
3
14
  */
4
15
  export declare const PROTOCOL: {
16
+ /** 穿透协议版本号 */
5
17
  readonly VERSION: "1.0.0";
18
+ /** 客户端与服务端建立 WebSocket 控制通道的 URL 路径,如 ws://host:9000/control */
6
19
  readonly CONTROL_PATH: "/control";
7
20
  };
8
21
  /**
9
22
  * 协议错误码
23
+ *
24
+ * 枚举穿透代理系统中可能出现的各类错误码,
25
+ * 涵盖认证错误、注册错误、连接错误和通用错误四大类。
10
26
  */
11
27
  export declare enum ErrorCode {
28
+ /** 认证失败,令牌无效或不匹配 */
12
29
  AUTH_FAILED = "AUTH_FAILED",
30
+ /** 认证超时,客户端未在规定时间内完成认证 */
13
31
  AUTH_TIMEOUT = "AUTH_TIMEOUT",
32
+ /** 端口已被注册,其他客户端已占用该远程端口 */
14
33
  PORT_ALREADY_REGISTERED = "PORT_ALREADY_REGISTERED",
34
+ /** 端口超出允许范围 */
15
35
  PORT_OUT_OF_RANGE = "PORT_OUT_OF_RANGE",
36
+ /** 无效端口号 */
16
37
  INVALID_PORT = "INVALID_PORT",
38
+ /** 未找到指定的连接 */
17
39
  CONNECTION_NOT_FOUND = "CONNECTION_NOT_FOUND",
40
+ /** 连接超时 */
18
41
  CONNECTION_TIMEOUT = "CONNECTION_TIMEOUT",
42
+ /** 未找到指定的客户端 */
19
43
  CLIENT_NOT_FOUND = "CLIENT_NOT_FOUND",
44
+ /** 无效的消息格式 */
20
45
  INVALID_MESSAGE = "INVALID_MESSAGE",
46
+ /** 内部服务器错误 */
21
47
  INTERNAL_ERROR = "INTERNAL_ERROR"
22
48
  }
23
49
  /**
24
50
  * 协议错误类
51
+ *
52
+ * 继承自 {@link Error},附带 {@link ErrorCode} 错误码,
53
+ * 用于在穿透代理协议处理过程中抛出结构化的错误信息。
25
54
  */
26
55
  export declare class ProtocolError extends Error {
27
56
  code: ErrorCode;
57
+ /**
58
+ * 创建一个协议错误实例。
59
+ *
60
+ * @param code - 协议错误码,参见 {@link ErrorCode}
61
+ * @param message - 可读的错误描述信息
62
+ */
28
63
  constructor(code: ErrorCode, message: string);
29
64
  }
30
65
  /**
31
- * HTTP状态码
66
+ * HTTP 状态码常量
67
+ *
68
+ * 定义穿透代理系统中常用的 HTTP 状态码。
32
69
  */
33
70
  export declare const HTTP_STATUS: {
71
+ /** 请求成功 */
34
72
  readonly OK: 200;
73
+ /** 请求参数错误 */
35
74
  readonly BAD_REQUEST: 400;
75
+ /** 未授权,认证失败 */
36
76
  readonly UNAUTHORIZED: 401;
77
+ /** 未找到请求的资源 */
37
78
  readonly NOT_FOUND: 404;
79
+ /** 服务器内部错误 */
38
80
  readonly INTERNAL_SERVER_ERROR: 500;
81
+ /** 网关错误,上游服务不可用 */
39
82
  readonly BAD_GATEWAY: 502;
83
+ /** 服务不可用 */
40
84
  readonly SERVICE_UNAVAILABLE: 503;
41
85
  };
42
86
  /**
43
87
  * 默认配置
88
+ *
89
+ * 穿透代理系统的默认运行参数,包括端口、心跳、会话、重连及缓冲区等配置项。
44
90
  */
45
91
  export declare const DEFAULT_CONFIG: {
92
+ /** 服务端监听的控制端口,客户端通过此端口建立 WebSocket 控制通道进行认证、注册代理等操作 */
46
93
  readonly CONTROL_PORT: 9000;
94
+ /** 控制通道的 WebSocket URL 路径,客户端连接地址为 ws://host:{CONTROL_PORT}{CONTROL_PATH} */
47
95
  readonly CONTROL_PATH: "/control";
96
+ /** 心跳发送间隔时间,单位毫秒(默认 30 秒) */
48
97
  readonly HEARTBEAT_INTERVAL: 30000;
98
+ /** 心跳超时时间,超过此时间未收到心跳视为断连,单位毫秒(默认 60 秒) */
49
99
  readonly HEARTBEAT_TIMEOUT: 60000;
100
+ /** 会话超时时间,超时后会话将被清理,单位毫秒(默认 2 分钟) */
50
101
  readonly SESSION_TIMEOUT: 120000;
102
+ /** 断线重连间隔时间,单位毫秒(默认 5 秒) */
51
103
  readonly RECONNECT_INTERVAL: 5000;
104
+ /** 最大重连尝试次数(默认 10 次) */
52
105
  readonly MAX_RECONNECT_ATTEMPTS: 10;
106
+ /** 允许注册的最小端口号 */
53
107
  readonly MIN_PORT: 1024;
108
+ /** 允许注册的最大端口号 */
54
109
  readonly MAX_PORT: 65535;
110
+ /** 数据传输缓冲区大小,单位字节(默认 64KB) */
55
111
  readonly BUFFER_SIZE: number;
56
112
  };
57
113
  /**
58
114
  * 代理配置接口
115
+ *
116
+ * 描述单条代理隧道的配置,指定远程端口到本地端口的映射关系。
117
+ * 每个端口同时支持 HTTP 和 WebSocket 协议,无需单独指定。
59
118
  */
60
119
  export interface ProxyConfig {
120
+ /** 服务端监听的远程端口号,外部用户通过此端口访问代理服务 */
61
121
  remotePort: number;
62
- protocol: 'http' | 'websocket';
122
+ /** 本地服务监听的端口号,代理流量将被转发到此端口 */
63
123
  localPort: number;
124
+ /** 本地服务的主机地址,默认为 localhost */
64
125
  localHost?: string;
65
126
  }
66
127
  /**
67
128
  * 服务器配置接口
129
+ *
130
+ * 定义穿透代理服务端的运行参数,包括监听地址、认证令牌、心跳和 TLS 配置。
68
131
  */
69
132
  export interface ServerConfig {
133
+ /** 服务端监听的主机地址 */
70
134
  host: string;
135
+ /** 服务端控制通道监听的端口号 */
71
136
  controlPort: number;
137
+ /** 允许认证的令牌列表,客户端需提供其中之一才能通过认证 */
72
138
  authTokens: string[];
139
+ /** 心跳发送间隔时间,单位毫秒 */
73
140
  heartbeatInterval: number;
141
+ /** 会话超时时间,单位毫秒 */
74
142
  sessionTimeout: number;
143
+ /**
144
+ * TLS 证书配置,用于启用安全的 WSS 连接。
145
+ * 若不提供则使用非加密的 WS 连接。
146
+ */
75
147
  tls?: {
148
+ /** TLS 私钥文件路径或内容 */
76
149
  key: string;
150
+ /** TLS 证书文件路径或内容 */
77
151
  cert: string;
78
152
  };
79
153
  }
80
154
  /**
81
155
  * 客户端配置接口
156
+ *
157
+ * 定义穿透代理客户端的运行参数,包括服务器地址、认证令牌、重连策略和代理列表。
82
158
  */
83
159
  export interface ClientConfig {
160
+ /** 服务端 WebSocket 控制通道的完整 URL,如 ws://host:9000/control */
84
161
  serverUrl: string;
162
+ /** 客户端认证令牌,需与服务端配置的 authTokens 之一匹配 */
85
163
  token: string;
164
+ /** 断线重连间隔时间,单位毫秒 */
86
165
  reconnectInterval: number;
166
+ /** 最大重连尝试次数,超过后停止重连 */
87
167
  maxReconnectAttempts: number;
168
+ /** 需要注册的代理隧道配置列表 */
88
169
  proxies: ProxyConfig[];
89
170
  }
90
171
  /**
91
172
  * 连接信息接口
173
+ *
174
+ * 描述单个代理连接的运行时信息。
92
175
  */
93
176
  export interface ConnectionInfo {
177
+ /** 连接的唯一标识符 */
94
178
  id: string;
179
+ /** 发起连接的远程客户端 IP 地址 */
95
180
  remoteAddress: string;
181
+ /** 该连接使用的传输协议类型 */
96
182
  protocol: 'http' | 'websocket';
183
+ /** 连接建立的时间戳(Unix 毫秒) */
97
184
  createdAt: number;
98
185
  }
99
186
  /**
100
187
  * 客户端信息接口
188
+ *
189
+ * 描述已连接到服务端的客户端的运行时状态信息。
101
190
  */
102
191
  export interface ClientInfo {
192
+ /** 客户端的唯一标识符 */
103
193
  id: string;
194
+ /** 客户端是否已通过认证 */
104
195
  authenticated: boolean;
196
+ /** 客户端通过认证的时间戳(Unix 毫秒) */
105
197
  authenticatedAt?: number;
198
+ /** 最近一次收到心跳的时间戳(Unix 毫秒) */
106
199
  lastHeartbeat?: number;
200
+ /** 客户端已注册的远程端口集合 */
107
201
  registeredPorts: Set<number>;
202
+ /** 客户端当前活跃的连接映射表,键为连接 ID */
108
203
  connections: Map<string, ConnectionInfo>;
109
204
  }
110
205
  //# sourceMappingURL=protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,QAAQ;;;CAGX,CAAC;AAEX;;GAEG;AACH,oBAAY,SAAS;IAEnB,WAAW,gBAAgB;IAC3B,YAAY,iBAAiB;IAG7B,uBAAuB,4BAA4B;IACnD,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;IAG7B,oBAAoB,yBAAyB;IAC7C,kBAAkB,uBAAuB;IACzC,gBAAgB,qBAAqB;IAGrC,eAAe,oBAAoB;IACnC,cAAc,mBAAmB;CAClC;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;IAE7B,IAAI,EAAE,SAAS;gBAAf,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;CAQd,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;CAsBjB,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IAEvB,GAAG,CAAC,EAAE;QACJ,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C"}
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
package/dist/protocol.js CHANGED
@@ -1,34 +1,65 @@
1
+ /**
2
+ * @module protocol
3
+ *
4
+ * 穿透代理协议定义模块。
5
+ *
6
+ * 本模块定义了穿透代理系统的核心协议常量、错误码、默认配置以及各类配置接口。
7
+ * 包括服务端与客户端通信所需的协议版本、控制通道路径、心跳参数、端口范围等关键配置,
8
+ * 以及代理配置、服务器配置、客户端配置、连接信息等数据结构的类型定义。
9
+ */
1
10
  /**
2
11
  * 协议常量
12
+ *
13
+ * 定义穿透代理系统的基础协议参数。
3
14
  */
4
15
  export const PROTOCOL = {
16
+ /** 穿透协议版本号 */
5
17
  VERSION: '1.0.0',
18
+ /** 客户端与服务端建立 WebSocket 控制通道的 URL 路径,如 ws://host:9000/control */
6
19
  CONTROL_PATH: '/control',
7
20
  };
8
21
  /**
9
22
  * 协议错误码
23
+ *
24
+ * 枚举穿透代理系统中可能出现的各类错误码,
25
+ * 涵盖认证错误、注册错误、连接错误和通用错误四大类。
10
26
  */
11
27
  export var ErrorCode;
12
28
  (function (ErrorCode) {
13
- // 认证错误
29
+ /** 认证失败,令牌无效或不匹配 */
14
30
  ErrorCode["AUTH_FAILED"] = "AUTH_FAILED";
31
+ /** 认证超时,客户端未在规定时间内完成认证 */
15
32
  ErrorCode["AUTH_TIMEOUT"] = "AUTH_TIMEOUT";
16
- // 注册错误
33
+ /** 端口已被注册,其他客户端已占用该远程端口 */
17
34
  ErrorCode["PORT_ALREADY_REGISTERED"] = "PORT_ALREADY_REGISTERED";
35
+ /** 端口超出允许范围 */
18
36
  ErrorCode["PORT_OUT_OF_RANGE"] = "PORT_OUT_OF_RANGE";
37
+ /** 无效端口号 */
19
38
  ErrorCode["INVALID_PORT"] = "INVALID_PORT";
20
- // 连接错误
39
+ /** 未找到指定的连接 */
21
40
  ErrorCode["CONNECTION_NOT_FOUND"] = "CONNECTION_NOT_FOUND";
41
+ /** 连接超时 */
22
42
  ErrorCode["CONNECTION_TIMEOUT"] = "CONNECTION_TIMEOUT";
43
+ /** 未找到指定的客户端 */
23
44
  ErrorCode["CLIENT_NOT_FOUND"] = "CLIENT_NOT_FOUND";
24
- // 通用错误
45
+ /** 无效的消息格式 */
25
46
  ErrorCode["INVALID_MESSAGE"] = "INVALID_MESSAGE";
47
+ /** 内部服务器错误 */
26
48
  ErrorCode["INTERNAL_ERROR"] = "INTERNAL_ERROR";
27
49
  })(ErrorCode || (ErrorCode = {}));
28
50
  /**
29
51
  * 协议错误类
52
+ *
53
+ * 继承自 {@link Error},附带 {@link ErrorCode} 错误码,
54
+ * 用于在穿透代理协议处理过程中抛出结构化的错误信息。
30
55
  */
31
56
  export class ProtocolError extends Error {
57
+ /**
58
+ * 创建一个协议错误实例。
59
+ *
60
+ * @param code - 协议错误码,参见 {@link ErrorCode}
61
+ * @param message - 可读的错误描述信息
62
+ */
32
63
  constructor(code, message) {
33
64
  super(message);
34
65
  this.code = code;
@@ -36,36 +67,51 @@ export class ProtocolError extends Error {
36
67
  }
37
68
  }
38
69
  /**
39
- * HTTP状态码
70
+ * HTTP 状态码常量
71
+ *
72
+ * 定义穿透代理系统中常用的 HTTP 状态码。
40
73
  */
41
74
  export const HTTP_STATUS = {
75
+ /** 请求成功 */
42
76
  OK: 200,
77
+ /** 请求参数错误 */
43
78
  BAD_REQUEST: 400,
79
+ /** 未授权,认证失败 */
44
80
  UNAUTHORIZED: 401,
81
+ /** 未找到请求的资源 */
45
82
  NOT_FOUND: 404,
83
+ /** 服务器内部错误 */
46
84
  INTERNAL_SERVER_ERROR: 500,
85
+ /** 网关错误,上游服务不可用 */
47
86
  BAD_GATEWAY: 502,
87
+ /** 服务不可用 */
48
88
  SERVICE_UNAVAILABLE: 503,
49
89
  };
50
90
  /**
51
91
  * 默认配置
92
+ *
93
+ * 穿透代理系统的默认运行参数,包括端口、心跳、会话、重连及缓冲区等配置项。
52
94
  */
53
95
  export const DEFAULT_CONFIG = {
54
- // 控制通道配置
96
+ /** 服务端监听的控制端口,客户端通过此端口建立 WebSocket 控制通道进行认证、注册代理等操作 */
55
97
  CONTROL_PORT: 9000,
98
+ /** 控制通道的 WebSocket URL 路径,客户端连接地址为 ws://host:{CONTROL_PORT}{CONTROL_PATH} */
56
99
  CONTROL_PATH: '/control',
57
- // 心跳配置
58
- HEARTBEAT_INTERVAL: 30000, // 30秒
59
- HEARTBEAT_TIMEOUT: 60000, // 60秒
60
- // 会话配置
61
- SESSION_TIMEOUT: 120000, // 2分钟
62
- // 重连配置
63
- RECONNECT_INTERVAL: 5000, // 5秒
64
- MAX_RECONNECT_ATTEMPTS: 10, // 最多重连10次
65
- // 端口范围
100
+ /** 心跳发送间隔时间,单位毫秒(默认 30 秒) */
101
+ HEARTBEAT_INTERVAL: 30000,
102
+ /** 心跳超时时间,超过此时间未收到心跳视为断连,单位毫秒(默认 60 秒) */
103
+ HEARTBEAT_TIMEOUT: 60000,
104
+ /** 会话超时时间,超时后会话将被清理,单位毫秒(默认 2 分钟) */
105
+ SESSION_TIMEOUT: 120000,
106
+ /** 断线重连间隔时间,单位毫秒(默认 5 秒) */
107
+ RECONNECT_INTERVAL: 5000,
108
+ /** 最大重连尝试次数(默认 10 次) */
109
+ MAX_RECONNECT_ATTEMPTS: 10,
110
+ /** 允许注册的最小端口号 */
66
111
  MIN_PORT: 1024,
112
+ /** 允许注册的最大端口号 */
67
113
  MAX_PORT: 65535,
68
- // 缓冲区大小
69
- BUFFER_SIZE: 64 * 1024, // 64KB
114
+ /** 数据传输缓冲区大小,单位字节(默认 64KB) */
115
+ BUFFER_SIZE: 64 * 1024,
70
116
  };
71
117
  //# sourceMappingURL=protocol.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,UAAU;CAChB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAN,IAAY,SAkBX;AAlBD,WAAY,SAAS;IACnB,OAAO;IACP,wCAA2B,CAAA;IAC3B,0CAA6B,CAAA;IAE7B,OAAO;IACP,gEAAmD,CAAA;IACnD,oDAAuC,CAAA;IACvC,0CAA6B,CAAA;IAE7B,OAAO;IACP,0DAA6C,CAAA;IAC7C,sDAAyC,CAAA;IACzC,kDAAqC,CAAA;IAErC,OAAO;IACP,gDAAmC,CAAA;IACnC,8CAAiC,CAAA;AACnC,CAAC,EAlBW,SAAS,KAAT,SAAS,QAkBpB;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YACS,IAAe,EACtB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAW;QAItB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,EAAE,EAAE,GAAG;IACP,WAAW,EAAE,GAAG;IAChB,YAAY,EAAE,GAAG;IACjB,SAAS,EAAE,GAAG;IACd,qBAAqB,EAAE,GAAG;IAC1B,WAAW,EAAE,GAAG;IAChB,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,SAAS;IACT,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,UAAU;IAExB,OAAO;IACP,kBAAkB,EAAE,KAAK,EAAE,MAAM;IACjC,iBAAiB,EAAE,KAAK,EAAG,MAAM;IAEjC,OAAO;IACP,eAAe,EAAE,MAAM,EAAG,MAAM;IAEhC,OAAO;IACP,kBAAkB,EAAE,IAAI,EAAM,KAAK;IACnC,sBAAsB,EAAE,EAAE,EAAI,UAAU;IAExC,OAAO;IACP,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,KAAK;IAEf,QAAQ;IACR,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO;CACvB,CAAC"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,cAAc;IACd,OAAO,EAAE,OAAO;IAChB,gEAAgE;IAChE,YAAY,EAAE,UAAU;CAChB,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAN,IAAY,SAwBX;AAxBD,WAAY,SAAS;IACnB,oBAAoB;IACpB,wCAA2B,CAAA;IAC3B,0BAA0B;IAC1B,0CAA6B,CAAA;IAE7B,2BAA2B;IAC3B,gEAAmD,CAAA;IACnD,eAAe;IACf,oDAAuC,CAAA;IACvC,YAAY;IACZ,0CAA6B,CAAA;IAE7B,eAAe;IACf,0DAA6C,CAAA;IAC7C,WAAW;IACX,sDAAyC,CAAA;IACzC,gBAAgB;IAChB,kDAAqC,CAAA;IAErC,cAAc;IACd,gDAAmC,CAAA;IACnC,cAAc;IACd,8CAAiC,CAAA;AACnC,CAAC,EAxBW,SAAS,KAAT,SAAS,QAwBpB;AAED;;;;;GAKG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC;;;;;OAKG;IACH,YACS,IAAe,EACtB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAW;QAItB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,EAAE,EAAE,GAAG;IACP,aAAa;IACb,WAAW,EAAE,GAAG;IAChB,eAAe;IACf,YAAY,EAAE,GAAG;IACjB,eAAe;IACf,SAAS,EAAE,GAAG;IACd,cAAc;IACd,qBAAqB,EAAE,GAAG;IAC1B,mBAAmB;IACnB,WAAW,EAAE,GAAG;IAChB,YAAY;IACZ,mBAAmB,EAAE,GAAG;CAChB,CAAC;AAEX;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uDAAuD;IACvD,YAAY,EAAE,IAAI;IAClB,6EAA6E;IAC7E,YAAY,EAAE,UAAU;IAExB,6BAA6B;IAC7B,kBAAkB,EAAE,KAAK;IACzB,0CAA0C;IAC1C,iBAAiB,EAAE,KAAK;IAExB,qCAAqC;IACrC,eAAe,EAAE,MAAM;IAEvB,4BAA4B;IAC5B,kBAAkB,EAAE,IAAI;IACxB,wBAAwB;IACxB,sBAAsB,EAAE,EAAE;IAE1B,iBAAiB;IACjB,QAAQ,EAAE,IAAI;IACd,iBAAiB;IACjB,QAAQ,EAAE,KAAK;IAEf,8BAA8B;IAC9B,WAAW,EAAE,EAAE,GAAG,IAAI;CACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feng3d/chuantou-shared",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",