🗑️ 修复警告

This commit is contained in:
MoeSnowyFox
2025-09-11 23:35:42 +08:00
parent a034f10a19
commit 47e7291885

View File

@@ -1,5 +1,5 @@
import { ref, type Ref } from 'vue' import { ref, type Ref } from 'vue'
import { message, notification, Modal } from 'ant-design-vue' import { message, Modal, notification } from 'ant-design-vue'
// 基础配置 // 基础配置
const BASE_WS_URL = 'ws://localhost:36163/api/core/ws' const BASE_WS_URL = 'ws://localhost:36163/api/core/ws'
@@ -87,7 +87,7 @@ const initGlobalStorage = (): GlobalWSStorage => {
heartbeatTimer: undefined, heartbeatTimer: undefined,
isConnecting: false, isConnecting: false,
lastPingTime: 0, lastPingTime: 0,
connectionId: Math.random().toString(36).substr(2, 9), connectionId: Math.random().toString(36).substring(2, 9),
moduleLoadCount: 0, moduleLoadCount: 0,
createdAt: Date.now(), createdAt: Date.now(),
hasEverConnected: false, hasEverConnected: false,
@@ -102,7 +102,7 @@ const initGlobalStorage = (): GlobalWSStorage => {
lastConnectAttempt: 0, lastConnectAttempt: 0,
// 连接权限控制 // 连接权限控制
allowNewConnection: true, // 初始化时允许创建连接 allowNewConnection: true, // 初始化时允许创建连接
connectionReason: '系统初始化' connectionReason: '系统初始化',
} }
} }
@@ -112,8 +112,7 @@ const getGlobalStorage = (): GlobalWSStorage => {
;(window as any)[WS_STORAGE_KEY] = initGlobalStorage() ;(window as any)[WS_STORAGE_KEY] = initGlobalStorage()
} }
const storage = (window as any)[WS_STORAGE_KEY] as GlobalWSStorage return (window as any)[WS_STORAGE_KEY] as GlobalWSStorage
return storage
} }
// 设置全局状态 // 设置全局状态
@@ -190,11 +189,11 @@ const handleBackendFailure = async () => {
okText: '重启应用', okText: '重启应用',
onOk: () => { onOk: () => {
if ((window.electronAPI as any)?.windowClose) { if ((window.electronAPI as any)?.windowClose) {
(window.electronAPI as any).windowClose() ;(window.electronAPI as any).windowClose()
} else { } else {
window.location.reload() window.location.reload()
} }
} },
}) })
return return
} }
@@ -247,7 +246,7 @@ const startBackendMonitoring = () => {
} }
// 仅在必要时检查心跳超时 // 仅在必要时检查心跳超时
if (global.lastPingTime > 0 && (now - global.lastPingTime) > HEARTBEAT_TIMEOUT * 2) { if (global.lastPingTime > 0 && now - global.lastPingTime > HEARTBEAT_TIMEOUT * 2) {
if (global.wsRef && global.wsRef.readyState === WebSocket.OPEN) { if (global.wsRef && global.wsRef.readyState === WebSocket.OPEN) {
setBackendStatus('error') setBackendStatus('error')
} }
@@ -274,9 +273,18 @@ const startGlobalHeartbeat = (ws: WebSocket) => {
try { try {
const pingTime = Date.now() const pingTime = Date.now()
global.lastPingTime = pingTime global.lastPingTime = pingTime
ws.send(JSON.stringify({ type: 'Signal', data: { Ping: pingTime, connectionId: global.connectionId } })) ws.send(
setTimeout(() => { /* 心跳超时不主动断开 */ }, HEARTBEAT_TIMEOUT) JSON.stringify({
} catch { /* ignore */ } type: 'Signal',
data: { Ping: pingTime, connectionId: global.connectionId },
})
)
setTimeout(() => {
/* 心跳超时不主动断开 */
}, HEARTBEAT_TIMEOUT)
} catch {
/* ignore */
}
} }
}, HEARTBEAT_INTERVAL) }, HEARTBEAT_INTERVAL)
} }
@@ -299,7 +307,12 @@ const handleMessage = (raw: WebSocketBaseMessage) => {
const ws = global.wsRef const ws = global.wsRef
if (ws && ws.readyState === WebSocket.OPEN) { if (ws && ws.readyState === WebSocket.OPEN) {
try { try {
ws.send(JSON.stringify({ type: 'Signal', data: { Pong: raw.data.Ping, connectionId: global.connectionId } })) ws.send(
JSON.stringify({
type: 'Signal',
data: { Pong: raw.data.Ping, connectionId: global.connectionId },
})
)
} catch (e) { } catch (e) {
// Pong发送失败静默处理 // Pong发送失败静默处理
} }
@@ -325,7 +338,7 @@ const handleMessage = (raw: WebSocketBaseMessage) => {
if (raw.data && (raw.data as NotifyMessage).title) { if (raw.data && (raw.data as NotifyMessage).title) {
notification.info({ notification.info({
message: (raw.data as NotifyMessage).title, message: (raw.data as NotifyMessage).title,
description: (raw.data as NotifyMessage).content description: (raw.data as NotifyMessage).content,
}) })
} }
return return
@@ -393,12 +406,24 @@ const createGlobalWebSocket = (): WebSocket => {
// 发送连接确认和初始pong // 发送连接确认和初始pong
try { try {
ws.send(JSON.stringify({ type: 'Signal', data: { Connect: true, connectionId: global.connectionId } })) ws.send(
ws.send(JSON.stringify({ type: 'Signal', data: { Pong: Date.now(), connectionId: global.connectionId } })) JSON.stringify({
} catch { /* ignore */ } type: 'Signal',
data: { Connect: true, connectionId: global.connectionId },
})
)
ws.send(
JSON.stringify({
type: 'Signal',
data: { Pong: Date.now(), connectionId: global.connectionId },
})
)
} catch {
/* ignore */
}
} }
ws.onmessage = (ev) => { ws.onmessage = ev => {
try { try {
const raw = JSON.parse(ev.data) as WebSocketBaseMessage const raw = JSON.parse(ev.data) as WebSocketBaseMessage
handleMessage(raw) handleMessage(raw)
@@ -411,14 +436,17 @@ const createGlobalWebSocket = (): WebSocket => {
setGlobalStatus('连接错误') setGlobalStatus('连接错误')
} }
ws.onclose = (event) => { ws.onclose = event => {
setGlobalStatus('已断开') setGlobalStatus('已断开')
stopGlobalHeartbeat() stopGlobalHeartbeat()
global.isConnecting = false global.isConnecting = false
// 检查是否是后端自杀导致的关闭 // 检查是否是后端自杀导致的关闭
if (event.code === 1000 && event.reason === 'Ping超时') { if (event.code === 1000 && event.reason === 'Ping超时') {
handleBackendFailure() handleBackendFailure().catch(error => {
// 忽略错误,或者可以添加适当的错误处理
console.warn('handleBackendFailure error:', error)
})
} else { } else {
// 连接断开,不自动重连,等待后端重启 // 连接断开,不自动重连,等待后端重启
setGlobalStatus('已断开') setGlobalStatus('已断开')
@@ -478,7 +506,7 @@ const connectGlobalWebSocket = async (reason: string = '未指定原因'): Promi
// 额外保护:检查最近连接尝试时间,避免过于频繁的连接 // 额外保护:检查最近连接尝试时间,避免过于频繁的连接
const now = Date.now() const now = Date.now()
const MIN_CONNECT_INTERVAL = 2000 // 最小连接间隔2秒 const MIN_CONNECT_INTERVAL = 2000 // 最小连接间隔2秒
if (global.lastConnectAttempt && (now - global.lastConnectAttempt) < MIN_CONNECT_INTERVAL) { if (global.lastConnectAttempt && now - global.lastConnectAttempt < MIN_CONNECT_INTERVAL) {
return false return false
} }
@@ -512,16 +540,14 @@ const setConnectionPermission = (allow: boolean, reason: string) => {
const checkConnectionPermission = (): boolean => { const checkConnectionPermission = (): boolean => {
const global = getGlobalStorage() const global = getGlobalStorage()
return !!global.allowNewConnection return global.allowNewConnection
} }
// 只在后端启动/重启时允许创建连接 // 只在后端启动/重启时允许创建连接
const allowedConnectionReasons = [ const allowedConnectionReasons = ['后端启动后连接', '后端重启后重连']
'后端启动后连接',
'后端重启后重连'
]
const isValidConnectionReason = (reason: string): boolean => allowedConnectionReasons.includes(reason) const isValidConnectionReason = (reason: string): boolean =>
allowedConnectionReasons.includes(reason)
// 全局连接锁 - 防止多个模块实例同时连接 // 全局连接锁 - 防止多个模块实例同时连接
let isGlobalConnectingLock = false let isGlobalConnectingLock = false
@@ -587,7 +613,7 @@ export function useWebSocket() {
hasHeartbeat: !!global.heartbeatTimer, hasHeartbeat: !!global.heartbeatTimer,
hasEverConnected: global.hasEverConnected, hasEverConnected: global.hasEverConnected,
reconnectAttempts: global.reconnectAttempts, reconnectAttempts: global.reconnectAttempts,
isPersistentMode: true // 标识为永久连接模式 isPersistentMode: true, // 标识为永久连接模式
}) })
const restartBackendManually = async () => { const restartBackendManually = async () => {
@@ -598,7 +624,12 @@ export function useWebSocket() {
const getBackendStatus = () => { const getBackendStatus = () => {
const global = getGlobalStorage() const global = getGlobalStorage()
return { status: global.backendStatus.value, restartAttempts: global.backendRestartAttempts, isRestarting: global.isRestartingBackend, lastCheck: global.lastBackendCheck } return {
status: global.backendStatus.value,
restartAttempts: global.backendRestartAttempts,
isRestarting: global.isRestartingBackend,
lastCheck: global.lastBackendCheck,
}
} }
return { return {
@@ -610,6 +641,6 @@ export function useWebSocket() {
subscribers: global.subscribers, subscribers: global.subscribers,
backendStatus: global.backendStatus, backendStatus: global.backendStatus,
restartBackend: restartBackendManually, restartBackend: restartBackendManually,
getBackendStatus getBackendStatus,
} }
} }