ykt-wxapp/utils/im-status-manager.js
2026-01-22 15:13:26 +08:00

228 lines
5.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
checkGlobalIMStatus,
ensureGlobalIMConnection,
getGlobalIMLoginStatus
} 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()
// 触发状态变化回调
this.triggerCallbacks('onStatusChange', {
isLoggedIn,
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()
if (success) {
console.log('IM重连成功')
this.triggerCallbacks('onReconnectSuccess', {
timestamp: new Date().toLocaleString()
})
} else {
console.log('IM重连失败')
this.triggerCallbacks('onReconnectFailed', {
timestamp: new Date().toLocaleString()
})
}
return success
} catch (error) {
console.error('IM重连异常:', error)
this.triggerCallbacks('onReconnectFailed', {
error,
timestamp: new Date().toLocaleString()
})
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 ? '监控中' : '未监控',
lastCheck: status.lastCheckTime ?
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