-
Notifications
You must be signed in to change notification settings - Fork 55
/
injectedRuntime.ts
41 lines (38 loc) · 1.38 KB
/
injectedRuntime.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// only tested in ../e2e tests
import { MessengerPort } from './types';
import { Runtime } from 'webextension-polyfill';
import { isResponseMessage } from './util';
const noOp = () => void 0;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const listeners = new WeakMap<any, any>();
const connectWindow = ({ name }: Runtime.ConnectConnectInfoType): MessengerPort => {
const port: MessengerPort = {
disconnect: noOp,
name: name || '',
onDisconnect: {
addListener: noOp,
removeListener: noOp
},
onMessage: {
addListener(listener) {
const wrappedListener = ({ data, source }: MessageEvent) => {
// TODO: consider validating the source, or else something else might pretend to be this wallet
if (source !== window || !isResponseMessage(data)) return;
listener(data, port);
};
listeners.set(listener, wrappedListener);
window.addEventListener('message', wrappedListener);
},
removeListener(listener) {
const wrappedListener = listeners.get(listener);
window.removeEventListener('message', wrappedListener);
listeners.delete(listener);
}
},
postMessage(message) {
window.postMessage(message, '*');
}
};
return port;
};
export const injectedRuntime = { connect: connectWindow, onConnect: { addListener: noOp, removeListener: noOp } };