import { guid } from '@/uilts/help' // iframe 通信中心 class ChromeMessageCenter { constructor() { // 缓存事件队列 this.messageCallbackMap = new Map(); this.messageFailbackMap = new Map(); this.timer = null } sendToContent(sender, { info = {}, data = {}, callback, overTime, failback }) { if (!info.messageId) { info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数 } try { chrome.tabs.sendMessage(sender.tab.id, { info, data }) if (info.messageId && callback) { // 带回调callback 的message, 要求携带messageId,callback,failback等 this.listen(info.messageId, callback) } if (failback) { this.addFailback(info.messageId, overTime, failback) } } catch (error) { failback({ error: 2, msg: String(error) }) } } sendToSW({ info = {}, data = {}, callback, overTime, failback }) { if (!info.messageId) { info.messageId = `${info.actionType}-${guid()}` // 唯一的ID,用于标记回调函数 } try { chrome.runtime.sendMessage({ info, data }) if (info.messageId && callback) { // 带回调callback 的message, 要求携带messageId,callback,failback等 this.listen(info.messageId, callback) } if (failback) { this.addFailback(info.messageId, overTime, failback) } } catch (error) { failback({ error: 2, msg: String(error) }) } } listen(messageId, callback) { // 序列添加失败回调 this.messageCallbackMap.set(messageId, { callback }) } addFailback(messageId, overTime = 2000, failback) { // 序列添加失败回调 this.messageFailbackMap.set(messageId, { time: new Date().getTime(), overTime, failback }) this.checkTimer() } init(req = {}) { const { info, data } = req; if (!info || !data) { return } // 序列删除 失败回调 this.messageFailbackMap.delete(info.messageId); // 执行成功回调 const _item = this.messageCallbackMap.get(info.messageId); if (_item) { const callback = _item.callback callback(data) // 序列删除 成功回调 this.messageCallbackMap.delete(info.messageId) } this.checkTimer() } checkTimer() { if (this.timer) { return } let key, value, now_time this.timer = setInterval(() => { if (this.messageFailbackMap.size == 0) { clearInterval(this.timer) this.timer = null } // 轮询查看有无超期的message信息 now_time = new Date().getTime(); for (let item of this.messageFailbackMap.entries()) { key = item[0] || '' value = item[1] || {} if (now_time - value.time > value.overTime) { const callback = value.failback callback && callback({ error: 1, msg: "message 超时错误" }) this.messageFailbackMap.delete(key) } } }, 1000) } } // messageCenter在页面内实例化一次 const chromeMessageCenter = new ChromeMessageCenter(); export default chromeMessageCenter;