diff options
Diffstat (limited to 'sdnr/wt/odlux/lib/broadcast/mapChannel.ts')
-rw-r--r-- | sdnr/wt/odlux/lib/broadcast/mapChannel.ts | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/sdnr/wt/odlux/lib/broadcast/mapChannel.ts b/sdnr/wt/odlux/lib/broadcast/mapChannel.ts new file mode 100644 index 000000000..efd76eb8c --- /dev/null +++ b/sdnr/wt/odlux/lib/broadcast/mapChannel.ts @@ -0,0 +1,29 @@ + +const channel: BroadcastChannel = new BroadcastChannel("odlux_map"); +const listeners: { [key: string]: ((data: any) => void)[] } = {}; + +channel.onmessage = (eventMessage: MessageEvent<any>) => { + const { key, data } = eventMessage.data; + if (listeners[key]) { + listeners[key].forEach(listener => listener(data)); + } +}; + +export const sendMapMessage = (data: any, key: string) => { + channel.postMessage({ key, data }); +}; + +export const addMapMessageListener = (key: string, listener: (data: any) => void) => { + if (!listeners[key]) { + listeners[key] = []; + } + + if (!listeners[key].find(l => l === listener)) { + listeners[key].push(listener); + } + + return () => { + listeners[key] = listeners[key].filter(l => l !== listener); + } +}; + |