@webex/internal-plugin-calendar 3.0.0-beta.322 → 3.0.0-beta.324
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 +69 -50
- package/dist/calendar.js.map +1 -1
- package/package.json +9 -9
- package/src/calendar.js +34 -12
- package/test/unit/spec/calendar.js +49 -0
package/dist/calendar.js
CHANGED
|
@@ -31,33 +31,52 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
31
31
|
* Cache KMS encryptionKeyUrl
|
|
32
32
|
* */
|
|
33
33
|
encryptionKeyUrl: null,
|
|
34
|
+
/**
|
|
35
|
+
* Pre-fetch a KMS encryption key url to improve performance.
|
|
36
|
+
* Waits for the user to be authorized and skips if an unverified guest.
|
|
37
|
+
* @private
|
|
38
|
+
* @returns {void}
|
|
39
|
+
*/
|
|
40
|
+
prefetchEncryptionKey: function prefetchEncryptionKey() {
|
|
41
|
+
var _this = this;
|
|
42
|
+
if (!this.webex.canAuthorize) {
|
|
43
|
+
this.listenToOnce(this.webex, 'change:canAuthorize', function () {
|
|
44
|
+
_this.prefetchEncryptionKey();
|
|
45
|
+
});
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (this.webex.credentials.isUnverifiedGuest) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
this.webex.internal.encryption.kms.createUnboundKeys({
|
|
52
|
+
count: 1
|
|
53
|
+
}).then(function (keys) {
|
|
54
|
+
var key = (0, _isArray2.default)(keys) ? keys[0] : keys;
|
|
55
|
+
_this.encryptionKeyUrl = key ? key.uri : null;
|
|
56
|
+
_this.logger.info('calendar->bind a KMS encryption key url');
|
|
57
|
+
_this.webex.internal.encryption.getKey(_this.encryptionKeyUrl, {
|
|
58
|
+
onBehalfOf: null
|
|
59
|
+
}).then(function (retrievedKey) {
|
|
60
|
+
_this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;
|
|
61
|
+
_this.logger.info('calendar->retrieve the KMS encryption key url and cache it');
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
},
|
|
34
65
|
/**
|
|
35
66
|
* WebexPlugin initialize method. This triggers once Webex has completed its
|
|
36
67
|
* initialization workflow.
|
|
37
68
|
*
|
|
38
69
|
* If the plugin is meant to perform startup actions, place them in this
|
|
39
70
|
* `initialize()` method instead of the `constructor()` method.
|
|
71
|
+
* @private
|
|
40
72
|
* @returns {void}
|
|
41
73
|
*/
|
|
42
74
|
initialize: function initialize() {
|
|
43
|
-
var
|
|
75
|
+
var _this2 = this;
|
|
44
76
|
// Used to perform actions after webex is fully qualified and ready for
|
|
45
77
|
// operation.
|
|
46
78
|
this.listenToOnce(this.webex, 'ready', function () {
|
|
47
|
-
|
|
48
|
-
_this.webex.internal.encryption.kms.createUnboundKeys({
|
|
49
|
-
count: 1
|
|
50
|
-
}).then(function (keys) {
|
|
51
|
-
var key = (0, _isArray2.default)(keys) ? keys[0] : keys;
|
|
52
|
-
_this.encryptionKeyUrl = key ? key.uri : null;
|
|
53
|
-
_this.logger.info('calendar->bind a KMS encryption key url');
|
|
54
|
-
_this.webex.internal.encryption.getKey(_this.encryptionKeyUrl, {
|
|
55
|
-
onBehalfOf: null
|
|
56
|
-
}).then(function (retrievedKey) {
|
|
57
|
-
_this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;
|
|
58
|
-
_this.logger.info('calendar->retrieve the KMS encryption key url and cache it');
|
|
59
|
-
});
|
|
60
|
-
});
|
|
79
|
+
_this2.prefetchEncryptionKey();
|
|
61
80
|
});
|
|
62
81
|
},
|
|
63
82
|
/**
|
|
@@ -68,7 +87,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
68
87
|
* @memberof Calendar
|
|
69
88
|
*/
|
|
70
89
|
register: function register() {
|
|
71
|
-
var
|
|
90
|
+
var _this3 = this;
|
|
72
91
|
if (!this.webex.canAuthorize) {
|
|
73
92
|
this.logger.error('calendar->register#ERROR, Unable to register, SDK cannot authorize');
|
|
74
93
|
return _promise.default.reject(new Error('SDK cannot authorize'));
|
|
@@ -78,13 +97,13 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
78
97
|
return _promise.default.resolve();
|
|
79
98
|
}
|
|
80
99
|
return this.webex.internal.device.register().then(function () {
|
|
81
|
-
return
|
|
100
|
+
return _this3.webex.internal.mercury.connect();
|
|
82
101
|
}).then(function () {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
102
|
+
_this3.listenForEvents();
|
|
103
|
+
_this3.trigger(_constants.CALENDAR_REGISTERED);
|
|
104
|
+
_this3.registered = true;
|
|
86
105
|
}).catch(function (error) {
|
|
87
|
-
|
|
106
|
+
_this3.logger.error("calendar->register#ERROR, Unable to register, ".concat(error.message));
|
|
88
107
|
return _promise.default.reject(error);
|
|
89
108
|
});
|
|
90
109
|
},
|
|
@@ -97,17 +116,17 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
97
116
|
* @memberof Calendar
|
|
98
117
|
*/
|
|
99
118
|
unregister: function unregister() {
|
|
100
|
-
var
|
|
119
|
+
var _this4 = this;
|
|
101
120
|
if (!this.registered) {
|
|
102
121
|
this.logger.info('calendar->unregister#INFO, Calendar plugin already unregistered');
|
|
103
122
|
return _promise.default.resolve();
|
|
104
123
|
}
|
|
105
124
|
this.stopListeningForEvents();
|
|
106
125
|
return this.webex.internal.mercury.disconnect().then(function () {
|
|
107
|
-
return
|
|
126
|
+
return _this4.webex.internal.device.unregister();
|
|
108
127
|
}).then(function () {
|
|
109
|
-
|
|
110
|
-
|
|
128
|
+
_this4.trigger(_constants.CALENDAR_UNREGISTERED);
|
|
129
|
+
_this4.registered = false;
|
|
111
130
|
});
|
|
112
131
|
},
|
|
113
132
|
/**
|
|
@@ -116,25 +135,25 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
116
135
|
* @private
|
|
117
136
|
*/
|
|
118
137
|
listenForEvents: function listenForEvents() {
|
|
119
|
-
var
|
|
138
|
+
var _this5 = this;
|
|
120
139
|
// Calendar mercury events listener
|
|
121
140
|
this.webex.internal.mercury.on('event:calendar.meeting.create', function (envelope) {
|
|
122
|
-
|
|
141
|
+
_this5._handleCreate(envelope.data);
|
|
123
142
|
});
|
|
124
143
|
this.webex.internal.mercury.on('event:calendar.meeting.update', function (envelope) {
|
|
125
|
-
|
|
144
|
+
_this5._handleUpdate(envelope.data);
|
|
126
145
|
});
|
|
127
146
|
this.webex.internal.mercury.on('event:calendar.meeting.create.minimal', function (envelope) {
|
|
128
|
-
|
|
147
|
+
_this5._handleCreate(envelope.data);
|
|
129
148
|
});
|
|
130
149
|
this.webex.internal.mercury.on('event:calendar.meeting.update.minimal', function (envelope) {
|
|
131
|
-
|
|
150
|
+
_this5._handleUpdate(envelope.data);
|
|
132
151
|
});
|
|
133
152
|
this.webex.internal.mercury.on('event:calendar.meeting.delete', function (envelope) {
|
|
134
|
-
|
|
153
|
+
_this5._handleDelete(envelope.data);
|
|
135
154
|
});
|
|
136
155
|
this.webex.internal.mercury.on('event:calendar.free_busy', function (envelope) {
|
|
137
|
-
|
|
156
|
+
_this5._handleFreeBusy(envelope.data);
|
|
138
157
|
});
|
|
139
158
|
},
|
|
140
159
|
/**
|
|
@@ -187,20 +206,20 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
187
206
|
* @private
|
|
188
207
|
*/
|
|
189
208
|
_handleFreeBusy: function _handleFreeBusy(data) {
|
|
190
|
-
var
|
|
209
|
+
var _this6 = this;
|
|
191
210
|
_calendarDecrypt.default.decryptFreeBusyResponse(this, data).then(function () {
|
|
192
211
|
var response = {};
|
|
193
212
|
if (data && data.calendarFreeBusyScheduleResponse) {
|
|
194
213
|
response = data.calendarFreeBusyScheduleResponse;
|
|
195
214
|
}
|
|
196
|
-
if (response && response.requestId && response.requestId in
|
|
197
|
-
|
|
215
|
+
if (response && response.requestId && response.requestId in _this6.rpcEventRequests) {
|
|
216
|
+
_this6.logger.log("webex.internal.calendar - receive requests, requestId: ".concat(response.requestId));
|
|
198
217
|
delete response.encryptionKeyUrl;
|
|
199
|
-
var resolve =
|
|
218
|
+
var resolve = _this6.rpcEventRequests[response.requestId].resolve;
|
|
200
219
|
resolve(response);
|
|
201
|
-
delete
|
|
220
|
+
delete _this6.rpcEventRequests[response.requestId];
|
|
202
221
|
} else {
|
|
203
|
-
|
|
222
|
+
_this6.logger.log('webex.internal.calendar - receive other requests.');
|
|
204
223
|
}
|
|
205
224
|
});
|
|
206
225
|
},
|
|
@@ -296,7 +315,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
296
315
|
* @returns {Promise} Resolves with an array of meetings
|
|
297
316
|
*/
|
|
298
317
|
list: function list(options) {
|
|
299
|
-
var
|
|
318
|
+
var _this7 = this;
|
|
300
319
|
options = options || {};
|
|
301
320
|
return this.webex.request({
|
|
302
321
|
method: 'GET',
|
|
@@ -308,7 +327,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
308
327
|
var promises = [];
|
|
309
328
|
meetingObjects.forEach(function (meeting) {
|
|
310
329
|
if (!meeting.encryptedParticipants) {
|
|
311
|
-
promises.push(
|
|
330
|
+
promises.push(_this7.getParticipants(meeting.participantsUrl).then(function (notesResponse) {
|
|
312
331
|
meeting.encryptedParticipants = notesResponse.body.encryptedParticipants;
|
|
313
332
|
}));
|
|
314
333
|
}
|
|
@@ -325,9 +344,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
325
344
|
* @returns {Promise} Resolves with creating calendar event response
|
|
326
345
|
* */
|
|
327
346
|
createCalendarEvent: function createCalendarEvent(data, query) {
|
|
328
|
-
var
|
|
347
|
+
var _this8 = this;
|
|
329
348
|
return _calendarEncrypt.default.encryptCalendarEventRequest(this, data).then(function () {
|
|
330
|
-
return
|
|
349
|
+
return _this8.request({
|
|
331
350
|
method: 'POST',
|
|
332
351
|
service: 'calendar',
|
|
333
352
|
body: data,
|
|
@@ -344,9 +363,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
344
363
|
* @returns {Promise} Resolves with updating calendar event response
|
|
345
364
|
* */
|
|
346
365
|
updateCalendarEvent: function updateCalendarEvent(id, data, query) {
|
|
347
|
-
var
|
|
366
|
+
var _this9 = this;
|
|
348
367
|
return _calendarEncrypt.default.encryptCalendarEventRequest(this, data).then(function () {
|
|
349
|
-
return
|
|
368
|
+
return _this9.request({
|
|
350
369
|
method: 'PATCH',
|
|
351
370
|
service: 'calendar',
|
|
352
371
|
body: data,
|
|
@@ -391,14 +410,14 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
391
410
|
* @returns {Promise} Resolves with a decrypted scheduler data
|
|
392
411
|
* */
|
|
393
412
|
getSchedulerData: function getSchedulerData(query) {
|
|
394
|
-
var
|
|
413
|
+
var _this10 = this;
|
|
395
414
|
return this.request({
|
|
396
415
|
method: 'GET',
|
|
397
416
|
service: 'calendar',
|
|
398
417
|
resource: 'schedulerData',
|
|
399
418
|
qs: query || {}
|
|
400
419
|
}).then(function (response) {
|
|
401
|
-
return _calendarDecrypt.default.decryptSchedulerDataResponse(
|
|
420
|
+
return _calendarDecrypt.default.decryptSchedulerDataResponse(_this10, response.body).then(function () {
|
|
402
421
|
return response;
|
|
403
422
|
});
|
|
404
423
|
});
|
|
@@ -410,9 +429,9 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
410
429
|
* @returns {Promise} Resolves with a decrypted response
|
|
411
430
|
* */
|
|
412
431
|
getFreeBusy: function getFreeBusy(data, query) {
|
|
413
|
-
var
|
|
432
|
+
var _this11 = this;
|
|
414
433
|
return _calendarEncrypt.default.encryptFreeBusyRequest(this, data).then(function () {
|
|
415
|
-
return
|
|
434
|
+
return _this11.request({
|
|
416
435
|
method: 'POST',
|
|
417
436
|
service: 'calendar',
|
|
418
437
|
body: data,
|
|
@@ -421,7 +440,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
421
440
|
});
|
|
422
441
|
}).then(function () {
|
|
423
442
|
return new _promise.default(function (resolve, reject) {
|
|
424
|
-
|
|
443
|
+
_this11.rpcEventRequests[data.requestId] = {
|
|
425
444
|
resolve: resolve,
|
|
426
445
|
reject: reject
|
|
427
446
|
};
|
|
@@ -430,7 +449,7 @@ var Calendar = _webexCore.WebexPlugin.extend({
|
|
|
430
449
|
throw error;
|
|
431
450
|
});
|
|
432
451
|
},
|
|
433
|
-
version: "3.0.0-beta.
|
|
452
|
+
version: "3.0.0-beta.324"
|
|
434
453
|
});
|
|
435
454
|
var _default = Calendar;
|
|
436
455
|
exports.default = _default;
|
package/dist/calendar.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Calendar","WebexPlugin","extend","namespace","registered","rpcEventRequests","encryptionKeyUrl","initialize","listenToOnce","webex","internal","encryption","kms","createUnboundKeys","count","then","keys","key","uri","logger","info","getKey","onBehalfOf","retrievedKey","register","canAuthorize","error","reject","Error","resolve","device","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","message","unregister","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","_handleFreeBusy","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","DecryptHelper","decryptFreeBusyResponse","response","calendarFreeBusyScheduleResponse","requestId","log","syncCalendar","options","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","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedParticipants","push","notesResponse","all","createCalendarEvent","query","EncryptHelper","encryptCalendarEventRequest","updateCalendarEvent","deleteCalendarEvent","getSchedulerData","decryptSchedulerDataResponse","getFreeBusy","encryptFreeBusyRequest"],"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 * 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 * @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 // Pre-fetch a KMS encryption key url to improve performance\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 /**\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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"}
|
|
1
|
+
{"version":3,"names":["Calendar","WebexPlugin","extend","namespace","registered","rpcEventRequests","encryptionKeyUrl","prefetchEncryptionKey","webex","canAuthorize","listenToOnce","credentials","isUnverifiedGuest","internal","encryption","kms","createUnboundKeys","count","then","keys","key","uri","logger","info","getKey","onBehalfOf","retrievedKey","initialize","register","error","reject","Error","resolve","device","mercury","connect","listenForEvents","trigger","CALENDAR_REGISTERED","catch","message","unregister","stopListeningForEvents","disconnect","CALENDAR_UNREGISTERED","on","envelope","_handleCreate","data","_handleUpdate","_handleDelete","_handleFreeBusy","off","id","CalendarCollection","set","calendarMeetingExternal","CALENDAR_UPDATED","get","CALENDAR_CREATE","item","remove","CALENDAR_DELETE","DecryptHelper","decryptFreeBusyResponse","response","calendarFreeBusyScheduleResponse","requestId","log","syncCalendar","options","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","qs","meetingObjects","body","items","promises","forEach","meeting","encryptedParticipants","push","notesResponse","all","createCalendarEvent","query","EncryptHelper","encryptCalendarEventRequest","updateCalendarEvent","deleteCalendarEvent","getSchedulerData","decryptSchedulerDataResponse","getFreeBusy","encryptFreeBusyRequest"],"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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"}
|
package/package.json
CHANGED
|
@@ -19,19 +19,19 @@
|
|
|
19
19
|
"envify"
|
|
20
20
|
]
|
|
21
21
|
},
|
|
22
|
-
"version": "3.0.0-beta.
|
|
22
|
+
"version": "3.0.0-beta.324",
|
|
23
23
|
"devDependencies": {
|
|
24
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
25
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
26
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
27
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
24
|
+
"@webex/test-helper-chai": "3.0.0-beta.324",
|
|
25
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.324",
|
|
26
|
+
"@webex/test-helper-retry": "3.0.0-beta.324",
|
|
27
|
+
"@webex/test-helper-test-users": "3.0.0-beta.324",
|
|
28
28
|
"sinon": "^9.2.4"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
32
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
33
|
-
"@webex/internal-plugin-encryption": "3.0.0-beta.
|
|
34
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
31
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.324",
|
|
32
|
+
"@webex/internal-plugin-device": "3.0.0-beta.324",
|
|
33
|
+
"@webex/internal-plugin-encryption": "3.0.0-beta.324",
|
|
34
|
+
"@webex/webex-core": "3.0.0-beta.324",
|
|
35
35
|
"lodash": "^4.17.21",
|
|
36
36
|
"uuid": "^3.3.2"
|
|
37
37
|
}
|
package/src/calendar.js
CHANGED
|
@@ -78,30 +78,52 @@ const Calendar = WebexPlugin.extend({
|
|
|
78
78
|
* */
|
|
79
79
|
encryptionKeyUrl: null,
|
|
80
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
|
+
|
|
81
113
|
/**
|
|
82
114
|
* WebexPlugin initialize method. This triggers once Webex has completed its
|
|
83
115
|
* initialization workflow.
|
|
84
116
|
*
|
|
85
117
|
* If the plugin is meant to perform startup actions, place them in this
|
|
86
118
|
* `initialize()` method instead of the `constructor()` method.
|
|
119
|
+
* @private
|
|
87
120
|
* @returns {void}
|
|
88
121
|
*/
|
|
89
122
|
initialize() {
|
|
90
123
|
// Used to perform actions after webex is fully qualified and ready for
|
|
91
124
|
// operation.
|
|
92
125
|
this.listenToOnce(this.webex, 'ready', () => {
|
|
93
|
-
|
|
94
|
-
this.webex.internal.encryption.kms.createUnboundKeys({count: 1}).then((keys) => {
|
|
95
|
-
const key = isArray(keys) ? keys[0] : keys;
|
|
96
|
-
this.encryptionKeyUrl = key ? key.uri : null;
|
|
97
|
-
this.logger.info('calendar->bind a KMS encryption key url');
|
|
98
|
-
this.webex.internal.encryption
|
|
99
|
-
.getKey(this.encryptionKeyUrl, {onBehalfOf: null})
|
|
100
|
-
.then((retrievedKey) => {
|
|
101
|
-
this.encryptionKeyUrl = retrievedKey ? retrievedKey.uri : null;
|
|
102
|
-
this.logger.info('calendar->retrieve the KMS encryption key url and cache it');
|
|
103
|
-
});
|
|
104
|
-
});
|
|
126
|
+
this.prefetchEncryptionKey();
|
|
105
127
|
});
|
|
106
128
|
},
|
|
107
129
|
|
|
@@ -58,6 +58,55 @@ describe('internal-plugin-calendar', () => {
|
|
|
58
58
|
};
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
+
describe('Private API', () => {
|
|
62
|
+
describe('#prefetchEncryptionKey', () => {
|
|
63
|
+
it('waits for the ability to authorize before doing anything', () => {
|
|
64
|
+
webex.canAuthorize = false;
|
|
65
|
+
|
|
66
|
+
webex.internal.calendar.prefetchEncryptionKey();
|
|
67
|
+
|
|
68
|
+
assert.notCalled(webex.internal.encryption.kms.createUnboundKeys);
|
|
69
|
+
|
|
70
|
+
// Behaviour when the user can authorize is tested elsewhere, so just ensure it gets called again
|
|
71
|
+
const prefetchEncryptionKeyStub = sinon.stub(webex.internal.calendar, 'prefetchEncryptionKey');
|
|
72
|
+
|
|
73
|
+
webex.trigger('change:canAuthorize');
|
|
74
|
+
|
|
75
|
+
assert.calledOnce(prefetchEncryptionKeyStub);
|
|
76
|
+
assert.calledWith(prefetchEncryptionKeyStub);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('does nothing when the current user is an unverified guest', () => {
|
|
80
|
+
webex.credentials.isUnverifiedGuest = true;
|
|
81
|
+
|
|
82
|
+
webex.internal.calendar.prefetchEncryptionKey();
|
|
83
|
+
|
|
84
|
+
assert.notCalled(webex.internal.encryption.kms.createUnboundKeys);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('creates an encryption key when the current user can authorize', () => {
|
|
88
|
+
webex.internal.calendar.prefetchEncryptionKey();
|
|
89
|
+
|
|
90
|
+
assert.calledOnce(webex.internal.encryption.kms.createUnboundKeys);
|
|
91
|
+
assert.calledWith(webex.internal.encryption.kms.createUnboundKeys, {count: 1});
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
describe('#initialize', () => {
|
|
96
|
+
it('adds relevant handlers when webex is ready', () => {
|
|
97
|
+
const prefetchEncryptionKeyStub = sinon.stub(webex.internal.calendar, 'prefetchEncryptionKey');
|
|
98
|
+
|
|
99
|
+
assert.notCalled(prefetchEncryptionKeyStub);
|
|
100
|
+
|
|
101
|
+
// Initialize should have already run, so there should be an event handler already
|
|
102
|
+
webex.trigger('ready');
|
|
103
|
+
|
|
104
|
+
assert.calledOnce(prefetchEncryptionKeyStub);
|
|
105
|
+
assert.calledWith(prefetchEncryptionKeyStub);
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
61
110
|
describe('Public Api Contract', () => {
|
|
62
111
|
describe('#register()', () => {
|
|
63
112
|
it('on calendar register call mercury registration', async () => {
|