scriptcat-mv3/packages/message/extension_message.ts
王一之 36cf8ef5a7
Some checks failed
test / Run tests (push) Failing after 13s
build / Build (push) Failing after 22s
0210
2025-02-10 18:10:50 +08:00

78 lines
2.1 KiB
TypeScript

import { Message, MessageConnect, MessageSend } from "./server";
export class ExtensionMessageSend implements MessageSend {
constructor(protected serverEnv: string) {}
connect(data: any): Promise<MessageConnect> {
return new Promise((resolve) => {
const con = chrome.runtime.connect();
con.postMessage(
Object.assign(data, {
serverEnv: this.serverEnv,
})
);
resolve(new ExtensionMessageConnect(con));
});
}
// 发送消息 注意不进行回调的内存泄漏
sendMessage(data: any): Promise<any> {
return new Promise((resolve) => {
chrome.runtime.sendMessage(
Object.assign(data, {
serverEnv: this.serverEnv,
}),
(resp) => {
resolve(resp);
}
);
});
}
}
export class ExtensionMessage extends ExtensionMessageSend implements Message {
onConnect(callback: (data: any, con: MessageConnect) => void) {
chrome.runtime.onConnect.addListener((port) => {
const handler = (msg: any) => {
port.onMessage.removeListener(handler);
if (msg.serverEnv !== this.serverEnv) {
port.disconnect();
return false;
}
callback(msg, new ExtensionMessageConnect(port));
};
port.onMessage.addListener(handler);
});
}
// 注意chrome.runtime.onMessage.addListener的回调函数需要返回true才能处理异步请求
onMessage(callback: (data: any, sendResponse: (data: any) => void) => void) {
chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
if (msg.serverEnv !== this.serverEnv) {
return false;
}
return callback(msg, sendResponse);
});
}
}
export class ExtensionMessageConnect implements MessageConnect {
constructor(private con: chrome.runtime.Port) {}
sendMessage(data: any) {
this.con.postMessage(data);
}
onMessage(callback: (data: any) => void) {
this.con.onMessage.addListener(callback);
}
disconnect() {
this.con.disconnect();
}
onDisconnect(callback: () => void) {
this.con.onDisconnect.addListener(callback);
}
}