rxdb
Version:
A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/
63 lines (59 loc) • 1.82 kB
text/typescript
import { Subject } from 'rxjs';
import {
getRxStorageRemote,
RxStorageRemote,
RxStorageRemoteSettings,
MessageFromRemote
} from '../storage-remote/index.ts';
import {
IPC_RENDERER_KEY_PREFIX
} from './electron-helper.ts';
import { PROMISE_RESOLVE_VOID } from '../utils/index.ts';
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;
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',
mode: settings.mode,
messageChannelCreator() {
const messages$ = new Subject<MessageFromRemote>();
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;
}