@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.
Files changed (142) hide show
  1. package/dist/config.js.map +1 -1
  2. package/dist/credentials-config.js +44 -44
  3. package/dist/credentials-config.js.map +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/interceptors/auth.js.map +1 -1
  6. package/dist/interceptors/default-options.js.map +1 -1
  7. package/dist/interceptors/embargo.js.map +1 -1
  8. package/dist/interceptors/payload-transformer.js.map +1 -1
  9. package/dist/interceptors/rate-limit.js +4 -4
  10. package/dist/interceptors/rate-limit.js.map +1 -1
  11. package/dist/interceptors/redirect.js.map +1 -1
  12. package/dist/interceptors/request-event.js.map +1 -1
  13. package/dist/interceptors/request-logger.js.map +1 -1
  14. package/dist/interceptors/response-logger.js.map +1 -1
  15. package/dist/interceptors/user-agent.js.map +1 -1
  16. package/dist/interceptors/webex-user-agent.js.map +1 -1
  17. package/dist/lib/batcher.js +1 -1
  18. package/dist/lib/batcher.js.map +1 -1
  19. package/dist/lib/credentials/credentials.js +21 -6
  20. package/dist/lib/credentials/credentials.js.map +1 -1
  21. package/dist/lib/credentials/grant-errors.js.map +1 -1
  22. package/dist/lib/credentials/index.js.map +1 -1
  23. package/dist/lib/credentials/scope.js.map +1 -1
  24. package/dist/lib/credentials/token-collection.js.map +1 -1
  25. package/dist/lib/credentials/token.js +19 -5
  26. package/dist/lib/credentials/token.js.map +1 -1
  27. package/dist/lib/page.js +2 -0
  28. package/dist/lib/page.js.map +1 -1
  29. package/dist/lib/services/constants.js.map +1 -1
  30. package/dist/lib/services/index.js.map +1 -1
  31. package/dist/lib/services/interceptors/server-error.js +2 -2
  32. package/dist/lib/services/interceptors/server-error.js.map +1 -1
  33. package/dist/lib/services/interceptors/service.js +1 -1
  34. package/dist/lib/services/interceptors/service.js.map +1 -1
  35. package/dist/lib/services/metrics.js.map +1 -1
  36. package/dist/lib/services/service-catalog.js.map +1 -1
  37. package/dist/lib/services/service-fed-ramp.js.map +1 -1
  38. package/dist/lib/services/service-host.js +6 -6
  39. package/dist/lib/services/service-host.js.map +1 -1
  40. package/dist/lib/services/service-registry.js.map +1 -1
  41. package/dist/lib/services/service-state.js.map +1 -1
  42. package/dist/lib/services/service-url.js.map +1 -1
  43. package/dist/lib/services/services.js +9 -7
  44. package/dist/lib/services/services.js.map +1 -1
  45. package/dist/lib/stateless-webex-plugin.js.map +1 -1
  46. package/dist/lib/storage/decorators.js.map +1 -1
  47. package/dist/lib/storage/index.js +2 -2
  48. package/dist/lib/storage/index.js.map +1 -1
  49. package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
  50. package/dist/lib/storage/make-webex-store.js.map +1 -1
  51. package/dist/lib/storage/memory-store-adapter.js.map +1 -1
  52. package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
  53. package/dist/lib/webex-http-error.js.map +1 -1
  54. package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
  55. package/dist/lib/webex-plugin.js.map +1 -1
  56. package/dist/plugins/logger.js +1 -1
  57. package/dist/plugins/logger.js.map +1 -1
  58. package/dist/webex-core.js +2 -2
  59. package/dist/webex-core.js.map +1 -1
  60. package/dist/webex-internal-core.js.map +1 -1
  61. package/package.json +14 -14
  62. package/src/config.js +9 -11
  63. package/src/credentials-config.js +110 -72
  64. package/src/index.js +4 -14
  65. package/src/interceptors/auth.js +36 -37
  66. package/src/interceptors/default-options.js +0 -1
  67. package/src/interceptors/embargo.js +1 -1
  68. package/src/interceptors/payload-transformer.js +1 -2
  69. package/src/interceptors/rate-limit.js +8 -5
  70. package/src/interceptors/redirect.js +14 -8
  71. package/src/interceptors/request-event.js +4 -8
  72. package/src/interceptors/request-logger.js +8 -5
  73. package/src/interceptors/response-logger.js +11 -8
  74. package/src/interceptors/user-agent.js +1 -2
  75. package/src/interceptors/webex-user-agent.js +3 -9
  76. package/src/lib/batcher.js +70 -69
  77. package/src/lib/credentials/credentials.js +112 -122
  78. package/src/lib/credentials/grant-errors.js +6 -7
  79. package/src/lib/credentials/index.js +1 -4
  80. package/src/lib/credentials/scope.js +1 -4
  81. package/src/lib/credentials/token-collection.js +1 -1
  82. package/src/lib/credentials/token.js +86 -80
  83. package/src/lib/page.js +10 -11
  84. package/src/lib/services/constants.js +3 -13
  85. package/src/lib/services/index.js +2 -2
  86. package/src/lib/services/interceptors/server-error.js +12 -7
  87. package/src/lib/services/interceptors/service.js +6 -5
  88. package/src/lib/services/metrics.js +1 -1
  89. package/src/lib/services/service-catalog.js +110 -100
  90. package/src/lib/services/service-fed-ramp.js +1 -2
  91. package/src/lib/services/service-host.js +10 -17
  92. package/src/lib/services/service-registry.js +69 -96
  93. package/src/lib/services/service-state.js +4 -6
  94. package/src/lib/services/service-url.js +24 -23
  95. package/src/lib/services/services.js +260 -251
  96. package/src/lib/stateless-webex-plugin.js +4 -2
  97. package/src/lib/storage/decorators.js +68 -66
  98. package/src/lib/storage/index.js +4 -6
  99. package/src/lib/storage/make-webex-plugin-store.js +34 -21
  100. package/src/lib/storage/make-webex-store.js +6 -7
  101. package/src/lib/storage/memory-store-adapter.js +3 -3
  102. package/src/lib/webex-core-plugin-mixin.js +10 -7
  103. package/src/lib/webex-http-error.js +7 -8
  104. package/src/lib/webex-internal-core-plugin-mixin.js +9 -6
  105. package/src/lib/webex-plugin.js +41 -34
  106. package/src/plugins/logger.js +8 -3
  107. package/src/webex-core.js +185 -116
  108. package/src/webex-internal-core.js +15 -9
  109. package/test/integration/spec/credentials/credentials.js +26 -30
  110. package/test/integration/spec/credentials/token.js +36 -33
  111. package/test/integration/spec/services/service-catalog.js +177 -156
  112. package/test/integration/spec/services/services.js +313 -304
  113. package/test/integration/spec/webex-core.js +98 -86
  114. package/test/unit/spec/_setup.js +26 -18
  115. package/test/unit/spec/credentials/credentials.js +189 -154
  116. package/test/unit/spec/credentials/token.js +94 -76
  117. package/test/unit/spec/interceptors/auth.js +291 -243
  118. package/test/unit/spec/interceptors/default-options.js +36 -24
  119. package/test/unit/spec/interceptors/embargo.js +32 -27
  120. package/test/unit/spec/interceptors/network-timing.js +2 -2
  121. package/test/unit/spec/interceptors/payload-transformer.js +61 -52
  122. package/test/unit/spec/interceptors/rate-limit.js +104 -75
  123. package/test/unit/spec/interceptors/redirect.js +22 -20
  124. package/test/unit/spec/interceptors/request-timing.js +18 -22
  125. package/test/unit/spec/interceptors/user-agent.js +28 -16
  126. package/test/unit/spec/interceptors/webex-tracking-id.js +14 -8
  127. package/test/unit/spec/interceptors/webex-user-agent.js +83 -37
  128. package/test/unit/spec/lib/batcher.js +36 -32
  129. package/test/unit/spec/lib/page.js +36 -32
  130. package/test/unit/spec/lib/webex-plugin.js +1 -1
  131. package/test/unit/spec/services/interceptors/server-error.js +67 -90
  132. package/test/unit/spec/services/interceptors/service.js +17 -28
  133. package/test/unit/spec/services/service-catalog.js +19 -27
  134. package/test/unit/spec/services/service-host.js +29 -26
  135. package/test/unit/spec/services/service-registry.js +128 -170
  136. package/test/unit/spec/services/service-state.js +13 -22
  137. package/test/unit/spec/services/service-url.js +24 -43
  138. package/test/unit/spec/services/services.js +85 -41
  139. package/test/unit/spec/storage/persist.js +6 -9
  140. package/test/unit/spec/storage/wait-for-value.js +22 -21
  141. package/test/unit/spec/webex-core.js +78 -57
  142. package/test/unit/spec/webex-internal-core.js +56 -31
