1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-15 07:43:35 +00:00
Files
browser/apps/web/src/app/platform/ipc/web-ipc.service.ts
Andreas Coroiu e0cabd1df0 [PM-18044] Ensure all calls to receive should get all messages broadcast (#13869)
* feat: make compatible with SDK changes

* feat: use subscription

* feat: update SDK

* fix: lint

* fix: ts strict issues
2025-05-05 12:19:41 -04:00

69 lines
2.1 KiB
TypeScript

import { inject } from "@angular/core";
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
import { SdkLoadService } from "@bitwarden/common/platform/abstractions/sdk/sdk-load.service";
import { IpcMessage, IpcService, isIpcMessage } from "@bitwarden/common/platform/ipc";
import {
IncomingMessage,
IpcClient,
IpcCommunicationBackend,
OutgoingMessage,
} from "@bitwarden/sdk-internal";
export class WebIpcService extends IpcService {
private logService = inject(LogService);
private communicationBackend?: IpcCommunicationBackend;
override async init() {
try {
// This function uses classes and functions defined in the SDK, so we need to wait for the SDK to load.
await SdkLoadService.Ready;
this.communicationBackend = new IpcCommunicationBackend({
async send(message: OutgoingMessage): Promise<void> {
if (message.destination === "BrowserBackground") {
window.postMessage(
{
type: "bitwarden-ipc-message",
message: {
destination: message.destination,
payload: message.payload,
topic: message.topic,
},
} satisfies IpcMessage,
window.location.origin,
);
return;
}
throw new Error(`Destination not supported: ${message.destination}`);
},
});
window.addEventListener("message", async (event: MessageEvent) => {
if (event.origin !== window.origin) {
return;
}
const message = event.data;
if (!isIpcMessage(message)) {
return;
}
this.communicationBackend?.deliver_message(
new IncomingMessage(
message.message.payload,
message.message.destination,
"BrowserBackground",
message.message.topic,
),
);
});
await super.initWithClient(new IpcClient(this.communicationBackend));
} catch (e) {
this.logService.error("[IPC] Initialization failed", e);
}
}
}