@feng3d/ctc 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.
@@ -3,171 +3,75 @@
3
3
  *
4
4
  * 客户端控制器模块。
5
5
  *
6
- * 管理客户端与穿透服务器之间的 WebSocket 控制连接,
7
- * 负责身份认证、心跳保活、消息收发、断线重连等核心通信逻辑。
6
+ * 管理客户端与穿透服务器之间的 WebSocket 控制连接和二进制数据通道,
7
+ * 负责身份认证、心跳保活、数据通道建立、消息收发、断线重连等核心通信逻辑。
8
8
  */
9
9
  import { EventEmitter } from 'events';
10
10
  import { Config } from './config.js';
11
+ import { DataChannel } from './data-channel.js';
11
12
  /**
12
- * 客户端控制器类,管理与穿透服务器的 WebSocket 控制连接。
13
+ * 客户端控制器类。
13
14
  *
14
- * 继承自 {@link EventEmitter},提供以下事件:
15
- * - `connected` - 成功连接到服务器时触发
16
- * - `disconnected` - 与服务器断开连接时触发
17
- * - `authenticated` - 身份认证成功时触发
18
- * - `maxReconnectAttemptsReached` - 达到最大重连次数时触发
19
- * - `newConnection` - 收到新的代理连接请求时触发
20
- * - `connectionClose` - 收到连接关闭通知时触发
21
- * - `connectionError` - 收到连接错误通知时触发
22
- *
23
- * @example
24
- * ```typescript
25
- * const controller = new Controller(config);
26
- * controller.on('authenticated', () => logger.log('已认证'));
27
- * await controller.connect();
28
- * ```
15
+ * 事件:
16
+ * - `connected` 成功连接到服务器
17
+ * - `disconnected` 与服务器断开连接
18
+ * - `authenticated` 身份认证成功
19
+ * - `maxReconnectAttemptsReached` 达到最大重连次数
20
+ * - `newConnection` 收到新的代理连接请求
21
+ * - `connectionClose` 收到连接关闭通知
22
+ * - `connectionError` 收到连接错误通知
29
23
  */
