UNPKG

browser-sdk

Version:

javascript SDK for the lightelligence-platform

283 lines (221 loc) 8.89 kB
"use strict"; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var OIDC = _interopRequireWildcard(require("oidc-client")); /** * @typedef jsonService * @property {Function} postForm * @property {XMLHttpRequest} _XMLHttpRequest * @property {Array<string>} _contentTypes */ /** * @typedef jsonServicePostFormPayload * @property {Object<string>} headers */ /** * @typedef tokenClient * @property {jsonService} _jsonService * @property {Function} exchangeRefreshToken */ /** * User Manager * * Just a wrapper around OIDC.UserManager * https://github.com/IdentityModel/oidc-client-js/blob/dev/src/UserManager.js */ var UserManager = /*#__PURE__*/ function (_OIDC$UserManager) { (0, _inherits2["default"])(UserManager, _OIDC$UserManager); function UserManager(settings) { var _this; (0, _classCallCheck2["default"])(this, UserManager); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(UserManager).call(this, settings)); /** * We access the tokenClient which is part of the UserManager * * https://github.com/IdentityModel/oidc-client-js/blob/dev/src/UserManager.js#L45 * * @type tokenClient */ var tokenClient = _this._tokenClient; // eslint-disable-line /** * We need to access the JSONService instance in order to modify the * XMLHTTPRequest to accept headers. * * https://github.com/IdentityModel/oidc-client-js/blob/dev/src/JsonService.js#L99 */ var jsonService = tokenClient._jsonService; // eslint-disable-line /** @type Array<string> */ var allowedContentTypes = jsonService._contentTypes; // eslint-disable-line /** * Checks if a content type is one of the allowed ones * * @param contentType * @returns {string} */ var isAllowedContentType = function isAllowedContentType(contentType) { return allowedContentTypes.find(function (item) { return contentType.startsWith(item); }); }; /** * Replaces postForm method of the jsonService. * https://github.com/IdentityModel/oidc-client-js/blob/dev/src/JsonService.js#L99 * * @param {string} url * @param {jsonServicePostFormPayload} payload */ jsonService.postForm = function (url, payload) { /** @type XMLHttpRequest */ var XMLHttpRequest = jsonService._XMLHttpRequest; // eslint-disable-line if (!url) { OIDC.Log.error('JsonService.postForm: No url passed'); throw new Error('url'); } OIDC.Log.debug('JsonService.postForm, url: ', url); return new Promise(function (resolve, reject) { var req = new XMLHttpRequest(); req.open('POST', url); req.onload = function () { OIDC.Log.debug('JsonService.postForm: HTTP response received, status', req.status); if (req.status !== 200 && req.status !== 400) { return reject(Error("".concat(req.statusText, " ( ").concat(req.status, " )"))); } var contentType = req.getResponseHeader('Content-Type'); if (!contentType || !isAllowedContentType(contentType)) { if (req.status === 200) { return reject(Error("Invalid response Content-Type: ".concat(contentType, ", from URL: ").concat(url))); } return reject(Error("".concat(req.statusText, " ( ").concat(req.status, " )"))); } try { var responsePayload = JSON.parse(req.responseText); if (req.status === 200) { return resolve(responsePayload); } if (responsePayload && responsePayload.error) { OIDC.Log.error('JsonService.postForm: Error from server: ', responsePayload.error); return reject(new Error(responsePayload.error)); } } catch (error) { OIDC.Log.error('JsonService.postForm: Error parsing JSON response', error.message); return reject(error); } return reject(Error("".concat(req.statusText, " ( ").concat(req.status, " )"))); }; req.onerror = function () { OIDC.Log.error('JsonService.postForm: network error'); reject(Error('Network Error')); }; var body = Object.entries(payload).filter(function (_ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 1), key = _ref2[0]; return key !== 'headers'; }).map(function (pair) { return pair.map(encodeURIComponent); }).map(function (_ref3) { var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2), key = _ref4[0], value = _ref4[1]; return "".concat(key, "=").concat(value); }).join('&'); req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); Object.entries(payload.headers || {}).forEach(function (_ref5) { var _ref6 = (0, _slicedToArray2["default"])(_ref5, 2), name = _ref6[0], value = _ref6[1]; req.setRequestHeader(name, value); }); req.send(body); }); }; return _this; } /** * Change the tenant id * * @param {string} tenantId Changes the users's tenant * @returns {Promise<User>} */ (0, _createClass2["default"])(UserManager, [{ key: "changeTenant", value: function () { var _changeTenant = (0, _asyncToGenerator2["default"])( /*#__PURE__*/ _regenerator["default"].mark(function _callee(tenantId) { var tokenClient, user, result; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: /** @type {tokenClient} */ tokenClient = this._tokenClient; // eslint-disable-line _context.next = 3; return this.getUser(); case 3: user = _context.sent; if (!(!user || !user.refresh_token)) { _context.next = 6; break; } throw new Error('changeTenant: No refresh token'); case 6: if (user.profile) { _context.next = 8; break; } throw new Error('changeTenant: No profile loaded for the user'); case 8: _context.next = 10; return tokenClient.exchangeRefreshToken({ refresh_token: user.refresh_token, headers: { 'X-Requested-With': tenantId } }); case 10: result = _context.sent; if (!(!result || !result.access_token || !result.refresh_token || !result.expires_in)) { _context.next = 13; break; } throw new Error('changeTenant: Error while changing tenant'); case 13: user.access_token = result.access_token; user.refresh_token = result.refresh_token; user.expires_in = result.expires_in; user.profile.tenant = tenantId; _context.next = 19; return this.storeUser(user); case 19: this.events.load(user); return _context.abrupt("return", user); case 21: case "end": return _context.stop(); } } }, _callee, this); })); function changeTenant(_x) { return _changeTenant.apply(this, arguments); } return changeTenant; }() }]); return UserManager; }(OIDC.UserManager); exports["default"] = UserManager;