flashlang/src/background/gtranslate_commands.ts

77 lines
2.0 KiB
TypeScript

import { browser, Runtime } from "webextension-polyfill-ts";
import { Communicator, commandList, commandFunction } from "../communicator";
import { newPromise } from "../utils";
interface BackgroundCommands extends commandList {
translationFinished: TranslationMessage;
languageList: LanguageListMessage;
}
interface ContentScriptCommands extends commandList {
translationRequest: TranslationRequest;
}
interface TranslationMessage extends commandFunction {
args: Translation;
}
interface LanguageListMessage extends commandFunction {
args: Array<Language>;
}
interface TranslationRequest extends commandFunction {
args: string;
}
export class BackgroundMessenger extends Communicator<
BackgroundCommands,
ContentScriptCommands
> {
conn: Promise<Runtime.Port>;
private resolvConn: (p: Runtime.Port) => void;
constructor() {
super();
[this.conn, this.resolvConn] = newPromise<Runtime.Port>();
browser.runtime.onConnect.addListener((p) => {
if (p.name != "gtranslate_scraper_conn") return;
this.resolvConn(p);
p.onDisconnect.addListener(
() => ([this.conn, this.resolvConn] = newPromise<Runtime.Port>())
);
p.onMessage.addListener((m) => this.onMessage(m, p.sender!));
});
}
async runCommand<K extends keyof ContentScriptCommands>(
command: K,
args: ContentScriptCommands[K]["args"]
) {
const msg = this.getCommandMessage(command, args);
(await this.conn).postMessage(msg);
}
}
export class ContentScriptMessenger extends Communicator<
ContentScriptCommands,
BackgroundCommands
> {
conn: Runtime.Port;
constructor() {
super();
this.conn = browser.runtime.connect({
name: "gtranslate_scraper_conn",
// eslint-disable-next-line @typescript-eslint/no-explicit-any
} as any); //The declaration file is wrong
this.conn.onMessage.addListener((m) => this.onMessage(m));
}
async runCommand<K extends keyof BackgroundCommands>(
command: K,
args: BackgroundCommands[K]["args"]
) {
const msg = this.getCommandMessage(command, args);
return this.conn.postMessage(msg);
}
}