hyper/app/rpc.js
Juan Campa c07700af49 Performance - Data batching (#3336)
* Bumping electron to 3.0.10

* Updating node version in travis and appveyor

* Fixing incorrect require of electron-fetch

* Fix zoom to match previous versions

Additionally I'm removing a call to disable pinch-zoom, it's disable by
default since Electron 2 (https://electronjs.org/releases#2.0.0)

* Bumping electron to 4.0.0-beta.8

* Bumping electron to 4.0.0-beta.9

* Work around for Copy accelerator not firing on electron v4

* Batch session data before sending it to renderer

* Fix linting issues

* Fixing header/titlebar in MacOS

* Upgrading to electron 4.0.0 and node-pty 0.8.0

* Adding yarn.lock changes for electron 4.0.0

* Adding comments for editor:copy workaround. Scaling issue is only on Linux

* Upgrading node-abi to support electron 4.0.0

* Adding isDestroyed check
2018-12-28 15:13:00 -08:00

58 lines
1.2 KiB
JavaScript

const {EventEmitter} = require('events');
const {ipcMain} = require('electron');
const uuid = require('uuid');
class Server extends EventEmitter {
constructor(win) {
super();
this.win = win;
this.ipcListener = this.ipcListener.bind(this);
if (this.destroyed) {
return;
}
const uid = uuid.v4();
this.id = uid;
ipcMain.on(uid, this.ipcListener);
// we intentionally subscribe to `on` instead of `once`
// to support reloading the window and re-initializing
// the channel
this.wc.on('did-finish-load', () => {
this.wc.send('init', uid);
});
}
get wc() {
return this.win.webContents;
}
ipcListener(event, {ev, data}) {
super.emit(ev, data);
}
emit(ch, data) {
// This check is needed because data-batching can cause extra data to be
// emitted after the window has already closed
if (!this.win.isDestroyed()) {
this.wc.send(this.id, {ch, data});
}
}
destroy() {
this.removeAllListeners();
this.wc.removeAllListeners();
if (this.id) {
ipcMain.removeListener(this.id, this.ipcListener);
} else {
// mark for `genUid` in constructor
this.destroyed = true;
}
}
}
module.exports = win => {
return new Server(win);
};