mirror of
https://github.com/bitwarden/browser
synced 2026-02-17 09:59:41 +00:00
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { Injectable } from "@angular/core";
|
|
|
|
import { IpcMessage, isIpcMessage } from "@bitwarden/common/platform/ipc";
|
|
import { MessageQueue } from "@bitwarden/common/platform/ipc/message-queue";
|
|
import { CommunicationBackend, IncomingMessage, OutgoingMessage } from "@bitwarden/sdk-internal";
|
|
|
|
@Injectable({ providedIn: "root" })
|
|
export class WebCommunicationProvider implements CommunicationBackend {
|
|
private queue = new MessageQueue<IncomingMessage>();
|
|
|
|
constructor() {
|
|
window.addEventListener("message", async (event: MessageEvent) => {
|
|
if (event.origin !== window.origin) {
|
|
return;
|
|
}
|
|
|
|
const message = event.data;
|
|
if (!isIpcMessage(message)) {
|
|
return;
|
|
}
|
|
|
|
void this.queue.enqueue(
|
|
new IncomingMessage(
|
|
message.message.payload,
|
|
message.message.destination,
|
|
"BrowserBackground",
|
|
),
|
|
);
|
|
});
|
|
}
|
|
|
|
async send(message: OutgoingMessage): Promise<void> {
|
|
if (message.destination === "BrowserBackground") {
|
|
window.postMessage(
|
|
{ type: "bitwarden-ipc-message", message } satisfies IpcMessage,
|
|
window.location.origin,
|
|
);
|
|
return;
|
|
}
|
|
|
|
throw new Error(`Destination not supported: ${message.destination}`);
|
|
}
|
|
|
|
receive(): Promise<IncomingMessage> {
|
|
return this.queue.dequeue();
|
|
}
|
|
}
|