30
24
  export declare class Controller extends EventEmitter {
31
- /** 客户端配置实例 */
32
25
  private config;
33
- /** 与服务器的 WebSocket 连接实例 */
34
26
  private ws;
35
- /** 是否已连接到服务器 */
36
27
  private connected;
37
- /** 是否已通过身份认证 */
38
28
  private authenticated;
39
- /** 重连定时器 */
40
29
  private reconnectTimer;
41
- /** 心跳定时器 */
42
30
  private heartbeatTimer;
43
- /** 当前重连尝试次数 */
44
31
  private reconnectAttempts;
45
- /** 待响应的请求映射表,键为消息 ID */
46
32
  private pendingRequests;
33
+ /** 服务端分配的客户端 ID(认证成功后获得) */
34
+ private clientId;
35
+ /** 二进制数据通道 */
36
+ private dataChannel;
37
+ constructor(config: Config);
47
38
  /**
48
- * 创建控制器实例。
49
- *
50
- * @param config - 客户端配置对象
39
+ * 获取数据通道实例
51
40
  */
52
- constructor(config: Config);
41
+ getDataChannel(): DataChannel;
42
+ /**
43
+ * 获取客户端 ID
44
+ */
45
+ getClientId(): string;
53
46
  /**
54
47
  * 连接到穿透服务器。
55
48
  *
56
- * 建立 WebSocket 连接后会自动进行身份认证和启动心跳。
57
- * 连接断开时会自动安排重连。
58
- *
59
- * @returns 连接并认证成功后解析的 Promise
60
- * @throws {Error} 连接失败或认证失败时抛出错误
49
+ * 建立 WebSocket 连接 → 认证 → 建立数据通道 → 启动心跳。
61
50
  */
62
51
  connect(): Promise<void>;
63
52
  /**
64
- * 向服务器发送身份认证请求。
65
- *
66
- * 使用配置中的 token 进行认证,认证成功后触发 `authenticated` 事件。
67
- *
68
- * @throws {Error} 认证失败时抛出错误,包含服务器返回的错误信息
53
+ * 认证并获取 clientId
69
54
  */
70
55
  private authenticate;
71
56
  /**
72
- * 启动心跳定时器。
73
- *
74
- * 每 30 秒向服务器发送一次心跳消息,仅在已连接且已认证状态下发送。
57
+ * 建立数据通道(TCP + UDP)
75
58
  */
59
+ private establishDataChannels;
76
60
  private startHeartbeat;
77
- /**
78
- * 停止心跳定时器。
79
- *
80
- * 清除心跳定时器并将其设置为 null。
81
- */
82
61
  private stopHeartbeat;
83
- /**
84
- * 安排断线重连。
85
- *
86
- * 使用指数退避策略计算重连延迟时间。如果已达到最大重连次数,
87
- * 则触发 `maxReconnectAttemptsReached` 事件并停止重连。
88
- */
89
62
  private scheduleReconnect;
90
- /**
91
- * 计算重连延迟时间(指数退避算法)。
92
- *
93
- * 基于重连间隔和当前重连次数计算延迟,最大不超过 60 秒,
94
- * 并添加 0~1 秒的随机抖动以避免多客户端同时重连造成服务器压力。
95
- *
96
- * @returns 重连延迟时间(毫秒)
97
- */
98
63
  private calculateReconnectDelay;
99
64
  /**
100
- * 处理从服务器接收到的消息。
101
- *
102
- * 根据消息类型进行分发:
103
- * - 响应类消息(AUTH_RESP、REGISTER_RESP、HEARTBEAT_RESP)交由 {@link handleResponse} 处理
104
- * - 新连接、连接关闭、连接错误等消息通过事件触发通知上层
105
- *
106
- * @param data - 接收到的原始消息数据
65
+ * 处理控制消息(仅控制消息,数据通过 DataChannel 传输)
107
66
  */
108
67
  private handleMessage;
109
- /**
110
- * 处理响应类消息。
111
- *
112
- * 根据消息 ID 查找对应的待处理请求,清除超时定时器并解析 Promise。
113
- *
114
- * @param message - 服务器返回的响应消息对象
115
- */
116
68
  private handleResponse;
117
- /**
118
- * 发送请求消息并等待服务器响应。
119
- *
120
- * 将消息发送到服务器,并在指定超时时间内等待对应的响应消息。
121
- * 如果超时未收到响应,Promise 将被拒绝。
122
- *
123
- * @typeParam T - 期望的响应消息类型
124
- * @param message - 要发送的请求消息对象,必须包含 `id` 字段
125
- * @param timeout - 请求超时时间(毫秒),默认为 30000
126
- * @returns 服务器响应消息的 Promise
127
- * @throws {Error} 请求超时时抛出 "Request timeout" 错误
128
- */
129
69
  sendRequest<T>(message: any, timeout?: number): Promise<T>;
130
- /**
131
- * 向服务器发送消息。
132
- *
133
- * 将消息对象序列化为 JSON 并通过 WebSocket 发送。
134
- * 仅在 WebSocket 连接处于 OPEN 状态时才能发送。
135
- *
136
- * @param message - 要发送的消息对象
137
- * @returns 发送成功返回 `true`,未连接时返回 `false`
138
- */
139
70
  sendMessage(message: any): boolean;
140
- /**
141
- * 检查是否已连接到服务器。
142
- *
143
- * @returns 已连接返回 `true`,否则返回 `false`
144
- */
145
71
  isConnected(): boolean;
146
- /**
147
- * 检查是否已通过身份认证。
148
- *
149
- * @returns 已认证返回 `true`,否则返回 `false`
150
- */
151
72
  isAuthenticated(): boolean;
152
- /**
153
- * 获取当前重连尝试次数。
154
- *
155
- * @returns 当前重连次数
156
- */
157
73
  getReconnectAttempts(): number;
158
- /**
159
- * 断开与服务器的连接。
160
- *
161
- * 清除重连定时器、停止心跳、关闭 WebSocket 连接,
162
- * 并重置连接和认证状态。
163
- */
164
74
  disconnect(): void;
165
- /**
166
- * 销毁控制器实例,释放所有资源。
167
- *
168
- * 断开连接、清除所有待处理请求的超时定时器、
169
- * 清空待处理请求映射表并移除所有事件监听器。
170
- */
171
75
  destroy(): void;
172
76
  }