@@ -40,11 +40,7 @@ export default class WebexUserAgentInterceptor extends Interceptor {
40
40
  */
41
41
  onRequest(options) {
42
42
  options.headers = options.headers || {};
43
- const {
44
- appName,
45
- appVersion,
46
- appPlatform
47
- } = this.webex?.config ?? {};
43
+ const {appName, appVersion, appPlatform} = this.webex?.config ?? {};
48
44
  let sparkUserAgent = `${strings.get(this)}`;
49
45
 
50
46
  if (appName) {
@@ -61,11 +57,9 @@ export default class WebexUserAgentInterceptor extends Interceptor {
61
57
 
62
58
  if (
63
59
  options.uri &&
64
- (
65
- options.uri.includes(this.webex.config.credentials.samlUrl) ||
60
+ (options.uri.includes(this.webex.config.credentials.samlUrl) ||
66
61
  options.uri.includes(this.webex.config.credentials.tokenUrl) ||
67
- options.uri.includes(this.webex.config.credentials.authorizeUrl)
68
- )
62
+ options.uri.includes(this.webex.config.credentials.authorizeUrl))
69
63
  ) {
70
64
  return options;
71
65
  }
@@ -3,11 +3,7 @@
3
3
  */
4
4
 
5
5
  import {has} from 'lodash';
6
- import {
7
- cappedDebounce,
8
- Defer,
9
- tap
10
- } from '@webex/common';
6
+ import {cappedDebounce, Defer, tap} from '@webex/common';
11
7
 
12
8
  import WebexPlugin from './webex-plugin';
13
9
  import WebexHttpError from './webex-http-error';
@@ -22,14 +18,14 @@ const Batcher = WebexPlugin.extend({
22
18
  type: 'object',
23
19
  default() {
24
20
  return new Map();
25
- }
21
+ },
26
22
  },
27
23
  queue: {
28
24
  type: 'array',
29
25
  default() {
30
26
  return [];
31
- }
32
- }
27
+ },
28
+ },
33
29
  },
34
30
 
35
31
  derived: {
@@ -37,10 +33,10 @@ const Batcher = WebexPlugin.extend({
37
33
  fn() {
38
34
  return cappedDebounce((...args) => this.executeQueue(...args), this.config.batcherWait, {
39
35
  maxCalls: this.config.batcherMaxCalls,
40
- maxWait: this.config.batcherMaxWait
36
+ maxWait: this.config.batcherMaxWait,
41
37
  });
42
- }
43
- }
38
+ },
39
+ },
44
40
  },
