@webex/plugin-meetings 3.0.0-beta.28 → 3.0.0-beta.29
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/breakouts/breakout.js +22 -1
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/index.js +59 -1
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +23 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +1 -0
- package/package.json +18 -18
- package/src/breakouts/README.md +2 -2
- package/src/breakouts/breakout.ts +20 -0
- package/src/breakouts/index.ts +58 -2
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +15 -0
- package/test/unit/spec/breakouts/breakout.ts +32 -4
- package/test/unit/spec/breakouts/index.ts +105 -10
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +21 -0
|
@@ -9,6 +9,7 @@ exports.default = void 0;
|
|
|
9
9
|
var _webexCore = require("@webex/webex-core");
|
|
10
10
|
var _constants = require("../constants");
|
|
11
11
|
var _members = _interopRequireDefault(require("../members"));
|
|
12
|
+
var _request = _interopRequireDefault(require("./request"));
|
|
12
13
|
/*!
|
|
13
14
|
* Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
|
|
14
15
|
*/
|
|
@@ -19,6 +20,7 @@ var _members = _interopRequireDefault(require("../members"));
|
|
|
19
20
|
var Breakout = _webexCore.WebexPlugin.extend({
|
|
20
21
|
idAttribute: 'sessionId',
|
|
21
22
|
namespace: _constants.MEETINGS,
|
|
23
|
+
breakoutRequest: _request.default,
|
|
22
24
|
props: {
|
|
23
25
|
active: ['boolean', false, false],
|
|
24
26
|
// this session is active
|
|
@@ -55,6 +57,10 @@ var Breakout = _webexCore.WebexPlugin.extend({
|
|
|
55
57
|
this.members = new _members.default({}, {
|
|
56
58
|
parent: this.webex
|
|
57
59
|
});
|
|
60
|
+
// @ts-ignore
|
|
61
|
+
this.breakoutRequest = new _request.default({
|
|
62
|
+
webex: this.webex
|
|
63
|
+
});
|
|
58
64
|
},
|
|
59
65
|
/**
|
|
60
66
|
* Joins the breakout session
|
|
@@ -109,7 +115,22 @@ var Breakout = _webexCore.WebexPlugin.extend({
|
|
|
109
115
|
parseRoster: function parseRoster(locus) {
|
|
110
116
|
this.members.locusParticipantsUpdate(locus);
|
|
111
117
|
},
|
|
112
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Broadcast message to this breakout session's participants
|
|
120
|
+
* @param {String} message
|
|
121
|
+
* @param {Object} options
|
|
122
|
+
* @returns {Promise}
|
|
123
|
+
*/
|
|
124
|
+
broadcast: function broadcast(message, options) {
|
|
125
|
+
return this.breakoutRequest.broadcast({
|
|
126
|
+
url: this.url,
|
|
127
|
+
message: message,
|
|
128
|
+
options: options,
|
|
129
|
+
groupId: this.groupId,
|
|
130
|
+
sessionId: this.sessionId
|
|
131
|
+
});
|
|
132
|
+
},
|
|
133
|
+
version: "3.0.0-beta.29"
|
|
113
134
|
});
|
|
114
135
|
var _default = Breakout;
|
|
115
136
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Breakout","WebexPlugin","extend","idAttribute","namespace","MEETINGS","props","active","allowed","assigned","assignedCurrent","requested","current","name","sessionId","sessionType","groupId","url","derived","isMain","deps","fn","initialize","members","Members","parent","webex","join","request","method","HTTP_VERBS","POST","uri","body","leave","Error","mainSession","breakouts","filter","breakout","askForHelp","parseRoster","locus","locusParticipantsUpdate"],"sources":["breakout.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {HTTP_VERBS, MEETINGS} from '../constants';\nimport LocusInfo from '../locus-info';\nimport Members from '../members';\n\n/**\n * @class\n */\nconst Breakout = WebexPlugin.extend({\n idAttribute: 'sessionId',\n\n namespace: MEETINGS,\n\n props: {\n active: ['boolean', false, false], // this session is active\n allowed: ['boolean', false, false], // allowed to join this session\n assigned: ['boolean', false, false], // assigned to this session, but not necessarily joined yet\n assignedCurrent: ['boolean', false, false], // assigned AND current session\n requested: ['boolean', false, false], // requested by the host to join this session\n current: ['boolean', false, false], // the current joined session\n name: 'string',\n sessionId: 'string',\n sessionType: 'string',\n groupId: 'string',\n url: 'string', // where to send requests to\n },\n\n derived: {\n isMain: {\n deps: ['sessionType'],\n /**\n * If the breakout has no name, assume it is the main session\n * @returns {boolean}\n */\n fn() {\n return this.sessionType === 'MAIN';\n },\n },\n },\n\n initialize() {\n this.members = new Members({}, {parent: this.webex});\n },\n\n /**\n * Joins the breakout session\n * @returns {Promise}\n */\n join() {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${this.url}/move`,\n body: {\n groupId: this.groupId,\n sessionId: this.sessionId,\n },\n });\n },\n\n /**\n * Leaves the breakout session to return to the main session\n * @returns {Promise}\n * @throws {Error} if an attempt is made to leave the main session or if the main session cannot be found\n */\n leave() {\n if (this.isMain) {\n throw new Error('Cannot leave the main session');\n }\n\n const mainSession = this.parent.breakouts.filter((breakout) => breakout.isMain)[0];\n\n if (!mainSession) {\n throw new Error('Cannot leave, no main session found');\n }\n\n return mainSession.join();\n },\n\n /**\n * Sends a help request for the current breakout\n * @returns {Promise}\n */\n askForHelp() {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${this.url}/help`,\n body: {\n groupId: this.groupId,\n sessionId: this.sessionId,\n },\n });\n },\n\n /**\n * Parses the participants from the locus object\n * @param locus Locus object\n * @returns {void}\n */\n\n parseRoster(locus) {\n this.members.locusParticipantsUpdate(locus);\n },\n});\n\nexport default Breakout;\n"],"mappings":";;;;;;;;AAIA;AAEA;AAEA;
|
|
1
|
+
{"version":3,"names":["Breakout","WebexPlugin","extend","idAttribute","namespace","MEETINGS","breakoutRequest","BreakoutRequest","props","active","allowed","assigned","assignedCurrent","requested","current","name","sessionId","sessionType","groupId","url","derived","isMain","deps","fn","initialize","members","Members","parent","webex","join","request","method","HTTP_VERBS","POST","uri","body","leave","Error","mainSession","breakouts","filter","breakout","askForHelp","parseRoster","locus","locusParticipantsUpdate","broadcast","message","options"],"sources":["breakout.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {HTTP_VERBS, MEETINGS} from '../constants';\nimport LocusInfo from '../locus-info';\nimport Members from '../members';\nimport BreakoutRequest from './request';\n\n/**\n * @class\n */\nconst Breakout = WebexPlugin.extend({\n idAttribute: 'sessionId',\n\n namespace: MEETINGS,\n\n breakoutRequest: BreakoutRequest,\n props: {\n active: ['boolean', false, false], // this session is active\n allowed: ['boolean', false, false], // allowed to join this session\n assigned: ['boolean', false, false], // assigned to this session, but not necessarily joined yet\n assignedCurrent: ['boolean', false, false], // assigned AND current session\n requested: ['boolean', false, false], // requested by the host to join this session\n current: ['boolean', false, false], // the current joined session\n name: 'string',\n sessionId: 'string',\n sessionType: 'string',\n groupId: 'string',\n url: 'string', // where to send requests to\n },\n\n derived: {\n isMain: {\n deps: ['sessionType'],\n /**\n * If the breakout has no name, assume it is the main session\n * @returns {boolean}\n */\n fn() {\n return this.sessionType === 'MAIN';\n },\n },\n },\n\n initialize() {\n this.members = new Members({}, {parent: this.webex});\n // @ts-ignore\n this.breakoutRequest = new BreakoutRequest({webex: this.webex});\n },\n\n /**\n * Joins the breakout session\n * @returns {Promise}\n */\n join() {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${this.url}/move`,\n body: {\n groupId: this.groupId,\n sessionId: this.sessionId,\n },\n });\n },\n\n /**\n * Leaves the breakout session to return to the main session\n * @returns {Promise}\n * @throws {Error} if an attempt is made to leave the main session or if the main session cannot be found\n */\n leave() {\n if (this.isMain) {\n throw new Error('Cannot leave the main session');\n }\n\n const mainSession = this.parent.breakouts.filter((breakout) => breakout.isMain)[0];\n\n if (!mainSession) {\n throw new Error('Cannot leave, no main session found');\n }\n\n return mainSession.join();\n },\n\n /**\n * Sends a help request for the current breakout\n * @returns {Promise}\n */\n askForHelp() {\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${this.url}/help`,\n body: {\n groupId: this.groupId,\n sessionId: this.sessionId,\n },\n });\n },\n\n /**\n * Parses the participants from the locus object\n * @param locus Locus object\n * @returns {void}\n */\n\n parseRoster(locus) {\n this.members.locusParticipantsUpdate(locus);\n },\n\n /**\n * Broadcast message to this breakout session's participants\n * @param {String} message\n * @param {Object} options\n * @returns {Promise}\n */\n broadcast(message, options) {\n return this.breakoutRequest.broadcast({\n url: this.url,\n message,\n options,\n groupId: this.groupId,\n sessionId: this.sessionId,\n });\n },\n});\n\nexport default Breakout;\n"],"mappings":"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"}
|
package/dist/breakouts/index.js
CHANGED
|
@@ -18,6 +18,7 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
|
|
|
18
18
|
var _constants = require("../constants");
|
|
19
19
|
var _breakout = _interopRequireDefault(require("./breakout"));
|
|
20
20
|
var _collection = _interopRequireDefault(require("./collection"));
|
|
21
|
+
var _request = _interopRequireDefault(require("./request"));
|
|
21
22
|
/*!
|
|
22
23
|
* Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
|
|
23
24
|
*/
|
|
@@ -27,6 +28,7 @@ var _collection = _interopRequireDefault(require("./collection"));
|
|
|
27
28
|
*/
|
|
28
29
|
var Breakouts = _webexCore.WebexPlugin.extend({
|
|
29
30
|
namespace: _constants.MEETINGS,
|
|
31
|
+
breakoutRequest: _request.default,
|
|
30
32
|
collections: {
|
|
31
33
|
breakouts: _collection.default
|
|
32
34
|
},
|
|
@@ -91,6 +93,10 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
91
93
|
});
|
|
92
94
|
this.listenToBroadcastMessages();
|
|
93
95
|
this.listenToBreakoutRosters();
|
|
96
|
+
// @ts-ignore
|
|
97
|
+
this.breakoutRequest = new _request.default({
|
|
98
|
+
webex: this.webex
|
|
99
|
+
});
|
|
94
100
|
},
|
|
95
101
|
/**
|
|
96
102
|
* Calls this to clean up listeners
|
|
@@ -233,6 +239,58 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
233
239
|
});
|
|
234
240
|
this.breakouts.set((0, _values.default)(breakouts));
|
|
235
241
|
},
|
|
242
|
+
/**
|
|
243
|
+
* get main session
|
|
244
|
+
* @returns {Breakout}
|
|
245
|
+
*/
|
|
246
|
+
getMainSession: function getMainSession() {
|
|
247
|
+
if (this.isInMainSession) {
|
|
248
|
+
return this.currentBreakoutSession;
|
|
249
|
+
}
|
|
250
|
+
var mainSession = this.breakouts.filter(function (breakout) {
|
|
251
|
+
return breakout.isMain;
|
|
252
|
+
})[0];
|
|
253
|
+
if (!mainSession) {
|
|
254
|
+
throw new Error('no main session found');
|
|
255
|
+
}
|
|
256
|
+
return mainSession;
|
|
257
|
+
},
|
|
258
|
+
/**
|
|
259
|
+
* Host/CoHost ask all participants return to main session
|
|
260
|
+
* @returns {Promise}
|
|
261
|
+
*/
|
|
262
|
+
askAllToReturn: function askAllToReturn() {
|
|
263
|
+
var mainSession = this.getMainSession();
|
|
264
|
+
return this.webex.request({
|
|
265
|
+
method: _constants.HTTP_VERBS.POST,
|
|
266
|
+
uri: "".concat(this.url, "/requestMove"),
|
|
267
|
+
body: {
|
|
268
|
+
groupId: mainSession.groupId,
|
|
269
|
+
sessionId: mainSession.sessionId
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
},
|
|
273
|
+
/**
|
|
274
|
+
* Broadcast message to all breakout session's participants
|
|
275
|
+
* @param {String} message
|
|
276
|
+
* @param {Object} options
|
|
277
|
+
* @returns {Promise}
|
|
278
|
+
*/
|
|
279
|
+
broadcast: function broadcast(message, options) {
|
|
280
|
+
var _this$breakouts$filte;
|
|
281
|
+
var breakoutGroupId = this.isInMainSession ? (_this$breakouts$filte = this.breakouts.filter(function (breakout) {
|
|
282
|
+
return !breakout.isMain;
|
|
283
|
+
})[0]) === null || _this$breakouts$filte === void 0 ? void 0 : _this$breakouts$filte.groupId : this.groupId;
|
|
284
|
+
if (!breakoutGroupId) {
|
|
285
|
+
throw new Error('Cannot broadcast, no breakout session found');
|
|
286
|
+
}
|
|
287
|
+
return this.breakoutRequest.broadcast({
|
|
288
|
+
url: this.url,
|
|
289
|
+
message: message,
|
|
290
|
+
options: options,
|
|
291
|
+
groupId: breakoutGroupId
|
|
292
|
+
});
|
|
293
|
+
},
|
|
236
294
|
/**
|
|
237
295
|
* Make enable breakout resource
|
|
238
296
|
* @returns {Promise}
|
|
@@ -309,7 +367,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
|
309
367
|
}
|
|
310
368
|
});
|
|
311
369
|
},
|
|
312
|
-
version: "3.0.0-beta.
|
|
370
|
+
version: "3.0.0-beta.29"
|
|
313
371
|
});
|
|
314
372
|
var _default = Breakouts;
|
|
315
373
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Breakouts","WebexPlugin","extend","namespace","MEETINGS","collections","breakouts","BreakoutCollection","props","allowBackToMain","delayCloseTime","enableBreakoutSession","groupId","name","sessionId","sessionType","startTime","status","url","locusUrl","breakoutServiceUrl","children","currentBreakoutSession","Breakout","derived","isInMainSession","deps","fn","BREAKOUTS","SESSION_TYPES","MAIN","initialize","listenTo","STATUS","CLOSING","trigger","EVENTS","BREAKOUTS_CLOSING","debouncedQueryRosters","queryRosters","leading","trailing","listenToBroadcastMessages","listenToBreakoutRosters","cleanUp","stopListening","locusUrlUpdate","set","breakoutServiceUrlUpdate","webex","request","uri","qs","btoa","then","result","rosters","body","forEach","locus","handleRosterUpdate","MEMBERS_UPDATE","catch","error","LoggerProxy","logger","controls","breakout","session","get","parseRoster","internal","llm","event","data","senderUserId","sentTime","message","MESSAGE","mercury","updateBreakout","params","current","SESSION_STATES","ACTIVE","ALLOWED","ASSIGNED_CURRENT","REQUESTED","updateBreakoutSessions","payload","breakoutSessions","state","ASSIGNED","enableBreakouts","method","HTTP_VERBS","POST","err","reject","Error","toggleBreakout","enable","undefined","info","doToggleBreakout","PUT"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {debounce, forEach} from 'lodash';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {BREAKOUTS, MEETINGS, HTTP_VERBS} from '../constants';\n\nimport Breakout from './breakout';\nimport BreakoutCollection from './collection';\n\n/**\n * @class Breakouts\n */\nconst Breakouts = WebexPlugin.extend({\n namespace: MEETINGS,\n\n collections: {\n breakouts: BreakoutCollection,\n },\n\n props: {\n allowBackToMain: 'boolean', // only present when in a breakout session\n delayCloseTime: 'number', // appears once breakouts start\n enableBreakoutSession: 'boolean', // appears from the moment you enable breakouts\n groupId: 'string', // appears from the moment you enable breakouts\n name: 'string', // only present when in a breakout session\n sessionId: 'string', // appears from the moment you enable breakouts\n sessionType: 'string', // appears from the moment you enable breakouts\n startTime: 'string', // appears once breakouts start\n status: 'string', // only present when in a breakout session\n url: 'string', // appears from the moment you enable breakouts\n locusUrl: 'string', // the current locus url\n breakoutServiceUrl: 'string', // the current breakout resouce url\n },\n\n children: {\n currentBreakoutSession: Breakout,\n },\n\n derived: {\n isInMainSession: {\n deps: ['sessionType'],\n /**\n * Returns true if the user is in the main session\n * @returns {boolean}\n */\n fn() {\n return this.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;\n },\n },\n },\n\n /**\n * initialize for the breakouts\n * @returns {void}\n */\n initialize() {\n this.listenTo(this, 'change:status', () => {\n if (this.status === BREAKOUTS.STATUS.CLOSING) {\n this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);\n }\n });\n this.debouncedQueryRosters = debounce(this.queryRosters, 10, {\n leading: true,\n trailing: false,\n });\n this.listenTo(this.breakouts, 'add', () => {\n this.debouncedQueryRosters();\n });\n this.listenToBroadcastMessages();\n this.listenToBreakoutRosters();\n },\n\n /**\n * Calls this to clean up listeners\n * @returns {void}\n */\n cleanUp() {\n this.stopListening();\n },\n\n /**\n * Update the current locus url of the meeting\n * @param {string} locusUrl // locus url\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current breakout resouce url\n * @param {string} breakoutServiceUrl\n * @returns {void}\n */\n breakoutServiceUrlUpdate(breakoutServiceUrl) {\n this.set('breakoutServiceUrl', `${breakoutServiceUrl}/breakout/`);\n },\n\n /**\n * The initial roster lists need to be queried because you don't\n * get a breakout.roster event when you join the meeting\n * @returns {void}\n */\n queryRosters() {\n this.webex\n .request({uri: `${this.url}/roster`, qs: {locusUrl: btoa(this.locusUrl)}})\n .then((result) => {\n const {\n body: {rosters},\n } = result;\n\n rosters.forEach(({locus}) => {\n this.handleRosterUpdate(locus);\n });\n\n this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:breakouts#queryRosters failed', error);\n });\n },\n\n /**\n *\n * @param {Object} locus // locus object\n * @returns {void}\n */\n handleRosterUpdate(locus) {\n const sessionId = locus.controls?.breakout?.sessionId;\n\n const session = this.breakouts.get(sessionId);\n\n if (!session) {\n return;\n }\n\n session.parseRoster(locus);\n },\n\n /**\n * Sets up listener for broadcast messages sent to the breakout session\n * @returns {void}\n */\n listenToBroadcastMessages() {\n this.listenTo(this.webex.internal.llm, 'event:breakout.message', (event) => {\n const {\n data: {senderUserId, sentTime, message},\n } = event;\n\n this.trigger(BREAKOUTS.EVENTS.MESSAGE, {\n senderUserId,\n sentTime,\n message,\n // FIXME: This is only the current sessionId\n // We'd need to check that the dataChannelUrl is still the same\n // to guarantee that this message was sent to this session\n sessionId: this.currentBreakoutSession.sessionId,\n });\n });\n },\n\n /**\n * Sets up a listener for roster messags from mecury\n * @returns {void}\n */\n listenToBreakoutRosters() {\n this.listenTo(this.webex.internal.mercury, 'event:breakout.roster', (event) => {\n this.handleRosterUpdate(event.data.locus);\n this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);\n });\n },\n\n /**\n * Updates the information about the current breakout\n * @param {Object} params\n * @returns {void}\n */\n updateBreakout(params) {\n this.set(params);\n\n this.set('currentBreakoutSession', {\n sessionId: params.sessionId,\n groupId: params.groupId,\n name: params.name,\n current: true,\n sessionType: params.sessionType,\n url: params.url,\n [BREAKOUTS.SESSION_STATES.ACTIVE]: false,\n [BREAKOUTS.SESSION_STATES.ALLOWED]: false,\n [BREAKOUTS.SESSION_STATES.ALLOWED]: false,\n [BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,\n [BREAKOUTS.SESSION_STATES.REQUESTED]: false,\n });\n\n this.set('enableBreakoutSession', params.enableBreakoutSession);\n },\n\n /**\n * Updates the information about available breakouts\n * @param {Object} payload\n * @returns {void}\n */\n updateBreakoutSessions(payload) {\n const breakouts = {};\n\n if (payload.breakoutSessions) {\n forEach(BREAKOUTS.SESSION_STATES, (state) => {\n forEach(payload.breakoutSessions[state], (breakout) => {\n const {sessionId} = breakout;\n\n if (!breakouts[sessionId]) {\n breakouts[sessionId] = breakout;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ACTIVE] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ALLOWED] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.REQUESTED] = false;\n }\n\n breakouts[sessionId][state] = true;\n });\n });\n }\n\n forEach(breakouts, (breakout: typeof Breakout) => {\n // eslint-disable-next-line no-param-reassign\n breakout.url = this.url;\n });\n\n this.breakouts.set(Object.values(breakouts));\n },\n\n /**\n * Make enable breakout resource\n * @returns {Promise}\n */\n enableBreakouts() {\n if (this.breakoutServiceUrl) {\n // @ts-ignore\n return this.webex\n .request({\n method: HTTP_VERBS.POST,\n uri: this.breakoutServiceUrl,\n body: {\n locusUrl: this.locusUrl,\n },\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#touchBreakout --> Error provisioning error ${err}`\n );\n throw err;\n });\n }\n\n return Promise.reject(new Error(`enableBreakouts: the breakoutServiceUrl is empty`));\n },\n\n /**\n * Make the meeting enbale or disable breakout session\n * @param {boolean} enable\n * @returns {Promise}\n */\n async toggleBreakout(enable) {\n if (this.enableBreakoutSession === undefined) {\n const info = await this.enableBreakouts();\n if (!enable) {\n // if enable is false, updateBreakout set the param then set enableBreakoutSession as false\n this.updateBreakout(info.body);\n await this.doToggleBreakout(enable);\n }\n } else {\n await this.doToggleBreakout(enable);\n }\n },\n\n /**\n * do toggle meeting breakout session enable or disable\n * @param {boolean} enable\n * @returns {Promise}\n */\n doToggleBreakout(enable) {\n // @ts-ignore\n return this.webex.request({\n method: HTTP_VERBS.PUT,\n uri: this.url,\n body: {\n enableBreakoutSession: enable,\n },\n });\n },\n});\n\nexport default Breakouts;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Breakouts","WebexPlugin","extend","namespace","MEETINGS","breakoutRequest","BreakoutRequest","collections","breakouts","BreakoutCollection","props","allowBackToMain","delayCloseTime","enableBreakoutSession","groupId","name","sessionId","sessionType","startTime","status","url","locusUrl","breakoutServiceUrl","children","currentBreakoutSession","Breakout","derived","isInMainSession","deps","fn","BREAKOUTS","SESSION_TYPES","MAIN","initialize","listenTo","STATUS","CLOSING","trigger","EVENTS","BREAKOUTS_CLOSING","debouncedQueryRosters","queryRosters","leading","trailing","listenToBroadcastMessages","listenToBreakoutRosters","webex","cleanUp","stopListening","locusUrlUpdate","set","breakoutServiceUrlUpdate","request","uri","qs","btoa","then","result","rosters","body","forEach","locus","handleRosterUpdate","MEMBERS_UPDATE","catch","error","LoggerProxy","logger","controls","breakout","session","get","parseRoster","internal","llm","event","data","senderUserId","sentTime","message","MESSAGE","mercury","updateBreakout","params","current","SESSION_STATES","ACTIVE","ALLOWED","ASSIGNED_CURRENT","REQUESTED","updateBreakoutSessions","payload","breakoutSessions","state","ASSIGNED","getMainSession","mainSession","filter","isMain","Error","askAllToReturn","method","HTTP_VERBS","POST","broadcast","options","breakoutGroupId","enableBreakouts","err","reject","toggleBreakout","enable","undefined","info","doToggleBreakout","PUT"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {debounce, forEach} from 'lodash';\nimport LoggerProxy from '../common/logs/logger-proxy';\n\nimport {BREAKOUTS, HTTP_VERBS, MEETINGS} from '../constants';\n\nimport Breakout from './breakout';\nimport BreakoutCollection from './collection';\nimport BreakoutRequest from './request';\n\n/**\n * @class Breakouts\n */\nconst Breakouts = WebexPlugin.extend({\n namespace: MEETINGS,\n breakoutRequest: BreakoutRequest,\n collections: {\n breakouts: BreakoutCollection,\n },\n\n props: {\n allowBackToMain: 'boolean', // only present when in a breakout session\n delayCloseTime: 'number', // appears once breakouts start\n enableBreakoutSession: 'boolean', // appears from the moment you enable breakouts\n groupId: 'string', // appears from the moment you enable breakouts\n name: 'string', // only present when in a breakout session\n sessionId: 'string', // appears from the moment you enable breakouts\n sessionType: 'string', // appears from the moment you enable breakouts\n startTime: 'string', // appears once breakouts start\n status: 'string', // only present when in a breakout session\n url: 'string', // appears from the moment you enable breakouts\n locusUrl: 'string', // the current locus url\n breakoutServiceUrl: 'string', // the current breakout resouce url\n },\n\n children: {\n currentBreakoutSession: Breakout,\n },\n\n derived: {\n isInMainSession: {\n deps: ['sessionType'],\n /**\n * Returns true if the user is in the main session\n * @returns {boolean}\n */\n fn() {\n return this.sessionType === BREAKOUTS.SESSION_TYPES.MAIN;\n },\n },\n },\n\n /**\n * initialize for the breakouts\n * @returns {void}\n */\n initialize() {\n this.listenTo(this, 'change:status', () => {\n if (this.status === BREAKOUTS.STATUS.CLOSING) {\n this.trigger(BREAKOUTS.EVENTS.BREAKOUTS_CLOSING);\n }\n });\n this.debouncedQueryRosters = debounce(this.queryRosters, 10, {\n leading: true,\n trailing: false,\n });\n this.listenTo(this.breakouts, 'add', () => {\n this.debouncedQueryRosters();\n });\n this.listenToBroadcastMessages();\n this.listenToBreakoutRosters();\n // @ts-ignore\n this.breakoutRequest = new BreakoutRequest({webex: this.webex});\n },\n\n /**\n * Calls this to clean up listeners\n * @returns {void}\n */\n cleanUp() {\n this.stopListening();\n },\n\n /**\n * Update the current locus url of the meeting\n * @param {string} locusUrl // locus url\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current breakout resouce url\n * @param {string} breakoutServiceUrl\n * @returns {void}\n */\n breakoutServiceUrlUpdate(breakoutServiceUrl) {\n this.set('breakoutServiceUrl', `${breakoutServiceUrl}/breakout/`);\n },\n\n /**\n * The initial roster lists need to be queried because you don't\n * get a breakout.roster event when you join the meeting\n * @returns {void}\n */\n queryRosters() {\n this.webex\n .request({uri: `${this.url}/roster`, qs: {locusUrl: btoa(this.locusUrl)}})\n .then((result) => {\n const {\n body: {rosters},\n } = result;\n\n rosters.forEach(({locus}) => {\n this.handleRosterUpdate(locus);\n });\n\n this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);\n })\n .catch((error) => {\n LoggerProxy.logger.error('Meeting:breakouts#queryRosters failed', error);\n });\n },\n\n /**\n *\n * @param {Object} locus // locus object\n * @returns {void}\n */\n handleRosterUpdate(locus) {\n const sessionId = locus.controls?.breakout?.sessionId;\n\n const session = this.breakouts.get(sessionId);\n\n if (!session) {\n return;\n }\n\n session.parseRoster(locus);\n },\n\n /**\n * Sets up listener for broadcast messages sent to the breakout session\n * @returns {void}\n */\n listenToBroadcastMessages() {\n this.listenTo(this.webex.internal.llm, 'event:breakout.message', (event) => {\n const {\n data: {senderUserId, sentTime, message},\n } = event;\n\n this.trigger(BREAKOUTS.EVENTS.MESSAGE, {\n senderUserId,\n sentTime,\n message,\n // FIXME: This is only the current sessionId\n // We'd need to check that the dataChannelUrl is still the same\n // to guarantee that this message was sent to this session\n sessionId: this.currentBreakoutSession.sessionId,\n });\n });\n },\n\n /**\n * Sets up a listener for roster messags from mecury\n * @returns {void}\n */\n listenToBreakoutRosters() {\n this.listenTo(this.webex.internal.mercury, 'event:breakout.roster', (event) => {\n this.handleRosterUpdate(event.data.locus);\n this.trigger(BREAKOUTS.EVENTS.MEMBERS_UPDATE);\n });\n },\n\n /**\n * Updates the information about the current breakout\n * @param {Object} params\n * @returns {void}\n */\n updateBreakout(params) {\n this.set(params);\n\n this.set('currentBreakoutSession', {\n sessionId: params.sessionId,\n groupId: params.groupId,\n name: params.name,\n current: true,\n sessionType: params.sessionType,\n url: params.url,\n [BREAKOUTS.SESSION_STATES.ACTIVE]: false,\n [BREAKOUTS.SESSION_STATES.ALLOWED]: false,\n [BREAKOUTS.SESSION_STATES.ALLOWED]: false,\n [BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT]: false,\n [BREAKOUTS.SESSION_STATES.REQUESTED]: false,\n });\n\n this.set('enableBreakoutSession', params.enableBreakoutSession);\n },\n\n /**\n * Updates the information about available breakouts\n * @param {Object} payload\n * @returns {void}\n */\n updateBreakoutSessions(payload) {\n const breakouts = {};\n\n if (payload.breakoutSessions) {\n forEach(BREAKOUTS.SESSION_STATES, (state) => {\n forEach(payload.breakoutSessions[state], (breakout) => {\n const {sessionId} = breakout;\n\n if (!breakouts[sessionId]) {\n breakouts[sessionId] = breakout;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ACTIVE] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ALLOWED] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.ASSIGNED_CURRENT] = false;\n breakouts[sessionId][BREAKOUTS.SESSION_STATES.REQUESTED] = false;\n }\n\n breakouts[sessionId][state] = true;\n });\n });\n }\n\n forEach(breakouts, (breakout: typeof Breakout) => {\n // eslint-disable-next-line no-param-reassign\n breakout.url = this.url;\n });\n\n this.breakouts.set(Object.values(breakouts));\n },\n /**\n * get main session\n * @returns {Breakout}\n */\n getMainSession() {\n if (this.isInMainSession) {\n return this.currentBreakoutSession;\n }\n\n const mainSession = this.breakouts.filter((breakout) => breakout.isMain)[0];\n if (!mainSession) {\n throw new Error('no main session found');\n }\n\n return mainSession;\n },\n /**\n * Host/CoHost ask all participants return to main session\n * @returns {Promise}\n */\n askAllToReturn() {\n const mainSession = this.getMainSession();\n\n return this.webex.request({\n method: HTTP_VERBS.POST,\n uri: `${this.url}/requestMove`,\n body: {\n groupId: mainSession.groupId,\n sessionId: mainSession.sessionId,\n },\n });\n },\n\n /**\n * Broadcast message to all breakout session's participants\n * @param {String} message\n * @param {Object} options\n * @returns {Promise}\n */\n broadcast(message, options) {\n const breakoutGroupId = this.isInMainSession\n ? this.breakouts.filter((breakout) => !breakout.isMain)[0]?.groupId\n : this.groupId;\n if (!breakoutGroupId) {\n throw new Error('Cannot broadcast, no breakout session found');\n }\n\n return this.breakoutRequest.broadcast({\n url: this.url,\n message,\n options,\n groupId: breakoutGroupId,\n });\n },\n /**\n * Make enable breakout resource\n * @returns {Promise}\n */\n enableBreakouts() {\n if (this.breakoutServiceUrl) {\n // @ts-ignore\n return this.webex\n .request({\n method: HTTP_VERBS.POST,\n uri: this.breakoutServiceUrl,\n body: {\n locusUrl: this.locusUrl,\n },\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:request#touchBreakout --> Error provisioning error ${err}`\n );\n throw err;\n });\n }\n\n return Promise.reject(new Error(`enableBreakouts: the breakoutServiceUrl is empty`));\n },\n\n /**\n * Make the meeting enbale or disable breakout session\n * @param {boolean} enable\n * @returns {Promise}\n */\n async toggleBreakout(enable) {\n if (this.enableBreakoutSession === undefined) {\n const info = await this.enableBreakouts();\n if (!enable) {\n // if enable is false, updateBreakout set the param then set enableBreakoutSession as false\n this.updateBreakout(info.body);\n await this.doToggleBreakout(enable);\n }\n } else {\n await this.doToggleBreakout(enable);\n }\n },\n\n /**\n * do toggle meeting breakout session enable or disable\n * @param {boolean} enable\n * @returns {Promise}\n */\n doToggleBreakout(enable) {\n // @ts-ignore\n return this.webex.request({\n method: HTTP_VERBS.PUT,\n uri: this.url,\n body: {\n enableBreakoutSession: enable,\n },\n });\n },\n});\n\nexport default Breakouts;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
5
|
+
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
exports.default = void 0;
|
|
10
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
11
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
12
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
13
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
14
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
15
|
+
var _webexCore = require("@webex/webex-core");
|
|
16
|
+
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
17
|
+
var _utils = require("./utils");
|
|
18
|
+
var _constants = require("../constants");
|
|
19
|
+
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
20
|
+
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
21
|
+
/**
|
|
22
|
+
* @class BreakoutRequest
|
|
23
|
+
*/
|
|
24
|
+
var BreakoutRequest = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
25
|
+
(0, _inherits2.default)(BreakoutRequest, _StatelessWebexPlugin);
|
|
26
|
+
var _super = _createSuper(BreakoutRequest);
|
|
27
|
+
function BreakoutRequest() {
|
|
28
|
+
(0, _classCallCheck2.default)(this, BreakoutRequest);
|
|
29
|
+
return _super.apply(this, arguments);
|
|
30
|
+
}
|
|
31
|
+
(0, _createClass2.default)(BreakoutRequest, [{
|
|
32
|
+
key: "broadcast",
|
|
33
|
+
value:
|
|
34
|
+
/**
|
|
35
|
+
* Broadcast message to all breakout session's participants
|
|
36
|
+
* @param {String} url
|
|
37
|
+
* @param {String} message
|
|
38
|
+
* @param {Object} options
|
|
39
|
+
* @param {string} groupId
|
|
40
|
+
* @param {string} sessionId
|
|
41
|
+
* @returns {Promise}
|
|
42
|
+
*/
|
|
43
|
+
function broadcast(_ref) {
|
|
44
|
+
var url = _ref.url,
|
|
45
|
+
message = _ref.message,
|
|
46
|
+
options = _ref.options,
|
|
47
|
+
groupId = _ref.groupId,
|
|
48
|
+
sessionId = _ref.sessionId;
|
|
49
|
+
var roles = (0, _utils.getBroadcastRoles)(options);
|
|
50
|
+
var params = {
|
|
51
|
+
id: groupId,
|
|
52
|
+
recipientRoles: roles.length ? roles : undefined,
|
|
53
|
+
sessions: sessionId ? [{
|
|
54
|
+
id: sessionId
|
|
55
|
+
}] : undefined
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
// @ts-ignore
|
|
59
|
+
return this.request({
|
|
60
|
+
method: _constants.HTTP_VERBS.POST,
|
|
61
|
+
uri: "".concat(url, "/message"),
|
|
62
|
+
body: {
|
|
63
|
+
message: message,
|
|
64
|
+
groups: [params]
|
|
65
|
+
}
|
|
66
|
+
}).catch(function (error) {
|
|
67
|
+
if (error.body && error.body.errorCode === 201409036 && error.statusCode === 409) {
|
|
68
|
+
_loggerProxy.default.logger.info("Breakouts#broadcast --> no joined participants");
|
|
69
|
+
} else {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}]);
|
|
75
|
+
return BreakoutRequest;
|
|
76
|
+
}(_webexCore.StatelessWebexPlugin);
|
|
77
|
+
exports.default = BreakoutRequest;
|
|
78
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BreakoutRequest","url","message","options","groupId","sessionId","roles","getBroadcastRoles","params","id","recipientRoles","length","undefined","sessions","request","method","HTTP_VERBS","POST","uri","body","groups","catch","error","errorCode","statusCode","LoggerProxy","logger","info","StatelessWebexPlugin"],"sources":["request.ts"],"sourcesContent":["import {StatelessWebexPlugin} from '@webex/webex-core';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {getBroadcastRoles} from './utils';\nimport {HTTP_VERBS} from '../constants';\n\n/**\n * @class BreakoutRequest\n */\nexport default class BreakoutRequest extends StatelessWebexPlugin {\n /**\n * Broadcast message to all breakout session's participants\n * @param {String} url\n * @param {String} message\n * @param {Object} options\n * @param {string} groupId\n * @param {string} sessionId\n * @returns {Promise}\n */\n broadcast({\n url,\n message,\n options,\n groupId,\n sessionId,\n }: {\n url: string;\n message: string;\n options?: object;\n groupId: string;\n sessionId?: string;\n }) {\n const roles = getBroadcastRoles(options);\n const params = {\n id: groupId,\n recipientRoles: roles.length ? roles : undefined,\n sessions: sessionId ? [{id: sessionId}] : undefined,\n };\n\n // @ts-ignore\n return this.request({\n method: HTTP_VERBS.POST,\n uri: `${url}/message`,\n body: {\n message,\n groups: [params],\n },\n }).catch((error) => {\n if (error.body && error.body.errorCode === 201409036 && error.statusCode === 409) {\n LoggerProxy.logger.info(`Breakouts#broadcast --> no joined participants`);\n } else {\n throw error;\n }\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AAAwC;AAAA;AAExC;AACA;AACA;AAFA,IAGqBA,eAAe;EAAA;EAAA;EAAA;IAAA;IAAA;EAAA;EAAA;IAAA;IAAA;IAClC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACE,yBAYG;MAAA,IAXDC,GAAG,QAAHA,GAAG;QACHC,OAAO,QAAPA,OAAO;QACPC,OAAO,QAAPA,OAAO;QACPC,OAAO,QAAPA,OAAO;QACPC,SAAS,QAATA,SAAS;MAQT,IAAMC,KAAK,GAAG,IAAAC,wBAAiB,EAACJ,OAAO,CAAC;MACxC,IAAMK,MAAM,GAAG;QACbC,EAAE,EAAEL,OAAO;QACXM,cAAc,EAAEJ,KAAK,CAACK,MAAM,GAAGL,KAAK,GAAGM,SAAS;QAChDC,QAAQ,EAAER,SAAS,GAAG,CAAC;UAACI,EAAE,EAAEJ;QAAS,CAAC,CAAC,GAAGO;MAC5C,CAAC;;MAED;MACA,OAAO,IAAI,CAACE,OAAO,CAAC;QAClBC,MAAM,EAAEC,qBAAU,CAACC,IAAI;QACvBC,GAAG,YAAKjB,GAAG,aAAU;QACrBkB,IAAI,EAAE;UACJjB,OAAO,EAAPA,OAAO;UACPkB,MAAM,EAAE,CAACZ,MAAM;QACjB;MACF,CAAC,CAAC,CAACa,KAAK,CAAC,UAACC,KAAK,EAAK;QAClB,IAAIA,KAAK,CAACH,IAAI,IAAIG,KAAK,CAACH,IAAI,CAACI,SAAS,KAAK,SAAS,IAAID,KAAK,CAACE,UAAU,KAAK,GAAG,EAAE;UAChFC,oBAAW,CAACC,MAAM,CAACC,IAAI,kDAAkD;QAC3E,CAAC,MAAM;UACL,MAAML,KAAK;QACb;MACF,CAAC,CAAC;IACJ;EAAC;EAAA;AAAA,EA7C0CM,+BAAoB;AAAA"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getBroadcastRoles = void 0;
|
|
8
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
9
|
+
var getBroadcastRoles = function getBroadcastRoles(options) {
|
|
10
|
+
var recipientRoles = [];
|
|
11
|
+
if (!options || !options.cohosts && !options.presenters) {
|
|
12
|
+
return recipientRoles;
|
|
13
|
+
}
|
|
14
|
+
if (options.cohosts) {
|
|
15
|
+
recipientRoles.push('COHOST');
|
|
16
|
+
}
|
|
17
|
+
if (options.presenters) {
|
|
18
|
+
recipientRoles.push('PRESENTER');
|
|
19
|
+
}
|
|
20
|
+
return recipientRoles;
|
|
21
|
+
};
|
|
22
|
+
exports.getBroadcastRoles = getBroadcastRoles;
|
|
23
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getBroadcastRoles","options","recipientRoles","cohosts","presenters","push"],"sources":["utils.ts"],"sourcesContent":["// eslint-disable-next-line import/prefer-default-export\nexport const getBroadcastRoles = (options): string[] => {\n const recipientRoles = [];\n if (!options || (!options.cohosts && !options.presenters)) {\n return recipientRoles;\n }\n if (options.cohosts) {\n recipientRoles.push('COHOST');\n }\n if (options.presenters) {\n recipientRoles.push('PRESENTER');\n }\n\n return recipientRoles;\n};\n"],"mappings":";;;;;;;AAAA;AACO,IAAMA,iBAAiB,GAAG,SAApBA,iBAAiB,CAAIC,OAAO,EAAe;EACtD,IAAMC,cAAc,GAAG,EAAE;EACzB,IAAI,CAACD,OAAO,IAAK,CAACA,OAAO,CAACE,OAAO,IAAI,CAACF,OAAO,CAACG,UAAW,EAAE;IACzD,OAAOF,cAAc;EACvB;EACA,IAAID,OAAO,CAACE,OAAO,EAAE;IACnBD,cAAc,CAACG,IAAI,CAAC,QAAQ,CAAC;EAC/B;EACA,IAAIJ,OAAO,CAACG,UAAU,EAAE;IACtBF,cAAc,CAACG,IAAI,CAAC,WAAW,CAAC;EAClC;EAEA,OAAOH,cAAc;AACvB,CAAC;AAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { StatelessWebexPlugin } from '@webex/webex-core';
|
|
2
|
+
/**
|
|
3
|
+
* @class BreakoutRequest
|
|
4
|
+
*/
|
|
5
|
+
export default class BreakoutRequest extends StatelessWebexPlugin {
|
|
6
|
+
/**
|
|
7
|
+
* Broadcast message to all breakout session's participants
|
|
8
|
+
* @param {String} url
|
|
9
|
+
* @param {String} message
|
|
10
|
+
* @param {Object} options
|
|
11
|
+
* @param {string} groupId
|
|
12
|
+
* @param {string} sessionId
|
|
13
|
+
* @returns {Promise}
|
|
14
|
+
*/
|
|
15
|
+
broadcast({ url, message, options, groupId, sessionId, }: {
|
|
16
|
+
url: string;
|
|
17
|
+
message: string;
|
|
18
|
+
options?: object;
|
|
19
|
+
groupId: string;
|
|
20
|
+
sessionId?: string;
|
|
21
|
+
}): any;
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getBroadcastRoles: (options: any) => string[];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.29",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "Cisco EULA (https://www.cisco.com/c/en/us/products/end-user-license-agreement.html)",
|
|
6
6
|
"contributors": [
|
|
@@ -32,12 +32,12 @@
|
|
|
32
32
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@webex/plugin-meetings": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mocha": "3.0.0-beta.
|
|
38
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
39
|
-
"@webex/test-helper-retry": "3.0.0-beta.
|
|
40
|
-
"@webex/test-helper-test-users": "3.0.0-beta.
|
|
35
|
+
"@webex/plugin-meetings": "3.0.0-beta.29",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.29",
|
|
37
|
+
"@webex/test-helper-mocha": "3.0.0-beta.29",
|
|
38
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.29",
|
|
39
|
+
"@webex/test-helper-retry": "3.0.0-beta.29",
|
|
40
|
+
"@webex/test-helper-test-users": "3.0.0-beta.29",
|
|
41
41
|
"chai": "^4.3.4",
|
|
42
42
|
"chai-as-promised": "^7.1.1",
|
|
43
43
|
"jsdom-global": "3.0.2",
|
|
@@ -45,18 +45,18 @@
|
|
|
45
45
|
"typed-emitter": "^2.1.0"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@webex/common": "3.0.0-beta.
|
|
48
|
+
"@webex/common": "3.0.0-beta.29",
|
|
49
49
|
"@webex/internal-media-core": "1.33.2",
|
|
50
|
-
"@webex/internal-plugin-conversation": "3.0.0-beta.
|
|
51
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
52
|
-
"@webex/internal-plugin-llm": "3.0.0-beta.
|
|
53
|
-
"@webex/internal-plugin-mercury": "3.0.0-beta.
|
|
54
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
55
|
-
"@webex/internal-plugin-support": "3.0.0-beta.
|
|
56
|
-
"@webex/internal-plugin-user": "3.0.0-beta.
|
|
57
|
-
"@webex/plugin-people": "3.0.0-beta.
|
|
58
|
-
"@webex/plugin-rooms": "3.0.0-beta.
|
|
59
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
50
|
+
"@webex/internal-plugin-conversation": "3.0.0-beta.29",
|
|
51
|
+
"@webex/internal-plugin-device": "3.0.0-beta.29",
|
|
52
|
+
"@webex/internal-plugin-llm": "3.0.0-beta.29",
|
|
53
|
+
"@webex/internal-plugin-mercury": "3.0.0-beta.29",
|
|
54
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.29",
|
|
55
|
+
"@webex/internal-plugin-support": "3.0.0-beta.29",
|
|
56
|
+
"@webex/internal-plugin-user": "3.0.0-beta.29",
|
|
57
|
+
"@webex/plugin-people": "3.0.0-beta.29",
|
|
58
|
+
"@webex/plugin-rooms": "3.0.0-beta.29",
|
|
59
|
+
"@webex/webex-core": "3.0.0-beta.29",
|
|
60
60
|
"ampersand-collection": "^2.0.2",
|
|
61
61
|
"bowser": "^2.11.0",
|
|
62
62
|
"btoa": "^1.2.1",
|
package/src/breakouts/README.md
CHANGED
|
@@ -141,11 +141,11 @@ breakouts.disable()
|
|
|
141
141
|
breakouts.askAllToReturn()
|
|
142
142
|
|
|
143
143
|
// Send a message to a breakout session
|
|
144
|
-
// You can determine which participant types receive the message
|
|
144
|
+
// You can determine which participant types receive the message, if no type set, default is to all participants
|
|
145
145
|
breakout.broadcast(message, {participants: boolean, cohosts: boolean, presenters: boolean})
|
|
146
146
|
|
|
147
147
|
// Send a message to All breakout sessions
|
|
148
|
-
// You can determine which participant types receive the message
|
|
148
|
+
// You can determine which participant types receive the message, if no type set, default is to all participants
|
|
149
149
|
breakouts.broadcast(message, {participants: boolean, cohosts: boolean, presenters: boolean})
|
|
150
150
|
|
|
151
151
|
// When breakouts are active you can cancel the automatic end of all sessions by calling this
|
|
@@ -7,6 +7,7 @@ import {WebexPlugin} from '@webex/webex-core';
|
|
|
7
7
|
import {HTTP_VERBS, MEETINGS} from '../constants';
|
|
8
8
|
import LocusInfo from '../locus-info';
|
|
9
9
|
import Members from '../members';
|
|
10
|
+
import BreakoutRequest from './request';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* @class
|
|
@@ -16,6 +17,7 @@ const Breakout = WebexPlugin.extend({
|
|
|
16
17
|
|
|
17
18
|
namespace: MEETINGS,
|
|
18
19
|
|
|
20
|
+
breakoutRequest: BreakoutRequest,
|
|
19
21
|
props: {
|
|
20
22
|
active: ['boolean', false, false], // this session is active
|
|
21
23
|
allowed: ['boolean', false, false], // allowed to join this session
|
|
@@ -45,6 +47,8 @@ const Breakout = WebexPlugin.extend({
|
|
|
45
47
|
|
|
46
48
|
initialize() {
|
|
47
49
|
this.members = new Members({}, {parent: this.webex});
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
this.breakoutRequest = new BreakoutRequest({webex: this.webex});
|
|
48
52
|
},
|
|
49
53
|
|
|
50
54
|
/**
|
|
@@ -105,6 +109,22 @@ const Breakout = WebexPlugin.extend({
|
|
|
105
109
|
parseRoster(locus) {
|
|
106
110
|
this.members.locusParticipantsUpdate(locus);
|
|
107
111
|
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Broadcast message to this breakout session's participants
|
|
115
|
+
* @param {String} message
|
|
116
|
+
* @param {Object} options
|
|
117
|
+
* @returns {Promise}
|
|
118
|
+
*/
|
|
119
|
+
broadcast(message, options) {
|
|
120
|
+
return this.breakoutRequest.broadcast({
|
|
121
|
+
url: this.url,
|
|
122
|
+
message,
|
|
123
|
+
options,
|
|
124
|
+
groupId: this.groupId,
|
|
125
|
+
sessionId: this.sessionId,
|
|
126
|
+
});
|
|
127
|
+
},
|
|
108
128
|
});
|
|
109
129
|
|
|
110
130
|
export default Breakout;
|
package/src/breakouts/index.ts
CHANGED
|
@@ -5,17 +5,18 @@ import {WebexPlugin} from '@webex/webex-core';
|
|
|
5
5
|
import {debounce, forEach} from 'lodash';
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
7
|
|
|
8
|
-
import {BREAKOUTS,
|
|
8
|
+
import {BREAKOUTS, HTTP_VERBS, MEETINGS} from '../constants';
|
|
9
9
|
|
|
10
10
|
import Breakout from './breakout';
|
|
11
11
|
import BreakoutCollection from './collection';
|
|
12
|
+
import BreakoutRequest from './request';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* @class Breakouts
|
|
15
16
|
*/
|
|
16
17
|
const Breakouts = WebexPlugin.extend({
|
|
17
18
|
namespace: MEETINGS,
|
|
18
|
-
|
|
19
|
+
breakoutRequest: BreakoutRequest,
|
|
19
20
|
collections: {
|
|
20
21
|
breakouts: BreakoutCollection,
|
|
21
22
|
},
|
|
@@ -71,6 +72,8 @@ const Breakouts = WebexPlugin.extend({
|
|
|
71
72
|
});
|
|
72
73
|
this.listenToBroadcastMessages();
|
|
73
74
|
this.listenToBreakoutRosters();
|
|
75
|
+
// @ts-ignore
|
|
76
|
+
this.breakoutRequest = new BreakoutRequest({webex: this.webex});
|
|
74
77
|
},
|
|
75
78
|
|
|
76
79
|
/**
|
|
@@ -232,7 +235,60 @@ const Breakouts = WebexPlugin.extend({
|
|
|
232
235
|
|
|
233
236
|
this.breakouts.set(Object.values(breakouts));
|
|
234
237
|
},
|
|
238
|
+
/**
|
|
239
|
+
* get main session
|
|
240
|
+
* @returns {Breakout}
|
|
241
|
+
*/
|
|
242
|
+
getMainSession() {
|
|
243
|
+
if (this.isInMainSession) {
|
|
244
|
+
return this.currentBreakoutSession;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
const mainSession = this.breakouts.filter((breakout) => breakout.isMain)[0];
|
|
248
|
+
if (!mainSession) {
|
|
249
|
+
throw new Error('no main session found');
|
|
250
|
+
}
|
|
235
251
|
|
|
252
|
+
return mainSession;
|
|
253
|
+
},
|
|
254
|
+
/**
|
|
255
|
+
* Host/CoHost ask all participants return to main session
|
|
256
|
+
* @returns {Promise}
|
|
257
|
+
*/
|
|
258
|
+
askAllToReturn() {
|
|
259
|
+
const mainSession = this.getMainSession();
|
|
260
|
+
|
|
261
|
+
return this.webex.request({
|
|
262
|
+
method: HTTP_VERBS.POST,
|
|
263
|
+
uri: `${this.url}/requestMove`,
|
|
264
|
+
body: {
|
|
265
|
+
groupId: mainSession.groupId,
|
|
266
|
+
sessionId: mainSession.sessionId,
|
|
267
|
+
},
|
|
268
|
+
});
|
|
269
|
+
},
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Broadcast message to all breakout session's participants
|
|
273
|
+
* @param {String} message
|
|
274
|
+
* @param {Object} options
|
|
275
|
+
* @returns {Promise}
|
|
276
|
+
*/
|
|
277
|
+
broadcast(message, options) {
|
|
278
|
+
const breakoutGroupId = this.isInMainSession
|
|
279
|
+
? this.breakouts.filter((breakout) => !breakout.isMain)[0]?.groupId
|
|
280
|
+
: this.groupId;
|
|
281
|
+
if (!breakoutGroupId) {
|
|
282
|
+
throw new Error('Cannot broadcast, no breakout session found');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return this.breakoutRequest.broadcast({
|
|
286
|
+
url: this.url,
|
|
287
|
+
message,
|
|
288
|
+
options,
|
|
289
|
+
groupId: breakoutGroupId,
|
|
290
|
+
});
|
|
291
|
+
},
|
|
236
292
|
/**
|
|
237
293
|
* Make enable breakout resource
|
|
238
294
|
* @returns {Promise}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {StatelessWebexPlugin} from '@webex/webex-core';
|
|
2
|
+
import LoggerProxy from '../common/logs/logger-proxy';
|
|
3
|
+
import {getBroadcastRoles} from './utils';
|
|
4
|
+
import {HTTP_VERBS} from '../constants';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @class BreakoutRequest
|
|
8
|
+
*/
|
|
9
|
+
export default class BreakoutRequest extends StatelessWebexPlugin {
|
|
10
|
+
/**
|
|
11
|
+
* Broadcast message to all breakout session's participants
|
|
12
|
+
* @param {String} url
|
|
13
|
+
* @param {String} message
|
|
14
|
+
* @param {Object} options
|
|
15
|
+
* @param {string} groupId
|
|
16
|
+
* @param {string} sessionId
|
|
17
|
+
* @returns {Promise}
|
|
18
|
+
*/
|
|
19
|
+
broadcast({
|
|
20
|
+
url,
|
|
21
|
+
message,
|
|
22
|
+
options,
|
|
23
|
+
groupId,
|
|
24
|
+
sessionId,
|
|
25
|
+
}: {
|
|
26
|
+
url: string;
|
|
27
|
+
message: string;
|
|
28
|
+
options?: object;
|
|
29
|
+
groupId: string;
|
|
30
|
+
sessionId?: string;
|
|
31
|
+
}) {
|
|
32
|
+
const roles = getBroadcastRoles(options);
|
|
33
|
+
const params = {
|
|
34
|
+
id: groupId,
|
|
35
|
+
recipientRoles: roles.length ? roles : undefined,
|
|
36
|
+
sessions: sessionId ? [{id: sessionId}] : undefined,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// @ts-ignore
|
|
40
|
+
return this.request({
|
|
41
|
+
method: HTTP_VERBS.POST,
|
|
42
|
+
uri: `${url}/message`,
|
|
43
|
+
body: {
|
|
44
|
+
message,
|
|
45
|
+
groups: [params],
|
|
46
|
+
},
|
|
47
|
+
}).catch((error) => {
|
|
48
|
+
if (error.body && error.body.errorCode === 201409036 && error.statusCode === 409) {
|
|
49
|
+
LoggerProxy.logger.info(`Breakouts#broadcast --> no joined participants`);
|
|
50
|
+
} else {
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
2
|
+
export const getBroadcastRoles = (options): string[] => {
|
|
3
|
+
const recipientRoles = [];
|
|
4
|
+
if (!options || (!options.cohosts && !options.presenters)) {
|
|
5
|
+
return recipientRoles;
|
|
6
|
+
}
|
|
7
|
+
if (options.cohosts) {
|
|
8
|
+
recipientRoles.push('COHOST');
|
|
9
|
+
}
|
|
10
|
+
if (options.presenters) {
|
|
11
|
+
recipientRoles.push('PRESENTER');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return recipientRoles;
|
|
15
|
+
};
|
|
@@ -35,7 +35,7 @@ describe('plugin-meetings', () => {
|
|
|
35
35
|
describe('#join', () => {
|
|
36
36
|
it('makes the request as expected', async () => {
|
|
37
37
|
const result = await breakout.join()
|
|
38
|
-
|
|
38
|
+
|
|
39
39
|
assert.calledOnceWithExactly(webex.request, {
|
|
40
40
|
method: 'POST',
|
|
41
41
|
uri: 'url/move',
|
|
@@ -44,7 +44,7 @@ describe('plugin-meetings', () => {
|
|
|
44
44
|
sessionId: 'sessionId'
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
assert.equal(result, 'REQUEST_RETURN_VALUE')
|
|
49
49
|
});
|
|
50
50
|
});
|
|
@@ -88,7 +88,7 @@ describe('plugin-meetings', () => {
|
|
|
88
88
|
describe('#askForHelp', () => {
|
|
89
89
|
it('makes the request as expected', async () => {
|
|
90
90
|
const result = await breakout.askForHelp()
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
assert.calledOnceWithExactly(webex.request, {
|
|
93
93
|
method: 'POST',
|
|
94
94
|
uri: 'url/help',
|
|
@@ -97,7 +97,35 @@ describe('plugin-meetings', () => {
|
|
|
97
97
|
sessionId: 'sessionId'
|
|
98
98
|
}
|
|
99
99
|
});
|
|
100
|
-
|
|
100
|
+
|
|
101
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE')
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
describe('#broadcast', () => {
|
|
106
|
+
it('makes the request as expected', async () => {
|
|
107
|
+
breakout.breakoutRequest.broadcast = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
|
|
108
|
+
let result = await breakout.broadcast('hello')
|
|
109
|
+
assert.calledWithExactly(breakout.breakoutRequest.broadcast, {
|
|
110
|
+
url: 'url',
|
|
111
|
+
message: 'hello',
|
|
112
|
+
options: undefined,
|
|
113
|
+
groupId: 'groupId',
|
|
114
|
+
sessionId: 'sessionId'
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE')
|
|
118
|
+
|
|
119
|
+
result = await breakout.broadcast('hello', {presenters: true, cohosts: true})
|
|
120
|
+
|
|
121
|
+
assert.calledWithExactly(breakout.breakoutRequest.broadcast, {
|
|
122
|
+
url: 'url',
|
|
123
|
+
message: 'hello',
|
|
124
|
+
options: {presenters: true, cohosts: true},
|
|
125
|
+
groupId: 'groupId',
|
|
126
|
+
sessionId: 'sessionId'
|
|
127
|
+
});
|
|
128
|
+
|
|
101
129
|
assert.equal(result, 'REQUEST_RETURN_VALUE')
|
|
102
130
|
});
|
|
103
131
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {assert} from '@webex/test-helper-chai';
|
|
1
|
+
import {assert, expect} from '@webex/test-helper-chai';
|
|
2
2
|
import Breakout from '@webex/plugin-meetings/src/breakouts/breakout';
|
|
3
3
|
import Breakouts from '@webex/plugin-meetings/src/breakouts';
|
|
4
4
|
import BreakoutCollection from '@webex/plugin-meetings/src/breakouts/collection';
|
|
@@ -20,9 +20,11 @@ describe('plugin-meetings', () => {
|
|
|
20
20
|
webex.internal.llm.on = sinon.stub();
|
|
21
21
|
webex.internal.mercury.on = sinon.stub();
|
|
22
22
|
breakouts = new Breakouts({}, {parent: webex});
|
|
23
|
+
breakouts.groupId = 'groupId';
|
|
24
|
+
breakouts.sessionId = 'sessionId';
|
|
25
|
+
breakouts.url = 'url';
|
|
23
26
|
breakouts.locusUrl = 'locusUrl';
|
|
24
27
|
breakouts.breakoutServiceUrl = 'breakoutServiceUrl';
|
|
25
|
-
breakouts.url = 'url';
|
|
26
28
|
webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
|
|
27
29
|
});
|
|
28
30
|
|
|
@@ -31,7 +33,7 @@ describe('plugin-meetings', () => {
|
|
|
31
33
|
assert.equal(breakouts.namespace, 'Meetings');
|
|
32
34
|
});
|
|
33
35
|
|
|
34
|
-
it('emits BREAKOUTS_CLOSING event when the status is CLOSING', () => {
|
|
36
|
+
it('emits BREAKOUTS_CLOSING event when the status is CLOSING', () => {
|
|
35
37
|
let called = false;
|
|
36
38
|
breakouts.listenTo(breakouts, BREAKOUTS.EVENTS.BREAKOUTS_CLOSING, () => {
|
|
37
39
|
called = true;
|
|
@@ -58,7 +60,7 @@ describe('plugin-meetings', () => {
|
|
|
58
60
|
it('triggers message event when a message received', () => {
|
|
59
61
|
const call = webex.internal.llm.on.getCall(0);
|
|
60
62
|
const callback = call.args[1];
|
|
61
|
-
|
|
63
|
+
|
|
62
64
|
assert.equal(call.args[0], 'event:breakout.message');
|
|
63
65
|
|
|
64
66
|
let message;
|
|
@@ -90,7 +92,7 @@ describe('plugin-meetings', () => {
|
|
|
90
92
|
it('triggers member update event when a roster received', () => {
|
|
91
93
|
const call = webex.internal.mercury.on.getCall(0);
|
|
92
94
|
const callback = call.args[1];
|
|
93
|
-
|
|
95
|
+
|
|
94
96
|
assert.equal(call.args[0], 'event:breakout.roster');
|
|
95
97
|
|
|
96
98
|
let called = false;
|
|
@@ -204,9 +206,9 @@ describe('plugin-meetings', () => {
|
|
|
204
206
|
describe('#cleanUp', () => {
|
|
205
207
|
it('stops listening', () => {
|
|
206
208
|
breakouts.stopListening = sinon.stub();
|
|
207
|
-
|
|
209
|
+
|
|
208
210
|
breakouts.cleanUp();
|
|
209
|
-
|
|
211
|
+
|
|
210
212
|
assert.calledOnceWithExactly(breakouts.stopListening);
|
|
211
213
|
});
|
|
212
214
|
});
|
|
@@ -230,7 +232,7 @@ describe('plugin-meetings', () => {
|
|
|
230
232
|
});
|
|
231
233
|
|
|
232
234
|
describe('#queryRosters', () => {
|
|
233
|
-
|
|
235
|
+
|
|
234
236
|
it('makes the expected query', async () => {
|
|
235
237
|
|
|
236
238
|
webex.request.returns(Promise.resolve({
|
|
@@ -249,7 +251,7 @@ describe('plugin-meetings', () => {
|
|
|
249
251
|
breakouts.handleRosterUpdate = sinon.stub();
|
|
250
252
|
|
|
251
253
|
const result = await breakouts.queryRosters();
|
|
252
|
-
|
|
254
|
+
|
|
253
255
|
assert.calledOnceWithExactly(webex.request, {
|
|
254
256
|
uri: 'url/roster',
|
|
255
257
|
qs: { locusUrl: 'dGVzdA==' }
|
|
@@ -293,6 +295,67 @@ describe('plugin-meetings', () => {
|
|
|
293
295
|
});
|
|
294
296
|
});
|
|
295
297
|
|
|
298
|
+
describe('#getMainSession', () => {
|
|
299
|
+
it('returns main session as expect', () => {
|
|
300
|
+
breakouts.updateBreakout({
|
|
301
|
+
sessionId: 'sessionId',
|
|
302
|
+
groupId: 'groupId',
|
|
303
|
+
sessionType: 'sessionType',
|
|
304
|
+
url: 'url',
|
|
305
|
+
name: 'name',
|
|
306
|
+
allowBackToMain: true,
|
|
307
|
+
delayCloseTime: 10,
|
|
308
|
+
enableBreakoutSession: true,
|
|
309
|
+
startTime: 'startTime',
|
|
310
|
+
status: 'active',
|
|
311
|
+
locusUrl: 'locusUrl'
|
|
312
|
+
});
|
|
313
|
+
const payload = {
|
|
314
|
+
breakoutSessions: {
|
|
315
|
+
active: [{sessionId: 'sessionId1'}],
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
breakouts.updateBreakoutSessions(payload);
|
|
319
|
+
|
|
320
|
+
breakouts.set('sessionType', BREAKOUTS.SESSION_TYPES.MAIN);
|
|
321
|
+
let result = breakouts.getMainSession();
|
|
322
|
+
assert.equal(result.sessionId, 'sessionId');
|
|
323
|
+
|
|
324
|
+
const payload2 = {
|
|
325
|
+
breakoutSessions: {
|
|
326
|
+
active: [{sessionId: 'sessionId1', sessionType: BREAKOUTS.SESSION_TYPES.MAIN}],
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
breakouts.updateBreakoutSessions(payload2);
|
|
330
|
+
breakouts.set('sessionType', 'BREAKOUT');
|
|
331
|
+
result = breakouts.getMainSession();
|
|
332
|
+
assert.equal(result.sessionId, 'sessionId1');
|
|
333
|
+
});
|
|
334
|
+
it('throw error if cannot find main session', () => {
|
|
335
|
+
const fn = () => {
|
|
336
|
+
breakouts.getMainSession();
|
|
337
|
+
}
|
|
338
|
+
expect(fn).to.throw(/no main session found/);
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
describe('#askAllToReturn', () => {
|
|
343
|
+
it('makes the request as expected', async () => {
|
|
344
|
+
breakouts.set('sessionType', BREAKOUTS.SESSION_TYPES.MAIN);
|
|
345
|
+
breakouts.currentBreakoutSession.sessionId = 'sessionId';
|
|
346
|
+
breakouts.currentBreakoutSession.groupId = 'groupId';
|
|
347
|
+
const result = await breakouts.askAllToReturn();
|
|
348
|
+
assert.calledOnceWithExactly(webex.request, {
|
|
349
|
+
method: 'POST',
|
|
350
|
+
uri: 'url/requestMove',
|
|
351
|
+
body: {
|
|
352
|
+
groupId: 'groupId',
|
|
353
|
+
sessionId: 'sessionId'
|
|
354
|
+
}
|
|
355
|
+
});
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
296
359
|
describe('#breakoutServiceUrlUpdate', () => {
|
|
297
360
|
it('sets the breakoutService url', () => {
|
|
298
361
|
breakouts.breakoutServiceUrlUpdate('newBreakoutServiceUrl');
|
|
@@ -313,7 +376,7 @@ describe('plugin-meetings', () => {
|
|
|
313
376
|
}}))
|
|
314
377
|
breakouts.updateBreakout = sinon.stub().resolves();
|
|
315
378
|
breakouts.doToggleBreakout = sinon.stub().resolves();
|
|
316
|
-
|
|
379
|
+
|
|
317
380
|
await breakouts.toggleBreakout(false);
|
|
318
381
|
assert.calledOnceWithExactly(breakouts.enableBreakouts);
|
|
319
382
|
assert.calledOnceWithExactly(breakouts.updateBreakout, {
|
|
@@ -351,6 +414,38 @@ describe('plugin-meetings', () => {
|
|
|
351
414
|
});
|
|
352
415
|
});
|
|
353
416
|
|
|
417
|
+
describe('#broadcast', () => {
|
|
418
|
+
it('makes the request as expected', async () => {
|
|
419
|
+
breakouts.breakoutRequest.broadcast = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
|
|
420
|
+
let result = await breakouts.broadcast('hello');
|
|
421
|
+
assert.calledWithExactly(breakouts.breakoutRequest.broadcast, {
|
|
422
|
+
url: 'url',
|
|
423
|
+
message: 'hello',
|
|
424
|
+
options: undefined,
|
|
425
|
+
groupId: 'groupId'
|
|
426
|
+
});
|
|
427
|
+
|
|
428
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE');
|
|
429
|
+
|
|
430
|
+
result = await breakouts.broadcast('hello', {presenters: true, cohosts: true});
|
|
431
|
+
assert.calledWithExactly(breakouts.breakoutRequest.broadcast, {
|
|
432
|
+
url: 'url',
|
|
433
|
+
groupId: 'groupId',
|
|
434
|
+
message: 'hello',
|
|
435
|
+
options: {presenters: true, cohosts: true}
|
|
436
|
+
});
|
|
437
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE')
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
it('throw error if no breakout group id found', () => {
|
|
441
|
+
breakouts.set('sessionType', BREAKOUTS.SESSION_TYPES.MAIN);
|
|
442
|
+
const fn = () => {
|
|
443
|
+
breakouts.broadcast('hello');
|
|
444
|
+
}
|
|
445
|
+
expect(fn).to.throw(/no breakout session found/);
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
|
|
354
449
|
describe('doToggleBreakout', () => {
|
|
355
450
|
it('makes the request as expected', async () => {
|
|
356
451
|
const result = await breakouts.doToggleBreakout(true);
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import sinon from 'sinon';
|
|
2
|
+
import {assert, expect} from '@webex/test-helper-chai';
|
|
3
|
+
import MockWebex from '@webex/test-helper-mock-webex';
|
|
4
|
+
import BreakoutRequest from "@webex/plugin-meetings/src/breakouts/request";
|
|
5
|
+
import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
|
|
6
|
+
|
|
7
|
+
describe('plugin-meetings', () => {
|
|
8
|
+
describe('BreakoutRequest', () => {
|
|
9
|
+
let webex;
|
|
10
|
+
let breakoutRequest;
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
// @ts-ignore
|
|
13
|
+
webex = new MockWebex({});
|
|
14
|
+
// @ts-ignore
|
|
15
|
+
breakoutRequest = new BreakoutRequest({webex});
|
|
16
|
+
webex.request = sinon.stub().returns(Promise.resolve('REQUEST_RETURN_VALUE'));
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('#broadcast', () => {
|
|
20
|
+
it('makes request as expected', async () => {
|
|
21
|
+
let result = await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'});
|
|
22
|
+
assert.calledWithExactly(webex.request, {
|
|
23
|
+
method: 'POST',
|
|
24
|
+
uri: 'url/message',
|
|
25
|
+
body: {
|
|
26
|
+
message: 'hello',
|
|
27
|
+
groups: [{
|
|
28
|
+
id: 'groupId',
|
|
29
|
+
recipientRoles: undefined,
|
|
30
|
+
sessions: undefined
|
|
31
|
+
}],
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE');
|
|
35
|
+
|
|
36
|
+
result = await breakoutRequest.broadcast({
|
|
37
|
+
url: 'url',
|
|
38
|
+
message: 'hello',
|
|
39
|
+
groupId: 'groupId',
|
|
40
|
+
options: {
|
|
41
|
+
presenters: true,
|
|
42
|
+
cohosts: true
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
assert.calledWithExactly(webex.request, {
|
|
46
|
+
method: 'POST',
|
|
47
|
+
uri: 'url/message',
|
|
48
|
+
body: {
|
|
49
|
+
message: 'hello',
|
|
50
|
+
groups: [{
|
|
51
|
+
id: 'groupId',
|
|
52
|
+
recipientRoles: ['COHOST', 'PRESENTER'],
|
|
53
|
+
sessions: undefined
|
|
54
|
+
}]
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE');
|
|
58
|
+
|
|
59
|
+
result = await breakoutRequest.broadcast({
|
|
60
|
+
url: 'url',
|
|
61
|
+
message: 'hello',
|
|
62
|
+
groupId: 'groupId',
|
|
63
|
+
options: {
|
|
64
|
+
presenters: true,
|
|
65
|
+
cohosts: true
|
|
66
|
+
},
|
|
67
|
+
sessionId: 'sessionId'
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
assert.calledWithExactly(webex.request, {
|
|
71
|
+
method: 'POST',
|
|
72
|
+
uri: 'url/message',
|
|
73
|
+
body: {
|
|
74
|
+
message: 'hello',
|
|
75
|
+
groups: [{
|
|
76
|
+
id: 'groupId',
|
|
77
|
+
recipientRoles: ['COHOST', 'PRESENTER'],
|
|
78
|
+
sessions: [{id: 'sessionId'}]
|
|
79
|
+
}]
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
assert.equal(result, 'REQUEST_RETURN_VALUE');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('catch 409 error and log', async () => {
|
|
86
|
+
const error = {statusCode: 409, body: {errorCode: 201409036}};
|
|
87
|
+
webex.request.rejects(error);
|
|
88
|
+
LoggerProxy.logger.info = sinon.stub();
|
|
89
|
+
await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'});
|
|
90
|
+
assert.calledOnceWithExactly(
|
|
91
|
+
LoggerProxy.logger.info,
|
|
92
|
+
'Breakouts#broadcast --> no joined participants'
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
const otherError = new Error('something wrong');
|
|
96
|
+
webex.request.rejects(otherError);
|
|
97
|
+
LoggerProxy.logger.error = sinon.stub();
|
|
98
|
+
await breakoutRequest.broadcast({url: 'url', message: 'hello', groupId: 'groupId'}).catch((error) => {
|
|
99
|
+
assert.equal(error.toString(), 'Error: something wrong');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {assert} from '@webex/test-helper-chai';
|
|
2
|
+
import {getBroadcastRoles} from '@webex/plugin-meetings/src/breakouts/utils'
|
|
3
|
+
describe('plugin-meetings', () => {
|
|
4
|
+
describe('Breakouts utils', () => {
|
|
5
|
+
describe('#getBroadcastRoles', () => {
|
|
6
|
+
it('return expect roles', () => {
|
|
7
|
+
let roles = getBroadcastRoles();
|
|
8
|
+
assert.deepEqual(roles, []);
|
|
9
|
+
|
|
10
|
+
roles = getBroadcastRoles({cohosts: true});
|
|
11
|
+
assert.deepEqual(roles, ['COHOST']);
|
|
12
|
+
|
|
13
|
+
roles = getBroadcastRoles({presenters: true});
|
|
14
|
+
assert.deepEqual(roles, ['PRESENTER']);
|
|
15
|
+
|
|
16
|
+
roles = getBroadcastRoles({presenters: true, cohosts: true});
|
|
17
|
+
assert.deepEqual(roles, ['COHOST', 'PRESENTER']);
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
});
|