@webex/plugin-meetings 3.6.0-next.9 → 3.7.0

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.
Files changed (88) hide show
  1. package/README.md +2 -1
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/config.js +2 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants.js +24 -2
  7. package/dist/constants.js.map +1 -1
  8. package/dist/controls-options-manager/enums.js +1 -0
  9. package/dist/controls-options-manager/enums.js.map +1 -1
  10. package/dist/controls-options-manager/index.js +10 -3
  11. package/dist/controls-options-manager/index.js.map +1 -1
  12. package/dist/controls-options-manager/types.js.map +1 -1
  13. package/dist/controls-options-manager/util.js +12 -0
  14. package/dist/controls-options-manager/util.js.map +1 -1
  15. package/dist/interpretation/index.js +1 -1
  16. package/dist/interpretation/siLanguage.js +1 -1
  17. package/dist/locus-info/controlsUtils.js +28 -4
  18. package/dist/locus-info/controlsUtils.js.map +1 -1
  19. package/dist/locus-info/fullState.js +2 -1
  20. package/dist/locus-info/fullState.js.map +1 -1
  21. package/dist/locus-info/index.js +61 -3
  22. package/dist/locus-info/index.js.map +1 -1
  23. package/dist/meeting/in-meeting-actions.js +19 -1
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +536 -409
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meetings/index.js +2 -0
  28. package/dist/meetings/index.js.map +1 -1
  29. package/dist/members/index.js +3 -2
  30. package/dist/members/index.js.map +1 -1
  31. package/dist/members/util.js +9 -5
  32. package/dist/members/util.js.map +1 -1
  33. package/dist/networkQualityMonitor/index.js +227 -0
  34. package/dist/networkQualityMonitor/index.js.map +1 -0
  35. package/dist/reachability/index.js +3 -3
  36. package/dist/reachability/index.js.map +1 -1
  37. package/dist/reachability/request.js +2 -1
  38. package/dist/reachability/request.js.map +1 -1
  39. package/dist/rtcMetrics/constants.js +11 -0
  40. package/dist/rtcMetrics/constants.js.map +1 -0
  41. package/dist/rtcMetrics/index.js +197 -0
  42. package/dist/rtcMetrics/index.js.map +1 -0
  43. package/dist/types/config.d.ts +1 -0
  44. package/dist/types/constants.d.ts +19 -0
  45. package/dist/types/controls-options-manager/enums.d.ts +2 -1
  46. package/dist/types/controls-options-manager/index.d.ts +2 -1
  47. package/dist/types/controls-options-manager/types.d.ts +2 -0
  48. package/dist/types/locus-info/index.d.ts +9 -0
  49. package/dist/types/meeting/in-meeting-actions.d.ts +18 -0
  50. package/dist/types/meeting/index.d.ts +12 -1
  51. package/dist/types/members/index.d.ts +2 -1
  52. package/dist/types/members/util.d.ts +3 -1
  53. package/dist/types/networkQualityMonitor/index.d.ts +70 -0
  54. package/dist/types/rtcMetrics/constants.d.ts +4 -0
  55. package/dist/types/rtcMetrics/index.d.ts +71 -0
  56. package/dist/webinar/index.js +32 -19
  57. package/dist/webinar/index.js.map +1 -1
  58. package/package.json +22 -22
  59. package/src/config.ts +1 -0
  60. package/src/constants.ts +25 -0
  61. package/src/controls-options-manager/enums.ts +1 -0
  62. package/src/controls-options-manager/index.ts +19 -2
  63. package/src/controls-options-manager/types.ts +2 -0
  64. package/src/controls-options-manager/util.ts +12 -0
  65. package/src/locus-info/controlsUtils.ts +46 -2
  66. package/src/locus-info/fullState.ts +1 -0
  67. package/src/locus-info/index.ts +60 -0
  68. package/src/meeting/in-meeting-actions.ts +37 -0
  69. package/src/meeting/index.ts +114 -9
  70. package/src/meetings/index.ts +46 -39
  71. package/src/members/index.ts +4 -2
  72. package/src/members/util.ts +3 -1
  73. package/src/reachability/index.ts +3 -3
  74. package/src/reachability/request.ts +1 -0
  75. package/src/webinar/index.ts +31 -17
  76. package/test/unit/spec/controls-options-manager/index.js +56 -32
  77. package/test/unit/spec/controls-options-manager/util.js +44 -0
  78. package/test/unit/spec/locus-info/controlsUtils.js +80 -4
  79. package/test/unit/spec/locus-info/index.js +59 -2
  80. package/test/unit/spec/meeting/in-meeting-actions.ts +18 -0
  81. package/test/unit/spec/meeting/index.js +222 -82
  82. package/test/unit/spec/meetings/index.js +16 -1
  83. package/test/unit/spec/members/index.js +25 -2
  84. package/test/unit/spec/members/request.js +37 -3
  85. package/test/unit/spec/members/utils.js +15 -1
  86. package/test/unit/spec/reachability/index.ts +1 -1
  87. package/test/unit/spec/reachability/request.js +13 -8
  88. package/test/unit/spec/webinar/index.ts +82 -16
@@ -7,6 +7,7 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _webexCore = require("@webex/webex-core");
10
+ var _lodash = require("lodash");
10
11
  var _constants = require("../constants");