173
77
  //# sourceMappingURL=controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AActC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,cAAc;IACd,OAAO,CAAC,MAAM,CAAS;IAEvB,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAA0B;IAEpC,gBAAgB;IAChB,OAAO,CAAC,SAAS,CAAkB;IAEnC,gBAAgB;IAChB,OAAO,CAAC,aAAa,CAAkB;IAEvC,YAAY;IACZ,OAAO,CAAC,cAAc,CAA+B;IAErD,YAAY;IACZ,OAAO,CAAC,cAAc,CAA+B;IAErD,eAAe;IACf,OAAO,CAAC,iBAAiB,CAAa;IAEtC,wBAAwB;IACxB,OAAO,CAAC,eAAe,CAIR;IAEf;;;;OAIG;gBACS,MAAM,EAAE,MAAM;IAK1B;;;;;;;;OAQG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C9B;;;;;;OAMG;YACW,YAAY;IAiB1B;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAWtB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IAOrB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAyBzB;;;;;;;OAOG;IACH,OAAO,CAAC,uBAAuB;IAQ/B;;;;;;;;OAQG;IACH,OAAO,CAAC,aAAa;IAkCrB;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAStB;;;;;;;;;;;OAWG;IACH,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAYjE;;;;;;;;OAQG;IACH,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IASlC;;;;OAIG;IACH,WAAW,IAAI,OAAO;IAItB;;;;OAIG;IACH,eAAe,IAAI,OAAO;IAI1B;;;;OAIG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;;;;OAKG;IACH,UAAU,IAAI,IAAI;IAclB;;;;;OAKG;IACH,OAAO,IAAI,IAAI;CAQhB"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAYtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,eAAe,CAIR;IAEf,4BAA4B;IAC5B,OAAO,CAAC,QAAQ,CAAc;IAE9B,cAAc;IACd,OAAO,CAAC,WAAW,CAAc;gBAErB,MAAM,EAAE,MAAM;IAM1B;;OAEG;IACH,cAAc,IAAI,WAAW;IAI7B;;OAEG;IACH,WAAW,IAAI,MAAM;IAIrB;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C9B;;OAEG;YACW,YAAY;IAkB1B;;OAEG;YACW,qBAAqB;IAuBnC,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,uBAAuB;IAO/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,cAAc;IAStB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAE,MAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAYjE,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO;IASlC,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,OAAO;IAI1B,oBAAoB,IAAI,MAAM;IAI9B,UAAU,IAAI,IAAI;IAelB,OAAO,IAAI,IAAI;CAQhB"}
@@ -3,63 +3,56 @@
3
3
  *
4
4
  * 客户端控制器模块。
5
5
  *
6
- * 管理客户端与穿透服务器之间的 WebSocket 控制连接,
7
- * 负责身份认证、心跳保活、消息收发、断线重连等核心通信逻辑。
6
+ * 管理客户端与穿透服务器之间的 WebSocket 控制连接和二进制数据通道,
7
+ * 负责身份认证、心跳保活、数据通道建立、消息收发、断线重连等核心通信逻辑。
8
8
  */
9
9
  import { WebSocket } from 'ws';
10
10
  import { EventEmitter } from 'events';
11
11
  import { MessageType, createMessage, logger, } from '@feng3d/chuantou-shared';
