UNPKG

@ng1005/chrome-extension-common

Version:

chrome扩展通用库--消息与storage

132 lines (131 loc) 4.13 kB
import MessageEventBus from "./MessageEventBus"; import ResponseUtils, { SendMessage,ResponseMessage } from "../utils/ResponseUtils"; import IMessageInterface from "../interface/IMessageInterface"; import { isBackgroundScript, isPopupScript } from "../utils/Utils"; export class WindowEventBus extends MessageEventBus implements IMessageInterface{ script='window'; constructor(script?:string){ super() let defaultScript='window' if(isBackgroundScript()){ defaultScript='background' }else if(isPopupScript()){ defaultScript='popup' } this.script=script||defaultScript;//当前脚本 if(this.script==='window'){ this.listener() } } listener(): void { let _this=this; window.addEventListener('message', function (e) { // 监听 message 事件 // console.log('window message--',e.origin,e.data) _this.handler(e.data) }); } /** * 消息处理 * @param {*} request */ async handler(request:any){ let type=request.type||''//$emit提交时的事件 let args=request.message let _this=this; let handler = _this._events.get(type)//所有该类型的函数集合 if(!handler)return;//无任何监听则退出 if (Array.isArray(handler)) { // 是数组,说明有多个监听者,需要依次触发里边的函数 for (let i = 0; i < handler.length; ++i) { let res=await handler[i].call(_this, ...args) } } else { // 单个函数的情况直接触发即可 let res=await handler.call(_this, ...args) } return this } $emitContent(type: string, ...args: any): Promise<any> { let _this=this; return new Promise((resolve,reject)=>{//调整成Promise _this.getCurrentTabs((tabs:any)=>{ const tabId=tabs.length ? tabs[0].id: null if(!tabId){ reject('找到激活的tab') } // console.log('ssss') const message:SendMessage={ script:'content', type: type,//事件名 message: args } chrome.tabs.sendMessage(tabId, message, function(response){ // console.log('response=====',response); resolve(response) }); }) }) } $emitBackground(type: string, ...args: any): Promise<any> { return new Promise((resolve,reject)=>{ const message:SendMessage={ script:'background', type: type,//事件名 message: args } chrome.runtime.sendMessage(message,(response:ResponseMessage)=>{ if(ResponseUtils.isSuccess(response)){ resolve(response.data) }else{ reject(response.message) } }); }) } $emitPopup(type: string, ...args: any): Promise<any> { return new Promise((resolve,reject)=>{ const message:SendMessage={ script:'popup', type: type,//事件名 message: args } chrome.runtime.sendMessage(message,(response:ResponseMessage)=>{ if(ResponseUtils.isSuccess(response)){ resolve(response.data) }else{ reject(response.message) } }); }) } $emitWindow(type: string, ...args: any): Promise<any> { return this.$emit(type,...args); } $emitAllTabs(type: string, ...args: any): Promise<any> { let _this=this return new Promise((resolve,reject)=>{//调整成Promise _this.getTabs((tabs:any)=>{ if(tabs&&Array.isArray(tabs)&&tabs.length>0){ for(let i=0;i<tabs.length;i++){ const tabId=tabs[i].id|| null const message:SendMessage={ script:'content', type: type,//事件名 message: args } chrome.tabs.sendMessage(tabId, message, function(response){ // console.log('response=====',response); if(i===tabs.length){//最后一个发送完成 resolve(response) } }); } }else{ reject('找到激活的tab') } },{windowType:'normal'}) }) } } const $bus=new WindowEventBus() export default $bus