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-06-04 22:15:27 +00:00
|
|
|
this.ipcRole = options.ipcRole || "server";
|
2018-06-04 19:36:43 +00:00
|
|
|
ipc.config.silent = true;
|
2018-06-04 22:15:27 +00:00
|
|
|
this.connected = false;
|
2018-06-04 19:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
connect(done) {
|
2018-06-04 22:15:27 +00:00
|
|
|
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() {
|
2018-06-04 22:15:27 +00:00
|
|
|
connectedBefore = true;
|
2018-06-26 19:42:49 +00:00
|
|
|
if (!alreadyDisconnected) {
|
2018-06-04 22:15:27 +00:00
|
|
|
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() {
|
2018-08-07 15:37:46 +00:00
|
|
|
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) {
|
2018-06-04 20:39:31 +00:00
|
|
|
const self = this;
|
2018-06-04 19:36:43 +00:00
|
|
|
ipc.server.on('message', function(data, socket) {
|
|
|
|
if (data.action !== action) {
|
|
|
|
return;
|
|
|
|
}
|
2018-08-07 15:37:46 +00:00
|
|
|
let reply = function(_err, replyData) {
|
2018-08-08 12:42:45 +00:00
|
|
|
self.reply(socket, action, replyData);
|
2018-06-05 12:37:27 +00:00
|
|
|
};
|
2018-06-04 20:39:31 +00:00
|
|
|
done(data.message, reply, socket);
|
2018-06-04 19:36:43 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
reply(client, action, data) {
|
|
|
|
ipc.server.emit(client, 'message', {action: action, message: data});
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
}
|
2018-08-07 15:37:46 +00:00
|
|
|
cb(null, msg.message);
|
2018-06-04 19:36:43 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-06-04 20:39:31 +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});
|
|
|
|
}
|
|
|
|
|
2018-06-04 22:15:27 +00:00
|
|
|
isClient() {
|
|
|
|
return this.ipcRole === 'client';
|
|
|
|
}
|
|
|
|
|
|
|
|
isServer() {
|
|
|
|
return this.ipcRole === 'server';
|
|
|
|
}
|
|
|
|
|
2018-06-04 19:36:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = IPC;
|