@webex/webex-core 3.9.0 → 3.10.0
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/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/interceptors/proxy.js +97 -0
- package/dist/interceptors/proxy.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/services.js +1 -1
- package/dist/lib/services-v2/service-catalog.js +11 -1
- package/dist/lib/services-v2/service-catalog.js.map +1 -1
- package/dist/lib/services-v2/services-v2.js +106 -46
- package/dist/lib/services-v2/services-v2.js.map +1 -1
- package/dist/lib/services-v2/types.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/webex-core.js +51 -59
- package/dist/webex-core.js.map +1 -1
- package/package.json +14 -14
- package/src/index.js +1 -0
- package/src/interceptors/proxy.js +70 -0
- package/src/lib/services-v2/service-catalog.ts +14 -1
- package/src/lib/services-v2/services-v2.ts +73 -11
- package/src/lib/services-v2/types.ts +1 -1
- package/src/webex-core.js +10 -2
- package/test/integration/spec/services-v2/service-catalog.js +51 -15
- package/test/integration/spec/services-v2/services-v2.js +79 -4
- package/test/unit/spec/interceptors/proxy.js +73 -0
- package/test/unit/spec/services-v2/services-v2.ts +189 -6
- package/test/unit/spec/webex-core.js +62 -2
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","_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","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","_asyncToGenerator2","_regenerator","mark","_callee","shunt","wrap","_callee$","_context","prev","next","file","abrupt","reject","Error","phases","finalize","defaultsDeep","method","body","uploadProtocol","withCredentials","headers","EventEmitter","_uploadPhaseInitialize","_uploadPhaseUpload","transferEvents","_len5","_key5","_uploadPhaseFinalize","res","proxyEvents","stop","_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","_this10","_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 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 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 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":["_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","_this10","_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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"}
|
package/package.json
CHANGED
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"directory": "packages/@webex/webex-core"
|
|
21
21
|
},
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=
|
|
23
|
+
"node": ">=18"
|
|
24
24
|
},
|
|
25
25
|
"browserify": {
|
|
26
26
|
"transform": [
|
|
@@ -33,16 +33,16 @@
|
|
|
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.
|
|
36
|
+
"@webex/internal-plugin-device": "3.10.0",
|
|
37
37
|
"@webex/jest-config-legacy": "0.0.0",
|
|
38
38
|
"@webex/legacy-tools": "0.0.0",
|
|
39
|
-
"@webex/plugin-logger": "3.
|
|
40
|
-
"@webex/test-helper-chai": "3.
|
|
41
|
-
"@webex/test-helper-make-local-url": "3.
|
|
42
|
-
"@webex/test-helper-mocha": "3.
|
|
43
|
-
"@webex/test-helper-mock-webex": "3.
|
|
44
|
-
"@webex/test-helper-refresh-callback": "3.
|
|
45
|
-
"@webex/test-helper-test-users": "3.
|
|
39
|
+
"@webex/plugin-logger": "3.10.0",
|
|
40
|
+
"@webex/test-helper-chai": "3.10.0",
|
|
41
|
+
"@webex/test-helper-make-local-url": "3.10.0",
|
|
42
|
+
"@webex/test-helper-mocha": "3.10.0",
|
|
43
|
+
"@webex/test-helper-mock-webex": "3.10.0",
|
|
44
|
+
"@webex/test-helper-refresh-callback": "3.10.0",
|
|
45
|
+
"@webex/test-helper-test-users": "3.10.0",
|
|
46
46
|
"chai": "^4.3.4",
|
|
47
47
|
"chai-as-promised": "^7.1.1",
|
|
48
48
|
"eslint": "^8.24.0",
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"sinon": "^9.2.4"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@webex/common": "3.
|
|
54
|
-
"@webex/common-timers": "3.
|
|
55
|
-
"@webex/http-core": "3.
|
|
56
|
-
"@webex/storage-adapter-spec": "3.
|
|
53
|
+
"@webex/common": "3.10.0",
|
|
54
|
+
"@webex/common-timers": "3.10.0",
|
|
55
|
+
"@webex/http-core": "3.10.0",
|
|
56
|
+
"@webex/storage-adapter-spec": "3.10.0",
|
|
57
57
|
"ampersand-collection": "^2.0.2",
|
|
58
58
|
"ampersand-events": "^2.0.2",
|
|
59
59
|
"ampersand-state": "^5.0.3",
|
|
@@ -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.
|
|
76
|
+
"version": "3.10.0"
|
|
77
77
|
}
|
package/src/index.js
CHANGED
|
@@ -50,6 +50,7 @@ export {default as RequestEventInterceptor} from './interceptors/request-event';
|
|
|
50
50
|
export {default as RequestLoggerInterceptor} from './interceptors/request-logger';
|
|
51
51
|
export {default as RequestTimingInterceptor} from './interceptors/request-timing';
|
|
52
52
|
export {default as UserAgentInterceptor} from './interceptors/user-agent';
|
|
53
|
+
export {default as ProxyInterceptor} from './interceptors/proxy';
|
|
53
54
|
export {default as WebexTrackingIdInterceptor} from './interceptors/webex-tracking-id';
|
|
54
55
|
export {sequenceNumbers as webexTrackingIdSequenceNumbers} from './interceptors/webex-tracking-id';
|
|
55
56
|
export {default as WebexUserAgentInterceptor} from './interceptors/webex-user-agent';
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import {inBrowser} from '@webex/common';
|
|
6
|
+
import {Interceptor} from '@webex/http-core';
|
|
7
|
+
import {get} from 'lodash';
|
|
8
|
+
|
|
9
|
+
const strings = new WeakMap();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Sets a proxy on all requests if one is not present.
|
|
13
|
+
* Defaults to none, though a custom proxy can be set
|
|
14
|
+
* using the proxy configuration. e.g.
|
|
15
|
+
*
|
|
16
|
+
* webex = WebexSdk.init({
|
|
17
|
+
* credentials: {
|
|
18
|
+
* supertoken: superToken
|
|
19
|
+
* },
|
|
20
|
+
* config: {
|
|
21
|
+
* credentials: {
|
|
22
|
+
* client_id,
|
|
23
|
+
* client_secret
|
|
24
|
+
* },
|
|
25
|
+
* proxy: 'http://myproxy.company.com'
|
|
26
|
+
* }
|
|
27
|
+
* });
|
|
28
|
+
*/
|
|
29
|
+
export default class ProxyInterceptor extends Interceptor {
|
|
30
|
+
/**
|
|
31
|
+
* @param {Object} [options={}]
|
|
32
|
+
* @param {WebexCore} [options.webex]
|
|
33
|
+
* @private
|
|
34
|
+
* @returns {ProxyInterceptor}
|
|
35
|
+
*/
|
|
36
|
+
constructor(options = {}) {
|
|
37
|
+
const proxy = get(options, 'webex.config.proxy');
|
|
38
|
+
|
|
39
|
+
super(options);
|
|
40
|
+
if (proxy) {
|
|
41
|
+
strings.set(this, proxy);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* @returns {ProxyInterceptor}
|
|
47
|
+
*/
|
|
48
|
+
static create() {
|
|
49
|
+
return new ProxyInterceptor({webex: this});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* @see Interceptor#onRequest
|
|
54
|
+
* @param {Object} options
|
|
55
|
+
* @returns {Object}
|
|
56
|
+
*/
|
|
57
|
+
onRequest(options) {
|
|
58
|
+
// Do not set a proxy for browsers
|
|
59
|
+
if (inBrowser) {
|
|
60
|
+
return options;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const proxy = strings.get(this);
|
|
64
|
+
if (proxy) {
|
|
65
|
+
options.proxy = proxy;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return options;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -49,6 +49,7 @@ const ServiceCatalog = AmpState.extend({
|
|
|
49
49
|
}),
|
|
50
50
|
],
|
|
51
51
|
isReady: ['boolean', false, false],
|
|
52
|
+
timestamp: ['string', false, ''],
|
|
52
53
|
allowedDomains: ['array', false, () => []],
|
|
53
54
|
},
|
|
54
55
|
|
|
@@ -300,9 +301,14 @@ const ServiceCatalog = AmpState.extend({
|
|
|
300
301
|
* @emits ServiceCatalog#postauthorized
|
|
301
302
|
* @param {ServiceGroup} serviceGroup
|
|
302
303
|
* @param {Array<IServiceDetail>} serviceDetails
|
|
304
|
+
* @param {timestamp<string>} timestamp of the catalog
|
|
303
305
|
* @returns {void}
|
|
304
306
|
*/
|
|
305
|
-
updateServiceGroups(
|
|
307
|
+
updateServiceGroups(
|
|
308
|
+
serviceGroup: ServiceGroup,
|
|
309
|
+
serviceDetails: Array<IServiceDetail>,
|
|
310
|
+
timestamp?: string
|
|
311
|
+
) {
|
|
306
312
|
const currentServiceDetails = this.serviceGroups[serviceGroup];
|
|
307
313
|
|
|
308
314
|
const unusedServicesDetails = currentServiceDetails.filter((serviceDetail) =>
|
|
@@ -313,7 +319,13 @@ const ServiceCatalog = AmpState.extend({
|
|
|
313
319
|
|
|
314
320
|
serviceDetails.forEach((serviceObj) => {
|
|
315
321
|
const serviceDetail = this._getServiceDetail(serviceObj.id, serviceGroup);
|
|
322
|
+
serviceObj?.serviceUrls?.sort((a, b) => {
|
|
323
|
+
if (a.priority < 0 && b.priority < 0) return 0;
|
|
324
|
+
if (a.priority < 0) return 1;
|
|
325
|
+
if (b.priority < 0) return -1;
|
|
316
326
|
|
|
327
|
+
return a.priority - b.priority;
|
|
328
|
+
});
|
|
317
329
|
if (serviceDetail) {
|
|
318
330
|
serviceDetail.serviceUrls = serviceObj.serviceUrls || [];
|
|
319
331
|
} else {
|
|
@@ -321,6 +333,7 @@ const ServiceCatalog = AmpState.extend({
|
|
|
321
333
|
}
|
|
322
334
|
});
|
|
323
335
|
|
|
336
|
+
this.timestamp = timestamp;
|
|
324
337
|
this.status[serviceGroup].ready = true;
|
|
325
338
|
this.trigger(serviceGroup);
|
|
326
339
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import sha256 from 'crypto-js/sha256';
|
|
2
2
|
|
|
3
|
-
import {union, unionBy} from 'lodash';
|
|
3
|
+
import {toNumber, union, unionBy} from 'lodash';
|
|
4
4
|
import WebexPlugin from '../webex-plugin';
|
|
5
5
|
|
|
6
6
|
import METRICS from '../metrics';
|
|
@@ -159,9 +159,8 @@ const Services = WebexPlugin.extend({
|
|
|
159
159
|
serviceGroup = 'postauth';
|
|
160
160
|
break;
|
|
161
161
|
}
|
|
162
|
-
|
|
163
162
|
// confirm catalog update for group is not in progress.
|
|
164
|
-
if (catalog.status[serviceGroup]
|
|
163
|
+
if (catalog.status?.[serviceGroup]?.collecting) {
|
|
165
164
|
return this.waitForCatalog(serviceGroup);
|
|
166
165
|
}
|
|
167
166
|
|
|
@@ -196,7 +195,11 @@ const Services = WebexPlugin.extend({
|
|
|
196
195
|
forceRefresh,
|
|
197
196
|
})
|
|
198
197
|
.then((serviceHostMap: ServiceHostmap) => {
|
|
199
|
-
catalog.updateServiceGroups(
|
|
198
|
+
catalog.updateServiceGroups(
|
|
199
|
+
serviceGroup,
|
|
200
|
+
serviceHostMap?.services,
|
|
201
|
+
serviceHostMap?.timestamp
|
|
202
|
+
);
|
|
200
203
|
this.updateCredentialsConfig();
|
|
201
204
|
catalog.status[serviceGroup].collecting = false;
|
|
202
205
|
})
|
|
@@ -345,7 +348,56 @@ const Services = WebexPlugin.extend({
|
|
|
345
348
|
})
|
|
346
349
|
);
|
|
347
350
|
},
|
|
351
|
+
/**
|
|
352
|
+
* Update cluster id via mercury service update. If the cluster id does not exist,
|
|
353
|
+
* fetch new catalog.
|
|
354
|
+
*
|
|
355
|
+
* @param {ActiveServices} newActiveClusters - The new active clusters to switch to.
|
|
356
|
+
* @returns {Promsie<void>}
|
|
357
|
+
* */
|
|
358
|
+
switchActiveClusterIds(newActiveClusters: ActiveServices): Promise<void> {
|
|
359
|
+
this.logger.info('services: switching active cluster ids');
|
|
360
|
+
|
|
361
|
+
const newActiveClusterIds = Object.values(newActiveClusters);
|
|
362
|
+
|
|
363
|
+
const missingClusterIds = newActiveClusterIds.some((clusterId) => {
|
|
364
|
+
// if the clusterId does not exist in the catalog, fetch the catalog
|
|
365
|
+
return !this._services.find((service) => service.id === clusterId);
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
if (missingClusterIds) {
|
|
369
|
+
this.logger.warn(
|
|
370
|
+
'services: some cluster ids do not exist in the catalog, fetching the catalog'
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
// fetch the catalog
|
|
374
|
+
return this.initServiceCatalogs(true);
|
|
375
|
+
}
|
|
376
|
+
// update the active services
|
|
377
|
+
this._updateActiveServices(newActiveClusters);
|
|
378
|
+
this.logger.info('services: active cluster ids updated successfully');
|
|
348
379
|
|
|
380
|
+
return Promise.resolve();
|
|
381
|
+
},
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Invalidate cache via mercury notification. If the timestamp is newer than current,
|
|
385
|
+
* refetch catalog services.
|
|
386
|
+
*
|
|
387
|
+
* @param {string} timestamp - The timestamp of invalidation notification.
|
|
388
|
+
* @returns {Promsie<void>}
|
|
389
|
+
* */
|
|
390
|
+
invalidateCache(timestamp: string): Promise<void> {
|
|
391
|
+
this.logger.info('services: invalidate cache, timestamp:', timestamp);
|
|
392
|
+
const lastTime = toNumber(this._getCatalog()?.timestamp) || 0;
|
|
393
|
+
const invalidateTime = toNumber(timestamp) || 0;
|
|
394
|
+
if (invalidateTime > lastTime) {
|
|
395
|
+
this.logger.info('services: invalidateCache, refresh services');
|
|
396
|
+
this.initServiceCatalogs(true);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return Promise.resolve();
|
|
400
|
+
},
|
|
349
401
|
/**
|
|
350
402
|
* Get user meeting preferences (preferred webex site).
|
|
351
403
|
*
|
|
@@ -462,7 +514,11 @@ const Services = WebexPlugin.extend({
|
|
|
462
514
|
|
|
463
515
|
const serviceHostMap = this._formatReceivedHostmap(hostMap);
|
|
464
516
|
|
|
465
|
-
return catalog.updateServiceGroups(
|
|
517
|
+
return catalog.updateServiceGroups(
|
|
518
|
+
serviceGroup,
|
|
519
|
+
serviceHostMap?.services,
|
|
520
|
+
serviceHostMap?.timestamp
|
|
521
|
+
);
|
|
466
522
|
},
|
|
467
523
|
|
|
468
524
|
/**
|
|
@@ -698,8 +754,14 @@ const Services = WebexPlugin.extend({
|
|
|
698
754
|
* catalog endpoint.
|
|
699
755
|
* @returns {Array<Service>}
|
|
700
756
|
*/
|
|
701
|
-
_formatReceivedHostmap({services, activeServices}) {
|
|
702
|
-
const formattedHostmap =
|
|
757
|
+
_formatReceivedHostmap({services, activeServices, timestamp, orgId, format}) {
|
|
758
|
+
const formattedHostmap: ServiceHostmap = {
|
|
759
|
+
activeServices,
|
|
760
|
+
services: services.map((service) => this._formatHostMapEntry(service)),
|
|
761
|
+
timestamp,
|
|
762
|
+
orgId,
|
|
763
|
+
format,
|
|
764
|
+
};
|
|
703
765
|
this._updateActiveServices(activeServices);
|
|
704
766
|
this._updateServices(services);
|
|
705
767
|
|
|
@@ -927,10 +989,10 @@ const Services = WebexPlugin.extend({
|
|
|
927
989
|
|
|
928
990
|
/**
|
|
929
991
|
* Make the initial requests to collect the root catalogs.
|
|
930
|
-
*
|
|
992
|
+
* @param {boolean} refresh - Is need force update
|
|
931
993
|
* @returns {Promise<void, Error>} - Errors if the token is unavailable.
|
|
932
994
|
*/
|
|
933
|
-
initServiceCatalogs(): Promise<void> {
|
|
995
|
+
initServiceCatalogs(refresh = false): Promise<void> {
|
|
934
996
|
this.logger.info('services: initializing initial service catalogs');
|
|
935
997
|
|
|
936
998
|
// Destructure the credentials plugin.
|
|
@@ -943,12 +1005,12 @@ const Services = WebexPlugin.extend({
|
|
|
943
1005
|
// Get the user's OrgId.
|
|
944
1006
|
.then(() => credentials.getOrgId())
|
|
945
1007
|
// Begin collecting the preauth/limited catalog.
|
|
946
|
-
.then((orgId) => this.collectPreauthCatalog({orgId}))
|
|
1008
|
+
.then((orgId) => this.collectPreauthCatalog({orgId}, refresh))
|
|
947
1009
|
.then(() => {
|
|
948
1010
|
// Validate if the token is authorized.
|
|
949
1011
|
if (credentials.canAuthorize) {
|
|
950
1012
|
// Attempt to collect the postauth catalog.
|
|
951
|
-
return this.updateServices().catch(() => {
|
|
1013
|
+
return this.updateServices({forceRefresh: refresh}).catch(() => {
|
|
952
1014
|
this.initFailed = true;
|
|
953
1015
|
this.logger.warn('services: cannot retrieve postauth catalog');
|
|
954
1016
|
});
|
package/src/webex-core.js
CHANGED
|
@@ -26,6 +26,7 @@ import RequestTimingInterceptor from './interceptors/request-timing';
|
|
|
26
26
|
import ResponseLoggerInterceptor from './interceptors/response-logger';
|
|
27
27
|
import WebexHttpError from './lib/webex-http-error';
|
|
28
28
|
import UserAgentInterceptor from './interceptors/user-agent';
|
|
29
|
+
import ProxyInterceptor from './interceptors/proxy';
|
|
29
30
|
import WebexTrackingIdInterceptor from './interceptors/webex-tracking-id';
|
|
30
31
|
import WebexUserAgentInterceptor from './interceptors/webex-user-agent';
|
|
31
32
|
import RateLimitInterceptor from './interceptors/rate-limit';
|
|
@@ -58,6 +59,7 @@ const interceptors = {
|
|
|
58
59
|
RequestTimingInterceptor: RequestTimingInterceptor.create,
|
|
59
60
|
ServiceInterceptor: undefined,
|
|
60
61
|
UserAgentInterceptor: UserAgentInterceptor.create,
|
|
62
|
+
ProxyInterceptor: ProxyInterceptor.create,
|
|
61
63
|
WebexUserAgentInterceptor: WebexUserAgentInterceptor.create,
|
|
62
64
|
AuthInterceptor: AuthInterceptor.create,
|
|
63
65
|
KmsDryErrorInterceptor: undefined,
|
|
@@ -578,8 +580,14 @@ const WebexCore = AmpState.extend({
|
|
|
578
580
|
return Promise.resolve();
|
|
579
581
|
},
|
|
580
582
|
|
|
581
|
-
|
|
582
|
-
|
|
583
|
+
/**
|
|
584
|
+
* Uploads a file provided in `file` property
|
|
585
|
+
*
|
|
586
|
+
* @param {Object} options
|
|
587
|
+
* @returns {Promise}
|
|
588
|
+
*/
|
|
589
|
+
upload(options) {
|
|
590
|
+
if (!options || !options.file) {
|
|
583
591
|
return Promise.reject(new Error('`options.file` is required'));
|
|
584
592
|
}
|
|
585
593
|
|