UNPKG

@argab/request-service

Version:

Provides a fully customizable Library for handling API using Request repositories and Stubs.

610 lines (609 loc) 26.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RequestManager = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _Request = require("./Request"); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var RequestManager = /*#__PURE__*/function () { function RequestManager(_ref) { var request = _ref.request, service = _ref.service; (0, _classCallCheck2["default"])(this, RequestManager); (0, _defineProperty2["default"])(this, "_request", void 0); (0, _defineProperty2["default"])(this, "_service", void 0); (0, _defineProperty2["default"])(this, "_factory", void 0); (0, _defineProperty2["default"])(this, "_resolve", []); (0, _defineProperty2["default"])(this, "_retry", void 0); if (!(request instanceof _Request.Request)) throw 'The RequestManager`s "request" is not an instance of "Request".'; if (!(service instanceof _Request.RequestService)) throw 'The RequestManager`s "service" is not an instance of "RequestService".'; this._request = request; this._service = service; this._factory = service._factory; } (0, _createClass2["default"])(RequestManager, [{ key: "save", value: function save() { this._request.data.log && this._service.log(this._request); } }, { key: "fetchData", value: function () { var _fetchData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var _this = this; var data, $this, handlers, client, loader, dataClient, getLoader; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: data = this._request.data; $this = this; handlers = this._factory.getHandlers(data, function (handler) { handler.prototype.retry = function (resolve) { return $this.retry(resolve); }; }); _context.next = 5; return this.resolveHandlers(data, handlers, 'before'); case 5: client = this._factory.getClient(data); loader = this._factory.getLoader(data); dataClient = data.stubData || client[data.method](data); getLoader = function getLoader() { var _this$_service; loader && (loader.pending = (_this$_service = _this._service) === null || _this$_service === void 0 ? void 0 : _this$_service.getLog().filter(function (r) { return r.data.useLoader && !r.data.statusCode; }).length); return loader; }; return _context.abrupt("return", { data: data, client: client, handlers: handlers, loader: loader, dataClient: dataClient, getLoader: getLoader }); case 10: case "end": return _context.stop(); } }, _callee, this); })); function fetchData() { return _fetchData.apply(this, arguments); } return fetchData; }() }, { key: "send", value: function () { var _send = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() { var _getLoader, _this2 = this; var _yield$this$fetchData, data, handlers, dataClient, getLoader, promise; return _regenerator["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return this.fetchData(); case 2: _yield$this$fetchData = _context5.sent; data = _yield$this$fetchData.data; handlers = _yield$this$fetchData.handlers; dataClient = _yield$this$fetchData.dataClient; getLoader = _yield$this$fetchData.getLoader; promise = dataClient instanceof Promise ? dataClient : new Promise(function (res) { return setTimeout(function () { return res(dataClient); }, 100); }); (_getLoader = getLoader()) === null || _getLoader === void 0 ? void 0 : _getLoader.start(); promise.then( /*#__PURE__*/function () { var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(response) { return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _this2.setResult(response); case 2: _context2.next = 4; return _this2.onResponse(response, handlers); case 4: data.statusCode || _this2.setStatusCode(response, 200); case 5: case "end": return _context2.stop(); } }, _callee2); })); return function (_x) { return _ref2.apply(this, arguments); }; }())["catch"]( /*#__PURE__*/function () { var _ref3 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(error) { return _regenerator["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _this2.setError(error); _context3.next = 3; return _this2.handleError(error, handlers); case 3: data.statusCode || _this2.setStatusCode(error, 500); case 4: case "end": return _context3.stop(); } }, _callee3); })); return function (_x2) { return _ref3.apply(this, arguments); }; }())["finally"]( /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() { var _getLoader2; var retry; return _regenerator["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: (_getLoader2 = getLoader()) === null || _getLoader2 === void 0 ? void 0 : _getLoader2.end(); _context4.next = 3; return _this2.onFinally(handlers); case 3: data.statusCode || _this2.setStatusCode(null, 200); retry = _this2._retry instanceof Function ? _this2._retry() : _this2.retry(); retry === false && _this2._request._resolve(); case 6: case "end": return _context4.stop(); } }, _callee4); }))); case 10: case "end": return _context5.stop(); } }, _callee5, this); })); function send() { return _send.apply(this, arguments); } return send; }() }, { key: "fetch", value: function fetch() { var _this3 = this; var request = this._request; if (request._fetch instanceof Promise) return request._fetch; request._fetch = new Promise(function (resolve) { return request._resolve = function () { return resolve(request.data.result); }; }); request.methods.forEach(function (method) { return request[method] instanceof Function && (request._fetch[method] = function (arg) { request.resolveMethods.includes(method) ? arg instanceof Function || (arg = function arg() {}) : request[method](arg); _this3._resolve.push({ method: method, arg: arg }); request.chain.push({ method: method, args: [arg] }); return request._fetch; }); }); return request._fetch; } }, { key: "resolveHandlers", value: function () { var _resolveHandlers = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee8(data, handlers, action) { return _regenerator["default"].wrap(function _callee8$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: return _context8.abrupt("return", new Promise( /*#__PURE__*/function () { var _ref5 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(resolve) { var source, result, fetch; return _regenerator["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: source = (0, _toConsumableArray2["default"])(handlers); result = undefined; fetch = /*#__PURE__*/function () { var _ref6 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6() { return _regenerator["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: if (!(source.length === 0)) { _context6.next = 2; break; } return _context6.abrupt("return", resolve(result)); case 2: source[0][action] instanceof Function && (result = source[0][action](data)); _context6.t0 = result instanceof Promise; if (!_context6.t0) { _context6.next = 8; break; } _context6.next = 7; return result; case 7: result = _context6.sent; case 8: source.shift(); _context6.next = 11; return fetch(); case 11: case "end": return _context6.stop(); } }, _callee6); })); return function fetch() { return _ref6.apply(this, arguments); }; }(); _context7.next = 5; return fetch(); case 5: case "end": return _context7.stop(); } }, _callee7); })); return function (_x6) { return _ref5.apply(this, arguments); }; }())); case 1: case "end": return _context8.stop(); } }, _callee8); })); function resolveHandlers(_x3, _x4, _x5) { return _resolveHandlers.apply(this, arguments); } return resolveHandlers; }() }, { key: "resolveRequest", value: function resolveRequest(methods, data, handlers) { var _this4 = this; return new Promise( /*#__PURE__*/function () { var _ref7 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee10(resolve) { var source, fetch; return _regenerator["default"].wrap(function _callee10$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: source = _this4._resolve.filter(function (r) { return methods.includes(r.method); }); if (!(source.length === 0)) { _context10.next = 3; break; } return _context10.abrupt("return", resolve(false)); case 3: fetch = /*#__PURE__*/function () { var _ref8 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee9(data) { return _regenerator["default"].wrap(function _callee9$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: if (!(source.length === 0)) { _context9.next = 2; break; } return _context9.abrupt("return", resolve(true)); case 2: _context9.prev = 2; _context9.t0 = source[0].arg instanceof Function; if (!_context9.t0) { _context9.next = 7; break; } _context9.next = 7; return _this4.setResult(source[0].arg(data)); case 7: _context9.next = 13; break; case 9: _context9.prev = 9; _context9.t1 = _context9["catch"](2); _context9.next = 13; return _this4.handleError(_context9.t1, handlers); case 13: source.shift(); _context9.next = 16; return fetch(_this4._request.data.result); case 16: case "end": return _context9.stop(); } }, _callee9, null, [[2, 9]]); })); return function fetch(_x8) { return _ref8.apply(this, arguments); }; }(); _context10.next = 6; return fetch(data); case 6: case "end": return _context10.stop(); } }, _callee10); })); return function (_x7) { return _ref7.apply(this, arguments); }; }()); } }, { key: "handleError", value: function handleError(error, handlers) { var _this5 = this; return new Promise( /*#__PURE__*/function () { var _ref9 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee12(resolve) { var onCatch, fetch; return _regenerator["default"].wrap(function _callee12$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: _context12.next = 2; return _this5.resolveHandlers(error, handlers, 'afterCatch'); case 2: onCatch = _this5._resolve.filter(function (r) { return r.method === 'catch'; }); if (!(onCatch.length === 0)) { _context12.next = 8; break; } _this5.setError(error); _context12.next = 7; return _this5.setResult(_this5.resolveHandlers(error, handlers, 'onCatch')); case 7: return _context12.abrupt("return", resolve()); case 8: fetch = /*#__PURE__*/function () { var _ref10 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee11(error) { return _regenerator["default"].wrap(function _callee11$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: if (!(onCatch.length === 0)) { _context11.next = 2; break; } return _context11.abrupt("return", resolve()); case 2: _context11.prev = 2; _this5.setError(error); _context11.t0 = onCatch[0].arg instanceof Function; if (!_context11.t0) { _context11.next = 8; break; } _context11.next = 8; return _this5.setResult(onCatch[0].arg(error)); case 8: _context11.next = 16; break; case 10: _context11.prev = 10; _context11.t1 = _context11["catch"](2); _this5.setError(_context11.t1); _context11.next = 15; return _this5.setResult(_this5.resolveHandlers(_context11.t1, handlers, 'onCatch')); case 15: error = _context11.t1; case 16: onCatch.shift(); _context11.next = 19; return fetch(error); case 19: case "end": return _context11.stop(); } }, _callee11, null, [[2, 10]]); })); return function fetch(_x10) { return _ref10.apply(this, arguments); }; }(); _context12.next = 11; return fetch(error); case 11: case "end": return _context12.stop(); } }, _callee12); })); return function (_x9) { return _ref9.apply(this, arguments); }; }()); } }, { key: "setError", value: function setError(error) { this._request.data.dataError = error; } }, { key: "onResponse", value: function () { var _onResponse = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee13(response, handlers) { var _response, isSuccess, isError, resolved, _resolved; return _regenerator["default"].wrap(function _callee13$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: _context13.next = 2; return this.resolveHandlers(response, handlers, 'after'); case 2: _response = _objectSpread({}, response); _context13.next = 5; return this.resolveHandlers(_response, handlers, 'isSuccess'); case 5: isSuccess = _context13.sent; _context13.next = 8; return this.resolveHandlers(_response, handlers, 'isError'); case 8: isError = _context13.sent; if (!(isSuccess === true && this._resolve.map(function (i) { return i.method; }).includes('success'))) { _context13.next = 19; break; } _context13.next = 12; return this.resolveRequest(['success'], response, handlers); case 12: resolved = _context13.sent; _context13.t0 = resolved; if (_context13.t0) { _context13.next = 17; break; } _context13.next = 17; return this.setResult(this.resolveHandlers(response, handlers, 'onSuccess')); case 17: _context13.next = 32; break; case 19: if (!(isError === true && this._resolve.map(function (i) { return i.method; }).includes('error'))) { _context13.next = 29; break; } _context13.next = 22; return this.resolveRequest(['error'], response, handlers); case 22: _resolved = _context13.sent; _context13.t1 = _resolved; if (_context13.t1) { _context13.next = 27; break; } _context13.next = 27; return this.setResult(this.resolveHandlers(response, handlers, 'onError')); case 27: _context13.next = 32; break; case 29: if (!((isSuccess === true || isSuccess === undefined) && (isError === undefined || isError === false))) { _context13.next = 32; break; } _context13.next = 32; return this.resolveRequest(['then'], response, handlers); case 32: case "end": return _context13.stop(); } }, _callee13, this); })); function onResponse(_x11, _x12) { return _onResponse.apply(this, arguments); } return onResponse; }() }, { key: "onFinally", value: function () { var _onFinally = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee14(handlers) { var request, resolved; return _regenerator["default"].wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: request = this._request; _context14.next = 3; return this.resolveHandlers(request.data, handlers, 'afterFinally'); case 3: _context14.next = 5; return this.resolveRequest(['finally'], request.data, handlers); case 5: resolved = _context14.sent; _context14.t0 = resolved; if (_context14.t0) { _context14.next = 10; break; } _context14.next = 10; return this.setResult(this.resolveHandlers(request.data, handlers, 'onFinally')); case 10: case "end": return _context14.stop(); } }, _callee14, this); })); function onFinally(_x13) { return _onFinally.apply(this, arguments); } return onFinally; }() }, { key: "setResult", value: function () { var _setResult = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee15(result) { var data; return _regenerator["default"].wrap(function _callee15$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: if (!(result === undefined)) { _context15.next = 2; break; } return _context15.abrupt("return"); case 2: _context15.next = 4; return result; case 4: data = _context15.sent; if (data !== undefined) this._request.data.result = data; case 6: case "end": return _context15.stop(); } }, _callee15, this); })); function setResult(_x14) { return _setResult.apply(this, arguments); } return setResult; }() }, { key: "setStatusCode", value: function setStatusCode(source, def) { def = Number.isNaN(+def) ? 0 : +def; this._request.data.statusCode = Number.isNaN(+(source === null || source === void 0 ? void 0 : source.status)) ? def : +source.status; } }, { key: "retry", value: function retry(resolve) { var _this6 = this; var request = this._request; var retry = function retry() { new _this6._service._retry({ request: request, service: _this6._service, resolve: resolve }).retry(); }; if (resolve !== undefined) return this._retry = retry; if (request.data.retry || request.data.retryOnCatch) return retry(); return false; } }]); return RequestManager; }(); exports.RequestManager = RequestManager;