45
41
 
46
42
  /**
@@ -113,25 +109,30 @@ const Batcher = WebexPlugin.extend({
113
109
  const queue = this.queue.splice(0, this.config.batcherMaxCalls);
114
110
 
115
111
  return new Promise((resolve) => {
116
- resolve(this.prepareRequest(queue)
117
- .then((payload) => this.submitHttpRequest(payload)
118
- .then((res) => this.handleHttpSuccess(res)))
119
- .catch((reason) => {
120
- if (reason instanceof WebexHttpError) {
121
- return this.handleHttpError(reason);
122
- }
123
-
124
- return Promise.all(queue.map((item) => this.getDeferredForRequest(item)
125
- .then((defer) => {
126
- defer.reject(reason);
127
- })));
128
- }));
129
- })
130
- .catch((reason) => {
131
- this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);
132
-
133
- return Promise.reject(reason);
134
- });
112
+ resolve(
113
+ this.prepareRequest(queue)
114
+ .then((payload) =>
115
+ this.submitHttpRequest(payload).then((res) => this.handleHttpSuccess(res))
116
+ )
117
+ .catch((reason) => {
118
+ if (reason instanceof WebexHttpError) {
119
+ return this.handleHttpError(reason);
120
+ }
121
+
122
+ return Promise.all(
123
+ queue.map((item) =>
124
+ this.getDeferredForRequest(item).then((defer) => {
125
+ defer.reject(reason);
126
+ })
127
+ )
128
+ );
129
+ })
130
+ );
131
+ }).catch((reason) => {
132
+ this.logger.error(process.env.NODE_ENV === 'production' ? reason : reason.stack);
133
+
134
+ return Promise.reject(reason);
135
+ });
135
136
  },
136
137
 
137
138
  /**
@@ -162,7 +163,9 @@ const Batcher = WebexPlugin.extend({
162
163
  * @returns {Promise<undefined>}
163
164
  */
