@webex/webex-core 3.0.0-beta.27 → 3.0.0-beta.271

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -282,7 +282,7 @@ var Batcher = _webexPlugin.default.extend({
282
282
  fingerprintResponse: function fingerprintResponse(item) {
283
283
  throw new Error('fingerprintResponse() must be implemented');
284
284
  },
285
- version: "3.0.0-beta.27"
285
+ version: "3.0.0-beta.271"
286
286
  });
287
287
  var _default2 = Batcher;
288
288
  exports.default = _default2;
@@ -68,6 +68,22 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
68
68
  }
69
69
  return Boolean(this.supertoken && this.supertoken.canRefresh);
70
70
  }
71
+ },
72
+ isUnverifiedGuest: {
73
+ deps: ['supertoken'],
74
+ /**
75
+ * Returns true if the user is an unverified guest
76
+ * @returns {boolean}
77
+ */
78
+ fn: function fn() {
79
+ var isGuest = false;
80
+ try {
81
+ isGuest = JSON.parse(_common.base64.decode(this.supertoken.access_token.split('.')[1])).user_type === 'guest';
82
+ } catch (_unused) {
83
+ /* the non-guest token is formatted differently so catch is expected */
84
+ }
85
+ return isGuest;
86
+ }
71
87
  }
72
88
  },
73
89
  props: {
@@ -519,7 +535,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
519
535
  this.refresh();
520
536
  }
521
537
  },
522
- version: "3.0.0-beta.27"
538
+ version: "3.0.0-beta.271"
523
539
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "getUserToken", [_dec, _dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "getUserToken"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "invalidate", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "invalidate"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec5, _dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj)), _obj)));
524
540
  var _default = Credentials;
525
541
  exports.default = _default;
@@ -1 +1 @@
1
- {"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection,\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType,\n },\n\n derived: {\n canAuthorize: {\n deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n },\n },\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop,\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean',\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean',\n },\n refreshTimer: {\n default: undefined,\n type: 'any',\n },\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n } else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info('credentials: attempting to retrieve the OrgId from token');\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n } catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n } catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope).catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex\n .request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n })\n ).then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n } else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n } catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(\n tokens.map((token) =>\n this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token\n .revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })\n )\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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"}
1
+ {"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","isUnverifiedGuest","isGuest","JSON","parse","base64","decode","access_token","split","user_type","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","realm","fields","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection,\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType,\n },\n\n derived: {\n canAuthorize: {\n deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n },\n },\n isUnverifiedGuest: {\n deps: ['supertoken'],\n /**\n * Returns true if the user is an unverified guest\n * @returns {boolean}\n */\n fn() {\n let isGuest = false;\n try {\n isGuest =\n JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===\n 'guest';\n } catch {\n /* the non-guest token is formatted differently so catch is expected */\n }\n\n return isGuest;\n },\n },\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop,\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean',\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean',\n },\n refreshTimer: {\n default: undefined,\n type: 'any',\n },\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n } else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info('credentials: attempting to retrieve the OrgId from token');\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n } catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n } catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope).catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex\n .request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n })\n ).then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n } else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n } catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(\n tokens.map((token) =>\n this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token\n .revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })\n )\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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"}
@@ -527,7 +527,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
527
527
  return res.body;
528
528
  });
529
529
  },
530
- version: "3.0.0-beta.27"
530
+ version: "3.0.0-beta.271"
531
531
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj)), _obj)));
532
532
  var _default = Token;
533
533
  exports.default = _default;
@@ -970,7 +970,7 @@ var Services = _webexPlugin.default.extend({
970
970
  }
971
971
  });
972
972
  },
973
- version: "3.0.0-beta.27"
973
+ version: "3.0.0-beta.271"
974
974
  });
975
975
  /* eslint-enable no-underscore-dangle */
976
976
  var _default = Services;
@@ -57,7 +57,7 @@ var Logger = _webexPlugin.default.extend({
57
57
  info: wrapConsoleMethod('info'),
58
58
  debug: wrapConsoleMethod('debug'),
59
59
  trace: wrapConsoleMethod('trace'),
60
- version: "3.0.0-beta.27"
60
+ version: "3.0.0-beta.271"
61
61
  });
62
62
  (0, _webexCore.registerPlugin)('logger', Logger);
63
63
  var _default = Logger;
@@ -99,7 +99,7 @@ var MAX_FILE_SIZE_IN_MB = 2048;
99
99
  * @class
100
100
  */
