embark-area-51/lib/core/ipc.js

100 lines
2.3 KiB
JavaScript
Raw Normal View History

2018-06-04 19:36:43 +00:00
let fs = require('./fs.js');
let ipc = require('node-ipc');
class IPC {
constructor(options) {
this.logger = options.logger;
this.socketPath = options.socketPath || fs.dappPath(".embark/embark.ipc");
2018-09-05 09:39:09 +00:00
this.ipcRole = options.ipcRole;
2018-06-04 19:36:43 +00:00
ipc.config.silent = true;
this.connected = false;
2018-06-04 19:36:43 +00:00
}
connect(done) {
const self = this;
2018-06-05 12:37:27 +00:00
function connecting(_socket) {
let connectedBefore = false, alreadyDisconnected = false;
2018-06-04 19:36:43 +00:00
ipc.of['embark'].on('connect',function() {
connectedBefore = true;
2018-06-26 19:42:49 +00:00
if (!alreadyDisconnected) {
self.connected = true;
done();
}
});
ipc.of['embark'].on('disconnect',function() {
self.connected = false;
ipc.disconnect('embark');
// we only want to trigger the error callback the first time
if (!connectedBefore && !alreadyDisconnected) {
alreadyDisconnected = true;
done(new Error("no connection found"));
}
2018-06-04 19:36:43 +00:00
});
}
ipc.connectTo('embark', this.socketPath, connecting);
}
serve() {
fs.mkdirpSync(fs.dappPath(".embark"));
2018-06-05 12:37:27 +00:00
ipc.serve(this.socketPath, () => {});
ipc.server.start();
2018-06-04 19:36:43 +00:00
this.logger.info(`pid ${process.pid} listening on ${this.socketPath}`);
}
on(action, done) {
const self = this;
2018-06-04 19:36:43 +00:00
ipc.server.on('message', function(data, socket) {
if (data.action !== action) {
return;
}
let reply = function(error, replyData) {
self.reply(socket, action, error, replyData);
2018-06-05 12:37:27 +00:00
};
done(data.message, reply, socket);
2018-06-04 19:36:43 +00:00
});
}
reply(client, action, error, data) {
ipc.server.emit(client, 'message', {action: action, message: data, error: (error && error.stack)});
2018-06-04 19:36:43 +00:00
}
2018-08-08 12:42:45 +00:00
listenTo(action, callback) {
ipc.of['embark'].on(action, callback);
}
broadcast(action, data) {
ipc.server.broadcast(action, data);
}
2018-06-04 19:36:43 +00:00
once(action, cb) {
ipc.of['embark'].once('message', function(msg) {
if (msg.action !== action) {
return;
}
cb(msg.error, msg.message);
2018-06-04 19:36:43 +00:00
});
}
request(action, data, cb) {
if (cb) {
this.once(action, cb);
}
2018-06-04 19:36:43 +00:00
ipc.of['embark'].emit('message', {action: action, message: data});
}
isClient() {
return this.ipcRole === 'client';
}
isServer() {
return this.ipcRole === 'server';
}
2018-06-04 19:36:43 +00:00
}
module.exports = IPC;