@webex/internal-plugin-calendar 3.12.0-next.8 → 3.12.0-task-refactor.1

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/calendar.js CHANGED
@@ -7,6 +7,7 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
10
+ var _lodash = require("lodash");
10
11
  var _common = require("@webex/common");
11
12
  var _webexCore = require("@webex/webex-core");
12
13
  var _collection = _interopRequireDefault(require("./collection"));
@@ -70,6 +71,41 @@ var Calendar = _webexCore.WebexPlugin.extend({
70
71
  * Cache all rpc event request locally
71
72
  * */
72
73
  rpcEventRequests: [],
74
+ /**
75
+ * Cache KMS encryptionKeyUrl
76
+ * */
77
+ encryptionKeyUrl: null,
78
+ /**
79
+ * Pre-fetch a KMS encryption key url to improve performance.
80
+ * Waits for the user to be authorized and skips if an unverified guest.
81
+ * @private
82
+ * @returns {void}
83
+ */
84
+ prefetchEncryptionKey: function prefetchEncryptionKey() {
85
+ var _this = this;
86
+ if (!this.webex.canAuthorize) {
87
+ this.listenToOnce(this.webex, 'change:canAuthorize', function () {
88
+ _this.prefetchEncryptionKey();
89
+ });
90
+ return;
91
+ }
92
+ if (this.webex.credentials.isUnverifiedGuest) {
93
+ return;
94
+ }
95
+ this.webex.internal.encryption.kms.createUnboundKeys({
96
+ count: 1
97
+ }).then(function (keys) {
98
+ var key = (0, _lodash.isArray)(keys) ? keys[0] : keys;
99
+ _this.encryptionKeyUrl = key ? key.uri : null;
100
+ _this.logger.info('calendar->bind a KMS encryption key url');
101
+ _this.webex.internal.encryption.getKey(_this.encryptionKeyUrl, {
102
+ onBehalfOf: null
103
+ }).then(function (retrievedKey) {
104
+ _this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;
105
+ _this.logger.info('calendar->retrieve the KMS encryption key url and cache it');
106
+ });
107
+ });
108
+ },
73
109
  /**
74
110
  * WebexPlugin initialize method. This triggers once Webex has completed its
75
111
  * initialization workflow.
@@ -80,8 +116,12 @@ var Calendar = _webexCore.WebexPlugin.extend({
80
116
  * @returns {void}
81
117
  */
82
118
  initialize: function initialize() {
119
+ var _this2 = this;
83
120
  // Used to perform actions after webex is fully qualified and ready for
84
121
  // operation.
122
+ this.listenToOnce(this.webex, 'ready', function () {
123
+ _this2.prefetchEncryptionKey();
124
+ });
85
125
  },
86
126
  /**
87
127
  * Explicitly sets up the calendar plugin by registering
@@ -91,7 +131,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
91
131
  * @memberof Calendar
92
132
  */
93
133
  register: function register() {
94
- var _this = this;
134
+ var _this3 = this;
95
135
  if (!this.webex.canAuthorize) {
96
136
  this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');
97
137
  return _promise.default.reject(new Error('SDK cannot authorize'));
@@ -101,13 +141,13 @@ var Calendar = _webexCore.WebexPlugin.extend({
101
141
  return _promise.default.resolve();
102
142
  }
103
143
  return this.webex.internal.device.register().then(function () {
104
- return _this.webex.internal.mercury.connect();
144
+ return _this3.webex.internal.mercury.connect();
105
145
  }).then(function () {
106
- _this.listenForEvents();
107
- _this.trigger(_constants.CALENDAR_REGISTERED);
108
- _this.registered = true;
146
+ _this3.listenForEvents();
147
+ _this3.trigger(_constants.CALENDAR_REGISTERED);
148
+ _this3.registered = true;
109
149
  }).catch(function (error) {
110
- _this.logger.error("calendar->register#ERROR, Unable to register, ".concat(error.message));
150
+ _this3.logger.error("calendar->register#ERROR, Unable to register, ".concat(error.message));
111
151
  return _promise.default.reject(error);
112
152
  });
113
153
  },
@@ -120,17 +160,17 @@ var Calendar = _webexCore.WebexPlugin.extend({
120
160
  * @memberof Calendar
121
161
  */
122
162
  unregister: function unregister() {
123
- var _this2 = this;
163
+ var _this4 = this;
124
164
  if (!this.registered) {
125
165
  this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');
126
166
  return _promise.default.resolve();
127
167
  }
128
168
  this.stopListeningForEvents();
129
169
  return this.webex.internal.mercury.disconnect().then(function () {
130
- return _this2.webex.internal.device.unregister();
170
+ return _this4.webex.internal.device.unregister();
131
171
  }).then(function () {
132
- _this2.trigger(_constants.CALENDAR_UNREGISTERED);
133
- _this2.registered = false;
172
+ _this4.trigger(_constants.CALENDAR_UNREGISTERED);
173
+ _this4.registered = false;
134
174
  });
135
175
  },
136
176
  /**
@@ -139,25 +179,25 @@ var Calendar = _webexCore.WebexPlugin.extend({
139
179
  * @private
140
180
  */
141
181
  listenForEvents: function listenForEvents() {
142
- var _this3 = this;
182
+ var _this5 = this;
143
183
  // Calendar mercury events listener
144
184
  this.webex.internal.mercury.on('event:calendar.meeting.create', function (envelope) {
145
- _this3._handleCreate(envelope.data);
185
+ _this5._handleCreate(envelope.data);
146
186
  });
147
187
  this.webex.internal.mercury.on('event:calendar.meeting.update', function (envelope) {
148
- _this3._handleUpdate(envelope.data);
188
+ _this5._handleUpdate(envelope.data);
149
189
  });
150
190
  this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', function (envelope) {
151
- _this3._handleCreate(envelope.data);
191
+ _this5._handleCreate(envelope.data);
152
192
  });
153
193
  this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', function (envelope) {
154
- _this3._handleUpdate(envelope.data);
194
+ _this5._handleUpdate(envelope.data);
155
195
  });
156
196
  this.webex.internal.mercury.on('event:calendar.meeting.delete', function (envelope) {
157
- _this3._handleDelete(envelope.data);
197
+ _this5._handleDelete(envelope.data);
158
198
  });
159
199
  this.webex.internal.mercury.on('event:calendar.free_busy', function (envelope) {
160
- _this3._handleFreeBusy(envelope.data);
200
+ _this5._handleFreeBusy(envelope.data);
161
201
  });
162
202
  },
163
203
  /**
@@ -210,20 +250,20 @@ var Calendar = _webexCore.WebexPlugin.extend({
210
250
  * @private
211
251
  */
212
252
  _handleFreeBusy: function _handleFreeBusy(data) {
213
- var _this4 = this;
253
+ var _this6 = this;
214
254
  _calendarDecrypt.default.decryptFreeBusyResponse(this, data).then(function () {
215
255
  var response = {};
216
256
  if (data && data.calendarFreeBusyScheduleResponse) {
217
257
  response = data.calendarFreeBusyScheduleResponse;
218
258
  }
219
- if (response && response.requestId && response.requestId in _this4.rpcEventRequests) {
220
- _this4.logger.log("webex.internal.calendar - receive requests, requestId: ".concat(response.requestId));
259
+ if (response && response.requestId && response.requestId in _this6.rpcEventRequests) {
260
+ _this6.logger.log("webex.internal.calendar - receive requests, requestId: ".concat(response.requestId));
221
261
  delete response.encryptionKeyUrl;
222
- var resolve = _this4.rpcEventRequests[response.requestId].resolve;
262
+ var resolve = _this6.rpcEventRequests[response.requestId].resolve;
223
263
  resolve(response);
224
- delete _this4.rpcEventRequests[response.requestId];
264
+ delete _this6.rpcEventRequests[response.requestId];
225
265
  } else {
226
- _this4.logger.log('webex.internal.calendar - receive other requests.');
266
+ _this6.logger.log('webex.internal.calendar - receive other requests.');
227
267
  }
228
268
  });
229
269
  },
@@ -319,7 +359,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
319
359
  * @returns {Promise} Resolves with an array of meetings
320
360
  */
321
361
  list: function list(options) {
322
- var _this5 = this;
362
+ var _this7 = this;
323
363
  options = options || {};
324
364
  return this.webex.request({
325
365
  method: 'GET',
@@ -331,7 +371,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
331
371
  var promises = [];
332
372
  meetingObjects.forEach(function (meeting) {
333
373
  if (!meeting.encryptedParticipants) {
334
- promises.push(_this5.getParticipants(meeting.participantsUrl).then(function (notesResponse) {
374
+ promises.push(_this7.getParticipants(meeting.participantsUrl).then(function (notesResponse) {
335
375
  meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;
336
376
  }));
337
377
  }
@@ -348,9 +388,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
348
388
  * @returns {Promise} Resolves with creating calendar event response
349
389
  * */
350
390
  createCalendarEvent: function createCalendarEvent(data, query) {
351
- var _this6 = this;
391
+ var _this8 = this;
352
392
  return _calendarEncrypt.default.encryptCalendarEventRequest(this, data).then(function () {
353
- return _this6.request({
393
+ return _this8.request({
354
394
  method: 'POST',
355
395
  service: 'calendar',
356
396
  body: data,
@@ -367,9 +407,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
367
407
  * @returns {Promise} Resolves with updating calendar event response
368
408
  * */
369
409
  updateCalendarEvent: function updateCalendarEvent(id, data, query) {
370
- var _this7 = this;
410
+ var _this9 = this;
371
411
  return _calendarEncrypt.default.encryptCalendarEventRequest(this, data).then(function () {
372
- return _this7.request({
412
+ return _this9.request({
373
413
  method: 'PATCH',
374
414
  service: 'calendar',
375
415
  body: data,
@@ -414,14 +454,14 @@ var Calendar = _webexCore.WebexPlugin.extend({
414
454
  * @returns {Promise} Resolves with a decrypted scheduler data
415
455
  * */
416
456
  getSchedulerData: function getSchedulerData(query) {
417
- var _this8 = this;
457
+ var _this0 = this;
418
458
  return this.request({
419
459
  method: 'GET',
420
460
  service: 'calendar',
421
461
  resource: 'schedulerData',
422
462
  qs: query || {}
423
463
  }).then(function (response) {
424
- return _calendarDecrypt.default.decryptSchedulerDataResponse(_this8, response.body).then(function () {
464
+ return _calendarDecrypt.default.decryptSchedulerDataResponse(_this0, response.body).then(function () {
425
465
  return response;
426
466
  });
427
467
  });
@@ -433,9 +473,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
433
473
  * @returns {Promise} Resolves with a decrypted response
434
474
  * */
435
475
  getFreeBusy: function getFreeBusy(data, query) {
436
- var _this9 = this;
476
+ var _this1 = this;
437
477
  return _calendarEncrypt.default.encryptFreeBusyRequest(this, data).then(function () {
438
- return _this9.request({
478
+ return _this1.request({
439
479
  method: 'POST',
440
480
  service: 'calendar',
441
481
  body: data,
@@ -444,7 +484,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
444
484
  });
445
485
  }).then(function () {
446
486
  return new _promise.default(function (resolve, reject) {
447
- _this9.rpcEventRequests[data.requestId] = {
487
+ _this1.rpcEventRequests[data.requestId] = {
448
488
  resolve: resolve,
449
489
  reject: reject
450
490
  };
@@ -453,7 +493,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
453
493
  throw error;
454
494
  });
455
495
  },
456
- version: "3.12.0-next.8"
496
+ version: "3.12.0-task-refactor.1"
457
497
  });
458
498
  var _default = exports.default = Calendar;
459
499
  //# sourceMappingURL=calendar.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_common","require","_webexCore","_collection","_interopRequireDefault","_constants","_calendarEncrypt","_calendarDecrypt","Calendar","WebexPlugin","extend","namespace","registered","rpcEventRequests","initialize","register","_this","webex","canAuthorize","logger","error","_promise","default","reject","Error","info","resolve","internal","device","then","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","concat","message","unregister","_this2","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","_this3","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","_handleFreeBusy","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","_this4","DecryptHelper","decryptFreeBusyResponse","response","calendarFreeBusyScheduleResponse","requestId","log","encryptionKeyUrl","syncCalendar","options","arguments","length","undefined","fromDate","config","toDate","list","res","setAll","getAll","getByType","key","value","includes","getBy","processMeetingEvent","event","transform","getParticipants","participantsUrl","request","method","uri","getNotesByUrl","notesUrl","getNotes","service","resource","base64","encode","_this5","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedParticipants","push","notesResponse","all","createCalendarEvent","query","_this6","EncryptHelper","encryptCalendarEventRequest","updateCalendarEvent","_this7","deleteCalendarEvent","getSchedulerData","_this8","decryptSchedulerDataResponse","getFreeBusy","_this9","encryptFreeBusyRequest","version","_default","exports"],"sources":["calendar.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * Calendar Item Create Event\n * Emitted when a calendar item has been added\n * @event calendar:meeting:create\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been updated\n * @event calendar:meeting:update\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been deleted\n * @event calendar:meeting:delete\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:registered\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:unregistered\n * @instance\n * @memberof Calendar\n */\nimport {base64} from '@webex/common';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CalendarCollection from './collection';\nimport {\n CALENDAR_REGISTERED,\n CALENDAR_UNREGISTERED,\n CALENDAR_DELETE,\n CALENDAR_CREATE,\n CALENDAR_UPDATED,\n} from './constants';\n\nimport EncryptHelper from './calendar.encrypt.helper';\nimport DecryptHelper from './calendar.decrypt.helper';\n\nconst Calendar = WebexPlugin.extend({\n namespace: 'Calendar',\n\n /**\n * registered value indicating events registration is successful\n * @instance\n * @type {Boolean}\n * @memberof Calendar\n */\n registered: false,\n\n /**\n * Cache all rpc event request locally\n * */\n rpcEventRequests: [],\n\n /**\n * WebexPlugin initialize method. This triggers once Webex has completed its\n * initialization workflow.\n *\n * If the plugin is meant to perform startup actions, place them in this\n * `initialize()` method instead of the `constructor()` method.\n * @private\n * @returns {void}\n */\n initialize() {\n // Used to perform actions after webex is fully qualified and ready for\n // operation.\n },\n\n /**\n * Explicitly sets up the calendar plugin by registering\n * the device, connecting to mercury, and listening for calendar events.\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n register() {\n if (!this.webex.canAuthorize) {\n this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n this.logger.info('calendar->register#INFO, Calendar plugin already registered');\n\n return Promise.resolve();\n }\n\n return this.webex.internal.device\n .register()\n .then(() => this.webex.internal.mercury.connect())\n .then(() => {\n this.listenForEvents();\n this.trigger(CALENDAR_REGISTERED);\n this.registered = true;\n })\n .catch((error) => {\n this.logger.error(`calendar->register#ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Explicitly tears down the calendar plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to calendar events\n *\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n unregister() {\n if (!this.registered) {\n this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury\n .disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n this.trigger(CALENDAR_UNREGISTERED);\n this.registered = false;\n });\n },\n\n /**\n * registers for calendar events through mercury\n * @returns {undefined}\n * @private\n */\n listenForEvents() {\n // Calendar mercury events listener\n this.webex.internal.mercury.on('event:calendar.meeting.create', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.delete', (envelope) => {\n this._handleDelete(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.free_busy', (envelope) => {\n this._handleFreeBusy(envelope.data);\n });\n },\n\n /**\n * unregisteres all the calendar events from mercury\n * @returns {undefined}\n * @private\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off('event:calendar.meeting.create');\n this.webex.internal.mercury.off('event:calendar.meeting.create.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.update');\n this.webex.internal.mercury.off('event:calendar.meeting.update.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.delete');\n this.webex.internal.mercury.off('event:calendar.free_busy');\n },\n\n /**\n * handles update events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleUpdate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_UPDATED, CalendarCollection.get(id));\n },\n\n /**\n * handles create events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleCreate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_CREATE, CalendarCollection.get(id));\n },\n\n /**\n * handles delete events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleDelete(data) {\n const item = CalendarCollection.remove(data.calendarMeetingExternal.id);\n\n this.trigger(CALENDAR_DELETE, item);\n },\n\n /**\n * handles free_busy events\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleFreeBusy(data) {\n DecryptHelper.decryptFreeBusyResponse(this, data).then(() => {\n let response = {};\n if (data && data.calendarFreeBusyScheduleResponse) {\n response = data.calendarFreeBusyScheduleResponse;\n }\n if (response && response.requestId && response.requestId in this.rpcEventRequests) {\n this.logger.log(\n `webex.internal.calendar - receive requests, requestId: ${response.requestId}`\n );\n delete response.encryptionKeyUrl;\n const {resolve} = this.rpcEventRequests[response.requestId];\n resolve(response);\n delete this.rpcEventRequests[response.requestId];\n } else {\n this.logger.log('webex.internal.calendar - receive other requests.');\n }\n });\n },\n\n /**\n * Retrieves a collection of calendars based on the request parameters\n * Defaults to 1 day before and 7 days ahead\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of calendars\n */\n syncCalendar(options = {fromDate: this.config.fromDate, toDate: this.config.toDate}) {\n return this.list({fromDate: options.fromDate, toDate: options.toDate}).then((res) => {\n CalendarCollection.setAll(res);\n\n return CalendarCollection.getAll();\n });\n },\n /**\n * get the calendar item that has a matching value\n * @param {String} key meeting property\n * @param {Any} value the meeting property to match\n * @returns {Object}\n */\n getByType(key, value) {\n if (['spaceURI', 'spaceMeetURL', 'conversationId'].includes(key)) {\n return CalendarCollection.getBy(key, value);\n }\n throw new Error('key must be one of, spaceURI, spaceMeetURL, or conversationId');\n },\n\n /**\n * gets all the calendar items that have been populated\n * @returns {Object}\n */\n getAll() {\n return CalendarCollection.getAll();\n },\n\n /**\n * Decrypts an encrypted incoming calendar event\n * @param {Object} event\n * @returns {Promise} Resolves with a decrypted calendar event\n */\n processMeetingEvent(event) {\n return this.webex.transform('inbound', event).then(() => event);\n },\n\n /**\n * Retrieves an array of meeting participants for the meeting participantsUrl\n * @param {String} participantsUrl\n * @returns {Promise} Resolves with an object of meeting participants\n */\n getParticipants(participantsUrl) {\n return this.request({\n method: 'GET',\n uri: participantsUrl,\n });\n },\n\n /**\n * get meeting notes using notesUrl from meeting object.\n * @param {String} notesUrl\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotesByUrl(notesUrl) {\n return this.request({\n method: 'GET',\n uri: notesUrl,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {String} id\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotes(id) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/notes`,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of meetings\n */\n list(options) {\n options = options || {};\n\n return this.webex\n .request({\n method: 'GET',\n service: 'calendar',\n resource: 'calendarEvents',\n qs: options,\n })\n .then((res) => {\n const meetingObjects = res.body.items;\n const promises = [];\n\n meetingObjects.forEach((meeting) => {\n if (!meeting.encryptedParticipants) {\n promises.push(\n this.getParticipants(meeting.participantsUrl).then((notesResponse) => {\n meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;\n })\n );\n }\n });\n\n return Promise.all(promises).then(() => meetingObjects);\n });\n },\n\n /**\n * Create calendar event\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with creating calendar event response\n * */\n createCalendarEvent(data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'calendarEvents/sync',\n qs: query || {},\n })\n );\n },\n\n /**\n * Update calendar event\n * @param {string} [id] calendar event id\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with updating calendar event response\n * */\n updateCalendarEvent(id, data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'PATCH',\n service: 'calendar',\n body: data,\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n })\n );\n },\n\n /**\n * Delete calendar event\n * @param {string} [id] calendar event id\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with deleting calendar event response\n * */\n deleteCalendarEvent(id, query) {\n return this.request({\n method: 'DELETE',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n });\n },\n\n /**\n * @typedef QuerySchedulerDataOptions\n * @param {string} [siteName] it is site full url, must have. Example: ccctest.dmz.webex.com\n * @param {string} [id] it is seriesOrOccurrenceId. If present, the series/occurrence meeting ID to fetch data for.\n * Example: 040000008200E00074C5B7101A82E008000000004A99F11A0841D9010000000000000000100000009EE499D4A71C1A46B51494C70EC7BFE5\n * @param {string} [clientMeetingId] If present, the client meeting UUID to fetch data for.\n * Example: 7f318aa9-887c-6e94-802a-8dc8e6eb1a0a\n * @param {string} [scheduleTemplateId] it template id.\n * @param {string} [sessionTypeId] it session type id.\n * @param {string} [organizerCIUserId] required in schedule-on-behalf case. It is the organizer's CI UUID.\n * @param {boolean} [usmPreference]\n * @param {string} [webexMeetingId] webex side meeting UUID\n * @param {string} [eventId] event ID.\n * @param {string} [icalUid] icalendar UUID.\n * @param {string} [thirdPartyType] third part type, such as: Microsoft\n */\n /**\n * Get scheduler data from calendar service\n * @param {QuerySchedulerDataOptions} [query] the command parameters for fetching scheduler data.\n * @returns {Promise} Resolves with a decrypted scheduler data\n * */\n getSchedulerData(query) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: 'schedulerData',\n qs: query || {},\n }).then((response) => {\n return DecryptHelper.decryptSchedulerDataResponse(this, response.body).then(() => response);\n });\n },\n\n /**\n * Get free busy status from calendar service\n * @param {Object} [data] the command parameters for fetching free busy status.\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with a decrypted response\n * */\n getFreeBusy(data, query) {\n return EncryptHelper.encryptFreeBusyRequest(this, data)\n .then(() => {\n return this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'freebusy',\n qs: query || {},\n });\n })\n .then(() => {\n return new Promise((resolve, reject) => {\n this.rpcEventRequests[data.requestId] = {resolve, reject};\n });\n })\n .catch((error) => {\n throw error;\n });\n },\n});\n\nexport default Calendar;\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_lodash","require","_common","_webexCore","_collection","_interopRequireDefault","_constants","_calendarEncrypt","_calendarDecrypt","Calendar","WebexPlugin","extend","namespace","registered","rpcEventRequests","encryptionKeyUrl","prefetchEncryptionKey","_this","webex","canAuthorize","listenToOnce","credentials","isUnverifiedGuest","internal","encryption","kms","createUnboundKeys","count","then","keys","key","isArray","uri","logger","info","getKey","onBehalfOf","retrievedKey","initialize","_this2","register","_this3","error","_promise","default","reject","Error","resolve","device","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","concat","message","unregister","_this4","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","_this5","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","_handleFreeBusy","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","_this6","DecryptHelper","decryptFreeBusyResponse","response","calendarFreeBusyScheduleResponse","requestId","log","syncCalendar","options","arguments","length","undefined","fromDate","config","toDate","list","res","setAll","getAll","getByType","value","includes","getBy","processMeetingEvent","event","transform","getParticipants","participantsUrl","request","method","getNotesByUrl","notesUrl","getNotes","service","resource","base64","encode","_this7","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedParticipants","push","notesResponse","all","createCalendarEvent","query","_this8","EncryptHelper","encryptCalendarEventRequest","updateCalendarEvent","_this9","deleteCalendarEvent","getSchedulerData","_this0","decryptSchedulerDataResponse","getFreeBusy","_this1","encryptFreeBusyRequest","version","_default","exports"],"sources":["calendar.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/**\n * Calendar Item Create Event\n * Emitted when a calendar item has been added\n * @event calendar:meeting:create\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been updated\n * @event calendar:meeting:update\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Item Update Event\n * Emitted when a calendar item has been deleted\n * @event calendar:meeting:delete\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:registered\n * @instance\n * @memberof Calendar\n */\n\n/**\n * Calendar Registered Event\n * Emitted when the calendar instance has been registered and listening\n * @event calendar:unregistered\n * @instance\n * @memberof Calendar\n */\nimport {isArray} from 'lodash';\nimport {base64} from '@webex/common';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CalendarCollection from './collection';\nimport {\n CALENDAR_REGISTERED,\n CALENDAR_UNREGISTERED,\n CALENDAR_DELETE,\n CALENDAR_CREATE,\n CALENDAR_UPDATED,\n} from './constants';\n\nimport EncryptHelper from './calendar.encrypt.helper';\nimport DecryptHelper from './calendar.decrypt.helper';\n\nconst Calendar = WebexPlugin.extend({\n namespace: 'Calendar',\n\n /**\n * registered value indicating events registration is successful\n * @instance\n * @type {Boolean}\n * @memberof Calendar\n */\n registered: false,\n\n /**\n * Cache all rpc event request locally\n * */\n rpcEventRequests: [],\n\n /**\n * Cache KMS encryptionKeyUrl\n * */\n encryptionKeyUrl: null,\n\n /**\n * Pre-fetch a KMS encryption key url to improve performance.\n * Waits for the user to be authorized and skips if an unverified guest.\n * @private\n * @returns {void}\n */\n prefetchEncryptionKey() {\n if (!this.webex.canAuthorize) {\n this.listenToOnce(this.webex, 'change:canAuthorize', () => {\n this.prefetchEncryptionKey();\n });\n\n return;\n }\n\n if (this.webex.credentials.isUnverifiedGuest) {\n return;\n }\n\n this.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {\n const key = isArray(keys) ? keys[0] : keys;\n this.encryptionKeyUrl = key ? key.uri : null;\n this.logger.info('calendar->bind a KMS encryption key url');\n this.webex.internal.encryption\n .getKey(this.encryptionKeyUrl, {onBehalfOf: null})\n .then((retrievedKey) => {\n this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;\n this.logger.info('calendar->retrieve the KMS encryption key url and cache it');\n });\n });\n },\n\n /**\n * WebexPlugin initialize method. This triggers once Webex has completed its\n * initialization workflow.\n *\n * If the plugin is meant to perform startup actions, place them in this\n * `initialize()` method instead of the `constructor()` method.\n * @private\n * @returns {void}\n */\n initialize() {\n // Used to perform actions after webex is fully qualified and ready for\n // operation.\n this.listenToOnce(this.webex, 'ready', () => {\n this.prefetchEncryptionKey();\n });\n },\n\n /**\n * Explicitly sets up the calendar plugin by registering\n * the device, connecting to mercury, and listening for calendar events.\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n register() {\n if (!this.webex.canAuthorize) {\n this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n if (this.registered) {\n this.logger.info('calendar->register#INFO, Calendar plugin already registered');\n\n return Promise.resolve();\n }\n\n return this.webex.internal.device\n .register()\n .then(() => this.webex.internal.mercury.connect())\n .then(() => {\n this.listenForEvents();\n this.trigger(CALENDAR_REGISTERED);\n this.registered = true;\n })\n .catch((error) => {\n this.logger.error(`calendar->register#ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n },\n\n /**\n * Explicitly tears down the calendar plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to calendar events\n *\n * @returns {Promise}\n * @public\n * @memberof Calendar\n */\n unregister() {\n if (!this.registered) {\n this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury\n .disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n this.trigger(CALENDAR_UNREGISTERED);\n this.registered = false;\n });\n },\n\n /**\n * registers for calendar events through mercury\n * @returns {undefined}\n * @private\n */\n listenForEvents() {\n // Calendar mercury events listener\n this.webex.internal.mercury.on('event:calendar.meeting.create', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', (envelope) => {\n this._handleCreate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', (envelope) => {\n this._handleUpdate(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.meeting.delete', (envelope) => {\n this._handleDelete(envelope.data);\n });\n this.webex.internal.mercury.on('event:calendar.free_busy', (envelope) => {\n this._handleFreeBusy(envelope.data);\n });\n },\n\n /**\n * unregisteres all the calendar events from mercury\n * @returns {undefined}\n * @private\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off('event:calendar.meeting.create');\n this.webex.internal.mercury.off('event:calendar.meeting.create.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.update');\n this.webex.internal.mercury.off('event:calendar.meeting.update.minimal');\n this.webex.internal.mercury.off('event:calendar.meeting.delete');\n this.webex.internal.mercury.off('event:calendar.free_busy');\n },\n\n /**\n * handles update events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleUpdate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_UPDATED, CalendarCollection.get(id));\n },\n\n /**\n * handles create events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleCreate(data) {\n const id = CalendarCollection.set(data.calendarMeetingExternal);\n\n this.trigger(CALENDAR_CREATE, CalendarCollection.get(id));\n },\n\n /**\n * handles delete events, triggers after collection updates\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleDelete(data) {\n const item = CalendarCollection.remove(data.calendarMeetingExternal.id);\n\n this.trigger(CALENDAR_DELETE, item);\n },\n\n /**\n * handles free_busy events\n * @param {Object} data\n * @returns {undefined}\n * @private\n */\n _handleFreeBusy(data) {\n DecryptHelper.decryptFreeBusyResponse(this, data).then(() => {\n let response = {};\n if (data && data.calendarFreeBusyScheduleResponse) {\n response = data.calendarFreeBusyScheduleResponse;\n }\n if (response && response.requestId && response.requestId in this.rpcEventRequests) {\n this.logger.log(\n `webex.internal.calendar - receive requests, requestId: ${response.requestId}`\n );\n delete response.encryptionKeyUrl;\n const {resolve} = this.rpcEventRequests[response.requestId];\n resolve(response);\n delete this.rpcEventRequests[response.requestId];\n } else {\n this.logger.log('webex.internal.calendar - receive other requests.');\n }\n });\n },\n\n /**\n * Retrieves a collection of calendars based on the request parameters\n * Defaults to 1 day before and 7 days ahead\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of calendars\n */\n syncCalendar(options = {fromDate: this.config.fromDate, toDate: this.config.toDate}) {\n return this.list({fromDate: options.fromDate, toDate: options.toDate}).then((res) => {\n CalendarCollection.setAll(res);\n\n return CalendarCollection.getAll();\n });\n },\n /**\n * get the calendar item that has a matching value\n * @param {String} key meeting property\n * @param {Any} value the meeting property to match\n * @returns {Object}\n */\n getByType(key, value) {\n if (['spaceURI', 'spaceMeetURL', 'conversationId'].includes(key)) {\n return CalendarCollection.getBy(key, value);\n }\n throw new Error('key must be one of, spaceURI, spaceMeetURL, or conversationId');\n },\n\n /**\n * gets all the calendar items that have been populated\n * @returns {Object}\n */\n getAll() {\n return CalendarCollection.getAll();\n },\n\n /**\n * Decrypts an encrypted incoming calendar event\n * @param {Object} event\n * @returns {Promise} Resolves with a decrypted calendar event\n */\n processMeetingEvent(event) {\n return this.webex.transform('inbound', event).then(() => event);\n },\n\n /**\n * Retrieves an array of meeting participants for the meeting participantsUrl\n * @param {String} participantsUrl\n * @returns {Promise} Resolves with an object of meeting participants\n */\n getParticipants(participantsUrl) {\n return this.request({\n method: 'GET',\n uri: participantsUrl,\n });\n },\n\n /**\n * get meeting notes using notesUrl from meeting object.\n * @param {String} notesUrl\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotesByUrl(notesUrl) {\n return this.request({\n method: 'GET',\n uri: notesUrl,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {String} id\n * @returns {Promise} Resolves with an object of meeting notes\n */\n getNotes(id) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/notes`,\n });\n },\n\n /**\n * Retrieves a collection of meetings based on the request parameters\n * @param {Object} options\n * @param {Date} options.fromDate the start of the time range\n * @param {Date} options.toDate the end of the time range\n * @returns {Promise} Resolves with an array of meetings\n */\n list(options) {\n options = options || {};\n\n return this.webex\n .request({\n method: 'GET',\n service: 'calendar',\n resource: 'calendarEvents',\n qs: options,\n })\n .then((res) => {\n const meetingObjects = res.body.items;\n const promises = [];\n\n meetingObjects.forEach((meeting) => {\n if (!meeting.encryptedParticipants) {\n promises.push(\n this.getParticipants(meeting.participantsUrl).then((notesResponse) => {\n meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;\n })\n );\n }\n });\n\n return Promise.all(promises).then(() => meetingObjects);\n });\n },\n\n /**\n * Create calendar event\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with creating calendar event response\n * */\n createCalendarEvent(data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'calendarEvents/sync',\n qs: query || {},\n })\n );\n },\n\n /**\n * Update calendar event\n * @param {string} [id] calendar event id\n * @param {object} [data] meeting payload data\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with updating calendar event response\n * */\n updateCalendarEvent(id, data, query) {\n return EncryptHelper.encryptCalendarEventRequest(this, data).then(() =>\n this.request({\n method: 'PATCH',\n service: 'calendar',\n body: data,\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n })\n );\n },\n\n /**\n * Delete calendar event\n * @param {string} [id] calendar event id\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with deleting calendar event response\n * */\n deleteCalendarEvent(id, query) {\n return this.request({\n method: 'DELETE',\n service: 'calendar',\n resource: `calendarEvents/${base64.encode(id)}/sync`,\n qs: query || {},\n });\n },\n\n /**\n * @typedef QuerySchedulerDataOptions\n * @param {string} [siteName] it is site full url, must have. Example: ccctest.dmz.webex.com\n * @param {string} [id] it is seriesOrOccurrenceId. If present, the series/occurrence meeting ID to fetch data for.\n * Example: 040000008200E00074C5B7101A82E008000000004A99F11A0841D9010000000000000000100000009EE499D4A71C1A46B51494C70EC7BFE5\n * @param {string} [clientMeetingId] If present, the client meeting UUID to fetch data for.\n * Example: 7f318aa9-887c-6e94-802a-8dc8e6eb1a0a\n * @param {string} [scheduleTemplateId] it template id.\n * @param {string} [sessionTypeId] it session type id.\n * @param {string} [organizerCIUserId] required in schedule-on-behalf case. It is the organizer's CI UUID.\n * @param {boolean} [usmPreference]\n * @param {string} [webexMeetingId] webex side meeting UUID\n * @param {string} [eventId] event ID.\n * @param {string} [icalUid] icalendar UUID.\n * @param {string} [thirdPartyType] third part type, such as: Microsoft\n */\n /**\n * Get scheduler data from calendar service\n * @param {QuerySchedulerDataOptions} [query] the command parameters for fetching scheduler data.\n * @returns {Promise} Resolves with a decrypted scheduler data\n * */\n getSchedulerData(query) {\n return this.request({\n method: 'GET',\n service: 'calendar',\n resource: 'schedulerData',\n qs: query || {},\n }).then((response) => {\n return DecryptHelper.decryptSchedulerDataResponse(this, response.body).then(() => response);\n });\n },\n\n /**\n * Get free busy status from calendar service\n * @param {Object} [data] the command parameters for fetching free busy status.\n * @param {object} [query] the query parameters for specific usage\n * @returns {Promise} Resolves with a decrypted response\n * */\n getFreeBusy(data, query) {\n return EncryptHelper.encryptFreeBusyRequest(this, data)\n .then(() => {\n return this.request({\n method: 'POST',\n service: 'calendar',\n body: data,\n resource: 'freebusy',\n qs: query || {},\n });\n })\n .then(() => {\n return new Promise((resolve, reject) => {\n this.rpcEventRequests[data.requestId] = {resolve, reject};\n });\n })\n .catch((error) => {\n throw error;\n });\n },\n});\n\nexport default Calendar;\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -25,20 +25,20 @@
25
25
  "@webex/eslint-config-legacy": "0.0.0",
26
26
  "@webex/jest-config-legacy": "0.0.0",
27
27
  "@webex/legacy-tools": "0.0.0",
28
- "@webex/test-helper-chai": "3.11.0-next.1",
29
- "@webex/test-helper-mocha": "3.11.0-next.1",
30
- "@webex/test-helper-mock-webex": "3.11.0-next.1",
31
- "@webex/test-helper-retry": "3.11.0-next.1",
32
- "@webex/test-helper-test-users": "3.11.0-next.1",
28
+ "@webex/test-helper-chai": "3.12.0-task-refactor.1",
29
+ "@webex/test-helper-mocha": "3.12.0-task-refactor.1",
30
+ "@webex/test-helper-mock-webex": "3.12.0-task-refactor.1",
31
+ "@webex/test-helper-retry": "3.12.0-task-refactor.1",
32
+ "@webex/test-helper-test-users": "3.12.0-task-refactor.1",
33
33
  "eslint": "^8.24.0",
34
34
  "prettier": "^2.7.1",
35
35
  "sinon": "^9.2.4"
36
36
  },
37
37
  "dependencies": {
38
- "@webex/internal-plugin-conversation": "3.12.0-next.8",
39
- "@webex/internal-plugin-device": "3.12.0-next.7",
40
- "@webex/internal-plugin-encryption": "3.12.0-next.8",
41
- "@webex/webex-core": "3.12.0-next.7",
38
+ "@webex/internal-plugin-conversation": "3.12.0-task-refactor.1",
39
+ "@webex/internal-plugin-device": "3.12.0-task-refactor.1",
40
+ "@webex/internal-plugin-encryption": "3.12.0-task-refactor.1",
41
+ "@webex/webex-core": "3.12.0-task-refactor.1",
42
42
  "lodash": "^4.17.21",
43
43
  "uuid": "^3.3.2"
44
44
  },
@@ -51,5 +51,5 @@
51
51
  "test:style": "eslint ./src/**/*.*",
52
52
  "test:unit": "webex-legacy-tools test --unit --runner jest"
53
53
  },
54
- "version": "3.12.0-next.8"
54
+ "version": "3.12.0-task-refactor.1"
55
55
  }
package/src/calendar.js CHANGED
@@ -41,6 +41,7 @@
41
41
  * @instance
42
42
  * @memberof Calendar
43
43
  */
44
+ import {isArray} from 'lodash';
44
45
  import {base64} from '@webex/common';
45
46
  import {WebexPlugin} from '@webex/webex-core';
46
47
 
@@ -72,6 +73,43 @@ const Calendar = WebexPlugin.extend({
72
73
  * */
73
74
  rpcEventRequests: [],
74
75
 
76
+ /**
77
+ * Cache KMS encryptionKeyUrl
78
+ * */
79
+ encryptionKeyUrl: null,
80
+
81
+ /**
82
+ * Pre-fetch a KMS encryption key url to improve performance.
83
+ * Waits for the user to be authorized and skips if an unverified guest.
84
+ * @private
85
+ * @returns {void}
86
+ */
87
+ prefetchEncryptionKey() {
88
+ if (!this.webex.canAuthorize) {
89
+ this.listenToOnce(this.webex, 'change:canAuthorize', () => {
90
+ this.prefetchEncryptionKey();
91
+ });
92
+
93
+ return;
94
+ }
95
+
96
+ if (this.webex.credentials.isUnverifiedGuest) {
97
+ return;
98
+ }
99
+
100
+ this.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {
101
+ const key = isArray(keys) ? keys[0] : keys;
102
+ this.encryptionKeyUrl = key ? key.uri : null;
103
+ this.logger.info('calendar->bind a KMS encryption key url');
104
+ this.webex.internal.encryption
105
+ .getKey(this.encryptionKeyUrl, {onBehalfOf: null})
106
+ .then((retrievedKey) => {
107
+ this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;
108
+ this.logger.info('calendar->retrieve the KMS encryption key url and cache it');
109
+ });
110
+ });
111
+ },
112
+
75
113
  /**
76
114
  * WebexPlugin initialize method. This triggers once Webex has completed its
77
115
  * initialization workflow.
@@ -84,6 +122,9 @@ const Calendar = WebexPlugin.extend({
84
122
  initialize() {
85
123
  // Used to perform actions after webex is fully qualified and ready for
86
124
  // operation.
125
+ this.listenToOnce(this.webex, 'ready', () => {
126
+ this.prefetchEncryptionKey();
127
+ });
87
128
  },
88
129
 
89
130
  /**
@@ -59,6 +59,54 @@ describe('internal-plugin-calendar', () => {
59
59
  };
60
60
  });
61
61
 
62
+ describe('Private API', () => {
63
+ describe('#prefetchEncryptionKey', () => {
64
+ it('waits for the ability to authorize before doing anything', () => {
65
+ webex.canAuthorize = false;
66
+
67
+ webex.internal.calendar.prefetchEncryptionKey();
68
+
69
+ assert.notCalled(webex.internal.encryption.kms.createUnboundKeys);
70
+
71
+ // Behaviour when the user can authorize is tested elsewhere, so just ensure it gets called again
72
+ const prefetchEncryptionKeyStub = sinon.stub(webex.internal.calendar, 'prefetchEncryptionKey');
73
+
74
+ webex.trigger('change:canAuthorize');
75
+
76
+ assert.calledOnce(prefetchEncryptionKeyStub);
77
+ assert.calledWith(prefetchEncryptionKeyStub);
78
+ });
79
+
80
+ it('does nothing when the current user is an unverified guest', () => {
81
+ webex.credentials.isUnverifiedGuest = true;
82
+
83
+ webex.internal.calendar.prefetchEncryptionKey();
84
+
85
+ assert.notCalled(webex.internal.encryption.kms.createUnboundKeys);
86
+ });
87
+
88
+ it('creates an encryption key when the current user can authorize', () => {
89
+ webex.internal.calendar.prefetchEncryptionKey();
90
+
91
+ assert.calledOnce(webex.internal.encryption.kms.createUnboundKeys);
92
+ assert.calledWith(webex.internal.encryption.kms.createUnboundKeys, {count: 1});
93
+ });
94
+ });
95
+
96
+ describe('#initialize', () => {
97
+ it('adds relevant handlers when webex is ready', () => {
98
+ const prefetchEncryptionKeyStub = sinon.stub(webex.internal.calendar, 'prefetchEncryptionKey');
99
+
100
+ assert.notCalled(prefetchEncryptionKeyStub);
101
+
102
+ // Initialize should have already run, so there should be an event handler already
103
+ webex.trigger('ready');
104
+
105
+ assert.calledOnce(prefetchEncryptionKeyStub);
106
+ assert.calledWith(prefetchEncryptionKeyStub);
107
+ });
108
+ });
109
+ });
62
110
 
63
111
  describe('Public Api Contract', () => {
64
112
  describe('#register()', () => {