import { Subject } from 'rxjs'; import { getRxStorageRemote, RxStorageRemote, RxStorageRemoteSettings, MessageFromRemote } from 'nxdb-old/src/plugins/storage-remote'; import type { RxStorageStatics } from 'nxdb-old/src/types'; import { IPC_RENDERER_KEY_PREFIX } from 'nxdb-old/src/plugins/electron/electron-helper'; import { PROMISE_RESOLVE_VOID } from 'nxdb-old/src/plugins/utils'; export type RxStorageIpcRendererSettings = { /** * Set the same key on both sides * to ensure that messages do not get mixed * up when you use more then one storage. */ key: string; statics: RxStorageStatics; ipcRenderer: any; mode: RxStorageRemoteSettings['mode']; }; export type RxStorageIpcRenderer = RxStorageRemote; export function getRxStorageIpcRenderer( settings: RxStorageIpcRendererSettings ): RxStorageIpcRenderer { const channelId = [ IPC_RENDERER_KEY_PREFIX, settings.key ].join('|'); const storage = getRxStorageRemote({ identifier: 'electron-ipc-renderer', statics: settings.statics, mode: settings.mode, messageChannelCreator() { const messages$ = new Subject(); const listener = (_event: any, message: any) => { messages$.next(message); }; settings.ipcRenderer.on(channelId, listener); settings.ipcRenderer.postMessage( channelId, false ); return Promise.resolve({ messages$, send(msg) { settings.ipcRenderer.postMessage( channelId, msg ); }, close() { settings.ipcRenderer.removeListener(channelId, listener); return PROMISE_RESOLVE_VOID; } }); }, }); return storage; }