@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.
@@ -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
- version: "3.0.0-beta.28"
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;AARA;AACA;AACA;;AAQA;AACA;AACA;AACA,IAAMA,QAAQ,GAAGC,sBAAW,CAACC,MAAM,CAAC;EAClCC,WAAW,EAAE,WAAW;EAExBC,SAAS,EAAEC,mBAAQ;EAEnBC,KAAK,EAAE;IACLC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACnCC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACpCC,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACrCC,eAAe,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IAC5CC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACtCC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACpCC,IAAI,EAAE,QAAQ;IACdC,SAAS,EAAE,QAAQ;IACnBC,WAAW,EAAE,QAAQ;IACrBC,OAAO,EAAE,QAAQ;IACjBC,GAAG,EAAE,QAAQ,CAAE;EACjB,CAAC;;EAEDC,OAAO,EAAE;IACPC,MAAM,EAAE;MACNC,IAAI,EAAE,CAAC,aAAa,CAAC;MACrB;AACN;AACA;AACA;MACMC,EAAE,gBAAG;QACH,OAAO,IAAI,CAACN,WAAW,KAAK,MAAM;MACpC;IACF;EACF,CAAC;EAEDO,UAAU,wBAAG;IACX,IAAI,CAACC,OAAO,GAAG,IAAIC,gBAAO,CAAC,CAAC,CAAC,EAAE;MAACC,MAAM,EAAE,IAAI,CAACC;IAAK,CAAC,CAAC;EACtD,CAAC;EAED;AACF;AACA;AACA;EACEC,IAAI,kBAAG;IACL,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAEC,qBAAU,CAACC,IAAI;MACvBC,GAAG,YAAK,IAAI,CAACf,GAAG,UAAO;MACvBgB,IAAI,EAAE;QACJjB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBF,SAAS,EAAE,IAAI,CAACA;MAClB;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;EACEoB,KAAK,mBAAG;IACN,IAAI,IAAI,CAACf,MAAM,EAAE;MACf,MAAM,IAAIgB,KAAK,CAAC,+BAA+B,CAAC;IAClD;IAEA,IAAMC,WAAW,GAAG,IAAI,CAACX,MAAM,CAACY,SAAS,CAACC,MAAM,CAAC,UAACC,QAAQ;MAAA,OAAKA,QAAQ,CAACpB,MAAM;IAAA,EAAC,CAAC,CAAC,CAAC;IAElF,IAAI,CAACiB,WAAW,EAAE;MAChB,MAAM,IAAID,KAAK,CAAC,qCAAqC,CAAC;IACxD;IAEA,OAAOC,WAAW,CAACT,IAAI,EAAE;EAC3B,CAAC;EAED;AACF;AACA;AACA;EACEa,UAAU,wBAAG;IACX,OAAO,IAAI,CAACZ,OAAO,CAAC;MAClBC,MAAM,EAAEC,qBAAU,CAACC,IAAI;MACvBC,GAAG,YAAK,IAAI,CAACf,GAAG,UAAO;MACvBgB,IAAI,EAAE;QACJjB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBF,SAAS,EAAE,IAAI,CAACA;MAClB;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;EAEE2B,WAAW,uBAACC,KAAK,EAAE;IACjB,IAAI,CAACnB,OAAO,CAACoB,uBAAuB,CAACD,KAAK,CAAC;EAC7C,CAAC;EAAA;AACH,CAAC,CAAC;AAAC,eAEY1C,QAAQ;AAAA"}
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":";;;;;;;;AAIA;AAEA;AAEA;AACA;AATA;AACA;AACA;;AASA;AACA;AACA;AACA,IAAMA,QAAQ,GAAGC,sBAAW,CAACC,MAAM,CAAC;EAClCC,WAAW,EAAE,WAAW;EAExBC,SAAS,EAAEC,mBAAQ;EAEnBC,eAAe,EAAEC,gBAAe;EAChCC,KAAK,EAAE;IACLC,MAAM,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACnCC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACpCC,QAAQ,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACrCC,eAAe,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IAC5CC,SAAS,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACtCC,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC;IAAE;IACpCC,IAAI,EAAE,QAAQ;IACdC,SAAS,EAAE,QAAQ;IACnBC,WAAW,EAAE,QAAQ;IACrBC,OAAO,EAAE,QAAQ;IACjBC,GAAG,EAAE,QAAQ,CAAE;EACjB,CAAC;;EAEDC,OAAO,EAAE;IACPC,MAAM,EAAE;MACNC,IAAI,EAAE,CAAC,aAAa,CAAC;MACrB;AACN;AACA;AACA;MACMC,EAAE,gBAAG;QACH,OAAO,IAAI,CAACN,WAAW,KAAK,MAAM;MACpC;IACF;EACF,CAAC;EAEDO,UAAU,wBAAG;IACX,IAAI,CAACC,OAAO,GAAG,IAAIC,gBAAO,CAAC,CAAC,CAAC,EAAE;MAACC,MAAM,EAAE,IAAI,CAACC;IAAK,CAAC,CAAC;IACpD;IACA,IAAI,CAACtB,eAAe,GAAG,IAAIC,gBAAe,CAAC;MAACqB,KAAK,EAAE,IAAI,CAACA;IAAK,CAAC,CAAC;EACjE,CAAC;EAED;AACF;AACA;AACA;EACEC,IAAI,kBAAG;IACL,OAAO,IAAI,CAACC,OAAO,CAAC;MAClBC,MAAM,EAAEC,qBAAU,CAACC,IAAI;MACvBC,GAAG,YAAK,IAAI,CAACf,GAAG,UAAO;MACvBgB,IAAI,EAAE;QACJjB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBF,SAAS,EAAE,IAAI,CAACA;MAClB;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;EACEoB,KAAK,mBAAG;IACN,IAAI,IAAI,CAACf,MAAM,EAAE;MACf,MAAM,IAAIgB,KAAK,CAAC,+BAA+B,CAAC;IAClD;IAEA,IAAMC,WAAW,GAAG,IAAI,CAACX,MAAM,CAACY,SAAS,CAACC,MAAM,CAAC,UAACC,QAAQ;MAAA,OAAKA,QAAQ,CAACpB,MAAM;IAAA,EAAC,CAAC,CAAC,CAAC;IAElF,IAAI,CAACiB,WAAW,EAAE;MAChB,MAAM,IAAID,KAAK,CAAC,qCAAqC,CAAC;IACxD;IAEA,OAAOC,WAAW,CAACT,IAAI,EAAE;EAC3B,CAAC;EAED;AACF;AACA;AACA;EACEa,UAAU,wBAAG;IACX,OAAO,IAAI,CAACZ,OAAO,CAAC;MAClBC,MAAM,EAAEC,qBAAU,CAACC,IAAI;MACvBC,GAAG,YAAK,IAAI,CAACf,GAAG,UAAO;MACvBgB,IAAI,EAAE;QACJjB,OAAO,EAAE,IAAI,CAACA,OAAO;QACrBF,SAAS,EAAE,IAAI,CAACA;MAClB;IACF,CAAC,CAAC;EACJ,CAAC;EAED;AACF;AACA;AACA;AACA;EAEE2B,WAAW,uBAACC,KAAK,EAAE;IACjB,IAAI,CAACnB,OAAO,CAACoB,uBAAuB,CAACD,KAAK,CAAC;EAC7C,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEE,SAAS,qBAACC,OAAO,EAAEC,OAAO,EAAE;IAC1B,OAAO,IAAI,CAAC1C,eAAe,CAACwC,SAAS,CAAC;MACpC3B,GAAG,EAAE,IAAI,CAACA,GAAG;MACb4B,OAAO,EAAPA,OAAO;MACPC,OAAO,EAAPA,OAAO;MACP9B,OAAO,EAAE,IAAI,CAACA,OAAO;MACrBF,SAAS,EAAE,IAAI,CAACA;IAClB,CAAC,CAAC;EACJ,CAAC;EAAA;AACH,CAAC,CAAC;AAAC,eAEYhB,QAAQ;AAAA"}
@@ -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.28"
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.28",
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.28",
36
- "@webex/test-helper-chai": "3.0.0-beta.28",
37
- "@webex/test-helper-mocha": "3.0.0-beta.28",
38
- "@webex/test-helper-mock-webex": "3.0.0-beta.28",
39
- "@webex/test-helper-retry": "3.0.0-beta.28",
40
- "@webex/test-helper-test-users": "3.0.0-beta.28",
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.28",
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.28",
51
- "@webex/internal-plugin-device": "3.0.0-beta.28",
52
- "@webex/internal-plugin-llm": "3.0.0-beta.28",
53
- "@webex/internal-plugin-mercury": "3.0.0-beta.28",
54
- "@webex/internal-plugin-metrics": "3.0.0-beta.28",
55
- "@webex/internal-plugin-support": "3.0.0-beta.28",
56
- "@webex/internal-plugin-user": "3.0.0-beta.28",
57
- "@webex/plugin-people": "3.0.0-beta.28",
58
- "@webex/plugin-rooms": "3.0.0-beta.28",
59
- "@webex/webex-core": "3.0.0-beta.28",
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",
@@ -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;
@@ -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, MEETINGS, HTTP_VERBS} from '../constants';
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
+ });