12
+ import { DataChannel } from './data-channel.js';
12
13
  /**
13
- * 客户端控制器类,管理与穿透服务器的 WebSocket 控制连接。
14
+ * 客户端控制器类。
14
15
  *
15
- * 继承自 {@link EventEmitter},提供以下事件:
16
- * - `connected` - 成功连接到服务器时触发
17
- * - `disconnected` - 与服务器断开连接时触发
18
- * - `authenticated` - 身份认证成功时触发
19
- * - `maxReconnectAttemptsReached` - 达到最大重连次数时触发
20
- * - `newConnection` - 收到新的代理连接请求时触发
21
- * - `connectionClose` - 收到连接关闭通知时触发
22
- * - `connectionError` - 收到连接错误通知时触发
23
- *
24
- * @example
25
- * ```typescript
26
- * const controller = new Controller(config);
27
- * controller.on('authenticated', () => logger.log('已认证'));
28
- * await controller.connect();
29
- * ```
16
+ * 事件:
17
+ * - `connected` 成功连接到服务器
18
+ * - `disconnected` 与服务器断开连接
19
+ * - `authenticated` 身份认证成功
20
+ * - `maxReconnectAttemptsReached` 达到最大重连次数
21
+ * - `newConnection` 收到新的代理连接请求
22
+ * - `connectionClose` 收到连接关闭通知
23
+ * - `connectionError` 收到连接错误通知
30
24
  */
31
25
  export class Controller extends EventEmitter {
32
- /**
33
- * 创建控制器实例。
34
- *
35
- * @param config - 客户端配置对象
36
- */
37
26
  constructor(config) {
38
27
  super();
39
- /** 与服务器的 WebSocket 连接实例 */
40
28
  this.ws = null;
41
- /** 是否已连接到服务器 */
42
29
  this.connected = false;
43
- /** 是否已通过身份认证 */
44
30
  this.authenticated = false;
45
- /** 重连定时器 */
46
31
  this.reconnectTimer = null;
47
- /** 心跳定时器 */
48
32
  this.heartbeatTimer = null;
49
- /** 当前重连尝试次数 */
50
33
  this.reconnectAttempts = 0;
51
- /** 待响应的请求映射表,键为消息 ID */
52
34
  this.pendingRequests = new Map();
35
+ /** 服务端分配的客户端 ID(认证成功后获得) */
36
+ this.clientId = '';
53
37
  this.config = config;
38
+ this.dataChannel = new DataChannel();
39
+ }
40
+ /**
41
+ * 获取数据通道实例
42
+ */
43
+ getDataChannel() {
44
+ return this.dataChannel;
45
+ }
46
+ /**
47
+ * 获取客户端 ID
48
+ */
49
+ getClientId() {
50
+ return this.clientId;
54
51
  }
55
52
  /**
56
53
  * 连接到穿透服务器。
57
54
  *
58
- * 建立 WebSocket 连接后会自动进行身份认证和启动心跳。
59
- * 连接断开时会自动安排重连。
60
- *
61
- * @returns 连接并认证成功后解析的 Promise
62
- * @throws {Error} 连接失败或认证失败时抛出错误
55
+ * 建立 WebSocket 连接 → 认证 → 建立数据通道 → 启动心跳。
63
56
  */
64
57
  async connect() {
65
58
  return new Promise((resolve, reject) => {
@@ -70,9 +63,9 @@ export class Controller extends EventEmitter {
70
63
  this.connected = true;
71
64
  this.reconnectAttempts = 0;
72
65
  this.emit('connected');
73
- // 认证
74
66
  try {
75
67
  await this.authenticate();
68
+ await this.establishDataChannels();
76
69
  this.startHeartbeat();
77
70
  resolve();
78
71
  }
@@ -88,6 +81,8 @@ export class Controller extends EventEmitter {
88
81
  this.connected = false;
89
82
  this.authenticated = false;
90
83
  this.stopHeartbeat();
84
+ this.dataChannel.destroy();
85
+ this.dataChannel = new DataChannel();
91
86
  this.emit('disconnected');
92
87
  this.scheduleReconnect();
93
88
  });
@@ -100,11 +95,7 @@ export class Controller extends EventEmitter {
100
95
  });
101
96
  }
102
97
  /**
103
- * 向服务器发送身份认证请求。
104
- *
105
- * 使用配置中的 token 进行认证,认证成功后触发 `authenticated` 事件。
106
- *
107
- * @throws {Error} 认证失败时抛出错误,包含服务器返回的错误信息
98
+ * 认证并获取 clientId
108
99
  */
109
100
  async authenticate() {
110
101
  logger.log('正在认证...');
@@ -115,15 +106,34 @@ export class Controller extends EventEmitter {
115
106
  if (!response.payload.success) {
116
107
  throw new Error(`认证失败: ${response.payload.error}`);
117
108
  }
109
+ this.clientId = response.payload.clientId || '';
118
110
  this.authenticated = true;
119
- logger.log('认证成功');
111
+ logger.log(`认证成功 (clientId: ${this.clientId})`);
120
112
  this.emit('authenticated');
121
113
  }
122
114
  /**
123
- * 启动心跳定时器。
124
- *
125
- * 每 30 秒向服务器发送一次心跳消息,仅在已连接且已认证状态下发送。
115
+ * 建立数据通道(TCP + UDP)
126
116
  */
117
+ async establishDataChannels() {
118
+ if (!this.clientId) {
119
+ throw new Error('无法建立数据通道: clientId 未分配');
120
+ }
121
+ // 从 WebSocket URL 解析服务端地址和端口
122
+ const url = new URL(this.config.serverUrl);
123
+ const host = url.hostname;
124
+ const port = parseInt(url.port) || (url.protocol === 'wss:' ? 443 : 80);
125
+ // 并行建立 TCP 和 UDP 数据通道
126
+ await Promise.all([
127
+ this.dataChannel.connectTcp(host, port, this.clientId).catch((error) => {
128
+ logger.error('TCP 数据通道建立失败:', error.message);
129
+ throw error;
130
+ }),
131
+ this.dataChannel.connectUdp(host, port, this.clientId).catch((error) => {
132
+ logger.warn('UDP 数据通道建立失败(UDP 穿透将不可用):', error.message);
133
+ // UDP 通道失败不阻断启动
134
+ }),
135
+ ]);
136
+ }
127
137
  startHeartbeat() {
128
138
  this.heartbeatTimer = setInterval(() => {
129
139
  if (this.connected && this.authenticated) {
@@ -132,28 +142,17 @@ export class Controller extends EventEmitter {
132
142
  });
133
143
  this.sendMessage(heartbeatMsg);
134
144
  }
135
- }, 30000); // 30秒
145
+ }, 30000);
136
146
  }
