@webex/plugin-meetings 3.7.0-next.1 → 3.7.0-next.10

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 (63) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +2 -1
  4. package/dist/config.js.map +1 -1
  5. package/dist/constants.js +10 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/interpretation/index.js +1 -1
  8. package/dist/interpretation/siLanguage.js +1 -1
  9. package/dist/meeting/in-meeting-actions.js +11 -1
  10. package/dist/meeting/in-meeting-actions.js.map +1 -1
  11. package/dist/meeting/index.js +286 -198
  12. package/dist/meeting/index.js.map +1 -1
  13. package/dist/meeting/util.js +1 -0
  14. package/dist/meeting/util.js.map +1 -1
  15. package/dist/meetings/index.js +4 -1
  16. package/dist/meetings/index.js.map +1 -1
  17. package/dist/members/util.js +4 -2
  18. package/dist/members/util.js.map +1 -1
  19. package/dist/metrics/constants.js +3 -1
  20. package/dist/metrics/constants.js.map +1 -1
  21. package/dist/reachability/clusterReachability.js +12 -11
  22. package/dist/reachability/clusterReachability.js.map +1 -1
  23. package/dist/recording-controller/enums.js +8 -4
  24. package/dist/recording-controller/enums.js.map +1 -1
  25. package/dist/recording-controller/index.js +18 -9
  26. package/dist/recording-controller/index.js.map +1 -1
  27. package/dist/recording-controller/util.js +13 -9
  28. package/dist/recording-controller/util.js.map +1 -1
  29. package/dist/types/config.d.ts +1 -0
  30. package/dist/types/constants.d.ts +8 -0
  31. package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
  32. package/dist/types/meeting/index.d.ts +20 -0
  33. package/dist/types/meetings/index.d.ts +3 -0
  34. package/dist/types/members/util.d.ts +2 -0
  35. package/dist/types/metrics/constants.d.ts +2 -0
  36. package/dist/types/recording-controller/enums.d.ts +5 -2
  37. package/dist/types/recording-controller/index.d.ts +1 -0
  38. package/dist/types/recording-controller/util.d.ts +2 -1
  39. package/dist/webinar/index.js +39 -7
  40. package/dist/webinar/index.js.map +1 -1
  41. package/package.json +21 -21
  42. package/src/config.ts +1 -0
  43. package/src/constants.ts +10 -0
  44. package/src/meeting/in-meeting-actions.ts +21 -0
  45. package/src/meeting/index.ts +93 -0
  46. package/src/meeting/util.ts +1 -0
  47. package/src/meetings/index.ts +6 -0
  48. package/src/members/util.ts +1 -0
  49. package/src/metrics/constants.ts +2 -0
  50. package/src/reachability/clusterReachability.ts +4 -1
  51. package/src/recording-controller/enums.ts +5 -2
  52. package/src/recording-controller/index.ts +17 -4
  53. package/src/recording-controller/util.ts +20 -5
  54. package/src/webinar/index.ts +40 -8
  55. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -1
  56. package/test/unit/spec/meeting/index.js +74 -0
  57. package/test/unit/spec/meeting/utils.js +2 -0
  58. package/test/unit/spec/meetings/index.js +9 -5
  59. package/test/unit/spec/members/utils.js +95 -0
  60. package/test/unit/spec/reachability/clusterReachability.ts +7 -0
  61. package/test/unit/spec/recording-controller/index.js +61 -5
  62. package/test/unit/spec/recording-controller/util.js +39 -3
  63. package/test/unit/spec/webinar/index.ts +47 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_constants","require","_enums","_interopRequireDefault","_util","canUserStart","displayHints","userPolicies","includes","DISPLAY_HINTS","RECORDING_CONTROL_START","MeetingUtil","selfSupportsFeature","SELF_POLICY","SUPPORT_NETWORK_BASED_RECORD","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","extractLocusId","url","split","pop","deriveRecordingStates","action","recording","paused","RecordingAction","Start","Stop","Resume","Pause","Error","concat","_default","exports","default"],"sources":["util.ts"],"sourcesContent":["import {DISPLAY_HINTS, SELF_POLICY} from '../constants';\nimport RecordingAction from './enums';\nimport MeetingUtil from '../meeting/util';\n\nconst canUserStart = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserPause = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserResume = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserStop = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst extractLocusId = (url: string) => {\n return url?.split('/').pop();\n};\n\nconst deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {\n let recording;\n let paused;\n\n switch (action) {\n case RecordingAction.Start:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Stop:\n recording = false;\n paused = false;\n break;\n case RecordingAction.Resume:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Pause:\n recording = true;\n paused = true;\n break;\n default:\n throw new Error(`Recording state cannot be derived from invalid action: ${action}`);\n }\n\n return {\n recording,\n paused,\n };\n};\n\nexport default {\n canUserStart,\n canUserPause,\n canUserResume,\n canUserStop,\n deriveRecordingStates,\n extractLocusId,\n};\n"],"mappings":";;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,KAAA,GAAAD,sBAAA,CAAAF,OAAA;AAEA,IAAMI,YAAY,GAAG,SAAfA,YAAYA,CAChBC,YAA2B,EAC3BC,YAA0C;EAAA,OAE1CD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACC,uBAAuB,CAAC,IAC5DC,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAEP,YAAY,CAAC;AAAA;AAEzF,IAAMQ,YAAY,GAAG,SAAfA,YAAYA,CAChBT,YAA2B,EAC3BC,YAA0C;EAAA,OAE1CD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACO,uBAAuB,CAAC,IAC5DL,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAEP,YAAY,CAAC;AAAA;AAEzF,IAAMU,aAAa,GAAG,SAAhBA,aAAaA,CACjBX,YAA2B,EAC3BC,YAA0C;EAAA,OAE1CD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACS,wBAAwB,CAAC,IAC7DP,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAEP,YAAY,CAAC;AAAA;AAEzF,IAAMY,WAAW,GAAG,SAAdA,WAAWA,CACfb,YAA2B,EAC3BC,YAA0C;EAAA,OAE1CD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACW,sBAAsB,CAAC,IAC3DT,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAEP,YAAY,CAAC;AAAA;AAEzF,IAAMc,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,GAAW,EAAK;EACtC,OAAOA,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIC,MAAuB,EAA4C;EAChG,IAAIC,SAAS;EACb,IAAIC,MAAM;EAEV,QAAQF,MAAM;IACZ,KAAKG,cAAe,CAACC,KAAK;MACxBH,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACE,IAAI;MACvBJ,SAAS,GAAG,KAAK;MACjBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACG,MAAM;MACzBL,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACI,KAAK;MACxBN,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,IAAI;MACb;IACF;MACE,MAAM,IAAIM,KAAK,2DAAAC,MAAA,CAA2DT,MAAM,CAAE,CAAC;EACvF;EAEA,OAAO;IACLC,SAAS,EAATA,SAAS;IACTC,MAAM,EAANA;EACF,CAAC;AACH,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa;EACbjC,YAAY,EAAZA,YAAY;EACZU,YAAY,EAAZA,YAAY;EACZE,aAAa,EAAbA,aAAa;EACbE,WAAW,EAAXA,WAAW;EACXM,qBAAqB,EAArBA,qBAAqB;EACrBJ,cAAc,EAAdA;AACF,CAAC"}
