@webex/webex-core 3.0.0-beta.31 → 3.0.0-beta.310

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.
@@ -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.31"
60
+ version: "3.0.0-beta.310"
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.31",
102
+ version: "3.0.0-beta.310",
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.31";
644
+ WebexCore.version = "3.0.0-beta.310";
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.31",
3
+ "version": "3.0.0-beta.310",
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.31",
35
- "@webex/test-helper-make-local-url": "3.0.0-beta.31",
36
- "@webex/test-helper-mocha": "3.0.0-beta.31",
37
- "@webex/test-helper-mock-webex": "3.0.0-beta.31",
38
- "@webex/test-helper-refresh-callback": "3.0.0-beta.31",
39
- "@webex/test-helper-test-users": "3.0.0-beta.31",
34
+ "@webex/test-helper-chai": "3.0.0-beta.310",
35
+ "@webex/test-helper-make-local-url": "3.0.0-beta.310",
36
+ "@webex/test-helper-mocha": "3.0.0-beta.310",
37
+ "@webex/test-helper-mock-webex": "3.0.0-beta.310",
38
+ "@webex/test-helper-refresh-callback": "3.0.0-beta.310",
39
+ "@webex/test-helper-test-users": "3.0.0-beta.310",
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.31",
46
- "@webex/common-timers": "3.0.0-beta.31",
47
- "@webex/http-core": "3.0.0-beta.31",
48
- "@webex/internal-plugin-device": "3.0.0-beta.31",
49
- "@webex/plugin-logger": "3.0.0-beta.31",
50
- "@webex/storage-adapter-spec": "3.0.0-beta.31",
51
- "@webex/webex-core": "3.0.0-beta.31",
45
+ "@webex/common": "3.0.0-beta.310",
46
+ "@webex/common-timers": "3.0.0-beta.310",
47
+ "@webex/http-core": "3.0.0-beta.310",
48
+ "@webex/internal-plugin-device": "3.0.0-beta.310",
49
+ "@webex/plugin-logger": "3.0.0-beta.310",
50
+ "@webex/storage-adapter-spec": "3.0.0-beta.310",
51
+ "@webex/webex-core": "3.0.0-beta.310",
52
52
  "ampersand-collection": "^2.0.2",
53
53
  "ampersand-events": "^2.0.2",
54
54
  "ampersand-state": "^5.0.3",
@@ -0,0 +1,6 @@
1
+ // Metric to do with WDM registration
2
+ export const METRICS = {
3
+ JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED: 'JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED',
4
+ JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH:
5
+ 'JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH',
6
+ };
@@ -13,10 +13,11 @@ import {clone, cloneDeep, isObject, isEmpty} from 'lodash';
13
13
  import WebexPlugin from '../webex-plugin';
14
14
  import {persist, waitForValue} from '../storage/decorators';
15
15
 
16
- import grantErrors from './grant-errors';
17
- import {filterScope, sortScope} from './scope';
16
+ import grantErrors, {OAuthError} from './grant-errors';
17
+ import {filterScope, diffScopes, sortScope} from './scope';
18
18
  import Token from './token';
19
19
  import TokenCollection from './token-collection';
20
+ import {METRICS} from '../constants';
20
21
 
21
22
  /**
22
23
  * @class
@@ -48,6 +49,25 @@ const Credentials = WebexPlugin.extend({
48
49
  return Boolean(this.supertoken && this.supertoken.canRefresh);
49
50
  },
50
51
  },
52
+ isUnverifiedGuest: {
53
+ deps: ['supertoken'],
54
+ /**
55
+ * Returns true if the user is an unverified guest
56
+ * @returns {boolean}
57
+ */
58
+ fn() {
59
+ let isGuest = false;
60
+ try {
61
+ isGuest =
62
+ JSON.parse(base64.decode(this.supertoken.access_token.split('.')[1])).user_type ===
63
+ 'guest';
64
+ } catch {
65
+ /* the non-guest token is formatted differently so catch is expected */
66
+ }
67
+
68
+ return isGuest;
69
+ },
70
+ },
51
71
  },
