123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- 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;
|