1
+ {"version":3,"names":["_constants","require","_enums","_util","_interopRequireDefault","canUserStart","displayHints","userPolicies","includes","DISPLAY_HINTS","RECORDING_CONTROL_START","PREMISE_RECORDING_CONTROL_START","MeetingUtil","selfSupportsFeature","SELF_POLICY","SUPPORT_NETWORK_BASED_RECORD","canUserPause","RECORDING_CONTROL_PAUSE","PREMISE_RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","PREMISE_RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","PREMISE_RECORDING_CONTROL_STOP","isPremiseRecordingEnabled","extractLocusId","url","split","pop","deriveRecordingStates","action","recording","paused","RecordingAction","Start","Stop","Resume","Pause","Error","concat","_default","exports","default"],"sources":["util.ts"],"sourcesContent":["import {DISPLAY_HINTS, SELF_POLICY} from '../constants';\nimport {RecordingAction} from './enums';\nimport MeetingUtil from '../meeting/util';\n\nconst canUserStart = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_START)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserPause = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_PAUSE)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserResume = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_RESUME)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst canUserStop = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_STOP)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst isPremiseRecordingEnabled = (\n displayHints: Array<string>,\n userPolicies: Record<SELF_POLICY, boolean>\n): boolean =>\n (displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_START) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_PAUSE) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_STOP) ||\n displayHints.includes(DISPLAY_HINTS.PREMISE_RECORDING_CONTROL_RESUME)) &&\n MeetingUtil.selfSupportsFeature(SELF_POLICY.SUPPORT_NETWORK_BASED_RECORD, userPolicies);\n\nconst extractLocusId = (url: string) => {\n return url?.split('/').pop();\n};\n\nconst deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {\n let recording;\n let paused;\n\n switch (action) {\n case RecordingAction.Start:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Stop:\n recording = false;\n paused = false;\n break;\n case RecordingAction.Resume:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Pause:\n recording = true;\n paused = true;\n break;\n default:\n throw new Error(`Recording state cannot be derived from invalid action: ${action}`);\n }\n\n return {\n recording,\n paused,\n };\n};\n\nexport default {\n canUserStart,\n canUserPause,\n canUserResume,\n canUserStop,\n isPremiseRecordingEnabled,\n deriveRecordingStates,\n extractLocusId,\n};\n"],"mappings":";;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAMI,YAAY,GAAG,SAAfA,YAAYA,CAChBC,YAA2B,EAC3BC,YAA0C;EAAA,OAE1C,CAACD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACC,uBAAuB,CAAC,IAC3DJ,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACE,+BAA+B,CAAC,KACtEC,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAER,YAAY,CAAC;AAAA;AAEzF,IAAMS,YAAY,GAAG,SAAfA,YAAYA,CAChBV,YAA2B,EAC3BC,YAA0C;EAAA,OAE1C,CAACD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACQ,uBAAuB,CAAC,IAC3DX,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACS,+BAA+B,CAAC,KACtEN,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAER,YAAY,CAAC;AAAA;AAEzF,IAAMY,aAAa,GAAG,SAAhBA,aAAaA,CACjBb,YAA2B,EAC3BC,YAA0C;EAAA,OAE1C,CAACD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACW,wBAAwB,CAAC,IAC5Dd,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACY,gCAAgC,CAAC,KACvET,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAER,YAAY,CAAC;AAAA;AAEzF,IAAMe,WAAW,GAAG,SAAdA,WAAWA,CACfhB,YAA2B,EAC3BC,YAA0C;EAAA,OAE1C,CAACD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACc,sBAAsB,CAAC,IAC1DjB,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACe,8BAA8B,CAAC,KACrEZ,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAER,YAAY,CAAC;AAAA;AAEzF,IAAMkB,yBAAyB,GAAG,SAA5BA,yBAAyBA,CAC7BnB,YAA2B,EAC3BC,YAA0C;EAAA,OAE1C,CAACD,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACE,+BAA+B,CAAC,IACnEL,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACS,+BAA+B,CAAC,IACpEZ,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACe,8BAA8B,CAAC,IACnElB,YAAY,CAACE,QAAQ,CAACC,wBAAa,CAACY,gCAAgC,CAAC,KACvET,aAAW,CAACC,mBAAmB,CAACC,sBAAW,CAACC,4BAA4B,EAAER,YAAY,CAAC;AAAA;AAEzF,IAAMmB,cAAc,GAAG,SAAjBA,cAAcA,CAAIC,GAAW,EAAK;EACtC,OAAOA,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAqBA,CAAIC,MAAuB,EAA4C;EAChG,IAAIC,SAAS;EACb,IAAIC,MAAM;EAEV,QAAQF,MAAM;IACZ,KAAKG,sBAAe,CAACC,KAAK;MACxBH,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,sBAAe,CAACE,IAAI;MACvBJ,SAAS,GAAG,KAAK;MACjBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,sBAAe,CAACG,MAAM;MACzBL,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,sBAAe,CAACI,KAAK;MACxBN,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,IAAI;MACb;IACF;MACE,MAAM,IAAIM,KAAK,2DAAAC,MAAA,CAA2DT,MAAM,CAAE,CAAC;EACvF;EAEA,OAAO;IACLC,SAAS,EAATA,SAAS;IACTC,MAAM,EAANA;EACF,CAAC;AACH,CAAC;AAAC,IAAAQ,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEa;EACbtC,YAAY,EAAZA,YAAY;EACZW,YAAY,EAAZA,YAAY;EACZG,aAAa,EAAbA,aAAa;EACbG,WAAW,EAAXA,WAAW;EACXG,yBAAyB,EAAzBA,yBAAyB;EACzBK,qBAAqB,EAArBA,qBAAqB;EACrBJ,cAAc,EAAdA;AACF,CAAC"}
@@ -71,6 +71,7 @@ declare const _default: {
71
71
  iceCandidatesGatheringTimeout: any;
72
72
  backendIpv6NativeSupport: boolean;
73
73
  reachabilityGetClusterTimeout: number;
74
+ logUploadIntervalMultiplicationFactor: number;
74
75
  };
