UNPKG

socket.io-request

Version:

bidirectional request-response for socket.io

94 lines (73 loc) 8.84 kB
'use strict'; 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==