2019-08-12 18:31:32 +02:00
|
|
|
import { BrowserApi } from './browserApi';
|
|
|
|
|
|
|
|
export class SafariApp {
|
|
|
|
static init() {
|
|
|
|
if (BrowserApi.isSafariApi) {
|
|
|
|
(window as any).bitwardenSafariAppMessageReceiver = (message: any) =>
|
2019-08-12 21:50:47 +02:00
|
|
|
SafariApp.receiveMessageFromApp(message == null ? null : JSON.parse(message));
|
2019-08-12 18:31:32 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static sendMessageToApp(command: string, data: any = null): Promise<any> {
|
|
|
|
if (!BrowserApi.isSafariApi) {
|
|
|
|
return Promise.resolve(null);
|
|
|
|
}
|
|
|
|
return new Promise((resolve) => {
|
2019-08-12 21:50:47 +02:00
|
|
|
const now = new Date();
|
|
|
|
const messageId = now.getTime().toString() + '_' + Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
|
|
|
|
(window as any).webkit.messageHandlers.bitwardenApp.postMessage(JSON.stringify({
|
2019-08-12 18:31:32 +02:00
|
|
|
id: messageId,
|
|
|
|
command: command,
|
|
|
|
data: data,
|
2019-08-12 21:50:47 +02:00
|
|
|
}));
|
|
|
|
SafariApp.requests.set(messageId, { resolve: resolve, date: now });
|
2019-08-12 18:31:32 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2019-08-12 21:50:47 +02:00
|
|
|
private static requests = new Map<string, { resolve: (value?: unknown) => void, date: Date }>();
|
2019-08-12 18:31:32 +02:00
|
|
|
|
|
|
|
private static receiveMessageFromApp(message: any) {
|
|
|
|
if (message == null || message.id == null || !SafariApp.requests.has(message.id)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
const p = SafariApp.requests.get(message.id);
|
|
|
|
p.resolve(message.data);
|
|
|
|
}
|
|
|
|
}
|