75
76
  };
76
77
  export default _default;
@@ -738,6 +738,10 @@ export declare const DISPLAY_HINTS: {
738
738
  RECORDING_CONTROL_PAUSE: string;
739
739
  RECORDING_CONTROL_STOP: string;
740
740
  RECORDING_CONTROL_RESUME: string;
741
+ PREMISE_RECORDING_CONTROL_START: string;
742
+ PREMISE_RECORDING_CONTROL_PAUSE: string;
743
+ PREMISE_RECORDING_CONTROL_STOP: string;
744
+ PREMISE_RECORDING_CONTROL_RESUME: string;
741
745
  LOCK_CONTROL_UNLOCK: string;
742
746
  LOCK_CONTROL_LOCK: string;
743
747
  LOCK_STATUS_LOCKED: string;
@@ -805,6 +809,10 @@ export declare const DISPLAY_HINTS: {
805
809
  STAGE_VIEW_INACTIVE: string;
806
810
  ENABLE_STAGE_VIEW: string;
807
811
  DISABLE_STAGE_VIEW: string;
812
+ PRACTICE_SESSION_ON: string;
813
+ PRACTICE_SESSION_OFF: string;
814
+ SHOW_PRACTICE_SESSION_START: string;
815
+ SHOW_PRACTICE_SESSION_STOP: string;
808
816
  };
809
817
  export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
810
818
  export declare const SELF_ROLES: {
@@ -22,6 +22,7 @@ interface IInMeetingActions {
22
22
  canStartRecording?: boolean;
23
23
  canPauseRecording?: boolean;
24
24
  canResumeRecording?: boolean;
25
+ isPremiseRecordingEnabled?: boolean;
25
26
  canStopRecording?: boolean;
26
27
  canRaiseHand?: boolean;
27
28
  canLowerAllHands?: boolean;
@@ -89,6 +90,10 @@ interface IInMeetingActions {
89
90
  canShowStageView?: boolean;
90
91
  canEnableStageView?: boolean;
91
92
  canDisableStageView?: boolean;
93
+ isPracticeSessionOn?: boolean;
94
+ isPracticeSessionOff?: boolean;
95
+ canStartPracticeSession?: boolean;
96
+ canStopPracticeSession?: boolean;
92
97
  }
93
98
  /**
94
99
  * @class InMeetingActions
@@ -103,6 +108,7 @@ export default class InMeetingActions implements IInMeetingActions {
103
108
  canStartRecording: any;
104
109
  canPauseRecording: any;
105
110
  canResumeRecording: any;
111
+ isPremiseRecordingEnabled: any;
106
112
  canStopRecording: any;
107
113
  canSetMuteOnEntry: any;
108
114
  canSetPresenter: any;
@@ -178,6 +184,10 @@ export default class InMeetingActions implements IInMeetingActions {
178
184
  canShowStageView: any;
179
185
  canEnableStageView: any;
180
186
  canDisableStageView: any;
187
+ isPracticeSessionOn: any;
188
+ isPracticeSessionOff: any;
189
+ canStartPracticeSession: any;
190
+ canStopPracticeSession: any;
181
191
  /**
182
192
  * Returns all meeting action options
183
193
  * @returns {Object}
@@ -460,6 +460,8 @@ export default class Meeting extends StatelessWebexPlugin {
460
460
  private iceCandidateErrors;
461
461
  private iceCandidatesCount;
462
462
  private rtcMetrics?;
463
+ private uploadLogsTimer?;
464
+ private logUploadIntervalIndex;
463
465
  /**
464
466
  * @param {Object} attrs
465
467
  * @param {Object} options
@@ -804,6 +806,7 @@ export default class Meeting extends StatelessWebexPlugin {
804
806
  emailAddress: string;
805
807
  email: string;
806
808
  phoneNumber: string;
809
+ roles: Array<string>;
807
810
  }, alertIfActive?: boolean): any;
808
811
  /**
809
812
  * Cancel an outgoing phone call invitation made during a meeting
@@ -961,6 +964,23 @@ export default class Meeting extends StatelessWebexPlugin {
961
964
  * @memberof Meeting
962
965
  */
963
966
  uploadLogs(options?: object): void;
967
+ /**
968
+ * sets the timer for periodic log upload
969
+ * @returns {void}
970
+ */
971
+ private setLogUploadTimer;
972
+ /**
973
+ * Starts a periodic upload of logs
974
+ *
975
+ * @returns {undefined}
976
+ */
977
+ startPeriodicLogUpload(): void;
978
+ /**
979
+ * Stops the periodic upload of logs
980
+ *
981
+ * @returns {undefined}
982
+ */
983
+ stopPeriodicLogUpload(): void;
964
984
  /**
965
985
  * Removes remote audio, video and share streams from class instance's mediaProperties
966
986
  * @returns {undefined}
@@ -71,6 +71,9 @@ export type BasicMeetingInformation = {
71
71
  };
72
72
  meetingInfo: any;
73
73
  sessionCorrelationId: string;
74
+ roles: string[];
75
+ getCurUserType: () => string | null;
76
+ callStateForMetrics: CallStateForMetrics;
74
77
  };
75
78
  /**
76
79
  * Maintain a cache of meetings and sync with services.
@@ -26,6 +26,7 @@ declare const MembersUtil: {
26
26
  */
27
27
  getAddMemberBody: (options: any) => {
28
28
  invitees: {
29
+ roles?: any;
29
30
  address: any;
30
31
  }[];
31
32
  alertIfActive: any;
@@ -54,6 +55,7 @@ declare const MembersUtil: {
54
55
  uri: any;
55
56
  body: {
56
57
  invitees: {
58
+ roles?: any;
57
59
  address: any;
58
60
  }[];
59
61
  alertIfActive: any;
@@ -68,5 +68,7 @@ declare const BEHAVIORAL_METRICS: {
68
68
  TURN_DISCOVERY_REQUIRES_OK: string;
69
69
  REACHABILITY_COMPLETED: string;
70
70
  WEBINAR_REGISTRATION_ERROR: string;
71
+ GUEST_ENTERED_LOBBY: string;
72
+ GUEST_EXITED_LOBBY: string;
71
73
  };
72
74
  export { BEHAVIORAL_METRICS as default };
@@ -1,7 +1,10 @@
1
- declare enum RecordingAction {
1
+ export declare enum RecordingAction {
2
2
  Start = "Start",
3
3
  Stop = "Stop",
4
4
  Pause = "Pause",
5
5
  Resume = "Resume"
6
6
  }
7
- export default RecordingAction;
7
+ export declare enum RecordingType {
8
+ Premise = "premise",
9
+ Cloud = "cloud"
10
+ }
@@ -161,6 +161,7 @@ export default class RecordingController {
161
161
  private extract;
162
162
  /**
163
163
  * @param {RecordingAction} action
164
+ * @param {RecordingType} recordingType
164
165
  * @private
165
166
  * @memberof RecordingController
166
167
  * @returns {Promise}
@@ -1,10 +1,11 @@
1
1
  import { SELF_POLICY } from '../constants';
2
- import RecordingAction from './enums';
2
+ import { RecordingAction } from './enums';
3
3
  declare const _default: {
4
4
  canUserStart: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
5
5
  canUserPause: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
6
6
  canUserResume: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
7
7
  canUserStop: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
8
+ isPremiseRecordingEnabled: (displayHints: string[], userPolicies: Record<SELF_POLICY, boolean>) => boolean;
8
9
  deriveRecordingStates: (action: RecordingAction) => {
9
10
  recording: boolean;
10
11
  paused: boolean;
@@ -10,6 +10,7 @@ var _webexCore = require("@webex/webex-core");
10
10
  var _lodash = require("lodash");
11
11
  var _constants = require("../constants");
12
12
  var _collection = _interopRequireDefault(require("./collection"));
13
+ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
13
14
  /*!
14
15
  * Copyright (c) 2015-2023 Cisco Systems, Inc. See LICENSE file.
15
16
  */
@@ -31,7 +32,9 @@ var Webinar = _webexCore.WebexPlugin.extend({
31
32
  // appears the ability to manage webcast
32
33
  selfIsPanelist: 'boolean',
33
34
  // self is panelist
34
- selfIsAttendee: 'boolean' // self is attendee
35
+ selfIsAttendee: 'boolean',
36
+ // self is attendee
37
+ practiceSessionEnabled: 'boolean' // practice session enabled
35
38
  },
36
39
  /**
37
40
  * Update the current locus url of the webinar
@@ -65,17 +68,46 @@ var Webinar = _webexCore.WebexPlugin.extend({
65
68
  * @returns {{isPromoted: boolean, isDemoted: boolean}} Role transition states
66
69
  */
67
70
  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));
71
+ var oldRoles = (0, _lodash.get)(payload, 'oldRoles', []);
72
+ var newRoles = (0, _lodash.get)(payload, 'newRoles', []);
73
+ var isPromoted = oldRoles.includes(_constants.SELF_ROLES.ATTENDEE) && newRoles.includes(_constants.SELF_ROLES.PANELIST);
74
+ var isDemoted = oldRoles.includes(_constants.SELF_ROLES.PANELIST) && newRoles.includes(_constants.SELF_ROLES.ATTENDEE);
75
+ this.set('selfIsPanelist', newRoles.includes(_constants.SELF_ROLES.PANELIST));
76
+ this.set('selfIsAttendee', newRoles.includes(_constants.SELF_ROLES.ATTENDEE));
77
+ this.updateCanManageWebcast(newRoles.includes(_constants.SELF_ROLES.MODERATOR));
73
78
  return {
74
79
  isPromoted: isPromoted,
75
80
  isDemoted: isDemoted
76
81
  };
77
82
  },
78
- version: "3.7.0-next.1"
83
+ /**
84
+ * start or stop practice session for webinar
85
+ * @param {boolean} enabled
86
+ * @returns {Promise}
87
+ */
88
+ setPracticeSessionState: function setPracticeSessionState(enabled) {
89
+ return this.request({
90
+ method: _constants.HTTP_VERBS.PATCH,
91
+ uri: "".concat(this.locusUrl, "/controls"),
92
+ body: {
93
+ practiceSession: {
94
+ enabled: enabled
95
+ }
96
+ }
97
+ }).catch(function (error) {
98
+ _loggerProxy.default.logger.error('Meeting:webinar#setPracticeSessionState failed', error);
99
+ throw error;
100
+ });
101
+ },
102
+ /**
103
+ * update practice session status
104
+ * @param {object} payload
105
+ * @returns {void}
106
+ */
107
+ updatePracticeSessionStatus: function updatePracticeSessionStatus(payload) {
108
+ this.set('practiceSessionEnabled', payload.enabled);
109
+ },
110
+ version: "3.7.0-next.10"
79
111
  });
80
112
  var _default = exports.default = Webinar;
81
113
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"names":["_webexCore","require","_lodash","_constants","_collection","_interopRequireDefault","_loggerProxy","Webinar","WebexPlugin","extend","namespace","MEETINGS","collections","webinar","WebinarCollection","props","locusUrl","webcastInstanceUrl","canManageWebcast","selfIsPanelist","selfIsAttendee","practiceSessionEnabled","locusUrlUpdate","set","updateWebcastUrl","payload","get","updateCanManageWebcast","updateRoleChanged","oldRoles","newRoles","isPromoted","includes","SELF_ROLES","ATTENDEE","PANELIST","isDemoted","MODERATOR","setPracticeSessionState","enabled","request","method","HTTP_VERBS","PATCH","uri","concat","body","practiceSession","catch","error","LoggerProxy","logger","updatePracticeSessionStatus","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 {HTTP_VERBS, MEETINGS, SELF_ROLES} from '../constants';\n\nimport WebinarCollection from './collection';\nimport LoggerProxy from '../common/logs/logger-proxy';\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 practiceSessionEnabled: 'boolean', // practice session enabled\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 oldRoles = get(payload, 'oldRoles', []);\n const newRoles = get(payload, 'newRoles', []);\n\n const isPromoted =\n oldRoles.includes(SELF_ROLES.ATTENDEE) && newRoles.includes(SELF_ROLES.PANELIST);\n const isDemoted =\n oldRoles.includes(SELF_ROLES.PANELIST) && newRoles.includes(SELF_ROLES.ATTENDEE);\n this.set('selfIsPanelist', newRoles.includes(SELF_ROLES.PANELIST));\n this.set('selfIsAttendee', newRoles.includes(SELF_ROLES.ATTENDEE));\n this.updateCanManageWebcast(newRoles.includes(SELF_ROLES.MODERATOR));\n\n return {isPromoted, isDemoted};\n },\n\n /**\n * start or stop practice session for webinar\n * @param {boolean} enabled\n * @returns {Promise}\n */\n setPracticeSessionState(enabled) {\n return this.request({\n method: HTTP_VERBS.PATCH,\n uri: `${this.locusUrl}/controls`,\n body: {\n practiceSession: {\n enabled,\n },\n },\n }).catch((error) => {\n LoggerProxy.logger.error('Meeting:webinar#setPracticeSessionState failed', error);\n throw error;\n });\n },\n\n /**\n * update practice session status\n * @param {object} payload\n * @returns {void}\n */\n updatePracticeSessionStatus(payload) {\n this.set('practiceSessionEnabled', payload.enabled);\n },\n});\n\nexport default Webinar;\n"],"mappings":"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"}
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.7.0-next.1",
47
- "@webex/plugin-rooms": "3.6.0-next.8",
48
- "@webex/test-helper-chai": "3.6.0-next.4",
49
- "@webex/test-helper-mocha": "3.6.0-next.4",
50
- "@webex/test-helper-mock-webex": "3.6.0-next.4",
51
- "@webex/test-helper-retry": "3.6.0-next.4",
52
- "@webex/test-helper-test-users": "3.6.0-next.4",
46
+ "@webex/plugin-meetings": "3.7.0-next.10",
47
+ "@webex/plugin-rooms": "3.7.0-next.4",
48
+ "@webex/test-helper-chai": "3.7.0-next.2",
49
+ "@webex/test-helper-mocha": "3.7.0-next.2",
50
+ "@webex/test-helper-mock-webex": "3.7.0-next.2",
51
+ "@webex/test-helper-retry": "3.7.0-next.2",
52
+ "@webex/test-helper-test-users": "3.7.0-next.2",
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.4",
64
+ "@webex/common": "3.7.0-next.2",
65
65
  "@webex/internal-media-core": "2.12.2",
66
- "@webex/internal-plugin-conversation": "3.6.0-next.8",
67
- "@webex/internal-plugin-device": "3.6.0-next.4",
68
- "@webex/internal-plugin-llm": "3.6.0-next.6",
69
- "@webex/internal-plugin-mercury": "3.6.0-next.6",
70
- "@webex/internal-plugin-metrics": "3.6.0-next.4",
71
- "@webex/internal-plugin-support": "3.6.0-next.8",
72
- "@webex/internal-plugin-user": "3.6.0-next.4",
73
- "@webex/internal-plugin-voicea": "3.7.0-next.1",
74
- "@webex/media-helpers": "3.6.0-next.5",
75
- "@webex/plugin-people": "3.6.0-next.6",
76
- "@webex/plugin-rooms": "3.6.0-next.8",
66
+ "@webex/internal-plugin-conversation": "3.7.0-next.4",
67
+ "@webex/internal-plugin-device": "3.7.0-next.2",
68
+ "@webex/internal-plugin-llm": "3.7.0-next.2",
69
+ "@webex/internal-plugin-mercury": "3.7.0-next.2",
70
+ "@webex/internal-plugin-metrics": "3.7.0-next.2",
71
+ "@webex/internal-plugin-support": "3.7.0-next.5",
72
+ "@webex/internal-plugin-user": "3.7.0-next.2",
73
+ "@webex/internal-plugin-voicea": "3.7.0-next.10",
74
+ "@webex/media-helpers": "3.7.0-next.2",
75
+ "@webex/plugin-people": "3.7.0-next.2",
76
+ "@webex/plugin-rooms": "3.7.0-next.4",
77
77
  "@webex/web-capabilities": "^1.4.0",
78
- "@webex/webex-core": "3.6.0-next.4",
78
+ "@webex/webex-core": "3.7.0-next.2",
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.7.0-next.1"
94
+ "version": "3.7.0-next.10"
95
95
  }
package/src/config.ts CHANGED
@@ -96,5 +96,6 @@ export default {
96
96
  iceCandidatesGatheringTimeout: undefined,
97
97
  backendIpv6NativeSupport: false,
98
98
  reachabilityGetClusterTimeout: 5000,
99
+ logUploadIntervalMultiplicationFactor: 0, // if set to 0 or undefined, logs won't be uploaded periodically
99
100
  },
100
101
  };
package/src/constants.ts CHANGED
@@ -904,6 +904,10 @@ export const DISPLAY_HINTS = {
904
904
  RECORDING_CONTROL_PAUSE: 'RECORDING_CONTROL_PAUSE',
905
905
  RECORDING_CONTROL_STOP: 'RECORDING_CONTROL_STOP',
906
906
  RECORDING_CONTROL_RESUME: 'RECORDING_CONTROL_RESUME',
907
+ PREMISE_RECORDING_CONTROL_START: 'PREMISE_RECORDING_CONTROL_START',
908
+ PREMISE_RECORDING_CONTROL_PAUSE: 'PREMISE_RECORDING_CONTROL_PAUSE',
909
+ PREMISE_RECORDING_CONTROL_STOP: 'PREMISE_RECORDING_CONTROL_STOP',
910
+ PREMISE_RECORDING_CONTROL_RESUME: 'PREMISE_RECORDING_CONTROL_RESUME',
907
911
  LOCK_CONTROL_UNLOCK: 'LOCK_CONTROL_UNLOCK',
908
912
  LOCK_CONTROL_LOCK: 'LOCK_CONTROL_LOCK',
909
913
  LOCK_STATUS_LOCKED: 'LOCK_STATUS_LOCKED',
@@ -988,6 +992,12 @@ export const DISPLAY_HINTS = {
988
992
  STAGE_VIEW_INACTIVE: 'STAGE_VIEW_INACTIVE',
989
993
  ENABLE_STAGE_VIEW: 'ENABLE_STAGE_VIEW',
990
994
  DISABLE_STAGE_VIEW: 'DISABLE_STAGE_VIEW',
995
+
996
+ // Practice Session
997
+ PRACTICE_SESSION_ON: 'PRACTICE_SESSION_ON',
998
+ PRACTICE_SESSION_OFF: 'PRACTICE_SESSION_OFF',
999
+ SHOW_PRACTICE_SESSION_START: 'SHOW_PRACTICE_SESSION_START',
1000
+ SHOW_PRACTICE_SESSION_STOP: 'SHOW_PRACTICE_SESSION_STOP',
991
1001
  };
992
1002
 
993
1003
  export const INTERSTITIAL_DISPLAY_HINTS = [DISPLAY_HINTS.VOIP_IS_ENABLED];
@@ -26,6 +26,7 @@ interface IInMeetingActions {
26
26
  canStartRecording?: boolean;
27
27
  canPauseRecording?: boolean;
28
28
  canResumeRecording?: boolean;
29
+ isPremiseRecordingEnabled?: boolean;
29
30
  canStopRecording?: boolean;
30
31
  canRaiseHand?: boolean;
31
32
  canLowerAllHands?: boolean;
@@ -93,6 +94,10 @@ interface IInMeetingActions {
93
94
  canShowStageView?: boolean;
94
95
  canEnableStageView?: boolean;
95
96
  canDisableStageView?: boolean;
97
+ isPracticeSessionOn?: boolean;
98
+ isPracticeSessionOff?: boolean;
99
+ canStartPracticeSession?: boolean;
100
+ canStopPracticeSession?: boolean;
96
101
  }
97
102
 
98
103
  /**
@@ -117,6 +122,8 @@ export default class InMeetingActions implements IInMeetingActions {
117
122
 
118
123
  canResumeRecording = null;
119
124
 
125
+ isPremiseRecordingEnabled = null;
126
+
120
127
  canStopRecording = null;
121
128
 
122
129
  canSetMuteOnEntry = null;
@@ -266,6 +273,15 @@ export default class InMeetingActions implements IInMeetingActions {
266
273
  canEnableStageView = null;
267
274
 
268
275
  canDisableStageView = null;
276
+
277
+ isPracticeSessionOn = null;
278
+
279
+ isPracticeSessionOff = null;
280
+
281
+ canStartPracticeSession = null;
282
+
283
+ canStopPracticeSession = null;
284
+
269
285
  /**
270
286
  * Returns all meeting action options
271
287
  * @returns {Object}
@@ -288,6 +304,7 @@ export default class InMeetingActions implements IInMeetingActions {
288
304
  canPauseRecording: this.canPauseRecording,
289
305
  canResumeRecording: this.canResumeRecording,
290
306
  canStopRecording: this.canStopRecording,
307
+ isPremiseRecordingEnabled: this.isPremiseRecordingEnabled,
291
308
  canRaiseHand: this.canRaiseHand,
292
309
  canLowerAllHands: this.canLowerAllHands,
293
310
  canLowerSomeoneElsesHand: this.canLowerSomeoneElsesHand,
@@ -354,6 +371,10 @@ export default class InMeetingActions implements IInMeetingActions {
354
371
  canShowStageView: this.canShowStageView,
355
372
  canEnableStageView: this.canEnableStageView,
356
373
  canDisableStageView: this.canDisableStageView,
374
+ isPracticeSessionOn: this.isPracticeSessionOn,
375
+ isPracticeSessionOff: this.isPracticeSessionOff,
376
+ canStartPracticeSession: this.canStartPracticeSession,
377
+ canStopPracticeSession: this.canStopPracticeSession,
357
378
  });
358
379
 
359
380
  /**
@@ -5,6 +5,7 @@ import jwtDecode from 'jwt-decode';
5
5
  import {StatelessWebexPlugin} from '@webex/webex-core';
6
6
  // @ts-ignore - Types not available for @webex/common
7
7
  import {Defer} from '@webex/common';
8
+ import {safeSetTimeout, safeSetInterval} from '@webex/common-timers';
8
9
  import {
9
10
  ClientEvent,
10
11
  ClientEventLeaveReason,
@@ -702,6 +703,8 @@ export default class Meeting extends StatelessWebexPlugin {
702
703
  private iceCandidateErrors: Map<string, number>;
703
704
  private iceCandidatesCount: number;
704
705
  private rtcMetrics?: RtcMetrics;
706
+ private uploadLogsTimer?: ReturnType<typeof setTimeout>;
707
+ private logUploadIntervalIndex: number;
705
708
 
706
709
  /**
707
710
  * @param {Object} attrs
@@ -770,6 +773,8 @@ export default class Meeting extends StatelessWebexPlugin {
770
773
  );
771
774
  this.callStateForMetrics.correlationId = this.id;
772
775
  }
776
+ this.logUploadIntervalIndex = 0;
777
+
773
778
  /**
774
779
  * @instance
775
780
  * @type {String}
@@ -2655,6 +2660,7 @@ export default class Meeting extends StatelessWebexPlugin {
2655
2660
  });
2656
2661
 
2657
2662
  this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_PRACTICE_SESSION_STATUS_UPDATED, ({state}) => {
2663
+ this.webinar.updatePracticeSessionStatus(state);
2658
2664
  Trigger.trigger(
2659
2665
  this,
2660
2666
  {file: 'meeting/index', function: 'setupLocusControlsListener'},
@@ -3249,6 +3255,9 @@ export default class Meeting extends StatelessWebexPlugin {
3249
3255
  options: {meetingId: this.id},
3250
3256
  });
3251
3257
  }
3258
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_ENTERED_LOBBY, {
3259
+ correlation_id: this.correlationId,
3260
+ });
3252
3261
  this.updateLLMConnection();
3253
3262
  });
3254
3263
  this.locusInfo.on(LOCUSINFO.EVENTS.SELF_ADMITTED_GUEST, async (payload) => {
@@ -3272,6 +3281,9 @@ export default class Meeting extends StatelessWebexPlugin {
3272
3281
  name: 'client.lobby.exited',
3273
3282
  options: {meetingId: this.id},
3274
3283
  });
3284
+ Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.GUEST_EXITED_LOBBY, {
3285
+ correlation_id: this.correlationId,
3286
+ });
3275
3287
  }
3276
3288
  this.rtcMetrics?.sendNextMetrics();
3277
3289
  this.updateLLMConnection();
@@ -3505,6 +3517,7 @@ export default class Meeting extends StatelessWebexPlugin {
3505
3517
  emailAddress: string;
3506
3518
  email: string;
3507
3519
  phoneNumber: string;
3520
+ roles: Array<string>;
3508
3521
  },
3509
3522
  alertIfActive = true
3510
3523
  ) {
@@ -3761,6 +3774,10 @@ export default class Meeting extends StatelessWebexPlugin {
3761
3774
  this.userDisplayHints,
3762
3775
  this.selfUserPolicies
3763
3776
  ),
3777
+ isPremiseRecordingEnabled: RecordingUtil.isPremiseRecordingEnabled(
3778
+ this.userDisplayHints,
3779
+ this.selfUserPolicies
3780
+ ),
3764
3781
  canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
3765
3782
  canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
3766
3783
  canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
@@ -3904,6 +3921,22 @@ export default class Meeting extends StatelessWebexPlugin {
3904
3921
  requiredHints: [DISPLAY_HINTS.DISABLE_STAGE_VIEW],
3905
3922
  displayHints: this.userDisplayHints,
3906
3923
  }),
3924
+ isPracticeSessionOn: ControlsOptionsUtil.hasHints({
3925
+ requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_ON],
3926
+ displayHints: this.userDisplayHints,
3927
+ }),
3928
+ isPracticeSessionOff: ControlsOptionsUtil.hasHints({
3929
+ requiredHints: [DISPLAY_HINTS.PRACTICE_SESSION_OFF],
3930
+ displayHints: this.userDisplayHints,
3931
+ }),
3932
+ canStartPracticeSession: ControlsOptionsUtil.hasHints({
3933
+ requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_START],
3934
+ displayHints: this.userDisplayHints,
3935
+ }),
3936
+ canStopPracticeSession: ControlsOptionsUtil.hasHints({
3937
+ requiredHints: [DISPLAY_HINTS.SHOW_PRACTICE_SESSION_STOP],
3938
+ displayHints: this.userDisplayHints,
3939
+ }),
3907
3940
  canShareFile:
3908
3941
  (ControlsOptionsUtil.hasHints({
3909
3942
  requiredHints: [DISPLAY_HINTS.SHARE_FILE],
@@ -4060,6 +4093,65 @@ export default class Meeting extends StatelessWebexPlugin {
4060
4093
  Trigger.trigger(this, options, EVENTS.REQUEST_UPLOAD_LOGS, this);
4061
4094
  }
4062
4095
 
4096
+ /**
4097
+ * sets the timer for periodic log upload
4098
+ * @returns {void}
4099
+ */
4100
+ private setLogUploadTimer() {
4101
+ // start with short timeouts and increase them later on so in case users have very long multi-hour meetings we don't get too fragmented logs
4102
+ const LOG_UPLOAD_INTERVALS = [0.1, 1, 15, 15, 30, 30, 30, 60];
4103
+
4104
+ const delay =
4105
+ 1000 *
4106
+ // @ts-ignore - config coming from registerPlugin
4107
+ this.config.logUploadIntervalMultiplicationFactor *
4108
+ LOG_UPLOAD_INTERVALS[this.logUploadIntervalIndex];
4109
+
4110
+ if (this.logUploadIntervalIndex < LOG_UPLOAD_INTERVALS.length - 1) {
4111
+ this.logUploadIntervalIndex += 1;
4112
+ }
4113
+
4114
+ this.uploadLogsTimer = safeSetTimeout(() => {
4115
+ this.uploadLogsTimer = undefined;
4116
+
4117
+ this.uploadLogs();
4118
+
4119
+ // just as an extra precaution, to avoid uploading logs forever in case something goes wrong
4120
+ // and the page remains opened, we stop it if there is no media connection
4121
+ if (!this.mediaProperties.webrtcMediaConnection) {
4122
+ return;
4123
+ }
4124
+
4125
+ this.setLogUploadTimer();
4126
+ }, delay);
4127
+ }
4128
+
4129
+ /**
4130
+ * Starts a periodic upload of logs
4131
+ *
4132
+ * @returns {undefined}
4133
+ */
4134
+ public startPeriodicLogUpload() {
4135
+ // @ts-ignore - config coming from registerPlugin
4136
+ if (this.config.logUploadIntervalMultiplicationFactor && !this.uploadLogsTimer) {
4137
+ this.logUploadIntervalIndex = 0;
4138
+
4139
+ this.setLogUploadTimer();
4140
+ }
4141
+ }
4142
+
4143
+ /**
4144
+ * Stops the periodic upload of logs
4145
+ *
4146
+ * @returns {undefined}
4147
+ */
4148
+ public stopPeriodicLogUpload() {
4149
+ if (this.uploadLogsTimer) {
4150
+ clearTimeout(this.uploadLogsTimer);
4151
+ this.uploadLogsTimer = undefined;
4152
+ }
4153
+ }
4154
+
4063
4155
  /**
4064
4156
  * Removes remote audio, video and share streams from class instance's mediaProperties
4065
4157
  * @returns {undefined}
@@ -7245,6 +7337,7 @@ export default class Meeting extends StatelessWebexPlugin {
7245
7337
 
7246
7338
  // We can log ReceiveSlot SSRCs only after the SDP exchange, so doing it here:
7247
7339
  this.remoteMediaManager?.logAllReceiveSlots();
7340
+ this.startPeriodicLogUpload();
7248
7341
  } catch (error) {
7249
7342
  LoggerProxy.logger.error(`${LOG_HEADER} failed to establish media connection: `, error);
7250
7343