bitwarden-estensione-browser/apps/browser/src/platform/messaging/chrome-message.sender.ts

38 lines
1.4 KiB
TypeScript

import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { CommandDefinition, MessageSender } from "@bitwarden/common/platform/messaging";
import { getCommand } from "@bitwarden/common/platform/messaging/internal";
type ErrorHandler = (logger: LogService, command: string) => void;
const HANDLED_ERRORS: Record<string, ErrorHandler> = {
"Could not establish connection. Receiving end does not exist.": (logger, command) =>
logger.debug(`Receiving end didn't exist for command '${command}'`),
"The message port closed before a response was received.": (logger, command) =>
logger.debug(`Port was closed for command '${command}'`),
};
export class ChromeMessageSender implements MessageSender {
constructor(private readonly logService: LogService) {}
send<T extends object>(
commandDefinition: string | CommandDefinition<T>,
payload: object | T = {},
): void {
const command = getCommand(commandDefinition);
chrome.runtime.sendMessage(Object.assign(payload, { command: command }), () => {
if (chrome.runtime.lastError) {
const errorHandler = HANDLED_ERRORS[chrome.runtime.lastError.message];
if (errorHandler != null) {
errorHandler(this.logService, command);
return;
}
this.logService.warning(
`Unhandled error while sending message with command '${command}': ${chrome.runtime.lastError.message}`,
);
}
});
}
}