import { Observable } from "rxjs"; import { IpcRequest, IpcResponse } from "shared/models/ipc"; export class IpcService { private static instance: IpcService; private readonly channelObservables: Map>>; public static getInstance(): IpcService{ if(!IpcService.instance){ IpcService.instance = new IpcService(); } return IpcService.instance; } private constructor(){ this.channelObservables = new Map>>(); } public send(channel: string, request?: IpcRequest): Promise>{ if(!request){ request = {args: null, responceChannel: null}; } if(!request.responceChannel){ request.responceChannel = `${channel}_responce_${new Date().getTime()}`; } const promise = new Promise>(resolve => { window.electron.ipcRenderer.once(request.responceChannel, (response: IpcResponse) => resolve(response)); }); window.electron.ipcRenderer.sendMessage(channel, request); return promise; } public sendLazy(channel: string, request?: IpcRequest): void{ window.electron.ipcRenderer.sendMessage(channel, request); } public watch(channel: string): Observable>{ if(this.channelObservables.has(channel)){ return this.channelObservables.get(channel) as Observable>; } const obs = new Observable>(observer => { window.electron.ipcRenderer.on(channel, res => { observer.next(res); }); }) this.channelObservables.set(channel, obs); return obs; } }