@webex/webex-core 3.12.0-next.43 → 3.12.0-next.45
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.
- package/dist/config.js +9 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/catalog-url.js +87 -0
- package/dist/interceptors/catalog-url.js.map +1 -0
- package/dist/lib/batcher.js +1 -1
- package/dist/lib/credentials/credentials.js +1 -1
- package/dist/lib/credentials/token.js +1 -1
- package/dist/lib/services/service-catalog.js +51 -6
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/services.js +5 -3
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/services-v2/service-catalog.js +2 -1
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +7 -4
- package/dist/lib/services-v2/services-v2.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +11 -3
- package/dist/webex-core.js.map +1 -1
- package/package.json +3 -3
- package/src/config.js +10 -0
- package/src/index.js +1 -0
- package/src/interceptors/catalog-url.js +66 -0
- package/src/lib/services/service-catalog.js +54 -6
- package/src/lib/services/services.js +10 -3
- package/src/lib/services-v2/service-catalog.ts +2 -1
- package/src/lib/services-v2/services-v2.ts +15 -4
- package/src/webex-core.js +8 -0
- package/test/unit/spec/credentials/credentials.js +31 -0
- package/test/unit/spec/interceptors/catalog-url.js +224 -0
- package/test/unit/spec/services/service-catalog.js +191 -0
- package/test/unit/spec/services-v2/service-catalog.ts +31 -0
- package/test/unit/spec/services-v2/services-v2.ts +20 -0
- package/test/unit/spec/webex-core.js +53 -1
package/dist/webex-core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","require","_util","_interopRequireDefault","_common","_httpCore","_lodash","_ampersandState","_uuid","_auth","_networkTiming","_payloadTransformer","_redirect","_requestEvent","_requestLogger","_requestTiming","_responseLogger","_webexHttpError","_userAgent","_proxy","_webexTrackingId","_webexUserAgent","_rateLimit","_embargo","_defaultOptions","_hostmap","_config","_storage","_webexCorePluginMixin","_webexInternalCorePluginMixin","_webexInternalCore","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","interceptors","WebexTrackingIdInterceptor","create","RequestEventInterceptor","RateLimitInterceptor","RequestLoggerInterceptor","process","env","ENABLE_NETWORK_LOGGING","ENABLE_VERBOSE_NETWORK_LOGGING","undefined","ResponseLoggerInterceptor","RequestTimingInterceptor","ServiceInterceptor","UserAgentInterceptor","ProxyInterceptor","WebexUserAgentInterceptor","AuthInterceptor","KmsDryErrorInterceptor","PayloadTransformerInterceptor","ConversationInterceptor","RedirectInterceptor","HttpStatusInterceptor","error","WebexHttpError","NetworkTimingInterceptor","EmbargoInterceptor","DefaultOptionsInterceptor","HostMapInterceptor","preInterceptors","postInterceptors","MAX_FILE_SIZE_IN_MB","WebexCore","AmpState","extend","version","children","internal","WebexInternalCore","constructor","attrs","options","credentials","supertoken","access_token","path","val","get","unset","set","bearerValidator","trim","_apply","derived","boundedStorage","deps","fn","makeWebexStore","unboundedStorage","ready","_this","loaded","_keys","_children","reduce","name","session","config","type","request","setOnce","sessionId","refresh","_this$credentials","transform","direction","object","_this2","predicates","payloadTransformer","p","ctx","webex","_promise","all","map","test","then","shouldTransform","extract","target","data","d","Boolean","promise","_ref","alias","applyNamedTransform","resolve","_this3","_len","rest","Array","_key","isString","unshift","_len2","args","_key2","concat","transforms","tx","_ctx","last","getWindow","window","initialize","_this4","merge","trigger","onLoaded","stopListening","nextTick","listenToAndRun","onReady","prototype","key","listenTo","_len3","_key3","addInterceptor","ints","interceptorsObj","interceptor","isFunction","includes","requestDefaults","json","prepareFetchOptions","setTimingsAndFetch","_setTimingsAndFetch","uuid","v4","setConfig","newConfig","token","split","console","warn","replace","info","inspect","depth","util","omit","serialize","props","logout","_this5","_len4","_key4","refresh_token","_assign","onBeforeLogout","reverse","_ref2","plugin","catch","err","logger","clear","_this5$credentials","invalidate","_this5$authorization","authorization","measure","metrics","_this$metrics","sendUnstructured","upload","_this6","file","reject","Error","phases","finalize","defaultsDeep","method","body","uploadProtocol","withCredentials","headers","shunt","EventEmitter","_uploadPhaseInitialize","_uploadPhaseUpload","transferEvents","_len5","_key5","_uploadPhaseFinalize","res","proxyEvents","_this7","debug","_len6","_key6","fileUploadSizeLimitInBytes","fileUploadSizeLimit","currentFileSizeInBytes","byteLength","_uploadAbortSession","_uploadApplySession","response","_this8","url","abortErrorDetails","fileUploadSizeLimitInMB","message","_stringify","opts","phaseOptions","phaseKey","startsWith","substr","_deleteProperty","_this9","NODE_ENV","on","event","total","_this0","_applyDecoratedDescriptor2","retry","_getOwnPropertyDescriptor","mixinWebexInternalCorePlugins","mixinWebexCorePlugins","_default","exports","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 ProxyInterceptor from './interceptors/proxy';\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 HostMapInterceptor from './lib/interceptors/hostmap';\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 ProxyInterceptor: ProxyInterceptor.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 HostMapInterceptor: HostMapInterceptor.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 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 interceptorsObj = this.config.interceptors || interceptors;\n const interceptor = interceptorsObj[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 if (this.config.interceptors) {\n Object.keys(this.config.interceptors).reduce(addInterceptor, ints);\n } else {\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\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 /**\n * Uploads a file provided in `file` property\n *\n * @param {Object} options\n * @returns {Promise}\n */\n upload(options) {\n if (!options || !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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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","require","_util","_interopRequireDefault","_common","_httpCore","_lodash","_ampersandState","_uuid","_auth","_catalogUrl","_networkTiming","_payloadTransformer","_redirect","_requestEvent","_requestLogger","_requestTiming","_responseLogger","_webexHttpError","_userAgent","_proxy","_webexTrackingId","_webexUserAgent","_rateLimit","_embargo","_defaultOptions","_hostmap","_config","_storage","_webexCorePluginMixin","_webexInternalCorePluginMixin","_webexInternalCore","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","interceptors","WebexTrackingIdInterceptor","create","RequestEventInterceptor","RateLimitInterceptor","RequestLoggerInterceptor","process","env","ENABLE_NETWORK_LOGGING","ENABLE_VERBOSE_NETWORK_LOGGING","undefined","ResponseLoggerInterceptor","RequestTimingInterceptor","ServiceInterceptor","CatalogUrlInterceptor","UserAgentInterceptor","ProxyInterceptor","WebexUserAgentInterceptor","AuthInterceptor","KmsDryErrorInterceptor","PayloadTransformerInterceptor","ConversationInterceptor","RedirectInterceptor","HttpStatusInterceptor","error","WebexHttpError","NetworkTimingInterceptor","EmbargoInterceptor","DefaultOptionsInterceptor","HostMapInterceptor","preInterceptors","postInterceptors","MAX_FILE_SIZE_IN_MB","WebexCore","AmpState","extend","version","children","internal","WebexInternalCore","constructor","attrs","options","credentials","supertoken","access_token","path","val","get","unset","set","bearerValidator","trim","_apply","derived","boundedStorage","deps","fn","makeWebexStore","unboundedStorage","ready","_this","loaded","_keys","_children","reduce","name","session","config","type","request","setOnce","sessionId","refresh","_this$credentials","transform","direction","object","_this2","predicates","payloadTransformer","p","ctx","webex","_promise","all","map","test","then","shouldTransform","extract","target","data","d","Boolean","promise","_ref","alias","applyNamedTransform","resolve","_this3","_len","rest","Array","_key","isString","unshift","_len2","args","_key2","concat","transforms","tx","_ctx","last","getWindow","window","initialize","_this4","merge","trigger","onLoaded","stopListening","nextTick","listenToAndRun","onReady","prototype","key","listenTo","_len3","_key3","addInterceptor","ints","_this4$config$service","interceptorsObj","interceptor","isFunction","services","validateCatalogUrls","includes","requestDefaults","json","prepareFetchOptions","setTimingsAndFetch","_setTimingsAndFetch","uuid","v4","setConfig","newConfig","token","split","console","warn","replace","info","inspect","depth","util","omit","serialize","props","logout","_this5","_len4","_key4","refresh_token","_assign","onBeforeLogout","reverse","_ref2","plugin","catch","err","logger","clear","_this5$credentials","invalidate","_this5$authorization","authorization","measure","metrics","_this$metrics","sendUnstructured","upload","_this6","file","reject","Error","phases","finalize","defaultsDeep","method","body","uploadProtocol","withCredentials","headers","shunt","EventEmitter","_uploadPhaseInitialize","_uploadPhaseUpload","transferEvents","_len5","_key5","_uploadPhaseFinalize","res","proxyEvents","_this7","debug","_len6","_key6","fileUploadSizeLimitInBytes","fileUploadSizeLimit","currentFileSizeInBytes","byteLength","_uploadAbortSession","_uploadApplySession","response","_this8","url","abortErrorDetails","fileUploadSizeLimitInMB","message","_stringify","opts","phaseOptions","phaseKey","startsWith","substr","_deleteProperty","_this9","NODE_ENV","on","event","total","_this0","_applyDecoratedDescriptor2","retry","_getOwnPropertyDescriptor","mixinWebexInternalCorePlugins","mixinWebexCorePlugins","_default","exports","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 CatalogUrlInterceptor from './interceptors/catalog-url';\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 ProxyInterceptor from './interceptors/proxy';\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 HostMapInterceptor from './lib/interceptors/hostmap';\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 CatalogUrlInterceptor: CatalogUrlInterceptor.create,\n UserAgentInterceptor: UserAgentInterceptor.create,\n ProxyInterceptor: ProxyInterceptor.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 HostMapInterceptor: HostMapInterceptor.create,\n};\n\nconst preInterceptors = [\n 'ResponseLoggerInterceptor',\n 'RequestTimingInterceptor',\n 'RequestEventInterceptor',\n 'WebexTrackingIdInterceptor',\n 'RateLimitInterceptor',\n 'CatalogUrlInterceptor',\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 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 interceptorsObj = this.config.interceptors || interceptors;\n const interceptor = interceptorsObj[key];\n\n if (!isFunction(interceptor)) {\n return ints;\n }\n\n // CatalogUrlInterceptor is opt-in via config.services.validateCatalogUrls\n if (key === 'CatalogUrlInterceptor' && this.config.services?.validateCatalogUrls !== true) {\n return ints;\n }\n\n ints.push(Reflect.apply(interceptor, this, []));\n\n return ints;\n };\n\n let ints = [];\n\n if (this.config.interceptors) {\n Object.keys(this.config.interceptors).reduce(addInterceptor, ints);\n } else {\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\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 /**\n * Uploads a file provided in `file` property\n *\n * @param {Object} options\n * @returns {Promise}\n */\n upload(options) {\n if (!options || !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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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"@sinonjs/fake-timers": "^6.0.1",
|
|
34
34
|
"@webex/babel-config-legacy": "0.0.0",
|
|
35
35
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
36
|
-
"@webex/internal-plugin-device": "3.12.0-next.
|
|
36
|
+
"@webex/internal-plugin-device": "3.12.0-next.45",
|
|
37
37
|
"@webex/jest-config-legacy": "0.0.0",
|
|
38
38
|
"@webex/legacy-tools": "0.0.0",
|
|
39
|
-
"@webex/plugin-logger": "3.12.0-next.
|
|
39
|
+
"@webex/plugin-logger": "3.12.0-next.45",
|
|
40
40
|
"@webex/test-helper-chai": "3.12.0-next.6",
|
|
41
41
|
"@webex/test-helper-make-local-url": "3.12.0-next.6",
|
|
42
42
|
"@webex/test-helper-mocha": "3.12.0-next.6",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"test:style": "eslint ./src/**/*.*",
|
|
74
74
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
75
75
|
},
|
|
76
|
-
"version": "3.12.0-next.
|
|
76
|
+
"version": "3.12.0-next.45"
|
|
77
77
|
}
|
package/src/config.js
CHANGED
|
@@ -87,6 +87,16 @@ export default {
|
|
|
87
87
|
*/
|
|
88
88
|
validateDomains: true,
|
|
89
89
|
|
|
90
|
+
/**
|
|
91
|
+
* When true, enables the CatalogUrlInterceptor which validates that all
|
|
92
|
+
* outbound request URLs are in the service catalog or allowed domains.
|
|
93
|
+
* This prevents SSRF attacks where attacker-controlled URLs could be
|
|
94
|
+
* sent to the SDK.
|
|
95
|
+
*
|
|
96
|
+
* @type {boolean}
|
|
97
|
+
*/
|
|
98
|
+
validateCatalogUrls: false,
|
|
99
|
+
|
|
90
100
|
/**
|
|
91
101
|
* services that don't need auth validation
|
|
92
102
|
*/
|
package/src/index.js
CHANGED
|
@@ -42,6 +42,7 @@ export {default as WebexHttpError} from './lib/webex-http-error';
|
|
|
42
42
|
export {default as StatelessWebexPlugin} from './lib/stateless-webex-plugin';
|
|
43
43
|
export {default as WebexPlugin} from './lib/webex-plugin';
|
|
44
44
|
export {default as AuthInterceptor} from './interceptors/auth';
|
|
45
|
+
export {default as CatalogUrlInterceptor} from './interceptors/catalog-url';
|
|
45
46
|
export {default as NetworkTimingInterceptor} from './interceptors/network-timing';
|
|
46
47
|
export {default as PayloadTransformerInterceptor} from './interceptors/payload-transformer';
|
|
47
48
|
export {default as RedirectInterceptor} from './interceptors/redirect';
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {Interceptor} from '@webex/http-core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Validates that request URLs are in the service catalog.
|
|
9
|
+
* Prevents SSRF attacks by blocking requests to unknown hosts.
|
|
10
|
+
* @class
|
|
11
|
+
*/
|
|
12
|
+
export default class CatalogUrlInterceptor extends Interceptor {
|
|
13
|
+
/**
|
|
14
|
+
* @returns {CatalogUrlInterceptor}
|
|
15
|
+
*/
|
|
16
|
+
static create() {
|
|
17
|
+
return new CatalogUrlInterceptor({webex: this});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* @see {@link Interceptor#onRequest}
|
|
22
|
+
* @param {Object} options
|
|
23
|
+
* @returns {Object}
|
|
24
|
+
*/
|
|
25
|
+
onRequest(options) {
|
|
26
|
+
if (options.service && !options.uri && !options.url) {
|
|
27
|
+
return Promise.resolve(options);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const url = options.uri || options.url;
|
|
31
|
+
|
|
32
|
+
// No URL to validate
|
|
33
|
+
if (!url) {
|
|
34
|
+
return Promise.resolve(options);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Check if services plugin is available
|
|
38
|
+
if (!this.webex.internal?.services) {
|
|
39
|
+
// Services not loaded yet - allow but log
|
|
40
|
+
this.webex.logger?.warn?.(`catalog-url: Cannot validate URL (services not loaded): ${url}`);
|
|
41
|
+
|
|
42
|
+
return Promise.resolve(options);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const {services} = this.webex.internal;
|
|
46
|
+
|
|
47
|
+
// Check if URL is in service catalog
|
|
48
|
+
if (services.getServiceFromUrl(url)) {
|
|
49
|
+
return Promise.resolve(options);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Honor allowedDomains (same policy as auth interceptor)
|
|
53
|
+
if (
|
|
54
|
+
services.validateDomains &&
|
|
55
|
+
services.hasAllowedDomains() &&
|
|
56
|
+
services.isAllowedDomainUrl(url)
|
|
57
|
+
) {
|
|
58
|
+
return Promise.resolve(options);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// URL not in catalog or allowed domains - block the request
|
|
62
|
+
return Promise.reject(
|
|
63
|
+
new Error(`Request blocked: URL not in service catalog or allowed domains: ${url}.`)
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -6,6 +6,48 @@ import {union} from 'lodash';
|
|
|
6
6
|
import ServiceUrl from './service-url';
|
|
7
7
|
import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* Check if a candidate URL matches a catalog URL with proper origin validation.
|
|
11
|
+
* This prevents bypasses like https://trusted.example.attacker.com matching https://trusted.example
|
|
12
|
+
*
|
|
13
|
+
* @param {string} candidateUrlString - The URL to validate
|
|
14
|
+
* @param {string} catalogUrlString - The catalog URL to compare against
|
|
15
|
+
* @returns {boolean} - True if the candidate URL is under the catalog URL's origin and path
|
|
16
|
+
*/
|
|
17
|
+
export function matchesCatalogUrl(candidateUrlString, catalogUrlString) {
|
|
18
|
+
try {
|
|
19
|
+
const candidateUrl = new URL(candidateUrlString);
|
|
20
|
+
const catalogUrl = new URL(catalogUrlString);
|
|
21
|
+
|
|
22
|
+
// Origins must match exactly (scheme + host + port)
|
|
23
|
+
if (candidateUrl.origin !== catalogUrl.origin) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Normalize paths by removing trailing slashes (except root "/")
|
|
28
|
+
const catalogPath = catalogUrl.pathname.replace(/\/$/, '') || '/';
|
|
29
|
+
const candidatePath = candidateUrl.pathname;
|
|
30
|
+
|
|
31
|
+
if (catalogPath === '/') {
|
|
32
|
+
// Root path matches everything under this origin
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (candidatePath.startsWith(catalogPath)) {
|
|
37
|
+
// Ensure we're at a path boundary, not mid-segment
|
|
38
|
+
// e.g., /api/v1 should match /api/v1/foo but not /api/v1extra
|
|
39
|
+
// nextChar is undefined for exact match, '/' for valid extension
|
|
40
|
+
const nextChar = candidatePath[catalogPath.length];
|
|
41
|
+
|
|
42
|
+
return nextChar === '/' || nextChar === undefined;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return false;
|
|
46
|
+
} catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
9
51
|
/* eslint-disable no-underscore-dangle */
|
|
10
52
|
/**
|
|
11
53
|
* @class
|
|
@@ -246,20 +288,26 @@ const ServiceCatalog = AmpState.extend({
|
|
|
246
288
|
...this.serviceGroups.override,
|
|
247
289
|
];
|
|
248
290
|
|
|
291
|
+
// Invalid URLs cannot match any service
|
|
292
|
+
try {
|
|
293
|
+
// eslint-disable-next-line no-new
|
|
294
|
+
new URL(url);
|
|
295
|
+
} catch {
|
|
296
|
+
return undefined;
|
|
297
|
+
}
|
|
298
|
+
|
|
249
299
|
return serviceUrls.find((serviceUrl) => {
|
|
250
|
-
// Check
|
|
251
|
-
if (url
|
|
300
|
+
// Check if the URL matches the default URL with proper origin validation
|
|
301
|
+
if (matchesCatalogUrl(url, serviceUrl.defaultUrl)) {
|
|
252
302
|
return true;
|
|
253
303
|
}
|
|
254
304
|
|
|
255
|
-
//
|
|
256
|
-
// These are made by swapping the host of the default URL
|
|
257
|
-
// with that of an alternate host
|
|
305
|
+
// Check alternate URLs (built by swapping host with alternate hosts)
|
|
258
306
|
for (const host of serviceUrl.hosts) {
|
|
259
307
|
const alternateUrl = new URL(serviceUrl.defaultUrl);
|
|
260
308
|
alternateUrl.host = host.host;
|
|
261
309
|
|
|
262
|
-
if (url
|
|
310
|
+
if (matchesCatalogUrl(url, alternateUrl.toString())) {
|
|
263
311
|
return true;
|
|
264
312
|
}
|
|
265
313
|
}
|
|
@@ -1103,9 +1103,16 @@ const Services = WebexPlugin.extend({
|
|
|
1103
1103
|
requestObject.headers = {authorization: token};
|
|
1104
1104
|
}
|
|
1105
1105
|
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1106
|
+
const sendRequest = () => this.request(requestObject);
|
|
1107
|
+
|
|
1108
|
+
const responsePromise = this.webex.internal.newMetrics
|
|
1109
|
+
? this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency(
|
|
1110
|
+
sendRequest,
|
|
1111
|
+
'internal.get.u2c.time'
|
|
1112
|
+
)
|
|
1113
|
+
: sendRequest();
|
|
1114
|
+
|
|
1115
|
+
return responsePromise.then(({body}) => body);
|
|
1109
1116
|
},
|
|
1110
1117
|
|
|
1111
1118
|
/**
|
|
@@ -4,6 +4,7 @@ import {union} from 'lodash';
|
|
|
4
4
|
import ServiceDetail from './service-detail';
|
|
5
5
|
import {IServiceDetail, ServiceGroup} from './types';
|
|
6
6
|
import {matchAllowedDomain, normalizeAllowedDomains} from '../domains';
|
|
7
|
+
import {matchesCatalogUrl} from '../services/service-catalog';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* @class
|
|
@@ -201,7 +202,7 @@ const ServiceCatalog = AmpState.extend({
|
|
|
201
202
|
|
|
202
203
|
return serviceDetails.find(({serviceUrls}) => {
|
|
203
204
|
for (const serviceUrl of serviceUrls) {
|
|
204
|
-
if (url
|
|
205
|
+
if (matchesCatalogUrl(url, serviceUrl.baseUrl)) {
|
|
205
206
|
return true;
|
|
206
207
|
}
|
|
207
208
|
}
|
|
@@ -7,6 +7,7 @@ import METRICS from '../metrics';
|
|
|
7
7
|
import ServiceCatalog from './service-catalog';
|
|
8
8
|
import fedRampServices from './service-fed-ramp';
|
|
9
9
|
import {COMMERCIAL_ALLOWED_DOMAINS} from '../constants';
|
|
10
|
+
import {matchesCatalogUrl} from '../services/service-catalog';
|
|
10
11
|
import {
|
|
11
12
|
ActiveServices,
|
|
12
13
|
IServiceCatalog,
|
|
@@ -15,6 +16,7 @@ import {
|
|
|
15
16
|
ServiceHostmap,
|
|
16
17
|
ServiceGroup,
|
|
17
18
|
ServiceHost,
|
|
19
|
+
ServiceUrl,
|
|
18
20
|
SelectionMeta,
|
|
19
21
|
} from './types';
|
|
20
22
|
|
|
@@ -988,7 +990,9 @@ const Services = WebexPlugin.extend({
|
|
|
988
990
|
|
|
989
991
|
const priorityUrl = service.get();
|
|
990
992
|
const defaultUrl = new URL(
|
|
991
|
-
service.serviceUrls.find((serviceUrl) =>
|
|
993
|
+
service.serviceUrls.find((serviceUrl: ServiceUrl) =>
|
|
994
|
+
matchesCatalogUrl(url, serviceUrl.baseUrl)
|
|
995
|
+
).baseUrl
|
|
992
996
|
).href;
|
|
993
997
|
|
|
994
998
|
return {
|
|
@@ -1257,9 +1261,16 @@ const Services = WebexPlugin.extend({
|
|
|
1257
1261
|
requestObject.headers = {authorization: token};
|
|
1258
1262
|
}
|
|
1259
1263
|
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1264
|
+
const sendRequest = () => this.request(requestObject);
|
|
1265
|
+
|
|
1266
|
+
const responsePromise = this.webex.internal.newMetrics
|
|
1267
|
+
? this.webex.internal.newMetrics.callDiagnosticLatencies.measureLatency(
|
|
1268
|
+
sendRequest,
|
|
1269
|
+
'internal.get.u2c.time'
|
|
1270
|
+
)
|
|
1271
|
+
: sendRequest();
|
|
1272
|
+
|
|
1273
|
+
return responsePromise.then(({body}) => this._formatReceivedHostmap(body || {}));
|
|
1263
1274
|
},
|
|
1264
1275
|
|
|
1265
1276
|
/**
|
package/src/webex-core.js
CHANGED
|
@@ -17,6 +17,7 @@ import AmpState from 'ampersand-state';
|
|
|
17
17
|
import uuid from 'uuid';
|
|
18
18
|
|
|
19
19
|
import AuthInterceptor from './interceptors/auth';
|
|
20
|
+
import CatalogUrlInterceptor from './interceptors/catalog-url';
|
|
20
21
|
import NetworkTimingInterceptor from './interceptors/network-timing';
|
|
21
22
|
import PayloadTransformerInterceptor from './interceptors/payload-transformer';
|
|
22
23
|
import RedirectInterceptor from './interceptors/redirect';
|
|
@@ -58,6 +59,7 @@ const interceptors = {
|
|
|
58
59
|
/* eslint-enable no-extra-parens */
|
|
59
60
|
RequestTimingInterceptor: RequestTimingInterceptor.create,
|
|
60
61
|
ServiceInterceptor: undefined,
|
|
62
|
+
CatalogUrlInterceptor: CatalogUrlInterceptor.create,
|
|
61
63
|
UserAgentInterceptor: UserAgentInterceptor.create,
|
|
62
64
|
ProxyInterceptor: ProxyInterceptor.create,
|
|
63
65
|
WebexUserAgentInterceptor: WebexUserAgentInterceptor.create,
|
|
@@ -83,6 +85,7 @@ const preInterceptors = [
|
|
|
83
85
|
'RequestEventInterceptor',
|
|
84
86
|
'WebexTrackingIdInterceptor',
|
|
85
87
|
'RateLimitInterceptor',
|
|
88
|
+
'CatalogUrlInterceptor',
|
|
86
89
|
];
|
|
87
90
|
|
|
88
91
|
const postInterceptors = [
|
|
@@ -393,6 +396,11 @@ const WebexCore = AmpState.extend({
|
|
|
393
396
|
return ints;
|
|
394
397
|
}
|
|
395
398
|
|
|
399
|
+
// CatalogUrlInterceptor is opt-in via config.services.validateCatalogUrls
|
|
400
|
+
if (key === 'CatalogUrlInterceptor' && this.config.services?.validateCatalogUrls !== true) {
|
|
401
|
+
return ints;
|
|
402
|
+
}
|
|
403
|
+
|
|
396
404
|
ints.push(Reflect.apply(interceptor, this, []));
|
|
397
405
|
|
|
398
406
|
return ints;
|
|
@@ -630,6 +630,37 @@ describe('webex-core', () => {
|
|
|
630
630
|
});
|
|
631
631
|
});
|
|
632
632
|
|
|
633
|
+
describe('#getClientToken()', () => {
|
|
634
|
+
it('requests a client token without bypassing catalog URL validation', async () => {
|
|
635
|
+
const webex = new MockWebex();
|
|
636
|
+
const credentials = new Credentials(undefined, {parent: webex});
|
|
637
|
+
const uri = 'https://idbroker.webex.com/idb/oauth2/v1/access_token';
|
|
638
|
+
const scope = 'spark:all';
|
|
639
|
+
|
|
640
|
+
webex.request.resolves({body: {access_token: 'AT', token_type: 'Bearer'}});
|
|
641
|
+
|
|
642
|
+
const token = await credentials.getClientToken({uri, scope});
|
|
643
|
+
|
|
644
|
+
assert.calledOnceWithExactly(webex.request, {
|
|
645
|
+
method: 'POST',
|
|
646
|
+
uri,
|
|
647
|
+
form: {
|
|
648
|
+
grant_type: 'client_credentials',
|
|
649
|
+
scope,
|
|
650
|
+
self_contained_token: true,
|
|
651
|
+
},
|
|
652
|
+
auth: {
|
|
653
|
+
user: 'fake',
|
|
654
|
+
pass: 'fake',
|
|
655
|
+
sendImmediately: true,
|
|
656
|
+
},
|
|
657
|
+
shouldRefreshAccessToken: false,
|
|
658
|
+
});
|
|
659
|
+
assert.instanceOf(token, Token);
|
|
660
|
+
assert.equal(token.access_token, 'AT');
|
|
661
|
+
});
|
|
662
|
+
});
|
|
663
|
+
|
|
633
664
|
describe('#getUserToken()', () => {
|
|
634
665
|
it('resolves with the supertoken if the supertoken matches the requested scopes', () => {
|
|
635
666
|
const webex = new MockWebex();
|