@webex/plugin-meetings 3.9.0-next.24 → 3.9.0-next.25

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 (45) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +4 -0
  4. package/dist/constants.js.map +1 -1
  5. package/dist/interpretation/index.js +1 -1
  6. package/dist/interpretation/siLanguage.js +1 -1
  7. package/dist/locus-info/controlsUtils.js +11 -2
  8. package/dist/locus-info/controlsUtils.js.map +1 -1
  9. package/dist/locus-info/index.js +9 -0
  10. package/dist/locus-info/index.js.map +1 -1
  11. package/dist/meeting/in-meeting-actions.js +2 -0
  12. package/dist/meeting/in-meeting-actions.js.map +1 -1
  13. package/dist/meeting/index.js +64 -24
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +48 -14
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/util.js +3 -0
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/member/index.js +9 -0
  20. package/dist/member/index.js.map +1 -1
  21. package/dist/member/util.js +10 -0
  22. package/dist/member/util.js.map +1 -1
  23. package/dist/types/constants.d.ts +3 -0
  24. package/dist/types/meeting/in-meeting-actions.d.ts +2 -0
  25. package/dist/types/meeting/index.d.ts +14 -0
  26. package/dist/types/meeting/request.d.ts +16 -0
  27. package/dist/types/meeting/util.d.ts +1 -0
  28. package/dist/types/member/index.d.ts +1 -0
  29. package/dist/types/member/util.d.ts +5 -0
  30. package/dist/webinar/index.js +1 -1
  31. package/package.json +1 -1
  32. package/src/constants.ts +6 -0
  33. package/src/locus-info/controlsUtils.ts +18 -0
  34. package/src/locus-info/index.ts +9 -0
  35. package/src/meeting/in-meeting-actions.ts +4 -0
  36. package/src/meeting/index.ts +43 -0
  37. package/src/meeting/request.ts +38 -0
  38. package/src/meeting/util.ts +3 -0
  39. package/src/member/index.ts +10 -0
  40. package/src/member/util.ts +14 -0
  41. package/test/unit/spec/fixture/locus.js +1 -0
  42. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  43. package/test/unit/spec/meeting/index.js +22 -0
  44. package/test/unit/spec/meeting/utils.js +1 -0
  45. package/test/unit/spec/member/util.js +24 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_types","require","_constants","_parameter","_interopRequireDefault","MemberUtil","canReclaimHost","participant","ParameterError","canReclaimHostRole","getControlsRoles","_participant$controls","_participant$controls2","controls","role","roles","isBrb","_participant$controls3","_participant$controls4","brb","enabled","hasRole","controlRole","_MemberUtil$getContro","some","type","hasCohost","ServerRoles","Cohost","hasModerator","Moderator","hasPresenter","Presenter","extractControlRoles","cohost","moderator","presenter","isUser","_USER_","isModerator","isGuest","guest","isDevice","_RESOURCE_ROOM_","isModeratorAssignmentProhibited","moderatorAssignmentNotAllowed","isPresenterAssignmentProhibited","presenterAssignmentNotAllowed","isSame","id","person","isNotAdmitted","status","devices","intent","_WAIT_","_IN_LOBBY_","_IN_MEETING_","isAudioMuted","isMuted","AUDIO_STATUS","AUDIO","isVideoMuted","VIDEO_STATUS","VIDEO","isHandRaised","_participant$controls5","_participant$controls6","hand","raised","isBreakoutsSupported","doesNotSupportBreakouts","isInterpretationSupported","doesNotSupportSiInterpreter","isLiveAnnotationSupported","annotatorAssignmentNotAllowed","statusAccessor","controlsAccessor","_participant$controls7","_participant$controls8","_participant$status","remoteMute","muted","localStatus","_RECEIVE_ONLY_","_SEND_RECEIVE_","getRecordingMember","record","recording","meta","modifiedBy","isRecording","localRecord","isRemovable","isSelf","isInMeeting","_CALL_","isMutable","extractStatus","length","_NOT_IN_MEETING_","state","_JOINED_","_IDLE_","foundDevice","find","device","_OBSERVE_","_LEFT_","extractId","extractMediaStatus","_participant$status2","_participant$status3","audio","audioStatus","video","videoStatus","extractName","name","extractPairedWithParticipantUrl","_participant$devices","participantUrl","forEach","_device$intents","intents","associatedWith","_default","exports","default"],"sources":["util.ts"],"sourcesContent":["import {\n IExternalRoles,\n ServerRoles,\n ServerRoleShape,\n IMediaStatus,\n Participant,\n ParticipantUrl,\n} from './types';\nimport {\n _USER_,\n _RESOURCE_ROOM_,\n _OBSERVE_,\n _WAIT_,\n _LEFT_,\n _JOINED_,\n _IDLE_,\n _IN_LOBBY_,\n _NOT_IN_MEETING_,\n _IN_MEETING_,\n AUDIO_STATUS,\n VIDEO_STATUS,\n _SEND_RECEIVE_,\n _RECEIVE_ONLY_,\n _CALL_,\n VIDEO,\n AUDIO,\n} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nconst MemberUtil = {\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n canReclaimHost: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'canReclaimHostRole could not be processed, participant is undefined.'\n );\n }\n\n return participant.canReclaimHostRole || false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {[ServerRoleShape]}\n */\n getControlsRoles: (participant: Participant): Array<ServerRoleShape> =>\n participant?.controls?.role?.roles,\n\n /**\n * Checks if the participant has the brb status enabled.\n *\n * @param {Participant} participant - The locus participant object.\n * @returns {boolean} - True if the participant has brb enabled, false otherwise.\n */\n isBrb: (participant: Participant): boolean => participant.controls?.brb?.enabled || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @param {ServerRoles} controlRole the search role\n * @returns {Boolean}\n */\n hasRole: (participant: Participant, controlRole: ServerRoles): boolean =>\n MemberUtil.getControlsRoles(participant)?.some(\n (role) => role.type === controlRole && role.hasRole\n ),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasCohost: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Cohost) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasModerator: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Moderator) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasPresenter: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Presenter) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {IExternalRoles}\n */\n extractControlRoles: (participant: Participant): IExternalRoles => {\n const roles = {\n cohost: MemberUtil.hasCohost(participant),\n moderator: MemberUtil.hasModerator(participant),\n presenter: MemberUtil.hasPresenter(participant),\n };\n\n return roles;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isUser: (participant: Participant) => participant && participant.type === _USER_,\n\n isModerator: (participant: Participant) => participant && participant.moderator,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isGuest: (participant: Participant) => participant && participant.guest,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isDevice: (participant: Participant) => participant && participant.type === _RESOURCE_ROOM_,\n\n isModeratorAssignmentProhibited: (participant: Participant) =>\n participant && participant.moderatorAssignmentNotAllowed,\n\n isPresenterAssignmentProhibited: (participant: Participant) =>\n participant && participant.presenterAssignmentNotAllowed,\n\n /**\n * checks to see if the participant id is the same as the passed id\n * there are multiple ids that can be used\n * @param {Object} participant - The locus participant object.\n * @param {String} id\n * @returns {Boolean}\n */\n isSame: (participant: Participant, id: string) =>\n participant && (participant.id === id || (participant.person && participant.person.id === id)),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @param {Boolean} isGuest\n * @param {String} status\n * @returns {Boolean}\n */\n isNotAdmitted: (participant: Participant, isGuest: boolean, status: string): boolean =>\n participant &&\n participant.guest &&\n ((participant.devices &&\n participant.devices[0] &&\n participant.devices[0].intent &&\n participant.devices[0].intent.type === _WAIT_ &&\n // @ts-ignore\n isGuest &&\n status === _IN_LOBBY_) ||\n // @ts-ignore\n !status === _IN_MEETING_),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isAudioMuted: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Audio could not be processed, participant is undefined.');\n }\n\n return MemberUtil.isMuted(participant, AUDIO_STATUS, AUDIO);\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isVideoMuted: (participant: Participant): boolean => {\n if (!participant) {\n throw new ParameterError('Video could not be processed, participant is undefined.');\n }\n\n return MemberUtil.isMuted(participant, VIDEO_STATUS, VIDEO);\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isHandRaised: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Raise hand could not be processed, participant is undefined.');\n }\n\n return participant.controls?.hand?.raised || false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isBreakoutsSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'Breakout support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.doesNotSupportBreakouts;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isInterpretationSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'Interpretation support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.doesNotSupportSiInterpreter;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isLiveAnnotationSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'LiveAnnotation support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.annotatorAssignmentNotAllowed;\n },\n\n /**\n * utility method for audio/video muted status\n * @param {any} participant\n * @param {String} statusAccessor\n * @param {String} controlsAccessor\n * @returns {Boolean | undefined}\n */\n isMuted: (participant: Participant, statusAccessor: string, controlsAccessor: string) => {\n // check remote mute\n const remoteMute = participant?.controls?.[controlsAccessor]?.muted;\n if (remoteMute === true) {\n return true;\n }\n\n // check local mute\n const localStatus = participant?.status?.[statusAccessor];\n if (localStatus === _RECEIVE_ONLY_) {\n return true;\n }\n if (localStatus === _SEND_RECEIVE_) {\n return false;\n }\n\n return remoteMute;\n },\n\n /**\n * utility method for getting the recording member for later comparison\n * @param {Object} controls\n * @returns {String|null}\n */\n getRecordingMember: (controls: any) => {\n if (!controls) {\n return null;\n }\n if (controls.record && controls.record.recording && controls.record.meta) {\n return controls.record.meta.modifiedBy;\n }\n\n return null;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isRecording: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Recording could not be processed, participant is undefined.');\n }\n if (participant.controls && participant.controls.localRecord) {\n return participant.controls.localRecord.recording;\n }\n\n return false;\n },\n\n isRemovable: (isSelf, isGuest, isInMeeting, type) => {\n if (isGuest || isSelf) {\n return false;\n }\n if (type === _CALL_) {\n return false;\n }\n if (isInMeeting) {\n return true;\n }\n\n return false;\n },\n\n isMutable: (isSelf, isDevice, isInMeeting, isMuted, type) => {\n if (!isInMeeting) {\n return false;\n }\n if (isMuted) {\n return false;\n }\n if (type === _CALL_) {\n return false;\n }\n if (isSelf || isDevice) {\n return true;\n }\n\n return false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractStatus: (participant: Participant) => {\n if (!(participant && participant.devices && participant.devices.length)) {\n return _NOT_IN_MEETING_;\n }\n if (participant.state === _JOINED_) {\n return _IN_MEETING_;\n }\n if (participant.state === _IDLE_) {\n if (participant.devices && participant.devices.length > 0) {\n const foundDevice = participant.devices.find(\n (device) =>\n device.intent && (device.intent.type === _WAIT_ || device.intent.type === _OBSERVE_)\n );\n\n return foundDevice ? _IN_LOBBY_ : _NOT_IN_MEETING_;\n }\n\n return _NOT_IN_MEETING_;\n }\n if (participant.state === _LEFT_) {\n return _NOT_IN_MEETING_;\n }\n\n return _NOT_IN_MEETING_;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractId: (participant: Participant) => {\n if (participant) {\n return participant.id;\n }\n\n return null;\n },\n\n /**\n * extracts the media status from nested participant object\n * @param {Object} participant - The locus participant object.\n * @returns {Object}\n */\n extractMediaStatus: (participant: Participant): IMediaStatus => {\n if (!participant) {\n throw new ParameterError('Media status could not be extracted, participant is undefined.');\n }\n\n return {\n audio: participant.status?.audioStatus,\n video: participant.status?.videoStatus,\n };\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractName: (participant: Participant) => {\n if (participant && participant.person) {\n return participant.person.name;\n }\n\n return null;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractPairedWithParticipantUrl: (participant: Participant): ParticipantUrl | undefined => {\n let participantUrl;\n\n participant?.devices?.forEach((device) => {\n device?.intents?.forEach((intent) => {\n if (intent?.type === _OBSERVE_ && intent?.associatedWith) {\n participantUrl = intent.associatedWith;\n }\n });\n });\n\n return participantUrl;\n },\n};\nexport default MemberUtil;\n"],"mappings":"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"}
1
+ {"version":3,"names":["_types","require","_constants","_parameter","_interopRequireDefault","MemberUtil","canReclaimHost","participant","ParameterError","canReclaimHostRole","getControlsRoles","_participant$controls","_participant$controls2","controls","role","roles","isBrb","_participant$controls3","_participant$controls4","brb","enabled","hasRole","controlRole","_MemberUtil$getContro","some","type","hasCohost","ServerRoles","Cohost","hasModerator","Moderator","hasPresenter","Presenter","extractControlRoles","cohost","moderator","presenter","isUser","_USER_","isModerator","isGuest","guest","isDevice","_RESOURCE_ROOM_","isModeratorAssignmentProhibited","moderatorAssignmentNotAllowed","isPresenterAssignmentProhibited","presenterAssignmentNotAllowed","isSame","id","person","isNotAdmitted","status","devices","intent","_WAIT_","_IN_LOBBY_","_IN_MEETING_","isAudioMuted","isMuted","AUDIO_STATUS","AUDIO","isVideoMuted","VIDEO_STATUS","VIDEO","isHandRaised","_participant$controls5","_participant$controls6","hand","raised","isBreakoutsSupported","doesNotSupportBreakouts","isSupportsSingleUserAutoEndMeeting","doesNotSupportSingleUserAutoEndMeeting","isInterpretationSupported","doesNotSupportSiInterpreter","isLiveAnnotationSupported","annotatorAssignmentNotAllowed","statusAccessor","controlsAccessor","_participant$controls7","_participant$controls8","_participant$status","remoteMute","muted","localStatus","_RECEIVE_ONLY_","_SEND_RECEIVE_","getRecordingMember","record","recording","meta","modifiedBy","isRecording","localRecord","isRemovable","isSelf","isInMeeting","_CALL_","isMutable","extractStatus","length","_NOT_IN_MEETING_","state","_JOINED_","_IDLE_","foundDevice","find","device","_OBSERVE_","_LEFT_","extractId","extractMediaStatus","_participant$status2","_participant$status3","audio","audioStatus","video","videoStatus","extractName","name","extractPairedWithParticipantUrl","_participant$devices","participantUrl","forEach","_device$intents","intents","associatedWith","_default","exports","default"],"sources":["util.ts"],"sourcesContent":["import {\n IExternalRoles,\n ServerRoles,\n ServerRoleShape,\n IMediaStatus,\n Participant,\n ParticipantUrl,\n} from './types';\nimport {\n _USER_,\n _RESOURCE_ROOM_,\n _OBSERVE_,\n _WAIT_,\n _LEFT_,\n _JOINED_,\n _IDLE_,\n _IN_LOBBY_,\n _NOT_IN_MEETING_,\n _IN_MEETING_,\n AUDIO_STATUS,\n VIDEO_STATUS,\n _SEND_RECEIVE_,\n _RECEIVE_ONLY_,\n _CALL_,\n VIDEO,\n AUDIO,\n} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nconst MemberUtil = {\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n canReclaimHost: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'canReclaimHostRole could not be processed, participant is undefined.'\n );\n }\n\n return participant.canReclaimHostRole || false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {[ServerRoleShape]}\n */\n getControlsRoles: (participant: Participant): Array<ServerRoleShape> =>\n participant?.controls?.role?.roles,\n\n /**\n * Checks if the participant has the brb status enabled.\n *\n * @param {Participant} participant - The locus participant object.\n * @returns {boolean} - True if the participant has brb enabled, false otherwise.\n */\n isBrb: (participant: Participant): boolean => participant.controls?.brb?.enabled || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @param {ServerRoles} controlRole the search role\n * @returns {Boolean}\n */\n hasRole: (participant: Participant, controlRole: ServerRoles): boolean =>\n MemberUtil.getControlsRoles(participant)?.some(\n (role) => role.type === controlRole && role.hasRole\n ),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasCohost: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Cohost) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasModerator: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Moderator) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n hasPresenter: (participant: Participant): boolean =>\n MemberUtil.hasRole(participant, ServerRoles.Presenter) || false,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {IExternalRoles}\n */\n extractControlRoles: (participant: Participant): IExternalRoles => {\n const roles = {\n cohost: MemberUtil.hasCohost(participant),\n moderator: MemberUtil.hasModerator(participant),\n presenter: MemberUtil.hasPresenter(participant),\n };\n\n return roles;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isUser: (participant: Participant) => participant && participant.type === _USER_,\n\n isModerator: (participant: Participant) => participant && participant.moderator,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isGuest: (participant: Participant) => participant && participant.guest,\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isDevice: (participant: Participant) => participant && participant.type === _RESOURCE_ROOM_,\n\n isModeratorAssignmentProhibited: (participant: Participant) =>\n participant && participant.moderatorAssignmentNotAllowed,\n\n isPresenterAssignmentProhibited: (participant: Participant) =>\n participant && participant.presenterAssignmentNotAllowed,\n\n /**\n * checks to see if the participant id is the same as the passed id\n * there are multiple ids that can be used\n * @param {Object} participant - The locus participant object.\n * @param {String} id\n * @returns {Boolean}\n */\n isSame: (participant: Participant, id: string) =>\n participant && (participant.id === id || (participant.person && participant.person.id === id)),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @param {Boolean} isGuest\n * @param {String} status\n * @returns {Boolean}\n */\n isNotAdmitted: (participant: Participant, isGuest: boolean, status: string): boolean =>\n participant &&\n participant.guest &&\n ((participant.devices &&\n participant.devices[0] &&\n participant.devices[0].intent &&\n participant.devices[0].intent.type === _WAIT_ &&\n // @ts-ignore\n isGuest &&\n status === _IN_LOBBY_) ||\n // @ts-ignore\n !status === _IN_MEETING_),\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isAudioMuted: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Audio could not be processed, participant is undefined.');\n }\n\n return MemberUtil.isMuted(participant, AUDIO_STATUS, AUDIO);\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isVideoMuted: (participant: Participant): boolean => {\n if (!participant) {\n throw new ParameterError('Video could not be processed, participant is undefined.');\n }\n\n return MemberUtil.isMuted(participant, VIDEO_STATUS, VIDEO);\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isHandRaised: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Raise hand could not be processed, participant is undefined.');\n }\n\n return participant.controls?.hand?.raised || false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isBreakoutsSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'Breakout support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.doesNotSupportBreakouts;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isSupportsSingleUserAutoEndMeeting: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'Single user auto end meeting support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.doesNotSupportSingleUserAutoEndMeeting;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isInterpretationSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'Interpretation support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.doesNotSupportSiInterpreter;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isLiveAnnotationSupported: (participant) => {\n if (!participant) {\n throw new ParameterError(\n 'LiveAnnotation support could not be processed, participant is undefined.'\n );\n }\n\n return !participant.annotatorAssignmentNotAllowed;\n },\n\n /**\n * utility method for audio/video muted status\n * @param {any} participant\n * @param {String} statusAccessor\n * @param {String} controlsAccessor\n * @returns {Boolean | undefined}\n */\n isMuted: (participant: Participant, statusAccessor: string, controlsAccessor: string) => {\n // check remote mute\n const remoteMute = participant?.controls?.[controlsAccessor]?.muted;\n if (remoteMute === true) {\n return true;\n }\n\n // check local mute\n const localStatus = participant?.status?.[statusAccessor];\n if (localStatus === _RECEIVE_ONLY_) {\n return true;\n }\n if (localStatus === _SEND_RECEIVE_) {\n return false;\n }\n\n return remoteMute;\n },\n\n /**\n * utility method for getting the recording member for later comparison\n * @param {Object} controls\n * @returns {String|null}\n */\n getRecordingMember: (controls: any) => {\n if (!controls) {\n return null;\n }\n if (controls.record && controls.record.recording && controls.record.meta) {\n return controls.record.meta.modifiedBy;\n }\n\n return null;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {Boolean}\n */\n isRecording: (participant: Participant) => {\n if (!participant) {\n throw new ParameterError('Recording could not be processed, participant is undefined.');\n }\n if (participant.controls && participant.controls.localRecord) {\n return participant.controls.localRecord.recording;\n }\n\n return false;\n },\n\n isRemovable: (isSelf, isGuest, isInMeeting, type) => {\n if (isGuest || isSelf) {\n return false;\n }\n if (type === _CALL_) {\n return false;\n }\n if (isInMeeting) {\n return true;\n }\n\n return false;\n },\n\n isMutable: (isSelf, isDevice, isInMeeting, isMuted, type) => {\n if (!isInMeeting) {\n return false;\n }\n if (isMuted) {\n return false;\n }\n if (type === _CALL_) {\n return false;\n }\n if (isSelf || isDevice) {\n return true;\n }\n\n return false;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractStatus: (participant: Participant) => {\n if (!(participant && participant.devices && participant.devices.length)) {\n return _NOT_IN_MEETING_;\n }\n if (participant.state === _JOINED_) {\n return _IN_MEETING_;\n }\n if (participant.state === _IDLE_) {\n if (participant.devices && participant.devices.length > 0) {\n const foundDevice = participant.devices.find(\n (device) =>\n device.intent && (device.intent.type === _WAIT_ || device.intent.type === _OBSERVE_)\n );\n\n return foundDevice ? _IN_LOBBY_ : _NOT_IN_MEETING_;\n }\n\n return _NOT_IN_MEETING_;\n }\n if (participant.state === _LEFT_) {\n return _NOT_IN_MEETING_;\n }\n\n return _NOT_IN_MEETING_;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractId: (participant: Participant) => {\n if (participant) {\n return participant.id;\n }\n\n return null;\n },\n\n /**\n * extracts the media status from nested participant object\n * @param {Object} participant - The locus participant object.\n * @returns {Object}\n */\n extractMediaStatus: (participant: Participant): IMediaStatus => {\n if (!participant) {\n throw new ParameterError('Media status could not be extracted, participant is undefined.');\n }\n\n return {\n audio: participant.status?.audioStatus,\n video: participant.status?.videoStatus,\n };\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractName: (participant: Participant) => {\n if (participant && participant.person) {\n return participant.person.name;\n }\n\n return null;\n },\n\n /**\n * @param {Object} participant - The locus participant object.\n * @returns {String}\n */\n extractPairedWithParticipantUrl: (participant: Participant): ParticipantUrl | undefined => {\n let participantUrl;\n\n participant?.devices?.forEach((device) => {\n device?.intents?.forEach((intent) => {\n if (intent?.type === _OBSERVE_ && intent?.associatedWith) {\n participantUrl = intent.associatedWith;\n }\n });\n });\n\n return participantUrl;\n },\n};\nexport default MemberUtil;\n"],"mappings":"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"}
@@ -280,6 +280,7 @@ export declare const EVENT_TRIGGERS: {
280
280
  MEETING_CONTROLS_ANNOTATION_UPDATED: string;
281
281
  MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED: string;
282
282
  MEETING_CONTROLS_POLLING_QA_UPDATED: string;
283
+ MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED: string;
283
284
  MEETING_LOCUS_URL_UPDATE: string;
284
285
  MEETING_STREAM_PUBLISH_STATE_CHANGED: string;
285
286
  MEETING_TRANSCRIPTION_CONNECTED: string;
@@ -593,6 +594,7 @@ export declare const LOCUSINFO: {
593
594
  SELF_ADMITTED_GUEST: string;
594
595
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
595
596
  SELF_REMOTE_MUTE_STATUS_UPDATED: string;
597
+ CONTROLS_AUTO_END_MEETING_WARNING_CHANGED: string;
596
598
  LOCAL_UNMUTE_REQUESTED: string;
597
599
  LOCAL_UNMUTE_REQUIRED: string;
598
600
  SELF_MODERATOR_CHANGED: string;
@@ -860,6 +862,7 @@ export declare const DISPLAY_HINTS: {
860
862
  SHOW_POST_MEETING_DATA_CONSENT_PROMPT: string;
861
863
  ENABLE_ANNOTATION_MEETING_OPTION: string;
862
864
  DISABLE_ANNOTATION_MEETING_OPTION: string;
865
+ SHOW_AUTO_END_MEETING_WARNING: string;
863
866
  ENABLE_RDC_MEETING_OPTION: string;
864
867
  DISABLE_RDC_MEETING_OPTION: string;
865
868
  ENABLE_ATTENDEE_START_POLLING_QA: string;
@@ -87,6 +87,7 @@ interface IInMeetingActions {
87
87
  canDoVideo?: boolean;
88
88
  canAnnotate?: boolean;
89
89
  canUseVoip?: boolean;
90
+ showAutoEndMeetingWarning?: boolean;
90
91
  supportHQV?: boolean;
91
92
  supportHDV?: boolean;
92
93
  canShareWhiteBoard?: boolean;
@@ -196,6 +197,7 @@ export default class InMeetingActions implements IInMeetingActions {
196
197
  canDoVideo: any;
197
198
  canAnnotate: any;
198
199
  canUseVoip: any;
200
+ showAutoEndMeetingWarning: any;
199
201
  supportHQV: any;
200
202
  enforceVirtualBackground: any;
201
203
  supportHDV: any;
@@ -1908,6 +1908,20 @@ export default class Meeting extends StatelessWebexPlugin {
1908
1908
  * @memberof Meeting
1909
1909
  */
1910
1910
  sendReaction(reactionType: ReactionServerType, skinToneType?: SkinToneType): any;
1911
+ /**
1912
+ * Extend the current meeting duration.
1913
+ *
1914
+ * @param {number} extensionMinutes - how many minutes to extend
1915
+ * @returns {Promise}
1916
+ * @public
1917
+ * @memberof Meeting
1918
+ */
1919
+ extendMeeting({ meetingPolicyUrl, meetingInstanceId, participantId, extensionMinutes, }: {
1920
+ meetingPolicyUrl: any;
1921
+ meetingInstanceId: any;
1922
+ participantId: any;
1923
+ extensionMinutes?: number;
1924
+ }): any;
1911
1925
  /**
1912
1926
  * Method to enable or disable reactions inside the meeting.
1913
1927
  *
@@ -284,6 +284,22 @@ export default class MeetingRequest extends StatelessWebexPlugin {
284
284
  * @returns {Promise}
285
285
  */
286
286
  sendReaction({ reactionChannelUrl, reaction, participantId }: SendReactionOptions): any;
287
+ /**
288
+ * Extend the current meeting duration.
289
+ *
290
+ * @param {Object} params - Parameters for extending the meeting.
291
+ * @param {string} params.meetingInstanceId - The unique ID of the meeting instance.
292
+ * @param {string} params.participantId - The ID of the participant requesting the extension.
293
+ * @param {number} params.extensionMinutes - The number of minutes to extend the meeting by.
294
+ * @param {string} params.meetingPolicyUrl - The base URL for meeting policy service (dynamic, from locus links)
295
+ * @returns {Promise<any>} A promise that resolves with the server response.
296
+ */
297
+ extendMeeting({ meetingInstanceId, participantId, extensionMinutes, meetingPolicyUrl, }: {
298
+ meetingInstanceId: string;
299
+ participantId: string;
300
+ extensionMinutes: number;
301
+ meetingPolicyUrl: string;
302
+ }): any;
287
303
  /**
288
304
  * Make a network request to enable or disable reactions.
289
305
  * @param {boolean} options.enable - determines if we need to enable or disable.
@@ -88,6 +88,7 @@ declare const MeetingUtil: {
88
88
  isRealTimeTranslationEnabled: (displayHints: any) => any;
89
89
  canSelectSpokenLanguages: (displayHints: any) => any;
90
90
  waitingForOthersToJoin: (displayHints: any) => any;
91
+ showAutoEndMeetingWarning: (displayHints: any) => any;
91
92
  canSendReactions: (originalValue: any, displayHints: any) => any;
92
93
  canUserRenameSelfAndObserved: (displayHints: any) => any;
93
94
  requiresPostMeetingDataConsentPrompt: (displayHints: any) => any;
@@ -35,6 +35,7 @@ export default class Member {
35
35
  status: any;
36
36
  supportsBreakouts: boolean;
37
37
  supportsInterpretation: boolean;
38
+ supportsSingleUserAutoEndMeeting: boolean;
38
39
  supportLiveAnnotation: boolean;
39
40
  type: any;
40
41
  namespace: string;
@@ -96,6 +96,11 @@ declare const MemberUtil: {
96
96
  * @returns {Boolean}
97
97
  */
98
98
  isBreakoutsSupported: (participant: any) => boolean;
99
+ /**
100
+ * @param {Object} participant - The locus participant object.
101
+ * @returns {Boolean}
102
+ */
103
+ isSupportsSingleUserAutoEndMeeting: (participant: any) => boolean;
99
104
  /**
100
105
  * @param {Object} participant - The locus participant object.
101
106
  * @returns {Boolean}
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.9.0-next.24"
461
+ version: "3.9.0-next.25"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.9.0-next.24"
95
+ "version": "3.9.0-next.25"
96
96
  }
package/src/constants.ts CHANGED
@@ -374,6 +374,8 @@ export const EVENT_TRIGGERS = {
374
374
  MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED:
375
375
  'meeting:controls:remote-desktop-control:updated',
376
376
  MEETING_CONTROLS_POLLING_QA_UPDATED: 'meeting:controls:polling-qa:updated',
377
+ MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED:
378
+ 'meeting:controls:auto-end-meeting-warning:updated',
377
379
  // Locus URL changed
378
380
  MEETING_LOCUS_URL_UPDATE: 'meeting:locus:locusUrl:update',
379
381
  MEETING_STREAM_PUBLISH_STATE_CHANGED: 'meeting:streamPublishStateChanged',
@@ -727,6 +729,7 @@ export const LOCUSINFO = {
727
729
  SELF_ADMITTED_GUEST: 'SELF_ADMITTED_GUEST',
728
730
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: 'SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED',
729
731
  SELF_REMOTE_MUTE_STATUS_UPDATED: 'SELF_REMOTE_MUTE_STATUS_UPDATED',
732
+ CONTROLS_AUTO_END_MEETING_WARNING_CHANGED: 'CONTROLS_AUTO_END_MEETING_WARNING_CHANGED',
730
733
  LOCAL_UNMUTE_REQUESTED: 'LOCAL_UNMUTE_REQUESTED',
731
734
  LOCAL_UNMUTE_REQUIRED: 'LOCAL_UNMUTE_REQUIRED',
732
735
  SELF_MODERATOR_CHANGED: 'SELF_MODERATOR_CHANGED',
@@ -1052,6 +1055,9 @@ export const DISPLAY_HINTS = {
1052
1055
  ENABLE_ANNOTATION_MEETING_OPTION: 'ENABLE_ANNOTATION_MEETING_OPTION',
1053
1056
  DISABLE_ANNOTATION_MEETING_OPTION: 'DISABLE_ANNOTATION_MEETING_OPTION',
1054
1057
 
1058
+ // Auto End Meeting Warning
1059
+ SHOW_AUTO_END_MEETING_WARNING: 'SHOW_AUTO_END_MEETING_WARNING',
1060
+
1055
1061
  // Remote Desktop Control
1056
1062
  ENABLE_RDC_MEETING_OPTION: 'ENABLE_RDC_MEETING_OPTION',
1057
1063
  DISABLE_RDC_MEETING_OPTION: 'DISABLE_RDC_MEETING_OPTION',
@@ -130,6 +130,15 @@ ControlsUtils.parse = (controls: any) => {
130
130
  };
131
131
  }
132
132
 
133
+ if (controls?.autoEndMeetingWarning) {
134
+ parsedControls.autoEndMeetingWarning = {
135
+ enabled: controls.autoEndMeetingWarning.enabled,
136
+ extensionDurationMinutes: controls.autoEndMeetingWarning.extensionDurationMinutes,
137
+ countdownDurationMinutes: controls.autoEndMeetingWarning.countdownDurationMinutes,
138
+ countdownStartedAt: controls.autoEndMeetingWarning.countdownStartedAt,
139
+ };
140
+ }
141
+
133
142
  return parsedControls;
134
143
  };
135
144
 
@@ -244,6 +253,15 @@ ControlsUtils.getControls = (oldControls: any, newControls: any) => {
244
253
 
245
254
  hasPollingQAControlChanged:
246
255
  current?.pollingQAControl?.enabled !== previous?.pollingQAControl?.enabled,
256
+
257
+ hasAutoEndMeetingChanged:
258
+ current?.autoEndMeetingWarning?.enabled !== previous?.autoEndMeetingWarning?.enabled ||
259
+ current?.autoEndMeetingWarning?.extensionDurationMinutes !==
260
+ previous?.autoEndMeetingWarning?.extensionDurationMinutes ||
261
+ current?.autoEndMeetingWarning?.countdownDurationMinutes !==
262
+ previous?.autoEndMeetingWarning?.countdownDurationMinutes ||
263
+ current?.autoEndMeetingWarning?.countdownStartedAt !==
264
+ previous?.autoEndMeetingWarning?.countdownStartedAt,
247
265
  },
248
266
  };
249
267
  };
@@ -895,6 +895,7 @@ export default class LocusInfo extends EventsScope {
895
895
  hasAnnotationControlChanged,
896
896
  hasRemoteDesktopControlChanged,
897
897
  hasPollingQAControlChanged,
898
+ hasAutoEndMeetingChanged,
898
899
  },
899
900
  current,
900
901
  } = ControlsUtils.getControls(this.controls, controls);
@@ -1169,6 +1170,14 @@ export default class LocusInfo extends EventsScope {
1169
1170
  );
1170
1171
  }
1171
1172
 
1173
+ if (hasAutoEndMeetingChanged) {
1174
+ this.emitScoped(
1175
+ {file: 'locus-info', function: 'updateControls'},
1176
+ LOCUSINFO.EVENTS.CONTROLS_AUTO_END_MEETING_WARNING_CHANGED,
1177
+ {state: current.autoEndMeetingWarning}
1178
+ );
1179
+ }
1180
+
1172
1181
  this.controls = controls;
1173
1182
  }
1174
1183
  }
@@ -92,6 +92,7 @@ interface IInMeetingActions {
92
92
  canDoVideo?: boolean;
93
93
  canAnnotate?: boolean;
94
94
  canUseVoip?: boolean;
95
+ showAutoEndMeetingWarning?: boolean;
95
96
  supportHQV?: boolean;
96
97
  supportHDV?: boolean;
97
98
  canShareWhiteBoard?: boolean;
@@ -284,6 +285,8 @@ export default class InMeetingActions implements IInMeetingActions {
284
285
 
285
286
  canUseVoip = null;
286
287
 
288
+ showAutoEndMeetingWarning = null;
289
+
287
290
  supportHQV = null;
288
291
 
289
292
  enforceVirtualBackground = null;
@@ -405,6 +408,7 @@ export default class InMeetingActions implements IInMeetingActions {
405
408
  canShareFile: this.canShareFile,
406
409
  canShareApplication: this.canShareApplication,
407
410
  canShareCamera: this.canShareCamera,
411
+ showAutoEndMeetingWarning: this.showAutoEndMeetingWarning,
408
412
  canShareDesktop: this.canShareDesktop,
409
413
  canShareContent: this.canShareContent,
410
414
  canTransferFile: this.canTransferFile,
@@ -2976,6 +2976,18 @@ export default class Meeting extends StatelessWebexPlugin {
2976
2976
  );
2977
2977
  });
2978
2978
 
2979
+ this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_AUTO_END_MEETING_WARNING_CHANGED, ({state}) => {
2980
+ Trigger.trigger(
2981
+ this,
2982
+ {
2983
+ file: 'meeting/index',
2984
+ function: 'setupLocusControlsListener',
2985
+ },
2986
+ EVENT_TRIGGERS.MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED,
2987
+ {state}
2988
+ );
2989
+ });
2990
+
2979
2991
  this.locusInfo.on(LOCUSINFO.EVENTS.CONTROLS_ANNOTATION_CHANGED, ({state}) => {
2980
2992
  Trigger.trigger(
2981
2993
  this,
@@ -4223,6 +4235,7 @@ export default class Meeting extends StatelessWebexPlugin {
4223
4235
  this.userDisplayHints,
4224
4236
  this.selfUserPolicies
4225
4237
  ),
4238
+ showAutoEndMeetingWarning: MeetingUtil.showAutoEndMeetingWarning(this.userDisplayHints),
4226
4239
  canRaiseHand: MeetingUtil.canUserRaiseHand(this.userDisplayHints),
4227
4240
  canLowerAllHands: MeetingUtil.canUserLowerAllHands(this.userDisplayHints),
4228
4241
  canLowerSomeoneElsesHand: MeetingUtil.canUserLowerSomeoneElsesHand(this.userDisplayHints),
@@ -9453,6 +9466,36 @@ export default class Meeting extends StatelessWebexPlugin {
9453
9466
  return Promise.reject(new Error('Error sending reaction, service url not found.'));
9454
9467
  }
9455
9468
 
9469
+ /**
9470
+ * Extend the current meeting duration.
9471
+ *
9472
+ * @param {number} extensionMinutes - how many minutes to extend
9473
+ * @returns {Promise}
9474
+ * @public
9475
+ * @memberof Meeting
9476
+ */
9477
+ public extendMeeting({
9478
+ meetingPolicyUrl,
9479
+ meetingInstanceId,
9480
+ participantId,
9481
+ extensionMinutes = 30,
9482
+ }) {
9483
+ if (!meetingInstanceId || !participantId) {
9484
+ return Promise.reject(new Error('Missing meetingInstanceId or participantId'));
9485
+ }
9486
+
9487
+ if (!meetingPolicyUrl) {
9488
+ return Promise.reject(new Error('Missing meetingPolicyUrl'));
9489
+ }
9490
+
9491
+ return this.meetingRequest.extendMeeting({
9492
+ meetingInstanceId,
9493
+ participantId,
9494
+ extensionMinutes,
9495
+ meetingPolicyUrl,
9496
+ });
9497
+ }
9498
+
9456
9499
  /**
9457
9500
  * Method to enable or disable reactions inside the meeting.
9458
9501
  *
@@ -886,6 +886,44 @@ export default class MeetingRequest extends StatelessWebexPlugin {
886
886
  });
887
887
  }
888
888
 
889
+ /**
890
+ * Extend the current meeting duration.
891
+ *
892
+ * @param {Object} params - Parameters for extending the meeting.
893
+ * @param {string} params.meetingInstanceId - The unique ID of the meeting instance.
894
+ * @param {string} params.participantId - The ID of the participant requesting the extension.
895
+ * @param {number} params.extensionMinutes - The number of minutes to extend the meeting by.
896
+ * @param {string} params.meetingPolicyUrl - The base URL for meeting policy service (dynamic, from locus links)
897
+ * @returns {Promise<any>} A promise that resolves with the server response.
898
+ */
899
+ extendMeeting({
900
+ meetingInstanceId,
901
+ participantId,
902
+ extensionMinutes,
903
+ meetingPolicyUrl,
904
+ }: {
905
+ meetingInstanceId: string;
906
+ participantId: string;
907
+ extensionMinutes: number;
908
+ meetingPolicyUrl: string;
909
+ }) {
910
+ if (!meetingPolicyUrl) {
911
+ return Promise.reject(new Error('meetingPolicyUrl is required'));
912
+ }
913
+ const uri = `${meetingPolicyUrl}/continueMeeting`;
914
+
915
+ // @ts-ignore
916
+ return this.request({
917
+ method: HTTP_VERBS.POST,
918
+ uri,
919
+ body: {
920
+ meetingInstanceId,
921
+ requestParticipantId: participantId,
922
+ extensionMinutes,
923
+ },
924
+ });
925
+ }
926
+
889
927
  /**
890
928
  * Make a network request to enable or disable reactions.
891
929
  * @param {boolean} options.enable - determines if we need to enable or disable.
@@ -654,6 +654,9 @@ const MeetingUtil = {
654
654
 
655
655
  waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),
656
656
 
657
+ showAutoEndMeetingWarning: (displayHints) =>
658
+ displayHints.includes(DISPLAY_HINTS.SHOW_AUTO_END_MEETING_WARNING),
659
+
657
660
  canSendReactions: (originalValue, displayHints) => {
658
661
  if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {
659
662
  return true;
@@ -42,6 +42,7 @@ export default class Member {
42
42
  status: any;
43
43
  supportsBreakouts: boolean;
44
44
  supportsInterpretation: boolean;
45
+ supportsSingleUserAutoEndMeeting: boolean;
45
46
  supportLiveAnnotation: boolean;
46
47
  type: any;
47
48
  namespace = MEETINGS;
@@ -130,6 +131,13 @@ export default class Member {
130
131
  * @memberof Member
131
132
  */
132
133
  this.supportsBreakouts = null;
134
+ /**
135
+ * @instance
136
+ * @type {Boolean}
137
+ * @public
138
+ * @memberof Member
139
+ */
140
+ this.supportsSingleUserAutoEndMeeting = null;
133
141
  /**
134
142
  * @instance
135
143
  * @type {Boolean}
@@ -339,6 +347,8 @@ export default class Member {
339
347
  this.isVideoMuted = MemberUtil.isVideoMuted(participant);
340
348
  this.isHandRaised = MemberUtil.isHandRaised(participant);
341
349
  this.supportsBreakouts = MemberUtil.isBreakoutsSupported(participant);
350
+ this.supportsSingleUserAutoEndMeeting =
351
+ MemberUtil.isSupportsSingleUserAutoEndMeeting(participant);
342
352
  this.supportsInterpretation = MemberUtil.isInterpretationSupported(participant);
343
353
  this.supportLiveAnnotation = MemberUtil.isLiveAnnotationSupported(participant);
344
354
  this.isGuest = MemberUtil.isGuest(participant);
@@ -207,6 +207,20 @@ const MemberUtil = {
207
207
  return !participant.doesNotSupportBreakouts;
208
208
  },
209
209
 
210
+ /**
211
+ * @param {Object} participant - The locus participant object.
212
+ * @returns {Boolean}
213
+ */
214
+ isSupportsSingleUserAutoEndMeeting: (participant) => {
215
+ if (!participant) {
216
+ throw new ParameterError(
217
+ 'Single user auto end meeting support could not be processed, participant is undefined.'
218
+ );
219
+ }
220
+
221
+ return !participant.doesNotSupportSingleUserAutoEndMeeting;
222
+ },
223
+
210
224
  /**
211
225
  * @param {Object} participant - The locus participant object.
212
226
  * @returns {Boolean}
@@ -36,6 +36,7 @@ export default {
36
36
  'LOCK_STATUS_UNLOCKED',
37
37
  'ROSTER_IN_MEETING',
38
38
  'SHARE_WHITEBOARD',
39
+ 'SHOW_AUTO_END_MEETING_WARNING',
39
40
  'SHARE_WHITEBOARD_POLICY',
40
41
  'WEBEX_ASSISTANT_STATUS_INACTIVE',
41
42
  'CAPTION_START',
@@ -86,6 +86,7 @@ describe('plugin-meetings', () => {
86
86
  canDoVideo: null,
87
87
  canAnnotate: null,
88
88
  canUseVoip: null,
89
+ showAutoEndMeetingWarning: null,
89
90
  supportHQV: null,
90
91
  supportHDV: null,
91
92
  canShareWhiteBoard: null,
@@ -197,6 +198,7 @@ describe('plugin-meetings', () => {
197
198
  'canRealtimeCloseCaption',
198
199
  'canRealtimeCloseCaptionManual',
199
200
  'canChat',
201
+ 'showAutoEndMeetingWarning',
200
202
  'canDoVideo',
201
203
  'canAnnotate',
202
204
  'canUseVoip',
@@ -10471,6 +10471,24 @@ describe('plugin-meetings', () => {
10471
10471
  );
10472
10472
  });
10473
10473
 
10474
+ it('listens to CONTROLS_AUTO_END_MEETING_WARNING_CHANGED', async () => {
10475
+ const state = {example: 'value'};
10476
+
10477
+ await meeting.locusInfo.emitScoped(
10478
+ {function: 'test', file: 'test'},
10479
+ LOCUSINFO.EVENTS.CONTROLS_AUTO_END_MEETING_WARNING_CHANGED,
10480
+ {state}
10481
+ );
10482
+
10483
+ assert.calledWith(
10484
+ TriggerProxy.trigger,
10485
+ meeting,
10486
+ {file: 'meeting/index', function: 'setupLocusControlsListener'},
10487
+ EVENT_TRIGGERS.MEETING_CONTROLS_AUTO_END_MEETING_WARNING_UPDATED,
10488
+ {state}
10489
+ );
10490
+ });
10491
+
10474
10492
  it('listens to CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED', async () => {
10475
10493
  const state = {example: 'value'};
10476
10494
 
@@ -11443,6 +11461,7 @@ describe('plugin-meetings', () => {
11443
11461
  let canShareWhiteBoardSpy;
11444
11462
  let canMoveToLobbySpy;
11445
11463
  let isSpokenLanguageAutoDetectionEnabledSpy;
11464
+ let showAutoEndMeetingWarningSpy;
11446
11465
  // Due to import tree issues, hasHints must be stubed within the scope of the `it`.
11447
11466
 
11448
11467
  beforeEach(() => {
@@ -11474,6 +11493,7 @@ describe('plugin-meetings', () => {
11474
11493
  canUserRenameOthersSpy = sinon.spy(MeetingUtil, 'canUserRenameOthers');
11475
11494
  canShareWhiteBoardSpy = sinon.spy(MeetingUtil, 'canShareWhiteBoard');
11476
11495
  canMoveToLobbySpy = sinon.spy(MeetingUtil, 'canMoveToLobby');
11496
+ showAutoEndMeetingWarningSpy = sinon.spy(MeetingUtil, 'showAutoEndMeetingWarning');
11477
11497
  isSpokenLanguageAutoDetectionEnabledSpy = sinon.spy(MeetingUtil, 'isSpokenLanguageAutoDetectionEnabled');
11478
11498
 
11479
11499
  });
@@ -11481,6 +11501,7 @@ describe('plugin-meetings', () => {
11481
11501
  afterEach(() => {
11482
11502
  inMeetingActionsSetSpy.restore();
11483
11503
  waitingForOthersToJoinSpy.restore();
11504
+ showAutoEndMeetingWarningSpy.restore();
11484
11505
  });
11485
11506
 
11486
11507
  forEach(
@@ -12028,6 +12049,7 @@ describe('plugin-meetings', () => {
12028
12049
  assert.calledWith(canUserRenameOthersSpy, userDisplayHints);
12029
12050
  assert.calledWith(canShareWhiteBoardSpy, userDisplayHints, selfUserPolicies);
12030
12051
  assert.calledWith(canMoveToLobbySpy, userDisplayHints);
12052
+ assert.calledWith(showAutoEndMeetingWarningSpy, userDisplayHints);
12031
12053
  assert.calledWith(isSpokenLanguageAutoDetectionEnabledSpy, userDisplayHints);
12032
12054
 
12033
12055
  assert.calledWith(ControlsOptionsUtil.hasHints, {
@@ -985,6 +985,7 @@ describe('plugin-meetings', () => {
985
985
  {functionName: 'isRealTimeTranslationEnabled', displayHint: 'DISPLAY_REAL_TIME_TRANSLATION'},
986
986
  {functionName: 'canSelectSpokenLanguages', displayHint: 'DISPLAY_NON_ENGLISH_ASR'},
987
987
  {functionName: 'waitingForOthersToJoin', displayHint: 'WAITING_FOR_OTHERS'},
988
+ {functionName: 'showAutoEndMeetingWarning', displayHint: 'SHOW_AUTO_END_MEETING_WARNING'},
988
989
  ].forEach(({functionName, displayHint}) => {
989
990
  describe(functionName, () => {
990
991
  it('works as expected', () => {
@@ -417,6 +417,30 @@ describe('plugin-meetings', () => {
417
417
  });
418
418
  });
419
419
 
420
+ describe('MemberUtil.isSupportsSingleUserAutoEndMeeting', () => {
421
+ it('throws an error when there is no participant', () => {
422
+ assert.throws(() => {
423
+ MemberUtil.isSupportsSingleUserAutoEndMeeting();
424
+ }, 'Single user auto end meeting support could not be processed, participant is undefined.');
425
+ });
426
+
427
+ it('returns true when single user auto end meeting is supported', () => {
428
+ const participant = {
429
+ supportsSingleUserAutoEndMeeting: {},
430
+ };
431
+ assert.isTrue(MemberUtil.isSupportsSingleUserAutoEndMeeting(participant));
432
+ });
433
+
434
+ it('returns false when single user auto end meeting is not supported', () => {
435
+ const participant = {
436
+ doesNotSupportSingleUserAutoEndMeeting: {},
437
+ };
438
+
439
+ assert.isFalse(MemberUtil.isSupportsSingleUserAutoEndMeeting(participant));
440
+ });
441
+ });
442
+
443
+
420
444
  describe('MemberUtil.isLiveAnnotationSupported', () => {
421
445
  it('throws an error when there is no participant', () => {
422
446
  assert.throws(() => {