diff --git a/docs/01.png b/docs/01.png new file mode 100644 index 0000000..bc047be Binary files /dev/null and b/docs/01.png differ diff --git a/src/lib/ws-client.js b/src/lib/ws-client.js index da04245..4dd74ef 100644 --- a/src/lib/ws-client.js +++ b/src/lib/ws-client.js @@ -172,9 +172,9 @@ export class WsClient { const errCode = msg.error?.code console.error('[ws] connect 失败:', errMsg, errCode) - // 如果是配对错误,尝试自动配对 - if (errCode === 'NOT_PAIRED' || errCode === 'PAIRING_REQUIRED') { - console.log('[ws] 检测到未配对,尝试自动配对...') + // 如果是配对/origin 错误,尝试自动配对 + if (errCode === 'NOT_PAIRED' || errCode === 'PAIRING_REQUIRED' || /origin not allowed/i.test(errMsg)) { + console.log('[ws] 检测到配对/origin 错误,尝试自动修复...', errCode || errMsg) this._autoPairAndReconnect() return } diff --git a/src/pages/chat.js b/src/pages/chat.js index 78a90bb..dcafc0f 100644 --- a/src/pages/chat.js +++ b/src/pages/chat.js @@ -199,7 +199,7 @@ function bindConnectOverlay(page) { if (desc) desc.textContent = '修复完成,正在重连...' // 断开旧连接,重新发起 wsClient.disconnect() - setTimeout(() => connectGateway(), 1000) + setTimeout(() => connectGateway(), 3000) } catch (e) { if (desc) desc.textContent = '修复失败: ' + (e.message || e) } finally { @@ -304,6 +304,11 @@ function renderAttachments() { async function connectGateway() { try { + // 清理旧的订阅,避免重复监听 + if (_unsubStatus) { _unsubStatus(); _unsubStatus = null } + if (_unsubReady) { _unsubReady(); _unsubReady = null } + if (_unsubEvent) { _unsubEvent(); _unsubEvent = null } + // 订阅状态变化(订阅式,返回 unsub) _unsubStatus = wsClient.onStatusChange((status, errorMsg) => { if (!_pageActive) return