137
- /**
138
- * 停止心跳定时器。
139
- *
140
- * 清除心跳定时器并将其设置为 null。
141
- */
142
147
  stopHeartbeat() {
143
148
  if (this.heartbeatTimer) {
144
149
  clearInterval(this.heartbeatTimer);
145
150
  this.heartbeatTimer = null;
146
151
  }
147
152
  }
148
- /**
149
- * 安排断线重连。
150
- *
151
- * 使用指数退避策略计算重连延迟时间。如果已达到最大重连次数,
152
- * 则触发 `maxReconnectAttemptsReached` 事件并停止重连。
153
- */
154
153
  scheduleReconnect() {
155
154
  if (this.reconnectTimer) {
156
- return; // 已经安排了重连
155
+ return;
157
156
  }
158
157
  if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {
159
158
  logger.error('已达到最大重连次数');
@@ -172,29 +171,14 @@ export class Controller extends EventEmitter {
172
171
  });
173
172
  }, delay);
174
173
  }
175
- /**
176
- * 计算重连延迟时间(指数退避算法)。
177
- *
178
- * 基于重连间隔和当前重连次数计算延迟,最大不超过 60 秒,
179
- * 并添加 0~1 秒的随机抖动以避免多客户端同时重连造成服务器压力。
180
- *
181
- * @returns 重连延迟时间(毫秒)
182
- */
183
174
  calculateReconnectDelay() {
184
175
  const baseDelay = this.config.reconnectInterval;
185
- const maxDelay = 60000; // 最大60秒
176
+ const maxDelay = 60000;
186
177
  const delay = Math.min(baseDelay * Math.pow(2, this.reconnectAttempts), maxDelay);
187
- // 添加随机抖动
188
178
  return delay + Math.random() * 1000;
189
179
  }
190
180
  /**
191
- * 处理从服务器接收到的消息。
192
- *
193
- * 根据消息类型进行分发:
194
- * - 响应类消息(AUTH_RESP、REGISTER_RESP、HEARTBEAT_RESP)交由 {@link handleResponse} 处理
195
- * - 新连接、连接关闭、连接错误等消息通过事件触发通知上层
196
- *
197
- * @param data - 接收到的原始消息数据
181
+ * 处理控制消息(仅控制消息,数据通过 DataChannel 传输)
198
182
  */
