hyper/lib/utils/rpc.ts

74 lines
2.1 KiB
TypeScript
Raw Normal View History

2019-10-12 02:16:45 -08:00
import {EventEmitter} from 'events';
import {IpcRenderer, IpcRendererEvent} from 'electron';
import electron from 'electron';
2023-06-25 05:26:16 -08:00
import {FilterNever, MainEvents, RendererEvents, TypedEmitter} from '../../common';
2016-06-30 22:01:04 -08:00
export default class Client {
2023-06-25 05:26:16 -08:00
emitter: TypedEmitter<RendererEvents>;
2019-10-12 02:16:45 -08:00
ipc: IpcRenderer;
id!: string;
2023-06-25 05:26:16 -08:00
constructor() {
2016-06-30 22:01:04 -08:00
this.emitter = new EventEmitter();
this.ipc = electron.ipcRenderer;
2023-06-25 05:26:16 -08:00
this.emit = this.emit.bind(this);
2016-06-30 22:01:04 -08:00
if (window.__rpcId) {
setTimeout(() => {
this.id = window.__rpcId;
this.ipc.on(this.id, this.ipcListener);
this.emitter.emit('ready');
}, 0);
} else {
2019-10-12 02:16:45 -08:00
this.ipc.on('init', (ev: IpcRendererEvent, uid: string) => {
2016-06-30 22:01:04 -08:00
// 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');
});
}
}
2023-06-25 05:26:16 -08:00
ipcListener = <U extends keyof RendererEvents>(
event: IpcRendererEvent,
{ch, data}: {ch: U; data: RendererEvents[U]}
) => this.emitter.emit(ch, data);
2016-06-30 22:01:04 -08:00
2023-06-25 05:26:16 -08:00
on = <U extends keyof RendererEvents>(ev: U, fn: (arg0: RendererEvents[U]) => void) => {
2016-06-30 22:01:04 -08:00
this.emitter.on(ev, fn);
2023-06-25 05:26:16 -08:00
return this;
};
2016-06-30 22:01:04 -08:00
2023-06-25 05:26:16 -08:00
once = <U extends keyof RendererEvents>(ev: U, fn: (arg0: RendererEvents[U]) => void) => {
2016-06-30 22:01:04 -08:00
this.emitter.once(ev, fn);
2023-06-25 05:26:16 -08:00
return this;
};
2016-06-30 22:01:04 -08:00
2023-06-26 01:22:59 -08:00
emit<U extends Exclude<keyof MainEvents, FilterNever<MainEvents>>>(ev: U): boolean;
emit<U extends FilterNever<MainEvents>>(ev: U, data: MainEvents[U]): boolean;
2023-06-25 05:26:16 -08:00
emit<U extends keyof MainEvents>(ev: U, data?: MainEvents[U]) {
if (!this.id) {
throw new Error('Not ready');
}
this.ipc.send(this.id, {ev, data});
2023-06-25 05:26:16 -08:00
return true;
2016-06-30 22:01:04 -08:00
}
2023-06-25 05:26:16 -08:00
removeListener = <U extends keyof RendererEvents>(ev: U, fn: (arg0: RendererEvents[U]) => void) => {
2016-06-30 22:01:04 -08:00
this.emitter.removeListener(ev, fn);
2023-06-25 05:26:16 -08:00
return this;
};
2016-06-30 22:01:04 -08:00
2023-06-25 05:26:16 -08:00
removeAllListeners = () => {
2016-06-30 22:01:04 -08:00
this.emitter.removeAllListeners();
2023-06-25 05:26:16 -08:00
return this;
};
2016-06-30 22:01:04 -08:00
2023-06-25 05:26:16 -08:00
destroy = () => {
2016-06-30 22:01:04 -08:00
this.removeAllListeners();
2019-10-12 02:16:45 -08:00
this.ipc.removeAllListeners(this.id);
2023-06-25 05:26:16 -08:00
};
2016-06-30 22:01:04 -08:00
}