diff --git a/apps/browser/src/platform/ipc/ipc-background.service.ts b/apps/browser/src/platform/ipc/ipc-background.service.ts index 155966898f99..35a2ecdc9eab 100644 --- a/apps/browser/src/platform/ipc/ipc-background.service.ts +++ b/apps/browser/src/platform/ipc/ipc-background.service.ts @@ -23,14 +23,14 @@ export class IpcBackgroundService extends IpcService { await SdkLoadService.Ready; this.communicationBackend = new IpcCommunicationBackend({ async send(message: OutgoingMessage): Promise { - if (typeof message.destination === "object") { + if (typeof message.destination === "object" && message.destination.Web != undefined) { await BrowserApi.tabSendMessage( { id: message.destination.Web.id } as chrome.tabs.Tab, { type: "bitwarden-ipc-message", message: { destination: message.destination, - payload: message.payload, + payload: [...message.payload], topic: message.topic, }, } satisfies IpcMessage, @@ -44,7 +44,7 @@ export class IpcBackgroundService extends IpcService { }); BrowserApi.messageListener("platform.ipc", (message, sender) => { - if (!isIpcMessage(message)) { + if (!isIpcMessage(message) || message.message.destination !== "BrowserBackground") { return; } @@ -54,9 +54,13 @@ export class IpcBackgroundService extends IpcService { } this.communicationBackend?.deliver_message( - new IncomingMessage(message.message.payload, message.message.destination, { - Web: { id: sender.tab.id }, - }), + new IncomingMessage( + new Uint8Array(message.message.payload), + message.message.destination, + { + Web: { id: sender.tab.id }, + }, + ), ); }); diff --git a/apps/web/src/app/platform/ipc/web-ipc.service.ts b/apps/web/src/app/platform/ipc/web-ipc.service.ts index e088de2473b0..7b3781353233 100644 --- a/apps/web/src/app/platform/ipc/web-ipc.service.ts +++ b/apps/web/src/app/platform/ipc/web-ipc.service.ts @@ -27,7 +27,7 @@ export class WebIpcService extends IpcService { type: "bitwarden-ipc-message", message: { destination: message.destination, - payload: message.payload, + payload: [...message.payload], topic: message.topic, }, } satisfies IpcMessage, @@ -50,9 +50,16 @@ export class WebIpcService extends IpcService { return; } + if ( + typeof message.message.destination !== "object" || + message.message.destination.Web == undefined + ) { + return; + } + this.communicationBackend?.deliver_message( new IncomingMessage( - message.message.payload, + new Uint8Array(message.message.payload), message.message.destination, "BrowserBackground", message.message.topic, diff --git a/libs/common/src/platform/ipc/ipc-message.ts b/libs/common/src/platform/ipc/ipc-message.ts index c0702f075679..abd352da1c04 100644 --- a/libs/common/src/platform/ipc/ipc-message.ts +++ b/libs/common/src/platform/ipc/ipc-message.ts @@ -2,7 +2,11 @@ import type { OutgoingMessage } from "@bitwarden/sdk-internal"; export interface IpcMessage { type: "bitwarden-ipc-message"; - message: Omit; + message: SerializedOutgoingMessage; +} + +export interface SerializedOutgoingMessage extends Omit { + payload: number[]; } export function isIpcMessage(message: any): message is IpcMessage { diff --git a/libs/common/src/platform/ipc/ipc.service.ts b/libs/common/src/platform/ipc/ipc.service.ts index c3cd77d9850b..134e615fc8b6 100644 --- a/libs/common/src/platform/ipc/ipc.service.ts +++ b/libs/common/src/platform/ipc/ipc.service.ts @@ -23,6 +23,8 @@ export abstract class IpcService { protected async initWithClient(client: IpcClient): Promise { this._client = client; + await this._client.start(); + this._messages$ = new Observable((subscriber) => { let isSubscribed = true; const receiveLoop = async () => {