You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在浏览器中识别并强制终止挂起的WebSocket连接?

解决AWS Transcribe Streaming WebSocket无法关闭的问题

方法1:通过猴子补丁跟踪并强制关闭WebSocket实例

浏览器没有原生API直接获取所有活跃的WebSocket连接,我们可以通过重写原生WebSocket构造函数来跟踪目标连接:

// 全局存储AWS Transcribe相关的WebSocket实例
const activeTranscribeWS = new Set();

// 保存原生WebSocket构造函数
const OriginalWebSocket = window.WebSocket;

// 重写WebSocket,仅记录Transcribe相关连接
window.WebSocket = function(...args) {
  const ws = new OriginalWebSocket(...args);
  // 通过URL判断是否为Transcribe的连接(根据实际URL调整匹配规则)
  if (args[0].includes('transcribe')) {
    activeTranscribeWS.add(ws);
    // 连接关闭/出错时自动移除实例
    ws.addEventListener('close', () => activeTranscribeWS.delete(ws));
    ws.addEventListener('error', () => activeTranscribeWS.delete(ws));
  }
  return ws;
};

需要强制关闭时,遍历集合调用close方法:

// 批量关闭所有挂起的Transcribe WebSocket连接
function forceCloseTranscribeWS() {
  activeTranscribeWS.forEach(ws => {
    if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
      ws.close(1000, 'Forced close due to SDK bug');
      activeTranscribeWS.delete(ws);
    }
  });
}

你可以在组件卸载时(比如语音转文本组件的useEffect清理函数)调用这个方法,或者在需要终止连接的时机触发。

方法2:结合SDK客户端尝试手动终止

虽然SDK存在bug,但可以尝试调用客户端的销毁方法或取消命令:

// 假设已创建TranscribeStreamingClient实例
const client = new TranscribeStreamingClient({ /* 你的配置 */ });

// 尝试销毁客户端
client.destroy();

// 如果发送了StartStreamTranscriptionCommand,可尝试取消命令Promise
const command = new StartStreamTranscriptionCommand(/* 参数 */);
const commandPromise = client.send(command);

// 部分场景下可通过abort取消请求
if (commandPromise.abort) {
  commandPromise.abort();
}

方法3:开发环境手动调试关闭

在Chrome开发者工具的Network面板,筛选WS类型,找到对应的Transcribe连接,右键选择Cancel即可手动关闭单个挂起的连接,适合开发阶段临时处理。

内容的提问来源于stack exchange,提问作者Yash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:15:30