xuanxuan
Version:
企业即时通讯平台
116 lines (104 loc) • 4.11 kB
JavaScript
import electron from 'electron';
import EventEmitter from 'events';
import {EVENT} from './resource';
class EventCenter extends EventEmitter {
/**
* Event center constructor
*/
constructor() {
super();
this.isMainProcess = process.type !== 'renderer';
this.ipc = (this.isMainProcess && electron.ipcMain) ? electron.ipcMain : electron.ipcRenderer;
this.setMaxListeners(0);
}
/*
* Send event to window
*/
sendToWindow(windowName, eventName, ...args) {
if(this.isMainProcess) {
if(DEBUG) console.error('Can not send to window in main process');
return;
}
this.ipc.send(EVENT.app_remote_send, windowName, eventName, ...args);
}
/*
* Send event to main window
*/
sendToMainWindow(eventName, ...args) {
return this.sendToWindow('main', eventName, ...args);
}
/**
* Bind event
* @param {String} event
* @param {Function} listener
* @return {Symbol}
*/
on(event, listener) {
super.on(event, listener);
let name = Symbol(event);
if(!this._eventsMap) this._eventsMap = {};
this._eventsMap[name] = {listener, name: event};
if(DEBUG) {
console.groupCollapsed('%cON EVENT ' + event, 'color: #FF9800; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 2px; border: 1px dotted #ff9800;');
console.trace('event', this._eventsMap[name]);
console.groupEnd();
}
return name;
}
/**
* Bind once event
* @param {String} event
* @param {Function} listener
* @return {Symbol}
*/
once(event, listener) {
super.once(event, listener);
let name = Symbol(event);
if(!this._eventsMap) this._eventsMap = {};
this._eventsMap[name] = {listener, name: event};
if(DEBUG) {
console.groupCollapsed('%cON ONCE EVENT ' + event, 'color: #FF9800; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 2px; border: 1px dotted #ff9800;');
console.trace('event', this._eventsMap[name]);
console.groupEnd();
}
return name;
}
/**
* Unbind event
* @param {...[Symbol]} names
* @return {Void}
*/
off(...names) {
if(this._eventsMap) {
names.forEach(name => {
let event = this._eventsMap[name];
if(event) {
this.removeListener(event.name, event.listener);
delete this._eventsMap[name];
if(DEBUG) {
console.groupCollapsed('%cOFF EVENT%c' + event.name, 'color: #FF9800; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 2px 0 0 2px; border: 1px dotted #ff9800; border-right: 0;', 'background: #FF9800; color: #fff; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 0 2px 2px 0; border: 1px dotted #ff9800; border-left: 0; font-weight: bold;');
console.trace('event', event);
console.groupEnd();
}
}
});
}
}
/**
* Emit event
*/
emit(names, ...args) {
super.emit(names, ...args);
if(DEBUG) {
console.groupCollapsed('%cEMIT EVENT%c' + names, 'color: #EF6C00; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 2px 0 0 2px; border: 1px solid #EF6C00; border-right: 0;', 'background: #EF6C00; color: #fff; display: inline-block; font-size: 10px; padding: 1px 5px; border-radius: 0 2px 2px 0; border: 1px solid #EF6C00; border-left: 0; font-weight: bold;');
let argIdx = 0;
for(let arg of args) {
console.log('arg' + argIdx++, arg);
}
console.groupEnd();
}
}
}
const eventCenter = new EventCenter();
if(DEBUG) console.log('%cEventCenter [' + process.type + ']', 'color: #fff; background: orange')
export default eventCenter;