hyper/lib/utils/rpc.ts
2019-10-13 03:39:33 +02:00

62 lines
1.5 KiB
TypeScript

import {EventEmitter} from 'events';
import {IpcRenderer, IpcRendererEvent} from 'electron';
import electron from 'electron';
export default class Client {
emitter: EventEmitter;
ipc: IpcRenderer;
id!: string;
constructor() {
this.emitter = new EventEmitter();
this.ipc = electron.ipcRenderer;
this.ipcListener = this.ipcListener.bind(this);
if (window.__rpcId) {
setTimeout(() => {
this.id = window.__rpcId;
this.ipc.on(this.id, this.ipcListener);
this.emitter.emit('ready');
}, 0);
} else {
this.ipc.on('init', (ev: IpcRendererEvent, uid: string) => {
// we cache so that if the object
// gets re-instantiated we don't
// wait for a `init` event
window.__rpcId = uid;
this.id = uid;
this.ipc.on(uid, this.ipcListener);
this.emitter.emit('ready');
});
}
}
ipcListener(event: any, {ch, data}: {ch: string; data: any}) {
this.emitter.emit(ch, data);
}
on(ev: string, fn: (...args: any[]) => void) {
this.emitter.on(ev, fn);
}
once(ev: string, fn: (...args: any[]) => void) {
this.emitter.once(ev, fn);
}
emit(ev: string, data: any) {
if (!this.id) {
throw new Error('Not ready');
}
this.ipc.send(this.id, {ev, data});
}
removeListener(ev: string, fn: (...args: any[]) => void) {
this.emitter.removeListener(ev, fn);
}
removeAllListeners() {
this.emitter.removeAllListeners();
}
destroy() {
this.removeAllListeners();
this.ipc.removeAllListeners(this.id);
}
}