@webex/webex-core 3.0.0-beta.2 → 3.0.0-beta.21

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 (184) hide show
  1. package/dist/config.js +1 -11
  2. package/dist/config.js.map +1 -1
  3. package/dist/credentials-config.js +44 -64
  4. package/dist/credentials-config.js.map +1 -1
  5. package/dist/index.js +0 -76
  6. package/dist/index.js.map +1 -1
  7. package/dist/interceptors/auth.js +22 -55
  8. package/dist/interceptors/auth.js.map +1 -1
  9. package/dist/interceptors/default-options.js +0 -20
  10. package/dist/interceptors/default-options.js.map +1 -1
  11. package/dist/interceptors/embargo.js +0 -21
  12. package/dist/interceptors/embargo.js.map +1 -1
  13. package/dist/interceptors/network-timing.js +2 -21
  14. package/dist/interceptors/network-timing.js.map +1 -1
  15. package/dist/interceptors/payload-transformer.js +2 -22
  16. package/dist/interceptors/payload-transformer.js.map +1 -1
  17. package/dist/interceptors/rate-limit.js +25 -57
  18. package/dist/interceptors/rate-limit.js.map +1 -1
  19. package/dist/interceptors/redirect.js +4 -33
  20. package/dist/interceptors/redirect.js.map +1 -1
  21. package/dist/interceptors/request-event.js +3 -30
  22. package/dist/interceptors/request-event.js.map +1 -1
  23. package/dist/interceptors/request-logger.js +1 -30
  24. package/dist/interceptors/request-logger.js.map +1 -1
  25. package/dist/interceptors/request-timing.js +3 -22
  26. package/dist/interceptors/request-timing.js.map +1 -1
  27. package/dist/interceptors/response-logger.js +2 -31
  28. package/dist/interceptors/response-logger.js.map +1 -1
  29. package/dist/interceptors/user-agent.js +2 -29
  30. package/dist/interceptors/user-agent.js.map +1 -1
  31. package/dist/interceptors/webex-tracking-id.js +5 -28
  32. package/dist/interceptors/webex-tracking-id.js.map +1 -1
  33. package/dist/interceptors/webex-user-agent.js +5 -38
  34. package/dist/interceptors/webex-user-agent.js.map +1 -1
  35. package/dist/lib/batcher.js +3 -51
  36. package/dist/lib/batcher.js.map +1 -1
  37. package/dist/lib/credentials/credentials.js +39 -119
  38. package/dist/lib/credentials/credentials.js.map +1 -1
  39. package/dist/lib/credentials/grant-errors.js +0 -49
  40. package/dist/lib/credentials/grant-errors.js.map +1 -1
  41. package/dist/lib/credentials/index.js +1 -13
  42. package/dist/lib/credentials/index.js.map +1 -1
  43. package/dist/lib/credentials/scope.js +1 -7
  44. package/dist/lib/credentials/scope.js.map +1 -1
  45. package/dist/lib/credentials/token-collection.js +1 -7
  46. package/dist/lib/credentials/token-collection.js.map +1 -1
  47. package/dist/lib/credentials/token.js +39 -118
  48. package/dist/lib/credentials/token.js.map +1 -1
  49. package/dist/lib/page.js +13 -26
  50. package/dist/lib/page.js.map +1 -1
  51. package/dist/lib/services/constants.js +0 -2
  52. package/dist/lib/services/constants.js.map +1 -1
  53. package/dist/lib/services/index.js +1 -28
  54. package/dist/lib/services/index.js.map +1 -1
  55. package/dist/lib/services/interceptors/server-error.js +2 -23
  56. package/dist/lib/services/interceptors/server-error.js.map +1 -1
  57. package/dist/lib/services/interceptors/service.js +12 -34
  58. package/dist/lib/services/interceptors/service.js.map +1 -1
  59. package/dist/lib/services/metrics.js +0 -2
  60. package/dist/lib/services/metrics.js.map +1 -1
  61. package/dist/lib/services/service-catalog.js +10 -90
  62. package/dist/lib/services/service-catalog.js.map +1 -1
  63. package/dist/lib/services/service-fed-ramp.js +0 -2
  64. package/dist/lib/services/service-fed-ramp.js.map +1 -1
  65. package/dist/lib/services/service-host.js +47 -62
  66. package/dist/lib/services/service-host.js.map +1 -1
  67. package/dist/lib/services/service-registry.js +78 -90
  68. package/dist/lib/services/service-registry.js.map +1 -1
  69. package/dist/lib/services/service-state.js +3 -15
  70. package/dist/lib/services/service-state.js.map +1 -1
  71. package/dist/lib/services/service-url.js +4 -25
  72. package/dist/lib/services/service-url.js.map +1 -1
  73. package/dist/lib/services/services.js +122 -238
  74. package/dist/lib/services/services.js.map +1 -1
  75. package/dist/lib/stateless-webex-plugin.js +5 -28
  76. package/dist/lib/stateless-webex-plugin.js.map +1 -1
  77. package/dist/lib/storage/decorators.js +19 -62
  78. package/dist/lib/storage/decorators.js.map +1 -1
  79. package/dist/lib/storage/errors.js +0 -23
  80. package/dist/lib/storage/errors.js.map +1 -1
  81. package/dist/lib/storage/index.js +2 -16
  82. package/dist/lib/storage/index.js.map +1 -1
  83. package/dist/lib/storage/make-webex-plugin-store.js +11 -41
  84. package/dist/lib/storage/make-webex-plugin-store.js.map +1 -1
  85. package/dist/lib/storage/make-webex-store.js +8 -30
  86. package/dist/lib/storage/make-webex-store.js.map +1 -1
  87. package/dist/lib/storage/memory-store-adapter.js +1 -19
  88. package/dist/lib/storage/memory-store-adapter.js.map +1 -1
  89. package/dist/lib/webex-core-plugin-mixin.js +9 -29
  90. package/dist/lib/webex-core-plugin-mixin.js.map +1 -1
  91. package/dist/lib/webex-http-error.js +1 -31
  92. package/dist/lib/webex-http-error.js.map +1 -1
  93. package/dist/lib/webex-internal-core-plugin-mixin.js +9 -29
  94. package/dist/lib/webex-internal-core-plugin-mixin.js.map +1 -1
  95. package/dist/lib/webex-plugin.js +6 -40
  96. package/dist/lib/webex-plugin.js.map +1 -1
  97. package/dist/plugins/logger.js +3 -17
  98. package/dist/plugins/logger.js.map +1 -1
  99. package/dist/webex-core.js +79 -203
  100. package/dist/webex-core.js.map +1 -1
  101. package/dist/webex-internal-core.js +0 -10
  102. package/dist/webex-internal-core.js.map +1 -1
  103. package/package.json +14 -14
  104. package/src/config.js +9 -11
  105. package/src/credentials-config.js +110 -72
  106. package/src/index.js +4 -14
  107. package/src/interceptors/auth.js +36 -37
  108. package/src/interceptors/default-options.js +0 -1
  109. package/src/interceptors/embargo.js +1 -1
  110. package/src/interceptors/payload-transformer.js +1 -2
  111. package/src/interceptors/rate-limit.js +8 -5
  112. package/src/interceptors/redirect.js +14 -8
  113. package/src/interceptors/request-event.js +4 -8
  114. package/src/interceptors/request-logger.js +8 -5
  115. package/src/interceptors/response-logger.js +11 -8
  116. package/src/interceptors/user-agent.js +1 -2
  117. package/src/interceptors/webex-user-agent.js +3 -9
  118. package/src/lib/batcher.js +70 -69
  119. package/src/lib/credentials/credentials.js +112 -122
  120. package/src/lib/credentials/grant-errors.js +6 -7
  121. package/src/lib/credentials/index.js +1 -4
  122. package/src/lib/credentials/scope.js +1 -4
  123. package/src/lib/credentials/token-collection.js +1 -1
  124. package/src/lib/credentials/token.js +86 -80
  125. package/src/lib/page.js +10 -11
  126. package/src/lib/services/constants.js +3 -13
  127. package/src/lib/services/index.js +2 -2
  128. package/src/lib/services/interceptors/server-error.js +12 -7
  129. package/src/lib/services/interceptors/service.js +6 -5
  130. package/src/lib/services/metrics.js +1 -1
  131. package/src/lib/services/service-catalog.js +110 -100
  132. package/src/lib/services/service-fed-ramp.js +1 -2
  133. package/src/lib/services/service-host.js +10 -17
  134. package/src/lib/services/service-registry.js +69 -96
  135. package/src/lib/services/service-state.js +4 -6
  136. package/src/lib/services/service-url.js +24 -23
  137. package/src/lib/services/services.js +260 -251
  138. package/src/lib/stateless-webex-plugin.js +4 -2
  139. package/src/lib/storage/decorators.js +68 -66
  140. package/src/lib/storage/index.js +4 -6
  141. package/src/lib/storage/make-webex-plugin-store.js +34 -21
  142. package/src/lib/storage/make-webex-store.js +6 -7
  143. package/src/lib/storage/memory-store-adapter.js +3 -3
  144. package/src/lib/webex-core-plugin-mixin.js +10 -7
  145. package/src/lib/webex-http-error.js +7 -8
  146. package/src/lib/webex-internal-core-plugin-mixin.js +9 -6
  147. package/src/lib/webex-plugin.js +41 -34
  148. package/src/plugins/logger.js +8 -3
  149. package/src/webex-core.js +185 -116
  150. package/src/webex-internal-core.js +15 -9
  151. package/test/integration/spec/credentials/credentials.js +26 -30
  152. package/test/integration/spec/credentials/token.js +36 -33
  153. package/test/integration/spec/services/service-catalog.js +177 -156
  154. package/test/integration/spec/services/services.js +313 -304
  155. package/test/integration/spec/webex-core.js +98 -86
  156. package/test/unit/spec/_setup.js +26 -18
  157. package/test/unit/spec/credentials/credentials.js +189 -154
  158. package/test/unit/spec/credentials/token.js +94 -76
  159. package/test/unit/spec/interceptors/auth.js +291 -243
  160. package/test/unit/spec/interceptors/default-options.js +36 -24
  161. package/test/unit/spec/interceptors/embargo.js +32 -27
  162. package/test/unit/spec/interceptors/network-timing.js +2 -2
  163. package/test/unit/spec/interceptors/payload-transformer.js +61 -52
  164. package/test/unit/spec/interceptors/rate-limit.js +104 -75
  165. package/test/unit/spec/interceptors/redirect.js +22 -20
  166. package/test/unit/spec/interceptors/request-timing.js +18 -22
  167. package/test/unit/spec/interceptors/user-agent.js +28 -16
  168. package/test/unit/spec/interceptors/webex-tracking-id.js +14 -8
  169. package/test/unit/spec/interceptors/webex-user-agent.js +83 -37
  170. package/test/unit/spec/lib/batcher.js +36 -32
  171. package/test/unit/spec/lib/page.js +36 -32
  172. package/test/unit/spec/lib/webex-plugin.js +1 -1
  173. package/test/unit/spec/services/interceptors/server-error.js +67 -90
  174. package/test/unit/spec/services/interceptors/service.js +17 -28
  175. package/test/unit/spec/services/service-catalog.js +19 -27
  176. package/test/unit/spec/services/service-host.js +29 -26
  177. package/test/unit/spec/services/service-registry.js +128 -170
  178. package/test/unit/spec/services/service-state.js +13 -22
  179. package/test/unit/spec/services/service-url.js +24 -43
  180. package/test/unit/spec/services/services.js +85 -41
  181. package/test/unit/spec/storage/persist.js +6 -9
  182. package/test/unit/spec/storage/wait-for-value.js +22 -21
  183. package/test/unit/spec/webex-core.js +78 -57
  184. package/test/unit/spec/webex-internal-core.js +56 -31
