@webex/internal-plugin-board 3.12.0-next.6 → 3.12.0-next.61
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/board.js +46 -5
- package/dist/board.js.map +1 -1
- package/dist/realtime.js +1 -1
- package/package.json +13 -13
- package/src/board.js +53 -9
- package/test/unit/spec/board.js +167 -3
package/dist/board.js
CHANGED
|
@@ -15,6 +15,7 @@ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/pr
|
|
|
15
15
|
var _deleteProperty = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/reflect/delete-property"));
|
|
16
16
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
17
17
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/slicedToArray"));
|
|
18
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
|
18
19
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
19
20
|
var _querystring = _interopRequireDefault(require("querystring"));
|
|
20
21
|
var _webexCore = require("@webex/webex-core");
|
|
@@ -123,12 +124,19 @@ var Board = _webexCore.WebexPlugin.extend({
|
|
|
123
124
|
* @returns {Promise<Board~Channel>}
|
|
124
125
|
*/
|
|
125
126
|
createChannel: function createChannel(conversation, channel) {
|
|
126
|
-
|
|
127
|
+
var params = {
|
|
127
128
|
method: 'POST',
|
|
128
|
-
api: 'board',
|
|
129
129
|
resource: '/channels',
|
|
130
130
|
body: this._prepareChannel(conversation, channel)
|
|
131
|
-
}
|
|
131
|
+
};
|
|
132
|
+
var boardServiceUrl = this.getClusterBoardServiceUrl(conversation);
|
|
133
|
+
if (boardServiceUrl) {
|
|
134
|
+
params.uri = "".concat(boardServiceUrl).concat(params.resource);
|
|
135
|
+
delete params.resource;
|
|
136
|
+
} else {
|
|
137
|
+
params.api = 'board';
|
|
138
|
+
}
|
|
139
|
+
return this.webex.request(params).then(function (res) {
|
|
132
140
|
return res.body;
|
|
133
141
|
});
|
|
134
142
|
},
|
|
@@ -439,6 +447,33 @@ var Board = _webexCore.WebexPlugin.extend({
|
|
|
439
447
|
return res.body;
|
|
440
448
|
});
|
|
441
449
|
},
|
|
450
|
+
/**
|
|
451
|
+
* Resolve the board service url co-located with the conversation's ACL cluster.
|
|
452
|
+
* Board data lives in the cluster encoded by the ACL url; hitting the home board
|
|
453
|
+
* cluster instead triggers a cross-cluster 307 the browser cannot follow.
|
|
454
|
+
* @memberof Board.BoardService
|
|
455
|
+
* @param {Conversation~ConversationObject} conversation
|
|
456
|
+
* @returns {string|undefined} board API base url for the conversation's cluster
|
|
457
|
+
*/
|
|
458
|
+
getClusterBoardServiceUrl: function getClusterBoardServiceUrl() {
|
|
459
|
+
var _services$getServiceF;
|
|
460
|
+
var conversation = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
461
|
+
var aclUrl = conversation.aclUrl;
|
|
462
|
+
if (!aclUrl) {
|
|
463
|
+
return undefined;
|
|
464
|
+
}
|
|
465
|
+
var services = this.webex.internal.services;
|
|
466
|
+
var clusterId = services.getClusterId(aclUrl);
|
|
467
|
+
if (!clusterId) {
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// Swap the trailing service token (e.g. `acl-write`) for the board API token.
|
|
472
|
+
var boardClusterId = [].concat((0, _toConsumableArray2.default)(clusterId.split(':').slice(0, -1)), ['board']).join(':');
|
|
473
|
+
return (_services$getServiceF = services.getServiceFromClusterId({
|
|
474
|
+
clusterId: boardClusterId
|
|
475
|
+
})) === null || _services$getServiceF === void 0 ? void 0 : _services$getServiceF.url;
|
|
476
|
+
},
|
|
442
477
|
/**
|
|
443
478
|
* Gets Channels
|
|
444
479
|
* @memberof Board.BoardService
|
|
@@ -455,13 +490,19 @@ var Board = _webexCore.WebexPlugin.extend({
|
|
|
455
490
|
return _promise.default.reject(new Error('`conversation` is required'));
|
|
456
491
|
}
|
|
457
492
|
var params = {
|
|
458
|
-
api: 'board',
|
|
459
493
|
resource: '/channels',
|
|
460
494
|
qs: {
|
|
461
495
|
aclUrlLink: conversation.aclUrl
|
|
462
496
|
}
|
|
463
497
|
};
|
|
464
498
|
(0, _lodash.assign)(params.qs, (0, _lodash.pick)(options, 'channelsLimit', 'type'));
|
|
499
|
+
var boardServiceUrl = this.getClusterBoardServiceUrl(conversation);
|
|
500
|
+
if (boardServiceUrl) {
|
|
501
|
+
params.uri = "".concat(boardServiceUrl).concat(params.resource);
|
|
502
|
+
delete params.resource;
|
|
503
|
+
} else {
|
|
504
|
+
params.api = 'board';
|
|
505
|
+
}
|
|
465
506
|
return this.request(params).then(function (res) {
|
|
466
507
|
return new _webexCore.Page(res, _this0.webex);
|
|
467
508
|
});
|
|
@@ -724,7 +765,7 @@ var Board = _webexCore.WebexPlugin.extend({
|
|
|
724
765
|
return _promise.default.resolve([]);
|
|
725
766
|
});
|
|
726
767
|
},
|
|
727
|
-
version: "3.12.0-next.
|
|
768
|
+
version: "3.12.0-next.61"
|
|
728
769
|
});
|
|
729
770
|
var _default = exports.default = Board;
|
|
730
771
|
//# sourceMappingURL=board.js.map
|
package/dist/board.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_querystring","_interopRequireDefault","require","_webexCore","_es6PromiseSeries","_lodash","_realtime","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","Board","WebexPlugin","extend","namespace","children","realtime","Realtime","addContent","channel","contents","_this","chunks","chunk","config","numberContentsPerPageForAdd","promiseSeries","map","part","_addContentChunk","bind","addImage","image","metadata","_this2","webex","internal","board","_uploadImage","then","scr","type","file","mimeType","size","url","loc","setSnapshotImage","_this3","imageScr","hiddenSpace","encryption","encryptScr","defaultEncryptionKeyUrl","encryptedScr","imageBody","height","width","encryptionKeyUrl","fileSize","request","method","uri","channelUrl","body","res","createChannel","conversation","api","resource","_prepareChannel","undefined","results","aclUrlLink","aclUrl","kmsMessage","userIds","keyUris","kmsResourceObjectUrl","deleteChannel","_this4","options","aclLinkType","linkedAcl","concat","kmsResourceUrl","querystring","stringify","authId","aclLinkOperation","promise","_promise","resolve","preventDeleteActiveChannel","lockChannelForDeletion","qs","intent","keepActive","decryptContents","_this5","all","items","content","decryptPromise","decryptSingleFileContent","decryptSingleContent","payload","_deleteProperty","defaults","encryptedData","decryptText","JSON","parse","encryptedContent","_this6","decryptScr","decryptedMetadata","displayName","error","deleteAllContent","deletePartialContent","contentsToKeep","pick","clearBoard","encryptContents","_this7","encryptionPromise","contentType","encryptSingleFileContent","encryptSingleContent","assign","device","deviceType","encryptText","_stringify","_this8","encryptedMetadata","getContents","_this9","params","contentsLimit","numberContentsPerPageForGet","Page","getChannel","getChannels","_this0","reject","Error","ping","processActivityEvent","message","decryptionPromise","envelope","decryptedData","register","data","registerToShareMercury","_this1","feature","getFeature","isSharingMercuryFeatureEnabled","mercury","localClusterServiceUrls","webSocketUrl","mercuryConnectionServiceClusterUrl","action","unregisterFromSharedMercury","binding","contentChunk","_this10","_this11","encryptBinary","_ref","cdata","_uploadImageToWebexFiles","_ref2","_ref3","_slicedToArray2","downloadUrl","_getSpaceUrl","requestUri","spaceUrl","_this12","byteLength","upload","transcode","phases","initialize","$url","session","uploadUrl","finalize","$uri","finishUploadUrl","authorizeMediaInjector","_this13","kms","prepareRequest","resourceUri","anonymous","wrapped","decryptKmsMessage","kmsResponse","decryptedKmsMessage","authorizations","bearer","catch","err","unauthorizeMediaInjector","_this14","listAuthorizations","kroUri","promises","auth","removeAuthorization","responses","version","_default","exports"],"sources":["board.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2022 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\n\nimport {WebexPlugin, Page} from '@webex/webex-core';\nimport promiseSeries from 'es6-promise-series';\nimport {assign, defaults, chunk, pick} from 'lodash';\n\nimport Realtime from './realtime';\n\nconst Board = WebexPlugin.extend({\n namespace: 'Board',\n\n children: {\n realtime: Realtime,\n },\n\n /**\n * Adds Content to a Channel\n * If contents length is greater than config.board.numberContentsPerPageForAdd, this method\n * will break contents into chunks and make multiple GET request to the\n * board service\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Array} contents - Array of {@link Board~Content} objects\n * @returns {Promise<Board~Content>}\n */\n addContent(channel, contents) {\n let chunks = [];\n\n chunks = chunk(contents, this.config.numberContentsPerPageForAdd);\n\n // we want the first promise to resolve before continuing with the next\n // chunk or else we'll have race conditions among patches\n return promiseSeries(chunks.map((part) => this._addContentChunk.bind(this, channel, part)));\n },\n\n /**\n * Adds Image to a Channel\n * Uploads image to webex files and adds SCR + downloadUrl to the persistence\n * service\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {File} image - image to be uploaded\n * @param {Object} metadata - metadata such as displayName\n * @returns {Promise<Board~Content>}\n */\n addImage(channel, image, metadata) {\n return this.webex.internal.board._uploadImage(channel, image).then((scr) =>\n this.webex.internal.board.addContent(channel, [\n {\n type: 'FILE',\n metadata,\n file: {\n mimeType: image.type,\n scr,\n size: image.size,\n url: scr.loc,\n },\n },\n ])\n );\n },\n\n /**\n * Set a snapshot image for a board\n *\n * @param {Board~Channel} channel\n * @param {File} image\n * @returns {Promise<Board~Channel>}\n */\n setSnapshotImage(channel, image) {\n let imageScr;\n\n return this.webex.internal.board\n ._uploadImage(channel, image, {hiddenSpace: true})\n .then((scr) => {\n imageScr = scr;\n\n return this.webex.internal.encryption.encryptScr(channel.defaultEncryptionKeyUrl, imageScr);\n })\n .then((encryptedScr) => {\n imageScr.encryptedScr = encryptedScr;\n\n return encryptedScr;\n })\n .then(() => {\n const imageBody = {\n image: {\n url: imageScr.loc,\n height: image.height || 900,\n width: image.width || 1600,\n mimeType: image.type || 'image/png',\n scr: imageScr.encryptedScr,\n encryptionKeyUrl: channel.defaultEncryptionKeyUrl,\n fileSize: image.size,\n },\n };\n\n return this.webex.request({\n method: 'PATCH',\n uri: channel.channelUrl,\n body: imageBody,\n });\n })\n .then((res) => res.body);\n },\n\n /**\n * Creates a Channel\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Channel>}\n */\n createChannel(conversation, channel) {\n return this.webex\n .request({\n method: 'POST',\n api: 'board',\n resource: '/channels',\n body: this._prepareChannel(conversation, channel),\n })\n .then((res) => res.body);\n },\n\n /**\n * Prepare a create request body to the board services based on the provided\n * conversation and channel.\n *\n * @param {Conversation} conversation - Conversation object.\n * @param {Channel} channel - Channel Object\n * @returns {Object} - Create channel request body.\n */\n _prepareChannel(conversation = {}, channel = {}) {\n const results = {\n aclUrlLink: conversation.aclUrl,\n kmsMessage: {\n method: 'create',\n uri: '/resources',\n userIds: [],\n keyUris: [],\n },\n ...channel,\n };\n\n if (conversation.kmsResourceObjectUrl) {\n results.kmsMessage.userIds.push(conversation.kmsResourceObjectUrl);\n }\n\n return results;\n },\n\n /**\n * Deletes a Channel from a Conversation\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Board~Channel} channel\n * @param {Object} options\n * @param {Object} options.preventDeleteActiveChannel Returns error if channel is in use\n * @returns {Promise}\n */\n deleteChannel(conversation, channel, options = {}) {\n // remove the ACL link between conversation and board\n // remove conversation auth from board KRO in kms message\n const body = {\n aclLinkType: 'INCOMING',\n linkedAcl: conversation.aclUrl,\n kmsMessage: {\n method: 'delete',\n uri: `${channel.kmsResourceUrl}/authorizations?${querystring.stringify({\n authId: conversation.kmsResourceObjectUrl,\n })}`,\n },\n aclLinkOperation: 'DELETE',\n };\n\n let promise = Promise.resolve();\n\n if (options.preventDeleteActiveChannel) {\n promise = this.lockChannelForDeletion(channel);\n }\n\n return promise\n .then(() =>\n this.webex.request({\n method: 'PUT',\n uri: `${channel.aclUrl}/links`,\n body,\n })\n )\n .then((res) => res.body);\n },\n\n /**\n * Locks and marks a channel for deletion\n * If a channel is being used, it will return 409 - Conflict\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise}\n */\n lockChannelForDeletion(channel) {\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/lock`,\n qs: {\n intent: 'delete',\n },\n })\n .then((res) => res.body);\n },\n\n /**\n * Keeps a channel as 'active' to prevent other people from deleting it\n * @param {Board~Channel} channel\n * @returns {Promise}\n */\n keepActive(channel) {\n return this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/keepAlive`,\n });\n },\n\n /**\n * Decrypts a collection of content objects\n *\n * @memberof Board.BoardService\n * @param {Array} contents curves, text, and images\n * @returns {Promise<Array>} Resolves with an array of {@link Board~Content} objects.\n */\n decryptContents(contents) {\n return Promise.all(\n contents.items.map((content) => {\n let decryptPromise;\n\n if (content.type === 'FILE') {\n decryptPromise = this.decryptSingleFileContent(content.encryptionKeyUrl, content);\n } else {\n decryptPromise = this.decryptSingleContent(content.encryptionKeyUrl, content.payload);\n }\n\n return decryptPromise.then((res) => {\n Reflect.deleteProperty(content, 'payload');\n Reflect.deleteProperty(content, 'encryptionKeyUrl');\n\n return defaults(res, content);\n });\n })\n );\n },\n\n /**\n * Decryts a single STRING content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {string} encryptedData\n * @returns {Promise<Board~Content>}\n */\n decryptSingleContent(encryptionKeyUrl, encryptedData) {\n return this.webex.internal.encryption\n .decryptText(encryptionKeyUrl, encryptedData)\n .then((res) => JSON.parse(res));\n },\n\n /**\n * Decryts a single FILE content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {object} encryptedContent {file, payload}\n * @returns {Promise<Board~Content>}\n */\n decryptSingleFileContent(encryptionKeyUrl, encryptedContent) {\n let metadata;\n\n if (encryptedContent.payload) {\n metadata = encryptedContent.payload;\n }\n\n return this.webex.internal.encryption\n .decryptScr(encryptionKeyUrl, encryptedContent.file.scr)\n .then((scr) => {\n encryptedContent.file.scr = scr;\n if (metadata) {\n return this.webex.internal.encryption.decryptText(encryptionKeyUrl, metadata);\n }\n\n return '';\n })\n .then((decryptedMetadata) => {\n try {\n encryptedContent.metadata = JSON.parse(decryptedMetadata);\n if (encryptedContent.metadata.displayName) {\n encryptedContent.displayName = encryptedContent.metadata.displayName;\n }\n } catch (error) {\n encryptedContent.metadata = {};\n }\n\n return encryptedContent;\n });\n },\n\n /**\n * Deletes all Content from a Channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise} Resolves with an content response\n */\n deleteAllContent(channel) {\n return this.webex\n .request({\n method: 'DELETE',\n uri: `${channel.channelUrl}/contents`,\n })\n .then((res) => res.body);\n },\n\n /**\n * Deletes Contents from a Channel except the ones listed in contentsToKeep\n *\n * THIS API HAS CHANGED!!! SEE SPARK-412694. NEEDS UPDATING.\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Array<Board~Content>} contentsToKeep Array of board objects (curves, text, and images) with valid contentId (received from server)\n * @returns {Promise} Resolves with an content response\n */\n deletePartialContent(channel, contentsToKeep) {\n const body = contentsToKeep.map((content) => pick(content, 'contentId'));\n\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/contents`,\n body,\n qs: {\n clearBoard: true,\n },\n })\n .then((res) => res.body);\n },\n\n /**\n * Encrypts a collection of content\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl channel.defaultEncryptionKeyUrl\n * @param {Array} contents Array of {@link Board~Content} objects. (curves, text, and images)\n * @returns {Promise<Array>} Resolves with an array of encrypted {@link Board~Content} objects.\n */\n encryptContents(encryptionKeyUrl, contents) {\n return Promise.all(\n contents.map((content) => {\n let encryptionPromise;\n let contentType = 'STRING';\n\n // the existence of an scr will determine if the content is a FILE.\n if (content.file) {\n contentType = 'FILE';\n encryptionPromise = this.encryptSingleFileContent(encryptionKeyUrl, content);\n } else {\n encryptionPromise = this.encryptSingleContent(encryptionKeyUrl, content);\n }\n\n return encryptionPromise.then((res) =>\n assign(\n {\n device: this.webex.internal.device.deviceType,\n type: contentType,\n encryptionKeyUrl,\n },\n pick(res, 'file', 'payload')\n )\n );\n })\n );\n },\n\n /**\n * Encrypts a single STRING content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {Board~Content} content\n * @returns {Promise<Board~Content>}\n */\n encryptSingleContent(encryptionKeyUrl, content) {\n return this.webex.internal.encryption\n .encryptText(encryptionKeyUrl, JSON.stringify(content))\n .then((res) => ({\n payload: res,\n encryptionKeyUrl,\n }));\n },\n\n /**\n * Encrypts a single FILE content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {Board~Content} content\n * @returns {Promise<Board~Content>}\n */\n encryptSingleFileContent(encryptionKeyUrl, content) {\n return this.webex.internal.encryption\n .encryptScr(encryptionKeyUrl, content.file.scr)\n .then((encryptedScr) => {\n content.file.scr = encryptedScr;\n if (content.displayName) {\n content.metadata = assign(content.metadata, {displayName: content.displayName});\n }\n if (content.metadata) {\n return this.webex.internal.encryption\n .encryptText(encryptionKeyUrl, JSON.stringify(content.metadata))\n .then((encryptedMetadata) => {\n content.metadata = encryptedMetadata;\n });\n }\n\n return content;\n })\n .then(() => ({\n file: content.file,\n payload: content.metadata,\n encryptionKeyUrl,\n }));\n },\n\n /**\n * Retrieves contents from a specified channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Object} options\n * @param {Object} options.qs\n * @returns {Promise<Page<Board~Channel>>} Resolves with an array of Content items\n */\n getContents(channel, options) {\n options = options || {};\n\n const params = {\n uri: `${channel.channelUrl}/contents`,\n qs: {\n contentsLimit: this.config.numberContentsPerPageForGet,\n },\n };\n\n assign(params.qs, pick(options, 'contentsLimit'));\n\n return this.request(params).then((res) => new Page(res, this.webex));\n },\n\n /**\n * Gets a Channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Channel>}\n */\n getChannel(channel) {\n return this.webex\n .request({\n method: 'GET',\n uri: channel.channelUrl,\n })\n .then((res) => res.body);\n },\n\n /**\n * Gets Channels\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Object} options\n * @param {number} options.channelsLimit number of boards to return per page\n * @param {number} options.type type of whiteboard: whiteboard or annotated\n * @returns {Promise<Page<Board~Channel>>} Resolves with an array of Channel items\n */\n getChannels(conversation, options) {\n options = options || {};\n\n if (!conversation) {\n return Promise.reject(new Error('`conversation` is required'));\n }\n\n const params = {\n api: 'board',\n resource: '/channels',\n qs: {\n aclUrlLink: conversation.aclUrl,\n },\n };\n\n assign(params.qs, pick(options, 'channelsLimit', 'type'));\n\n return this.request(params).then((res) => new Page(res, this.webex));\n },\n\n /**\n * Pings persistence\n * @memberof Board.BoardService\n * @returns {Promise<Object>} ping response body\n */\n ping() {\n return this.webex\n .request({\n method: 'GET',\n api: 'board',\n resource: '/ping',\n })\n .then((res) => res.body);\n },\n\n processActivityEvent(message) {\n let decryptionPromise;\n\n if (message.contentType === 'FILE') {\n decryptionPromise = this.decryptSingleFileContent(\n message.envelope.encryptionKeyUrl,\n message.payload\n );\n } else {\n decryptionPromise = this.decryptSingleContent(\n message.envelope.encryptionKeyUrl,\n message.payload\n );\n }\n\n return decryptionPromise.then((decryptedData) => {\n // call the event handlers\n message.payload = decryptedData;\n\n return message;\n });\n },\n\n /**\n * Registers with Mercury\n * @memberof Board.BoardService\n * @param {Object} data - Mercury bindings\n * @returns {Promise<Board~Registration>}\n */\n register(data) {\n return this.webex\n .request({\n method: 'POST',\n api: 'board',\n resource: '/registrations',\n body: data,\n })\n .then((res) => res.body);\n },\n\n /**\n * Registers with Mercury for sharing web socket\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Registration>}\n */\n registerToShareMercury(channel) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-shared-mercury')\n .then((isSharingMercuryFeatureEnabled) => {\n if (!this.webex.internal.mercury.localClusterServiceUrls) {\n return Promise.reject(\n new Error('`localClusterServiceUrls` is not defined, make sure mercury is connected')\n );\n }\n if (!isSharingMercuryFeatureEnabled) {\n return Promise.reject(new Error('`web-shared-mercury` is not enabled'));\n }\n\n const {webSocketUrl} = this.webex.internal.device;\n const {mercuryConnectionServiceClusterUrl} =\n this.webex.internal.mercury.localClusterServiceUrls;\n\n const data = {\n mercuryConnectionServiceClusterUrl,\n webSocketUrl,\n action: 'ADD',\n };\n\n return this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/register`,\n body: data,\n });\n })\n .then((res) => res.body);\n },\n\n /**\n * Remove board binding from existing mercury connection\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {String} binding - the binding as provided in board registration\n * @returns {Promise<Board~Registration>}\n */\n unregisterFromSharedMercury(channel, binding) {\n const {webSocketUrl} = this.webex.internal.device;\n const data = {\n binding,\n webSocketUrl,\n action: 'REMOVE',\n };\n\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/register`,\n body: data,\n })\n .then((res) => res.body);\n },\n\n _addContentChunk(channel, contentChunk) {\n return this.webex.internal.board\n .encryptContents(channel.defaultEncryptionKeyUrl, contentChunk)\n .then((res) =>\n this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/contents`,\n body: res,\n })\n )\n .then((res) => res.body);\n },\n\n /**\n * Encrypts and uploads image to WebexFiles\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {File} file - File to be uploaded\n * @param {Object} options\n * @param {Object} options.hiddenSpace - true for hidden, false for open space\n * @private\n * @returns {Object} Encrypted Scr and KeyUrl\n */\n _uploadImage(channel, file, options) {\n options = options || {};\n\n return this.webex.internal.encryption\n .encryptBinary(file)\n .then(({scr, cdata}) =>\n Promise.all([scr, this._uploadImageToWebexFiles(channel, cdata, options.hiddenSpace)])\n )\n .then(([scr, res]) => assign(scr, {loc: res.downloadUrl}));\n },\n\n _getSpaceUrl(channel, hiddenSpace) {\n let requestUri = `${channel.channelUrl}/spaces/open`;\n\n if (hiddenSpace) {\n requestUri = `${channel.channelUrl}/spaces/hidden`;\n }\n\n return this.webex\n .request({\n method: 'PUT',\n uri: requestUri,\n })\n .then((res) => res.body.spaceUrl);\n },\n\n _uploadImageToWebexFiles(channel, file, hiddenSpace) {\n const fileSize = file.length || file.size || file.byteLength;\n\n return this._getSpaceUrl(channel, hiddenSpace).then((spaceUrl) =>\n this.webex.upload({\n uri: `${spaceUrl}/upload_sessions`,\n file,\n qs: {\n transcode: true,\n },\n phases: {\n initialize: {fileSize},\n upload: {\n $url(session) {\n return session.uploadUrl;\n },\n },\n finalize: {\n $uri(session) {\n return session.finishUploadUrl;\n },\n body: {fileSize},\n },\n },\n })\n );\n },\n\n /** Authorize transcoder (for sharing whiteboard to mobile)\n *\n * @param {Board~Channel} board\n * @memberof Board.BoardService\n * @returns {String} authorization\n */\n authorizeMediaInjector(board) {\n if (!board) {\n Promise.reject(\n new Error('#authorizeMediaInjector --> cannot authorize transcoder without board')\n );\n }\n\n return this.webex.internal.encryption.kms\n .prepareRequest({\n method: 'create',\n uri: '/authorizations',\n resourceUri: board.kmsResourceUrl,\n anonymous: 1,\n })\n .then((request) =>\n this.webex.request({\n uri: `${board.channelUrl}/sharePolicies/transcoder`,\n method: 'PUT',\n body: {kmsMessage: request.wrapped},\n })\n )\n .then((res) => this.webex.internal.encryption.kms.decryptKmsMessage(res.body.kmsResponse))\n .then((decryptedKmsMessage) => {\n if (decryptedKmsMessage?.authorizations.length > 0) {\n return decryptedKmsMessage.authorizations[0].bearer;\n }\n\n return undefined;\n })\n .catch((err) =>\n /* We want to resolve any errors so that whiteboard share will still work\n * except mobile being able to receive the share\n */\n Promise.resolve(err)\n );\n },\n\n /** Unauthorize transcoder (for stopping whiteboard share to mobile)\n *\n * @param {Board~Channel} board\n * @memberof Board.BoardService\n * @returns {Array} list of authIds removed\n */\n unauthorizeMediaInjector(board) {\n if (!board) {\n Promise.reject(\n new Error('#unauthorizeMediaInjector --> cannot unauthorize transcoder without board')\n );\n }\n\n return this.webex.internal.encryption.kms\n .listAuthorizations({\n kroUri: board.kmsResourceUrl,\n })\n .then((authorizations) => {\n /* Attempt to remove the authorization made from starting whiteboard share\n * Also removing any previous authorizations that were not cleared\n */\n const promises = authorizations.map((auth) => {\n const {authId} = auth;\n\n return this.webex.internal.encryption.kms\n .removeAuthorization({\n authId,\n kroUri: board.kmsResourceUrl,\n })\n .then(() => Promise.resolve(authId))\n .catch((err) =>\n /* We don't want this to error out, otherwise the\n * Promise.all will not process the rest of the request\n */\n Promise.resolve(err)\n );\n });\n\n if (promises.length > 0) {\n return Promise.all(promises).then((responses) => responses);\n }\n\n return Promise.resolve([]);\n });\n },\n});\n\nexport default Board;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_querystring","_interopRequireDefault","require","_webexCore","_es6PromiseSeries","_lodash","_realtime","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","Board","WebexPlugin","extend","namespace","children","realtime","Realtime","addContent","channel","contents","_this","chunks","chunk","config","numberContentsPerPageForAdd","promiseSeries","map","part","_addContentChunk","bind","addImage","image","metadata","_this2","webex","internal","board","_uploadImage","then","scr","type","file","mimeType","size","url","loc","setSnapshotImage","_this3","imageScr","hiddenSpace","encryption","encryptScr","defaultEncryptionKeyUrl","encryptedScr","imageBody","height","width","encryptionKeyUrl","fileSize","request","method","uri","channelUrl","body","res","createChannel","conversation","params","resource","_prepareChannel","boardServiceUrl","getClusterBoardServiceUrl","concat","api","undefined","results","aclUrlLink","aclUrl","kmsMessage","userIds","keyUris","kmsResourceObjectUrl","deleteChannel","_this4","options","aclLinkType","linkedAcl","kmsResourceUrl","querystring","stringify","authId","aclLinkOperation","promise","_promise","resolve","preventDeleteActiveChannel","lockChannelForDeletion","qs","intent","keepActive","decryptContents","_this5","all","items","content","decryptPromise","decryptSingleFileContent","decryptSingleContent","payload","_deleteProperty","defaults","encryptedData","decryptText","JSON","parse","encryptedContent","_this6","decryptScr","decryptedMetadata","displayName","error","deleteAllContent","deletePartialContent","contentsToKeep","pick","clearBoard","encryptContents","_this7","encryptionPromise","contentType","encryptSingleFileContent","encryptSingleContent","assign","device","deviceType","encryptText","_stringify","_this8","encryptedMetadata","getContents","_this9","contentsLimit","numberContentsPerPageForGet","Page","getChannel","_services$getServiceF","services","clusterId","getClusterId","boardClusterId","_toConsumableArray2","split","slice","join","getServiceFromClusterId","getChannels","_this0","reject","Error","ping","processActivityEvent","message","decryptionPromise","envelope","decryptedData","register","data","registerToShareMercury","_this1","feature","getFeature","isSharingMercuryFeatureEnabled","mercury","localClusterServiceUrls","webSocketUrl","mercuryConnectionServiceClusterUrl","action","unregisterFromSharedMercury","binding","contentChunk","_this10","_this11","encryptBinary","_ref","cdata","_uploadImageToWebexFiles","_ref2","_ref3","_slicedToArray2","downloadUrl","_getSpaceUrl","requestUri","spaceUrl","_this12","byteLength","upload","transcode","phases","initialize","$url","session","uploadUrl","finalize","$uri","finishUploadUrl","authorizeMediaInjector","_this13","kms","prepareRequest","resourceUri","anonymous","wrapped","decryptKmsMessage","kmsResponse","decryptedKmsMessage","authorizations","bearer","catch","err","unauthorizeMediaInjector","_this14","listAuthorizations","kroUri","promises","auth","removeAuthorization","responses","version","_default","exports"],"sources":["board.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2022 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport querystring from 'querystring';\n\nimport {WebexPlugin, Page} from '@webex/webex-core';\nimport promiseSeries from 'es6-promise-series';\nimport {assign, defaults, chunk, pick} from 'lodash';\n\nimport Realtime from './realtime';\n\nconst Board = WebexPlugin.extend({\n namespace: 'Board',\n\n children: {\n realtime: Realtime,\n },\n\n /**\n * Adds Content to a Channel\n * If contents length is greater than config.board.numberContentsPerPageForAdd, this method\n * will break contents into chunks and make multiple GET request to the\n * board service\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Array} contents - Array of {@link Board~Content} objects\n * @returns {Promise<Board~Content>}\n */\n addContent(channel, contents) {\n let chunks = [];\n\n chunks = chunk(contents, this.config.numberContentsPerPageForAdd);\n\n // we want the first promise to resolve before continuing with the next\n // chunk or else we'll have race conditions among patches\n return promiseSeries(chunks.map((part) => this._addContentChunk.bind(this, channel, part)));\n },\n\n /**\n * Adds Image to a Channel\n * Uploads image to webex files and adds SCR + downloadUrl to the persistence\n * service\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {File} image - image to be uploaded\n * @param {Object} metadata - metadata such as displayName\n * @returns {Promise<Board~Content>}\n */\n addImage(channel, image, metadata) {\n return this.webex.internal.board._uploadImage(channel, image).then((scr) =>\n this.webex.internal.board.addContent(channel, [\n {\n type: 'FILE',\n metadata,\n file: {\n mimeType: image.type,\n scr,\n size: image.size,\n url: scr.loc,\n },\n },\n ])\n );\n },\n\n /**\n * Set a snapshot image for a board\n *\n * @param {Board~Channel} channel\n * @param {File} image\n * @returns {Promise<Board~Channel>}\n */\n setSnapshotImage(channel, image) {\n let imageScr;\n\n return this.webex.internal.board\n ._uploadImage(channel, image, {hiddenSpace: true})\n .then((scr) => {\n imageScr = scr;\n\n return this.webex.internal.encryption.encryptScr(channel.defaultEncryptionKeyUrl, imageScr);\n })\n .then((encryptedScr) => {\n imageScr.encryptedScr = encryptedScr;\n\n return encryptedScr;\n })\n .then(() => {\n const imageBody = {\n image: {\n url: imageScr.loc,\n height: image.height || 900,\n width: image.width || 1600,\n mimeType: image.type || 'image/png',\n scr: imageScr.encryptedScr,\n encryptionKeyUrl: channel.defaultEncryptionKeyUrl,\n fileSize: image.size,\n },\n };\n\n return this.webex.request({\n method: 'PATCH',\n uri: channel.channelUrl,\n body: imageBody,\n });\n })\n .then((res) => res.body);\n },\n\n /**\n * Creates a Channel\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Channel>}\n */\n createChannel(conversation, channel) {\n const params = {\n method: 'POST',\n resource: '/channels',\n body: this._prepareChannel(conversation, channel),\n };\n\n const boardServiceUrl = this.getClusterBoardServiceUrl(conversation);\n\n if (boardServiceUrl) {\n params.uri = `${boardServiceUrl}${params.resource}`;\n delete params.resource;\n } else {\n params.api = 'board';\n }\n\n return this.webex.request(params).then((res) => res.body);\n },\n\n /**\n * Prepare a create request body to the board services based on the provided\n * conversation and channel.\n *\n * @param {Conversation} conversation - Conversation object.\n * @param {Channel} channel - Channel Object\n * @returns {Object} - Create channel request body.\n */\n _prepareChannel(conversation = {}, channel = {}) {\n const results = {\n aclUrlLink: conversation.aclUrl,\n kmsMessage: {\n method: 'create',\n uri: '/resources',\n userIds: [],\n keyUris: [],\n },\n ...channel,\n };\n\n if (conversation.kmsResourceObjectUrl) {\n results.kmsMessage.userIds.push(conversation.kmsResourceObjectUrl);\n }\n\n return results;\n },\n\n /**\n * Deletes a Channel from a Conversation\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Board~Channel} channel\n * @param {Object} options\n * @param {Object} options.preventDeleteActiveChannel Returns error if channel is in use\n * @returns {Promise}\n */\n deleteChannel(conversation, channel, options = {}) {\n // remove the ACL link between conversation and board\n // remove conversation auth from board KRO in kms message\n const body = {\n aclLinkType: 'INCOMING',\n linkedAcl: conversation.aclUrl,\n kmsMessage: {\n method: 'delete',\n uri: `${channel.kmsResourceUrl}/authorizations?${querystring.stringify({\n authId: conversation.kmsResourceObjectUrl,\n })}`,\n },\n aclLinkOperation: 'DELETE',\n };\n\n let promise = Promise.resolve();\n\n if (options.preventDeleteActiveChannel) {\n promise = this.lockChannelForDeletion(channel);\n }\n\n return promise\n .then(() =>\n this.webex.request({\n method: 'PUT',\n uri: `${channel.aclUrl}/links`,\n body,\n })\n )\n .then((res) => res.body);\n },\n\n /**\n * Locks and marks a channel for deletion\n * If a channel is being used, it will return 409 - Conflict\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise}\n */\n lockChannelForDeletion(channel) {\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/lock`,\n qs: {\n intent: 'delete',\n },\n })\n .then((res) => res.body);\n },\n\n /**\n * Keeps a channel as 'active' to prevent other people from deleting it\n * @param {Board~Channel} channel\n * @returns {Promise}\n */\n keepActive(channel) {\n return this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/keepAlive`,\n });\n },\n\n /**\n * Decrypts a collection of content objects\n *\n * @memberof Board.BoardService\n * @param {Array} contents curves, text, and images\n * @returns {Promise<Array>} Resolves with an array of {@link Board~Content} objects.\n */\n decryptContents(contents) {\n return Promise.all(\n contents.items.map((content) => {\n let decryptPromise;\n\n if (content.type === 'FILE') {\n decryptPromise = this.decryptSingleFileContent(content.encryptionKeyUrl, content);\n } else {\n decryptPromise = this.decryptSingleContent(content.encryptionKeyUrl, content.payload);\n }\n\n return decryptPromise.then((res) => {\n Reflect.deleteProperty(content, 'payload');\n Reflect.deleteProperty(content, 'encryptionKeyUrl');\n\n return defaults(res, content);\n });\n })\n );\n },\n\n /**\n * Decryts a single STRING content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {string} encryptedData\n * @returns {Promise<Board~Content>}\n */\n decryptSingleContent(encryptionKeyUrl, encryptedData) {\n return this.webex.internal.encryption\n .decryptText(encryptionKeyUrl, encryptedData)\n .then((res) => JSON.parse(res));\n },\n\n /**\n * Decryts a single FILE content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {object} encryptedContent {file, payload}\n * @returns {Promise<Board~Content>}\n */\n decryptSingleFileContent(encryptionKeyUrl, encryptedContent) {\n let metadata;\n\n if (encryptedContent.payload) {\n metadata = encryptedContent.payload;\n }\n\n return this.webex.internal.encryption\n .decryptScr(encryptionKeyUrl, encryptedContent.file.scr)\n .then((scr) => {\n encryptedContent.file.scr = scr;\n if (metadata) {\n return this.webex.internal.encryption.decryptText(encryptionKeyUrl, metadata);\n }\n\n return '';\n })\n .then((decryptedMetadata) => {\n try {\n encryptedContent.metadata = JSON.parse(decryptedMetadata);\n if (encryptedContent.metadata.displayName) {\n encryptedContent.displayName = encryptedContent.metadata.displayName;\n }\n } catch (error) {\n encryptedContent.metadata = {};\n }\n\n return encryptedContent;\n });\n },\n\n /**\n * Deletes all Content from a Channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise} Resolves with an content response\n */\n deleteAllContent(channel) {\n return this.webex\n .request({\n method: 'DELETE',\n uri: `${channel.channelUrl}/contents`,\n })\n .then((res) => res.body);\n },\n\n /**\n * Deletes Contents from a Channel except the ones listed in contentsToKeep\n *\n * THIS API HAS CHANGED!!! SEE SPARK-412694. NEEDS UPDATING.\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Array<Board~Content>} contentsToKeep Array of board objects (curves, text, and images) with valid contentId (received from server)\n * @returns {Promise} Resolves with an content response\n */\n deletePartialContent(channel, contentsToKeep) {\n const body = contentsToKeep.map((content) => pick(content, 'contentId'));\n\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/contents`,\n body,\n qs: {\n clearBoard: true,\n },\n })\n .then((res) => res.body);\n },\n\n /**\n * Encrypts a collection of content\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl channel.defaultEncryptionKeyUrl\n * @param {Array} contents Array of {@link Board~Content} objects. (curves, text, and images)\n * @returns {Promise<Array>} Resolves with an array of encrypted {@link Board~Content} objects.\n */\n encryptContents(encryptionKeyUrl, contents) {\n return Promise.all(\n contents.map((content) => {\n let encryptionPromise;\n let contentType = 'STRING';\n\n // the existence of an scr will determine if the content is a FILE.\n if (content.file) {\n contentType = 'FILE';\n encryptionPromise = this.encryptSingleFileContent(encryptionKeyUrl, content);\n } else {\n encryptionPromise = this.encryptSingleContent(encryptionKeyUrl, content);\n }\n\n return encryptionPromise.then((res) =>\n assign(\n {\n device: this.webex.internal.device.deviceType,\n type: contentType,\n encryptionKeyUrl,\n },\n pick(res, 'file', 'payload')\n )\n );\n })\n );\n },\n\n /**\n * Encrypts a single STRING content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {Board~Content} content\n * @returns {Promise<Board~Content>}\n */\n encryptSingleContent(encryptionKeyUrl, content) {\n return this.webex.internal.encryption\n .encryptText(encryptionKeyUrl, JSON.stringify(content))\n .then((res) => ({\n payload: res,\n encryptionKeyUrl,\n }));\n },\n\n /**\n * Encrypts a single FILE content object\n * @memberof Board.BoardService\n * @param {string} encryptionKeyUrl\n * @param {Board~Content} content\n * @returns {Promise<Board~Content>}\n */\n encryptSingleFileContent(encryptionKeyUrl, content) {\n return this.webex.internal.encryption\n .encryptScr(encryptionKeyUrl, content.file.scr)\n .then((encryptedScr) => {\n content.file.scr = encryptedScr;\n if (content.displayName) {\n content.metadata = assign(content.metadata, {displayName: content.displayName});\n }\n if (content.metadata) {\n return this.webex.internal.encryption\n .encryptText(encryptionKeyUrl, JSON.stringify(content.metadata))\n .then((encryptedMetadata) => {\n content.metadata = encryptedMetadata;\n });\n }\n\n return content;\n })\n .then(() => ({\n file: content.file,\n payload: content.metadata,\n encryptionKeyUrl,\n }));\n },\n\n /**\n * Retrieves contents from a specified channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {Object} options\n * @param {Object} options.qs\n * @returns {Promise<Page<Board~Channel>>} Resolves with an array of Content items\n */\n getContents(channel, options) {\n options = options || {};\n\n const params = {\n uri: `${channel.channelUrl}/contents`,\n qs: {\n contentsLimit: this.config.numberContentsPerPageForGet,\n },\n };\n\n assign(params.qs, pick(options, 'contentsLimit'));\n\n return this.request(params).then((res) => new Page(res, this.webex));\n },\n\n /**\n * Gets a Channel\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Channel>}\n */\n getChannel(channel) {\n return this.webex\n .request({\n method: 'GET',\n uri: channel.channelUrl,\n })\n .then((res) => res.body);\n },\n\n /**\n * Resolve the board service url co-located with the conversation's ACL cluster.\n * Board data lives in the cluster encoded by the ACL url; hitting the home board\n * cluster instead triggers a cross-cluster 307 the browser cannot follow.\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @returns {string|undefined} board API base url for the conversation's cluster\n */\n getClusterBoardServiceUrl(conversation = {}) {\n const {aclUrl} = conversation;\n\n if (!aclUrl) {\n return undefined;\n }\n\n const {services} = this.webex.internal;\n const clusterId = services.getClusterId(aclUrl);\n\n if (!clusterId) {\n return undefined;\n }\n\n // Swap the trailing service token (e.g. `acl-write`) for the board API token.\n const boardClusterId = [...clusterId.split(':').slice(0, -1), 'board'].join(':');\n\n return services.getServiceFromClusterId({clusterId: boardClusterId})?.url;\n },\n\n /**\n * Gets Channels\n * @memberof Board.BoardService\n * @param {Conversation~ConversationObject} conversation\n * @param {Object} options\n * @param {number} options.channelsLimit number of boards to return per page\n * @param {number} options.type type of whiteboard: whiteboard or annotated\n * @returns {Promise<Page<Board~Channel>>} Resolves with an array of Channel items\n */\n getChannels(conversation, options) {\n options = options || {};\n\n if (!conversation) {\n return Promise.reject(new Error('`conversation` is required'));\n }\n\n const params = {\n resource: '/channels',\n qs: {\n aclUrlLink: conversation.aclUrl,\n },\n };\n\n assign(params.qs, pick(options, 'channelsLimit', 'type'));\n\n const boardServiceUrl = this.getClusterBoardServiceUrl(conversation);\n\n if (boardServiceUrl) {\n params.uri = `${boardServiceUrl}${params.resource}`;\n delete params.resource;\n } else {\n params.api = 'board';\n }\n\n return this.request(params).then((res) => new Page(res, this.webex));\n },\n\n /**\n * Pings persistence\n * @memberof Board.BoardService\n * @returns {Promise<Object>} ping response body\n */\n ping() {\n return this.webex\n .request({\n method: 'GET',\n api: 'board',\n resource: '/ping',\n })\n .then((res) => res.body);\n },\n\n processActivityEvent(message) {\n let decryptionPromise;\n\n if (message.contentType === 'FILE') {\n decryptionPromise = this.decryptSingleFileContent(\n message.envelope.encryptionKeyUrl,\n message.payload\n );\n } else {\n decryptionPromise = this.decryptSingleContent(\n message.envelope.encryptionKeyUrl,\n message.payload\n );\n }\n\n return decryptionPromise.then((decryptedData) => {\n // call the event handlers\n message.payload = decryptedData;\n\n return message;\n });\n },\n\n /**\n * Registers with Mercury\n * @memberof Board.BoardService\n * @param {Object} data - Mercury bindings\n * @returns {Promise<Board~Registration>}\n */\n register(data) {\n return this.webex\n .request({\n method: 'POST',\n api: 'board',\n resource: '/registrations',\n body: data,\n })\n .then((res) => res.body);\n },\n\n /**\n * Registers with Mercury for sharing web socket\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @returns {Promise<Board~Registration>}\n */\n registerToShareMercury(channel) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-shared-mercury')\n .then((isSharingMercuryFeatureEnabled) => {\n if (!this.webex.internal.mercury.localClusterServiceUrls) {\n return Promise.reject(\n new Error('`localClusterServiceUrls` is not defined, make sure mercury is connected')\n );\n }\n if (!isSharingMercuryFeatureEnabled) {\n return Promise.reject(new Error('`web-shared-mercury` is not enabled'));\n }\n\n const {webSocketUrl} = this.webex.internal.device;\n const {mercuryConnectionServiceClusterUrl} =\n this.webex.internal.mercury.localClusterServiceUrls;\n\n const data = {\n mercuryConnectionServiceClusterUrl,\n webSocketUrl,\n action: 'ADD',\n };\n\n return this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/register`,\n body: data,\n });\n })\n .then((res) => res.body);\n },\n\n /**\n * Remove board binding from existing mercury connection\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {String} binding - the binding as provided in board registration\n * @returns {Promise<Board~Registration>}\n */\n unregisterFromSharedMercury(channel, binding) {\n const {webSocketUrl} = this.webex.internal.device;\n const data = {\n binding,\n webSocketUrl,\n action: 'REMOVE',\n };\n\n return this.webex\n .request({\n method: 'POST',\n uri: `${channel.channelUrl}/register`,\n body: data,\n })\n .then((res) => res.body);\n },\n\n _addContentChunk(channel, contentChunk) {\n return this.webex.internal.board\n .encryptContents(channel.defaultEncryptionKeyUrl, contentChunk)\n .then((res) =>\n this.webex.request({\n method: 'POST',\n uri: `${channel.channelUrl}/contents`,\n body: res,\n })\n )\n .then((res) => res.body);\n },\n\n /**\n * Encrypts and uploads image to WebexFiles\n * @memberof Board.BoardService\n * @param {Board~Channel} channel\n * @param {File} file - File to be uploaded\n * @param {Object} options\n * @param {Object} options.hiddenSpace - true for hidden, false for open space\n * @private\n * @returns {Object} Encrypted Scr and KeyUrl\n */\n _uploadImage(channel, file, options) {\n options = options || {};\n\n return this.webex.internal.encryption\n .encryptBinary(file)\n .then(({scr, cdata}) =>\n Promise.all([scr, this._uploadImageToWebexFiles(channel, cdata, options.hiddenSpace)])\n )\n .then(([scr, res]) => assign(scr, {loc: res.downloadUrl}));\n },\n\n _getSpaceUrl(channel, hiddenSpace) {\n let requestUri = `${channel.channelUrl}/spaces/open`;\n\n if (hiddenSpace) {\n requestUri = `${channel.channelUrl}/spaces/hidden`;\n }\n\n return this.webex\n .request({\n method: 'PUT',\n uri: requestUri,\n })\n .then((res) => res.body.spaceUrl);\n },\n\n _uploadImageToWebexFiles(channel, file, hiddenSpace) {\n const fileSize = file.length || file.size || file.byteLength;\n\n return this._getSpaceUrl(channel, hiddenSpace).then((spaceUrl) =>\n this.webex.upload({\n uri: `${spaceUrl}/upload_sessions`,\n file,\n qs: {\n transcode: true,\n },\n phases: {\n initialize: {fileSize},\n upload: {\n $url(session) {\n return session.uploadUrl;\n },\n },\n finalize: {\n $uri(session) {\n return session.finishUploadUrl;\n },\n body: {fileSize},\n },\n },\n })\n );\n },\n\n /** Authorize transcoder (for sharing whiteboard to mobile)\n *\n * @param {Board~Channel} board\n * @memberof Board.BoardService\n * @returns {String} authorization\n */\n authorizeMediaInjector(board) {\n if (!board) {\n Promise.reject(\n new Error('#authorizeMediaInjector --> cannot authorize transcoder without board')\n );\n }\n\n return this.webex.internal.encryption.kms\n .prepareRequest({\n method: 'create',\n uri: '/authorizations',\n resourceUri: board.kmsResourceUrl,\n anonymous: 1,\n })\n .then((request) =>\n this.webex.request({\n uri: `${board.channelUrl}/sharePolicies/transcoder`,\n method: 'PUT',\n body: {kmsMessage: request.wrapped},\n })\n )\n .then((res) => this.webex.internal.encryption.kms.decryptKmsMessage(res.body.kmsResponse))\n .then((decryptedKmsMessage) => {\n if (decryptedKmsMessage?.authorizations.length > 0) {\n return decryptedKmsMessage.authorizations[0].bearer;\n }\n\n return undefined;\n })\n .catch((err) =>\n /* We want to resolve any errors so that whiteboard share will still work\n * except mobile being able to receive the share\n */\n Promise.resolve(err)\n );\n },\n\n /** Unauthorize transcoder (for stopping whiteboard share to mobile)\n *\n * @param {Board~Channel} board\n * @memberof Board.BoardService\n * @returns {Array} list of authIds removed\n */\n unauthorizeMediaInjector(board) {\n if (!board) {\n Promise.reject(\n new Error('#unauthorizeMediaInjector --> cannot unauthorize transcoder without board')\n );\n }\n\n return this.webex.internal.encryption.kms\n .listAuthorizations({\n kroUri: board.kmsResourceUrl,\n })\n .then((authorizations) => {\n /* Attempt to remove the authorization made from starting whiteboard share\n * Also removing any previous authorizations that were not cleared\n */\n const promises = authorizations.map((auth) => {\n const {authId} = auth;\n\n return this.webex.internal.encryption.kms\n .removeAuthorization({\n authId,\n kroUri: board.kmsResourceUrl,\n })\n .then(() => Promise.resolve(authId))\n .catch((err) =>\n /* We don't want this to error out, otherwise the\n * Promise.all will not process the rest of the request\n */\n Promise.resolve(err)\n );\n });\n\n if (promises.length > 0) {\n return Promise.all(promises).then((responses) => responses);\n }\n\n return Promise.resolve([]);\n });\n },\n});\n\nexport default Board;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAIA,IAAAA,YAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,UAAA,GAAAD,OAAA;AACA,IAAAE,iBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAEA,IAAAI,SAAA,GAAAL,sBAAA,CAAAC,OAAA;AAAkC,SAAAK,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,YAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA,IAVlC;AACA;AACA;AAUA,IAAMqB,KAAK,GAAGC,sBAAW,CAACC,MAAM,CAAC;EAC/BC,SAAS,EAAE,OAAO;EAElBC,QAAQ,EAAE;IACRC,QAAQ,EAAEC;EACZ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEC,UAAU,WAAVA,UAAUA,CAACC,OAAO,EAAEC,QAAQ,EAAE;IAAA,IAAAC,KAAA;IAC5B,IAAIC,MAAM,GAAG,EAAE;IAEfA,MAAM,GAAG,IAAAC,aAAK,EAACH,QAAQ,EAAE,IAAI,CAACI,MAAM,CAACC,2BAA2B,CAAC;;IAEjE;IACA;IACA,OAAO,IAAAC,yBAAa,EAACJ,MAAM,CAACK,GAAG,CAAC,UAACC,IAAI;MAAA,OAAKP,KAAI,CAACQ,gBAAgB,CAACC,IAAI,CAACT,KAAI,EAAEF,OAAO,EAAES,IAAI,CAAC;IAAA,EAAC,CAAC;EAC7F,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEG,QAAQ,WAARA,QAAQA,CAACZ,OAAO,EAAEa,KAAK,EAAEC,QAAQ,EAAE;IAAA,IAAAC,MAAA;IACjC,OAAO,IAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,KAAK,CAACC,YAAY,CAACnB,OAAO,EAAEa,KAAK,CAAC,CAACO,IAAI,CAAC,UAACC,GAAG;MAAA,OACrEN,MAAI,CAACC,KAAK,CAACC,QAAQ,CAACC,KAAK,CAACnB,UAAU,CAACC,OAAO,EAAE,CAC5C;QACEsB,IAAI,EAAE,MAAM;QACZR,QAAQ,EAARA,QAAQ;QACRS,IAAI,EAAE;UACJC,QAAQ,EAAEX,KAAK,CAACS,IAAI;UACpBD,GAAG,EAAHA,GAAG;UACHI,IAAI,EAAEZ,KAAK,CAACY,IAAI;UAChBC,GAAG,EAAEL,GAAG,CAACM;QACX;MACF,CAAC,CACF,CAAC;IAAA,CACJ,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEC,gBAAgB,WAAhBA,gBAAgBA,CAAC5B,OAAO,EAAEa,KAAK,EAAE;IAAA,IAAAgB,MAAA;IAC/B,IAAIC,QAAQ;IAEZ,OAAO,IAAI,CAACd,KAAK,CAACC,QAAQ,CAACC,KAAK,CAC7BC,YAAY,CAACnB,OAAO,EAAEa,KAAK,EAAE;MAACkB,WAAW,EAAE;IAAI,CAAC,CAAC,CACjDX,IAAI,CAAC,UAACC,GAAG,EAAK;MACbS,QAAQ,GAAGT,GAAG;MAEd,OAAOQ,MAAI,CAACb,KAAK,CAACC,QAAQ,CAACe,UAAU,CAACC,UAAU,CAACjC,OAAO,CAACkC,uBAAuB,EAAEJ,QAAQ,CAAC;IAC7F,CAAC,CAAC,CACDV,IAAI,CAAC,UAACe,YAAY,EAAK;MACtBL,QAAQ,CAACK,YAAY,GAAGA,YAAY;MAEpC,OAAOA,YAAY;IACrB,CAAC,CAAC,CACDf,IAAI,CAAC,YAAM;MACV,IAAMgB,SAAS,GAAG;QAChBvB,KAAK,EAAE;UACLa,GAAG,EAAEI,QAAQ,CAACH,GAAG;UACjBU,MAAM,EAAExB,KAAK,CAACwB,MAAM,IAAI,GAAG;UAC3BC,KAAK,EAAEzB,KAAK,CAACyB,KAAK,IAAI,IAAI;UAC1Bd,QAAQ,EAAEX,KAAK,CAACS,IAAI,IAAI,WAAW;UACnCD,GAAG,EAAES,QAAQ,CAACK,YAAY;UAC1BI,gBAAgB,EAAEvC,OAAO,CAACkC,uBAAuB;UACjDM,QAAQ,EAAE3B,KAAK,CAACY;QAClB;MACF,CAAC;MAED,OAAOI,MAAI,CAACb,KAAK,CAACyB,OAAO,CAAC;QACxBC,MAAM,EAAE,OAAO;QACfC,GAAG,EAAE3C,OAAO,CAAC4C,UAAU;QACvBC,IAAI,EAAET;MACR,CAAC,CAAC;IACJ,CAAC,CAAC,CACDhB,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEE,aAAa,WAAbA,aAAaA,CAACC,YAAY,EAAEhD,OAAO,EAAE;IACnC,IAAMiD,MAAM,GAAG;MACbP,MAAM,EAAE,MAAM;MACdQ,QAAQ,EAAE,WAAW;MACrBL,IAAI,EAAE,IAAI,CAACM,eAAe,CAACH,YAAY,EAAEhD,OAAO;IAClD,CAAC;IAED,IAAMoD,eAAe,GAAG,IAAI,CAACC,yBAAyB,CAACL,YAAY,CAAC;IAEpE,IAAII,eAAe,EAAE;MACnBH,MAAM,CAACN,GAAG,MAAAW,MAAA,CAAMF,eAAe,EAAAE,MAAA,CAAGL,MAAM,CAACC,QAAQ,CAAE;MACnD,OAAOD,MAAM,CAACC,QAAQ;IACxB,CAAC,MAAM;MACLD,MAAM,CAACM,GAAG,GAAG,OAAO;IACtB;IAEA,OAAO,IAAI,CAACvC,KAAK,CAACyB,OAAO,CAACQ,MAAM,CAAC,CAAC7B,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC3D,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEM,eAAe,WAAfA,eAAeA,CAAA,EAAkC;IAAA,IAAjCH,YAAY,GAAAjE,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAyE,SAAA,GAAAzE,SAAA,MAAG,CAAC,CAAC;IAAA,IAAEiB,OAAO,GAAAjB,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAyE,SAAA,GAAAzE,SAAA,MAAG,CAAC,CAAC;IAC7C,IAAM0E,OAAO,GAAA3E,aAAA;MACX4E,UAAU,EAAEV,YAAY,CAACW,MAAM;MAC/BC,UAAU,EAAE;QACVlB,MAAM,EAAE,QAAQ;QAChBC,GAAG,EAAE,YAAY;QACjBkB,OAAO,EAAE,EAAE;QACXC,OAAO,EAAE;MACX;IAAC,GACE9D,OAAO,CACX;IAED,IAAIgD,YAAY,CAACe,oBAAoB,EAAE;MACrCN,OAAO,CAACG,UAAU,CAACC,OAAO,CAACjF,IAAI,CAACoE,YAAY,CAACe,oBAAoB,CAAC;IACpE;IAEA,OAAON,OAAO;EAChB,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEO,aAAa,WAAbA,aAAaA,CAAChB,YAAY,EAAEhD,OAAO,EAAgB;IAAA,IAAAiE,MAAA;IAAA,IAAdC,OAAO,GAAAnF,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAyE,SAAA,GAAAzE,SAAA,MAAG,CAAC,CAAC;IAC/C;IACA;IACA,IAAM8D,IAAI,GAAG;MACXsB,WAAW,EAAE,UAAU;MACvBC,SAAS,EAAEpB,YAAY,CAACW,MAAM;MAC9BC,UAAU,EAAE;QACVlB,MAAM,EAAE,QAAQ;QAChBC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAACqE,cAAc,sBAAAf,MAAA,CAAmBgB,oBAAW,CAACC,SAAS,CAAC;UACrEC,MAAM,EAAExB,YAAY,CAACe;QACvB,CAAC,CAAC;MACJ,CAAC;MACDU,gBAAgB,EAAE;IACpB,CAAC;IAED,IAAIC,OAAO,GAAGC,QAAA,CAAAvF,OAAA,CAAQwF,OAAO,CAAC,CAAC;IAE/B,IAAIV,OAAO,CAACW,0BAA0B,EAAE;MACtCH,OAAO,GAAG,IAAI,CAACI,sBAAsB,CAAC9E,OAAO,CAAC;IAChD;IAEA,OAAO0E,OAAO,CACXtD,IAAI,CAAC;MAAA,OACJ6C,MAAI,CAACjD,KAAK,CAACyB,OAAO,CAAC;QACjBC,MAAM,EAAE,KAAK;QACbC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC2D,MAAM,WAAQ;QAC9Bd,IAAI,EAAJA;MACF,CAAC,CAAC;IAAA,CACJ,CAAC,CACAzB,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEiC,sBAAsB,WAAtBA,sBAAsBA,CAAC9E,OAAO,EAAE;IAC9B,OAAO,IAAI,CAACgB,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,UAAO;MACjCmC,EAAE,EAAE;QACFC,MAAM,EAAE;MACV;IACF,CAAC,CAAC,CACD5D,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEoC,UAAU,WAAVA,UAAUA,CAACjF,OAAO,EAAE;IAClB,OAAO,IAAI,CAACgB,KAAK,CAACyB,OAAO,CAAC;MACxBC,MAAM,EAAE,MAAM;MACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU;IAC5B,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEsC,eAAe,WAAfA,eAAeA,CAACjF,QAAQ,EAAE;IAAA,IAAAkF,MAAA;IACxB,OAAOR,QAAA,CAAAvF,OAAA,CAAQgG,GAAG,CAChBnF,QAAQ,CAACoF,KAAK,CAAC7E,GAAG,CAAC,UAAC8E,OAAO,EAAK;MAC9B,IAAIC,cAAc;MAElB,IAAID,OAAO,CAAChE,IAAI,KAAK,MAAM,EAAE;QAC3BiE,cAAc,GAAGJ,MAAI,CAACK,wBAAwB,CAACF,OAAO,CAAC/C,gBAAgB,EAAE+C,OAAO,CAAC;MACnF,CAAC,MAAM;QACLC,cAAc,GAAGJ,MAAI,CAACM,oBAAoB,CAACH,OAAO,CAAC/C,gBAAgB,EAAE+C,OAAO,CAACI,OAAO,CAAC;MACvF;MAEA,OAAOH,cAAc,CAACnE,IAAI,CAAC,UAAC0B,GAAG,EAAK;QAClC,IAAA6C,eAAA,CAAAvG,OAAA,EAAuBkG,OAAO,EAAE,SAAS,CAAC;QAC1C,IAAAK,eAAA,CAAAvG,OAAA,EAAuBkG,OAAO,EAAE,kBAAkB,CAAC;QAEnD,OAAO,IAAAM,gBAAQ,EAAC9C,GAAG,EAAEwC,OAAO,CAAC;MAC/B,CAAC,CAAC;IACJ,CAAC,CACH,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEG,oBAAoB,WAApBA,oBAAoBA,CAAClD,gBAAgB,EAAEsD,aAAa,EAAE;IACpD,OAAO,IAAI,CAAC7E,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClC8D,WAAW,CAACvD,gBAAgB,EAAEsD,aAAa,CAAC,CAC5CzE,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKiD,IAAI,CAACC,KAAK,CAAClD,GAAG,CAAC;IAAA,EAAC;EACnC,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACE0C,wBAAwB,WAAxBA,wBAAwBA,CAACjD,gBAAgB,EAAE0D,gBAAgB,EAAE;IAAA,IAAAC,MAAA;IAC3D,IAAIpF,QAAQ;IAEZ,IAAImF,gBAAgB,CAACP,OAAO,EAAE;MAC5B5E,QAAQ,GAAGmF,gBAAgB,CAACP,OAAO;IACrC;IAEA,OAAO,IAAI,CAAC1E,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClCmE,UAAU,CAAC5D,gBAAgB,EAAE0D,gBAAgB,CAAC1E,IAAI,CAACF,GAAG,CAAC,CACvDD,IAAI,CAAC,UAACC,GAAG,EAAK;MACb4E,gBAAgB,CAAC1E,IAAI,CAACF,GAAG,GAAGA,GAAG;MAC/B,IAAIP,QAAQ,EAAE;QACZ,OAAOoF,MAAI,CAAClF,KAAK,CAACC,QAAQ,CAACe,UAAU,CAAC8D,WAAW,CAACvD,gBAAgB,EAAEzB,QAAQ,CAAC;MAC/E;MAEA,OAAO,EAAE;IACX,CAAC,CAAC,CACDM,IAAI,CAAC,UAACgF,iBAAiB,EAAK;MAC3B,IAAI;QACFH,gBAAgB,CAACnF,QAAQ,GAAGiF,IAAI,CAACC,KAAK,CAACI,iBAAiB,CAAC;QACzD,IAAIH,gBAAgB,CAACnF,QAAQ,CAACuF,WAAW,EAAE;UACzCJ,gBAAgB,CAACI,WAAW,GAAGJ,gBAAgB,CAACnF,QAAQ,CAACuF,WAAW;QACtE;MACF,CAAC,CAAC,OAAOC,KAAK,EAAE;QACdL,gBAAgB,CAACnF,QAAQ,GAAG,CAAC,CAAC;MAChC;MAEA,OAAOmF,gBAAgB;IACzB,CAAC,CAAC;EACN,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEM,gBAAgB,WAAhBA,gBAAgBA,CAACvG,OAAO,EAAE;IACxB,OAAO,IAAI,CAACgB,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,QAAQ;MAChBC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU;IAC5B,CAAC,CAAC,CACDxB,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE2D,oBAAoB,WAApBA,oBAAoBA,CAACxG,OAAO,EAAEyG,cAAc,EAAE;IAC5C,IAAM5D,IAAI,GAAG4D,cAAc,CAACjG,GAAG,CAAC,UAAC8E,OAAO;MAAA,OAAK,IAAAoB,YAAI,EAACpB,OAAO,EAAE,WAAW,CAAC;IAAA,EAAC;IAExE,OAAO,IAAI,CAACtE,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,cAAW;MACrCC,IAAI,EAAJA,IAAI;MACJkC,EAAE,EAAE;QACF4B,UAAU,EAAE;MACd;IACF,CAAC,CAAC,CACDvF,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACE+D,eAAe,WAAfA,eAAeA,CAACrE,gBAAgB,EAAEtC,QAAQ,EAAE;IAAA,IAAA4G,MAAA;IAC1C,OAAOlC,QAAA,CAAAvF,OAAA,CAAQgG,GAAG,CAChBnF,QAAQ,CAACO,GAAG,CAAC,UAAC8E,OAAO,EAAK;MACxB,IAAIwB,iBAAiB;MACrB,IAAIC,WAAW,GAAG,QAAQ;;MAE1B;MACA,IAAIzB,OAAO,CAAC/D,IAAI,EAAE;QAChBwF,WAAW,GAAG,MAAM;QACpBD,iBAAiB,GAAGD,MAAI,CAACG,wBAAwB,CAACzE,gBAAgB,EAAE+C,OAAO,CAAC;MAC9E,CAAC,MAAM;QACLwB,iBAAiB,GAAGD,MAAI,CAACI,oBAAoB,CAAC1E,gBAAgB,EAAE+C,OAAO,CAAC;MAC1E;MAEA,OAAOwB,iBAAiB,CAAC1F,IAAI,CAAC,UAAC0B,GAAG;QAAA,OAChC,IAAAoE,cAAM,EACJ;UACEC,MAAM,EAAEN,MAAI,CAAC7F,KAAK,CAACC,QAAQ,CAACkG,MAAM,CAACC,UAAU;UAC7C9F,IAAI,EAAEyF,WAAW;UACjBxE,gBAAgB,EAAhBA;QACF,CAAC,EACD,IAAAmE,YAAI,EAAC5D,GAAG,EAAE,MAAM,EAAE,SAAS,CAC7B,CAAC;MAAA,CACH,CAAC;IACH,CAAC,CACH,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEmE,oBAAoB,WAApBA,oBAAoBA,CAAC1E,gBAAgB,EAAE+C,OAAO,EAAE;IAC9C,OAAO,IAAI,CAACtE,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClCqF,WAAW,CAAC9E,gBAAgB,EAAE,IAAA+E,UAAA,CAAAlI,OAAA,EAAekG,OAAO,CAAC,CAAC,CACtDlE,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAM;QACd4C,OAAO,EAAE5C,GAAG;QACZP,gBAAgB,EAAhBA;MACF,CAAC;IAAA,CAAC,CAAC;EACP,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEyE,wBAAwB,WAAxBA,wBAAwBA,CAACzE,gBAAgB,EAAE+C,OAAO,EAAE;IAAA,IAAAiC,MAAA;IAClD,OAAO,IAAI,CAACvG,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClCC,UAAU,CAACM,gBAAgB,EAAE+C,OAAO,CAAC/D,IAAI,CAACF,GAAG,CAAC,CAC9CD,IAAI,CAAC,UAACe,YAAY,EAAK;MACtBmD,OAAO,CAAC/D,IAAI,CAACF,GAAG,GAAGc,YAAY;MAC/B,IAAImD,OAAO,CAACe,WAAW,EAAE;QACvBf,OAAO,CAACxE,QAAQ,GAAG,IAAAoG,cAAM,EAAC5B,OAAO,CAACxE,QAAQ,EAAE;UAACuF,WAAW,EAAEf,OAAO,CAACe;QAAW,CAAC,CAAC;MACjF;MACA,IAAIf,OAAO,CAACxE,QAAQ,EAAE;QACpB,OAAOyG,MAAI,CAACvG,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClCqF,WAAW,CAAC9E,gBAAgB,EAAE,IAAA+E,UAAA,CAAAlI,OAAA,EAAekG,OAAO,CAACxE,QAAQ,CAAC,CAAC,CAC/DM,IAAI,CAAC,UAACoG,iBAAiB,EAAK;UAC3BlC,OAAO,CAACxE,QAAQ,GAAG0G,iBAAiB;QACtC,CAAC,CAAC;MACN;MAEA,OAAOlC,OAAO;IAChB,CAAC,CAAC,CACDlE,IAAI,CAAC;MAAA,OAAO;QACXG,IAAI,EAAE+D,OAAO,CAAC/D,IAAI;QAClBmE,OAAO,EAAEJ,OAAO,CAACxE,QAAQ;QACzByB,gBAAgB,EAAhBA;MACF,CAAC;IAAA,CAAC,CAAC;EACP,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEkF,WAAW,WAAXA,WAAWA,CAACzH,OAAO,EAAEkE,OAAO,EAAE;IAAA,IAAAwD,MAAA;IAC5BxD,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;IAEvB,IAAMjB,MAAM,GAAG;MACbN,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,cAAW;MACrCmC,EAAE,EAAE;QACF4C,aAAa,EAAE,IAAI,CAACtH,MAAM,CAACuH;MAC7B;IACF,CAAC;IAED,IAAAV,cAAM,EAACjE,MAAM,CAAC8B,EAAE,EAAE,IAAA2B,YAAI,EAACxC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEjD,OAAO,IAAI,CAACzB,OAAO,CAACQ,MAAM,CAAC,CAAC7B,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAK,IAAI+E,eAAI,CAAC/E,GAAG,EAAE4E,MAAI,CAAC1G,KAAK,CAAC;IAAA,EAAC;EACtE,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACE8G,UAAU,WAAVA,UAAUA,CAAC9H,OAAO,EAAE;IAClB,OAAO,IAAI,CAACgB,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,KAAK;MACbC,GAAG,EAAE3C,OAAO,CAAC4C;IACf,CAAC,CAAC,CACDxB,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACEQ,yBAAyB,WAAzBA,yBAAyBA,CAAA,EAAoB;IAAA,IAAA0E,qBAAA;IAAA,IAAnB/E,YAAY,GAAAjE,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAyE,SAAA,GAAAzE,SAAA,MAAG,CAAC,CAAC;IACzC,IAAO4E,MAAM,GAAIX,YAAY,CAAtBW,MAAM;IAEb,IAAI,CAACA,MAAM,EAAE;MACX,OAAOH,SAAS;IAClB;IAEA,IAAOwE,QAAQ,GAAI,IAAI,CAAChH,KAAK,CAACC,QAAQ,CAA/B+G,QAAQ;IACf,IAAMC,SAAS,GAAGD,QAAQ,CAACE,YAAY,CAACvE,MAAM,CAAC;IAE/C,IAAI,CAACsE,SAAS,EAAE;MACd,OAAOzE,SAAS;IAClB;;IAEA;IACA,IAAM2E,cAAc,GAAG,GAAA7E,MAAA,KAAA8E,mBAAA,CAAAhJ,OAAA,EAAI6I,SAAS,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAE,OAAO,GAAEC,IAAI,CAAC,GAAG,CAAC;IAEhF,QAAAR,qBAAA,GAAOC,QAAQ,CAACQ,uBAAuB,CAAC;MAACP,SAAS,EAAEE;IAAc,CAAC,CAAC,cAAAJ,qBAAA,uBAA7DA,qBAAA,CAA+DrG,GAAG;EAC3E,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE+G,WAAW,WAAXA,WAAWA,CAACzF,YAAY,EAAEkB,OAAO,EAAE;IAAA,IAAAwE,MAAA;IACjCxE,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;IAEvB,IAAI,CAAClB,YAAY,EAAE;MACjB,OAAO2B,QAAA,CAAAvF,OAAA,CAAQuJ,MAAM,CAAC,IAAIC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChE;IAEA,IAAM3F,MAAM,GAAG;MACbC,QAAQ,EAAE,WAAW;MACrB6B,EAAE,EAAE;QACFrB,UAAU,EAAEV,YAAY,CAACW;MAC3B;IACF,CAAC;IAED,IAAAuD,cAAM,EAACjE,MAAM,CAAC8B,EAAE,EAAE,IAAA2B,YAAI,EAACxC,OAAO,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IAEzD,IAAMd,eAAe,GAAG,IAAI,CAACC,yBAAyB,CAACL,YAAY,CAAC;IAEpE,IAAII,eAAe,EAAE;MACnBH,MAAM,CAACN,GAAG,MAAAW,MAAA,CAAMF,eAAe,EAAAE,MAAA,CAAGL,MAAM,CAACC,QAAQ,CAAE;MACnD,OAAOD,MAAM,CAACC,QAAQ;IACxB,CAAC,MAAM;MACLD,MAAM,CAACM,GAAG,GAAG,OAAO;IACtB;IAEA,OAAO,IAAI,CAACd,OAAO,CAACQ,MAAM,CAAC,CAAC7B,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAK,IAAI+E,eAAI,CAAC/E,GAAG,EAAE4F,MAAI,CAAC1H,KAAK,CAAC;IAAA,EAAC;EACtE,CAAC;EAED;AACF;AACA;AACA;AACA;EACE6H,IAAI,WAAJA,IAAIA,CAAA,EAAG;IACL,OAAO,IAAI,CAAC7H,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,KAAK;MACba,GAAG,EAAE,OAAO;MACZL,QAAQ,EAAE;IACZ,CAAC,CAAC,CACD9B,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAEDiG,oBAAoB,WAApBA,oBAAoBA,CAACC,OAAO,EAAE;IAC5B,IAAIC,iBAAiB;IAErB,IAAID,OAAO,CAAChC,WAAW,KAAK,MAAM,EAAE;MAClCiC,iBAAiB,GAAG,IAAI,CAACxD,wBAAwB,CAC/CuD,OAAO,CAACE,QAAQ,CAAC1G,gBAAgB,EACjCwG,OAAO,CAACrD,OACV,CAAC;IACH,CAAC,MAAM;MACLsD,iBAAiB,GAAG,IAAI,CAACvD,oBAAoB,CAC3CsD,OAAO,CAACE,QAAQ,CAAC1G,gBAAgB,EACjCwG,OAAO,CAACrD,OACV,CAAC;IACH;IAEA,OAAOsD,iBAAiB,CAAC5H,IAAI,CAAC,UAAC8H,aAAa,EAAK;MAC/C;MACAH,OAAO,CAACrD,OAAO,GAAGwD,aAAa;MAE/B,OAAOH,OAAO;IAChB,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEI,QAAQ,WAARA,QAAQA,CAACC,IAAI,EAAE;IACb,OAAO,IAAI,CAACpI,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACda,GAAG,EAAE,OAAO;MACZL,QAAQ,EAAE,gBAAgB;MAC1BL,IAAI,EAAEuG;IACR,CAAC,CAAC,CACDhI,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEwG,sBAAsB,WAAtBA,sBAAsBA,CAACrJ,OAAO,EAAE;IAAA,IAAAsJ,MAAA;IAC9B,OAAO,IAAI,CAACtI,KAAK,CAACC,QAAQ,CAACsI,OAAO,CAC/BC,UAAU,CAAC,WAAW,EAAE,oBAAoB,CAAC,CAC7CpI,IAAI,CAAC,UAACqI,8BAA8B,EAAK;MACxC,IAAI,CAACH,MAAI,CAACtI,KAAK,CAACC,QAAQ,CAACyI,OAAO,CAACC,uBAAuB,EAAE;QACxD,OAAOhF,QAAA,CAAAvF,OAAA,CAAQuJ,MAAM,CACnB,IAAIC,KAAK,CAAC,0EAA0E,CACtF,CAAC;MACH;MACA,IAAI,CAACa,8BAA8B,EAAE;QACnC,OAAO9E,QAAA,CAAAvF,OAAA,CAAQuJ,MAAM,CAAC,IAAIC,KAAK,CAAC,qCAAqC,CAAC,CAAC;MACzE;MAEA,IAAOgB,YAAY,GAAIN,MAAI,CAACtI,KAAK,CAACC,QAAQ,CAACkG,MAAM,CAA1CyC,YAAY;MACnB,IAAOC,kCAAkC,GACvCP,MAAI,CAACtI,KAAK,CAACC,QAAQ,CAACyI,OAAO,CAACC,uBAAuB,CAD9CE,kCAAkC;MAGzC,IAAMT,IAAI,GAAG;QACXS,kCAAkC,EAAlCA,kCAAkC;QAClCD,YAAY,EAAZA,YAAY;QACZE,MAAM,EAAE;MACV,CAAC;MAED,OAAOR,MAAI,CAACtI,KAAK,CAACyB,OAAO,CAAC;QACxBC,MAAM,EAAE,MAAM;QACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,cAAW;QACrCC,IAAI,EAAEuG;MACR,CAAC,CAAC;IACJ,CAAC,CAAC,CACDhI,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACEkH,2BAA2B,WAA3BA,2BAA2BA,CAAC/J,OAAO,EAAEgK,OAAO,EAAE;IAC5C,IAAOJ,YAAY,GAAI,IAAI,CAAC5I,KAAK,CAACC,QAAQ,CAACkG,MAAM,CAA1CyC,YAAY;IACnB,IAAMR,IAAI,GAAG;MACXY,OAAO,EAAPA,OAAO;MACPJ,YAAY,EAAZA,YAAY;MACZE,MAAM,EAAE;IACV,CAAC;IAED,OAAO,IAAI,CAAC9I,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,cAAW;MACrCC,IAAI,EAAEuG;IACR,CAAC,CAAC,CACDhI,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAEDnC,gBAAgB,WAAhBA,gBAAgBA,CAACV,OAAO,EAAEiK,YAAY,EAAE;IAAA,IAAAC,OAAA;IACtC,OAAO,IAAI,CAAClJ,KAAK,CAACC,QAAQ,CAACC,KAAK,CAC7B0F,eAAe,CAAC5G,OAAO,CAACkC,uBAAuB,EAAE+H,YAAY,CAAC,CAC9D7I,IAAI,CAAC,UAAC0B,GAAG;MAAA,OACRoH,OAAI,CAAClJ,KAAK,CAACyB,OAAO,CAAC;QACjBC,MAAM,EAAE,MAAM;QACdC,GAAG,KAAAW,MAAA,CAAKtD,OAAO,CAAC4C,UAAU,cAAW;QACrCC,IAAI,EAAEC;MACR,CAAC,CAAC;IAAA,CACJ,CAAC,CACA1B,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI;IAAA,EAAC;EAC5B,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE1B,YAAY,WAAZA,YAAYA,CAACnB,OAAO,EAAEuB,IAAI,EAAE2C,OAAO,EAAE;IAAA,IAAAiG,OAAA;IACnCjG,OAAO,GAAGA,OAAO,IAAI,CAAC,CAAC;IAEvB,OAAO,IAAI,CAAClD,KAAK,CAACC,QAAQ,CAACe,UAAU,CAClCoI,aAAa,CAAC7I,IAAI,CAAC,CACnBH,IAAI,CAAC,UAAAiJ,IAAA;MAAA,IAAEhJ,GAAG,GAAAgJ,IAAA,CAAHhJ,GAAG;QAAEiJ,KAAK,GAAAD,IAAA,CAALC,KAAK;MAAA,OAChB3F,QAAA,CAAAvF,OAAA,CAAQgG,GAAG,CAAC,CAAC/D,GAAG,EAAE8I,OAAI,CAACI,wBAAwB,CAACvK,OAAO,EAAEsK,KAAK,EAAEpG,OAAO,CAACnC,WAAW,CAAC,CAAC,CAAC;IAAA,CACxF,CAAC,CACAX,IAAI,CAAC,UAAAoJ,KAAA;MAAA,IAAAC,KAAA,OAAAC,eAAA,CAAAtL,OAAA,EAAAoL,KAAA;QAAEnJ,GAAG,GAAAoJ,KAAA;QAAE3H,GAAG,GAAA2H,KAAA;MAAA,OAAM,IAAAvD,cAAM,EAAC7F,GAAG,EAAE;QAACM,GAAG,EAAEmB,GAAG,CAAC6H;MAAW,CAAC,CAAC;IAAA,EAAC;EAC9D,CAAC;EAEDC,YAAY,WAAZA,YAAYA,CAAC5K,OAAO,EAAE+B,WAAW,EAAE;IACjC,IAAI8I,UAAU,MAAAvH,MAAA,CAAMtD,OAAO,CAAC4C,UAAU,iBAAc;IAEpD,IAAIb,WAAW,EAAE;MACf8I,UAAU,MAAAvH,MAAA,CAAMtD,OAAO,CAAC4C,UAAU,mBAAgB;IACpD;IAEA,OAAO,IAAI,CAAC5B,KAAK,CACdyB,OAAO,CAAC;MACPC,MAAM,EAAE,KAAK;MACbC,GAAG,EAAEkI;IACP,CAAC,CAAC,CACDzJ,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAKA,GAAG,CAACD,IAAI,CAACiI,QAAQ;IAAA,EAAC;EACrC,CAAC;EAEDP,wBAAwB,WAAxBA,wBAAwBA,CAACvK,OAAO,EAAEuB,IAAI,EAAEQ,WAAW,EAAE;IAAA,IAAAgJ,OAAA;IACnD,IAAMvI,QAAQ,GAAGjB,IAAI,CAACvC,MAAM,IAAIuC,IAAI,CAACE,IAAI,IAAIF,IAAI,CAACyJ,UAAU;IAE5D,OAAO,IAAI,CAACJ,YAAY,CAAC5K,OAAO,EAAE+B,WAAW,CAAC,CAACX,IAAI,CAAC,UAAC0J,QAAQ;MAAA,OAC3DC,OAAI,CAAC/J,KAAK,CAACiK,MAAM,CAAC;QAChBtI,GAAG,KAAAW,MAAA,CAAKwH,QAAQ,qBAAkB;QAClCvJ,IAAI,EAAJA,IAAI;QACJwD,EAAE,EAAE;UACFmG,SAAS,EAAE;QACb,CAAC;QACDC,MAAM,EAAE;UACNC,UAAU,EAAE;YAAC5I,QAAQ,EAARA;UAAQ,CAAC;UACtByI,MAAM,EAAE;YACNI,IAAI,WAAJA,IAAIA,CAACC,OAAO,EAAE;cACZ,OAAOA,OAAO,CAACC,SAAS;YAC1B;UACF,CAAC;UACDC,QAAQ,EAAE;YACRC,IAAI,WAAJA,IAAIA,CAACH,OAAO,EAAE;cACZ,OAAOA,OAAO,CAACI,eAAe;YAChC,CAAC;YACD7I,IAAI,EAAE;cAACL,QAAQ,EAARA;YAAQ;UACjB;QACF;MACF,CAAC,CAAC;IAAA,CACJ,CAAC;EACH,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEmJ,sBAAsB,WAAtBA,sBAAsBA,CAACzK,KAAK,EAAE;IAAA,IAAA0K,OAAA;IAC5B,IAAI,CAAC1K,KAAK,EAAE;MACVyD,QAAA,CAAAvF,OAAA,CAAQuJ,MAAM,CACZ,IAAIC,KAAK,CAAC,uEAAuE,CACnF,CAAC;IACH;IAEA,OAAO,IAAI,CAAC5H,KAAK,CAACC,QAAQ,CAACe,UAAU,CAAC6J,GAAG,CACtCC,cAAc,CAAC;MACdpJ,MAAM,EAAE,QAAQ;MAChBC,GAAG,EAAE,iBAAiB;MACtBoJ,WAAW,EAAE7K,KAAK,CAACmD,cAAc;MACjC2H,SAAS,EAAE;IACb,CAAC,CAAC,CACD5K,IAAI,CAAC,UAACqB,OAAO;MAAA,OACZmJ,OAAI,CAAC5K,KAAK,CAACyB,OAAO,CAAC;QACjBE,GAAG,KAAAW,MAAA,CAAKpC,KAAK,CAAC0B,UAAU,8BAA2B;QACnDF,MAAM,EAAE,KAAK;QACbG,IAAI,EAAE;UAACe,UAAU,EAAEnB,OAAO,CAACwJ;QAAO;MACpC,CAAC,CAAC;IAAA,CACJ,CAAC,CACA7K,IAAI,CAAC,UAAC0B,GAAG;MAAA,OAAK8I,OAAI,CAAC5K,KAAK,CAACC,QAAQ,CAACe,UAAU,CAAC6J,GAAG,CAACK,iBAAiB,CAACpJ,GAAG,CAACD,IAAI,CAACsJ,WAAW,CAAC;IAAA,EAAC,CACzF/K,IAAI,CAAC,UAACgL,mBAAmB,EAAK;MAC7B,IAAI,CAAAA,mBAAmB,aAAnBA,mBAAmB,uBAAnBA,mBAAmB,CAAEC,cAAc,CAACrN,MAAM,IAAG,CAAC,EAAE;QAClD,OAAOoN,mBAAmB,CAACC,cAAc,CAAC,CAAC,CAAC,CAACC,MAAM;MACrD;MAEA,OAAO9I,SAAS;IAClB,CAAC,CAAC,CACD+I,KAAK,CAAC,UAACC,GAAG;MAAA;QACT;AACR;AACA;QACQ7H,QAAA,CAAAvF,OAAA,CAAQwF,OAAO,CAAC4H,GAAG;MAAC;IAAA,CACtB,CAAC;EACL,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEC,wBAAwB,WAAxBA,wBAAwBA,CAACvL,KAAK,EAAE;IAAA,IAAAwL,OAAA;IAC9B,IAAI,CAACxL,KAAK,EAAE;MACVyD,QAAA,CAAAvF,OAAA,CAAQuJ,MAAM,CACZ,IAAIC,KAAK,CAAC,2EAA2E,CACvF,CAAC;IACH;IAEA,OAAO,IAAI,CAAC5H,KAAK,CAACC,QAAQ,CAACe,UAAU,CAAC6J,GAAG,CACtCc,kBAAkB,CAAC;MAClBC,MAAM,EAAE1L,KAAK,CAACmD;IAChB,CAAC,CAAC,CACDjD,IAAI,CAAC,UAACiL,cAAc,EAAK;MACxB;AACR;AACA;MACQ,IAAMQ,QAAQ,GAAGR,cAAc,CAAC7L,GAAG,CAAC,UAACsM,IAAI,EAAK;QAC5C,IAAOtI,MAAM,GAAIsI,IAAI,CAAdtI,MAAM;QAEb,OAAOkI,OAAI,CAAC1L,KAAK,CAACC,QAAQ,CAACe,UAAU,CAAC6J,GAAG,CACtCkB,mBAAmB,CAAC;UACnBvI,MAAM,EAANA,MAAM;UACNoI,MAAM,EAAE1L,KAAK,CAACmD;QAChB,CAAC,CAAC,CACDjD,IAAI,CAAC;UAAA,OAAMuD,QAAA,CAAAvF,OAAA,CAAQwF,OAAO,CAACJ,MAAM,CAAC;QAAA,EAAC,CACnC+H,KAAK,CAAC,UAACC,GAAG;UAAA;YACT;AACd;AACA;YACc7H,QAAA,CAAAvF,OAAA,CAAQwF,OAAO,CAAC4H,GAAG;UAAC;QAAA,CACtB,CAAC;MACL,CAAC,CAAC;MAEF,IAAIK,QAAQ,CAAC7N,MAAM,GAAG,CAAC,EAAE;QACvB,OAAO2F,QAAA,CAAAvF,OAAA,CAAQgG,GAAG,CAACyH,QAAQ,CAAC,CAACzL,IAAI,CAAC,UAAC4L,SAAS;UAAA,OAAKA,SAAS;QAAA,EAAC;MAC7D;MAEA,OAAOrI,QAAA,CAAAvF,OAAA,CAAQwF,OAAO,CAAC,EAAE,CAAC;IAC5B,CAAC,CAAC;EACN,CAAC;EAAAqI,OAAA;AACH,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAA/N,OAAA,GAEYI,KAAK","ignoreList":[]}
|
package/dist/realtime.js
CHANGED
|
@@ -221,7 +221,7 @@ var RealtimeService = _webexCore.WebexPlugin.extend({
|
|
|
221
221
|
return _this7.realtimeChannels.remove(channel.channelId);
|
|
222
222
|
}));
|
|
223
223
|
},
|
|
224
|
-
version: "3.12.0-next.
|
|
224
|
+
version: "3.12.0-next.61"
|
|
225
225
|
});
|
|
226
226
|
var _default = exports.default = RealtimeService;
|
|
227
227
|
//# sourceMappingURL=realtime.js.map
|
package/package.json
CHANGED
|
@@ -25,23 +25,23 @@
|
|
|
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.
|
|
29
|
-
"@webex/test-helper-file": "3.
|
|
30
|
-
"@webex/test-helper-mocha": "3.
|
|
31
|
-
"@webex/test-helper-mock-web-socket": "3.
|
|
32
|
-
"@webex/test-helper-mock-webex": "3.
|
|
33
|
-
"@webex/test-helper-test-users": "3.
|
|
28
|
+
"@webex/test-helper-chai": "3.12.0-next.9",
|
|
29
|
+
"@webex/test-helper-file": "3.12.0-next.9",
|
|
30
|
+
"@webex/test-helper-mocha": "3.12.0-next.9",
|
|
31
|
+
"@webex/test-helper-mock-web-socket": "3.12.0-next.9",
|
|
32
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.9",
|
|
33
|
+
"@webex/test-helper-test-users": "3.12.0-next.9",
|
|
34
34
|
"eslint": "^8.24.0",
|
|
35
35
|
"prettier": "^2.7.1",
|
|
36
36
|
"sinon": "^9.2.4"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@webex/common": "3.
|
|
40
|
-
"@webex/internal-plugin-conversation": "3.12.0-next.
|
|
41
|
-
"@webex/internal-plugin-encryption": "3.12.0-next.
|
|
42
|
-
"@webex/internal-plugin-feature": "3.12.0-next.
|
|
43
|
-
"@webex/internal-plugin-mercury": "3.12.0-next.
|
|
44
|
-
"@webex/webex-core": "3.12.0-next.
|
|
39
|
+
"@webex/common": "3.12.0-next.9",
|
|
40
|
+
"@webex/internal-plugin-conversation": "3.12.0-next.60",
|
|
41
|
+
"@webex/internal-plugin-encryption": "3.12.0-next.58",
|
|
42
|
+
"@webex/internal-plugin-feature": "3.12.0-next.51",
|
|
43
|
+
"@webex/internal-plugin-mercury": "3.12.0-next.55",
|
|
44
|
+
"@webex/webex-core": "3.12.0-next.51",
|
|
45
45
|
"ampersand-collection": "^2.0.2",
|
|
46
46
|
"es6-promise-series": "^0.2.2",
|
|
47
47
|
"lodash": "^4.17.21",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"test:style": "eslint ./src/**/*.*",
|
|
57
57
|
"test:unit": "webex-legacy-tools test --unit --runner jest"
|
|
58
58
|
},
|
|
59
|
-
"version": "3.12.0-next.
|
|
59
|
+
"version": "3.12.0-next.61"
|
|
60
60
|
}
|
package/src/board.js
CHANGED
|
@@ -116,14 +116,22 @@ const Board = WebexPlugin.extend({
|
|
|
116
116
|
* @returns {Promise<Board~Channel>}
|
|
117
117
|
*/
|
|
118
118
|
createChannel(conversation, channel) {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
119
|
+
const params = {
|
|
120
|
+
method: 'POST',
|
|
121
|
+
resource: '/channels',
|
|
122
|
+
body: this._prepareChannel(conversation, channel),
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
const boardServiceUrl = this.getClusterBoardServiceUrl(conversation);
|
|
126
|
+
|
|
127
|
+
if (boardServiceUrl) {
|
|
128
|
+
params.uri = `${boardServiceUrl}${params.resource}`;
|
|
129
|
+
delete params.resource;
|
|
130
|
+
} else {
|
|
131
|
+
params.api = 'board';
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return this.webex.request(params).then((res) => res.body);
|
|
127
135
|
},
|
|
128
136
|
|
|
129
137
|
/**
|
|
@@ -464,6 +472,34 @@ const Board = WebexPlugin.extend({
|
|
|
464
472
|
.then((res) => res.body);
|
|
465
473
|
},
|
|
466
474
|
|
|
475
|
+
/**
|
|
476
|
+
* Resolve the board service url co-located with the conversation's ACL cluster.
|
|
477
|
+
* Board data lives in the cluster encoded by the ACL url; hitting the home board
|
|
478
|
+
* cluster instead triggers a cross-cluster 307 the browser cannot follow.
|
|
479
|
+
* @memberof Board.BoardService
|
|
480
|
+
* @param {Conversation~ConversationObject} conversation
|
|
481
|
+
* @returns {string|undefined} board API base url for the conversation's cluster
|
|
482
|
+
*/
|
|
483
|
+
getClusterBoardServiceUrl(conversation = {}) {
|
|
484
|
+
const {aclUrl} = conversation;
|
|
485
|
+
|
|
486
|
+
if (!aclUrl) {
|
|
487
|
+
return undefined;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
const {services} = this.webex.internal;
|
|
491
|
+
const clusterId = services.getClusterId(aclUrl);
|
|
492
|
+
|
|
493
|
+
if (!clusterId) {
|
|
494
|
+
return undefined;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Swap the trailing service token (e.g. `acl-write`) for the board API token.
|
|
498
|
+
const boardClusterId = [...clusterId.split(':').slice(0, -1), 'board'].join(':');
|
|
499
|
+
|
|
500
|
+
return services.getServiceFromClusterId({clusterId: boardClusterId})?.url;
|
|
501
|
+
},
|
|
502
|
+
|
|
467
503
|
/**
|
|
468
504
|
* Gets Channels
|
|
469
505
|
* @memberof Board.BoardService
|
|
@@ -481,7 +517,6 @@ const Board = WebexPlugin.extend({
|
|
|
481
517
|
}
|
|
482
518
|
|
|
483
519
|
const params = {
|
|
484
|
-
api: 'board',
|
|
485
520
|
resource: '/channels',
|
|
486
521
|
qs: {
|
|
487
522
|
aclUrlLink: conversation.aclUrl,
|
|
@@ -490,6 +525,15 @@ const Board = WebexPlugin.extend({
|
|
|
490
525
|
|
|
491
526
|
assign(params.qs, pick(options, 'channelsLimit', 'type'));
|
|
492
527
|
|
|
528
|
+
const boardServiceUrl = this.getClusterBoardServiceUrl(conversation);
|
|
529
|
+
|
|
530
|
+
if (boardServiceUrl) {
|
|
531
|
+
params.uri = `${boardServiceUrl}${params.resource}`;
|
|
532
|
+
delete params.resource;
|
|
533
|
+
} else {
|
|
534
|
+
params.api = 'board';
|
|
535
|
+
}
|
|
536
|
+
|
|
493
537
|
return this.request(params).then((res) => new Page(res, this.webex));
|
|
494
538
|
},
|
|
495
539
|
|
package/test/unit/spec/board.js
CHANGED
|
@@ -227,16 +227,29 @@ describe('plugin-board', () => {
|
|
|
227
227
|
});
|
|
228
228
|
|
|
229
229
|
describe('#createChannel()', () => {
|
|
230
|
+
const clusterBoardServiceUrl = 'https://board-a.wbx2.com/board/api/v1';
|
|
230
231
|
const channelRequestBody = {
|
|
231
232
|
aclUrlLink: channel.aclUrlLink,
|
|
232
233
|
kmsMessage: channel.kmsMessage,
|
|
233
234
|
};
|
|
234
235
|
|
|
235
236
|
beforeAll(() => {
|
|
236
|
-
webex.request.resetHistory();
|
|
237
237
|
webex.request.returns(Promise.resolve({statusCode: 200, body: channelRes}));
|
|
238
|
+
});
|
|
238
239
|
|
|
239
|
-
|
|
240
|
+
beforeEach(() => {
|
|
241
|
+
webex.request.resetHistory();
|
|
242
|
+
webex.internal.services = {
|
|
243
|
+
getClusterId: sinon.stub().returns('urn:TEAM:us-east-2_a:acl-write'),
|
|
244
|
+
getServiceFromClusterId: sinon.stub().returns({
|
|
245
|
+
name: 'board',
|
|
246
|
+
url: clusterBoardServiceUrl,
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
afterEach(() => {
|
|
252
|
+
delete webex.internal.services;
|
|
240
253
|
});
|
|
241
254
|
|
|
242
255
|
afterAll(() => {
|
|
@@ -252,6 +265,7 @@ describe('plugin-board', () => {
|
|
|
252
265
|
it('supports creating ambiguous channels for PMR support', () => {
|
|
253
266
|
return webex.internal.board.createChannel()
|
|
254
267
|
.then(() => {
|
|
268
|
+
assert.notCalled(webex.internal.services.getClusterId);
|
|
255
269
|
assert.calledWith(
|
|
256
270
|
webex.request,
|
|
257
271
|
sinon.match({
|
|
@@ -271,7 +285,55 @@ describe('plugin-board', () => {
|
|
|
271
285
|
})
|
|
272
286
|
});
|
|
273
287
|
|
|
274
|
-
it('
|
|
288
|
+
it('resolves the board host from the conversation ACL cluster', () => {
|
|
289
|
+
return webex.internal.board.createChannel(conversation)
|
|
290
|
+
.then(() => {
|
|
291
|
+
assert.calledWith(webex.internal.services.getClusterId, conversation.aclUrl);
|
|
292
|
+
assert.calledWith(webex.internal.services.getServiceFromClusterId, {
|
|
293
|
+
clusterId: 'urn:TEAM:us-east-2_a:board',
|
|
294
|
+
});
|
|
295
|
+
assert.calledWith(
|
|
296
|
+
webex.request,
|
|
297
|
+
sinon.match({
|
|
298
|
+
method: 'POST',
|
|
299
|
+
uri: `${clusterBoardServiceUrl}/channels`,
|
|
300
|
+
body: channelRequestBody,
|
|
301
|
+
}),
|
|
302
|
+
);
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it('does not target the home board cluster when a cluster host resolves', () => {
|
|
307
|
+
return webex.internal.board.createChannel(conversation)
|
|
308
|
+
.then(() => {
|
|
309
|
+
const [requestOptions] = webex.request.args[0];
|
|
310
|
+
|
|
311
|
+
assert.notProperty(requestOptions, 'api');
|
|
312
|
+
assert.notProperty(requestOptions, 'resource');
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('falls back to the home board service when the cluster cannot be resolved', () => {
|
|
317
|
+
webex.internal.services.getClusterId.returns(undefined);
|
|
318
|
+
|
|
319
|
+
return webex.internal.board.createChannel(conversation)
|
|
320
|
+
.then(() => {
|
|
321
|
+
assert.notCalled(webex.internal.services.getServiceFromClusterId);
|
|
322
|
+
assert.calledWith(
|
|
323
|
+
webex.request,
|
|
324
|
+
sinon.match({
|
|
325
|
+
method: 'POST',
|
|
326
|
+
api: 'board',
|
|
327
|
+
resource: '/channels',
|
|
328
|
+
body: channelRequestBody,
|
|
329
|
+
}),
|
|
330
|
+
);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
it('falls back to the home board service when no board host exists for the cluster', () => {
|
|
335
|
+
webex.internal.services.getServiceFromClusterId.returns(undefined);
|
|
336
|
+
|
|
275
337
|
return webex.internal.board.createChannel(conversation)
|
|
276
338
|
.then(() => {
|
|
277
339
|
assert.calledWith(
|
|
@@ -568,6 +630,108 @@ describe('plugin-board', () => {
|
|
|
568
630
|
assert.isRejected(webex.internal.board.getChannels(), '`conversation` is required'));
|
|
569
631
|
});
|
|
570
632
|
|
|
633
|
+
describe('#getChannels()', () => {
|
|
634
|
+
const clusterBoardServiceUrl = 'https://board-a.wbx2.com/board/api/v1';
|
|
635
|
+
|
|
636
|
+
beforeEach(() => {
|
|
637
|
+
webex.request.resetHistory();
|
|
638
|
+
webex.internal.services = {
|
|
639
|
+
getClusterId: sinon.stub().returns('urn:TEAM:us-east-2_a:acl-write'),
|
|
640
|
+
getServiceFromClusterId: sinon.stub().returns({
|
|
641
|
+
name: 'board',
|
|
642
|
+
url: clusterBoardServiceUrl,
|
|
643
|
+
}),
|
|
644
|
+
};
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
afterEach(() => {
|
|
648
|
+
delete webex.internal.services;
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
it('resolves the board host from the conversation ACL cluster', () =>
|
|
652
|
+
webex.internal.board.getChannels(conversation).then(() => {
|
|
653
|
+
assert.calledWith(webex.internal.services.getClusterId, conversation.aclUrl);
|
|
654
|
+
assert.calledWith(webex.internal.services.getServiceFromClusterId, {
|
|
655
|
+
clusterId: 'urn:TEAM:us-east-2_a:board',
|
|
656
|
+
});
|
|
657
|
+
assert.calledWith(
|
|
658
|
+
webex.request,
|
|
659
|
+
sinon.match({
|
|
660
|
+
uri: `${clusterBoardServiceUrl}/channels`,
|
|
661
|
+
qs: {aclUrlLink: conversation.aclUrl},
|
|
662
|
+
})
|
|
663
|
+
);
|
|
664
|
+
}));
|
|
665
|
+
|
|
666
|
+
it('does not target the home board cluster when a cluster host resolves', () =>
|
|
667
|
+
webex.internal.board.getChannels(conversation).then(() => {
|
|
668
|
+
const [requestOptions] = webex.request.args[0];
|
|
669
|
+
|
|
670
|
+
assert.notProperty(requestOptions, 'api');
|
|
671
|
+
assert.notProperty(requestOptions, 'resource');
|
|
672
|
+
}));
|
|
673
|
+
|
|
674
|
+
it('forwards channelsLimit and type as query params', () =>
|
|
675
|
+
webex.internal.board
|
|
676
|
+
.getChannels(conversation, {channelsLimit: 25, type: 'annotated'})
|
|
677
|
+
.then(() => {
|
|
678
|
+
assert.calledWith(
|
|
679
|
+
webex.request,
|
|
680
|
+
sinon.match({
|
|
681
|
+
uri: `${clusterBoardServiceUrl}/channels`,
|
|
682
|
+
qs: {
|
|
683
|
+
aclUrlLink: conversation.aclUrl,
|
|
684
|
+
channelsLimit: 25,
|
|
685
|
+
type: 'annotated',
|
|
686
|
+
},
|
|
687
|
+
})
|
|
688
|
+
);
|
|
689
|
+
}));
|
|
690
|
+
|
|
691
|
+
it('falls back to the home board service when the conversation has no aclUrl', () =>
|
|
692
|
+
webex.internal.board.getChannels({id: 'no-acl'}).then(() => {
|
|
693
|
+
assert.notCalled(webex.internal.services.getClusterId);
|
|
694
|
+
assert.calledWith(
|
|
695
|
+
webex.request,
|
|
696
|
+
sinon.match({
|
|
697
|
+
api: 'board',
|
|
698
|
+
resource: '/channels',
|
|
699
|
+
})
|
|
700
|
+
);
|
|
701
|
+
}));
|
|
702
|
+
|
|
703
|
+
it('falls back to the home board service when the cluster cannot be resolved', () => {
|
|
704
|
+
webex.internal.services.getClusterId.returns(undefined);
|
|
705
|
+
|
|
706
|
+
return webex.internal.board.getChannels(conversation).then(() => {
|
|
707
|
+
assert.notCalled(webex.internal.services.getServiceFromClusterId);
|
|
708
|
+
assert.calledWith(
|
|
709
|
+
webex.request,
|
|
710
|
+
sinon.match({
|
|
711
|
+
api: 'board',
|
|
712
|
+
resource: '/channels',
|
|
713
|
+
qs: {aclUrlLink: conversation.aclUrl},
|
|
714
|
+
})
|
|
715
|
+
);
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
it('falls back to the home board service when no board host exists for the cluster', () => {
|
|
720
|
+
webex.internal.services.getServiceFromClusterId.returns(undefined);
|
|
721
|
+
|
|
722
|
+
return webex.internal.board.getChannels(conversation).then(() => {
|
|
723
|
+
assert.calledWith(
|
|
724
|
+
webex.request,
|
|
725
|
+
sinon.match({
|
|
726
|
+
api: 'board',
|
|
727
|
+
resource: '/channels',
|
|
728
|
+
qs: {aclUrlLink: conversation.aclUrl},
|
|
729
|
+
})
|
|
730
|
+
);
|
|
731
|
+
});
|
|
732
|
+
});
|
|
733
|
+
});
|
|
734
|
+
|
|
571
735
|
describe('#getContents()', () => {
|
|
572
736
|
beforeEach(() => {
|
|
573
737
|
sinon.stub(webex.internal.board, 'decryptContents').returns(['foo']);
|