yxmiler commited on
Commit
ad19dfd
·
verified ·
1 Parent(s): 8167dc5

Update index.js

Browse files
Files changed (1) hide show
  1. index.js +27 -9
index.js CHANGED
@@ -172,8 +172,9 @@ class ResponseHandler {
172
 
173
  // WebSocket工具类
174
  class WebSocketUtils {
175
- static isProcessing = false; // 添加静态属性用于并行控制
176
  static TIMEOUT = 5 * 60 * 1000; // 5分钟超时时间
 
177
 
178
  // 生成WebSocket密钥
179
  static generateWebSocketKey() {
@@ -182,11 +183,11 @@ class WebSocketUtils {
182
 
183
  // 创建WebSocket客户端
184
  static async createWebSocketClient(requestPayload) {
185
- if (this.isProcessing) {
186
- throw new Error('上游服务繁忙,只允许单次请求,请稍后重试!');
 
187
  }
188
 
189
- this.isProcessing = true;
190
  let timeoutId;
191
  let ws;
192
 
@@ -200,11 +201,17 @@ class WebSocketUtils {
200
  }
201
  });
202
 
 
 
 
 
203
  // 设置超时处理
204
  timeoutId = setTimeout(() => {
205
  if (ws.readyState === WebSocket.OPEN) {
206
  ws.close();
207
  }
 
 
208
  reject(new Error('WebSocket连接超时(5分钟)'));
209
  }, this.TIMEOUT);
210
 
@@ -227,6 +234,7 @@ class WebSocketUtils {
227
  ws.on('message', async (data) => {
228
  const message = data.toString();
229
  const parsedMessage = JSON.parse(message);
 
230
 
231
  switch (parsedMessage.type) {
232
  case 'connection_ack':
@@ -254,7 +262,8 @@ class WebSocketUtils {
254
  ws.on('error', (err) => {
255
  console.error('WebSocket错误:', err);
256
  clearTimeout(timeoutId);
257
- this.isProcessing = false;
 
258
  if (ws.readyState === WebSocket.OPEN) {
259
  ws.close();
260
  }
@@ -264,7 +273,8 @@ class WebSocketUtils {
264
  ws.on('close', (code, reason) => {
265
  console.log('请求完毕,关闭连接');
266
  clearTimeout(timeoutId);
267
- this.isProcessing = false;
 
268
  if (!isComplete) {
269
  reject(new Error('WebSocket closed unexpectedly'));
270
  }
@@ -272,9 +282,12 @@ class WebSocketUtils {
272
  });
273
  } catch (error) {
274
  clearTimeout(timeoutId);
275
- this.isProcessing = false;
276
- if (ws && ws.readyState === WebSocket.OPEN) {
277
- ws.close();
 
 
 
278
  }
279
  throw error;
280
  }
@@ -330,6 +343,11 @@ class WebSocketUtils {
330
  }
331
  return null;
332
  }
 
 
 
 
 
333
  }
334
 
335
  // 创建Express应用
 
172
 
173
  // WebSocket工具类
174
  class WebSocketUtils {
175
+ static activeConnections = new Set(); // 跟踪活跃连接
176
  static TIMEOUT = 5 * 60 * 1000; // 5分钟超时时间
177
+ static MAX_CONNECTIONS = 10; // 最大并发连接数
178
 
179
  // 生成WebSocket密钥
180
  static generateWebSocketKey() {
 
183
 
184
  // 创建WebSocket客户端
185
  static async createWebSocketClient(requestPayload) {
186
+ // 检查当前连接数是否达到上限
187
+ if (this.activeConnections.size >= this.MAX_CONNECTIONS) {
188
+ throw new Error(`当前连接数已达到上限 (${this.MAX_CONNECTIONS}),请稍后重试喵!`);
189
  }
190
 
 
191
  let timeoutId;
192
  let ws;
193
 
 
201
  }
202
  });
203
 
204
+ // 添加到活跃连接集合
205
+ this.activeConnections.add(ws);
206
+ console.log(`当前活跃连接数: ${this.activeConnections.size}/${this.MAX_CONNECTIONS}`);
207
+
208
  // 设置超时处理
209
  timeoutId = setTimeout(() => {
210
  if (ws.readyState === WebSocket.OPEN) {
211
  ws.close();
212
  }
213
+ this.activeConnections.delete(ws);
214
+ console.log(`连接超时,当前活跃连接数: ${this.activeConnections.size}/${this.MAX_CONNECTIONS}`);
215
  reject(new Error('WebSocket连接超时(5分钟)'));
216
  }, this.TIMEOUT);
217
 
 
234
  ws.on('message', async (data) => {
235
  const message = data.toString();
236
  const parsedMessage = JSON.parse(message);
237
+ console.log(JSON.stringify(parsedMessage,null,2));
238
 
239
  switch (parsedMessage.type) {
240
  case 'connection_ack':
 
262
  ws.on('error', (err) => {
263
  console.error('WebSocket错误:', err);
264
  clearTimeout(timeoutId);
265
+ this.activeConnections.delete(ws);
266
+ console.log(`连接错误,当前活跃连接数: ${this.activeConnections.size}/${this.MAX_CONNECTIONS}`);
267
  if (ws.readyState === WebSocket.OPEN) {
268
  ws.close();
269
  }
 
273
  ws.on('close', (code, reason) => {
274
  console.log('请求完毕,关闭连接');
275
  clearTimeout(timeoutId);
276
+ this.activeConnections.delete(ws);
277
+ console.log(`连接关闭,当前活跃连接数: ${this.activeConnections.size}/${this.MAX_CONNECTIONS}`);
278
  if (!isComplete) {
279
  reject(new Error('WebSocket closed unexpectedly'));
280
  }
 
282
  });
283
  } catch (error) {
284
  clearTimeout(timeoutId);
285
+ if (ws) {
286
+ this.activeConnections.delete(ws);
287
+ console.log(`发生错误,当前活跃连接数: ${this.activeConnections.size}/${this.MAX_CONNECTIONS}`);
288
+ if (ws.readyState === WebSocket.OPEN) {
289
+ ws.close();
290
+ }
291
  }
292
  throw error;
293
  }
 
343
  }
344
  return null;
345
  }
346
+
347
+ // 获取当前活跃连接数
348
+ static getActiveConnectionsCount() {
349
+ return this.activeConnections.size;
350
+ }
351
  }
352
 
353
  // 创建Express应用