199
183
  handleMessage(data) {
200
184
  try {
@@ -204,7 +188,6 @@ export class Controller extends EventEmitter {
204
188
  case MessageType.AUTH_RESP:
205
189
  case MessageType.REGISTER_RESP:
206
190
  case MessageType.HEARTBEAT_RESP:
207
- // 响应消息,由pendingRequests处理
208
191
  this.handleResponse(message);
209
192
  break;
210
193
  case MessageType.NEW_CONNECTION:
@@ -225,13 +208,6 @@ export class Controller extends EventEmitter {
225
208
  logger.error('处理消息时出错:', errorMessage);
226
209
  }
227
210
  }
228
- /**
229
- * 处理响应类消息。
230
- *
231
- * 根据消息 ID 查找对应的待处理请求,清除超时定时器并解析 Promise。
232
- *
233
- * @param message - 服务器返回的响应消息对象
234
- */
235
211
  handleResponse(message) {
236
212
  const pending = this.pendingRequests.get(message.id);
237
213
  if (pending) {
@@ -240,18 +216,6 @@ export class Controller extends EventEmitter {
240
216
  pending.resolve(message);
241
217
  }
242
218
  }
243
- /**
244
- * 发送请求消息并等待服务器响应。
245
- *
246
- * 将消息发送到服务器,并在指定超时时间内等待对应的响应消息。
247
- * 如果超时未收到响应,Promise 将被拒绝。
248
- *
249
- * @typeParam T - 期望的响应消息类型
250
- * @param message - 要发送的请求消息对象,必须包含 `id` 字段
251
- * @param timeout - 请求超时时间(毫秒),默认为 30000
252
- * @returns 服务器响应消息的 Promise
253
- * @throws {Error} 请求超时时抛出 "Request timeout" 错误
254
- */
255
219
  sendRequest(message, timeout = 30000) {
256
220
  return new Promise((resolve, reject) => {
257
221
  const timer = setTimeout(() => {
@@ -262,15 +226,6 @@ export class Controller extends EventEmitter {
262
226
  this.sendMessage(message);
263
227
  });
264
228
  }
265
- /**
266
- * 向服务器发送消息。
267
- *
268
- * 将消息对象序列化为 JSON 并通过 WebSocket 发送。
269
- * 仅在 WebSocket 连接处于 OPEN 状态时才能发送。
270
- *
271
- * @param message - 要发送的消息对象
272
- * @returns 发送成功返回 `true`,未连接时返回 `false`
273
- */
274
229
  sendMessage(message) {
275
230
  if (this.ws && this.ws.readyState === WebSocket.OPEN) {
276
231
  this.ws.send(JSON.stringify(message));
@@ -279,42 +234,22 @@ export class Controller extends EventEmitter {
279
234
  logger.error('无法发送消息: 未连接');
280
235
  return false;
281
236
  }
282
- /**
283
- * 检查是否已连接到服务器。
284
- *
285
- * @returns 已连接返回 `true`,否则返回 `false`
286
- */
287
237
  isConnected() {
288
238
  return this.connected;
289
239
  }
290
- /**
291
- * 检查是否已通过身份认证。
292
- *
293
- * @returns 已认证返回 `true`,否则返回 `false`
294
- */
295
240
  isAuthenticated() {
296
241
  return this.authenticated;
297
242
  }
298
- /**
299
- * 获取当前重连尝试次数。
300
- *
301
- * @returns 当前重连次数
302
- */
303
243
  getReconnectAttempts() {
304
244
  return this.reconnectAttempts;
305
245
  }
306
- /**
307
- * 断开与服务器的连接。
308
- *
309
- * 清除重连定时器、停止心跳、关闭 WebSocket 连接,
310
- * 并重置连接和认证状态。
311
- */
312
246
  disconnect() {
313
247
  if (this.reconnectTimer) {
314
248
  clearTimeout(this.reconnectTimer);
315
249
  this.reconnectTimer = null;
316
250
  }
317
251
  this.stopHeartbeat();
252
+ this.dataChannel.destroy();
318
253
  if (this.ws) {
319
254
  this.ws.close();
320
255
  this.ws = null;
@@ -322,12 +257,6 @@ export class Controller extends EventEmitter {
322
257
  this.connected = false;
323
258
  this.authenticated = false;
324
259
  }
325
- /**
326
- * 销毁控制器实例,释放所有资源。
327
- *
328
- * 断开连接、清除所有待处理请求的超时定时器、
329
- * 清空待处理请求映射表并移除所有事件监听器。
330
- */
331
260
  destroy() {
332
261
  this.disconnect();
333
262
  for (const { timeout } of this.pendingRequests.values()) {
@@ -1 +1 @@
1
- {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"controller.js","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module data-channel
3
+ *
4
+ * 客户端数据通道模块。
5
+ *
6
+ * 管理与服务端的 TCP 二进制数据通道和 UDP 数据通道连接。
7
+ * TCP 数据通道用于高效传输 HTTP/WS/TCP 的原始二进制数据,
8
+ * UDP 数据通道用于保留 UDP 语义的数据转发。
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ /**
12
+ * 客户端数据通道
13
+ *
14
+ * 管理与服务端的 TCP 数据通道和 UDP 数据通道。
15
+ *
16
+ * 事件:
17
+ * - `'data'(connectionId, data)` — 收到服务端 TCP 数据帧
18
+ * - `'udpData'(connectionId, data)` — 收到服务端 UDP 数据帧
19
+ * - `'connected'` — TCP 数据通道已连接
20
+ * - `'disconnected'` — TCP 数据通道已断开
21
+ */
22
+ export declare class DataChannel extends EventEmitter {
23
+ private tcpSocket;
24
+ private udpSocket;
25
+ private frameParser;
26
+ private udpKeepaliveTimer;
27
+ private clientId;
28
+ private serverHost;
29
+ private serverPort;
30
+ /**
31
+ * 建立 TCP 数据通道
32
+ *
33
+ * @param serverHost - 服务端地址
34
+ * @param serverPort - 服务端端口(与控制端口相同)
35
+ * @param clientId - 服务端分配的客户端 ID
36
+ */
37
+ connectTcp(serverHost: string, serverPort: number, clientId: string): Promise<void>;
38
+ /**
39
+ * 建立 UDP 数据通道
40
+ *
41
+ * @param serverHost - 服务端地址
42
+ * @param serverPort - 服务端端口(与控制端口相同)
43
+ * @param clientId - 服务端分配的客户端 ID
44
+ */
45
+ connectUdp(serverHost: string, serverPort: number, clientId: string): Promise<void>;
46
+ /**
47
+ * 通过 TCP 数据通道发送数据帧
48
+ *
49
+ * @param connectionId - 连接 ID
50
+ * @param data - 要发送的原始数据
51
+ * @returns 是否发送成功
52
+ */
53
+ sendData(connectionId: string, data: Buffer): boolean;
54
+ /**
55
+ * 通过 UDP 数据通道发送数据帧
56
+ *
57
+ * @param connectionId - 连接 ID
58
+ * @param data - 要发送的原始数据
59
+ * @returns 是否发送成功
60
+ */
61
+ sendUdpData(connectionId: string, data: Buffer): boolean;
62
+ /** TCP 数据通道是否已连接 */
63
+ get isTcpConnected(): boolean;
64
+ /** UDP 数据通道是否已连接 */
65
+ get isUdpConnected(): boolean;
66
+ /**
67
+ * 销毁数据通道,释放所有资源
68
+ */
69
+ destroy(): void;
70
+ }
71
+ //# 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;;;;;;;;GAQG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAetC;;;;;;;;;;GAUG;AACH,qBAAa,WAAY,SAAQ,YAAY;IAC3C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,UAAU,CAAa;IAE/B;;;;;;OAMG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEzF;;;;;;OAMG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDzF;;;;;;OAMG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAQrD;;;;;;OAMG;IACH,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IASxD,oBAAoB;IACpB,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,oBAAoB;IACpB,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED;;OAEG;IACH,OAAO,IAAI,IAAI;CAuBhB"}