228 lines
5.3 KiB
JavaScript
228 lines
5.3 KiB
JavaScript
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
|