101
101
  var WebexCore = _ampersandState.default.extend((_obj = {
102
- version: "3.0.0-beta.27",
102
+ version: "3.0.0-beta.271",
103
103
  children: {
104
104
  internal: _webexInternalCore.default
105
105
  },
@@ -381,6 +381,11 @@ var WebexCore = _ampersandState.default.extend((_obj = {
381
381
  json: true,
382
382
  interceptors: ints
383
383
  });
384
+ this.prepareFetchOptions = (0, _httpCore.protoprepareFetchOptions)({
385
+ json: true,
386
+ interceptors: ints
387
+ });
388
+ this.setTimingsAndFetch = _httpCore.setTimingsAndFetch;
384
389
  var sessionId = "".concat((0, _get2.default)(this, 'config.trackingIdPrefix', 'webex-js-sdk'), "_").concat((0, _get2.default)(this, 'config.trackingIdBase', _uuid.default.v4()));
385
390
  if ((0, _get2.default)(this, 'config.trackingIdSuffix')) {
386
391
  sessionId += "_".concat((0, _get2.default)(this, 'config.trackingIdSuffix'));
@@ -636,7 +641,7 @@ var WebexCore = _ampersandState.default.extend((_obj = {
636
641
  });
637
642
  }
638
643
  }, ((0, _applyDecoratedDescriptor2.default)(_obj, "_uploadPhaseUpload", [_common.retry], (0, _getOwnPropertyDescriptor.default)(_obj, "_uploadPhaseUpload"), _obj)), _obj));
639
- WebexCore.version = "3.0.0-beta.27";
644
+ WebexCore.version = "3.0.0-beta.271";
640
645
  (0, _webexInternalCorePluginMixin.default)(_webexInternalCore.default, _config.default, interceptors);
641
646
  (0, _webexCorePluginMixin.default)(WebexCore, _config.default, interceptors);
642
647
  var _default = WebexCore;
@@ -1 +1 @@
1
- {"version":3,"names":["interceptors","WebexTrackingIdInterceptor","create","RequestEventInterceptor","RateLimitInterceptor","RequestLoggerInterceptor","process","env","ENABLE_NETWORK_LOGGING","ENABLE_VERBOSE_NETWORK_LOGGING","undefined","ResponseLoggerInterceptor","RequestTimingInterceptor","ServiceInterceptor","UserAgentInterceptor","WebexUserAgentInterceptor","AuthInterceptor","KmsDryErrorInterceptor","PayloadTransformerInterceptor","ConversationInterceptor","RedirectInterceptor","HttpStatusInterceptor","error","WebexHttpError","NetworkTimingInterceptor","EmbargoInterceptor","DefaultOptionsInterceptor","preInterceptors","postInterceptors","MAX_FILE_SIZE_IN_MB","WebexCore","AmpState","extend","version","children","internal","WebexInternalCore","constructor","attrs","options","credentials","supertoken","access_token","forEach","path","val","bearerValidator","trim","derived","boundedStorage","deps","fn","makeWebexStore","unboundedStorage","ready","loaded","_children","reduce","name","session","config","type","default","request","setOnce","sessionId","refresh","transform","direction","object","predicates","payloadTransformer","filter","p","ctx","webex","all","map","test","then","shouldTransform","extract","target","data","d","Boolean","promise","alias","applyNamedTransform","resolve","rest","unshift","args","transforms","tx","getWindow","window","initialize","trigger","onLoaded","stopListening","nextTick","listenToAndRun","onReady","prototype","key","listenTo","addInterceptor","ints","interceptor","push","includes","requestDefaults","json","uuid","v4","setConfig","newConfig","token","split","length","console","warn","replace","info","inspect","depth","util","serialize","props","logout","refresh_token","onBeforeLogout","reverse","plugin","catch","err","logger","clear","invalidate","authorization","measure","metrics","sendUnstructured","upload","file","reject","Error","phases","finalize","method","body","uploadProtocol","withCredentials","headers","shunt","EventEmitter","_uploadPhaseInitialize","_uploadPhaseUpload","transferEvents","_uploadPhaseFinalize","res","proxyEvents","debug","fileUploadSizeLimitInBytes","fileUploadSizeLimit","currentFileSizeInBytes","byteLength","_uploadAbortSession","_uploadApplySession","response","url","abortErrorDetails","fileUploadSizeLimitInMB","message","opts","phaseOptions","phaseKey","startsWith","substr","NODE_ENV","on","event","total","retry","mixinWebexInternalCorePlugins","mixinWebexCorePlugins","registerPlugin","registerInternalPlugin"],"sources":["webex-core.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\nimport util from 'util';\n\nimport {proxyEvents, retry, transferEvents} from '@webex/common';\nimport {HttpStatusInterceptor, defaults as requestDefaults} from '@webex/http-core';\nimport {defaultsDeep, get, isFunction, isString, last, merge, omit, set, unset} from 'lodash';\nimport AmpState from 'ampersand-state';\nimport uuid from 'uuid';\n\nimport AuthInterceptor from './interceptors/auth';\nimport NetworkTimingInterceptor from './interceptors/network-timing';\nimport PayloadTransformerInterceptor from './interceptors/payload-transformer';\nimport RedirectInterceptor from './interceptors/redirect';\nimport RequestEventInterceptor from './interceptors/request-event';\nimport RequestLoggerInterceptor from './interceptors/request-logger';\nimport RequestTimingInterceptor from './interceptors/request-timing';\nimport ResponseLoggerInterceptor from './interceptors/response-logger';\nimport WebexHttpError from './lib/webex-http-error';\nimport UserAgentInterceptor from './interceptors/user-agent';\nimport WebexTrackingIdInterceptor from './interceptors/webex-tracking-id';\nimport WebexUserAgentInterceptor from './interceptors/webex-user-agent';\nimport RateLimitInterceptor from './interceptors/rate-limit';\nimport EmbargoInterceptor from './interceptors/embargo';\nimport DefaultOptionsInterceptor from './interceptors/default-options';\nimport config from './config';\nimport {makeWebexStore} from './lib/storage';\nimport mixinWebexCorePlugins from './lib/webex-core-plugin-mixin';\nimport mixinWebexInternalCorePlugins from './lib/webex-internal-core-plugin-mixin';\nimport WebexInternalCore from './webex-internal-core';\n\n// TODO replace the Interceptor.create with Reflect.construct (\n// Interceptor.create exists because new was really hard to call on an array of\n// constructors)\nconst interceptors = {\n WebexTrackingIdInterceptor: WebexTrackingIdInterceptor.create,\n RequestEventInterceptor: RequestEventInterceptor.create,\n RateLimitInterceptor: RateLimitInterceptor.create,\n /* eslint-disable no-extra-parens */\n RequestLoggerInterceptor:\n process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING\n ? RequestLoggerInterceptor.create\n : undefined,\n ResponseLoggerInterceptor:\n process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING\n ? ResponseLoggerInterceptor.create\n : undefined,\n /* eslint-enable no-extra-parens */\n RequestTimingInterceptor: RequestTimingInterceptor.create,\n ServiceInterceptor: undefined,\n UserAgentInterceptor: UserAgentInterceptor.create,\n WebexUserAgentInterceptor: WebexUserAgentInterceptor.create,\n AuthInterceptor: AuthInterceptor.create,\n KmsDryErrorInterceptor: undefined,\n PayloadTransformerInterceptor: PayloadTransformerInterceptor.create,\n ConversationInterceptor: undefined,\n RedirectInterceptor: RedirectInterceptor.create,\n HttpStatusInterceptor() {\n return HttpStatusInterceptor.create({\n error: WebexHttpError,\n });\n },\n NetworkTimingInterceptor: NetworkTimingInterceptor.create,\n EmbargoInterceptor: EmbargoInterceptor.create,\n DefaultOptionsInterceptor: DefaultOptionsInterceptor.create,\n};\n\nconst preInterceptors = [\n 'ResponseLoggerInterceptor',\n 'RequestTimingInterceptor',\n 'RequestEventInterceptor',\n 'WebexTrackingIdInterceptor',\n 'RateLimitInterceptor',\n];\n\nconst postInterceptors = [\n 'HttpStatusInterceptor',\n 'NetworkTimingInterceptor',\n 'EmbargoInterceptor',\n 'RequestLoggerInterceptor',\n 'RateLimitInterceptor',\n];\n\nconst MAX_FILE_SIZE_IN_MB = 2048;\n\n/**\n * @class\n */\nconst WebexCore = AmpState.extend({\n version: PACKAGE_VERSION,\n\n children: {\n internal: WebexInternalCore,\n },\n\n constructor(attrs = {}, options) {\n if (typeof attrs === 'string') {\n attrs = {\n credentials: {\n supertoken: {\n // eslint-disable-next-line camelcase\n access_token: attrs,\n },\n },\n };\n } else {\n // Reminder: order is important here\n [\n 'credentials.authorization',\n 'authorization',\n 'credentials.supertoken.supertoken',\n 'supertoken',\n 'access_token',\n 'credentials.authorization.supertoken',\n ].forEach((path) => {\n const val = get(attrs, path);\n\n if (val) {\n unset(attrs, path);\n set(attrs, 'credentials.supertoken', val);\n }\n });\n\n ['credentials', 'credentials.authorization'].forEach((path) => {\n const val = get(attrs, path);\n\n if (typeof val === 'string') {\n unset(attrs, path);\n set(attrs, 'credentials.supertoken', val);\n }\n });\n\n if (typeof get(attrs, 'credentials.access_token') === 'string') {\n // Send access_token to get validated and corrected and then set it\n set(\n attrs,\n 'credentials.access_token',\n this.bearerValidator(get(attrs, 'credentials.access_token').trim())\n );\n\n set(attrs, 'credentials.supertoken', attrs.credentials);\n }\n }\n\n return Reflect.apply(AmpState, this, [attrs, options]);\n },\n\n derived: {\n boundedStorage: {\n deps: [],\n fn() {\n return makeWebexStore('bounded', this);\n },\n },\n unboundedStorage: {\n deps: [],\n fn() {\n return makeWebexStore('unbounded', this);\n },\n },\n ready: {\n deps: ['loaded', 'internal.ready'],\n fn() {\n return (\n this.loaded &&\n Object.keys(this._children).reduce(\n (ready, name) => ready && this[name] && this[name].ready !== false,\n true\n )\n );\n },\n },\n },\n\n session: {\n config: {\n type: 'object',\n },\n /**\n * When true, indicates that the initial load from the storage layer is\n * complete\n * @instance\n * @memberof WebexCore\n * @type {boolean}\n */\n loaded: {\n default: false,\n type: 'boolean',\n },\n request: {\n setOnce: true,\n // It's supposed to be a function, but that's not a type defined in\n // Ampersand\n type: 'any',\n },\n sessionId: {\n setOnce: true,\n type: 'string',\n },\n },\n\n /**\n * @instance\n * @memberof WebexCore\n * @param {[type]} args\n * @returns {[type]}\n */\n refresh(...args) {\n return this.credentials.refresh(...args);\n },\n\n /**\n * Applies the directionally appropriate transforms to the specified object\n * @param {string} direction\n * @param {Object} object\n * @returns {Promise}\n */\n transform(direction, object) {\n const predicates = this.config.payloadTransformer.predicates.filter(\n (p) => !p.direction || p.direction === direction\n );\n const ctx = {\n webex: this,\n };\n\n return Promise.all(\n predicates.map((p) =>\n p.test(ctx, object).then((shouldTransform) => {\n if (!shouldTransform) {\n return undefined;\n }\n\n return (\n p\n .extract(object)\n // eslint-disable-next-line max-nested-callbacks\n .then((target) => ({\n name: p.name,\n target,\n }))\n );\n })\n )\n )\n .then((data) =>\n data\n .filter((d) => Boolean(d))\n // eslint-disable-next-line max-nested-callbacks\n .reduce(\n (promise, {name, target, alias}) =>\n promise.then(() => {\n if (alias) {\n return this.applyNamedTransform(direction, alias, target);\n }\n\n return this.applyNamedTransform(direction, name, target);\n }),\n Promise.resolve()\n )\n )\n .then(() => object);\n },\n\n /**\n * Applies the directionally appropriate transform to the specified parameters\n * @param {string} direction\n * @param {Object} ctx\n * @param {string} name\n * @returns {Promise}\n */\n applyNamedTransform(direction, ctx, name, ...rest) {\n if (isString(ctx)) {\n rest.unshift(name);\n name = ctx;\n ctx = {\n webex: this,\n transform: (...args) => this.applyNamedTransform(direction, ctx, ...args),\n };\n }\n\n const transforms = ctx.webex.config.payloadTransformer.transforms.filter(\n (tx) => tx.name === name && (!tx.direction || tx.direction === direction)\n );\n\n // too many implicit returns on the same line is difficult to interpret\n // eslint-disable-next-line arrow-body-style\n return transforms\n .reduce(\n (promise, tx) =>\n promise.then(() => {\n if (tx.alias) {\n return ctx.transform(tx.alias, ...rest);\n }\n\n return Promise.resolve(tx.fn(ctx, ...rest));\n }),\n Promise.resolve()\n )\n .then(() => last(rest));\n },\n\n /**\n * @private\n * @returns {Window}\n */\n getWindow() {\n // eslint-disable-next-line\n return window;\n },\n\n /**\n * Initializer\n *\n * @emits WebexCore#loaded\n * @emits WebexCore#ready\n * @instance\n * @memberof WebexCore\n * @param {Object} attrs\n * @returns {WebexCore}\n */\n initialize(attrs = {}) {\n this.config = merge({}, config, attrs.config);\n\n // There's some unfortunateness with the way {@link AmpersandState#children}\n // get initialized. We'll fire the change:config event so that\n // {@link WebexPlugin#initialize()} can use\n // `this.listenToOnce(parent, 'change:config', () => {});` to act on config\n // during initialization\n this.trigger('change:config');\n\n const onLoaded = () => {\n if (this.loaded) {\n /**\n * Fires when all data has been loaded from the storage layer\n * @event loaded\n * @instance\n * @memberof WebexCore\n */\n this.trigger('loaded');\n\n this.stopListening(this, 'change:loaded', onLoaded);\n }\n };\n\n // This needs to run on nextTick or we'll never be able to wire up listeners\n process.nextTick(() => {\n this.listenToAndRun(this, 'change:loaded', onLoaded);\n });\n\n const onReady = () => {\n if (this.ready) {\n /**\n * Fires when all plugins have fully initialized\n * @event ready\n * @instance\n * @memberof WebexCore\n */\n this.trigger('ready');\n\n this.stopListening(this, 'change:ready', onReady);\n }\n };\n\n // This needs to run on nextTick or we'll never be able to wire up listeners\n process.nextTick(() => {\n this.listenToAndRun(this, 'change:ready', onReady);\n });\n\n // Make nested events propagate in a consistent manner\n Object.keys(this.constructor.prototype._children).forEach((key) => {\n this.listenTo(this[key], 'change', (...args) => {\n args.unshift(`change:${key}`);\n this.trigger(...args);\n });\n });\n\n const addInterceptor = (ints, key) => {\n const interceptor = interceptors[key];\n\n if (!isFunction(interceptor)) {\n return ints;\n }\n\n ints.push(Reflect.apply(interceptor, this, []));\n\n return ints;\n };\n\n let ints = [];\n\n ints = preInterceptors.reduce(addInterceptor, ints);\n ints = Object.keys(interceptors)\n .filter((key) => !(preInterceptors.includes(key) || postInterceptors.includes(key)))\n .reduce(addInterceptor, ints);\n ints = postInterceptors.reduce(addInterceptor, ints);\n\n this.request = requestDefaults({\n json: true,\n interceptors: ints,\n });\n\n let sessionId = `${get(this, 'config.trackingIdPrefix', 'webex-js-sdk')}_${get(\n this,\n 'config.trackingIdBase',\n uuid.v4()\n )}`;\n\n if (get(this, 'config.trackingIdSuffix')) {\n sessionId += `_${get(this, 'config.trackingIdSuffix')}`;\n }\n\n this.sessionId = sessionId;\n },\n\n /**\n * setConfig\n *\n * Allows updating config\n *\n * @instance\n * @memberof WebexCore\n * @param {Object} newConfig\n * @returns {null}\n */\n setConfig(newConfig = {}) {\n this.config = merge({}, this.config, newConfig);\n },\n\n /**\n *\n * Check if access token is correctly formated and correct if it's not\n * Warn user if token string has errors in it\n * @param {string} token\n * @returns {string}\n */\n bearerValidator(token) {\n if (token.includes('Bearer') && token.split(' ').length - 1 === 0) {\n console.warn(\n `Your access token does not have a space between 'Bearer' and the token, please add a space to it or replace it with this already fixed version:\\n\\n${token\n .replace('Bearer', 'Bearer ')\n .replace(/\\s+/g, ' ')}`\n );\n console.info(\n \"Tip: You don't need to add 'Bearer' to the access_token field. The token by itself is fine\"\n );\n\n return token.replace('Bearer', 'Bearer ').replace(/\\s+/g, ' ');\n }\n // Allow elseIf return\n // eslint-disable-next-line no-else-return\n else if (token.split(' ').length - 1 > 1) {\n console.warn(\n `Your access token has ${\n token.split(' ').length - 2\n } too many spaces, please use this format:\\n\\n${token.replace(/\\s+/g, ' ')}`\n );\n console.info(\n \"Tip: You don't need to add 'Bearer' to the access_token field, the token by itself is fine\"\n );\n\n return token.replace(/\\s+/g, ' ');\n }\n\n return token.replace(/\\s+/g, ' '); // Clean it anyway (just in case)\n },\n\n /**\n * @instance\n * @memberof WebexPlugin\n * @param {number} depth\n * @private\n * @returns {Object}\n */\n inspect(depth) {\n return util.inspect(\n omit(\n this.serialize({\n props: true,\n session: true,\n derived: true,\n }),\n 'boundedStorage',\n 'unboundedStorage',\n 'request',\n 'config'\n ),\n {depth}\n );\n },\n\n /**\n * Invokes all `onBeforeLogout` handlers in the scope of their plugin, clears\n * all stores, and revokes the access token\n * Note: If you're using the sdk in a server environment, you may be more\n * interested in {@link `webex.internal.mercury.disconnect()`| Mercury#disconnect()}\n * and {@link `webex.internal.device.unregister()`|Device#unregister()}\n * or {@link `webex.phone.unregister()`|Phone#unregister}\n * @instance\n * @memberof WebexCore\n * @param {Object} options Passed as the first argument to all\n * `onBeforeLogout` handlers\n * @returns {Promise}\n */\n logout(options, ...rest) {\n // prefer the refresh token, but for clients that don't have one, fallback\n // to the access token\n const token =\n this.credentials.supertoken &&\n (this.credentials.supertoken.refresh_token || this.credentials.supertoken.access_token);\n\n options = Object.assign({token}, options);\n\n // onBeforeLogout should be executed in the opposite order in which handlers\n // were registered. In that way, wdm unregister() will be above mercury\n // disconnect(), but disconnect() will execute first.\n // eslint-disable-next-line arrow-body-style\n return this.config.onBeforeLogout\n .reverse()\n .reduce(\n (promise, {plugin, fn}) =>\n promise.then(() => {\n return (\n Promise.resolve(\n Reflect.apply(fn, this[plugin] || this.internal[plugin], [options, ...rest])\n )\n // eslint-disable-next-line max-nested-callbacks\n .catch((err) => {\n this.logger.warn(`onBeforeLogout from plugin ${plugin}: failed`, err);\n })\n );\n }),\n Promise.resolve()\n )\n .then(() => Promise.all([this.boundedStorage.clear(), this.unboundedStorage.clear()]))\n .then(() => this.credentials.invalidate(...rest))\n .then(\n () =>\n this.authorization &&\n this.authorization.logout &&\n this.authorization.logout(options, ...rest)\n )\n .then(() => this.trigger('client:logout'));\n },\n\n /**\n * General purpose wrapper to submit metrics via the metrics plugin (if the\n * metrics plugin is installed)\n * @instance\n * @memberof WebexCore\n * @returns {Promise}\n */\n measure(...args) {\n if (this.metrics) {\n return this.metrics.sendUnstructured(...args);\n }\n\n return Promise.resolve();\n },\n\n async upload(options) {\n if (!options.file) {\n return Promise.reject(new Error('`options.file` is required'));\n }\n\n options.phases = options.phases || {};\n options.phases.initialize = options.phases.initialize || {};\n options.phases.upload = options.phases.upload || {};\n options.phases.finalize = options.phases.finalize || {};\n\n defaultsDeep(\n options.phases.initialize,\n {\n method: 'POST',\n body: {\n uploadProtocol: 'content-length',\n },\n },\n omit(options, 'file', 'phases')\n );\n\n defaultsDeep(options.phases.upload, {\n method: 'PUT',\n json: false,\n withCredentials: false,\n body: options.file,\n headers: {\n 'x-trans-id': uuid.v4(),\n authorization: undefined,\n },\n });\n\n defaultsDeep(\n options.phases.finalize,\n {\n method: 'POST',\n },\n omit(options, 'file', 'phases')\n );\n\n const shunt = new EventEmitter();\n\n const promise = this._uploadPhaseInitialize(options)\n .then(() => {\n const p = this._uploadPhaseUpload(options);\n\n transferEvents('progress', p, shunt);\n\n return p;\n })\n .then((...args) => this._uploadPhaseFinalize(options, ...args))\n .then((res) => ({...res.body, ...res.headers}));\n\n proxyEvents(shunt, promise);\n\n return promise;\n },\n\n _uploadPhaseInitialize: function _uploadPhaseInitialize(options) {\n this.logger.debug('client: initiating upload session');\n\n return this.request(options.phases.initialize)\n .then((...args) => {\n const fileUploadSizeLimitInBytes =\n (args[0].body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB) * 1024 * 1024;\n const currentFileSizeInBytes = options.file.byteLength;\n\n if (fileUploadSizeLimitInBytes && fileUploadSizeLimitInBytes < currentFileSizeInBytes) {\n return this._uploadAbortSession(currentFileSizeInBytes, ...args);\n }\n\n return this._uploadApplySession(options, ...args);\n })\n .then((res) => {\n this.logger.debug('client: initiated upload session');\n\n return res;\n });\n },\n\n _uploadAbortSession(currentFileSizeInBytes, response) {\n this.logger.debug('client: deleting uploaded file');\n\n return this.request({\n method: 'DELETE',\n url: response.body.url,\n headers: response.options.headers,\n }).then(() => {\n this.logger.debug('client: deleting uploaded file complete');\n\n const abortErrorDetails = {\n currentFileSizeInBytes,\n fileUploadSizeLimitInMB: response.body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB,\n message: 'file-upload-size-limit-enabled',\n };\n\n return Promise.reject(new Error(`${JSON.stringify(abortErrorDetails)}`));\n });\n },\n\n _uploadApplySession(options, res) {\n const session = res.body;\n\n ['upload', 'finalize'].reduce((opts, key) => {\n opts[key] = Object.keys(opts[key]).reduce((phaseOptions, phaseKey) => {\n if (phaseKey.startsWith('$')) {\n phaseOptions[phaseKey.substr(1)] = phaseOptions[phaseKey](session);\n Reflect.deleteProperty(phaseOptions, phaseKey);\n }\n\n return phaseOptions;\n }, opts[key]);\n\n return opts;\n }, options.phases);\n },\n\n @retry\n _uploadPhaseUpload(options) {\n this.logger.debug('client: uploading file');\n\n const promise = this.request(options.phases.upload).then((res) => {\n this.logger.debug('client: uploaded file');\n\n return res;\n });\n\n proxyEvents(options.phases.upload.upload, promise);\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV === 'test') {\n promise.on('progress', (event) => {\n this.logger.info('upload progress', event.loaded, event.total);\n });\n }\n\n return promise;\n },\n\n _uploadPhaseFinalize: function _uploadPhaseFinalize(options) {\n this.logger.debug('client: finalizing upload session');\n\n return this.request(options.phases.finalize).then((res) => {\n this.logger.debug('client: finalized upload session');\n\n return res;\n });\n },\n});\n\nWebexCore.version = PACKAGE_VERSION;\n\nmixinWebexInternalCorePlugins(WebexInternalCore, config, interceptors);\nmixinWebexCorePlugins(WebexCore, config, interceptors);\n\nexport default WebexCore;\n\n/**\n * @method registerPlugin\n * @param {string} name\n * @param {function} constructor\n * @param {Object} options\n * @param {Array<string>} options.proxies\n * @param {Object} options.interceptors\n * @returns {null}\n */\nexport function registerPlugin(name, constructor, options = {}) {\n WebexCore.registerPlugin(name, constructor, options);\n}\n\n/**\n * Registers plugins used by internal products that do not talk to public APIs.\n * @method registerInternalPlugin\n * @param {string} name\n * @param {function} constructor\n * @param {Object} options\n * @param {Object} options.interceptors\n * @private\n * @returns {null}\n */\nexport function registerInternalPlugin(name, constructor, options) {\n WebexInternalCore.registerPlugin(name, constructor, options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["interceptors","WebexTrackingIdInterceptor","create","RequestEventInterceptor","RateLimitInterceptor","RequestLoggerInterceptor","process","env","ENABLE_NETWORK_LOGGING","ENABLE_VERBOSE_NETWORK_LOGGING","undefined","ResponseLoggerInterceptor","RequestTimingInterceptor","ServiceInterceptor","UserAgentInterceptor","WebexUserAgentInterceptor","AuthInterceptor","KmsDryErrorInterceptor","PayloadTransformerInterceptor","ConversationInterceptor","RedirectInterceptor","HttpStatusInterceptor","error","WebexHttpError","NetworkTimingInterceptor","EmbargoInterceptor","DefaultOptionsInterceptor","preInterceptors","postInterceptors","MAX_FILE_SIZE_IN_MB","WebexCore","AmpState","extend","version","children","internal","WebexInternalCore","constructor","attrs","options","credentials","supertoken","access_token","forEach","path","val","bearerValidator","trim","derived","boundedStorage","deps","fn","makeWebexStore","unboundedStorage","ready","loaded","_children","reduce","name","session","config","type","default","request","setOnce","sessionId","refresh","transform","direction","object","predicates","payloadTransformer","filter","p","ctx","webex","all","map","test","then","shouldTransform","extract","target","data","d","Boolean","promise","alias","applyNamedTransform","resolve","rest","unshift","args","transforms","tx","getWindow","window","initialize","trigger","onLoaded","stopListening","nextTick","listenToAndRun","onReady","prototype","key","listenTo","addInterceptor","ints","interceptor","push","includes","requestDefaults","json","prepareFetchOptions","setTimingsAndFetch","_setTimingsAndFetch","uuid","v4","setConfig","newConfig","token","split","length","console","warn","replace","info","inspect","depth","util","serialize","props","logout","refresh_token","onBeforeLogout","reverse","plugin","catch","err","logger","clear","invalidate","authorization","measure","metrics","sendUnstructured","upload","file","reject","Error","phases","finalize","method","body","uploadProtocol","withCredentials","headers","shunt","EventEmitter","_uploadPhaseInitialize","_uploadPhaseUpload","transferEvents","_uploadPhaseFinalize","res","proxyEvents","debug","fileUploadSizeLimitInBytes","fileUploadSizeLimit","currentFileSizeInBytes","byteLength","_uploadAbortSession","_uploadApplySession","response","url","abortErrorDetails","fileUploadSizeLimitInMB","message","opts","phaseOptions","phaseKey","startsWith","substr","NODE_ENV","on","event","total","retry","mixinWebexInternalCorePlugins","mixinWebexCorePlugins","registerPlugin","registerInternalPlugin"],"sources":["webex-core.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\nimport util from 'util';\n\nimport {proxyEvents, retry, transferEvents} from '@webex/common';\nimport {\n HttpStatusInterceptor,\n defaults as requestDefaults,\n protoprepareFetchOptions as prepareFetchOptions,\n setTimingsAndFetch as _setTimingsAndFetch,\n} from '@webex/http-core';\nimport {defaultsDeep, get, isFunction, isString, last, merge, omit, set, unset} from 'lodash';\nimport AmpState from 'ampersand-state';\nimport uuid from 'uuid';\n\nimport AuthInterceptor from './interceptors/auth';\nimport NetworkTimingInterceptor from './interceptors/network-timing';\nimport PayloadTransformerInterceptor from './interceptors/payload-transformer';\nimport RedirectInterceptor from './interceptors/redirect';\nimport RequestEventInterceptor from './interceptors/request-event';\nimport RequestLoggerInterceptor from './interceptors/request-logger';\nimport RequestTimingInterceptor from './interceptors/request-timing';\nimport ResponseLoggerInterceptor from './interceptors/response-logger';\nimport WebexHttpError from './lib/webex-http-error';\nimport UserAgentInterceptor from './interceptors/user-agent';\nimport WebexTrackingIdInterceptor from './interceptors/webex-tracking-id';\nimport WebexUserAgentInterceptor from './interceptors/webex-user-agent';\nimport RateLimitInterceptor from './interceptors/rate-limit';\nimport EmbargoInterceptor from './interceptors/embargo';\nimport DefaultOptionsInterceptor from './interceptors/default-options';\nimport config from './config';\nimport {makeWebexStore} from './lib/storage';\nimport mixinWebexCorePlugins from './lib/webex-core-plugin-mixin';\nimport mixinWebexInternalCorePlugins from './lib/webex-internal-core-plugin-mixin';\nimport WebexInternalCore from './webex-internal-core';\n\n// TODO replace the Interceptor.create with Reflect.construct (\n// Interceptor.create exists because new was really hard to call on an array of\n// constructors)\nconst interceptors = {\n WebexTrackingIdInterceptor: WebexTrackingIdInterceptor.create,\n RequestEventInterceptor: RequestEventInterceptor.create,\n RateLimitInterceptor: RateLimitInterceptor.create,\n /* eslint-disable no-extra-parens */\n RequestLoggerInterceptor:\n process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING\n ? RequestLoggerInterceptor.create\n : undefined,\n ResponseLoggerInterceptor:\n process.env.ENABLE_NETWORK_LOGGING || process.env.ENABLE_VERBOSE_NETWORK_LOGGING\n ? ResponseLoggerInterceptor.create\n : undefined,\n /* eslint-enable no-extra-parens */\n RequestTimingInterceptor: RequestTimingInterceptor.create,\n ServiceInterceptor: undefined,\n UserAgentInterceptor: UserAgentInterceptor.create,\n WebexUserAgentInterceptor: WebexUserAgentInterceptor.create,\n AuthInterceptor: AuthInterceptor.create,\n KmsDryErrorInterceptor: undefined,\n PayloadTransformerInterceptor: PayloadTransformerInterceptor.create,\n ConversationInterceptor: undefined,\n RedirectInterceptor: RedirectInterceptor.create,\n HttpStatusInterceptor() {\n return HttpStatusInterceptor.create({\n error: WebexHttpError,\n });\n },\n NetworkTimingInterceptor: NetworkTimingInterceptor.create,\n EmbargoInterceptor: EmbargoInterceptor.create,\n DefaultOptionsInterceptor: DefaultOptionsInterceptor.create,\n};\n\nconst preInterceptors = [\n 'ResponseLoggerInterceptor',\n 'RequestTimingInterceptor',\n 'RequestEventInterceptor',\n 'WebexTrackingIdInterceptor',\n 'RateLimitInterceptor',\n];\n\nconst postInterceptors = [\n 'HttpStatusInterceptor',\n 'NetworkTimingInterceptor',\n 'EmbargoInterceptor',\n 'RequestLoggerInterceptor',\n 'RateLimitInterceptor',\n];\n\nconst MAX_FILE_SIZE_IN_MB = 2048;\n\n/**\n * @class\n */\nconst WebexCore = AmpState.extend({\n version: PACKAGE_VERSION,\n\n children: {\n internal: WebexInternalCore,\n },\n\n constructor(attrs = {}, options) {\n if (typeof attrs === 'string') {\n attrs = {\n credentials: {\n supertoken: {\n // eslint-disable-next-line camelcase\n access_token: attrs,\n },\n },\n };\n } else {\n // Reminder: order is important here\n [\n 'credentials.authorization',\n 'authorization',\n 'credentials.supertoken.supertoken',\n 'supertoken',\n 'access_token',\n 'credentials.authorization.supertoken',\n ].forEach((path) => {\n const val = get(attrs, path);\n\n if (val) {\n unset(attrs, path);\n set(attrs, 'credentials.supertoken', val);\n }\n });\n\n ['credentials', 'credentials.authorization'].forEach((path) => {\n const val = get(attrs, path);\n\n if (typeof val === 'string') {\n unset(attrs, path);\n set(attrs, 'credentials.supertoken', val);\n }\n });\n\n if (typeof get(attrs, 'credentials.access_token') === 'string') {\n // Send access_token to get validated and corrected and then set it\n set(\n attrs,\n 'credentials.access_token',\n this.bearerValidator(get(attrs, 'credentials.access_token').trim())\n );\n\n set(attrs, 'credentials.supertoken', attrs.credentials);\n }\n }\n\n return Reflect.apply(AmpState, this, [attrs, options]);\n },\n\n derived: {\n boundedStorage: {\n deps: [],\n fn() {\n return makeWebexStore('bounded', this);\n },\n },\n unboundedStorage: {\n deps: [],\n fn() {\n return makeWebexStore('unbounded', this);\n },\n },\n ready: {\n deps: ['loaded', 'internal.ready'],\n fn() {\n return (\n this.loaded &&\n Object.keys(this._children).reduce(\n (ready, name) => ready && this[name] && this[name].ready !== false,\n true\n )\n );\n },\n },\n },\n\n session: {\n config: {\n type: 'object',\n },\n /**\n * When true, indicates that the initial load from the storage layer is\n * complete\n * @instance\n * @memberof WebexCore\n * @type {boolean}\n */\n loaded: {\n default: false,\n type: 'boolean',\n },\n request: {\n setOnce: true,\n // It's supposed to be a function, but that's not a type defined in\n // Ampersand\n type: 'any',\n },\n sessionId: {\n setOnce: true,\n type: 'string',\n },\n },\n\n /**\n * @instance\n * @memberof WebexCore\n * @param {[type]} args\n * @returns {[type]}\n */\n refresh(...args) {\n return this.credentials.refresh(...args);\n },\n\n /**\n * Applies the directionally appropriate transforms to the specified object\n * @param {string} direction\n * @param {Object} object\n * @returns {Promise}\n */\n transform(direction, object) {\n const predicates = this.config.payloadTransformer.predicates.filter(\n (p) => !p.direction || p.direction === direction\n );\n const ctx = {\n webex: this,\n };\n\n return Promise.all(\n predicates.map((p) =>\n p.test(ctx, object).then((shouldTransform) => {\n if (!shouldTransform) {\n return undefined;\n }\n\n return (\n p\n .extract(object)\n // eslint-disable-next-line max-nested-callbacks\n .then((target) => ({\n name: p.name,\n target,\n }))\n );\n })\n )\n )\n .then((data) =>\n data\n .filter((d) => Boolean(d))\n // eslint-disable-next-line max-nested-callbacks\n .reduce(\n (promise, {name, target, alias}) =>\n promise.then(() => {\n if (alias) {\n return this.applyNamedTransform(direction, alias, target);\n }\n\n return this.applyNamedTransform(direction, name, target);\n }),\n Promise.resolve()\n )\n )\n .then(() => object);\n },\n\n /**\n * Applies the directionally appropriate transform to the specified parameters\n * @param {string} direction\n * @param {Object} ctx\n * @param {string} name\n * @returns {Promise}\n */\n applyNamedTransform(direction, ctx, name, ...rest) {\n if (isString(ctx)) {\n rest.unshift(name);\n name = ctx;\n ctx = {\n webex: this,\n transform: (...args) => this.applyNamedTransform(direction, ctx, ...args),\n };\n }\n\n const transforms = ctx.webex.config.payloadTransformer.transforms.filter(\n (tx) => tx.name === name && (!tx.direction || tx.direction === direction)\n );\n\n // too many implicit returns on the same line is difficult to interpret\n // eslint-disable-next-line arrow-body-style\n return transforms\n .reduce(\n (promise, tx) =>\n promise.then(() => {\n if (tx.alias) {\n return ctx.transform(tx.alias, ...rest);\n }\n\n return Promise.resolve(tx.fn(ctx, ...rest));\n }),\n Promise.resolve()\n )\n .then(() => last(rest));\n },\n\n /**\n * @private\n * @returns {Window}\n */\n getWindow() {\n // eslint-disable-next-line\n return window;\n },\n\n /**\n * Initializer\n *\n * @emits WebexCore#loaded\n * @emits WebexCore#ready\n * @instance\n * @memberof WebexCore\n * @param {Object} attrs\n * @returns {WebexCore}\n */\n initialize(attrs = {}) {\n this.config = merge({}, config, attrs.config);\n\n // There's some unfortunateness with the way {@link AmpersandState#children}\n // get initialized. We'll fire the change:config event so that\n // {@link WebexPlugin#initialize()} can use\n // `this.listenToOnce(parent, 'change:config', () => {});` to act on config\n // during initialization\n this.trigger('change:config');\n\n const onLoaded = () => {\n if (this.loaded) {\n /**\n * Fires when all data has been loaded from the storage layer\n * @event loaded\n * @instance\n * @memberof WebexCore\n */\n this.trigger('loaded');\n\n this.stopListening(this, 'change:loaded', onLoaded);\n }\n };\n\n // This needs to run on nextTick or we'll never be able to wire up listeners\n process.nextTick(() => {\n this.listenToAndRun(this, 'change:loaded', onLoaded);\n });\n\n const onReady = () => {\n if (this.ready) {\n /**\n * Fires when all plugins have fully initialized\n * @event ready\n * @instance\n * @memberof WebexCore\n */\n this.trigger('ready');\n\n this.stopListening(this, 'change:ready', onReady);\n }\n };\n\n // This needs to run on nextTick or we'll never be able to wire up listeners\n process.nextTick(() => {\n this.listenToAndRun(this, 'change:ready', onReady);\n });\n\n // Make nested events propagate in a consistent manner\n Object.keys(this.constructor.prototype._children).forEach((key) => {\n this.listenTo(this[key], 'change', (...args) => {\n args.unshift(`change:${key}`);\n this.trigger(...args);\n });\n });\n\n const addInterceptor = (ints, key) => {\n const interceptor = interceptors[key];\n\n if (!isFunction(interceptor)) {\n return ints;\n }\n\n ints.push(Reflect.apply(interceptor, this, []));\n\n return ints;\n };\n\n let ints = [];\n\n ints = preInterceptors.reduce(addInterceptor, ints);\n ints = Object.keys(interceptors)\n .filter((key) => !(preInterceptors.includes(key) || postInterceptors.includes(key)))\n .reduce(addInterceptor, ints);\n ints = postInterceptors.reduce(addInterceptor, ints);\n\n this.request = requestDefaults({\n json: true,\n interceptors: ints,\n });\n\n this.prepareFetchOptions = prepareFetchOptions({\n json: true,\n interceptors: ints,\n });\n\n this.setTimingsAndFetch = _setTimingsAndFetch;\n\n let sessionId = `${get(this, 'config.trackingIdPrefix', 'webex-js-sdk')}_${get(\n this,\n 'config.trackingIdBase',\n uuid.v4()\n )}`;\n\n if (get(this, 'config.trackingIdSuffix')) {\n sessionId += `_${get(this, 'config.trackingIdSuffix')}`;\n }\n\n this.sessionId = sessionId;\n },\n\n /**\n * setConfig\n *\n * Allows updating config\n *\n * @instance\n * @memberof WebexCore\n * @param {Object} newConfig\n * @returns {null}\n */\n setConfig(newConfig = {}) {\n this.config = merge({}, this.config, newConfig);\n },\n\n /**\n *\n * Check if access token is correctly formated and correct if it's not\n * Warn user if token string has errors in it\n * @param {string} token\n * @returns {string}\n */\n bearerValidator(token) {\n if (token.includes('Bearer') && token.split(' ').length - 1 === 0) {\n console.warn(\n `Your access token does not have a space between 'Bearer' and the token, please add a space to it or replace it with this already fixed version:\\n\\n${token\n .replace('Bearer', 'Bearer ')\n .replace(/\\s+/g, ' ')}`\n );\n console.info(\n \"Tip: You don't need to add 'Bearer' to the access_token field. The token by itself is fine\"\n );\n\n return token.replace('Bearer', 'Bearer ').replace(/\\s+/g, ' ');\n }\n // Allow elseIf return\n // eslint-disable-next-line no-else-return\n else if (token.split(' ').length - 1 > 1) {\n console.warn(\n `Your access token has ${\n token.split(' ').length - 2\n } too many spaces, please use this format:\\n\\n${token.replace(/\\s+/g, ' ')}`\n );\n console.info(\n \"Tip: You don't need to add 'Bearer' to the access_token field, the token by itself is fine\"\n );\n\n return token.replace(/\\s+/g, ' ');\n }\n\n return token.replace(/\\s+/g, ' '); // Clean it anyway (just in case)\n },\n\n /**\n * @instance\n * @memberof WebexPlugin\n * @param {number} depth\n * @private\n * @returns {Object}\n */\n inspect(depth) {\n return util.inspect(\n omit(\n this.serialize({\n props: true,\n session: true,\n derived: true,\n }),\n 'boundedStorage',\n 'unboundedStorage',\n 'request',\n 'config'\n ),\n {depth}\n );\n },\n\n /**\n * Invokes all `onBeforeLogout` handlers in the scope of their plugin, clears\n * all stores, and revokes the access token\n * Note: If you're using the sdk in a server environment, you may be more\n * interested in {@link `webex.internal.mercury.disconnect()`| Mercury#disconnect()}\n * and {@link `webex.internal.device.unregister()`|Device#unregister()}\n * or {@link `webex.phone.unregister()`|Phone#unregister}\n * @instance\n * @memberof WebexCore\n * @param {Object} options Passed as the first argument to all\n * `onBeforeLogout` handlers\n * @returns {Promise}\n */\n logout(options, ...rest) {\n // prefer the refresh token, but for clients that don't have one, fallback\n // to the access token\n const token =\n this.credentials.supertoken &&\n (this.credentials.supertoken.refresh_token || this.credentials.supertoken.access_token);\n\n options = Object.assign({token}, options);\n\n // onBeforeLogout should be executed in the opposite order in which handlers\n // were registered. In that way, wdm unregister() will be above mercury\n // disconnect(), but disconnect() will execute first.\n // eslint-disable-next-line arrow-body-style\n return this.config.onBeforeLogout\n .reverse()\n .reduce(\n (promise, {plugin, fn}) =>\n promise.then(() => {\n return (\n Promise.resolve(\n Reflect.apply(fn, this[plugin] || this.internal[plugin], [options, ...rest])\n )\n // eslint-disable-next-line max-nested-callbacks\n .catch((err) => {\n this.logger.warn(`onBeforeLogout from plugin ${plugin}: failed`, err);\n })\n );\n }),\n Promise.resolve()\n )\n .then(() => Promise.all([this.boundedStorage.clear(), this.unboundedStorage.clear()]))\n .then(() => this.credentials.invalidate(...rest))\n .then(\n () =>\n this.authorization &&\n this.authorization.logout &&\n this.authorization.logout(options, ...rest)\n )\n .then(() => this.trigger('client:logout'));\n },\n\n /**\n * General purpose wrapper to submit metrics via the metrics plugin (if the\n * metrics plugin is installed)\n * @instance\n * @memberof WebexCore\n * @returns {Promise}\n */\n measure(...args) {\n if (this.metrics) {\n return this.metrics.sendUnstructured(...args);\n }\n\n return Promise.resolve();\n },\n\n async upload(options) {\n if (!options.file) {\n return Promise.reject(new Error('`options.file` is required'));\n }\n\n options.phases = options.phases || {};\n options.phases.initialize = options.phases.initialize || {};\n options.phases.upload = options.phases.upload || {};\n options.phases.finalize = options.phases.finalize || {};\n\n defaultsDeep(\n options.phases.initialize,\n {\n method: 'POST',\n body: {\n uploadProtocol: 'content-length',\n },\n },\n omit(options, 'file', 'phases')\n );\n\n defaultsDeep(options.phases.upload, {\n method: 'PUT',\n json: false,\n withCredentials: false,\n body: options.file,\n headers: {\n 'x-trans-id': uuid.v4(),\n authorization: undefined,\n },\n });\n\n defaultsDeep(\n options.phases.finalize,\n {\n method: 'POST',\n },\n omit(options, 'file', 'phases')\n );\n\n const shunt = new EventEmitter();\n\n const promise = this._uploadPhaseInitialize(options)\n .then(() => {\n const p = this._uploadPhaseUpload(options);\n\n transferEvents('progress', p, shunt);\n\n return p;\n })\n .then((...args) => this._uploadPhaseFinalize(options, ...args))\n .then((res) => ({...res.body, ...res.headers}));\n\n proxyEvents(shunt, promise);\n\n return promise;\n },\n\n _uploadPhaseInitialize: function _uploadPhaseInitialize(options) {\n this.logger.debug('client: initiating upload session');\n\n return this.request(options.phases.initialize)\n .then((...args) => {\n const fileUploadSizeLimitInBytes =\n (args[0].body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB) * 1024 * 1024;\n const currentFileSizeInBytes = options.file.byteLength;\n\n if (fileUploadSizeLimitInBytes && fileUploadSizeLimitInBytes < currentFileSizeInBytes) {\n return this._uploadAbortSession(currentFileSizeInBytes, ...args);\n }\n\n return this._uploadApplySession(options, ...args);\n })\n .then((res) => {\n this.logger.debug('client: initiated upload session');\n\n return res;\n });\n },\n\n _uploadAbortSession(currentFileSizeInBytes, response) {\n this.logger.debug('client: deleting uploaded file');\n\n return this.request({\n method: 'DELETE',\n url: response.body.url,\n headers: response.options.headers,\n }).then(() => {\n this.logger.debug('client: deleting uploaded file complete');\n\n const abortErrorDetails = {\n currentFileSizeInBytes,\n fileUploadSizeLimitInMB: response.body.fileUploadSizeLimit || MAX_FILE_SIZE_IN_MB,\n message: 'file-upload-size-limit-enabled',\n };\n\n return Promise.reject(new Error(`${JSON.stringify(abortErrorDetails)}`));\n });\n },\n\n _uploadApplySession(options, res) {\n const session = res.body;\n\n ['upload', 'finalize'].reduce((opts, key) => {\n opts[key] = Object.keys(opts[key]).reduce((phaseOptions, phaseKey) => {\n if (phaseKey.startsWith('$')) {\n phaseOptions[phaseKey.substr(1)] = phaseOptions[phaseKey](session);\n Reflect.deleteProperty(phaseOptions, phaseKey);\n }\n\n return phaseOptions;\n }, opts[key]);\n\n return opts;\n }, options.phases);\n },\n\n @retry\n _uploadPhaseUpload(options) {\n this.logger.debug('client: uploading file');\n\n const promise = this.request(options.phases.upload).then((res) => {\n this.logger.debug('client: uploaded file');\n\n return res;\n });\n\n proxyEvents(options.phases.upload.upload, promise);\n\n /* istanbul ignore else */\n if (process.env.NODE_ENV === 'test') {\n promise.on('progress', (event) => {\n this.logger.info('upload progress', event.loaded, event.total);\n });\n }\n\n return promise;\n },\n\n _uploadPhaseFinalize: function _uploadPhaseFinalize(options) {\n this.logger.debug('client: finalizing upload session');\n\n return this.request(options.phases.finalize).then((res) => {\n this.logger.debug('client: finalized upload session');\n\n return res;\n });\n },\n});\n\nWebexCore.version = PACKAGE_VERSION;\n\nmixinWebexInternalCorePlugins(WebexInternalCore, config, interceptors);\nmixinWebexCorePlugins(WebexCore, config, interceptors);\n\nexport default WebexCore;\n\n/**\n * @method registerPlugin\n * @param {string} name\n * @param {function} constructor\n * @param {Object} options\n * @param {Array<string>} options.proxies\n * @param {Object} options.interceptors\n * @returns {null}\n */\nexport function registerPlugin(name, constructor, options = {}) {\n WebexCore.registerPlugin(name, constructor, options);\n}\n\n/**\n * Registers plugins used by internal products that do not talk to public APIs.\n * @method registerInternalPlugin\n * @param {string} name\n * @param {function} constructor\n * @param {Object} options\n * @param {Object} options.interceptors\n * @private\n * @returns {null}\n */\nexport function registerInternalPlugin(name, constructor, options) {\n WebexInternalCore.registerPlugin(name, constructor, options);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/webex-core",
3
- "version": "3.0.0-beta.27",
3
+ "version": "3.0.0-beta.271",
4
4
  "description": "Plugin handling for Cisco Webex",
5
5
  "license": "MIT",
6
6
  "contributors": [
@@ -31,24 +31,24 @@
31
31
  },
32
32
  "devDependencies": {
33
33
  "@sinonjs/fake-timers": "^6.0.1",
34
- "@webex/test-helper-chai": "3.0.0-beta.27",
35
- "@webex/test-helper-make-local-url": "3.0.0-beta.27",
36
- "@webex/test-helper-mocha": "3.0.0-beta.27",
37
- "@webex/test-helper-mock-webex": "3.0.0-beta.27",
38
- "@webex/test-helper-refresh-callback": "3.0.0-beta.27",
39
- "@webex/test-helper-test-users": "3.0.0-beta.27",
34
+ "@webex/test-helper-chai": "3.0.0-beta.271",
35
+ "@webex/test-helper-make-local-url": "3.0.0-beta.271",
36
+ "@webex/test-helper-mocha": "3.0.0-beta.271",
37
+ "@webex/test-helper-mock-webex": "3.0.0-beta.271",
38
+ "@webex/test-helper-refresh-callback": "3.0.0-beta.271",
39
+ "@webex/test-helper-test-users": "3.0.0-beta.271",
40
40
  "chai": "^4.3.4",
41
41
  "chai-as-promised": "^7.1.1",
42
42
  "sinon": "^9.2.4"
43
43
  },
44
44
  "dependencies": {
45
- "@webex/common": "3.0.0-beta.27",
46
- "@webex/common-timers": "3.0.0-beta.27",
47
- "@webex/http-core": "3.0.0-beta.27",
48
- "@webex/internal-plugin-device": "3.0.0-beta.27",
49
- "@webex/plugin-logger": "3.0.0-beta.27",
50
- "@webex/storage-adapter-spec": "3.0.0-beta.27",
51
- "@webex/webex-core": "3.0.0-beta.27",
45
+ "@webex/common": "3.0.0-beta.271",
46
+ "@webex/common-timers": "3.0.0-beta.271",
47
+ "@webex/http-core": "3.0.0-beta.271",
48
+ "@webex/internal-plugin-device": "3.0.0-beta.271",
49
+ "@webex/plugin-logger": "3.0.0-beta.271",
50
+ "@webex/storage-adapter-spec": "3.0.0-beta.271",
51
+ "@webex/webex-core": "3.0.0-beta.271",
52
52
  "ampersand-collection": "^2.0.2",
53
53
  "ampersand-events": "^2.0.2",
54
54
  "ampersand-state": "^5.0.3",
@@ -48,6 +48,25 @@ const Credentials = WebexPlugin.extend({
48
48
  return Boolean(this.supertoken && this.supertoken.canRefresh);
49
49
  },
50
50
  },
51
+ isUnverifiedGuest: {
52
+ deps: ['supertoken'],
53
+ /**
54
+ * Returns true if the user is an unverified guest
55
+ * @returns {boolean}
56
+ */
57
+ fn() {
58
+ let isGuest = false;
59
+ try {
60
+ isGuest =
61
+ JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===
62
+ 'guest';
63
+ } catch {
64
+ /* the non-guest token is formatted differently so catch is expected */
65
+ }
66
+
67
+ return isGuest;
68
+ },
69
+ },
51
70
  },
52
71
 
53
72
  props: {
package/src/webex-core.js CHANGED
@@ -6,7 +6,12 @@ import {EventEmitter} from 'events';
6
6
  import util from 'util';
7
7
 
8
8
  import {proxyEvents, retry, transferEvents} from '@webex/common';
9
- import {HttpStatusInterceptor, defaults as requestDefaults} from '@webex/http-core';
9
+ import {
10
+ HttpStatusInterceptor,
11
+ defaults as requestDefaults,
12
+ protoprepareFetchOptions as prepareFetchOptions,
13
+ setTimingsAndFetch as _setTimingsAndFetch,
14
+ } from '@webex/http-core';
10
15
  import {defaultsDeep, get, isFunction, isString, last, merge, omit, set, unset} from 'lodash';
11
16
  import AmpState from 'ampersand-state';
12
17
  import uuid from 'uuid';
@@ -402,6 +407,13 @@ const WebexCore = AmpState.extend({
402
407
  interceptors: ints,
403
408
  });
404
409
 
410
+ this.prepareFetchOptions = prepareFetchOptions({
411
+ json: true,
412
+ interceptors: ints,
413
+ });
414
+
415
+ this.setTimingsAndFetch = _setTimingsAndFetch;
416
+
405
417
  let sessionId = `${get(this, 'config.trackingIdPrefix', 'webex-js-sdk')}_${get(
406
418
  this,
407
419
  'config.trackingIdBase',
@@ -59,6 +59,34 @@ describe('webex-core', () => {
59
59
  });
60
60
  });
61
61
 
62
+ describe('#isUnverifiedGuest', () => {
63
+ let credentials;
64
+ let webex;
65
+ beforeEach('generate the webex instance', () => {
66
+ webex = new MockWebex();
67
+ credentials = new Credentials(undefined, {parent: webex});
68
+ });
69
+
70
+ it('should have #isUnverifiedGuest', () => {
71
+ assert.exists(credentials.isUnverifiedGuest);
72
+ });
73
+
74
+ it('should get the user status and return as a boolean', () => {
75
+ credentials.set('supertoken', 'AT');
76
+ assert.isFalse(credentials.isUnverifiedGuest);
77
+ });
78
+
79
+ it('should get guest user ', () => {
80
+ credentials.set('supertoken', 'eyJhbGciOiJSUzI1NiJ9.eyJ1c2VyX3R5cGUiOiJndWVzdCJ9');
81
+ assert.isTrue(credentials.isUnverifiedGuest);
82
+ });
83
+
84
+ it('should get login user ', () => {
85
+ credentials.set('supertoken', 'dGhpc2lzbm90YXJlYWx1c2VydG9rZW4=');
86
+ assert.isFalse(credentials.isUnverifiedGuest);
87
+ });
88
+ });
89
+
62
90
  describe('#canAuthorize', () => {
63
91
  it('indicates if the current state has enough information to populate an auth header, even if a token refresh or token downscope is required', () => {
64
92
  const webex = new MockWebex();
@@ -54,6 +54,18 @@ describe('Webex', () => {
54
54
  });
55
55
  });
56
56
 
57
+ describe('#request', () => {
58
+ it('exists', () => {
59
+ assert.property(webex, 'request');
60
+ });
61
+ });
62
+
63
+ describe('#prepareFetchOptions', () => {
64
+ it('exists', () => {
65
+ assert.property(webex, 'prepareFetchOptions');
66
+ });
67
+ });
68
+
57
69
  describe('#initialize()', () => {
58
70
  it('initializes without arguments', () => {
59
71
  let webex;