ykt-team-wxapp/utils/im-status-manager.js

228 lines
5.3 KiB
JavaScript
Raw Normal View History

2026-01-28 13:38:05 +08:00
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