164
165
  handleHttpSuccess(res) {
165
- return Promise.all((res.body && res.body.items || res.body).map((item) => this.acceptItem(item)));
166
+ return Promise.all(
167
+ ((res.body && res.body.items) || res.body).map((item) => this.acceptItem(item))
168
+ );
166
169
  },
167
170
 
168
171
  /**
@@ -176,10 +179,13 @@ const Batcher = WebexPlugin.extend({
176
179
  handleHttpError(reason) {
177
180
  if (reason instanceof WebexHttpError) {
178
181
  if (has(reason, 'options.body.map')) {
179
- return Promise.all(reason.options.body.map((item) => this.getDeferredForRequest(item)
180
- .then((defer) => {
181
- defer.reject(reason);
182
- })));
182
+ return Promise.all(
183
+ reason.options.body.map((item) =>
184
+ this.getDeferredForRequest(item).then((defer) => {
185
+ defer.reject(reason);
186
+ })
187
+ )
188
+ );
183
189
  }
184
190
  }
185
191
  this.logger.error('http error handler called without a WebexHttpError object', reason);
@@ -193,14 +199,13 @@ const Batcher = WebexPlugin.extend({
193
199
  * @returns {Promise<undefined>}
194
200
  */
195
201
  acceptItem(item) {
196
- return this.didItemFail(item)
197
- .then((didFail) => {
198
- if (didFail) {
199
- return this.handleItemFailure(item);
200
- }
202
+ return this.didItemFail(item).then((didFail) => {
203
+ if (didFail) {
204
+ return this.handleItemFailure(item);
205
+ }
201
206
 
202
- return this.handleItemSuccess(item);
203
- });
207
+ return this.handleItemSuccess(item);
208
+ });
204
209
  },
205
210
 
206
211
  /**
@@ -221,10 +226,9 @@ const Batcher = WebexPlugin.extend({
221
226
  * @returns {Promise<undefined>}
222
227
  */
223
228
  handleItemFailure(item) {
224
- return this.getDeferredForResponse(item)
225
- .then((defer) => {
226
- defer.reject(item);
227
- });
229
+ return this.getDeferredForResponse(item).then((defer) => {
230
+ defer.reject(item);
231
+ });
228
232
  },
229
233
 
230
234
  /**
@@ -234,10 +238,9 @@ const Batcher = WebexPlugin.extend({
234
238
  * @returns {Promise<undefined>}
235
239
  */
236
240
  handleItemSuccess(item) {
237
- return this.getDeferredForResponse(item)
238
- .then((defer) => {
239
- defer.resolve(item);
240
- });
241
+ return this.getDeferredForResponse(item).then((defer) => {
242
+ defer.resolve(item);
243
+ });
241
244
  },
242
245
 
243
246
  /**
@@ -246,17 +249,16 @@ const Batcher = WebexPlugin.extend({
246
249
  * @returns {Promise<Defer>}
247
250
  */
248
251
  getDeferredForRequest(item) {
249
- return this.fingerprintRequest(item)
250
- .then((idx) => {
251
- const defer = this.deferreds.get(idx);
252
+ return this.fingerprintRequest(item).then((idx) => {
253
+ const defer = this.deferreds.get(idx);
252
254
 
253
- /* istanbul ignore if */
254
- if (!defer) {
255
- throw new Error('Could not find pending request for received response');
256
- }
255
+ /* istanbul ignore if */
256
+ if (!defer) {
257
+ throw new Error('Could not find pending request for received response');
258
+ }
257
259
 
258
- return defer;
259
- });
260
+ return defer;
261
+ });
260
262
  },
261
263
 
