socket.io-request
Version:
bidirectional request-response for socket.io
94 lines (73 loc) • 8.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _error = require('./error');
var _combineMiddlewares = require('combine-middlewares');
var _combineMiddlewares2 = _interopRequireDefault(_combineMiddlewares);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SocketIORequest = function () {
function SocketIORequest(io) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
_classCallCheck(this, SocketIORequest);
this.io = io;
this.options = Object.assign({
event: 'socket.io-request',
timeout: 90000
}, options);
}
_createClass(SocketIORequest, [{
key: 'request',
value: function request(method, data) {
var _this = this;
if (typeof method !== 'string') throw new Error('argument "method" is missing');
return new Promise(function (resolve, reject) {
_this.io.emit(_this.options.event, { method: method, data: data }, function (res) {
clearTimeout(timeout);
_this.io.removeListener('disconnect', onDisconnect);
if (res.error) return reject((0, _error.convertObjectToError)(res.error));
resolve(res.data);
});
var onDisconnect = function onDisconnect() {
clearTimeout(timeout);
reject(new _error.SocketIOError('disconnect'));
};
var timeout = setTimeout(function () {
_this.io.removeListener('disconnect', onDisconnect);
reject(new _error.TimeoutError('exceeded ' + _this.options.timeout + ' (msec)'));
}, _this.options.timeout);
_this.io.once('disconnect', onDisconnect);
});
}
}, {
key: 'response',
value: function response(method) {
if (typeof method !== 'string') throw new Error('argument "method" is missing');
for (var _len = arguments.length, middlewares = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
middlewares[_key - 1] = arguments[_key];
}
if (middlewares.find(function (m) {
return typeof m !== 'function';
})) {
throw new Error('"middlewares" must be a function');
}
var combined = _combineMiddlewares2.default.apply(undefined, _toConsumableArray(middlewares.concat()));
this.io.on(this.options.event, function (req, ack) {
if (req.method !== method) return;
var res = function res(data) {
return ack({ data: data });
};
res.error = function (err) {
return ack({ error: (0, _error.convertErrorToObject)(err) });
};
combined(req.data, res);
});
}
}]);
return SocketIORequest;
}();
exports.default = SocketIORequest;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLmpzIl0sIm5hbWVzIjpbIlNvY2tldElPUmVxdWVzdCIsImlvIiwib3B0aW9ucyIsIk9iamVjdCIsImFzc2lnbiIsImV2ZW50IiwidGltZW91dCIsIm1ldGhvZCIsImRhdGEiLCJFcnJvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZW1pdCIsInJlcyIsImNsZWFyVGltZW91dCIsInJlbW92ZUxpc3RlbmVyIiwib25EaXNjb25uZWN0IiwiZXJyb3IiLCJzZXRUaW1lb3V0Iiwib25jZSIsIm1pZGRsZXdhcmVzIiwiZmluZCIsIm0iLCJjb21iaW5lZCIsImNvbmNhdCIsIm9uIiwicmVxIiwiYWNrIiwiZXJyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7Ozs7O0lBRXFCQSxlO0FBQ25CLDJCQUFhQyxFQUFiLEVBQStCO0FBQUEsUUFBZEMsT0FBYyx1RUFBSixFQUFJOztBQUFBOztBQUM3QixTQUFLRCxFQUFMLEdBQVVBLEVBQVY7QUFDQSxTQUFLQyxPQUFMLEdBQWVDLE9BQU9DLE1BQVAsQ0FBYztBQUMzQkMsYUFBTyxtQkFEb0I7QUFFM0JDLGVBQVM7QUFGa0IsS0FBZCxFQUdaSixPQUhZLENBQWY7QUFJRDs7Ozs0QkFFUUssTSxFQUFRQyxJLEVBQU07QUFBQTs7QUFDckIsVUFBSSxPQUFPRCxNQUFQLEtBQWtCLFFBQXRCLEVBQWdDLE1BQU0sSUFBSUUsS0FBSixDQUFVLDhCQUFWLENBQU47O0FBRWhDLGFBQU8sSUFBSUMsT0FBSixDQUFZLFVBQUNDLE9BQUQsRUFBVUMsTUFBVixFQUFxQjtBQUN0QyxjQUFLWCxFQUFMLENBQVFZLElBQVIsQ0FBYSxNQUFLWCxPQUFMLENBQWFHLEtBQTFCLEVBQWlDLEVBQUNFLGNBQUQsRUFBU0MsVUFBVCxFQUFqQyxFQUFpRCxVQUFDTSxHQUFELEVBQVM7QUFDeERDLHVCQUFhVCxPQUFiO0FBQ0EsZ0JBQUtMLEVBQUwsQ0FBUWUsY0FBUixDQUF1QixZQUF2QixFQUFxQ0MsWUFBckM7QUFDQSxjQUFJSCxJQUFJSSxLQUFSLEVBQWUsT0FBT04sT0FBTyxpQ0FBcUJFLElBQUlJLEtBQXpCLENBQVAsQ0FBUDtBQUNmUCxrQkFBUUcsSUFBSU4sSUFBWjtBQUNELFNBTEQ7O0FBT0EsWUFBTVMsZUFBZSxTQUFmQSxZQUFlLEdBQU07QUFDekJGLHVCQUFhVCxPQUFiO0FBQ0FNLGlCQUFPLHlCQUFrQixZQUFsQixDQUFQO0FBQ0QsU0FIRDs7QUFLQSxZQUFNTixVQUFVYSxXQUFXLFlBQU07QUFDL0IsZ0JBQUtsQixFQUFMLENBQVFlLGNBQVIsQ0FBdUIsWUFBdkIsRUFBcUNDLFlBQXJDO0FBQ0FMLGlCQUFPLHNDQUE2QixNQUFLVixPQUFMLENBQWFJLE9BQTFDLGFBQVA7QUFDRCxTQUhlLEVBR2IsTUFBS0osT0FBTCxDQUFhSSxPQUhBLENBQWhCOztBQUtBLGNBQUtMLEVBQUwsQ0FBUW1CLElBQVIsQ0FBYSxZQUFiLEVBQTJCSCxZQUEzQjtBQUNELE9BbkJNLENBQVA7QUFvQkQ7Ozs2QkFFU1YsTSxFQUF3QjtBQUNoQyxVQUFJLE9BQU9BLE1BQVAsS0FBa0IsUUFBdEIsRUFBZ0MsTUFBTSxJQUFJRSxLQUFKLENBQVUsOEJBQVYsQ0FBTjs7QUFEQSx3Q0FBYlksV0FBYTtBQUFiQSxtQkFBYTtBQUFBOztBQUVoQyxVQUFJQSxZQUFZQyxJQUFaLENBQWlCO0FBQUEsZUFBSyxPQUFPQyxDQUFQLEtBQWEsVUFBbEI7QUFBQSxPQUFqQixDQUFKLEVBQW9EO0FBQ2xELGNBQU0sSUFBSWQsS0FBSixDQUFVLGtDQUFWLENBQU47QUFDRDtBQUNELFVBQU1lLFdBQVcsaUVBQXNCSCxZQUFZSSxNQUFaLEVBQXRCLEVBQWpCO0FBQ0EsV0FBS3hCLEVBQUwsQ0FBUXlCLEVBQVIsQ0FBVyxLQUFLeEIsT0FBTCxDQUFhRyxLQUF4QixFQUErQixVQUFDc0IsR0FBRCxFQUFNQyxHQUFOLEVBQWM7QUFDM0MsWUFBSUQsSUFBSXBCLE1BQUosS0FBZUEsTUFBbkIsRUFBMkI7QUFDM0IsWUFBTU8sTUFBTSxTQUFOQSxHQUFNO0FBQUEsaUJBQVFjLElBQUksRUFBQ3BCLFVBQUQsRUFBSixDQUFSO0FBQUEsU0FBWjtBQUNBTSxZQUFJSSxLQUFKLEdBQVk7QUFBQSxpQkFBT1UsSUFBSSxFQUFDVixPQUFPLGlDQUFxQlcsR0FBckIsQ0FBUixFQUFKLENBQVA7QUFBQSxTQUFaO0FBQ0FMLGlCQUFTRyxJQUFJbkIsSUFBYixFQUFtQk0sR0FBbkI7QUFDRCxPQUxEO0FBTUQ7Ozs7OztrQkE5Q2tCZCxlIiwiZmlsZSI6Im1haW4uanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2NvbnZlcnRFcnJvclRvT2JqZWN0LCBjb252ZXJ0T2JqZWN0VG9FcnJvciwgVGltZW91dEVycm9yLCBTb2NrZXRJT0Vycm9yfSBmcm9tICcuL2Vycm9yJ1xuaW1wb3J0IGNvbWJpbmVNaWRkbGV3YXJlcyBmcm9tICdjb21iaW5lLW1pZGRsZXdhcmVzJ1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTb2NrZXRJT1JlcXVlc3Qge1xuICBjb25zdHJ1Y3RvciAoaW8sIG9wdGlvbnMgPSB7fSkge1xuICAgIHRoaXMuaW8gPSBpb1xuICAgIHRoaXMub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe1xuICAgICAgZXZlbnQ6ICdzb2NrZXQuaW8tcmVxdWVzdCcsXG4gICAgICB0aW1lb3V0OiA5MDAwMFxuICAgIH0sIG9wdGlvbnMpXG4gIH1cblxuICByZXF1ZXN0IChtZXRob2QsIGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcignYXJndW1lbnQgXCJtZXRob2RcIiBpcyBtaXNzaW5nJylcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICB0aGlzLmlvLmVtaXQodGhpcy5vcHRpb25zLmV2ZW50LCB7bWV0aG9kLCBkYXRhfSwgKHJlcykgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgdGhpcy5pby5yZW1vdmVMaXN0ZW5lcignZGlzY29ubmVjdCcsIG9uRGlzY29ubmVjdClcbiAgICAgICAgaWYgKHJlcy5lcnJvcikgcmV0dXJuIHJlamVjdChjb252ZXJ0T2JqZWN0VG9FcnJvcihyZXMuZXJyb3IpKVxuICAgICAgICByZXNvbHZlKHJlcy5kYXRhKVxuICAgICAgfSlcblxuICAgICAgY29uc3Qgb25EaXNjb25uZWN0ID0gKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgICAgcmVqZWN0KG5ldyBTb2NrZXRJT0Vycm9yKCdkaXNjb25uZWN0JykpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pby5yZW1vdmVMaXN0ZW5lcignZGlzY29ubmVjdCcsIG9uRGlzY29ubmVjdClcbiAgICAgICAgcmVqZWN0KG5ldyBUaW1lb3V0RXJyb3IoYGV4Y2VlZGVkICR7dGhpcy5vcHRpb25zLnRpbWVvdXR9IChtc2VjKWApKVxuICAgICAgfSwgdGhpcy5vcHRpb25zLnRpbWVvdXQpXG5cbiAgICAgIHRoaXMuaW8ub25jZSgnZGlzY29ubmVjdCcsIG9uRGlzY29ubmVjdClcbiAgICB9KVxuICB9XG5cbiAgcmVzcG9uc2UgKG1ldGhvZCwgLi4ubWlkZGxld2FyZXMpIHtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ3N0cmluZycpIHRocm93IG5ldyBFcnJvcignYXJndW1lbnQgXCJtZXRob2RcIiBpcyBtaXNzaW5nJylcbiAgICBpZiAobWlkZGxld2FyZXMuZmluZChtID0+IHR5cGVvZiBtICE9PSAnZnVuY3Rpb24nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcIm1pZGRsZXdhcmVzXCIgbXVzdCBiZSBhIGZ1bmN0aW9uJylcbiAgICB9XG4gICAgY29uc3QgY29tYmluZWQgPSBjb21iaW5lTWlkZGxld2FyZXMoLi4ubWlkZGxld2FyZXMuY29uY2F0KCkpXG4gICAgdGhpcy5pby5vbih0aGlzLm9wdGlvbnMuZXZlbnQsIChyZXEsIGFjaykgPT4ge1xuICAgICAgaWYgKHJlcS5tZXRob2QgIT09IG1ldGhvZCkgcmV0dXJuXG4gICAgICBjb25zdCByZXMgPSBkYXRhID0+IGFjayh7ZGF0YX0pXG4gICAgICByZXMuZXJyb3IgPSBlcnIgPT4gYWNrKHtlcnJvcjogY29udmVydEVycm9yVG9PYmplY3QoZXJyKX0pXG4gICAgICBjb21iaW5lZChyZXEuZGF0YSwgcmVzKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==