@webex/webex-core 3.0.0-beta.13 → 3.0.0-beta.15
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.map +1 -1
- package/dist/credentials-config.js +44 -44
- package/dist/credentials-config.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interceptors/auth.js.map +1 -1
- package/dist/interceptors/default-options.js.map +1 -1
- package/dist/interceptors/embargo.js.map +1 -1
- package/dist/interceptors/payload-transformer.js.map +1 -1
- package/dist/interceptors/rate-limit.js +4 -4
- package/dist/interceptors/rate-limit.js.map +1 -1
- package/dist/interceptors/redirect.js.map +1 -1
- package/dist/interceptors/request-event.js.map +1 -1
- package/dist/interceptors/request-logger.js.map +1 -1
- package/dist/interceptors/response-logger.js.map +1 -1
- package/dist/interceptors/user-agent.js.map +1 -1
- package/dist/interceptors/webex-user-agent.js.map +1 -1
- package/dist/lib/batcher.js +1 -1
- package/dist/lib/batcher.js.map +1 -1
- package/dist/lib/credentials/credentials.js +21 -6
- package/dist/lib/credentials/credentials.js.map +1 -1
- package/dist/lib/credentials/grant-errors.js.map +1 -1
- package/dist/lib/credentials/index.js.map +1 -1
- package/dist/lib/credentials/scope.js.map +1 -1
- package/dist/lib/credentials/token-collection.js.map +1 -1
- package/dist/lib/credentials/token.js +19 -5
- package/dist/lib/credentials/token.js.map +1 -1
- package/dist/lib/page.js +2 -0
- package/dist/lib/page.js.map +1 -1
- package/dist/lib/services/constants.js.map +1 -1
- package/dist/lib/services/index.js.map +1 -1
- package/dist/lib/services/interceptors/server-error.js +2 -2
- package/dist/lib/services/interceptors/server-error.js.map +1 -1
- package/dist/lib/services/interceptors/service.js +1 -1
- package/dist/lib/services/interceptors/service.js.map +1 -1
- package/dist/lib/services/metrics.js.map +1 -1
- package/dist/lib/services/service-catalog.js.map +1 -1
- package/dist/lib/services/service-fed-ramp.js.map +1 -1
- package/dist/lib/services/service-host.js +6 -6
- package/dist/lib/services/service-host.js.map +1 -1
- package/dist/lib/services/service-registry.js.map +1 -1
- package/dist/lib/services/service-state.js.map +1 -1
- package/dist/lib/services/service-url.js.map +1 -1
- package/dist/lib/services/services.js +9 -7
- package/dist/lib/services/services.js.map +1 -1
- package/dist/lib/stateless-webex-plugin.js.map +1 -1
- package/dist/lib/storage/decorators.js.map +1 -1
- package/dist/lib/storage/index.js +2 -2
- package/dist/lib/storage/index.js.map +1 -1
- package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
- package/dist/lib/storage/make-webex-store.js.map +1 -1
- package/dist/lib/storage/memory-store-adapter.js.map +1 -1
- package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-http-error.js.map +1 -1
- package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
- package/dist/lib/webex-plugin.js.map +1 -1
- package/dist/plugins/logger.js +1 -1
- package/dist/plugins/logger.js.map +1 -1
- package/dist/webex-core.js +2 -2
- package/dist/webex-core.js.map +1 -1
- package/dist/webex-internal-core.js.map +1 -1
- package/package.json +14 -14
- package/src/config.js +9 -11
- package/src/credentials-config.js +110 -72
- package/src/index.js +4 -14
- package/src/interceptors/auth.js +36 -37
- package/src/interceptors/default-options.js +0 -1
- package/src/interceptors/embargo.js +1 -1
- package/src/interceptors/payload-transformer.js +1 -2
- package/src/interceptors/rate-limit.js +8 -5
- package/src/interceptors/redirect.js +14 -8
- package/src/interceptors/request-event.js +4 -8
- package/src/interceptors/request-logger.js +8 -5
- package/src/interceptors/response-logger.js +11 -8
- package/src/interceptors/user-agent.js +1 -2
- package/src/interceptors/webex-user-agent.js +3 -9
- package/src/lib/batcher.js +70 -69
- package/src/lib/credentials/credentials.js +112 -122
- package/src/lib/credentials/grant-errors.js +6 -7
- package/src/lib/credentials/index.js +1 -4
- package/src/lib/credentials/scope.js +1 -4
- package/src/lib/credentials/token-collection.js +1 -1
- package/src/lib/credentials/token.js +86 -80
- package/src/lib/page.js +10 -11
- package/src/lib/services/constants.js +3 -13
- package/src/lib/services/index.js +2 -2
- package/src/lib/services/interceptors/server-error.js +12 -7
- package/src/lib/services/interceptors/service.js +6 -5
- package/src/lib/services/metrics.js +1 -1
- package/src/lib/services/service-catalog.js +110 -100
- package/src/lib/services/service-fed-ramp.js +1 -2
- package/src/lib/services/service-host.js +10 -17
- package/src/lib/services/service-registry.js +69 -96
- package/src/lib/services/service-state.js +4 -6
- package/src/lib/services/service-url.js +24 -23
- package/src/lib/services/services.js +260 -251
- package/src/lib/stateless-webex-plugin.js +4 -2
- package/src/lib/storage/decorators.js +68 -66
- package/src/lib/storage/index.js +4 -6
- package/src/lib/storage/make-webex-plugin-store.js +34 -21
- package/src/lib/storage/make-webex-store.js +6 -7
- package/src/lib/storage/memory-store-adapter.js +3 -3
- package/src/lib/webex-core-plugin-mixin.js +10 -7
- package/src/lib/webex-http-error.js +7 -8
- package/src/lib/webex-internal-core-plugin-mixin.js +9 -6
- package/src/lib/webex-plugin.js +41 -34
- package/src/plugins/logger.js +8 -3
- package/src/webex-core.js +185 -116
- package/src/webex-internal-core.js +15 -9
- package/test/integration/spec/credentials/credentials.js +26 -30
- package/test/integration/spec/credentials/token.js +36 -33
- package/test/integration/spec/services/service-catalog.js +177 -156
- package/test/integration/spec/services/services.js +313 -304
- package/test/integration/spec/webex-core.js +98 -86
- package/test/unit/spec/_setup.js +26 -18
- package/test/unit/spec/credentials/credentials.js +189 -154
- package/test/unit/spec/credentials/token.js +94 -76
- package/test/unit/spec/interceptors/auth.js +291 -243
- package/test/unit/spec/interceptors/default-options.js +36 -24
- package/test/unit/spec/interceptors/embargo.js +32 -27
- package/test/unit/spec/interceptors/network-timing.js +2 -2
- package/test/unit/spec/interceptors/payload-transformer.js +61 -52
- package/test/unit/spec/interceptors/rate-limit.js +104 -75
- package/test/unit/spec/interceptors/redirect.js +22 -20
- package/test/unit/spec/interceptors/request-timing.js +18 -22
- package/test/unit/spec/interceptors/user-agent.js +28 -16
- package/test/unit/spec/interceptors/webex-tracking-id.js +14 -8
- package/test/unit/spec/interceptors/webex-user-agent.js +83 -37
- package/test/unit/spec/lib/batcher.js +36 -32
- package/test/unit/spec/lib/page.js +36 -32
- package/test/unit/spec/lib/webex-plugin.js +1 -1
- package/test/unit/spec/services/interceptors/server-error.js +67 -90
- package/test/unit/spec/services/interceptors/service.js +17 -28
- package/test/unit/spec/services/service-catalog.js +19 -27
- package/test/unit/spec/services/service-host.js +29 -26
- package/test/unit/spec/services/service-registry.js +128 -170
- package/test/unit/spec/services/service-state.js +13 -22
- package/test/unit/spec/services/service-url.js +24 -43
- package/test/unit/spec/services/services.js +85 -41
- package/test/unit/spec/storage/persist.js +6 -9
- package/test/unit/spec/storage/wait-for-value.js +22 -21
- package/test/unit/spec/webex-core.js +78 -57
- package/test/unit/spec/webex-internal-core.js +56 -31
package/dist/lib/batcher.js
CHANGED
|
@@ -329,7 +329,7 @@ var Batcher = _webexPlugin.default.extend({
|
|
|
329
329
|
fingerprintResponse: function fingerprintResponse(item) {
|
|
330
330
|
throw new Error('fingerprintResponse() must be implemented');
|
|
331
331
|
},
|
|
332
|
-
version: "3.0.0-beta.
|
|
332
|
+
version: "3.0.0-beta.15"
|
|
333
333
|
});
|
|
334
334
|
|
|
335
335
|
var _default2 = Batcher;
|
package/dist/lib/batcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Batcher","WebexPlugin","extend","session","deferreds","type","default","queue","derived","bounce","fn","cappedDebounce","executeQueue","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","tap","delete","catch","reason","reject","enqueue","push","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","Error","body","items","acceptItem","options","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","fingerprintResponse"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {has} from 'lodash';\nimport {\n cappedDebounce,\n Defer,\n tap\n} from '@webex/common';\n\nimport WebexPlugin from './webex-plugin';\nimport WebexHttpError from './webex-http-error';\n\n/**\n * Base class for coalescing requests to batched APIs\n * @class Batcher\n */\nconst Batcher = WebexPlugin.extend({\n session: {\n deferreds: {\n type: 'object',\n default() {\n return new Map();\n }\n },\n queue: {\n type: 'array',\n default() {\n return [];\n }\n }\n },\n\n derived: {\n bounce: {\n fn() {\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\n maxCalls: this.config.batcherMaxCalls,\n maxWait: this.config.batcherMaxWait\n });\n }\n }\n },\n\n /**\n * Requests an item from a batched API\n * @param {Object} item\n * @returns {Promise<mixed>}\n */\n request(item) {\n // So far, I can't find a way to avoid three layers of nesting here.\n /* eslint max-nested-callbacks: [0] */\n const defer = new Defer();\n\n this.fingerprintRequest(item)\n .then((idx) => {\n if (this.deferreds.has(idx)) {\n defer.resolve(this.deferreds.get(idx).promise);\n\n return;\n }\n this.deferreds.set(idx, defer);\n this.prepareItem(item)\n .then((req) => {\n defer.promise = defer.promise\n .then(tap(() => this.deferreds.delete(idx)))\n .catch((reason) => {\n this.deferreds.delete(idx);\n\n return Promise.reject(reason);\n });\n\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n\n return defer.promise;\n },\n\n /**\n * Adds an item to the queue.\n * Intended to be overridden\n * @param {mixed} req\n * @returns {Promise<undefined>}\n */\n enqueue(req) {\n this.queue.push(req);\n\n return Promise.resolve();\n },\n\n /**\n * Transform the item before adding it to the queue\n * Intended to be overridden\n * @param {mixed} item\n * @returns {Promise<mixed>}\n */\n prepareItem(item) {\n return Promise.resolve(item);\n },\n\n /**\n * Detaches the current queue, does any appropriate transforms, and submits it\n * to the API.\n * @returns {Promise<undefined>}\n */\n executeQueue() {\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\n\n return new Promise((resolve) => {\n resolve(this.prepareRequest(queue)\n .then((payload) => this.submitHttpRequest(payload)\n .then((res) => this.handleHttpSuccess(res)))\n .catch((reason) => {\n if (reason instanceof WebexHttpError) {\n return this.handleHttpError(reason);\n }\n\n return Promise.all(queue.map((item) => this.getDeferredForRequest(item)\n .then((defer) => {\n defer.reject(reason);\n })));\n }));\n })\n .catch((reason) => {\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Performs any final transforms on the queue before submitting it to the API\n * Intended to be overridden\n * @param {Object|Array} queue\n * @returns {Promise<Object>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n\n /**\n * Submits the prepared request body to the API.\n * This method *must* be overridden\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n // eslint-disable-next-line no-unused-vars\n submitHttpRequest(payload) {\n throw new Error('request() must be implemented');\n },\n\n /**\n * Actions taken when the http request returns a success\n * Intended to be overridden\n * @param {Promise<HttpResponseObject>} res\n * @returns {Promise<undefined>}\n */\n handleHttpSuccess(res) {\n return Promise.all((res.body && res.body.items || res.body).map((item) => this.acceptItem(item)));\n },\n\n /**\n * Actions taken when the http request returns a failure. Typically, this\n * means failing the entire queue, but could be overridden in some\n * implementations to e.g. reenqueue.\n * Intended to be overridden\n * @param {WebexHttpError} reason\n * @returns {Promise<undefined>}\n */\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError) {\n if (has(reason, 'options.body.map')) {\n return Promise.all(reason.options.body.map((item) => this.getDeferredForRequest(item)\n .then((defer) => {\n defer.reject(reason);\n })));\n }\n }\n this.logger.error('http error handler called without a WebexHttpError object', reason);\n\n return Promise.reject(reason);\n },\n\n /**\n * Determines if the item succeeded or failed and delegates accordingly\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n acceptItem(item) {\n return this.didItemFail(item)\n .then((didFail) => {\n if (didFail) {\n return this.handleItemFailure(item);\n }\n\n return this.handleItemSuccess(item);\n });\n },\n\n /**\n * Indicates if the specified response item implies a success or a failure\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<Boolean>}\n */\n // eslint-disable-next-line no-unused-vars\n didItemFail(item) {\n return Promise.resolve(false);\n },\n\n /**\n * Finds the Defer for the specified item and rejects its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemFailure(item) {\n return this.getDeferredForResponse(item)\n .then((defer) => {\n defer.reject(item);\n });\n },\n\n /**\n * Finds the Defer for the specified item and resolves its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item)\n .then((defer) => {\n defer.resolve(item);\n });\n },\n\n /**\n * Returns the Deferred for the specified request item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForRequest(item) {\n return this.fingerprintRequest(item)\n .then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Returns the Deferred for the specified response item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForResponse(item) {\n return this.fingerprintResponse(item)\n .then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Generates a unique identifier for the item in a request payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintRequest(item) {\n throw new Error('fingerprintRequest() must be implemented');\n },\n\n /**\n * Generates a unique identifier for the item in a response payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintResponse(item) {\n throw new Error('fingerprintResponse() must be implemented');\n }\n});\n\nexport default Batcher;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Batcher","WebexPlugin","extend","session","deferreds","type","default","queue","derived","bounce","fn","cappedDebounce","executeQueue","config","batcherWait","maxCalls","batcherMaxCalls","maxWait","batcherMaxWait","request","item","defer","Defer","fingerprintRequest","then","idx","has","resolve","get","promise","set","prepareItem","req","tap","delete","catch","reason","reject","enqueue","push","splice","prepareRequest","payload","submitHttpRequest","res","handleHttpSuccess","WebexHttpError","handleHttpError","all","map","getDeferredForRequest","logger","error","process","env","NODE_ENV","stack","Error","body","items","acceptItem","options","didItemFail","didFail","handleItemFailure","handleItemSuccess","getDeferredForResponse","fingerprintResponse"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {has} from 'lodash';\nimport {cappedDebounce, Defer, tap} from '@webex/common';\n\nimport WebexPlugin from './webex-plugin';\nimport WebexHttpError from './webex-http-error';\n\n/**\n * Base class for coalescing requests to batched APIs\n * @class Batcher\n */\nconst Batcher = WebexPlugin.extend({\n session: {\n deferreds: {\n type: 'object',\n default() {\n return new Map();\n },\n },\n queue: {\n type: 'array',\n default() {\n return [];\n },\n },\n },\n\n derived: {\n bounce: {\n fn() {\n return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {\n maxCalls: this.config.batcherMaxCalls,\n maxWait: this.config.batcherMaxWait,\n });\n },\n },\n },\n\n /**\n * Requests an item from a batched API\n * @param {Object} item\n * @returns {Promise<mixed>}\n */\n request(item) {\n // So far, I can't find a way to avoid three layers of nesting here.\n /* eslint max-nested-callbacks: [0] */\n const defer = new Defer();\n\n this.fingerprintRequest(item)\n .then((idx) => {\n if (this.deferreds.has(idx)) {\n defer.resolve(this.deferreds.get(idx).promise);\n\n return;\n }\n this.deferreds.set(idx, defer);\n this.prepareItem(item)\n .then((req) => {\n defer.promise = defer.promise\n .then(tap(() => this.deferreds.delete(idx)))\n .catch((reason) => {\n this.deferreds.delete(idx);\n\n return Promise.reject(reason);\n });\n\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n })\n .catch((reason) => defer.reject(reason));\n\n return defer.promise;\n },\n\n /**\n * Adds an item to the queue.\n * Intended to be overridden\n * @param {mixed} req\n * @returns {Promise<undefined>}\n */\n enqueue(req) {\n this.queue.push(req);\n\n return Promise.resolve();\n },\n\n /**\n * Transform the item before adding it to the queue\n * Intended to be overridden\n * @param {mixed} item\n * @returns {Promise<mixed>}\n */\n prepareItem(item) {\n return Promise.resolve(item);\n },\n\n /**\n * Detaches the current queue, does any appropriate transforms, and submits it\n * to the API.\n * @returns {Promise<undefined>}\n */\n executeQueue() {\n const queue = this.queue.splice(0, this.config.batcherMaxCalls);\n\n return new Promise((resolve) => {\n resolve(\n this.prepareRequest(queue)\n .then((payload) =>\n this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))\n )\n .catch((reason) => {\n if (reason instanceof WebexHttpError) {\n return this.handleHttpError(reason);\n }\n\n return Promise.all(\n queue.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n })\n );\n }).catch((reason) => {\n this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);\n\n return Promise.reject(reason);\n });\n },\n\n /**\n * Performs any final transforms on the queue before submitting it to the API\n * Intended to be overridden\n * @param {Object|Array} queue\n * @returns {Promise<Object>}\n */\n prepareRequest(queue) {\n return Promise.resolve(queue);\n },\n\n /**\n * Submits the prepared request body to the API.\n * This method *must* be overridden\n * @param {Object} payload\n * @returns {Promise<HttpResponseObject>}\n */\n // eslint-disable-next-line no-unused-vars\n submitHttpRequest(payload) {\n throw new Error('request() must be implemented');\n },\n\n /**\n * Actions taken when the http request returns a success\n * Intended to be overridden\n * @param {Promise<HttpResponseObject>} res\n * @returns {Promise<undefined>}\n */\n handleHttpSuccess(res) {\n return Promise.all(\n ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))\n );\n },\n\n /**\n * Actions taken when the http request returns a failure. Typically, this\n * means failing the entire queue, but could be overridden in some\n * implementations to e.g. reenqueue.\n * Intended to be overridden\n * @param {WebexHttpError} reason\n * @returns {Promise<undefined>}\n */\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError) {\n if (has(reason, 'options.body.map')) {\n return Promise.all(\n reason.options.body.map((item) =>\n this.getDeferredForRequest(item).then((defer) => {\n defer.reject(reason);\n })\n )\n );\n }\n }\n this.logger.error('http error handler called without a WebexHttpError object', reason);\n\n return Promise.reject(reason);\n },\n\n /**\n * Determines if the item succeeded or failed and delegates accordingly\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n acceptItem(item) {\n return this.didItemFail(item).then((didFail) => {\n if (didFail) {\n return this.handleItemFailure(item);\n }\n\n return this.handleItemSuccess(item);\n });\n },\n\n /**\n * Indicates if the specified response item implies a success or a failure\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<Boolean>}\n */\n // eslint-disable-next-line no-unused-vars\n didItemFail(item) {\n return Promise.resolve(false);\n },\n\n /**\n * Finds the Defer for the specified item and rejects its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemFailure(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.reject(item);\n });\n },\n\n /**\n * Finds the Defer for the specified item and resolves its promise\n * Intended to be overridden\n * @param {Object} item\n * @returns {Promise<undefined>}\n */\n handleItemSuccess(item) {\n return this.getDeferredForResponse(item).then((defer) => {\n defer.resolve(item);\n });\n },\n\n /**\n * Returns the Deferred for the specified request item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForRequest(item) {\n return this.fingerprintRequest(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Returns the Deferred for the specified response item\n * @param {Object} item\n * @returns {Promise<Defer>}\n */\n getDeferredForResponse(item) {\n return this.fingerprintResponse(item).then((idx) => {\n const defer = this.deferreds.get(idx);\n\n /* istanbul ignore if */\n if (!defer) {\n throw new Error('Could not find pending request for received response');\n }\n\n return defer;\n });\n },\n\n /**\n * Generates a unique identifier for the item in a request payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintRequest(item) {\n throw new Error('fingerprintRequest() must be implemented');\n },\n\n /**\n * Generates a unique identifier for the item in a response payload\n * Intended to be overridden\n * Note that overrides must return a primitive.\n * @param {Object} item\n * @returns {Promise<primitive>}\n */\n // eslint-disable-next-line no-unused-vars\n fingerprintResponse(item) {\n throw new Error('fingerprintResponse() must be implemented');\n },\n});\n\nexport default Batcher;\n"],"mappings":"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"}
|
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
4
|
+
|
|
5
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
6
|
+
|
|
7
|
+
var _Object$getOwnPropertyDescriptor2 = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
8
|
+
|
|
9
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
10
|
+
|
|
11
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
12
|
+
|
|
3
13
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
14
|
|
|
5
15
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
@@ -14,8 +24,6 @@ var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/cor
|
|
|
14
24
|
|
|
15
25
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
16
26
|
|
|
17
|
-
var _assign = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/assign"));
|
|
18
|
-
|
|
19
27
|
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
20
28
|
|
|
21
29
|
var _apply = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/apply"));
|
|
@@ -26,6 +34,8 @@ var _now = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/date/n
|
|
|
26
34
|
|
|
27
35
|
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor"));
|
|
28
36
|
|
|
37
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
38
|
+
|
|
29
39
|
var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
|
|
30
40
|
|
|
31
41
|
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
|
|
@@ -60,6 +70,10 @@ var _tokenCollection = _interopRequireDefault(require("./token-collection"));
|
|
|
60
70
|
|
|
61
71
|
var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _obj;
|
|
62
72
|
|
|
73
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys2(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor2(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
74
|
+
|
|
75
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor2(source, key)); }); } return target; }
|
|
76
|
+
|
|
63
77
|
/**
|
|
64
78
|
* @class
|
|
65
79
|
*/
|
|
@@ -248,7 +262,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
248
262
|
*/
|
|
249
263
|
buildLogoutUrl: function buildLogoutUrl() {
|
|
250
264
|
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
251
|
-
return "".concat(this.config.logoutUrl, "?").concat(_querystring.default.stringify((
|
|
265
|
+
return "".concat(this.config.logoutUrl, "?").concat(_querystring.default.stringify(_objectSpread({
|
|
252
266
|
cisService: this.config.service,
|
|
253
267
|
goto: this.config.redirect_uri
|
|
254
268
|
}, options)));
|
|
@@ -300,7 +314,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
300
314
|
|
|
301
315
|
_this2.logger.trace("credentials: falling back to supertoken for ".concat(scope));
|
|
302
316
|
|
|
303
|
-
return _promise.default.resolve(new _token.default((
|
|
317
|
+
return _promise.default.resolve(new _token.default(_objectSpread({
|
|
304
318
|
scope: scope
|
|
305
319
|
}, _this2.supertoken.serialize())), {
|
|
306
320
|
parent: _this2
|
|
@@ -518,7 +532,8 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
518
532
|
// isn't great
|
|
519
533
|
|
|
520
534
|
if (this.config.jwtRefreshCallback) {
|
|
521
|
-
return this.config.jwtRefreshCallback(this.webex)
|
|
535
|
+
return this.config.jwtRefreshCallback(this.webex) // eslint-disable-next-line no-shadow
|
|
536
|
+
.then(function (jwt) {
|
|
522
537
|
return _this6.webex.authorization.requestAccessTokenFromJwt({
|
|
523
538
|
jwt: jwt
|
|
524
539
|
});
|
|
@@ -598,7 +613,7 @@ var Credentials = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
598
613
|
this.refresh();
|
|
599
614
|
}
|
|
600
615
|
},
|
|
601
|
-
version: "3.0.0-beta.
|
|
616
|
+
version: "3.0.0-beta.15"
|
|
602
617
|
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "getUserToken", [_dec, _dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "getUserToken"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "initialize", [_dec3], (0, _getOwnPropertyDescriptor.default)(_obj, "initialize"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "invalidate", [_common.oneFlight, _dec4], (0, _getOwnPropertyDescriptor.default)(_obj, "invalidate"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight, _dec5, _dec6], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj)), _obj)));
|
|
603
618
|
|
|
604
619
|
var _default = Credentials;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {\n base64,\n makeStateDataType,\n oneFlight,\n tap,\n whileInFlight\n} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType\n },\n\n derived: {\n canAuthorize: {\n deps: [\n 'supertoken',\n 'supertoken.canAuthorize',\n 'canRefresh'\n ],\n fn() {\n return Boolean(this.supertoken && this.supertoken.canAuthorize || this.canRefresh);\n }\n },\n canRefresh: {\n deps: [\n 'supertoken',\n 'supertoken.canRefresh'\n ],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n }\n }\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean'\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean'\n },\n refreshTimer: {\n default: undefined,\n type: 'any'\n }\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n }\n else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info(\n 'credentials: attempting to retrieve the OrgId from token'\n );\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n }\n catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info(\n 'credentials: attempting to extract OrgId from user token'\n );\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n }\n catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify(Object.assign({\n cisService: this.config.service,\n goto: this.config.redirect_uri\n }, options))}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor((Math.floor(Math.random() * 4) + 6) / 10 * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope)\n .catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token(Object.assign({scope}, this.supertoken.serialize())), {parent: this});\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex.request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true\n },\n shouldRefreshAccessToken: false\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(!this.isRefreshing || new Promise((resolve) => {\n this.logger.info('credentials: token refresh inflight; delaying getUserToken until refresh completes');\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n }))\n .then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope)\n .then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n }\n else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n }\n catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return this.config.jwtRefreshCallback(this.webex)\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}));\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken.refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(tokens.map((token) => this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token.revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })));\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n }\n catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n }\n else {\n this.refresh();\n }\n }\n\n});\n\nexport default Credentials;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Credentials","WebexPlugin","extend","oneFlight","keyFactory","scope","waitForValue","persist","whileInFlight","collections","userTokens","TokenCollection","dataTypes","token","makeStateDataType","Token","dataType","derived","canAuthorize","deps","fn","Boolean","supertoken","canRefresh","config","jwtRefreshCallback","props","prop","namespace","session","isRefreshing","default","type","ready","refreshTimer","undefined","buildLoginUrl","options","clientType","state","Error","client_id","redirect_uri","response_type","base64","toBase64Url","authorizeUrl","querystring","stringify","getOrgId","logger","info","extractOrgIdFromJWT","access_token","e","extractOrgIdFromUserToken","f","decodedJWT","jwt","decode","realm","fields","split","length","buildLogoutUrl","logoutUrl","cisService","service","goto","calcRefreshTimeout","expiration","Math","floor","random","constructor","_dataTypes","forEach","key","set","bind","args","downscope","catch","reason","trace","resolve","serialize","parent","getClientToken","webex","request","method","uri","tokenUrl","form","grant_type","self_contained_token","auth","user","pass","client_secret","sendImmediately","shouldRefreshAccessToken","then","res","body","statusCode","reject","ErrorConstructor","grantErrors","select","error","_res","getUserToken","once","filterScope","sortScope","get","tap","t","add","initialize","attrs","authorization","expires","scheduleRefresh","prototype","listenToOnce","authorizationString","parsed","url","parse","query","href","substr","indexOf","invalidate","clearTimeout","unset","err","warn","models","remove","refresh","tokens","requestAccessTokenFromJwt","internal","services","updateCredentialsConfig","st","all","map","revoke","InvalidRequestError","trigger","expiresIn","timeoutLength","safeSetTimeout"],"sources":["credentials.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\nimport url from 'url';\n\nimport jwt from 'jsonwebtoken';\nimport {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {clone, cloneDeep, isObject, isEmpty} from 'lodash';\n\nimport WebexPlugin from '../webex-plugin';\nimport {persist, waitForValue} from '../storage/decorators';\n\nimport grantErrors from './grant-errors';\nimport {filterScope, sortScope} from './scope';\nimport Token from './token';\nimport TokenCollection from './token-collection';\n\n/**\n * @class\n */\nconst Credentials = WebexPlugin.extend({\n collections: {\n userTokens: TokenCollection,\n },\n\n dataTypes: {\n token: makeStateDataType(Token, 'token').dataType,\n },\n\n derived: {\n canAuthorize: {\n deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],\n fn() {\n return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);\n },\n },\n canRefresh: {\n deps: ['supertoken', 'supertoken.canRefresh'],\n fn() {\n // If we're operating in JWT mode, we have to delegate to the consumer\n if (this.config.jwtRefreshCallback) {\n return true;\n }\n\n return Boolean(this.supertoken && this.supertoken.canRefresh);\n },\n },\n },\n\n props: {\n supertoken: makeStateDataType(Token, 'token').prop,\n },\n\n namespace: 'Credentials',\n\n session: {\n isRefreshing: {\n default: false,\n type: 'boolean',\n },\n /**\n * Becomes `true` once the {@link loaded} event fires.\n * @see {@link WebexPlugin#ready}\n * @instance\n * @memberof Credentials\n * @type {boolean}\n */\n ready: {\n default: false,\n type: 'boolean',\n },\n refreshTimer: {\n default: undefined,\n type: 'any',\n },\n },\n\n /**\n * Generates an OAuth Login URL. Prefers the api.ciscospark.com proxy if the\n * instance is initialize with an authorizatUrl, but fallsback to idbroker\n * as the base otherwise.\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {string}\n */\n buildLoginUrl(options = {clientType: 'public'}) {\n /* eslint-disable camelcase */\n if (options.state && !isObject(options.state)) {\n throw new Error('if specified, `options.state` must be an object');\n }\n\n options.client_id = this.config.client_id;\n options.redirect_uri = this.config.redirect_uri;\n options.scope = this.config.scope;\n\n options = cloneDeep(options);\n\n if (!options.response_type) {\n options.response_type = options.clientType === 'public' ? 'token' : 'code';\n }\n Reflect.deleteProperty(options, 'clientType');\n\n if (options.state) {\n if (!isEmpty(options.state)) {\n options.state = base64.toBase64Url(JSON.stringify(options.state));\n } else {\n delete options.state;\n }\n }\n\n return `${this.config.authorizeUrl}?${querystring.stringify(options)}`;\n /* eslint-enable camelcase */\n },\n\n /**\n * Get the determined OrgId.\n *\n * @throws {Error} - If the OrgId could not be determined.\n * @returns {string} - The OrgId.\n */\n getOrgId() {\n this.logger.info('credentials: attempting to retrieve the OrgId from token');\n\n try {\n // Attempt to extract a client-authenticated token's OrgId.\n this.logger.info('credentials: trying to extract OrgId from JWT');\n\n return this.extractOrgIdFromJWT(this.supertoken.access_token);\n } catch (e) {\n // Attempt to extract a user token's OrgId.\n this.logger.info('credentials: could not extract OrgId from JWT');\n this.logger.info('credentials: attempting to extract OrgId from user token');\n\n try {\n return this.extractOrgIdFromUserToken(this.supertoken?.access_token);\n } catch (f) {\n this.logger.info('credentials: could not extract OrgId from user token');\n throw f;\n }\n }\n },\n\n /**\n * Extract the OrgId [realm] from a provided JWT.\n *\n * @private\n * @param {string} token - The JWT to extract the OrgId from.\n * @throws {Error} - If the token does not pass JWT general/realm validation.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromJWT(token = '') {\n // Decoded the provided token.\n const decodedJWT = jwt.decode(token);\n\n // Validate that the provided token is a JWT.\n if (!decodedJWT) {\n throw new Error('unable to extract the OrgId from the provided JWT');\n }\n\n if (!decodedJWT.realm) {\n throw new Error('the provided JWT does not contain an OrgId');\n }\n\n // Return the OrgId [realm].\n return decodedJWT.realm;\n },\n\n /**\n * Extract the OrgId [realm] from a provided user token.\n *\n * @private\n * @param {string} token - The user token to extract the OrgId from.\n * @throws {Error} - Will throw an error if the provided token is invalid.\n * @returns {string} - The OrgId.\n */\n extractOrgIdFromUserToken(token = '') {\n // Split the provided token into subsections.\n const fields = token.split('_');\n\n // Validate that the provided token has the proper amount of sections.\n if (fields.length !== 3) {\n throw new Error('the provided token is not a valid format');\n }\n\n // Return the token section that contains the OrgId.\n return fields[2];\n },\n\n /**\n * Generates a Logout URL\n * @instance\n * @memberof Credentials\n * @param {Object} [options={}]\n * @returns {[type]}\n */\n buildLogoutUrl(options = {}) {\n return `${this.config.logoutUrl}?${querystring.stringify({\n cisService: this.config.service,\n goto: this.config.redirect_uri,\n ...options,\n })}`;\n },\n\n /**\n * Generates a number between 60% - 90% of expired value\n * @instance\n * @memberof Credentials\n * @param {number} expiration\n * @private\n * @returns {number}\n */\n calcRefreshTimeout(expiration) {\n return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);\n },\n\n constructor(...args) {\n // HACK to deal with the fact that AmpersandState#dataTypes#set is a pure\n // function.\n this._dataTypes = cloneDeep(this._dataTypes);\n Object.keys(this._dataTypes).forEach((key) => {\n if (this._dataTypes[key].set) {\n this._dataTypes[key].set = this._dataTypes[key].set.bind(this);\n }\n });\n // END HACK\n Reflect.apply(WebexPlugin, this, args);\n },\n\n /**\n * Downscopes a token\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @private\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n return this.supertoken.downscope(scope).catch((reason) => {\n this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);\n this.logger.trace(`credentials: falling back to supertoken for ${scope}`);\n\n return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {\n parent: this,\n });\n });\n },\n\n /**\n * Requests a client credentials grant and returns the token. Given the\n * limited use for such tokens as this time, this method does not cache its\n * token.\n * @instance\n * @memberof Credentials\n * @param {Object} options\n * @returns {Promise<Token>}\n */\n getClientToken(options = {}) {\n this.logger.info('credentials: requesting client credentials grant');\n\n return this.webex\n .request({\n /* eslint-disable camelcase */\n method: 'POST',\n uri: options.uri || this.config.tokenUrl,\n form: {\n grant_type: 'client_credentials',\n scope: options.scope || 'webexsquare:admin',\n self_contained_token: true,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n /* eslint-enable camelcase */\n })\n .then((res) => new Token(res.body, {parent: this}))\n .catch((res) => {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n });\n },\n\n @oneFlight({keyFactory: (scope) => scope})\n @waitForValue('@')\n /**\n * Resolves with a token with the specified scopes. If no scope is specified,\n * defaults to omit(webex.credentials.scope, 'spark:kms'). If no such token is\n * available, downscopes the supertoken to that scope.\n * @instance\n * @memberof Credentials\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n getUserToken(scope) {\n return Promise.resolve(\n !this.isRefreshing ||\n new Promise((resolve) => {\n this.logger.info(\n 'credentials: token refresh inflight; delaying getUserToken until refresh completes'\n );\n this.once('change:isRefreshing', () => {\n this.logger.info('credentials: token refresh complete; reinvoking getUserToken');\n resolve();\n });\n })\n ).then(() => {\n if (!this.canAuthorize) {\n this.logger.info('credentials: cannot produce an access token from current state');\n\n return Promise.reject(new Error('Current state cannot produce an access token'));\n }\n\n if (!scope) {\n scope = filterScope('spark:kms', this.config.scope);\n }\n\n scope = sortScope(scope);\n\n if (scope === sortScope(this.config.scope)) {\n return Promise.resolve(this.supertoken);\n }\n\n const token = this.userTokens.get(scope);\n\n // we should also check for the token.access_token since token object does\n // not get cleared on unsetting while logging out.\n if (!token || !token.access_token) {\n return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));\n }\n\n return Promise.resolve(token);\n });\n },\n\n @persist('@')\n /**\n * Initializer\n * @instance\n * @memberof Credentials\n * @param {Object} attrs\n * @param {Object} options\n * @private\n * @returns {Credentials}\n */\n initialize(attrs, options) {\n if (attrs) {\n if (typeof attrs === 'string') {\n this.supertoken = attrs;\n }\n\n if (attrs.access_token) {\n this.supertoken = attrs;\n }\n\n if (attrs.authorization) {\n if (attrs.authorization.supertoken) {\n this.supertoken = attrs.authorization.supertoken;\n } else {\n this.supertoken = attrs.authorization;\n }\n }\n\n // schedule refresh\n if (this.supertoken && this.supertoken.expires) {\n this.scheduleRefresh(this.supertoken.expires);\n }\n }\n\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n this.listenToOnce(this.parent, 'change:config', () => {\n if (this.config.authorizationString) {\n const parsed = url.parse(this.config.authorizationString, true);\n\n /* eslint-disable camelcase */\n this.config.client_id = parsed.query.client_id;\n this.config.redirect_uri = parsed.query.redirect_uri;\n this.config.scope = parsed.query.scope;\n this.config.authorizeUrl = parsed.href.substr(0, parsed.href.indexOf('?'));\n /* eslint-enable camelcase */\n }\n });\n\n this.webex.once('loaded', () => {\n this.ready = true;\n });\n },\n\n @oneFlight\n @waitForValue('@')\n /**\n * Clears all tokens from store them from the stores.\n *\n * This is no longer quite the right name for this method, but all of the\n * alternatives I'm coming up with are already taken.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n invalidate() {\n this.logger.info('credentials: invalidating tokens');\n\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n\n try {\n this.unset('supertoken');\n } catch (err) {\n this.logger.warn('credentials: failed to clear supertoken', err);\n }\n\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n\n this.logger.info('credentials: finished removing tokens');\n\n // Return a promise to give the storage layer a tick or two to clear\n // localStorage\n return Promise.resolve();\n },\n\n @oneFlight\n @whileInFlight('isRefreshing')\n @waitForValue('@')\n /**\n * Removes the supertoken and child tokens, then refreshes the supertoken;\n * subsequent calls to {@link Credentials#getUserToken()} will re-downscope\n * child tokens. Enqueus revocation of previous previousTokens. Yes, that's\n * the correct number of \"previous\"es.\n * @instance\n * @memberof Credentials\n * @returns {Promise}\n */\n refresh() {\n this.logger.info('credentials: refresh requested');\n\n const {supertoken} = this;\n const tokens = clone(this.userTokens.models);\n\n // This is kind of a leaky abstraction, since it relies on the authorization\n // plugin, but the only alternatives I see are\n // 1. put all JWT support in core\n // 2. have separate jwt and non-jwt auth plugins\n // while I like #2 from a code simplicity standpoint, the third-party DX\n // isn't great\n if (this.config.jwtRefreshCallback) {\n return (\n this.config\n .jwtRefreshCallback(this.webex)\n // eslint-disable-next-line no-shadow\n .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))\n );\n }\n\n if (this.webex.internal.services) {\n this.webex.internal.services.updateCredentialsConfig();\n }\n\n return supertoken\n .refresh()\n .then((st) => {\n // clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.unset('refreshTimer');\n }\n this.supertoken = st;\n\n return Promise.all(\n tokens.map((token) =>\n this.downscope(token.scope)\n // eslint-disable-next-line max-nested-callbacks\n .then((t) => {\n this.logger.info(`credentials: revoking token for ${token.scope}`);\n\n return token\n .revoke()\n .catch((err) => {\n this.logger.warn('credentials: failed to revoke user token', err);\n })\n .then(() => {\n this.userTokens.remove(token.scope);\n this.userTokens.add(t);\n });\n })\n )\n );\n })\n .then(() => {\n this.scheduleRefresh(this.supertoken.expires);\n })\n .catch((error) => {\n const {InvalidRequestError} = grantErrors;\n\n if (error instanceof InvalidRequestError) {\n // Error: The refresh token provided is expired, revoked, malformed, or invalid. Hence emit an event to the client, an opportunity to logout.\n this.unset('supertoken');\n while (this.userTokens.models.length) {\n try {\n this.userTokens.remove(this.userTokens.models[0]);\n } catch (err) {\n this.logger.warn('credentials: failed to remove user token', err);\n }\n }\n this.webex.trigger('client:InvalidRequestError');\n }\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Schedules a token refresh or refreshes the token if token has expired\n * @instance\n * @memberof Credentials\n * @param {number} expires\n * @private\n * @returns {undefined}\n */\n scheduleRefresh(expires) {\n const expiresIn = expires - Date.now();\n\n if (expiresIn > 0) {\n const timeoutLength = this.calcRefreshTimeout(expiresIn);\n\n this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);\n } else {\n this.refresh();\n }\n },\n});\n\nexport default Credentials;\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["OAuthError","res","body","error","enumerable","value","errorDescription","error_description","errorUri","error_uri","Exception","InvalidRequestError","InvalidClientError","InvalidGrantError","UnauthorizedClientError","UnsupportGrantTypeError","InvalidScopeError","errors","invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope","select","errorString"],"sources":["grant-errors.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {Exception} from '@webex/common';\n\n/**\n * Error thrown during oauth flow\n */\nexport class OAuthError extends Exception {\n /**\n * @param {HttpResponse} res\n * @returns {string}\n */\n parse(res) {\n // This error may be returned in an HTTPResponse or as part of a querystring\n const body = res.body || res;\n\n Object.defineProperties(this, {\n error: {\n enumerable: true,\n value: body.error
|
|
1
|
+
{"version":3,"names":["OAuthError","res","body","error","enumerable","value","errorDescription","error_description","errorUri","error_uri","Exception","InvalidRequestError","InvalidClientError","InvalidGrantError","UnauthorizedClientError","UnsupportGrantTypeError","InvalidScopeError","errors","invalid_request","invalid_client","invalid_grant","unauthorized_client","unsupported_grant_type","invalid_scope","select","errorString"],"sources":["grant-errors.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint camelcase: [0] */\n\nimport {Exception} from '@webex/common';\n\n/**\n * Error thrown during oauth flow\n */\nexport class OAuthError extends Exception {\n /**\n * @param {HttpResponse} res\n * @returns {string}\n */\n parse(res) {\n // This error may be returned in an HTTPResponse or as part of a querystring\n const body = res.body || res;\n\n Object.defineProperties(this, {\n error: {\n enumerable: true,\n value: body.error,\n },\n errorDescription: {\n enumerable: true,\n value: body.error_description,\n },\n errorUri: {\n enumerable: true,\n value: body.error_uri,\n },\n res: {\n enumerable: false,\n value: res,\n },\n });\n\n return this.errorDescription;\n }\n}\n/**\n * InvalidRequestError\n */\nclass InvalidRequestError extends OAuthError {}\n\n/**\n * InvalidClientError\n */\nclass InvalidClientError extends OAuthError {}\n\n/**\n * InvalidGrantError\n */\nclass InvalidGrantError extends OAuthError {}\n\n/**\n * UnauthorizedClientError\n */\nclass UnauthorizedClientError extends OAuthError {}\n\n/**\n * UnsupportGrantTypeError\n */\nclass UnsupportGrantTypeError extends OAuthError {}\n\n/**\n * InvalidScopeError\n */\nclass InvalidScopeError extends OAuthError {}\n\nconst errors = {\n OAuthError,\n InvalidRequestError,\n InvalidClientError,\n InvalidGrantError,\n UnauthorizedClientError,\n UnsupportGrantTypeError,\n InvalidScopeError,\n invalid_request: InvalidRequestError,\n invalid_client: InvalidClientError,\n invalid_grant: InvalidGrantError,\n unauthorized_client: UnauthorizedClientError,\n unsupported_grant_type: UnsupportGrantTypeError,\n invalid_scope: InvalidScopeError,\n select(errorString) {\n return errors[errorString] || OAuthError;\n },\n};\n\nexport default errors;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;;;;;;AAEA;AACA;AACA;IACaA,U;;;;;;;;;;;;;IACX;AACF;AACA;AACA;IACE,eAAMC,GAAN,EAAW;MACT;MACA,IAAMC,IAAI,GAAGD,GAAG,CAACC,IAAJ,IAAYD,GAAzB;MAEA,+BAAwB,IAAxB,EAA8B;QAC5BE,KAAK,EAAE;UACLC,UAAU,EAAE,IADP;UAELC,KAAK,EAAEH,IAAI,CAACC;QAFP,CADqB;QAK5BG,gBAAgB,EAAE;UAChBF,UAAU,EAAE,IADI;UAEhBC,KAAK,EAAEH,IAAI,CAACK;QAFI,CALU;QAS5BC,QAAQ,EAAE;UACRJ,UAAU,EAAE,IADJ;UAERC,KAAK,EAAEH,IAAI,CAACO;QAFJ,CATkB;QAa5BR,GAAG,EAAE;UACHG,UAAU,EAAE,KADT;UAEHC,KAAK,EAAEJ;QAFJ;MAbuB,CAA9B;MAmBA,OAAO,KAAKK,gBAAZ;IACD;;;EA7B6BI,iB;AA+BhC;AACA;AACA;;;;;IACMC,mB;;;;;;;;;;;EAA4BX,U;AAElC;AACA;AACA;;;IACMY,kB;;;;;;;;;;;EAA2BZ,U;AAEjC;AACA;AACA;;;IACMa,iB;;;;;;;;;;;EAA0Bb,U;AAEhC;AACA;AACA;;;IACMc,uB;;;;;;;;;;;EAAgCd,U;AAEtC;AACA;AACA;;;IACMe,uB;;;;;;;;;;;EAAgCf,U;AAEtC;AACA;AACA;;;IACMgB,iB;;;;;;;;;;;EAA0BhB,U;;AAEhC,IAAMiB,MAAM,GAAG;EACbjB,UAAU,EAAVA,UADa;EAEbW,mBAAmB,EAAnBA,mBAFa;EAGbC,kBAAkB,EAAlBA,kBAHa;EAIbC,iBAAiB,EAAjBA,iBAJa;EAKbC,uBAAuB,EAAvBA,uBALa;EAMbC,uBAAuB,EAAvBA,uBANa;EAObC,iBAAiB,EAAjBA,iBAPa;EAQbE,eAAe,EAAEP,mBARJ;EASbQ,cAAc,EAAEP,kBATH;EAUbQ,aAAa,EAAEP,iBAVF;EAWbQ,mBAAmB,EAAEP,uBAXR;EAYbQ,sBAAsB,EAAEP,uBAZX;EAabQ,aAAa,EAAEP,iBAbF;EAcbQ,MAda,kBAcNC,WAdM,EAcO;IAClB,OAAOR,MAAM,CAACQ,WAAD,CAAN,IAAuBzB,UAA9B;EACD;AAhBY,CAAf;eAmBeiB,M"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["registerPlugin","Credentials","proxies"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '../../webex-core';\n\nimport Credentials from './credentials';\n\nregisterPlugin('credentials', Credentials, {\n proxies: [
|
|
1
|
+
{"version":3,"names":["registerPlugin","Credentials","proxies"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerPlugin} from '../../webex-core';\n\nimport Credentials from './credentials';\n\nregisterPlugin('credentials', Credentials, {\n proxies: ['canAuthorize', 'canRefresh'],\n});\n\nexport {default as Credentials} from './credentials';\nexport {filterScope, sortScope} from './scope';\nexport {default as Token} from './token';\nexport {default as grantErrors} from './grant-errors';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AAEA;;AAOA;;AACA;;AACA;;AAfA;AACA;AACA;AAMA,IAAAA,yBAAA,EAAe,aAAf,EAA8BC,oBAA9B,EAA2C;EACzCC,OAAO,EAAE,CAAC,cAAD,EAAiB,YAAjB;AADgC,CAA3C"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["sortScope","scope","split","sort","join","filterScope","toFilter","filter","item"],"sources":["scope.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * sorts a list of scopes\n * @param {string} scope\n * @returns {string}\n */\nexport function sortScope(scope) {\n if (!scope) {\n return '';\n }\n\n return scope
|
|
1
|
+
{"version":3,"names":["sortScope","scope","split","sort","join","filterScope","toFilter","filter","item"],"sources":["scope.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * sorts a list of scopes\n * @param {string} scope\n * @returns {string}\n */\nexport function sortScope(scope) {\n if (!scope) {\n return '';\n }\n\n return scope.split(' ').sort().join(' ');\n}\n\n/**\n * sorts a list of scopes and filters the specified scope\n * @param {string} toFilter\n * @param {string} scope\n * @returns {string}\n */\nexport function filterScope(toFilter, scope) {\n if (!scope) {\n return '';\n }\n\n return scope\n .split(' ')\n .filter((item) => item !== toFilter)\n .sort()\n .join(' ');\n}\n"],"mappings":";;;;;;;;;;;AAAA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACO,SAASA,SAAT,CAAmBC,KAAnB,EAA0B;EAC/B,IAAI,CAACA,KAAL,EAAY;IACV,OAAO,EAAP;EACD;;EAED,OAAOA,KAAK,CAACC,KAAN,CAAY,GAAZ,EAAiBC,IAAjB,GAAwBC,IAAxB,CAA6B,GAA7B,CAAP;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;;AACO,SAASC,WAAT,CAAqBC,QAArB,EAA+BL,KAA/B,EAAsC;EAC3C,IAAI,CAACA,KAAL,EAAY;IACV,OAAO,EAAP;EACD;;EAED,OAAOA,KAAK,CACTC,KADI,CACE,GADF,EAEJK,MAFI,CAEG,UAACC,IAAD;IAAA,OAAUA,IAAI,KAAKF,QAAnB;EAAA,CAFH,EAGJH,IAHI,GAIJC,IAJI,CAIC,GAJD,CAAP;AAKD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["TokenCollection","AmpCollection","extend","mainIndex","model","Token","namespace"],"sources":["token-collection.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport AmpCollection from 'ampersand-collection';\n\nimport Token from './token';\n\nconst TokenCollection = AmpCollection.extend({\n mainIndex: 'scope',\n\n model: Token,\n\n namespace: 'Credentials'
|
|
1
|
+
{"version":3,"names":["TokenCollection","AmpCollection","extend","mainIndex","model","Token","namespace"],"sources":["token-collection.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport AmpCollection from 'ampersand-collection';\n\nimport Token from './token';\n\nconst TokenCollection = AmpCollection.extend({\n mainIndex: 'scope',\n\n model: Token,\n\n namespace: 'Credentials',\n});\n\nexport default TokenCollection;\n"],"mappings":";;;;;;;;;;;;AAIA;;AAEA;;AANA;AACA;AACA;AAMA,IAAMA,eAAe,GAAGC,4BAAA,CAAcC,MAAd,CAAqB;EAC3CC,SAAS,EAAE,OADgC;EAG3CC,KAAK,EAAEC,cAHoC;EAK3CC,SAAS,EAAE;AALgC,CAArB,CAAxB;;eAQeN,e"}
|
|
@@ -2,12 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _Object$keys = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
6
6
|
|
|
7
|
-
var _Object$
|
|
7
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
8
8
|
|
|
9
9
|
var _Object$getOwnPropertyDescriptor2 = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
10
10
|
|
|
11
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
12
|
+
|
|
13
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
14
|
+
|
|
15
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
16
|
+
|
|
17
|
+
var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
|
|
18
|
+
|
|
11
19
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
12
20
|
|
|
13
21
|
_Object$defineProperty(exports, "__esModule", {
|
|
@@ -16,6 +24,8 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
16
24
|
|
|
17
25
|
exports.default = void 0;
|
|
18
26
|
|
|
27
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
28
|
+
|
|
19
29
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
20
30
|
|
|
21
31
|
var _applyDecoratedDescriptor2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/applyDecoratedDescriptor"));
|
|
@@ -50,6 +60,10 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof _WeakMap !== "functi
|
|
|
50
60
|
|
|
51
61
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = _Object$defineProperty && _Object$getOwnPropertyDescriptor2; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? _Object$getOwnPropertyDescriptor2(obj, key) : null; if (desc && (desc.get || desc.set)) { _Object$defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
52
62
|
|
|
63
|
+
function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return _Object$getOwnPropertyDescriptor2(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
64
|
+
|
|
65
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor2(source, key)); }); } return target; }
|
|
66
|
+
|
|
53
67
|
/* eslint-disable camelcase */
|
|
54
68
|
|
|
55
69
|
/**
|
|
@@ -520,7 +534,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
520
534
|
token_type = _attrs$access_token$s2[0],
|
|
521
535
|
access_token = _attrs$access_token$s2[1];
|
|
522
536
|
|
|
523
|
-
attrs = (
|
|
537
|
+
attrs = _objectSpread(_objectSpread({}, attrs), {}, {
|
|
524
538
|
access_token: access_token,
|
|
525
539
|
token_type: token_type
|
|
526
540
|
});
|
|
@@ -585,7 +599,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
585
599
|
return _promise.default.reject(reason);
|
|
586
600
|
}
|
|
587
601
|
|
|
588
|
-
_this5.logger.info(
|
|
602
|
+
_this5.logger.info("REMINDER: If you're investigating a network error here, it's normal"); // If we got an error that isn't a WebexHttpError, assume the problem is
|
|
589
603
|
// that we don't have the wdm plugin loaded and service/resource isn't
|
|
590
604
|
// a valid means of identifying a request.
|
|
591
605
|
|
|
@@ -605,7 +619,7 @@ var Token = _webexPlugin.default.extend((_dec = (0, _common.oneFlight)({
|
|
|
605
619
|
return res.body;
|
|
606
620
|
});
|
|
607
621
|
},
|
|
608
|
-
version: "3.0.0-beta.
|
|
622
|
+
version: "3.0.0-beta.15"
|
|
609
623
|
}, ((0, _applyDecoratedDescriptor2.default)(_obj, "downscope", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "downscope"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "refresh", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "refresh"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "revoke", [_common.oneFlight], (0, _getOwnPropertyDescriptor.default)(_obj, "revoke"), _obj)), _obj)));
|
|
610
624
|
|
|
611
625
|
var _default = Token;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["processGrantError","res","statusCode","reject","ErrorConstructor","grantErrors","select","body","error","OAuthError","WebexHttpError","_res","Token","WebexPlugin","extend","oneFlight","keyFactory","scope","derived","canAuthorize","deps","fn","access_token","isExpired","canDownscope","config","client_id","canRefresh","inBrowser","refresh_token","refreshCallback","client_secret","expires","_isExpired","_string","token_type","namespace","props","expires_in","refresh_token_expires","refresh_token_expires_in","default","type","session","previousToken","downscope","logger","info","Error","trace","sortScope","webex","request","method","uri","tokenUrl","addAuthHeader","form","grant_type","token","self_contained_token","then","parent","initialize","attrs","options","prototype","safeSetTimeout","refresh","promise","resolve","redirect_uri","auth","user","pass","sendImmediately","shouldRefreshAccessToken","obj","process","env","NODE_ENV","revoke","unset","catch","revokeUrl","token_type_hint","set","_filterSetParameters","includes","split","now","toString","validate","service","resource","reason","convApi","CONVERSATION_SERVICE","CONVERSATION_SERVICE_URL","headers","authorization"],"sources":["token.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {pick} from 'lodash';\nimport {inBrowser, oneFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\n\nimport WebexHttpError from '../webex-http-error';\nimport WebexPlugin from '../webex-plugin';\n\nimport {sortScope} from './scope';\nimport grantErrors, {OAuthError} from './grant-errors';\n\n/* eslint-disable camelcase */\n\n/**\n * Parse response from CI and converts to structured error when appropriate\n * @param {WebexHttpError} res\n * @private\n * @returns {GrantError}\n */\nfunction processGrantError(res) {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n if (ErrorConstructor === OAuthError && res instanceof WebexHttpError) {\n return Promise.reject(res);\n }\n if (!ErrorConstructor) {\n return Promise.reject(res);\n }\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n}\n\n/**\n * @class\n */\nconst Token = WebexPlugin.extend({\n derived: {\n /**\n * Indicates if this token can be used in an auth header. `true` iff\n * {@link Token#access_token} is defined and {@link Token#isExpired} is\n * false.\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canAuthorize: {\n deps: ['access_token', 'isExpired'],\n fn() {\n return !!this.access_token && !this.isExpired;\n }\n },\n\n /**\n * Indicates that this token can be downscoped. `true` iff\n * {@link config.credentials.client_id} is defined and if\n * {@link Token#canAuthorize} is true\n *\n * Note: since {@link config} is not evented, we can't listen for changes to\n * {@link config.credentials.client_id}. As such,\n * {@link config.credentials.client_id} must always be set before\n * instantiating a {@link Token}\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canDownscope: {\n deps: ['canAuthorize'],\n fn() {\n return this.canAuthorize && !!this.config.client_id;\n }\n },\n\n /**\n * Indicates if this token can be refreshed. `true` iff\n * {@link Token@refresh_token} is defined and\n * {@link config.credentials.refreshCallback()} is defined\n *\n * Note: since {@link config} is not evented, we can't listen for changes to\n * {@link config.credentials.refreshCallback()}. As such,\n * {@link config.credentials.refreshCallback()} must always be set before\n * instantiating a {@link Token}\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canRefresh: {\n deps: ['refresh_token'],\n fn() {\n if (inBrowser) {\n return !!this.refresh_token && !!this.config.refreshCallback;\n }\n\n return !!this.refresh_token && !!this.config.client_secret;\n }\n },\n\n /**\n * Indicates if this `Token` is expired. `true` iff {@link Token#expires} is\n * defined and is less than {@link Date.now()}.\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n isExpired: {\n deps: ['expires', '_isExpired'],\n fn() {\n // in order to avoid setting `cache:false`, we'll use a private property\n // and a timer rather than comparing to `Date.now()`;\n return !!this.expires && this._isExpired;\n }\n },\n\n /**\n * Cache for toString()\n * @instance\n * @memberof Token\n * @private\n * @readonly\n * @type {string}\n */\n _string: {\n deps: ['access_token', 'token_type'],\n fn() {\n if (!this.access_token || !this.token_type) {\n return '';\n }\n\n return `${this.token_type} ${this.access_token}`;\n }\n }\n },\n\n namespace: 'Credentials',\n\n props: {\n /**\n * Used for indexing in the credentials userTokens collection\n * @instance\n * @memberof Token\n * @private\n * @type {string}\n */\n scope: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {string}\n */\n access_token: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n expires: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n expires_in: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {string}\n */\n refresh_token: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n refresh_token_expires: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n refresh_token_expires_in: 'number',\n /**\n * @default \"Bearer\"\n * @instance\n * @memberof Token\n * @type {string}\n */\n token_type: {\n default: 'Bearer',\n type: 'string'\n }\n },\n\n session: {\n /**\n * Used by {@link Token#isExpired} to avoid doing a Date comparison.\n * @instance\n * @memberof Token\n * @private\n * @type {boolean}\n */\n _isExpired: {\n default: false,\n type: 'boolean'\n },\n /**\n * Handle to the previous token that we'll revoke when we refresh this\n * token. The idea is to keep allow two valid tokens when a refresh occurs;\n * we don't want revoke a token that's in the middle of being used, so when\n * we do a token refresh, we won't revoke the token being refreshed, but\n * we'll revoke the previous one.\n * @instance\n * @memberof Token\n * @private\n * @type {Object}\n */\n previousToken: {\n type: 'state'\n }\n },\n\n @oneFlight({\n keyFactory(scope) {\n return scope;\n }\n })\n /**\n * Uses this token to request a new Token with a subset of this Token's scopes\n * @instance\n * @memberof Token\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n this.logger.info(`token: downscoping token to ${scope}`);\n\n if (this.isExpired) {\n this.logger.info('token: request received to downscope expired access_token');\n\n return Promise.reject(new Error('cannot downscope expired access token'));\n }\n\n if (!this.canDownscope) {\n if (this.config.client_id) {\n this.logger.info('token: request received to downscope invalid access_token');\n }\n else {\n this.logger.trace('token: cannot downscope without client_id');\n }\n\n return Promise.reject(new Error('cannot downscope access token'));\n }\n\n // Since we're going to use scope as the index in our token collection, it's\n // important scopes are always deterministically specified.\n if (scope) {\n scope = sortScope(scope);\n }\n\n // Ideally, we could depend on the service to communicate this error, but\n // all we get is \"invalid scope\", which, to the lay person, implies\n // something wrong with *one* of the scopes, not the whole thing.\n if (scope === sortScope(this.config.scope)) {\n return Promise.reject(new Error('token: scope reduction requires a reduced scope'));\n }\n\n return this.webex.request({\n method: 'POST',\n uri: this.config.tokenUrl,\n addAuthHeader: false,\n form: {\n grant_type: 'urn:cisco:oauth:grant-type:scope-reduction',\n token: this.access_token,\n scope,\n client_id: this.config.client_id,\n self_contained_token: true\n }\n })\n .then((res) => {\n this.logger.info(`token: downscoped token to ${scope}`);\n\n return new Token(Object.assign(res.body, {scope}), {parent: this.parent});\n });\n },\n\n /**\n * Initializer\n * @instance\n * @memberof Token\n * @param {Object} [attrs={}]\n * @param {Object} [options={}]\n * @see {@link WebexPlugin#initialize()}\n * @returns {Token}\n */\n initialize(attrs = {}, options = {}) {\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n if (typeof attrs === 'string') {\n this.access_token = attrs;\n }\n\n if (!this.access_token) {\n throw new Error('`access_token` is required');\n }\n\n // We don't want the derived property `isExpired` to need {cache:false}, so\n // we'll set up a timer the runs when this token should expire.\n if (this.expires) {\n if (this.expires < Date.now()) {\n this._isExpired = true;\n }\n else {\n safeSetTimeout(() => {\n this._isExpired = true;\n }, this.expires - Date.now());\n }\n }\n },\n\n @oneFlight\n /**\n * Refreshes this Token. Relies on\n * {@link config.credentials.refreshCallback()}\n * @instance\n * @memberof Token\n * @returns {Promise<Token>}\n */\n refresh() {\n if (!this.canRefresh) {\n throw new Error('Not enough information available to refresh this access token');\n }\n\n let promise;\n\n if (inBrowser) {\n if (!this.config.refreshCallback) {\n throw new Error('Cannot refresh access token without refreshCallback');\n }\n\n promise = Promise.resolve(this.config.refreshCallback(this.webex, this));\n }\n\n return (promise || this.webex.request({\n method: 'POST',\n uri: this.config.tokenUrl,\n form: {\n grant_type: 'refresh_token',\n redirect_uri: this.config.redirect_uri,\n refresh_token: this.refresh_token\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true\n },\n shouldRefreshAccessToken: false\n })\n .then((res) => res.body))\n .then((obj) => {\n if (!obj) {\n throw new Error('token: refreshCallback() did not produce an object');\n }\n // If the authentication server did not send back a refresh token, copy\n // the current refresh token and related values to the response (note:\n // at time of implementation, CI never sends a new refresh token)\n if (!obj.refresh_token) {\n Object.assign(obj, pick(this, 'refresh_token', 'refresh_token_expires', 'refresh_token_expires_in'));\n }\n\n // If the new token is the same as the previous token, then we may have\n // found a bug in CI; log the details and reject the Promise\n if (this.access_token === obj.access_token) {\n this.logger.error('token: new token matches current token');\n // log the tokens if it is not production\n if (process.env.NODE_ENV !== 'production') {\n this.logger.error('token: current token:', this.access_token);\n this.logger.error('token: new token:', obj.access_token);\n }\n\n return Promise.reject(new Error('new token matches current token'));\n }\n\n if (this.previousToken) {\n this.previousToken.revoke();\n this.unset('previousToken');\n }\n\n obj.previousToken = this;\n obj.scope = this.scope;\n\n return new Token(obj, {parent: this.parent});\n })\n .catch(processGrantError);\n },\n\n @oneFlight\n /**\n * Revokes this token and unsets its local properties\n * @instance\n * @memberof Token\n * @returns {Promise}\n */\n revoke() {\n if (this.isExpired) {\n this.logger.info('token: already expired, not making making revocation request');\n\n return Promise.resolve();\n }\n\n if (!this.canAuthorize) {\n this.logger.info('token: no longer valid, not making revocation request');\n\n return Promise.resolve();\n }\n\n // FIXME we need to use the user token revocation endpoint to revoke a token\n // without a client_secret, but it doesn't current support using a token to\n // revoke itself\n // Note: I'm not making a canRevoke property because there should be changes\n // coming to the user token revocation endpoint that allow us to do this\n // correctly.\n if (!this.config.client_secret) {\n this.logger.info('token: no client secret available, not making revocation request');\n\n return Promise.resolve();\n }\n\n this.logger.info('token: revoking access token');\n\n return this.webex.request({\n method: 'POST',\n uri: this.config.revokeUrl,\n form: {\n token: this.access_token,\n token_type_hint: 'access_token'\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true\n },\n shouldRefreshAccessToken: false\n })\n .then(() => {\n this.unset([\n 'access_token',\n 'expires',\n 'expires_in',\n 'token_type'\n ]);\n this.logger.info('token: access token revoked');\n })\n .catch(processGrantError);\n },\n\n set(...args) {\n // eslint-disable-next-line prefer-const\n let [attrs, options] = this._filterSetParameters(...args);\n\n if (!attrs.token_type && attrs.access_token && attrs.access_token.includes(' ')) {\n const [token_type, access_token] = attrs.access_token.split(' ');\n\n attrs = Object.assign({}, attrs, {access_token, token_type});\n }\n const now = Date.now();\n\n if (!attrs.expires && attrs.expires_in) {\n attrs.expires = now + attrs.expires_in * 1000;\n }\n\n if (!attrs.refresh_token_expires && attrs.refresh_token_expires_in) {\n attrs.refresh_token_expires = now + attrs.refresh_token_expires_in * 1000;\n }\n\n if (attrs.scope) {\n attrs.scope = sortScope(attrs.scope);\n }\n\n return Reflect.apply(WebexPlugin.prototype.set, this, [attrs, options]);\n },\n\n /**\n * Renders the token object as an HTTP Header Value\n * @instance\n * @memberof Token\n * @returns {string}\n * @see {@link Object#toString()}\n */\n toString() {\n if (!this._string) {\n throw new Error('cannot stringify Token');\n }\n\n return this._string;\n },\n\n /**\n * Uses a non-producation api to return information about this token. This\n * method is primarily for tests and will throw if NODE_ENV === production\n * @instance\n * @memberof Token\n * @private\n * @returns {Promise}\n */\n validate() {\n if (process.env.NODE_ENV === 'production') {\n throw new Error('Token#validate() must not be used in production');\n }\n\n return this.webex.request({\n method: 'POST',\n service: 'conversation',\n resource: 'users/validateAuthToken',\n body: {\n token: this.access_token\n }\n })\n .catch((reason) => {\n if ('statusCode' in reason) {\n return Promise.reject(reason);\n }\n this.logger.info('REMINDER: If you\\'re investigating a network error here, it\\'s normal');\n\n // If we got an error that isn't a WebexHttpError, assume the problem is\n // that we don't have the wdm plugin loaded and service/resource isn't\n // a valid means of identifying a request.\n const convApi = process.env.CONVERSATION_SERVICE || process.env.CONVERSATION_SERVICE_URL || 'https://conv-a.wbx2.com/conversation/api/v1';\n\n return this.webex.request({\n method: 'POST',\n uri: `${convApi}/users/validateAuthToken`,\n body: {\n token: this.access_token\n },\n headers: {\n authorization: `Bearer ${this.access_token}`\n }\n });\n })\n .then((res) => res.body);\n }\n});\n\nexport default Token;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA;;AACA;;AAEA;;AACA;;AAEA;;AACA;;;;;;;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,iBAAT,CAA2BC,GAA3B,EAAgC;EAC9B,IAAIA,GAAG,CAACC,UAAJ,KAAmB,GAAvB,EAA4B;IAC1B,OAAO,iBAAQC,MAAR,CAAeF,GAAf,CAAP;EACD;;EAED,IAAMG,gBAAgB,GAAGC,oBAAA,CAAYC,MAAZ,CAAmBL,GAAG,CAACM,IAAJ,CAASC,KAA5B,CAAzB;;EAEA,IAAIJ,gBAAgB,KAAKK,uBAArB,IAAmCR,GAAG,YAAYS,uBAAtD,EAAsE;IACpE,OAAO,iBAAQP,MAAR,CAAeF,GAAf,CAAP;EACD;;EACD,IAAI,CAACG,gBAAL,EAAuB;IACrB,OAAO,iBAAQD,MAAR,CAAeF,GAAf,CAAP;EACD;;EAED,OAAO,iBAAQE,MAAR,CAAe,IAAIC,gBAAJ,CAAqBH,GAAG,CAACU,IAAJ,IAAYV,GAAjC,CAAf,CAAP;AACD;AAED;AACA;AACA;;;AACA,IAAMW,KAAK,GAAGC,oBAAA,CAAYC,MAAZ,SA4LX,IAAAC,iBAAA,EAAU;EACTC,UADS,sBACEC,KADF,EACS;IAChB,OAAOA,KAAP;EACD;AAHQ,CAAV,CA5LW,UAAmB;EAC/BC,OAAO,EAAE;IACP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,YAAY,EAAE;MACZC,IAAI,EAAE,CAAC,cAAD,EAAiB,WAAjB,CADM;MAEZC,EAFY,gBAEP;QACH,OAAO,CAAC,CAAC,KAAKC,YAAP,IAAuB,CAAC,KAAKC,SAApC;MACD;IAJW,CAVP;;IAiBP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,YAAY,EAAE;MACZJ,IAAI,EAAE,CAAC,cAAD,CADM;MAEZC,EAFY,gBAEP;QACH,OAAO,KAAKF,YAAL,IAAqB,CAAC,CAAC,KAAKM,MAAL,CAAYC,SAA1C;MACD;IAJW,CA/BP;;IAsCP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,UAAU,EAAE;MACVP,IAAI,EAAE,CAAC,eAAD,CADI;MAEVC,EAFU,gBAEL;QACH,IAAIO,iBAAJ,EAAe;UACb,OAAO,CAAC,CAAC,KAAKC,aAAP,IAAwB,CAAC,CAAC,KAAKJ,MAAL,CAAYK,eAA7C;QACD;;QAED,OAAO,CAAC,CAAC,KAAKD,aAAP,IAAwB,CAAC,CAAC,KAAKJ,MAAL,CAAYM,aAA7C;MACD;IARS,CApDL;;IA+DP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIR,SAAS,EAAE;MACTH,IAAI,EAAE,CAAC,SAAD,EAAY,YAAZ,CADG;MAETC,EAFS,gBAEJ;QACH;QACA;QACA,OAAO,CAAC,CAAC,KAAKW,OAAP,IAAkB,KAAKC,UAA9B;MACD;IANQ,CAvEJ;;IAgFP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;IACIC,OAAO,EAAE;MACPd,IAAI,EAAE,CAAC,cAAD,EAAiB,YAAjB,CADC;MAEPC,EAFO,gBAEF;QACH,IAAI,CAAC,KAAKC,YAAN,IAAsB,CAAC,KAAKa,UAAhC,EAA4C;UAC1C,OAAO,EAAP;QACD;;QAED,iBAAU,KAAKA,UAAf,cAA6B,KAAKb,YAAlC;MACD;IARM;EAxFF,CADsB;EAqG/Bc,SAAS,EAAE,aArGoB;EAuG/BC,KAAK,EAAE;IACL;AACJ;AACA;AACA;AACA;AACA;AACA;IACIpB,KAAK,EAAE,QARF;;IASL;AACJ;AACA;AACA;AACA;IACIK,YAAY,EAAE,QAdT;;IAeL;AACJ;AACA;AACA;AACA;IACIU,OAAO,EAAE,QApBJ;;IAqBL;AACJ;AACA;AACA;AACA;IACIM,UAAU,EAAE,QA1BP;;IA2BL;AACJ;AACA;AACA;AACA;IACIT,aAAa,EAAE,QAhCV;;IAiCL;AACJ;AACA;AACA;AACA;IACIU,qBAAqB,EAAE,QAtClB;;IAuCL;AACJ;AACA;AACA;AACA;IACIC,wBAAwB,EAAE,QA5CrB;;IA6CL;AACJ;AACA;AACA;AACA;AACA;IACIL,UAAU,EAAE;MACVM,OAAO,EAAE,QADC;MAEVC,IAAI,EAAE;IAFI;EAnDP,CAvGwB;EAgK/BC,OAAO,EAAE;IACP;AACJ;AACA;AACA;AACA;AACA;AACA;IACIV,UAAU,EAAE;MACVQ,OAAO,EAAE,KADC;MAEVC,IAAI,EAAE;IAFI,CARL;;IAYP;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACIE,aAAa,EAAE;MACbF,IAAI,EAAE;IADO;EAvBR,CAhKsB;;EAiM/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,SAxM+B,qBAwMrB5B,KAxMqB,EAwMd;IAAA;;IACf,KAAK6B,MAAL,CAAYC,IAAZ,uCAAgD9B,KAAhD;;IAEA,IAAI,KAAKM,SAAT,EAAoB;MAClB,KAAKuB,MAAL,CAAYC,IAAZ,CAAiB,2DAAjB;MAEA,OAAO,iBAAQ5C,MAAR,CAAe,IAAI6C,KAAJ,CAAU,uCAAV,CAAf,CAAP;IACD;;IAED,IAAI,CAAC,KAAKxB,YAAV,EAAwB;MACtB,IAAI,KAAKC,MAAL,CAAYC,SAAhB,EAA2B;QACzB,KAAKoB,MAAL,CAAYC,IAAZ,CAAiB,2DAAjB;MACD,CAFD,MAGK;QACH,KAAKD,MAAL,CAAYG,KAAZ,CAAkB,2CAAlB;MACD;;MAED,OAAO,iBAAQ9C,MAAR,CAAe,IAAI6C,KAAJ,CAAU,+BAAV,CAAf,CAAP;IACD,CAlBc,CAoBf;IACA;;;IACA,IAAI/B,KAAJ,EAAW;MACTA,KAAK,GAAG,IAAAiC,gBAAA,EAAUjC,KAAV,CAAR;IACD,CAxBc,CA0Bf;IACA;IACA;;;IACA,IAAIA,KAAK,KAAK,IAAAiC,gBAAA,EAAU,KAAKzB,MAAL,CAAYR,KAAtB,CAAd,EAA4C;MAC1C,OAAO,iBAAQd,MAAR,CAAe,IAAI6C,KAAJ,CAAU,iDAAV,CAAf,CAAP;IACD;;IAED,OAAO,KAAKG,KAAL,CAAWC,OAAX,CAAmB;MACxBC,MAAM,EAAE,MADgB;MAExBC,GAAG,EAAE,KAAK7B,MAAL,CAAY8B,QAFO;MAGxBC,aAAa,EAAE,KAHS;MAIxBC,IAAI,EAAE;QACJC,UAAU,EAAE,4CADR;QAEJC,KAAK,EAAE,KAAKrC,YAFR;QAGJL,KAAK,EAALA,KAHI;QAIJS,SAAS,EAAE,KAAKD,MAAL,CAAYC,SAJnB;QAKJkC,oBAAoB,EAAE;MALlB;IAJkB,CAAnB,EAYJC,IAZI,CAYC,UAAC5D,GAAD,EAAS;MACb,KAAI,CAAC6C,MAAL,CAAYC,IAAZ,sCAA+C9B,KAA/C;;MAEA,OAAO,IAAIL,KAAJ,CAAU,qBAAcX,GAAG,CAACM,IAAlB,EAAwB;QAACU,KAAK,EAALA;MAAD,CAAxB,CAAV,EAA4C;QAAC6C,MAAM,EAAE,KAAI,CAACA;MAAd,CAA5C,CAAP;IACD,CAhBI,CAAP;EAiBD,CA1P8B;;EA4P/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,UArQ+B,wBAqQM;IAAA;;IAAA,IAA1BC,KAA0B,uEAAlB,EAAkB;IAAA,IAAdC,OAAc,uEAAJ,EAAI;IACnC,oBAAcpD,oBAAA,CAAYqD,SAAZ,CAAsBH,UAApC,EAAgD,IAAhD,EAAsD,CAACC,KAAD,EAAQC,OAAR,CAAtD;;IAEA,IAAI,OAAOD,KAAP,KAAiB,QAArB,EAA+B;MAC7B,KAAK1C,YAAL,GAAoB0C,KAApB;IACD;;IAED,IAAI,CAAC,KAAK1C,YAAV,EAAwB;MACtB,MAAM,IAAI0B,KAAJ,CAAU,4BAAV,CAAN;IACD,CATkC,CAWnC;IACA;;;IACA,IAAI,KAAKhB,OAAT,EAAkB;MAChB,IAAI,KAAKA,OAAL,GAAe,mBAAnB,EAA+B;QAC7B,KAAKC,UAAL,GAAkB,IAAlB;MACD,CAFD,MAGK;QACH,IAAAkC,4BAAA,EAAe,YAAM;UACnB,MAAI,CAAClC,UAAL,GAAkB,IAAlB;QACD,CAFD,EAEG,KAAKD,OAAL,GAAe,mBAFlB;MAGD;IACF;EACF,CA5R8B;;EA+R/B;AACF;AACA;AACA;AACA;AACA;AACA;EACEoC,OAtS+B,qBAsSrB;IAAA;;IACR,IAAI,CAAC,KAAKzC,UAAV,EAAsB;MACpB,MAAM,IAAIqB,KAAJ,CAAU,+DAAV,CAAN;IACD;;IAED,IAAIqB,OAAJ;;IAEA,IAAIzC,iBAAJ,EAAe;MACb,IAAI,CAAC,KAAKH,MAAL,CAAYK,eAAjB,EAAkC;QAChC,MAAM,IAAIkB,KAAJ,CAAU,qDAAV,CAAN;MACD;;MAEDqB,OAAO,GAAG,iBAAQC,OAAR,CAAgB,KAAK7C,MAAL,CAAYK,eAAZ,CAA4B,KAAKqB,KAAjC,EAAwC,IAAxC,CAAhB,CAAV;IACD;;IAED,OAAO,CAACkB,OAAO,IAAI,KAAKlB,KAAL,CAAWC,OAAX,CAAmB;MACpCC,MAAM,EAAE,MAD4B;MAEpCC,GAAG,EAAE,KAAK7B,MAAL,CAAY8B,QAFmB;MAGpCE,IAAI,EAAE;QACJC,UAAU,EAAE,eADR;QAEJa,YAAY,EAAE,KAAK9C,MAAL,CAAY8C,YAFtB;QAGJ1C,aAAa,EAAE,KAAKA;MAHhB,CAH8B;MAQpC2C,IAAI,EAAE;QACJC,IAAI,EAAE,KAAKhD,MAAL,CAAYC,SADd;QAEJgD,IAAI,EAAE,KAAKjD,MAAL,CAAYM,aAFd;QAGJ4C,eAAe,EAAE;MAHb,CAR8B;MAapCC,wBAAwB,EAAE;IAbU,CAAnB,EAehBf,IAfgB,CAeX,UAAC5D,GAAD;MAAA,OAASA,GAAG,CAACM,IAAb;IAAA,CAfW,CAAZ,EAgBJsD,IAhBI,CAgBC,UAACgB,GAAD,EAAS;MACb,IAAI,CAACA,GAAL,EAAU;QACR,MAAM,IAAI7B,KAAJ,CAAU,oDAAV,CAAN;MACD,CAHY,CAIb;MACA;MACA;;;MACA,IAAI,CAAC6B,GAAG,CAAChD,aAAT,EAAwB;QACtB,qBAAcgD,GAAd,EAAmB,oBAAK,MAAL,EAAW,eAAX,EAA4B,uBAA5B,EAAqD,0BAArD,CAAnB;MACD,CATY,CAWb;MACA;;;MACA,IAAI,MAAI,CAACvD,YAAL,KAAsBuD,GAAG,CAACvD,YAA9B,EAA4C;QAC1C,MAAI,CAACwB,MAAL,CAAYtC,KAAZ,CAAkB,wCAAlB,EAD0C,CAE1C;;;QACA,IAAIsE,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAA7B,EAA2C;UACzC,MAAI,CAAClC,MAAL,CAAYtC,KAAZ,CAAkB,uBAAlB,EAA2C,MAAI,CAACc,YAAhD;;UACA,MAAI,CAACwB,MAAL,CAAYtC,KAAZ,CAAkB,mBAAlB,EAAuCqE,GAAG,CAACvD,YAA3C;QACD;;QAED,OAAO,iBAAQnB,MAAR,CAAe,IAAI6C,KAAJ,CAAU,iCAAV,CAAf,CAAP;MACD;;MAED,IAAI,MAAI,CAACJ,aAAT,EAAwB;QACtB,MAAI,CAACA,aAAL,CAAmBqC,MAAnB;;QACA,MAAI,CAACC,KAAL,CAAW,eAAX;MACD;;MAEDL,GAAG,CAACjC,aAAJ,GAAoB,MAApB;MACAiC,GAAG,CAAC5D,KAAJ,GAAY,MAAI,CAACA,KAAjB;MAEA,OAAO,IAAIL,KAAJ,CAAUiE,GAAV,EAAe;QAACf,MAAM,EAAE,MAAI,CAACA;MAAd,CAAf,CAAP;IACD,CAjDI,EAkDJqB,KAlDI,CAkDEnF,iBAlDF,CAAP;EAmDD,CAxW8B;;EA2W/B;AACF;AACA;AACA;AACA;AACA;EACEiF,MAjX+B,oBAiXtB;IAAA;;IACP,IAAI,KAAK1D,SAAT,EAAoB;MAClB,KAAKuB,MAAL,CAAYC,IAAZ,CAAiB,8DAAjB;MAEA,OAAO,iBAAQuB,OAAR,EAAP;IACD;;IAED,IAAI,CAAC,KAAKnD,YAAV,EAAwB;MACtB,KAAK2B,MAAL,CAAYC,IAAZ,CAAiB,uDAAjB;MAEA,OAAO,iBAAQuB,OAAR,EAAP;IACD,CAXM,CAaP;IACA;IACA;IACA;IACA;IACA;;;IACA,IAAI,CAAC,KAAK7C,MAAL,CAAYM,aAAjB,EAAgC;MAC9B,KAAKe,MAAL,CAAYC,IAAZ,CAAiB,kEAAjB;MAEA,OAAO,iBAAQuB,OAAR,EAAP;IACD;;IAED,KAAKxB,MAAL,CAAYC,IAAZ,CAAiB,8BAAjB;IAEA,OAAO,KAAKI,KAAL,CAAWC,OAAX,CAAmB;MACxBC,MAAM,EAAE,MADgB;MAExBC,GAAG,EAAE,KAAK7B,MAAL,CAAY2D,SAFO;MAGxB3B,IAAI,EAAE;QACJE,KAAK,EAAE,KAAKrC,YADR;QAEJ+D,eAAe,EAAE;MAFb,CAHkB;MAOxBb,IAAI,EAAE;QACJC,IAAI,EAAE,KAAKhD,MAAL,CAAYC,SADd;QAEJgD,IAAI,EAAE,KAAKjD,MAAL,CAAYM,aAFd;QAGJ4C,eAAe,EAAE;MAHb,CAPkB;MAYxBC,wBAAwB,EAAE;IAZF,CAAnB,EAcJf,IAdI,CAcC,YAAM;MACV,MAAI,CAACqB,KAAL,CAAW,CACT,cADS,EAET,SAFS,EAGT,YAHS,EAIT,YAJS,CAAX;;MAMA,MAAI,CAACpC,MAAL,CAAYC,IAAZ,CAAiB,6BAAjB;IACD,CAtBI,EAuBJoC,KAvBI,CAuBEnF,iBAvBF,CAAP;EAwBD,CApa8B;EAsa/BsF,GAta+B,iBAsalB;IACX;IACA,4BAAuB,KAAKC,oBAAL,uBAAvB;IAAA;IAAA,IAAKvB,KAAL;IAAA,IAAYC,OAAZ;;IAEA,IAAI,CAACD,KAAK,CAAC7B,UAAP,IAAqB6B,KAAK,CAAC1C,YAA3B,IAA2C0C,KAAK,CAAC1C,YAAN,CAAmBkE,QAAnB,CAA4B,GAA5B,CAA/C,EAAiF;MAC/E,4BAAmCxB,KAAK,CAAC1C,YAAN,CAAmBmE,KAAnB,CAAyB,GAAzB,CAAnC;MAAA;MAAA,IAAOtD,UAAP;MAAA,IAAmBb,YAAnB;;MAEA0C,KAAK,GAAG,qBAAc,EAAd,EAAkBA,KAAlB,EAAyB;QAAC1C,YAAY,EAAZA,YAAD;QAAea,UAAU,EAAVA;MAAf,CAAzB,CAAR;IACD;;IACD,IAAMuD,GAAG,GAAG,mBAAZ;;IAEA,IAAI,CAAC1B,KAAK,CAAChC,OAAP,IAAkBgC,KAAK,CAAC1B,UAA5B,EAAwC;MACtC0B,KAAK,CAAChC,OAAN,GAAgB0D,GAAG,GAAG1B,KAAK,CAAC1B,UAAN,GAAmB,IAAzC;IACD;;IAED,IAAI,CAAC0B,KAAK,CAACzB,qBAAP,IAAgCyB,KAAK,CAACxB,wBAA1C,EAAoE;MAClEwB,KAAK,CAACzB,qBAAN,GAA8BmD,GAAG,GAAG1B,KAAK,CAACxB,wBAAN,GAAiC,IAArE;IACD;;IAED,IAAIwB,KAAK,CAAC/C,KAAV,EAAiB;MACf+C,KAAK,CAAC/C,KAAN,GAAc,IAAAiC,gBAAA,EAAUc,KAAK,CAAC/C,KAAhB,CAAd;IACD;;IAED,OAAO,oBAAcJ,oBAAA,CAAYqD,SAAZ,CAAsBoB,GAApC,EAAyC,IAAzC,EAA+C,CAACtB,KAAD,EAAQC,OAAR,CAA/C,CAAP;EACD,CA9b8B;;EAgc/B;AACF;AACA;AACA;AACA;AACA;AACA;EACE0B,QAvc+B,sBAucpB;IACT,IAAI,CAAC,KAAKzD,OAAV,EAAmB;MACjB,MAAM,IAAIc,KAAJ,CAAU,wBAAV,CAAN;IACD;;IAED,OAAO,KAAKd,OAAZ;EACD,CA7c8B;;EA+c/B;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE0D,QAvd+B,sBAudpB;IAAA;;IACT,IAAId,OAAO,CAACC,GAAR,CAAYC,QAAZ,KAAyB,YAA7B,EAA2C;MACzC,MAAM,IAAIhC,KAAJ,CAAU,iDAAV,CAAN;IACD;;IAED,OAAO,KAAKG,KAAL,CAAWC,OAAX,CAAmB;MACxBC,MAAM,EAAE,MADgB;MAExBwC,OAAO,EAAE,cAFe;MAGxBC,QAAQ,EAAE,yBAHc;MAIxBvF,IAAI,EAAE;QACJoD,KAAK,EAAE,KAAKrC;MADR;IAJkB,CAAnB,EAQJ6D,KARI,CAQE,UAACY,MAAD,EAAY;MACjB,IAAI,gBAAgBA,MAApB,EAA4B;QAC1B,OAAO,iBAAQ5F,MAAR,CAAe4F,MAAf,CAAP;MACD;;MACD,MAAI,CAACjD,MAAL,CAAYC,IAAZ,CAAiB,uEAAjB,EAJiB,CAMjB;MACA;MACA;;;MACA,IAAMiD,OAAO,GAAGlB,OAAO,CAACC,GAAR,CAAYkB,oBAAZ,IAAoCnB,OAAO,CAACC,GAAR,CAAYmB,wBAAhD,IAA4E,6CAA5F;MAEA,OAAO,MAAI,CAAC/C,KAAL,CAAWC,OAAX,CAAmB;QACxBC,MAAM,EAAE,MADgB;QAExBC,GAAG,YAAK0C,OAAL,6BAFqB;QAGxBzF,IAAI,EAAE;UACJoD,KAAK,EAAE,MAAI,CAACrC;QADR,CAHkB;QAMxB6E,OAAO,EAAE;UACPC,aAAa,mBAAY,MAAI,CAAC9E,YAAjB;QADN;MANe,CAAnB,CAAP;IAUD,CA7BI,EA8BJuC,IA9BI,CA8BC,UAAC5D,GAAD;MAAA,OAASA,GAAG,CAACM,IAAb;IAAA,CA9BD,CAAP;EA+BD,CA3f8B;EAAA;AAAA,CAAnB,kMA8RXQ,iBA9RW,4HA0WXA,iBA1WW,0EAAd;;eA8feH,K"}
|
|
1
|
+
{"version":3,"names":["processGrantError","res","statusCode","reject","ErrorConstructor","grantErrors","select","body","error","OAuthError","WebexHttpError","_res","Token","WebexPlugin","extend","oneFlight","keyFactory","scope","derived","canAuthorize","deps","fn","access_token","isExpired","canDownscope","config","client_id","canRefresh","inBrowser","refresh_token","refreshCallback","client_secret","expires","_isExpired","_string","token_type","namespace","props","expires_in","refresh_token_expires","refresh_token_expires_in","default","type","session","previousToken","downscope","logger","info","Error","trace","sortScope","webex","request","method","uri","tokenUrl","addAuthHeader","form","grant_type","token","self_contained_token","then","parent","initialize","attrs","options","prototype","safeSetTimeout","refresh","promise","resolve","redirect_uri","auth","user","pass","sendImmediately","shouldRefreshAccessToken","obj","process","env","NODE_ENV","revoke","unset","catch","revokeUrl","token_type_hint","set","_filterSetParameters","includes","split","now","toString","validate","service","resource","reason","convApi","CONVERSATION_SERVICE","CONVERSATION_SERVICE_URL","headers","authorization"],"sources":["token.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {pick} from 'lodash';\nimport {inBrowser, oneFlight} from '@webex/common';\nimport {safeSetTimeout} from '@webex/common-timers';\n\nimport WebexHttpError from '../webex-http-error';\nimport WebexPlugin from '../webex-plugin';\n\nimport {sortScope} from './scope';\nimport grantErrors, {OAuthError} from './grant-errors';\n\n/* eslint-disable camelcase */\n\n/**\n * Parse response from CI and converts to structured error when appropriate\n * @param {WebexHttpError} res\n * @private\n * @returns {GrantError}\n */\nfunction processGrantError(res) {\n if (res.statusCode !== 400) {\n return Promise.reject(res);\n }\n\n const ErrorConstructor = grantErrors.select(res.body.error);\n\n if (ErrorConstructor === OAuthError && res instanceof WebexHttpError) {\n return Promise.reject(res);\n }\n if (!ErrorConstructor) {\n return Promise.reject(res);\n }\n\n return Promise.reject(new ErrorConstructor(res._res || res));\n}\n\n/**\n * @class\n */\nconst Token = WebexPlugin.extend({\n derived: {\n /**\n * Indicates if this token can be used in an auth header. `true` iff\n * {@link Token#access_token} is defined and {@link Token#isExpired} is\n * false.\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canAuthorize: {\n deps: ['access_token', 'isExpired'],\n fn() {\n return !!this.access_token && !this.isExpired;\n },\n },\n\n /**\n * Indicates that this token can be downscoped. `true` iff\n * {@link config.credentials.client_id} is defined and if\n * {@link Token#canAuthorize} is true\n *\n * Note: since {@link config} is not evented, we can't listen for changes to\n * {@link config.credentials.client_id}. As such,\n * {@link config.credentials.client_id} must always be set before\n * instantiating a {@link Token}\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canDownscope: {\n deps: ['canAuthorize'],\n fn() {\n return this.canAuthorize && !!this.config.client_id;\n },\n },\n\n /**\n * Indicates if this token can be refreshed. `true` iff\n * {@link Token@refresh_token} is defined and\n * {@link config.credentials.refreshCallback()} is defined\n *\n * Note: since {@link config} is not evented, we can't listen for changes to\n * {@link config.credentials.refreshCallback()}. As such,\n * {@link config.credentials.refreshCallback()} must always be set before\n * instantiating a {@link Token}\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n canRefresh: {\n deps: ['refresh_token'],\n fn() {\n if (inBrowser) {\n return !!this.refresh_token && !!this.config.refreshCallback;\n }\n\n return !!this.refresh_token && !!this.config.client_secret;\n },\n },\n\n /**\n * Indicates if this `Token` is expired. `true` iff {@link Token#expires} is\n * defined and is less than {@link Date.now()}.\n * @instance\n * @memberof Token\n * @readonly\n * @type {boolean}\n */\n isExpired: {\n deps: ['expires', '_isExpired'],\n fn() {\n // in order to avoid setting `cache:false`, we'll use a private property\n // and a timer rather than comparing to `Date.now()`;\n return !!this.expires && this._isExpired;\n },\n },\n\n /**\n * Cache for toString()\n * @instance\n * @memberof Token\n * @private\n * @readonly\n * @type {string}\n */\n _string: {\n deps: ['access_token', 'token_type'],\n fn() {\n if (!this.access_token || !this.token_type) {\n return '';\n }\n\n return `${this.token_type} ${this.access_token}`;\n },\n },\n },\n\n namespace: 'Credentials',\n\n props: {\n /**\n * Used for indexing in the credentials userTokens collection\n * @instance\n * @memberof Token\n * @private\n * @type {string}\n */\n scope: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {string}\n */\n access_token: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n expires: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n expires_in: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {string}\n */\n refresh_token: 'string',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n refresh_token_expires: 'number',\n /**\n * @instance\n * @memberof Token\n * @type {number}\n */\n refresh_token_expires_in: 'number',\n /**\n * @default \"Bearer\"\n * @instance\n * @memberof Token\n * @type {string}\n */\n token_type: {\n default: 'Bearer',\n type: 'string',\n },\n },\n\n session: {\n /**\n * Used by {@link Token#isExpired} to avoid doing a Date comparison.\n * @instance\n * @memberof Token\n * @private\n * @type {boolean}\n */\n _isExpired: {\n default: false,\n type: 'boolean',\n },\n /**\n * Handle to the previous token that we'll revoke when we refresh this\n * token. The idea is to keep allow two valid tokens when a refresh occurs;\n * we don't want revoke a token that's in the middle of being used, so when\n * we do a token refresh, we won't revoke the token being refreshed, but\n * we'll revoke the previous one.\n * @instance\n * @memberof Token\n * @private\n * @type {Object}\n */\n previousToken: {\n type: 'state',\n },\n },\n\n @oneFlight({\n keyFactory(scope) {\n return scope;\n },\n })\n /**\n * Uses this token to request a new Token with a subset of this Token's scopes\n * @instance\n * @memberof Token\n * @param {string} scope\n * @returns {Promise<Token>}\n */\n downscope(scope) {\n this.logger.info(`token: downscoping token to ${scope}`);\n\n if (this.isExpired) {\n this.logger.info('token: request received to downscope expired access_token');\n\n return Promise.reject(new Error('cannot downscope expired access token'));\n }\n\n if (!this.canDownscope) {\n if (this.config.client_id) {\n this.logger.info('token: request received to downscope invalid access_token');\n } else {\n this.logger.trace('token: cannot downscope without client_id');\n }\n\n return Promise.reject(new Error('cannot downscope access token'));\n }\n\n // Since we're going to use scope as the index in our token collection, it's\n // important scopes are always deterministically specified.\n if (scope) {\n scope = sortScope(scope);\n }\n\n // Ideally, we could depend on the service to communicate this error, but\n // all we get is \"invalid scope\", which, to the lay person, implies\n // something wrong with *one* of the scopes, not the whole thing.\n if (scope === sortScope(this.config.scope)) {\n return Promise.reject(new Error('token: scope reduction requires a reduced scope'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n uri: this.config.tokenUrl,\n addAuthHeader: false,\n form: {\n grant_type: 'urn:cisco:oauth:grant-type:scope-reduction',\n token: this.access_token,\n scope,\n client_id: this.config.client_id,\n self_contained_token: true,\n },\n })\n .then((res) => {\n this.logger.info(`token: downscoped token to ${scope}`);\n\n return new Token(Object.assign(res.body, {scope}), {parent: this.parent});\n });\n },\n\n /**\n * Initializer\n * @instance\n * @memberof Token\n * @param {Object} [attrs={}]\n * @param {Object} [options={}]\n * @see {@link WebexPlugin#initialize()}\n * @returns {Token}\n */\n initialize(attrs = {}, options = {}) {\n Reflect.apply(WebexPlugin.prototype.initialize, this, [attrs, options]);\n\n if (typeof attrs === 'string') {\n this.access_token = attrs;\n }\n\n if (!this.access_token) {\n throw new Error('`access_token` is required');\n }\n\n // We don't want the derived property `isExpired` to need {cache:false}, so\n // we'll set up a timer the runs when this token should expire.\n if (this.expires) {\n if (this.expires < Date.now()) {\n this._isExpired = true;\n } else {\n safeSetTimeout(() => {\n this._isExpired = true;\n }, this.expires - Date.now());\n }\n }\n },\n\n @oneFlight\n /**\n * Refreshes this Token. Relies on\n * {@link config.credentials.refreshCallback()}\n * @instance\n * @memberof Token\n * @returns {Promise<Token>}\n */\n refresh() {\n if (!this.canRefresh) {\n throw new Error('Not enough information available to refresh this access token');\n }\n\n let promise;\n\n if (inBrowser) {\n if (!this.config.refreshCallback) {\n throw new Error('Cannot refresh access token without refreshCallback');\n }\n\n promise = Promise.resolve(this.config.refreshCallback(this.webex, this));\n }\n\n return (\n promise ||\n this.webex\n .request({\n method: 'POST',\n uri: this.config.tokenUrl,\n form: {\n grant_type: 'refresh_token',\n redirect_uri: this.config.redirect_uri,\n refresh_token: this.refresh_token,\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then((res) => res.body)\n )\n .then((obj) => {\n if (!obj) {\n throw new Error('token: refreshCallback() did not produce an object');\n }\n // If the authentication server did not send back a refresh token, copy\n // the current refresh token and related values to the response (note:\n // at time of implementation, CI never sends a new refresh token)\n if (!obj.refresh_token) {\n Object.assign(\n obj,\n pick(this, 'refresh_token', 'refresh_token_expires', 'refresh_token_expires_in')\n );\n }\n\n // If the new token is the same as the previous token, then we may have\n // found a bug in CI; log the details and reject the Promise\n if (this.access_token === obj.access_token) {\n this.logger.error('token: new token matches current token');\n // log the tokens if it is not production\n if (process.env.NODE_ENV !== 'production') {\n this.logger.error('token: current token:', this.access_token);\n this.logger.error('token: new token:', obj.access_token);\n }\n\n return Promise.reject(new Error('new token matches current token'));\n }\n\n if (this.previousToken) {\n this.previousToken.revoke();\n this.unset('previousToken');\n }\n\n obj.previousToken = this;\n obj.scope = this.scope;\n\n return new Token(obj, {parent: this.parent});\n })\n .catch(processGrantError);\n },\n\n @oneFlight\n /**\n * Revokes this token and unsets its local properties\n * @instance\n * @memberof Token\n * @returns {Promise}\n */\n revoke() {\n if (this.isExpired) {\n this.logger.info('token: already expired, not making making revocation request');\n\n return Promise.resolve();\n }\n\n if (!this.canAuthorize) {\n this.logger.info('token: no longer valid, not making revocation request');\n\n return Promise.resolve();\n }\n\n // FIXME we need to use the user token revocation endpoint to revoke a token\n // without a client_secret, but it doesn't current support using a token to\n // revoke itself\n // Note: I'm not making a canRevoke property because there should be changes\n // coming to the user token revocation endpoint that allow us to do this\n // correctly.\n if (!this.config.client_secret) {\n this.logger.info('token: no client secret available, not making revocation request');\n\n return Promise.resolve();\n }\n\n this.logger.info('token: revoking access token');\n\n return this.webex\n .request({\n method: 'POST',\n uri: this.config.revokeUrl,\n form: {\n token: this.access_token,\n token_type_hint: 'access_token',\n },\n auth: {\n user: this.config.client_id,\n pass: this.config.client_secret,\n sendImmediately: true,\n },\n shouldRefreshAccessToken: false,\n })\n .then(() => {\n this.unset(['access_token', 'expires', 'expires_in', 'token_type']);\n this.logger.info('token: access token revoked');\n })\n .catch(processGrantError);\n },\n\n set(...args) {\n // eslint-disable-next-line prefer-const\n let [attrs, options] = this._filterSetParameters(...args);\n\n if (!attrs.token_type && attrs.access_token && attrs.access_token.includes(' ')) {\n const [token_type, access_token] = attrs.access_token.split(' ');\n\n attrs = {...attrs, access_token, token_type};\n }\n const now = Date.now();\n\n if (!attrs.expires && attrs.expires_in) {\n attrs.expires = now + attrs.expires_in * 1000;\n }\n\n if (!attrs.refresh_token_expires && attrs.refresh_token_expires_in) {\n attrs.refresh_token_expires = now + attrs.refresh_token_expires_in * 1000;\n }\n\n if (attrs.scope) {\n attrs.scope = sortScope(attrs.scope);\n }\n\n return Reflect.apply(WebexPlugin.prototype.set, this, [attrs, options]);\n },\n\n /**\n * Renders the token object as an HTTP Header Value\n * @instance\n * @memberof Token\n * @returns {string}\n * @see {@link Object#toString()}\n */\n toString() {\n if (!this._string) {\n throw new Error('cannot stringify Token');\n }\n\n return this._string;\n },\n\n /**\n * Uses a non-producation api to return information about this token. This\n * method is primarily for tests and will throw if NODE_ENV === production\n * @instance\n * @memberof Token\n * @private\n * @returns {Promise}\n */\n validate() {\n if (process.env.NODE_ENV === 'production') {\n throw new Error('Token#validate() must not be used in production');\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'conversation',\n resource: 'users/validateAuthToken',\n body: {\n token: this.access_token,\n },\n })\n .catch((reason) => {\n if ('statusCode' in reason) {\n return Promise.reject(reason);\n }\n this.logger.info(\"REMINDER: If you're investigating a network error here, it's normal\");\n\n // If we got an error that isn't a WebexHttpError, assume the problem is\n // that we don't have the wdm plugin loaded and service/resource isn't\n // a valid means of identifying a request.\n const convApi =\n process.env.CONVERSATION_SERVICE ||\n process.env.CONVERSATION_SERVICE_URL ||\n 'https://conv-a.wbx2.com/conversation/api/v1';\n\n return this.webex.request({\n method: 'POST',\n uri: `${convApi}/users/validateAuthToken`,\n body: {\n token: this.access_token,\n },\n headers: {\n authorization: `Bearer ${this.access_token}`,\n },\n });\n })\n .then((res) => res.body);\n },\n});\n\nexport default Token;\n"],"mappings":"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"}
|
package/dist/lib/page.js
CHANGED
|
@@ -20,6 +20,8 @@ var _isArray = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/ar
|
|
|
20
20
|
|
|
21
21
|
var _iterator = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/symbol/iterator"));
|
|
22
22
|
|
|
23
|
+
/* eslint-disable no-constructor-return */
|
|
24
|
+
|
|
23
25
|
/*!
|
|
24
26
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
25
27
|
*/
|