11
12
  var _collection = _interopRequireDefault(require("./collection"));
12
13
  /*!
@@ -24,35 +25,29 @@ var Webinar = _webexCore.WebexPlugin.extend({
24
25
  props: {
25
26
  locusUrl: 'string',
26
27
  // appears current webinar's locus url
27
- webcastUrl: 'string',
28
- // current webinar's webcast url
29
- webinarAttendeesSearchingUrl: 'string',
30
- // current webinarAttendeesSearching url
31
- canManageWebcast: 'boolean' // appears the ability to manage webcast
28
+ webcastInstanceUrl: 'string',
29
+ // current webinar's webcast instance url
30
+ canManageWebcast: 'boolean',
31
+ // appears the ability to manage webcast
32
+ selfIsPanelist: 'boolean',
33
+ // self is panelist
34
+ selfIsAttendee: 'boolean' // self is attendee
32
35
  },
33
36
  /**
34
37
  * Update the current locus url of the webinar
35
- * @param {string} locusUrl // locus url
38
+ * @param {string} locusUrl
36
39
  * @returns {void}
37
40
  */
38
41
  locusUrlUpdate: function locusUrlUpdate(locusUrl) {
39
42
  this.set('locusUrl', locusUrl);
40
43
  },
41
44
  /**
42
- * Update the current webcast url of the meeting
43
- * @param {string} webcastUrl // webcast url
45
+ * Update the current webcast instance url of the meeting
46
+ * @param {object} payload
44
47
  * @returns {void}
45
48
  */
46
- webcastUrlUpdate: function webcastUrlUpdate(webcastUrl) {
47
- this.set('webcastUrl', webcastUrl);
48
- },
49
- /**
50
- * Update the current webinarAttendeesSearching url of the meeting
51
- * @param {string} webinarAttendeesSearchingUrl // webinarAttendeesSearching url
52
- * @returns {void}
53
- */
54
- webinarAttendeesSearchingUrlUpdate: function webinarAttendeesSearchingUrlUpdate(webinarAttendeesSearchingUrl) {
55
- this.set('webinarAttendeesSearchingUrl', webinarAttendeesSearchingUrl);
49
+ updateWebcastUrl: function updateWebcastUrl(payload) {
50
+ this.set('webcastInstanceUrl', (0, _lodash.get)(payload, 'resources.webcastInstance.url'));
56
51
  },
57
52
  /**
58
53
  * Update whether self has capability to manage start/stop webcast (only host can manage it)
@@ -62,7 +57,25 @@ var Webinar = _webexCore.WebexPlugin.extend({
62
57
  updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
63
58
  this.set('canManageWebcast', canManageWebcast);
64
59
  },
65
- version: "3.6.0-next.9"
60
+ /**
61
+ * Updates user roles and manages associated state transitions
62
+ * @param {object} payload
63
+ * @param {string[]} payload.oldRoles - Previous roles of the user
64
+ * @param {string[]} payload.newRoles - New roles of the user
65
+ * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states
66
+ */
67
+ updateRoleChanged: function updateRoleChanged(payload) {
68
+ var isPromoted = (0, _lodash.get)(payload, 'oldRoles', []).includes(_constants.SELF_ROLES.ATTENDEE) && (0, _lodash.get)(payload, 'newRoles', []).includes(_constants.SELF_ROLES.PANELIST);
69
+ var isDemoted = (0, _lodash.get)(payload, 'oldRoles', []).includes(_constants.SELF_ROLES.PANELIST) && (0, _lodash.get)(payload, 'newRoles', []).includes(_constants.SELF_ROLES.ATTENDEE);
70
+ this.set('selfIsPanelist', (0, _lodash.get)(payload, 'newRoles', []).includes(_constants.SELF_ROLES.PANELIST));
71
+ this.set('selfIsAttendee', (0, _lodash.get)(payload, 'newRoles', []).includes(_constants.SELF_ROLES.ATTENDEE));
72
+ this.updateCanManageWebcast((0, _lodash.get)(payload, 'newRoles', []).includes(_constants.SELF_ROLES.MODERATOR));
73
+ return {
74
+ isPromoted: isPromoted,
75
+ isDemoted: isDemoted
76
+ };
77
+ },
78
+ version: "3.7.0"
66
79
  });
67
80
  var _default = exports.default = Webinar;