52
72
 
53
73
  props: {
@@ -240,8 +260,15 @@ const Credentials = WebexPlugin.extend({
240
260
  */
241
261
  downscope(scope) {
242
262
  return this.supertoken.downscope(scope).catch((reason) => {
243
- this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);
263
+ const failReason = reason?.body ?? reason;
264
+ this.logger.warn(`credentials: failed to downscope supertoken to "${scope}"`, failReason);
244
265
  this.logger.trace(`credentials: falling back to supertoken for ${scope}`);
266
+ this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_CREDENTIALS_DOWNSCOPE_FAILED, {
267
+ fields: {
268
+ requestedScope: scope,
269
+ failReason,
270
+ },
271
+ });
245
272
 
246
273
  return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {
247
274
  parent: this,
@@ -322,12 +349,12 @@ const Credentials = WebexPlugin.extend({
322
349
  }
323
350
 
324
351
  if (!scope) {
325
- scope = filterScope('spark:kms', this.config.scope);
352
+ scope = filterScope('spark:kms', this.supertoken.scope);
326
353
  }
327
354
 
328
355
  scope = sortScope(scope);
329
356
 
330
- if (scope === sortScope(this.config.scope)) {
357
+ if (scope === sortScope(this.supertoken.scope)) {
331
358
  return Promise.resolve(this.supertoken);
332
359
  }
333
360
 
@@ -477,42 +504,10 @@ const Credentials = WebexPlugin.extend({
477
504
 
478
505
  return supertoken
479
506
  .refresh()
480
- .then((st) => {
481
- // clear refresh timer
482
- if (this.refreshTimer) {
483
- clearTimeout(this.refreshTimer);
484
- this.unset('refreshTimer');
485
- }
486
- this.supertoken = st;
487
-
488
- return Promise.all(
489
- tokens.map((token) =>
490
- this.downscope(token.scope)
491
- // eslint-disable-next-line max-nested-callbacks
492
- .then((t) => {
493
- this.logger.info(`credentials: revoking token for ${token.scope}`);
494
-
495
- return token
496
- .revoke()
497
- .catch((err) => {
498
- this.logger.warn('credentials: failed to revoke user token', err);
499
- })
500
- .then(() => {
501
- this.userTokens.remove(token.scope);
502
- this.userTokens.add(t);
503
- });
504
- })
505
- )
506
- );
507
- })
508
- .then(() => {
509
- this.scheduleRefresh(this.supertoken.expires);
510
- })
511
507
  .catch((error) => {
512
- const {InvalidRequestError} = grantErrors;
513
-
514
- if (error instanceof InvalidRequestError) {
515
- // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.
508
+ if (error instanceof OAuthError) {
509
+ // Error: super token refresh failed with 400 status code.
510
+ // Hence emit an event to the client, an opportunity to logout.
516
511
  this.unset('supertoken');
517
512
  while (this.userTokens.models.length) {
518
513
  try {
@@ -525,6 +520,53 @@ const Credentials = WebexPlugin.extend({
525
520
  }
526
521
 
527
522
  return Promise.reject(error);
523
+ })
524
+ .then((st) => {
525
+ // clear refresh timer
526
+ if (this.refreshTimer) {
527
+ clearTimeout(this.refreshTimer);
528
+ this.unset('refreshTimer');
529
+ }
530
+ this.supertoken = st;
531
+
532
+ const invalidScopes = diffScopes(this.config.scope, st.scope);
533
+
534
+ if (invalidScopes !== '') {
535
+ this.logger.warn(
536
+ `credentials: "${invalidScopes}" scope(s) are invalid because not listed in the supertoken, they will be excluded from user token requests.`
537
+ );
538
+ this.webex.internal.metrics.submitClientMetrics(
539
+ METRICS.JS_SDK_CREDENTIALS_TOKEN_REFRESH_SCOPE_MISMATCH,
540
+ {fields: {invalidScopes}}
541
+ );
542
+ }
543
+
544
+ return Promise.all(
545
+ tokens.map((token) => {
546
+ const tokenScope = filterScope(diffScopes(token.scope, st.scope), token.scope);
547
+
548
+ return (
549
+ this.downscope(tokenScope)
550
+ // eslint-disable-next-line max-nested-callbacks
551
+ .then((t) => {
552
+ this.logger.info(`credentials: revoking token for ${token.scope}`);
553
+
554
+ return token
555
+ .revoke()
556
+ .catch((err) => {
557
+ this.logger.warn('credentials: failed to revoke user token', err);
558
+ })
559
+ .then(() => {
560
+ this.userTokens.remove(token.scope);
561
+ this.userTokens.add(t);
562
+ });
563
+ })
564
+ );
565
+ })
566
+ );
567
+ })
568
+ .then(() => {
569
+ this.scheduleRefresh(this.supertoken.expires);
528
570
  });
529
571
  },
530
572
 
@@ -2,6 +2,8 @@
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
4
 
5
+ import {difference} from 'lodash';
6
+
5
7
  /**
6
8
  * sorts a list of scopes
7
9
  * @param {string} scope
@@ -17,7 +19,7 @@ export function sortScope(scope) {
17
19
 
18
20
  /**
19
21
  * sorts a list of scopes and filters the specified scope
20
- * @param {string} toFilter
22
+ * @param {string|string[]} toFilter
21
23
  * @param {string} scope
22
24
  * @returns {string}
23
25
  */
@@ -25,10 +27,25 @@ export function filterScope(toFilter, scope) {
25
27
  if (!scope) {
26
28
  return '';
27
29
  }
30
+ const toFilterArr = Array.isArray(toFilter) ? toFilter : [toFilter];
28
31
 
29
32
  return scope
30
33
  .split(' ')
31
- .filter((item) => item !== toFilter)
34
+ .filter((item) => !toFilterArr.includes(item))
32
35
  .sort()
33
36
  .join(' ');
34
37
  }
38
+
39
+ /**
40
+ * Returns a string containing all items in scopeA that are not in scopeB, or an empty string if there are none.
41
+ *
42
+ * @param {string} scopeA
43
+ * @param {string} scopeB
44
+ * @returns {string}
45
+ */
46
+ export function diffScopes(scopeA, scopeB) {
47
+ const a = scopeA?.split(' ') ?? [];
48
+ const b = scopeB?.split(' ') ?? [];
49
+
50
+ return difference(a, b).sort().join(' ');
51
+ }
@@ -36,11 +36,11 @@ export default class ServiceInterceptor extends Interceptor {
36
36
 
37
37
  // Destructure commonly referenced namespaces.
38
38
  const {services} = this.webex.internal;
39
- const {service, resource} = options;
39
+ const {service, resource, waitForServiceTimeout} = options;
40
40
 
41
41
  // Attempt to collect the service url.
42
42
  return services
43
- .waitForService({name: service})
43
+ .waitForService({name: service, timeout: waitForServiceTimeout})
44
44
  .then((serviceUrl) => {
45
45
  // Generate the combined service url and resource.
46
46
  options.uri = this.generateUri(serviceUrl, resource);
@@ -413,6 +413,8 @@ const ServiceCatalog = AmpState.extend({
413
413
  resolve();
414
414
  }
415
415
 
416
+ const validatedTimeout = typeof timeout === 'number' && timeout >= 0 ? timeout : 60;
417
+
416
418
  const timeoutTimer = setTimeout(
417
419
  () =>
418
420
  reject(
@@ -420,7 +422,7 @@ const ServiceCatalog = AmpState.extend({
420
422
  `services: timeout occured while waiting for '${serviceGroup}' catalog to populate`
421
423
  )
422
424
  ),
423
- timeout ? timeout * 1000 : 60000
425
+ validatedTimeout * 1000
424
426
  );
425
427
 
426
428
  this.once(serviceGroup, () => {
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',