@ng1005/chrome-extension-common
Version:
chrome扩展通用库--消息与storage
132 lines (131 loc) • 4.13 kB
text/typescript
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