68
81
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_constants","_collection","_interopRequireDefault","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastUrl","webinarAttendeesSearchingUrl","canManageWebcast","locusUrlUpdate","set","webcastUrlUpdate","webinarAttendeesSearchingUrlUpdate","updateCanManageWebcast","version","_default","exports","default"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {MEETINGS} from '../constants';\n\nimport WebinarCollection from './collection';\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastUrl: 'string', // current webinar's webcast url\n webinarAttendeesSearchingUrl: 'string', // current webinarAttendeesSearching url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n },\n\n /**\n * Update the current locus url of the webinar\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 webcast url of the meeting\n * @param {string} webcastUrl // webcast url\n * @returns {void}\n */\n webcastUrlUpdate(webcastUrl) {\n this.set('webcastUrl', webcastUrl);\n },\n\n /**\n * Update the current webinarAttendeesSearching url of the meeting\n * @param {string} webinarAttendeesSearchingUrl // webinarAttendeesSearching url\n * @returns {void}\n */\n webinarAttendeesSearchingUrlUpdate(webinarAttendeesSearchingUrl) {\n this.set('webinarAttendeesSearchingUrl', webinarAttendeesSearchingUrl);\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n});\n\nexport default Webinar;\n"],"mappings":";;;;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAEA,IAAAE,WAAA,GAAAC,sBAAA,CAAAH,OAAA;AANA;AACA;AACA;;AAMA;AACA;AACA;AACA,IAAMI,OAAO,GAAGC,sBAAW,CAACC,MAAM,CAAC;EACjCC,SAAS,EAAEC,mBAAQ;EACnBC,WAAW,EAAE;IACXC,OAAO,EAAEC;EACX,CAAC;EAEDC,KAAK,EAAE;IACLC,QAAQ,EAAE,QAAQ;IAAE;IACpBC,UAAU,EAAE,QAAQ;IAAE;IACtBC,4BAA4B,EAAE,QAAQ;IAAE;IACxCC,gBAAgB,EAAE,SAAS,CAAE;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,cAAc,WAAAA,eAACJ,QAAQ,EAAE;IACvB,IAAI,CAACK,GAAG,CAAC,UAAU,EAAEL,QAAQ,CAAC;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,gBAAgB,WAAAA,iBAACL,UAAU,EAAE;IAC3B,IAAI,CAACI,GAAG,CAAC,YAAY,EAAEJ,UAAU,CAAC;EACpC,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,kCAAkC,WAAAA,mCAACL,4BAA4B,EAAE;IAC/D,IAAI,CAACG,GAAG,CAAC,8BAA8B,EAAEH,4BAA4B,CAAC;EACxE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,sBAAsB,WAAAA,uBAACL,gBAAgB,EAAE;IACvC,IAAI,CAACE,GAAG,CAAC,kBAAkB,EAAEF,gBAAgB,CAAC;EAChD,CAAC;EAAAM,OAAA;AACH,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEYrB,OAAO"}
1
+ {"version":3,"names":["_webexCore","require","_lodash","_constants","_collection","_interopRequireDefault","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","version","_default","exports","default"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.\n */\nimport {WebexPlugin} from '@webex/webex-core';\nimport {get} from 'lodash';\nimport {MEETINGS, SELF_ROLES} from '../constants';\n\nimport WebinarCollection from './collection';\n\n/**\n * @class Webinar\n */\nconst Webinar = WebexPlugin.extend({\n namespace: MEETINGS,\n collections: {\n webinar: WebinarCollection,\n },\n\n props: {\n locusUrl: 'string', // appears current webinar's locus url\n webcastInstanceUrl: 'string', // current webinar's webcast instance url\n canManageWebcast: 'boolean', // appears the ability to manage webcast\n selfIsPanelist: 'boolean', // self is panelist\n selfIsAttendee: 'boolean', // self is attendee\n },\n\n /**\n * Update the current locus url of the webinar\n * @param {string} locusUrl\n * @returns {void}\n */\n locusUrlUpdate(locusUrl) {\n this.set('locusUrl', locusUrl);\n },\n\n /**\n * Update the current webcast instance url of the meeting\n * @param {object} payload\n * @returns {void}\n */\n updateWebcastUrl(payload) {\n this.set('webcastInstanceUrl', get(payload, 'resources.webcastInstance.url'));\n },\n\n /**\n * Update whether self has capability to manage start/stop webcast (only host can manage it)\n * @param {boolean} canManageWebcast\n * @returns {void}\n */\n updateCanManageWebcast(canManageWebcast) {\n this.set('canManageWebcast', canManageWebcast);\n },\n\n /**\n * Updates user roles and manages associated state transitions\n * @param {object} payload\n * @param {string[]} payload.oldRoles - Previous roles of the user\n * @param {string[]} payload.newRoles - New roles of the user\n * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states\n */\n updateRoleChanged(payload) {\n const isPromoted =\n get(payload, 'oldRoles', []).includes(SELF_ROLES.ATTENDEE) &&\n get(payload, 'newRoles', []).includes(SELF_ROLES.PANELIST);\n const isDemoted =\n get(payload, 'oldRoles', []).includes(SELF_ROLES.PANELIST) &&\n get(payload, 'newRoles', []).includes(SELF_ROLES.ATTENDEE);\n this.set('selfIsPanelist', get(payload, 'newRoles', []).includes(SELF_ROLES.PANELIST));\n this.set('selfIsAttendee', get(payload, 'newRoles', []).includes(SELF_ROLES.ATTENDEE));\n this.updateCanManageWebcast(get(payload, 'newRoles', []).includes(SELF_ROLES.MODERATOR));\n\n return {isPromoted, isDemoted};\n },\n});\n\nexport default Webinar;\n"],"mappings":";;;;;;;;AAGA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AAEA,IAAAG,WAAA,GAAAC,sBAAA,CAAAJ,OAAA;AAPA;AACA;AACA;;AAOA;AACA;AACA;AACA,IAAMK,OAAO,GAAGC,sBAAW,CAACC,MAAM,CAAC;EACjCC,SAAS,EAAEC,mBAAQ;EACnBC,WAAW,EAAE;IACXC,OAAO,EAAEC;EACX,CAAC;EAEDC,KAAK,EAAE;IACLC,QAAQ,EAAE,QAAQ;IAAE;IACpBC,kBAAkB,EAAE,QAAQ;IAAE;IAC9BC,gBAAgB,EAAE,SAAS;IAAE;IAC7BC,cAAc,EAAE,SAAS;IAAE;IAC3BC,cAAc,EAAE,SAAS,CAAE;EAC7B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEC,cAAc,WAAAA,eAACL,QAAQ,EAAE;IACvB,IAAI,CAACM,GAAG,CAAC,UAAU,EAAEN,QAAQ,CAAC;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,gBAAgB,WAAAA,iBAACC,OAAO,EAAE;IACxB,IAAI,CAACF,GAAG,CAAC,oBAAoB,EAAE,IAAAG,WAAG,EAACD,OAAO,EAAE,+BAA+B,CAAC,CAAC;EAC/E,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,sBAAsB,WAAAA,uBAACR,gBAAgB,EAAE;IACvC,IAAI,CAACI,GAAG,CAAC,kBAAkB,EAAEJ,gBAAgB,CAAC;EAChD,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;AACA;EACES,iBAAiB,WAAAA,kBAACH,OAAO,EAAE;IACzB,IAAMI,UAAU,GACd,IAAAH,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,IAC1D,IAAAN,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC;IAC5D,IAAMC,SAAS,GACb,IAAAR,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC,IAC1D,IAAAP,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC;IAC5D,IAAI,CAACT,GAAG,CAAC,gBAAgB,EAAE,IAAAG,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACE,QAAQ,CAAC,CAAC;IACtF,IAAI,CAACV,GAAG,CAAC,gBAAgB,EAAE,IAAAG,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACC,QAAQ,CAAC,CAAC;IACtF,IAAI,CAACL,sBAAsB,CAAC,IAAAD,WAAG,EAACD,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAACK,QAAQ,CAACC,qBAAU,CAACI,SAAS,CAAC,CAAC;IAExF,OAAO;MAACN,UAAU,EAAVA,UAAU;MAAEK,SAAS,EAATA;IAAS,CAAC;EAChC,CAAC;EAAAE,OAAA;AACH,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEY/B,OAAO"}
package/package.json CHANGED
@@ -43,13 +43,13 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.6.0-next.9",
47
- "@webex/plugin-rooms": "3.6.0-next.3",
48
- "@webex/test-helper-chai": "3.6.0-next.1",
49
- "@webex/test-helper-mocha": "3.6.0-next.1",
50
- "@webex/test-helper-mock-webex": "3.6.0-next.1",
51
- "@webex/test-helper-retry": "3.6.0-next.1",
52
- "@webex/test-helper-test-users": "3.6.0-next.1",
46
+ "@webex/plugin-meetings": "3.7.0",
47
+ "@webex/plugin-rooms": "3.7.0",
48
+ "@webex/test-helper-chai": "3.7.0",
49
+ "@webex/test-helper-mocha": "3.7.0",
50
+ "@webex/test-helper-mock-webex": "3.7.0",
51
+ "@webex/test-helper-retry": "3.7.0",
52
+ "@webex/test-helper-test-users": "3.7.0",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,21 +61,21 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.6.0-next.1",
65
- "@webex/internal-media-core": "2.11.3",
66
- "@webex/internal-plugin-conversation": "3.6.0-next.3",
67
- "@webex/internal-plugin-device": "3.6.0-next.1",
68
- "@webex/internal-plugin-llm": "3.6.0-next.2",
69
- "@webex/internal-plugin-mercury": "3.6.0-next.2",
70
- "@webex/internal-plugin-metrics": "3.6.0-next.1",
71
- "@webex/internal-plugin-support": "3.6.0-next.3",
72
- "@webex/internal-plugin-user": "3.6.0-next.1",
73
- "@webex/internal-plugin-voicea": "3.6.0-next.9",
74
- "@webex/media-helpers": "3.6.0-next.1",
75
- "@webex/plugin-people": "3.6.0-next.2",
76
- "@webex/plugin-rooms": "3.6.0-next.3",
64
+ "@webex/common": "3.7.0",
65
+ "@webex/internal-media-core": "2.12.2",
66
+ "@webex/internal-plugin-conversation": "3.7.0",
67
+ "@webex/internal-plugin-device": "3.7.0",
68
+ "@webex/internal-plugin-llm": "3.7.0",
69
+ "@webex/internal-plugin-mercury": "3.7.0",
70
+ "@webex/internal-plugin-metrics": "3.7.0",
71
+ "@webex/internal-plugin-support": "3.7.0",
72
+ "@webex/internal-plugin-user": "3.7.0",
73
+ "@webex/internal-plugin-voicea": "3.7.0",
74
+ "@webex/media-helpers": "3.7.0",
75
+ "@webex/plugin-people": "3.7.0",
76
+ "@webex/plugin-rooms": "3.7.0",
77
77
  "@webex/web-capabilities": "^1.4.0",
78
- "@webex/webex-core": "3.6.0-next.1",
78
+ "@webex/webex-core": "3.7.0",
79
79
  "ampersand-collection": "^2.0.2",
80
80
  "bowser": "^2.11.0",
81
81
  "btoa": "^1.2.1",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.6.0-next.9"
94
+ "version": "3.7.0"
95
95
  }
package/src/config.ts CHANGED
@@ -95,5 +95,6 @@ export default {
95
95
  // This only applies to non-multistream meetings
96
96
  iceCandidatesGatheringTimeout: undefined,
97
97
  backendIpv6NativeSupport: false,
98
+ reachabilityGetClusterTimeout: 5000,
98
99
  },
99
100
  };
package/src/constants.ts CHANGED
@@ -356,6 +356,11 @@ export const EVENT_TRIGGERS = {
356
356
  'meeting:controls:view-the-participants-list:updated',
357
357
  MEETING_CONTROLS_RAISE_HAND_UPDATED: 'meeting:controls:raise-hand:updated',
358
358
  MEETING_CONTROLS_VIDEO_UPDATED: 'meeting:controls:video:updated',
359
+ MEETING_CONTROLS_STAGE_VIEW_UPDATED: 'meeting:controls:stage-view:updated',
360
+ MEETING_CONTROLS_WEBCAST_UPDATED: 'meeting:controls:webcast:updated',
361
+ MEETING_CONTROLS_MEETING_FULL_UPDATED: 'meeting:controls:meeting-full:updated',
362
+ MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED:
363
+ 'meeting:controls:practice-session-status:updated',
359
364
  // Locus URL changed
360
365
  MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
361
366
  MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
@@ -676,7 +681,11 @@ export const LOCUSINFO = {
676
681
  CONTROLS_REACTIONS_CHANGED: 'CONTROLS_REACTIONS_CHANGED',
677
682
  CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED: 'CONTROLS_VIEW_THE_PARTICIPANTS_LIST_CHANGED',
678
683
  CONTROLS_RAISE_HAND_CHANGED: 'CONTROLS_RAISE_HAND_CHANGED',
684
+ CONTROLS_WEBCAST_CHANGED: 'CONTROLS_WEBCAST_CHANGED',
685
+ CONTROLS_MEETING_FULL_CHANGED: 'CONTROLS_MEETING_FULL_CHANGED',
686
+ CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: 'CONTROLS_PRACTICE_SESSION_STATUS_UPDATED',
679
687
  CONTROLS_VIDEO_CHANGED: 'CONTROLS_VIDEO_CHANGED',
688
+ CONTROLS_STAGE_VIEW_UPDATED: 'CONTROLS_STAGE_VIEW_UPDATED',
680
689
  SELF_UNADMITTED_GUEST: 'SELF_UNADMITTED_GUEST',
681
690
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
682
691
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
@@ -702,6 +711,7 @@ export const LOCUSINFO = {
702
711
  SELF_MEETING_INTERPRETATION_CHANGED: 'SELF_MEETING_INTERPRETATION_CHANGED',
703
712
  MEDIA_INACTIVITY: 'MEDIA_INACTIVITY',
704
713
  LINKS_SERVICES: 'LINKS_SERVICES',
714
+ LINKS_RESOURCES: 'LINKS_RESOURCES',
705
715
  },
706
716
  };
707
717
 
@@ -944,6 +954,11 @@ export const DISPLAY_HINTS = {
944
954
  // participants list
945
955
  DISABLE_VIEW_THE_PARTICIPANT_LIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST',
946
956
  ENABLE_VIEW_THE_PARTICIPANT_LIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST',
957
+ // for webinar participants list
958
+ DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
959
+ ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST: 'ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST',
960
+ DISABLE_SHOW_ATTENDEE_COUNT: 'DISABLE_SHOW_ATTENDEE_COUNT',
961
+ ENABLE_SHOW_ATTENDEE_COUNT: 'ENABLE_SHOW_ATTENDEE_COUNT',
947
962
 
948
963
  // raise hand
949
964
  DISABLE_RAISE_HAND: 'DISABLE_RAISE_HAND',
@@ -963,6 +978,16 @@ export const DISPLAY_HINTS = {
963
978
 
964
979
  // Voip (audio/video)
965
980
  VOIP_IS_ENABLED: 'VOIP_IS_ENABLED',
981
+
982
+ // Webcast
983
+ WEBCAST_CONTROL_START: 'WEBCAST_CONTROL_START',
984
+ WEBCAST_CONTROL_STOP: 'WEBCAST_CONTROL_STOP',
985
+
986
+ // Stage View
987
+ STAGE_VIEW_ACTIVE: 'STAGE_VIEW_ACTIVE',
988
+ STAGE_VIEW_INACTIVE: 'STAGE_VIEW_INACTIVE',
989
+ ENABLE_STAGE_VIEW: 'ENABLE_STAGE_VIEW',
990
+ DISABLE_STAGE_VIEW: 'DISABLE_STAGE_VIEW',
966
991
  };
967
992
 
968
993
  export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
@@ -2,6 +2,7 @@ enum Setting {
2
2
  disallowUnmute = 'DisallowUnmute',
3
3
  muteOnEntry = 'MuteOnEntry',
4
4
  muted = 'Muted',
5
+ roles = 'Roles',
5
6
  }
6
7
 
7
8
  enum Control {
@@ -177,7 +177,12 @@ export default class ControlsOptionsManager {
177
177
  * @memberof ControlsOptionsManager
178
178
  * @returns {Promise}
179
179
  */
180
- private setControls(setting: {[key in Setting]?: boolean}): Promise<any> {
180
+ private setControls(setting: {
181
+ [Setting.muted]?: boolean;
182
+ [Setting.disallowUnmute]?: boolean;
183
+ [Setting.muteOnEntry]?: boolean;
184
+ [Setting.roles]?: Array<string>;
185
+ }): Promise<any> {
181
186
  LoggerProxy.logger.log(
182
187
  `ControlsOptionsManager:index#setControls --> ${JSON.stringify(setting)}`
183
188
  );
@@ -190,6 +195,7 @@ export default class ControlsOptionsManager {
190
195
  Object.entries(setting).forEach(([key, value]) => {
191
196
  if (
192
197
  !shouldSkipCheckToMergeBody &&
198
+ value !== undefined &&
193
199
  !Util?.[`${value ? CAN_SET : CAN_UNSET}${key}`](this.displayHints)
194
200
  ) {
195
201
  error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
@@ -219,6 +225,14 @@ export default class ControlsOptionsManager {
219
225
  }
220
226
  break;
221
227
 
228
+ case Setting.roles:
229
+ if (Array.isArray(value)) {
230
+ body.audio = body.audio
231
+ ? {...body.audio, [camelCase(key)]: value}
232
+ : {[camelCase(key)]: value};
233
+ }
234
+ break;
235
+
222
236
  default:
223
237
  error = new PermissionError(`${key} [${value}] not allowed, due to moderator property.`);
224
238
  }
@@ -261,18 +275,21 @@ export default class ControlsOptionsManager {
261
275
  * @param {boolean} mutedEnabled
262
276
  * @param {boolean} disallowUnmuteEnabled
263
277
  * @param {boolean} muteOnEntryEnabled
278
+ * @param {array} roles which should be muted
264
279
  * @memberof ControlsOptionsManager
265
280
  * @returns {Promise}
266
281
  */
267
282
  public setMuteAll(
268
283
  mutedEnabled: boolean,
269
284
  disallowUnmuteEnabled: boolean,
270
- muteOnEntryEnabled: boolean
285
+ muteOnEntryEnabled: boolean,
286
+ roles: Array<string>
271
287
  ): Promise<any> {
272
288
  return this.setControls({
273
289
  [Setting.muted]: mutedEnabled,
274
290
  [Setting.disallowUnmute]: disallowUnmuteEnabled,
275
291
  [Setting.muteOnEntry]: muteOnEntryEnabled,
292
+ [Setting.roles]: roles,
276
293
  });
277
294
  }
278
295
  }
@@ -36,6 +36,8 @@ export interface VideoProperties {
36
36
 
37
37
  export interface ViewTheParticipantListProperties {
38
38
  enabled?: boolean;
39
+ panelistEnabled?: boolean;
40
+ attendeeCount?: boolean;
39
41
  }
40
42
 
41
43
  export type Properties =
@@ -217,6 +217,18 @@ class Utils {
217
217
  if (control.properties.enabled === false) {
218
218
  requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST);
219
219
  }
220
+ if (control.properties.panelistEnabled === true) {
221
+ requiredHints.push(DISPLAY_HINTS.ENABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
222
+ }
223
+ if (control.properties.panelistEnabled === false) {
224
+ requiredHints.push(DISPLAY_HINTS.DISABLE_VIEW_THE_PARTICIPANT_LIST_PANELIST);
225
+ }
226
+ if (control.properties.attendeeCount === true) {
227
+ requiredHints.push(DISPLAY_HINTS.ENABLE_SHOW_ATTENDEE_COUNT);
228
+ }
229
+ if (control.properties.attendeeCount === false) {
230
+ requiredHints.push(DISPLAY_HINTS.DISABLE_SHOW_ATTENDEE_COUNT);
231
+ }
220
232
 
221
233
  return Utils.hasHints({requiredHints, displayHints});
222
234
  }
@@ -79,7 +79,11 @@ ControlsUtils.parse = (controls: any) => {
79
79
  }
80
80
 
81
81
  if (controls?.viewTheParticipantList) {
82
- parsedControls.viewTheParticipantList = {enabled: controls.viewTheParticipantList.enabled};
82
+ parsedControls.viewTheParticipantList = {
83
+ enabled: controls.viewTheParticipantList?.enabled ?? false,
84
+ panelistEnabled: controls.viewTheParticipantList?.panelistEnabled ?? false,
85
+ attendeeCount: controls.viewTheParticipantList?.attendeeCount ?? 0,
86
+ };
83
87
  }
84
88
 
85
89
  if (controls?.raiseHand) {
@@ -90,6 +94,23 @@ ControlsUtils.parse = (controls: any) => {
90
94
  parsedControls.video = {enabled: controls.video.enabled};
91
95
  }
92
96
 
97
+ if (controls?.webcastControl) {
98
+ parsedControls.webcastControl = {streaming: controls.webcastControl.streaming};
99
+ }
100
+
101
+ if (controls?.meetingFull) {
102
+ parsedControls.meetingFull = {
103
+ meetingFull: controls.meetingFull?.meetingFull ?? false,
104
+ meetingPanelistFull: controls.meetingFull?.meetingPanelistFull ?? false,
105
+ };
106
+ }
107
+
108
+ if (controls?.practiceSession) {
109
+ parsedControls.practiceSession = {
110
+ enabled: controls.practiceSession.enabled,
111
+ };
112
+ }
113
+
93
114
  return parsedControls;
94
115
  };
95
116
 
@@ -121,7 +142,11 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
121
142
  previous?.reactions?.showDisplayNameWithReactions,
122
143
 
123
144
  hasViewTheParticipantListChanged:
124
- current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled,
145
+ current?.viewTheParticipantList?.enabled !== previous?.viewTheParticipantList?.enabled ||
146
+ current?.viewTheParticipantList?.panelistEnabled !==
147
+ previous?.viewTheParticipantList?.panelistEnabled ||
148
+ current?.viewTheParticipantList?.attendeeCount !==
149
+ previous?.viewTheParticipantList?.attendeeCount,
125
150
 
126
151
  hasRaiseHandChanged: current?.raiseHand?.enabled !== previous?.raiseHand?.enabled,
127
152
 
@@ -167,6 +192,25 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
167
192
  hasVideoEnabledChanged:
168
193
  newControls.video?.enabled !== undefined &&
169
194
  !isEqual(previous?.videoEnabled, current?.videoEnabled),
195
+
196
+ hasWebcastChanged: !isEqual(
197
+ previous?.webcastControl?.streaming,
198
+ current?.webcastControl?.streaming
199
+ ),
200
+
201
+ hasMeetingFullChanged:
202
+ !isEqual(previous?.meetingFull?.meetingFull, current?.meetingFull?.meetingFull) ||
203
+ !isEqual(
204
+ previous?.meetingFull?.meetingPanelistFull,
205
+ current?.meetingFull?.meetingPanelistFull
206
+ ),
207
+
208
+ hasPracticeSessionEnabledChanged: !isEqual(
209
+ previous?.practiceSession?.enabled,
210
+ current?.practiceSession?.enabled
211
+ ),
212
+
213
+ hasStageViewChanged: !isEqual(previous?.videoLayout, current?.videoLayout),
170
214
  },
171
215
  };
172
216
  };
@@ -6,6 +6,7 @@ FullState.parse = (fullState) => ({
6
6
  type: fullState.type || FULL_STATE.UNKNOWN,
7
7
  meetingState: fullState.state,
8
8
  locked: fullState.locked,
9
+ attendeeCount: typeof fullState.attendeeCount === 'number' ? fullState.attendeeCount : 0,
9
10
  });
10
11
 
11
12
  FullState.getFullState = (oldFullState, newFullState) => {
@@ -64,6 +64,7 @@ export default class LocusInfo extends EventsScope {
64
64
  replace: any;
65
65
  url: any;
66
66
  services: any;
67
+ resources: any;
67
68
  mainSessionLocusCache: any;
68
69
  /**
69
70
  * Constructor
@@ -263,6 +264,7 @@ export default class LocusInfo extends EventsScope {
263
264
  this.updateHostInfo(locus.host);
264
265
  this.updateMediaShares(locus.mediaShares);
265
266
  this.updateServices(locus.links?.services);
267
+ this.updateResources(locus.links?.resources);
266
268
  }
267
269
 
268
270
  /**
@@ -452,6 +454,7 @@ export default class LocusInfo extends EventsScope {
452
454
  this.updateIdentifiers(locus.identities);
453
455
  this.updateEmbeddedApps(locus.embeddedApps);
454
456
  this.updateServices(locus.links?.services);
457
+ this.updateResources(locus.links?.resources);
455
458
  this.compareAndUpdate();
456
459
  // update which required to compare different objects from locus
457
460
  }
@@ -805,6 +808,10 @@ export default class LocusInfo extends EventsScope {
805
808
  hasRaiseHandChanged,
806
809
  hasVideoChanged,
807
810
  hasInterpretationChanged,
811
+ hasWebcastChanged,
812
+ hasMeetingFullChanged,
813
+ hasPracticeSessionEnabledChanged,
814
+ hasStageViewChanged,
808
815
  },
809
816
  current,
810
817
  } = ControlsUtils.getControls(this.controls, controls);
@@ -1008,6 +1015,38 @@ export default class LocusInfo extends EventsScope {
1008
1015
  );
1009
1016
  }
1010
1017
 
1018
+ if (hasWebcastChanged) {
1019
+ this.emitScoped(
1020
+ {file: 'locus-info', function: 'updateControls'},
1021
+ LOCUSINFO.EVENTS.CONTROLS_WEBCAST_CHANGED,
1022
+ {state: current.webcastControl}
1023
+ );
1024
+ }
1025
+
1026
+ if (hasMeetingFullChanged) {
1027
+ this.emitScoped(
1028
+ {file: 'locus-info', function: 'updateControls'},
1029
+ LOCUSINFO.EVENTS.CONTROLS_MEETING_FULL_CHANGED,
1030
+ {state: current.meetingFull}
1031
+ );
1032
+ }
1033
+
1034
+ if (hasPracticeSessionEnabledChanged) {
1035
+ this.emitScoped(
1036
+ {file: 'locus-info', function: 'updateControls'},
1037
+ LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED,
1038
+ {state: current.practiceSession}
1039
+ );
1040
+ }
1041
+
1042
+ if (hasStageViewChanged) {
1043
+ this.emitScoped(
1044
+ {file: 'locus-info', function: 'updateControls'},
1045
+ LOCUSINFO.EVENTS.CONTROLS_STAGE_VIEW_UPDATED,
1046
+ {state: current.videoLayout}
1047
+ );
1048
+ }
1049
+
1011
1050
  this.controls = controls;
1012
1051
  }
1013
1052
  }
@@ -1064,6 +1103,27 @@ export default class LocusInfo extends EventsScope {
1064
1103
  }
1065
1104
  }
1066
1105
 
1106
+ /**
1107
+ * @param {Object} resources
1108
+ * @returns {undefined}
1109
+ * @memberof LocusInfo
1110
+ */
1111
+ updateResources(resources: Record<'webcastInstance', {url: string}>) {
1112
+ if (resources && !isEqual(this.resources, resources)) {
1113
+ this.resources = resources;
1114
+ this.emitScoped(
1115
+ {
1116
+ file: 'locus-info',
1117
+ function: 'updateResources',
1118
+ },
1119
+ LOCUSINFO.EVENTS.LINKS_RESOURCES,
1120
+ {
1121
+ resources,
1122
+ }
1123
+ );
1124
+ }
1125
+ }
1126
+
1067
1127
  /**
1068
1128
  * @param {Object} fullState
1069
1129
  * @returns {undefined}
@@ -3,6 +3,7 @@
3
3
  */
4
4
 
5
5
  import {MEETINGS} from '../constants';
6
+ import ControlsOptionsUtil from '../controls-options-manager/util';
6
7
 
7
8
  /**
8
9
  * IInMeetingActions
@@ -64,6 +65,10 @@ interface IInMeetingActions {
64
65
  canUpdateShareControl?: boolean;
65
66
  canEnableViewTheParticipantsList?: boolean;
66
67
  canDisableViewTheParticipantsList?: boolean;
68
+ canEnableViewTheParticipantsListPanelist?: boolean;
69
+ canDisableViewTheParticipantsListPanelist?: boolean;
70
+ canEnableShowAttendeeCount?: boolean;
71
+ canDisableShowAttendeeCount?: boolean;
67
72
  canEnableRaiseHand?: boolean;
68
73
  canDisableRaiseHand?: boolean;
69
74
  canEnableVideo?: boolean;
@@ -83,6 +88,11 @@ interface IInMeetingActions {
83
88
  canShareWhiteBoard?: boolean;
84
89
  enforceVirtualBackground?: boolean;
85
90
  canPollingAndQA?: boolean;
91
+ canStartWebcast?: boolean;
92
+ canStopWebcast?: boolean;
93
+ canShowStageView?: boolean;
94
+ canEnableStageView?: boolean;
95
+ canDisableStageView?: boolean;
86
96
  }
87
97
 
88
98
  /**
@@ -201,6 +211,14 @@ export default class InMeetingActions implements IInMeetingActions {
201
211
 
202
212
  canDisableViewTheParticipantsList = null;
203
213
 
214
+ canEnableViewTheParticipantsListPanelist = null;
215
+
216
+ canDisableViewTheParticipantsListPanelist = null;
217
+
218
+ canEnableShowAttendeeCount = null;
219
+
220
+ canDisableShowAttendeeCount = null;
221
+
204
222
  canEnableRaiseHand = null;
205
223
 
206
224
  canDisableRaiseHand = null;
@@ -238,6 +256,16 @@ export default class InMeetingActions implements IInMeetingActions {
238
256
  canShareWhiteBoard = null;
239
257
 
240
258
  canPollingAndQA = null;
259
+
260
+ canStartWebcast = null;
261
+
262
+ canStopWebcast = null;
263
+
264
+ canShowStageView = null;
265
+
266
+ canEnableStageView = null;
267
+
268
+ canDisableStageView = null;
241
269
  /**
242
270
  * Returns all meeting action options
243
271
  * @returns {Object}
@@ -298,6 +326,10 @@ export default class InMeetingActions implements IInMeetingActions {
298
326
  canUpdateShareControl: this.canUpdateShareControl,
299
327
  canEnableViewTheParticipantsList: this.canEnableViewTheParticipantsList,
300
328
  canDisableViewTheParticipantsList: this.canDisableViewTheParticipantsList,
329
+ canEnableViewTheParticipantsListPanelist: this.canEnableViewTheParticipantsListPanelist,
330
+ canDisableViewTheParticipantsListPanelist: this.canDisableViewTheParticipantsListPanelist,
331
+ canEnableShowAttendeeCount: this.canEnableShowAttendeeCount,
332
+ canDisableShowAttendeeCount: this.canDisableShowAttendeeCount,
301
333
  canEnableRaiseHand: this.canEnableRaiseHand,
302
334
  canDisableRaiseHand: this.canDisableRaiseHand,
303
335
  canEnableVideo: this.canEnableVideo,
@@ -317,6 +349,11 @@ export default class InMeetingActions implements IInMeetingActions {
317
349
  supportHDV: this.supportHDV,
318
350
  canShareWhiteBoard: this.canShareWhiteBoard,
319
351
  canPollingAndQA: this.canPollingAndQA,
352
+ canStartWebcast: this.canStartWebcast,
353
+ canStopWebcast: this.canStopWebcast,
354
+ canShowStageView: this.canShowStageView,
355
+ canEnableStageView: this.canEnableStageView,
356
+ canDisableStageView: this.canDisableStageView,
320
357
  });
321
358
 
322
359
  /**