2026-01-22 15:13:26 +08:00
|
|
|
|
import {
|
|
|
|
|
|
checkGlobalIMStatus,
|
2026-01-20 13:21:50 +08:00
|
|
|
|
ensureGlobalIMConnection,
|
2026-01-22 15:13:26 +08:00
|
|
|
|
getGlobalIMLoginStatus
|
2026-01-20 13:21:50 +08:00
|
|
|
|
} from './tim-chat.js'
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 全局IM状态管理器
|
|
|
|
|
|
* 提供统一的IM状态检测和管理接口
|
|
|
|
|
|
*/
|
|
|
|
|
|
class IMStatusManager {
|
|
|
|
|
|
constructor() {
|
|
|
|
|
|
this.statusCheckInterval = null
|
|
|
|
|
|
this.isMonitoring = false
|
|
|
|
|
|
this.checkIntervalTime = 60000 // 默认1分钟检查一次
|
|
|
|
|
|
this.lastCheckTime = 0
|
|
|
|
|
|
this.callbacks = {
|
|
|
|
|
|
onStatusChange: [],
|
|
|
|
|
|
onReconnectSuccess: [],
|
|
|
|
|
|
onReconnectFailed: []
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 启动IM状态监控
|
|
|
|
|
|
* @param {number} intervalTime 检查间隔时间(毫秒)
|
|
|
|
|
|
*/
|
|
|
|
|
|
startMonitoring(intervalTime = 60000) {
|
|
|
|
|
|
if (this.isMonitoring) {
|
|
|
|
|
|
console.log('IM状态监控已在运行')
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.checkIntervalTime = intervalTime
|
|
|
|
|
|
this.isMonitoring = true
|
|
|
|
|
|
|
|
|
|
|
|
// 立即检查一次
|
|
|
|
|
|
this.checkIMStatus()
|
|
|
|
|
|
|
|
|
|
|
|
// 启动定时检查
|
|
|
|
|
|
this.statusCheckInterval = setInterval(() => {
|
|
|
|
|
|
this.checkIMStatus()
|
|
|
|
|
|
}, this.checkIntervalTime)
|
|
|
|
|
|
|
|
|
|
|
|
console.log(`IM状态监控已启动,检查间隔:${intervalTime / 1000}秒`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 停止IM状态监控
|
|
|
|
|
|
*/
|
|
|
|
|
|
stopMonitoring() {
|
|
|
|
|
|
if (this.statusCheckInterval) {
|
|
|
|
|
|
clearInterval(this.statusCheckInterval)
|
|
|
|
|
|
this.statusCheckInterval = null
|
|
|
|
|
|
}
|
|
|
|
|
|
this.isMonitoring = false
|
|
|
|
|
|
console.log('IM状态监控已停止')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 检查IM状态
|
|
|
|
|
|
*/
|
|
|
|
|
|
async checkIMStatus() {
|
|
|
|
|
|
const now = Date.now()
|
|
|
|
|
|
this.lastCheckTime = now
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
console.log('执行IM状态检查...')
|
|
|
|
|
|
const isLoggedIn = checkGlobalIMStatus()
|
2026-01-22 15:13:26 +08:00
|
|
|
|
|
2026-01-20 13:21:50 +08:00
|
|
|
|
// 触发状态变化回调
|
2026-01-22 15:13:26 +08:00
|
|
|
|
this.triggerCallbacks('onStatusChange', {
|
|
|
|
|
|
isLoggedIn,
|
2026-01-20 13:21:50 +08:00
|
|
|
|
checkTime: now,
|
|
|
|
|
|
timestamp: new Date().toLocaleString()
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if (!isLoggedIn) {
|
|
|
|
|
|
console.log('检测到IM未登录,尝试重连...')
|
|
|
|
|
|
await this.attemptReconnect()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
console.log('IM状态正常')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return isLoggedIn
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('IM状态检查异常:', error)
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 尝试重连IM
|
|
|
|
|
|
*/
|
|
|
|
|
|
async attemptReconnect() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
console.log('开始尝试IM重连...')
|
|
|
|
|
|
const success = await ensureGlobalIMConnection()
|
2026-01-22 15:13:26 +08:00
|
|
|
|
|
2026-01-20 13:21:50 +08:00
|
|
|
|
if (success) {
|
|
|
|
|
|
console.log('IM重连成功')
|
2026-01-22 15:13:26 +08:00
|
|
|
|
this.triggerCallbacks('onReconnectSuccess', {
|
|
|
|
|
|
timestamp: new Date().toLocaleString()
|
2026-01-20 13:21:50 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
console.log('IM重连失败')
|
2026-01-22 15:13:26 +08:00
|
|
|
|
this.triggerCallbacks('onReconnectFailed', {
|
|
|
|
|
|
timestamp: new Date().toLocaleString()
|
2026-01-20 13:21:50 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return success
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error('IM重连异常:', error)
|
2026-01-22 15:13:26 +08:00
|
|
|
|
this.triggerCallbacks('onReconnectFailed', {
|
2026-01-20 13:21:50 +08:00
|
|
|
|
error,
|
2026-01-22 15:13:26 +08:00
|
|
|
|
timestamp: new Date().toLocaleString()
|
2026-01-20 13:21:50 +08:00
|
|
|
|
})
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 手动触发IM连接检查
|
|
|
|
|
|
*/
|
|
|
|
|
|
async forceCheck() {
|
|
|
|
|
|
console.log('手动触发IM连接检查')
|
|
|
|
|
|
return await this.checkIMStatus()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取当前IM登录状态
|
|
|
|
|
|
*/
|
|
|
|
|
|
getCurrentStatus() {
|
|
|
|
|
|
return {
|
|
|
|
|
|
isLoggedIn: getGlobalIMLoginStatus(),
|
|
|
|
|
|
isMonitoring: this.isMonitoring,
|
|
|
|
|
|
lastCheckTime: this.lastCheckTime,
|
|
|
|
|
|
checkInterval: this.checkIntervalTime
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 添加状态变化回调
|
|
|
|
|
|
*/
|
|
|
|
|
|
onStatusChange(callback) {
|
|
|
|
|
|
if (typeof callback === 'function') {
|
|
|
|
|
|
this.callbacks.onStatusChange.push(callback)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 添加重连成功回调
|
|
|
|
|
|
*/
|
|
|
|
|
|
onReconnectSuccess(callback) {
|
|
|
|
|
|
if (typeof callback === 'function') {
|
|
|
|
|
|
this.callbacks.onReconnectSuccess.push(callback)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 添加重连失败回调
|
|
|
|
|
|
*/
|
|
|
|
|
|
onReconnectFailed(callback) {
|
|
|
|
|
|
if (typeof callback === 'function') {
|
|
|
|
|
|
this.callbacks.onReconnectFailed.push(callback)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 移除回调
|
|
|
|
|
|
*/
|
|
|
|
|
|
removeCallback(type, callback) {
|
|
|
|
|
|
if (this.callbacks[type]) {
|
|
|
|
|
|
const index = this.callbacks[type].indexOf(callback)
|
|
|
|
|
|
if (index > -1) {
|
|
|
|
|
|
this.callbacks[type].splice(index, 1)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 触发回调
|
|
|
|
|
|
*/
|
|
|
|
|
|
triggerCallbacks(type, data) {
|
|
|
|
|
|
if (this.callbacks[type]) {
|
|
|
|
|
|
this.callbacks[type].forEach(callback => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
callback(data)
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
console.error(`执行${type}回调失败:`, error)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 获取状态报告
|
|
|
|
|
|
*/
|
|
|
|
|
|
getStatusReport() {
|
|
|
|
|
|
const status = this.getCurrentStatus()
|
|
|
|
|
|
return {
|
|
|
|
|
|
...status,
|
|
|
|
|
|
report: {
|
|
|
|
|
|
isLoggedIn: status.isLoggedIn ? '已登录' : '未登录',
|
|
|
|
|
|
monitoring: status.isMonitoring ? '监控中' : '未监控',
|
2026-01-22 15:13:26 +08:00
|
|
|
|
lastCheck: status.lastCheckTime ?
|
2026-01-20 13:21:50 +08:00
|
|
|
|
new Date(status.lastCheckTime).toLocaleString() : '从未检查',
|
|
|
|
|
|
interval: `${status.checkInterval / 1000}秒`
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建全局实例
|
|
|
|
|
|
const globalIMStatusManager = new IMStatusManager()
|
|
|
|
|
|
|
|
|
|
|
|
// 便捷函数
|
|
|
|
|
|
export const startIMMonitoring = (interval) => globalIMStatusManager.startMonitoring(interval)
|
|
|
|
|
|
export const stopIMMonitoring = () => globalIMStatusManager.stopMonitoring()
|
|
|
|
|
|
export const checkIMStatusNow = () => globalIMStatusManager.forceCheck()
|
|
|
|
|
|
export const getIMStatus = () => globalIMStatusManager.getCurrentStatus()
|
|
|
|
|
|
export const getIMStatusReport = () => globalIMStatusManager.getStatusReport()
|
|
|
|
|
|
|
|
|
|
|
|
// 导出管理器实例和类
|
|
|
|
|
|
export { globalIMStatusManager, IMStatusManager }
|
|
|
|
|
|
export default globalIMStatusManager
|