@@ -42,7 +42,7 @@ const Services = WebexPlugin.extend({
42
42
  states: new WeakMap(),
43
43
 
44
44
  props: {
45
- validateDomains: ['boolean', false, true]
45
+ validateDomains: ['boolean', false, true],
46
46
  },
47
47
 
48
48
  _catalogs: new WeakMap(),
@@ -102,7 +102,7 @@ const Services = WebexPlugin.extend({
102
102
  * @returns {boolean} - True if the service exists.
103
103
  */
104
104
  hasService(serviceName) {
105
- return !!(this.get(serviceName));
105
+ return !!this.get(serviceName);
106
106
  },
107
107
 
108
108
  /**
@@ -113,7 +113,7 @@ const Services = WebexPlugin.extend({
113
113
  hasAllowedDomains() {
114
114
  const catalog = this._getCatalog();
115
115
 
116
- return (catalog.getAllowedDomains().length > 0);
116
+ return catalog.getAllowedDomains().length > 0;
117
117
  },
118
118
 
119
119
  /**
@@ -149,15 +149,14 @@ const Services = WebexPlugin.extend({
149
149
  },
150
150
 
151
151
  /**
152
- * saves all the services from the pre and post catalog service
153
- * @param {Object} serviceUrls
154
- * @returns {void}
155
- */
152
+ * saves all the services from the pre and post catalog service
153
+ * @param {Object} serviceUrls
154
+ * @returns {void}
155
+ */
156
156
  _updateServiceUrls(serviceUrls) {
157
157
  this._serviceUrls = {...this._serviceUrls, ...serviceUrls};
158
158
  },
159
159
 
160
-
161
160
  /**
162
161
  * Update a list of `serviceUrls` to the most current
163
162
  * catalog via the defined `discoveryUrl` then returns the current
@@ -171,17 +170,22 @@ const Services = WebexPlugin.extend({
171
170
  * @param {string} [param.token] - used for signin catalog
172
171
  * @returns {Promise<object>}
173
172
  */
174
- updateServices({
175
- from, query, token, forceRefresh
176
- } = {}) {
173
+ updateServices({from, query, token, forceRefresh} = {}) {
177
174
  const catalog = this._getCatalog();
178
- let formattedQuery, serviceGroup;
175
+ let formattedQuery;
176
+ let serviceGroup;
179
177
 
180
178
  // map catalog name to service group name.
181
179
  switch (from) {
182
- case 'limited': serviceGroup = 'preauth'; break;
183
- case 'signin': serviceGroup = 'signin'; break;
184
- default: serviceGroup = 'postauth'; break;
180
+ case 'limited':
181
+ serviceGroup = 'preauth';
182
+ break;
183
+ case 'signin':
184
+ serviceGroup = 'signin';
185
+ break;
186
+ default:
187
+ serviceGroup = 'postauth';
188
+ break;
185
189
  }
186
190
 
187
191
  // confirm catalog update for group is not in progress.
@@ -195,7 +199,9 @@ const Services = WebexPlugin.extend({
195
199
  const queryKey = query && Object.keys(query)[0];
196
200
 
197
201
  if (!['email', 'emailhash', 'userId', 'orgId', 'mode'].includes(queryKey)) {
198
- return Promise.reject(new Error('a query param of email, emailhash, userId, orgId, or mode is required'));
202
+ return Promise.reject(
203
+ new Error('a query param of email, emailhash, userId, orgId, or mode is required')
204
+ );
199
205
  }
200
206
  }
201
207
  // encode email when query key is email
@@ -206,8 +212,7 @@ const Services = WebexPlugin.extend({
206
212
 
207
213
  if (queryKey === 'email' && query.email) {
208
214
  formattedQuery.emailhash = sha256(query.email.toLowerCase()).toString();
209
- }
210
- else {
215
+ } else {
211
216
  formattedQuery[queryKey] = query[queryKey];
212
217
  }
213
218
  }
@@ -216,7 +221,7 @@ const Services = WebexPlugin.extend({
216
221
  from,
217
222
  token,
218
223
  query: formattedQuery,
219
- forceRefresh
224
+ forceRefresh,
220
225
  })
221
226
  .then((serviceHostMap) => {
222
227
  catalog.updateServiceUrls(serviceGroup, serviceHostMap);
@@ -260,7 +265,7 @@ const Services = WebexPlugin.extend({
260
265
  reqId = 'WEBCLIENT',
261
266
  forceRefresh = false,
262
267
  activationOptions = {},
263
- preloginUserId
268
+ preloginUserId,
264
269
  }) {
265
270
  this.logger.info('services: validating a user');
266
271
 
@@ -276,18 +281,20 @@ const Services = WebexPlugin.extend({
276
281
  if (canAuthorize) {
277
282
  return this.updateServices({forceRefresh})
278
283
  .then(() => this.webex.credentials.getUserToken())
279
- .then((token) => this.sendUserActivation({
280
- email,
281
- reqId,
282
- token: token.toString(),
283
- activationOptions,
284
- preloginUserId
285
- }))
284
+ .then((token) =>
285
+ this.sendUserActivation({
286
+ email,
287
+ reqId,
288
+ token: token.toString(),
289
+ activationOptions,
290
+ preloginUserId,
291
+ })
292
+ )
286
293
  .then((userObj) => ({
287
294
  activated: true,
288
295
  exists: true,
289
296
  details: 'user is authorized via a user token',
290
- user: userObj
297
+ user: userObj,
291
298
  }));
292
299
  }
293
300
 
@@ -297,9 +304,7 @@ const Services = WebexPlugin.extend({
297
304
 
298
305
  // Validate that client authentication details exist.
299
306
  if (!client_id || !client_secret) {
300
- return Promise.reject(new Error(
301
- 'client authentication details are not available'
302
- ));
307
+ return Promise.reject(new Error('client authentication details are not available'));
303
308
  }
304
309
  /* eslint-enable camelcase */
305
310
 
@@ -307,61 +312,66 @@ const Services = WebexPlugin.extend({
307
312
  let token;
308
313
 
309
314
  // Begin client authentication user validation.
310
- return this.collectPreauthCatalog({email})
311
- .then(() => {
312
- // Retrieve the service url from the updated catalog. This is required
313
- // since `WebexCore` is usually not fully initialized at the time this
314
- // request completes.
315
- const idbrokerService = this.get('idbroker', true);
316
-
317
- // Collect the client auth token.
318
- return this.webex.credentials.getClientToken({
319
- uri: `${idbrokerService}idb/oauth2/v1/access_token`,
320
- scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM'
321
- });
322
- })
323
- .then((tokenObj) => {
324
- // Generate the token string.
325
- token = tokenObj.toString();
315
+ return (
316
+ this.collectPreauthCatalog({email})
317
+ .then(() => {
318
+ // Retrieve the service url from the updated catalog. This is required
319
+ // since `WebexCore` is usually not fully initialized at the time this
320
+ // request completes.
321
+ const idbrokerService = this.get('idbroker', true);
322
+
323
+ // Collect the client auth token.
324
+ return this.webex.credentials.getClientToken({
325
+ uri: `${idbrokerService}idb/oauth2/v1/access_token`,
326
+ scope: 'webexsquare:admin webexsquare:get_conversation Identity:SCIM',
327
+ });
328
+ })
329
+ .then((tokenObj) => {
330
+ // Generate the token string.
331
+ token = tokenObj.toString();
326
332
 
327
- // Collect the signin catalog using the client auth information.
328
- return this.collectSigninCatalog({email, token, forceRefresh});
329
- })
330
- // Validate if collecting the signin catalog failed and populate the RTO
331
- // with the appropriate content.
332
- .catch((error) => ({
333
- exists: (error.name !== 'NotFound'),
334
- activated: false,
335
- details: (error.name !== 'NotFound') ?
336
- 'user exists but is not activated' :
337
- 'user does not exist and is not activated'
338
- }))
339
- // Validate if the previous promise resolved with an RTO and populate the
340
- // new RTO accordingly.
341
- .then((rto) => Promise.all([
342
- rto || {
343
- activated: true,
344
- exists: true,
345
- details: 'user exists and is activated'
346
- },
347
- this.sendUserActivation({
348
- email,
349
- reqId,
350
- token,
351
- activationOptions,
352
- preloginUserId
333
+ // Collect the signin catalog using the client auth information.
334
+ return this.collectSigninCatalog({email, token, forceRefresh});
353
335
  })
354
- ]))
355
- .then(([rto, user]) => ({...rto, user}))
356
- .catch((error) => {
357
- const response = {
358
- statusCode: error.statusCode,
359
- responseText: error.body && error.body.message,
360
- body: error.body
361
- };
336
+ // Validate if collecting the signin catalog failed and populate the RTO
337
+ // with the appropriate content.
338
+ .catch((error) => ({
339
+ exists: error.name !== 'NotFound',
340
+ activated: false,
341
+ details:
342
+ error.name !== 'NotFound'
343
+ ? 'user exists but is not activated'
344
+ : 'user does not exist and is not activated',
345
+ }))
346
+ // Validate if the previous promise resolved with an RTO and populate the
347
+ // new RTO accordingly.
348
+ .then((rto) =>
349
+ Promise.all([
350
+ rto || {
351
+ activated: true,
352
+ exists: true,
353
+ details: 'user exists and is activated',
354
+ },
355
+ this.sendUserActivation({
356
+ email,
357
+ reqId,
358
+ token,
359
+ activationOptions,
360
+ preloginUserId,
361
+ }),
362
+ ])
363
+ )
364
+ .then(([rto, user]) => ({...rto, user}))
365
+ .catch((error) => {
366
+ const response = {
367
+ statusCode: error.statusCode,
368
+ responseText: error.body && error.body.message,
369
+ body: error.body,
370
+ };
362
371
 
363
- return Promise.reject(response);
364
- });
372
+ return Promise.reject(response);
373
+ })
374
+ );
365
375
  },
366
376
 
367
377
  /**
@@ -373,17 +383,18 @@ const Services = WebexPlugin.extend({
373
383
  return this.request({
374
384
  method: 'GET',
375
385
  service: 'hydra',
376
- resource: 'meetingPreferences'
377
- }).then((res) => {
378
- this.logger.info('services: received user region info');
379
-
380
- return res.body;
381
- }).catch((err) => {
382
- this.logger.info('services: was not able to fetch user login information', err);
383
- // resolve successfully even if request failed
384
- });
385
- },
386
+ resource: 'meetingPreferences',
387
+ })
388
+ .then((res) => {
389
+ this.logger.info('services: received user region info');
386
390
 
391
+ return res.body;
392
+ })
393
+ .catch((err) => {
394
+ this.logger.info('services: was not able to fetch user login information', err);
395
+ // resolve successfully even if request failed
396
+ });
397
+ },
387
398
 
388
399
  /**
389
400
  * Fetches client region info such as countryCode and timezone.
@@ -395,17 +406,19 @@ const Services = WebexPlugin.extend({
395
406
  uri: 'https://ds.ciscospark.com/v1/region',
396
407
  addAuthHeader: false,
397
408
  headers: {
398
- 'spark-user-agent': null
409
+ 'spark-user-agent': null,
399
410
  },
400
- timeout: 5000
401
- }).then((res) => {
402
- this.logger.info('services: received user region info');
403
-
404
- return res.body;
405
- }).catch((err) => {
406
- this.logger.info('services: was not able to get user region info', err);
407
- // resolve successfully even if request failed
408
- });
411
+ timeout: 5000,
412
+ })
413
+ .then((res) => {
414
+ this.logger.info('services: received user region info');
415
+
416
+ return res.body;
417
+ })
418
+ .catch((err) => {
419
+ this.logger.info('services: was not able to get user region info', err);
420
+ // resolve successfully even if request failed
421
+ });
409
422
  },
410
423
 
411
424
  /**
@@ -424,48 +437,44 @@ const Services = WebexPlugin.extend({
424
437
  * @param {SendUserActivationPTO} - The Parameter transfer object.
425
438
  * @returns {LicenseDTO} - The DTO returned from the **License** service.
426
439
  */
427
- sendUserActivation({
428
- email,
429
- reqId,
430
- token,
431
- activationOptions,
432
- preloginUserId
433
- }) {
440
+ sendUserActivation({email, reqId, token, activationOptions, preloginUserId}) {
434
441
  this.logger.info('services: sending user activation request');
435
- let countryCode, timezone;
436
-
442
+ let countryCode;
443
+ let timezone;
437
444
 
438
445
  // try to fetch client region info first
439
- return this.fetchClientRegionInfo()
440
- .then((clientRegionInfo) => {
441
- if (clientRegionInfo) {
442
- ({countryCode, timezone} = clientRegionInfo);
443
- }
444
-
445
- // Send the user activation request to the **License** service.
446
- return this.request({
447
- service: 'license',
448
- resource: 'users/activations',
449
- method: 'POST',
450
- headers: {
451
- accept: 'application/json',
452
- authorization: token,
453
- 'x-prelogin-userid': preloginUserId
454
- },
455
- body: {
456
- email,
457
- reqId,
458
- countryCode,
459
- timeZone: timezone,
460
- ...activationOptions
461
- },
462
- shouldRefreshAccessToken: false
463
- });
464
- })
465
- // On success, return the **License** user object.
466
- .then(({body}) => body)
467
- // On failure, reject with error from **License**.
468
- .catch((error) => Promise.reject(error));
446
+ return (
447
+ this.fetchClientRegionInfo()
448
+ .then((clientRegionInfo) => {
449
+ if (clientRegionInfo) {
450
+ ({countryCode, timezone} = clientRegionInfo);
451
+ }
452
+
453
+ // Send the user activation request to the **License** service.
454
+ return this.request({
455
+ service: 'license',
456
+ resource: 'users/activations',
457
+ method: 'POST',
458
+ headers: {
459
+ accept: 'application/json',
460
+ authorization: token,
461
+ 'x-prelogin-userid': preloginUserId,
462
+ },
463
+ body: {
464
+ email,
465
+ reqId,
466
+ countryCode,
467
+ timeZone: timezone,
468
+ ...activationOptions,
469
+ },
470
+ shouldRefreshAccessToken: false,
471
+ });
472
+ })
473
+ // On success, return the **License** user object.
474
+ .then(({body}) => body)
475
+ // On failure, reject with error from **License**.
476
+ .catch((error) => Promise.reject(error))
477
+ );
469
478
  },
470
479
 
471
480
  /**
@@ -479,7 +488,11 @@ const Services = WebexPlugin.extend({
479
488
  */
480
489
  collectPreauthCatalog(query, forceRefresh = false) {
481
490
  if (!query) {
482
- return this.updateServices({from: 'limited', query: {mode: 'DEFAULT_BY_PROXIMITY'}, forceRefresh});
491
+ return this.updateServices({
492
+ from: 'limited',
493
+ query: {mode: 'DEFAULT_BY_PROXIMITY'},
494
+ forceRefresh,
495
+ });
483
496
  }
484
497
 
485
498
  return this.updateServices({from: 'limited', query, forceRefresh});
@@ -501,7 +514,10 @@ const Services = WebexPlugin.extend({
501
514
  }
502
515
 
503
516
  return this.updateServices({
504
- from: 'signin', query: {email}, token, forceRefresh
517
+ from: 'signin',
518
+ query: {email},
519
+ token,
520
+ forceRefresh,
505
521
  });
506
522
  },
507
523
 
@@ -518,20 +534,19 @@ const Services = WebexPlugin.extend({
518
534
 
519
535
  // This must be set outside of the setConfig method used to assign the
520
536
  // idbroker and identity url values.
521
- this.webex.config.credentials.authorizeUrl = authorizationString ?
522
- authorizeUrl :
523
- `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;
524
-
537
+ this.webex.config.credentials.authorizeUrl = authorizationString
538
+ ? authorizeUrl
539
+ : `${idbroker.replace(trailingSlashes, '')}/idb/oauth2/v1/authorize`;
525
540
 
526
541
  this.webex.setConfig({
527
542
  credentials: {
528
543
  idbroker: {
529
- url: idbroker.replace(trailingSlashes, '') // remove trailing slash
544
+ url: idbroker.replace(trailingSlashes, ''), // remove trailing slash
530
545
  },
531
546
  identity: {
532
- url: identity.replace(trailingSlashes, '') // remove trailing slash
533
- }
534
- }
547
+ url: identity.replace(trailingSlashes, ''), // remove trailing slash
548
+ },
549
+ },
535
550
  });
536
551
  }
537
552
  },
@@ -586,7 +601,9 @@ const Services = WebexPlugin.extend({
586
601
  // Save memory by grabbing the catalog after there isn't a priortyURL
587
602
  const catalog = this._getCatalog();
588
603
 
589
- const fetchFromServiceUrl = services.servicesNotNeedValidation.find((service) => service === name);
604
+ const fetchFromServiceUrl = services.servicesNotNeedValidation.find(
605
+ (service) => service === name
606
+ );
590
607
 
591
608
  if (fetchFromServiceUrl) {
592
609
  return Promise.resolve(this._serviceUrls[name]);
@@ -600,21 +617,24 @@ const Services = WebexPlugin.extend({
600
617
  }
601
618
 
602
619
  if (catalog.isReady) {
603
- if (url) { return Promise.resolve(url); }
620
+ if (url) {
621
+ return Promise.resolve(url);
622
+ }
604
623
 
605
624
  this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {
606
- fields: {service_name: name}
625
+ fields: {service_name: name},
607
626
  });
608
627
 
609
- return Promise.reject(new Error(
610
- `services: service '${name}' was not found in any of the catalogs`
611
- ));
628
+ return Promise.reject(
629
+ new Error(`services: service '${name}' was not found in any of the catalogs`)
630
+ );
612
631
  }
613
632
 
614
633
  return new Promise((resolve, reject) => {
615
634
  const groupsToCheck = ['preauth', 'signin', 'postauth'];
616
635
  const checkCatalog = (catalogGroup) =>
617
- catalog.waitForCatalog(catalogGroup, timeout)
636
+ catalog
637
+ .waitForCatalog(catalogGroup, timeout)
618
638
  .then(() => {
619
639
  const scopedPriorityUrl = this.get(name, true);
620
640
  const scopedPrioriryUrlObj = this.getServiceFromUrl(url);
@@ -625,15 +645,12 @@ const Services = WebexPlugin.extend({
625
645
  })
626
646
  .catch(() => undefined);
627
647
 
628
- Promise.all(groupsToCheck.map((group) => checkCatalog(group)))
629
- .then(() => {
630
- this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {
631
- fields: {service_name: name}
632
- });
633
- reject(new Error(
634
- `services: service '${name}' was not found after waiting`
635
- ));
648
+ Promise.all(groupsToCheck.map((group) => checkCatalog(group))).then(() => {
649
+ this.webex.internal.metrics.submitClientMetrics(METRICS.JS_SDK_SERVICE_NOT_FOUND, {
650
+ fields: {service_name: name},
636
651
  });
652
+ reject(new Error(`services: service '${name}' was not found after waiting`));
653
+ });
637
654
  });
638
655
  },
639
656
 
@@ -646,51 +663,45 @@ const Services = WebexPlugin.extend({
646
663
  */
647
664
  _formatReceivedHostmap(serviceHostmap) {
648
665
  // map the host catalog items to a formatted hostmap
649
- const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce(
650
- (accumulator, key) => {
651
- if (serviceHostmap.hostCatalog[key].length === 0) {
652
- return accumulator;
653
- }
666
+ const formattedHostmap = Object.keys(serviceHostmap.hostCatalog).reduce((accumulator, key) => {
667
+ if (serviceHostmap.hostCatalog[key].length === 0) {
668
+ return accumulator;
669
+ }
654
670
 
655
- const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];
656
- const defaultUrl = serviceHostmap.serviceLinks[serviceName];
671
+ const serviceName = serviceHostmap.hostCatalog[key][0].id.split(':')[3];
672
+ const defaultUrl = serviceHostmap.serviceLinks[serviceName];
657
673
 
658
- let serviceItem = accumulator.find(
659
- (item) => item.name === serviceName
660
- );
674
+ let serviceItem = accumulator.find((item) => item.name === serviceName);
661
675
 
662
- if (!serviceItem) {
663
- serviceItem = {
664
- name: serviceName,
665
- defaultUrl,
666
- defaultHost: Url.parse(defaultUrl).hostname,
667
- hosts: []
668
- };
676
+ if (!serviceItem) {
677
+ serviceItem = {
678
+ name: serviceName,
679
+ defaultUrl,
680
+ defaultHost: Url.parse(defaultUrl).hostname,
681
+ hosts: [],
682
+ };
669
683
 
670
- accumulator.push(serviceItem);
671
- }
672
-
673
- serviceItem.hosts.push(
674
- // map the default key as a low priority default for cluster matching
675
- {
676
- host: key,
677
- ttl: -1,
678
- priority: 10,
679
- id: serviceHostmap.hostCatalog[key][0].id,
680
- homeCluster: serviceItem.defaultHost === key
681
- },
682
- // map the rest of the hosts in their proper locations
683
- ...serviceHostmap.hostCatalog[key].map(
684
- (host) => ({
685
- ...host,
686
- homeCluster: serviceItem.defaultHost === key
687
- })
688
- )
689
- );
684
+ accumulator.push(serviceItem);
685
+ }
690
686
 
691
- return accumulator;
692
- }, []
693
- );
687
+ serviceItem.hosts.push(
688
+ // map the default key as a low priority default for cluster matching
689
+ {
690
+ host: key,
691
+ ttl: -1,
692
+ priority: 10,
693
+ id: serviceHostmap.hostCatalog[key][0].id,
694
+ homeCluster: serviceItem.defaultHost === key,
695
+ },
696
+ // map the rest of the hosts in their proper locations
697
+ ...serviceHostmap.hostCatalog[key].map((host) => ({
698
+ ...host,
699
+ homeCluster: serviceItem.defaultHost === key,
700
+ }))
701
+ );
702
+
703
+ return accumulator;
704
+ }, []);
694
705
 
695
706
  // append service links that do not exist in the host catalog
696
707
  Object.keys(serviceHostmap.serviceLinks).forEach((key) => {
@@ -701,7 +712,7 @@ const Services = WebexPlugin.extend({
701
712
  name: key,
702
713
  defaultUrl: serviceHostmap.serviceLinks[key],
703
714
  defaultHost: Url.parse(serviceHostmap.serviceLinks[key]).hostname,
704
- hosts: []
715
+ hosts: [],
705
716
  });
706
717
  }
707
718
  });
@@ -761,7 +772,7 @@ const Services = WebexPlugin.extend({
761
772
  return {
762
773
  name: service.name,
763
774
  priorityUrl: service.get(true),
764
- defaultUrl: service.get()
775
+ defaultUrl: service.get(),
765
776
  };
766
777
  },
767
778
 
@@ -774,7 +785,7 @@ const Services = WebexPlugin.extend({
774
785
  isServiceUrl(url) {
775
786
  const catalog = this._getCatalog();
776
787
 
777
- return !!(catalog.findServiceUrlFromUrl(url));
788
+ return !!catalog.findServiceUrlFromUrl(url);
778
789
  },
779
790
 
780
791
  /**
@@ -786,7 +797,7 @@ const Services = WebexPlugin.extend({
786
797
  isAllowedDomainUrl(url) {
787
798
  const catalog = this._getCatalog();
788
799
 
789
- return !!(catalog.findAllowedDomain(url));
800
+ return !!catalog.findAllowedDomain(url);
790
801
  },
791
802
 
792
803
  /**
@@ -820,9 +831,7 @@ const Services = WebexPlugin.extend({
820
831
  * @param {string} [param.token] - used for signin catalog
821
832
  * @returns {Promise<object>}
822
833
  */
823
- _fetchNewServiceHostmap({
824
- from, query, token, forceRefresh
825
- } = {}) {
834
+ _fetchNewServiceHostmap({from, query, token, forceRefresh} = {}) {
826
835
  const service = 'u2c';
827
836
  const resource = from ? `/${from}/catalog` : '/catalog';
828
837
  const qs = {...query, format: 'hostmap'};
@@ -832,15 +841,17 @@ const Services = WebexPlugin.extend({
832
841
  }
833
842
 
834
843
  const requestObject = {
835
- method: 'GET', service, resource, qs
844
+ method: 'GET',
845
+ service,
846
+ resource,
847
+ qs,
836
848
  };
837
849
 
838
850
  if (token) {
839
851
  requestObject.headers = {authorization: token};
840
852
  }
841
853
 
842
- return this.request(requestObject)
843
- .then(({body}) => this._formatReceivedHostmap(body));
854
+ return this.request(requestObject).then(({body}) => this._formatReceivedHostmap(body));
844
855
  },
845
856
 
846
857
  /**
@@ -861,11 +872,10 @@ const Services = WebexPlugin.extend({
861
872
  // Check for discovery services.
862
873
  if (services.discovery) {
863
874
  // Format the discovery configuration into an injectable array.
864
- const formattedDiscoveryServices = Object.keys(services.discovery)
865
- .map((key) => ({
866
- name: key,
867
- defaultUrl: services.discovery[key]
868
- }));
875
+ const formattedDiscoveryServices = Object.keys(services.discovery).map((key) => ({
876
+ name: key,
877
+ defaultUrl: services.discovery[key],
878
+ }));
869
879
 
870
880
  // Inject formatted discovery services into services catalog.
871
881
  catalog.updateServiceUrls('discovery', formattedDiscoveryServices);
@@ -873,11 +883,10 @@ const Services = WebexPlugin.extend({
873
883
 
874
884
  if (services.override) {
875
885
  // Format the override configuration into an injectable array.
876
- const formattedOverrideServices = Object.keys(services.override)
877
- .map((key) => ({
878
- name: key,
879
- defaultUrl: services.override[key]
880
- }));
886
+ const formattedOverrideServices = Object.keys(services.override).map((key) => ({
887
+ name: key,
888
+ defaultUrl: services.override[key],
889
+ }));
881
890
 
882
891
  // Inject formatted override services into services catalog.
883
892
  catalog.updateServiceUrls('override', formattedOverrideServices);
@@ -907,24 +916,25 @@ const Services = WebexPlugin.extend({
907
916
 
908
917
  // Init a promise chain. Must be done as a Promise.resolve() to allow
909
918
  // credentials#getOrgId() to properly throw.
910
- return Promise.resolve()
911
- // Get the user's OrgId.
912
- .then(() => credentials.getOrgId())
913
- // Begin collecting the preauth/limited catalog.
914
- .then((orgId) => this.collectPreauthCatalog({orgId}))
915
- .then(() => {
916
- // Validate if the token is authorized.
917
- if (credentials.canAuthorize) {
918
- // Attempt to collect the postauth catalog.
919
- return this.updateServices()
920
- .catch(() => this.logger.warn(
921
- 'services: cannot retrieve postauth catalog'
922
- ));
923
- }
924
-
925
- // Return a resolved promise for consistent return value.
926
- return Promise.resolve();
927
- });
919
+ return (
920
+ Promise.resolve()
921
+ // Get the user's OrgId.
922
+ .then(() => credentials.getOrgId())
923
+ // Begin collecting the preauth/limited catalog.
924
+ .then((orgId) => this.collectPreauthCatalog({orgId}))
925
+ .then(() => {
926
+ // Validate if the token is authorized.
927
+ if (credentials.canAuthorize) {
928
+ // Attempt to collect the postauth catalog.
929
+ return this.updateServices().catch(() =>
930
+ this.logger.warn('services: cannot retrieve postauth catalog')
931
+ );
932
+ }
933
+
934
+ // Return a resolved promise for consistent return value.
935
+ return Promise.resolve();
936
+ })
937
+ );
928
938
  },
929
939
 
930
940
  /**
@@ -959,17 +969,16 @@ const Services = WebexPlugin.extend({
959
969
  .then(() => {
960
970
  catalog.isReady = true;
961
971
  })
962
- .catch((error) => this.logger.error(
963
- `services: failed to init initial services, ${error.message}`
964
- ));
965
- }
966
- else {
972
+ .catch((error) =>
973
+ this.logger.error(`services: failed to init initial services, ${error.message}`)
974
+ );
975
+ } else {
967
976
  const {email} = this.webex.config;
968
977
 
969
978
  this.collectPreauthCatalog(email ? {email} : undefined);
970
979
  }
971
980
  });
972
- }
981
+ },
973
982
  });
974
983
  /* eslint-enable no-underscore-dangle */
975
984