const EventEmitter = require('events') const electron = require('electron') export default class EventBus extends EventEmitter { constructor(name='default') { super() this._name = name this._baseEventKey = `EventBus-${name}:` } on(event, listender) { const ipc = electron.ipcMain || electron.ipcRenderer ipc.on(this._baseEventKey + event, (e, argsJson) => { const args = JSON.parse(argsJson) return listender && listender(...args) }) return super.on(event, listender) } emit(event, ...args) { const webContents = electron.webContents const remote = electron.remote const ipcRenderer = electron.ipcRenderer const allContents = webContents.getAllWebContents() const ipcArgs = [this._baseEventKey + event, JSON.stringify(Array.from(args))] if (electron.ipcRenderer) { // renderer process const curContents = remote.getCurrentWebContents() allContents .filter(contents => contents.id !== curContents.id) .forEach(contents => contents.send(...ipcArgs)) ipcRenderer.send() } else { // main process allContents .forEach(contents => contents.send(...ipcArgs)) } return super.emit(event, ...args) } }