socket-ipc
Version:
Message-based communications over UNIX sockets
122 lines (92 loc) • 11.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _fs = _interopRequireDefault(require("fs"));
var _net = _interopRequireDefault(require("net"));
var _util = require("util");
var _events = _interopRequireDefault(require("events"));
var _pTimeout = _interopRequireDefault(require("p-timeout"));
var _verror = require("verror");
var _MessageConnection = _interopRequireDefault(require("./MessageConnection"));
var _types = require("./types");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
class MessageServer extends _events.default {
constructor(options = {}) {
super();
_defineProperty(this, "running", false);
_defineProperty(this, "options", void 0);
_defineProperty(this, "binary", void 0);
_defineProperty(this, "connections", new Set());
_defineProperty(this, "server", void 0);
_defineProperty(this, "listening", false);
_defineProperty(this, "onServerConnection", socket => {
if (this.running) {
const connection = new _MessageConnection.default(socket, {
binary: this.binary
});
connection.on('message', event => this.emit('message', event, connection));
connection.on('error', err => this.emit('error', new _verror.VError(err, 'MessageServer got error from MessageConnection')));
connection.on('close', () => {
this.connections.delete(connection);
this.emit('close', connection);
});
this.connections.add(connection);
this.emit('connection', connection);
}
});
(0, _types.validateMessageHandlerOptions)(options);
this.options = options;
this.binary = Boolean(options.binary);
}
async start() {
if (!this.running) {
this.running = true;
const {
path,
port
} = this.options;
if (path) {
try {
// Delete the socket if it exists
_fs.default.unlinkSync(path);
} catch (err) {
// Swallow 'ENOENT' error, which is thrown if the socket does not exist
if (err && 'ENOENT' !== err.code) throw err;
}
}
const server = this.server = _net.default.createServer();
server.on('connection', this.onServerConnection);
server.on('error', err => this.emit('error', new _verror.VError(err, 'MessageServer got error from socket')));
await (0, _pTimeout.default)((0, _util.promisify)(cb => server.listen(path ? {
path
} : {
port
}, cb))(), 2000);
this.listening = true;
}
}
stop() {
if (this.running) {
this.running = false;
this.listening = false;
if (this.server) this.server.close();
this.server = undefined;
this.connections.forEach(connection => connection.close());
this.connections.clear();
}
}
isConnected() {
return this.connections.size > 0;
}
isListening() {
return this.listening;
}
send(message) {
this.connections.forEach(connection => connection.send(message));
}
}
exports.default = MessageServer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9NZXNzYWdlU2VydmVyLnRzIl0sIm5hbWVzIjpbIk1lc3NhZ2VTZXJ2ZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJTZXQiLCJzb2NrZXQiLCJydW5uaW5nIiwiY29ubmVjdGlvbiIsIk1lc3NhZ2VDb25uZWN0aW9uIiwiYmluYXJ5Iiwib24iLCJldmVudCIsImVtaXQiLCJlcnIiLCJWRXJyb3IiLCJjb25uZWN0aW9ucyIsImRlbGV0ZSIsImFkZCIsIkJvb2xlYW4iLCJzdGFydCIsInBhdGgiLCJwb3J0IiwiZnMiLCJ1bmxpbmtTeW5jIiwiY29kZSIsInNlcnZlciIsIm5ldCIsImNyZWF0ZVNlcnZlciIsIm9uU2VydmVyQ29ubmVjdGlvbiIsImNiIiwibGlzdGVuIiwibGlzdGVuaW5nIiwic3RvcCIsImNsb3NlIiwidW5kZWZpbmVkIiwiZm9yRWFjaCIsImNsZWFyIiwiaXNDb25uZWN0ZWQiLCJzaXplIiwiaXNMaXN0ZW5pbmciLCJzZW5kIiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUVBOztBQUNBOzs7Ozs7QUFrQmUsTUFBTUEsYUFBTixTQUE2QkMsZUFBN0IsQ0FFWjtBQVFEQyxFQUFBQSxXQUFXLENBQUNDLE9BQThCLEdBQUcsRUFBbEMsRUFBc0M7QUFDL0M7O0FBRCtDLHFDQVAvQixLQU8rQjs7QUFBQTs7QUFBQTs7QUFBQSx5Q0FKTSxJQUFJQyxHQUFKLEVBSU47O0FBQUE7O0FBQUEsdUNBRjdCLEtBRTZCOztBQUFBLGdEQWlFbkJDLE1BQUQsSUFBOEI7QUFDekQsVUFBSSxLQUFLQyxPQUFULEVBQWtCO0FBQ2hCLGNBQU1DLFVBQVUsR0FBRyxJQUFJQywwQkFBSixDQUFzQkgsTUFBdEIsRUFBOEI7QUFBRUksVUFBQUEsTUFBTSxFQUFFLEtBQUtBO0FBQWYsU0FBOUIsQ0FBbkI7QUFDQUYsUUFBQUEsVUFBVSxDQUFDRyxFQUFY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akIsQ0FBMEI1QixVQUFELElBQ3ZCQSxVQUFVLENBQUNpQyxJQUFYLENBQWdCQyxPQUFoQixDQURGO0FBR0Q7O0FBdkVBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gJ2ZzJ1xuaW1wb3J0IG5ldCBmcm9tICduZXQnXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJ1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudHMnXG5pbXBvcnQgeyBTdHJpY3RFdmVudEVtaXR0ZXIgfSBmcm9tICdzdHJpY3QtZXZlbnQtZW1pdHRlci10eXBlcydcblxuaW1wb3J0IHBUaW1lb3V0IGZyb20gJ3AtdGltZW91dCdcbmltcG9ydCB7IFZFcnJvciB9IGZyb20gJ3ZlcnJvcidcblxuaW1wb3J0IE1lc3NhZ2VDb25uZWN0aW9uIGZyb20gJy4vTWVzc2FnZUNvbm5lY3Rpb24nXG5pbXBvcnQge1xuICBNZXNzYWdlRXZlbnQsXG4gIE1lc3NhZ2VIYW5kbGVyT3B0aW9ucyxcbiAgdmFsaWRhdGVNZXNzYWdlSGFuZGxlck9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMnXG5cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZVNlcnZlckV2ZW50cyB7XG4gIGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uXG4gIG1lc3NhZ2U6IChldmVudDogTWVzc2FnZUV2ZW50LCBjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZFxuICBjbG9zZTogTWVzc2FnZUNvbm5lY3Rpb25cbiAgZXJyb3I6IEVycm9yXG59XG5cbnR5cGUgTWVzc2FnZVNlcnZlckVtaXR0ZXIgPSBTdHJpY3RFdmVudEVtaXR0ZXI8XG4gIEV2ZW50RW1pdHRlcixcbiAgTWVzc2FnZVNlcnZlckV2ZW50c1xuPlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZXNzYWdlU2VydmVyIGV4dGVuZHMgKEV2ZW50RW1pdHRlciBhcyB7XG4gIG5ldyAoKTogTWVzc2FnZVNlcnZlckVtaXR0ZXJcbn0pIHtcbiAgcHJpdmF0ZSBydW5uaW5nID0gZmFsc2VcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBNZXNzYWdlSGFuZGxlck9wdGlvbnNcbiAgcHJpdmF0ZSByZWFkb25seSBiaW5hcnk6IGJvb2xlYW5cbiAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uczogU2V0PE1lc3NhZ2VDb25uZWN0aW9uPiA9IG5ldyBTZXQoKVxuICBwcml2YXRlIHNlcnZlcjogbmV0LlNlcnZlciB8IHVuZGVmaW5lZFxuICBwcml2YXRlIGxpc3RlbmluZyA9IGZhbHNlXG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogTWVzc2FnZUhhbmRsZXJPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcigpXG4gICAgdmFsaWRhdGVNZXNzYWdlSGFuZGxlck9wdGlvbnMob3B0aW9ucylcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gICAgdGhpcy5iaW5hcnkgPSBCb29sZWFuKG9wdGlvbnMuYmluYXJ5KVxuICB9XG5cbiAgYXN5bmMgc3RhcnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLnJ1bm5pbmcpIHtcbiAgICAgIHRoaXMucnVubmluZyA9IHRydWVcbiAgICAgIGNvbnN0IHsgcGF0aCwgcG9ydCB9ID0gdGhpcy5vcHRpb25zXG4gICAgICBpZiAocGF0aCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIERlbGV0ZSB0aGUgc29ja2V0IGlmIGl0IGV4aXN0c1xuICAgICAgICAgIGZzLnVubGlua1N5bmMocGF0aClcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gU3dhbGxvdyAnRU5PRU5UJyBlcnJvciwgd2hpY2ggaXMgdGhyb3duIGlmIHRoZSBzb2NrZXQgZG9lcyBub3QgZXhpc3RcbiAgICAgICAgICBpZiAoZXJyICYmICdFTk9FTlQnICE9PSBlcnIuY29kZSkgdGhyb3cgZXJyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlcnZlciA9ICh0aGlzLnNlcnZlciA9IG5ldC5jcmVhdGVTZXJ2ZXIoKSlcbiAgICAgIHNlcnZlci5vbignY29ubmVjdGlvbicsIHRoaXMub25TZXJ2ZXJDb25uZWN0aW9uKVxuICAgICAgc2VydmVyLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PlxuICAgICAgICB0aGlzLmVtaXQoXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICBuZXcgVkVycm9yKGVyciwgJ01lc3NhZ2VTZXJ2ZXIgZ290IGVycm9yIGZyb20gc29ja2V0JylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgYXdhaXQgcFRpbWVvdXQoXG4gICAgICAgIHByb21pc2lmeSgoY2I6ICgpID0+IHZvaWQpID0+XG4gICAgICAgICAgc2VydmVyLmxpc3RlbihwYXRoID8geyBwYXRoIH0gOiB7IHBvcnQgfSwgY2IpXG4gICAgICAgICkoKSxcbiAgICAgICAgMjAwMFxuICAgICAgKVxuICAgICAgdGhpcy5saXN0ZW5pbmcgPSB0cnVlXG4gICAgfVxuICB9XG5cbiAgc3RvcCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZVxuICAgICAgdGhpcy5saXN0ZW5pbmcgPSBmYWxzZVxuICAgICAgaWYgKHRoaXMuc2VydmVyKSB0aGlzLnNlcnZlci5jbG9zZSgpXG4gICAgICB0aGlzLnNlcnZlciA9IHVuZGVmaW5lZFxuICAgICAgdGhpcy5jb25uZWN0aW9ucy5mb3JFYWNoKChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT5cbiAgICAgICAgY29ubmVjdGlvbi5jbG9zZSgpXG4gICAgICApXG4gICAgICB0aGlzLmNvbm5lY3Rpb25zLmNsZWFyKClcbiAgICB9XG4gIH1cblxuICBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9ucy5zaXplID4gMFxuICB9XG5cbiAgaXNMaXN0ZW5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuaW5nXG4gIH1cblxuICBzZW5kKG1lc3NhZ2U6IEJ1ZmZlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29ubmVjdGlvbnMuZm9yRWFjaCgoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+XG4gICAgICBjb25uZWN0aW9uLnNlbmQobWVzc2FnZSlcbiAgICApXG4gIH1cblxuICBwcml2YXRlIG9uU2VydmVyQ29ubmVjdGlvbiA9IChzb2NrZXQ6IG5ldC5Tb2NrZXQpOiB2b2lkID0+IHtcbiAgICBpZiAodGhpcy5ydW5uaW5nKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gbmV3IE1lc3NhZ2VDb25uZWN0aW9uKHNvY2tldCwgeyBiaW5hcnk6IHRoaXMuYmluYXJ5IH0pXG4gICAgICBjb25uZWN0aW9uLm9uKCdtZXNzYWdlJywgKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+XG4gICAgICAgIHRoaXMuZW1pdCgnbWVzc2FnZScsIGV2ZW50LCBjb25uZWN0aW9uKVxuICAgICAgKVxuICAgICAgY29ubmVjdGlvbi5vbignZXJyb3InLCAoZXJyOiBFcnJvcikgPT5cbiAgICAgICAgdGhpcy5lbWl0KFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgbmV3IFZFcnJvcihlcnIsICdNZXNzYWdlU2VydmVyIGdvdCBlcnJvciBmcm9tIE1lc3NhZ2VDb25uZWN0aW9uJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICAgY29ubmVjdGlvbi5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMuZGVsZXRlKGNvbm5lY3Rpb24pXG4gICAgICAgIHRoaXMuZW1pdCgnY2xvc2UnLCBjb25uZWN0aW9uKVxuICAgICAgfSlcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMuYWRkKGNvbm5lY3Rpb24pXG4gICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3Rpb24nLCBjb25uZWN0aW9uKVxuICAgIH1cbiAgfVxufVxuIl19