[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 issuespull/14633/head^2
parent
60bafc1311
commit
e0cabd1df0
@ -1,45 +0,0 @@
|
||||
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";
|
||||
|
||||
import { BrowserApi } from "../browser/browser-api";
|
||||
|
||||
export class BackgroundCommunicationBackend implements CommunicationBackend {
|
||||
private queue = new MessageQueue<IncomingMessage>();
|
||||
|
||||
constructor() {
|
||||
BrowserApi.messageListener("platform.ipc", (message, sender) => {
|
||||
if (!isIpcMessage(message)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (sender.tab?.id === undefined || sender.tab.id === chrome.tabs.TAB_ID_NONE) {
|
||||
// Ignore messages from non-tab sources
|
||||
return;
|
||||
}
|
||||
|
||||
void this.queue.enqueue(
|
||||
new IncomingMessage(message.message.payload, message.message.destination, {
|
||||
Web: { id: sender.tab.id },
|
||||
}),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
async send(message: OutgoingMessage): Promise<void> {
|
||||
if (typeof message.destination === "object" && "Web" in message.destination) {
|
||||
await BrowserApi.tabSendMessage(
|
||||
{ id: message.destination.Web.id } as chrome.tabs.Tab,
|
||||
{ type: "bitwarden-ipc-message", message } satisfies IpcMessage,
|
||||
{ frameId: 0 },
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
throw new Error("Destination not supported.");
|
||||
}
|
||||
|
||||
async receive(): Promise<IncomingMessage> {
|
||||
return this.queue.dequeue();
|
||||
}
|
||||
}
|
||||
@ -1,47 +0,0 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Loading…
Reference in new issue