262
264
  /**
@@ -265,17 +267,16 @@ const Batcher = WebexPlugin.extend({
265
267
  * @returns {Promise<Defer>}
266
268
  */
267
269
  getDeferredForResponse(item) {
268
- return this.fingerprintResponse(item)
269
- .then((idx) => {
270
- const defer = this.deferreds.get(idx);
270
+ return this.fingerprintResponse(item).then((idx) => {
271
+ const defer = this.deferreds.get(idx);
271
272
 
272
- /* istanbul ignore if */
273
- if (!defer) {
274
- throw new Error('Could not find pending request for received response');
275
- }
273
+ /* istanbul ignore if */
274
+ if (!defer) {
275
+ throw new Error('Could not find pending request for received response');
276
+ }
276
277
 
277
- return defer;
278
- });
278
+ return defer;
279
+ });
279
280
  },
280
281
 
281
282
  /**
@@ -300,7 +301,7 @@ const Batcher = WebexPlugin.extend({
300
301
  // eslint-disable-next-line no-unused-vars
301
302
  fingerprintResponse(item) {
302
303
  throw new Error('fingerprintResponse() must be implemented');
303
- }
304
+ },
304
305
  });
305
306
 
306
307
  export default Batcher;
@@ -6,13 +6,7 @@ import querystring from 'querystring';
6
6
  import url from 'url';
7
7
 
8
8
  import jwt from 'jsonwebtoken';
9
- import {
10
- base64,
11
- makeStateDataType,
12
- oneFlight,
13
- tap,
14
- whileInFlight
15
- } from '@webex/common';
9
+ import {base64, makeStateDataType, oneFlight, tap, whileInFlight} from '@webex/common';
16
10
  import {safeSetTimeout} from '@webex/common-timers';
17
11
  import {clone, cloneDeep, isObject, isEmpty} from 'lodash';
18
12
 
@@ -29,29 +23,22 @@ import TokenCollection from './token-collection';
29
23
  */
30
24
  const Credentials = WebexPlugin.extend({
31
25
  collections: {
32
- userTokens: TokenCollection
26
+ userTokens: TokenCollection,
33
27
  },
34
28
 
35
29
  dataTypes: {
36
- token: makeStateDataType(Token, 'token').dataType
30
+ token: makeStateDataType(Token, 'token').dataType,
37
31
  },
38
32
 
39
33
  derived: {
40
34
  canAuthorize: {
41
- deps: [
42
- 'supertoken',
43
- 'supertoken.canAuthorize',
44
- 'canRefresh'
45
- ],
35
+ deps: ['supertoken', 'supertoken.canAuthorize', 'canRefresh'],
46
36
  fn() {
47
- return Boolean(this.supertoken && this.supertoken.canAuthorize || this.canRefresh);
48
- }
37
+ return Boolean((this.supertoken && this.supertoken.canAuthorize) || this.canRefresh);
38
+ },
49
39
  },
50
40
  canRefresh: {
51
- deps: [
52
- 'supertoken',
53
- 'supertoken.canRefresh'
54
- ],
41
+ deps: ['supertoken', 'supertoken.canRefresh'],
55
42
  fn() {
56
43
  // If we're operating in JWT mode, we have to delegate to the consumer
57
44
  if (this.config.jwtRefreshCallback) {
@@ -59,12 +46,12 @@ const Credentials = WebexPlugin.extend({
59
46
  }
60
47
 
61
48
  return Boolean(this.supertoken && this.supertoken.canRefresh);
62
- }
63
- }
49
+ },
50
+ },
64
51
  },
65
52
 
66
53
  props: {
67
- supertoken: makeStateDataType(Token, 'token').prop
54
+ supertoken: makeStateDataType(Token, 'token').prop,
68
55
  },
69
56
 
70
57
  namespace: 'Credentials',
@@ -72,7 +59,7 @@ const Credentials = WebexPlugin.extend({
72
59
  session: {
73
60
  isRefreshing: {
74
61
  default: false,
75
- type: 'boolean'
62
+ type: 'boolean',
76
63
  },
77
64
  /**
78
65
  * Becomes `true` once the {@link loaded} event fires.
@@ -83,12 +70,12 @@ const Credentials = WebexPlugin.extend({
83
70
  */
84
71
  ready: {
85
72
  default: false,
86
- type: 'boolean'
73
+ type: 'boolean',
87
74
  },
88
75
  refreshTimer: {
89
76
  default: undefined,
90
- type: 'any'
91
- }
77
+ type: 'any',
78
+ },
92
79
  },
93
80
 
94
81
  /**
@@ -120,8 +107,7 @@ const Credentials = WebexPlugin.extend({
120
107
  if (options.state) {
121
108
  if (!isEmpty(options.state)) {
122
109
  options.state = base64.toBase64Url(JSON.stringify(options.state));
123
- }
124
- else {
110
+ } else {
125
111
  delete options.state;
126
112
  }
127
113
  }
@@ -137,27 +123,21 @@ const Credentials = WebexPlugin.extend({
137
123
  * @returns {string} - The OrgId.
138
124
  */
139
125
  getOrgId() {
140
- this.logger.info(
141
- 'credentials: attempting to retrieve the OrgId from token'
142
- );
126
+ this.logger.info('credentials: attempting to retrieve the OrgId from token');
143
127
 
144
128
  try {
145
129
  // Attempt to extract a client-authenticated token's OrgId.
146
130
  this.logger.info('credentials: trying to extract OrgId from JWT');
147
131
 
148
132
  return this.extractOrgIdFromJWT(this.supertoken.access_token);
149
- }
150
- catch (e) {
133
+ } catch (e) {
151
134
  // Attempt to extract a user token's OrgId.
152
135
  this.logger.info('credentials: could not extract OrgId from JWT');
153
- this.logger.info(
154
- 'credentials: attempting to extract OrgId from user token'
155
- );
136
+ this.logger.info('credentials: attempting to extract OrgId from user token');
156
137
 
157
138
  try {
158
139
  return this.extractOrgIdFromUserToken(this.supertoken?.access_token);
159
- }
160
- catch (f) {
140
+ } catch (f) {
161
141
  this.logger.info('credentials: could not extract OrgId from user token');
162
142
  throw f;
163
143
  }
@@ -218,10 +198,11 @@ const Credentials = WebexPlugin.extend({
218
198
  * @returns {[type]}
219
199
  */
220
200
  buildLogoutUrl(options = {}) {
221
- return `${this.config.logoutUrl}?${querystring.stringify(Object.assign({
201
+ return `${this.config.logoutUrl}?${querystring.stringify({
222
202
  cisService: this.config.service,
223
- goto: this.config.redirect_uri
224
- }, options))}`;
203
+ goto: this.config.redirect_uri,
204
+ ...options,
205
+ })}`;
225
206
  },
226
207
 
227
208
  /**
@@ -233,7 +214,7 @@ const Credentials = WebexPlugin.extend({
233
214
  * @returns {number}
234
215
  */
235
216
  calcRefreshTimeout(expiration) {
236
- return Math.floor((Math.floor(Math.random() * 4) + 6) / 10 * expiration);
217
+ return Math.floor(((Math.floor(Math.random() * 4) + 6) / 10) * expiration);
237
218
  },
238
219
 
239
220
  constructor(...args) {
@@ -258,13 +239,14 @@ const Credentials = WebexPlugin.extend({
258
239
  * @returns {Promise<Token>}
259
240
  */
260
241
  downscope(scope) {
261
- return this.supertoken.downscope(scope)
262
- .catch((reason) => {
263
- this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);
264
- this.logger.trace(`credentials: falling back to supertoken for ${scope}`);
242
+ return this.supertoken.downscope(scope).catch((reason) => {
243
+ this.logger.trace(`credentials: failed to downscope supertoken to ${scope}`, reason);
244
+ this.logger.trace(`credentials: falling back to supertoken for ${scope}`);
265
245
 
266
- return Promise.resolve(new Token(Object.assign({scope}, this.supertoken.serialize())), {parent: this});
246
+ return Promise.resolve(new Token({scope, ...this.supertoken.serialize()}), {
247
+ parent: this,
267
248
  });
249
+ });
268
250
  },
269
251
 
270
252
  /**
@@ -279,23 +261,24 @@ const Credentials = WebexPlugin.extend({
279
261
  getClientToken(options = {}) {
280
262
  this.logger.info('credentials: requesting client credentials grant');
281
263
 
282
- return this.webex.request({
283
- /* eslint-disable camelcase */
284
- method: 'POST',
285
- uri: options.uri || this.config.tokenUrl,
286
- form: {
287
- grant_type: 'client_credentials',
288
- scope: options.scope || 'webexsquare:admin',
289
- self_contained_token: true
290
- },
291
- auth: {
292
- user: this.config.client_id,
293
- pass: this.config.client_secret,
294
- sendImmediately: true
295
- },
296
- shouldRefreshAccessToken: false
297
- /* eslint-enable camelcase */
298
- })
264
+ return this.webex
265
+ .request({
266
+ /* eslint-disable camelcase */
267
+ method: 'POST',
268
+ uri: options.uri || this.config.tokenUrl,
269
+ form: {
270
+ grant_type: 'client_credentials',
271
+ scope: options.scope || 'webexsquare:admin',
272
+ self_contained_token: true,
273
+ },
274
+ auth: {
275
+ user: this.config.client_id,
276
+ pass: this.config.client_secret,
277
+ sendImmediately: true,
278
+ },
279
+ shouldRefreshAccessToken: false,
280
+ /* eslint-enable camelcase */
281
+ })
299
282
  .then((res) => new Token(res.body, {parent: this}))
300
283
  .catch((res) => {
301
284
  if (res.statusCode !== 400) {
@@ -320,41 +303,44 @@ const Credentials = WebexPlugin.extend({
320
303
  * @returns {Promise<Token>}
321
304
  */
322
305
  getUserToken(scope) {
323
- return Promise.resolve(!this.isRefreshing || new Promise((resolve) => {
324
- this.logger.info('credentials: token refresh inflight; delaying getUserToken until refresh completes');
325
- this.once('change:isRefreshing', () => {
326
- this.logger.info('credentials: token refresh complete; reinvoking getUserToken');
327
- resolve();
328
- });
329
- }))
330
- .then(() => {
331
- if (!this.canAuthorize) {
332
- this.logger.info('credentials: cannot produce an access token from current state');
333
-
334
- return Promise.reject(new Error('Current state cannot produce an access token'));
335
- }
306
+ return Promise.resolve(
307
+ !this.isRefreshing ||
308
+ new Promise((resolve) => {
309
+ this.logger.info(
310
+ 'credentials: token refresh inflight; delaying getUserToken until refresh completes'
311
+ );
312
+ this.once('change:isRefreshing', () => {
313
+ this.logger.info('credentials: token refresh complete; reinvoking getUserToken');
314
+ resolve();
315
+ });
316
+ })
317
+ ).then(() => {
318
+ if (!this.canAuthorize) {
319
+ this.logger.info('credentials: cannot produce an access token from current state');
320
+
321
+ return Promise.reject(new Error('Current state cannot produce an access token'));
322
+ }
336
323
 
337
- if (!scope) {
338
- scope = filterScope('spark:kms', this.config.scope);
339
- }
324
+ if (!scope) {
325
+ scope = filterScope('spark:kms', this.config.scope);
326
+ }
340
327
 
341
- scope = sortScope(scope);
328
+ scope = sortScope(scope);
342
329
 
343
- if (scope === sortScope(this.config.scope)) {
344
- return Promise.resolve(this.supertoken);
345
- }
330
+ if (scope === sortScope(this.config.scope)) {
331
+ return Promise.resolve(this.supertoken);
332
+ }
346
333
 
347
- const token = this.userTokens.get(scope);
334
+ const token = this.userTokens.get(scope);
348
335
 
349
- // we should also check for the token.access_token since token object does
350
- // not get cleared on unsetting while logging out.
351
- if (!token || !token.access_token) {
352
- return this.downscope(scope)
353
- .then(tap((t) => this.userTokens.add(t)));
354
- }
336
+ // we should also check for the token.access_token since token object does
337
+ // not get cleared on unsetting while logging out.
338
+ if (!token || !token.access_token) {
339
+ return this.downscope(scope).then(tap((t) => this.userTokens.add(t)));
340
+ }
355
341
 
356
- return Promise.resolve(token);
357
- });
342
+ return Promise.resolve(token);
343
+ });
358
344
  },
359
345
 
360
346
  @persist('@')
@@ -380,8 +366,7 @@ const Credentials = WebexPlugin.extend({
380
366
  if (attrs.authorization) {
381
367
  if (attrs.authorization.supertoken) {
382
368
  this.supertoken = attrs.authorization.supertoken;
383
- }
384
- else {
369
+ } else {
385
370
  this.supertoken = attrs.authorization;
386
371
  }
387
372
  }
@@ -434,16 +419,14 @@ const Credentials = WebexPlugin.extend({
434
419
 
435
420
  try {
436
421
  this.unset('supertoken');
437
- }
438
- catch (err) {
422
+ } catch (err) {
439
423
  this.logger.warn('credentials: failed to clear supertoken', err);
440
424
  }
441
425
 
442
426
  while (this.userTokens.models.length) {
443
427
  try {
444
428
  this.userTokens.remove(this.userTokens.models[0]);
445
- }
446
- catch (err) {
429
+ } catch (err) {
447
430
  this.logger.warn('credentials: failed to remove user token', err);
448
431
  }
449
432
  }
@@ -480,15 +463,20 @@ const Credentials = WebexPlugin.extend({
480
463
  // while I like #2 from a code simplicity standpoint, the third-party DX
481
464
  // isn't great
482
465
  if (this.config.jwtRefreshCallback) {
483
- return this.config.jwtRefreshCallback(this.webex)
484
- .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}));
466
+ return (
467
+ this.config
468
+ .jwtRefreshCallback(this.webex)
469
+ // eslint-disable-next-line no-shadow
470
+ .then((jwt) => this.webex.authorization.requestAccessTokenFromJwt({jwt}))
471
+ );
485
472
  }
486
473
 
487
474
  if (this.webex.internal.services) {
488
475
  this.webex.internal.services.updateCredentialsConfig();
489
476
  }
490
477
 
491
- return supertoken.refresh()
478
+ return supertoken
479
+ .refresh()
492
480
  .then((st) => {
493
481
  // clear refresh timer
494
482
  if (this.refreshTimer) {
@@ -497,20 +485,25 @@ const Credentials = WebexPlugin.extend({
497
485
  }
498
486
  this.supertoken = st;
499
487
 
500
- return Promise.all(tokens.map((token) => this.downscope(token.scope)
501
- // eslint-disable-next-line max-nested-callbacks
502
- .then((t) => {
503
- this.logger.info(`credentials: revoking token for ${token.scope}`);
504
-
505
- return token.revoke()
506
- .catch((err) => {
507
- this.logger.warn('credentials: failed to revoke user token', err);
488
+ return Promise.all(
489
+ tokens.map((token) =>
490
+ this.downscope(token.scope)
491
+ // eslint-disable-next-line max-nested-callbacks
492
+ .then((t) => {
493
+ this.logger.info(`credentials: revoking token for ${token.scope}`);
494
+
495
+ return token
496
+ .revoke()
497
+ .catch((err) => {
498
+ this.logger.warn('credentials: failed to revoke user token', err);
499
+ })
500
+ .then(() => {
501
+ this.userTokens.remove(token.scope);
502
+ this.userTokens.add(t);
503
+ });
508
504
  })
509
- .then(() => {
510
- this.userTokens.remove(token.scope);
511
- this.userTokens.add(t);
512
- });
513
- })));
505
+ )
506
+ );
514
507
  })
515
508
  .then(() => {
516
509
  this.scheduleRefresh(this.supertoken.expires);
@@ -524,8 +517,7 @@ const Credentials = WebexPlugin.extend({
524
517
  while (this.userTokens.models.length) {
525
518
  try {
526
519
  this.userTokens.remove(this.userTokens.models[0]);
527
- }
528
- catch (err) {
520
+ } catch (err) {
529
521
  this.logger.warn('credentials: failed to remove user token', err);
530
522
  }
531
523
  }
@@ -551,12 +543,10 @@ const Credentials = WebexPlugin.extend({
551
543
  const timeoutLength = this.calcRefreshTimeout(expiresIn);
552
544
 
553
545
  this.refreshTimer = safeSetTimeout(() => this.refresh(), timeoutLength);
554
- }
555
- else {
546
+ } else {
556
547
  this.refresh();
557
548
  }
558
- }
559
-
549
+ },
560
550
  });
561
551
 
562
552
  export default Credentials;