@webex/plugin-meetings 3.8.0-next.36 → 3.8.0-next.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/meeting/util.js +3 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/roap/turnDiscovery.js +15 -5
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/types/meeting/util.d.ts +1 -1
- package/dist/types/roap/turnDiscovery.d.ts +4 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +3 -3
- package/src/meeting/util.ts +2 -1
- package/src/roap/turnDiscovery.ts +14 -5
- package/test/unit/spec/meeting/utils.js +4 -0
- package/test/unit/spec/roap/turnDiscovery.ts +38 -0
package/dist/breakouts/index.js
CHANGED
@@ -1046,7 +1046,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
|
|
1046
1046
|
this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
|
1047
1047
|
}
|
1048
1048
|
},
|
1049
|
-
version: "3.8.0-next.
|
1049
|
+
version: "3.8.0-next.38"
|
1050
1050
|
});
|
1051
1051
|
var _default = exports.default = Breakouts;
|
1052
1052
|
//# sourceMappingURL=index.js.map
|
@@ -373,7 +373,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
|
|
373
373
|
throw error;
|
374
374
|
});
|
375
375
|
},
|
376
|
-
version: "3.8.0-next.
|
376
|
+
version: "3.8.0-next.38"
|
377
377
|
});
|
378
378
|
var _default = exports.default = SimultaneousInterpretation;
|
379
379
|
//# sourceMappingURL=index.js.map
|
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
|
|
18
18
|
languageCode: 'number',
|
19
19
|
languageName: 'string'
|
20
20
|
},
|
21
|
-
version: "3.8.0-next.
|
21
|
+
version: "3.8.0-next.38"
|
22
22
|
});
|
23
23
|
var _default = exports.default = SILanguage;
|
24
24
|
//# sourceMappingURL=siLanguage.js.map
|
package/dist/meeting/util.js
CHANGED
@@ -566,7 +566,9 @@ var MeetingUtil = {
|
|
566
566
|
canUserRenameOthers: function canUserRenameOthers(displayHints) {
|
567
567
|
return displayHints.includes(_constants.DISPLAY_HINTS.CAN_RENAME_OTHERS);
|
568
568
|
},
|
569
|
-
|
569
|
+
// Default empty value for policies if we get an undefined value (ie permissionToken is not available)
|
570
|
+
canShareWhiteBoard: function canShareWhiteBoard(displayHints) {
|
571
|
+
var policies = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
570
572
|
return displayHints.includes(_constants.DISPLAY_HINTS.SHARE_WHITEBOARD) && !!policies[_constants.SELF_POLICY.SUPPORT_WHITEBOARD];
|
571
573
|
},
|
572
574
|
/**
|
package/dist/meeting/util.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_lodash","require","_webexErrors","_loggerProxy","_interopRequireDefault","_constants","_browserDetection","_intentToJoin","_joinMeeting2","_parameter","_permission","_passwordError","_captchaError","_triggerProxy","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","ownKeys","r","t","_Object$keys","_Object$getOwnPropertySymbols","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","mediaConnection","mediaId","remoteUpdateAudioVideo","meeting","audioMuted","videoMuted","_promise","reject","ParameterError","locusMediaRequest","send","type","selfUrl","sequence","locusInfo","muteOptions","then","_response$body","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","_err$body","errorCode","INTENT_TO_JOIN","includes","getIpVersion","webex","_webex$internal$devic","internal","device","ipNetworkDetector","supportsIpV4","supportsIpV6","config","meetings","backendIpv6NativeSupport","BrowserDetection","isBrowser","undefined","IP_VERSION","ipv4_and_ipv6","only_ipv4","only_ipv6","unknown","joinMeeting","_joinMeeting","_asyncToGenerator2","_regenerator","mark","_callee","options","_meeting$meetingInfo","reachability","clientMediaPreferences","wrap","_callee$","_context","prev","abrupt","getWebexObject","newMetrics","submitClientEvent","meetingId","ipver","joinCookie","preferTranscoding","isMultistream","getClientMediaPreferences","sent","roapMessage","getReachabilityReportToAttachToRoap","t0","LoggerProxy","logger","error","meetingRequest","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","deviceUrl","locusClusterUrl","meetingInfo","correlationId","permissionToken","resourceId","moderator","pin","moveToResource","asResourceOccupant","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","alias","res","_res$headers","setLocus","isoLocalClientMeetingJoinTime","headers","date","payload","trigger","identifiers","trackingId","trackingid","stop","_x","_x2","cleanUp","meetingEnded","stopPeriodicLogUpload","breakouts","simultaneousInterpretation","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeRemoteStreams","closePeerConnections","cleanupLocalStreams","unsetRemoteStreams","unsetPeerConnections","reconnectionManager","stopKeepAlive","_meeting$config","enableAutomaticLLM","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","catch","concat","prepareLeaveMeetingOptions","defaultOptions","leaveMeeting","isUserInLeftState","UserNotJoinedError","leaveOptions","moveMeeting","declineMeeting","reason","_locusInfo$parsedLocu","_locusInfo$parsedLocu2","parsedLocus","state","_LEFT_","isUserInIdleState","_locusInfo$parsedLocu3","_locusInfo$parsedLocu4","_IDLE_","isUserInJoinedState","_locusInfo$parsedLocu5","_locusInfo$parsedLocu6","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","IntentToJoinError","JoinMeetingError","buildLeaveFetchRequestOptions","buildLeaveMeetingRequestOptions","getTrack","stream","audioTrack","videoTrack","audioTracks","videoTracks","getAudioTracks","getVideoTracks","_audioTracks","_audioTracks2","_slicedToArray2","_videoTracks","_videoTracks2","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","_locusInfo$parsedLocu7","_locusInfo$parsedLocu8","userDisplayHints","canInviteNewParticipants","displayHints","DISPLAY_HINTS","ADD_GUEST","canAdmitParticipant","ROSTER_WAITING_TO_JOIN","canUserLock","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRaiseHand","RAISE_HAND","canUserLowerAllHands","LOWER_ALL_HANDS","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","canManageBreakout","BREAKOUT_MANAGEMENT","canStartBreakout","DISABLE_BREAKOUT_START","canBroadcastMessageToBreakout","policies","BROADCAST_MESSAGE_TO_BREAKOUT","SELF_POLICY","SUPPORT_BROADCAST_MESSAGE","isSuppressBreakoutSupport","UCF_SUPPRESS_BREAKOUTS_SUPPORT","canAdmitLobbyToBreakout","DISABLE_LOBBY_TO_BREAKOUT","isBreakoutPreassignmentsEnabled","DISABLE_BREAKOUT_PREASSIGNMENTS","canUserAskForHelp","DISABLE_ASK_FOR_HELP","lockMeeting","actions","request","canLock","lock","PermissionError","unlockMeeting","canUnlock","handleAudioLogging","audioStream","LOG_HEADER","settings","getSettings","deviceId","log","_stringify","handleVideoLogging","videoStream","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","isSaveTranscriptsEnabled","SAVE_TRANSCRIPTS_ENABLED","canStartTranscribing","TRANSCRIPTION_CONTROL_START","canStopTranscribing","TRANSCRIPTION_CONTROL_STOP","isClosedCaptionActive","CAPTION_STATUS_ACTIVE","canStartManualCaption","MANUAL_CAPTION_START","canStopManualCaption","MANUAL_CAPTION_STOP","isManualCaptionActive","MANUAL_CAPTION_STATUS_ACTIVE","isWebexAssistantActive","WEBEX_ASSISTANT_STATUS_ACTIVE","canViewCaptionPanel","ENABLE_CAPTION_PANEL","isRealTimeTranslationEnabled","DISPLAY_REAL_TIME_TRANSLATION","canSelectSpokenLanguages","DISPLAY_NON_ENGLISH_ASR","waitingForOthersToJoin","WAITING_FOR_OTHERS","canSendReactions","originalValue","REACTIONS_ACTIVE","REACTIONS_INACTIVE","canUserRenameSelfAndObserved","CAN_RENAME_SELF_AND_OBSERVED","canUserRenameOthers","CAN_RENAME_OTHERS","canShareWhiteBoard","SHARE_WHITEBOARD","SUPPORT_WHITEBOARD","addSequence","requestBody","_meeting$locusInfo","updateLocusWithDelta","_response$body2","handleLocusDelta","generateBuildLocusDeltaRequestOptions","originalMeeting","meetingRef","WeakRef","buildLocusDeltaRequestOptions","originalOptions","deref","cloneDeep","generateLocusDeltaRequest","locusDeltaRequest","selfSupportsFeature","feature","userPolicies","parseInterpretationInfo","_meetingInfo$meetingS","siInfo","updateMeetingSIEnabled","turnOnSimultaneousInterpretation","currentSIInterpreter","hostSIEnabled","meetingSiteSetting","enableHostInterpreterControlSI","updateHostSIEnabled","renameKey","obj","oldKey","newKey","_meeting$simultaneous","_meeting$simultaneous2","lanuagesInfo","siLanguages","_iterator","_step","language","updateInterpretation","Trigger","file","function","EVENT_TRIGGERS","MEETING_INTERPRETATION_UPDATE","getChangeMeetingFloorErrorPayload","errorPayload","errorDescription","shownToUser","LOCAL_SHARE_ERRORS","UNDEFINED","fatal","category","DEVICE_NOT_JOINED","NO_MEDIA_FOR_DEVICE","NO_CONFLUENCE_ID","CONTENT_SHARING_DISABLED","LOCUS_PARTICIPANT_DNE","CONTENT_REQUEST_WHILE_PENDING_WHITEBOARD","_default","exports"],"sources":["util.ts"],"sourcesContent":["import {LocalCameraStream, LocalMicrophoneStream} from '@webex/media-helpers';\n\nimport {cloneDeep} from 'lodash';\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE,\n SELF_POLICY,\n EVENT_TRIGGERS,\n LOCAL_SHARE_ERRORS,\n IP_VERSION,\n} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\nimport Trigger from '../common/events/trigger-proxy';\n\nconst MeetingUtil = {\n parseLocusJoin: (response) => {\n const parsed: any = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n },\n\n remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n if (!meeting.locusMediaRequest) {\n return Promise.reject(\n new ParameterError(\n 'You need a meeting with a media connection, call Meeting.addMedia() first.'\n )\n );\n }\n\n return meeting.locusMediaRequest\n .send({\n type: 'LocalMute',\n selfUrl: meeting.selfUrl,\n mediaId: meeting.mediaId,\n sequence: meeting.locusInfo.sequence,\n muteOptions: {\n audioMuted,\n videoMuted,\n },\n })\n .then((response) => response?.body?.locus);\n },\n\n hasOwner: (info) => info && info.owner,\n\n isOwnerSelf: (owner, selfId) => owner === selfId,\n\n isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),\n\n /**\n * Returns the current state of knowledge about whether we are on an ipv4-only or ipv6-only or mixed (ipv4 and ipv6) network.\n * The return value matches the possible values of \"ipver\" parameter used by the backend APIs.\n *\n * @param {Object} webex webex instance\n * @returns {IP_VERSION|undefined} ipver value to be passed to the backend APIs or undefined if we should not pass any value to the backend\n */\n getIpVersion(webex: any): IP_VERSION | undefined {\n const {supportsIpV4, supportsIpV6} = webex.internal.device.ipNetworkDetector;\n\n if (\n !webex.config.meetings.backendIpv6NativeSupport &&\n BrowserDetection().isBrowser('firefox')\n ) {\n // when backend doesn't support native ipv6,\n // then our NAT64/DNS64 based solution relies on FQDN ICE candidates, but Firefox doesn't support them,\n // see https://bugzilla.mozilla.org/show_bug.cgi?id=1713128\n // so for Firefox we don't want the backend to activate the \"ipv6 feature\"\n return undefined;\n }\n\n if (supportsIpV4 && supportsIpV6) {\n return IP_VERSION.ipv4_and_ipv6;\n }\n\n if (supportsIpV4) {\n return IP_VERSION.only_ipv4;\n }\n\n if (supportsIpV6) {\n return IP_VERSION.only_ipv6;\n }\n\n return IP_VERSION.unknown;\n },\n\n joinMeeting: async (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const webex = meeting.getWebexObject();\n\n // @ts-ignore\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.join.request',\n options: {meetingId: meeting.id},\n });\n\n let reachability;\n let clientMediaPreferences = {\n // bare minimum fallback value that should allow us to join\n ipver: IP_VERSION.unknown,\n joinCookie: undefined,\n preferTranscoding: !meeting.isMultistream,\n };\n\n try {\n clientMediaPreferences = await webex.meetings.reachability.getClientMediaPreferences(\n meeting.isMultistream,\n MeetingUtil.getIpVersion(webex)\n );\n if (options.roapMessage) {\n // we only need to attach reachability if we are sending a roap message\n // sending reachability on its own will cause Locus to reject our join request\n reachability = await webex.meetings.reachability.getReachabilityReportToAttachToRoap();\n }\n } catch (e) {\n LoggerProxy.logger.error(\n 'Meeting:util#joinMeeting --> Error getting reachability or clientMediaPreferences:',\n e\n );\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n locusClusterUrl: meeting.meetingInfo?.locusClusterUrl,\n correlationId: meeting.correlationId,\n reachability,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n asResourceOccupant: options.asResourceOccupant,\n breakoutsSupported: options.breakoutsSupported,\n locale: options.locale,\n deviceCapabilities: options.deviceCapabilities,\n liveAnnotationSupported: options.liveAnnotationSupported,\n clientMediaPreferences,\n alias: options.alias,\n })\n .then((res) => {\n const parsed = MeetingUtil.parseLocusJoin(res);\n meeting.setLocus(parsed);\n meeting.isoLocalClientMeetingJoinTime = res?.headers?.date; // read from header if exist, else fall back to system clock : https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-555657\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.join.response',\n payload: {\n trigger: 'loci-update',\n identifiers: {\n trackingId: res.headers.trackingid,\n },\n },\n options: {\n meetingId: meeting.id,\n mediaConnections: parsed.mediaConnections,\n },\n });\n\n return parsed;\n });\n },\n\n cleanUp: (meeting) => {\n meeting.getWebexObject().internal.device.meetingEnded();\n meeting.stopPeriodicLogUpload();\n\n meeting.breakouts.cleanUp();\n meeting.simultaneousInterpretation.cleanUp();\n meeting.locusMediaRequest = undefined;\n\n // make sure we send last metrics before we close the peerconnection\n const stopStatsAnalyzer = meeting.statsAnalyzer\n ? meeting.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer\n .then(() => meeting.closeRemoteStreams())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.cleanupLocalStreams();\n meeting.unsetRemoteStreams();\n meeting.unsetPeerConnections();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.stopKeepAlive())\n .then(() => {\n if (meeting.config?.enableAutomaticLLM) {\n meeting.updateLLMConnection();\n }\n });\n },\n\n disconnectPhoneAudio: (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl,\n };\n\n return meeting.meetingRequest.disconnectPhoneAudio(options).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n\n /**\n * Returns options for leaving a meeting.\n * @param {any} meeting\n * @param {any} options\n * @returns {any} leave options\n */\n prepareLeaveMeetingOptions: (meeting, options: any = {}) => {\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl,\n };\n\n return {...defaultOptions, ...options};\n },\n\n // by default will leave on meeting's resourceId\n // if you explicity want it not to leave on resource id, pass\n // {resourceId: null}\n // TODO: chris, you can modify this however you want\n leaveMeeting: (meeting, options: any = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n declineMeeting: (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason,\n }),\n\n isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,\n\n isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,\n\n isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,\n\n isMediaEstablished: (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),\n\n joinMeetingOptions: (meeting, options: any = {}) => {\n const webex = meeting.getWebexObject();\n\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n // @ts-ignore\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.pin.collected',\n options: {\n meetingId: meeting.id,\n },\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options).catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.pin.prompt',\n options: {\n meetingId: meeting.id,\n },\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n },\n\n /**\n * Returns request options for leaving a meeting.\n * @param {any} meeting\n * @param {any} options\n * @returns {any} request options\n */\n buildLeaveFetchRequestOptions: (meeting, options: any = {}) => {\n const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);\n\n return meeting.meetingRequest.buildLeaveMeetingRequestOptions(leaveOptions);\n },\n\n getTrack: (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n },\n\n getModeratorFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator,\n\n getPolicyFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy,\n\n getUserDisplayHintsFromLocusInfo: (locusInfo) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [],\n\n canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),\n\n canAdmitParticipant: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),\n\n canUserLock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),\n\n canUserUnlock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),\n\n canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),\n\n canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),\n\n canUserLowerSomeoneElsesHand: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),\n\n bothLeaveAndEndMeetingAvailable: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),\n\n canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),\n\n canStartBreakout: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_START),\n\n canBroadcastMessageToBreakout: (displayHints, policies = {}) =>\n displayHints.includes(DISPLAY_HINTS.BROADCAST_MESSAGE_TO_BREAKOUT) &&\n !!policies[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE],\n\n isSuppressBreakoutSupport: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),\n\n canAdmitLobbyToBreakout: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),\n\n isBreakoutPreassignmentsEnabled: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),\n\n canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),\n\n lockMeeting: (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n },\n\n unlockMeeting: (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n },\n\n handleAudioLogging: (audioStream?: LocalMicrophoneStream) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioStream) {\n const settings = audioStream.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n },\n\n handleVideoLogging: (videoStream?: LocalCameraStream) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoStream) {\n const settings = videoStream.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n },\n\n endMeetingForAll: (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n\n canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),\n\n isSaveTranscriptsEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),\n\n canStartTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),\n\n canStopTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),\n\n isClosedCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),\n\n canStartManualCaption: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_START),\n\n canStopManualCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STOP),\n\n isManualCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STATUS_ACTIVE),\n\n isWebexAssistantActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),\n\n canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),\n\n isRealTimeTranslationEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),\n\n canSelectSpokenLanguages: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),\n\n waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),\n\n canSendReactions: (originalValue, displayHints) => {\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {\n return true;\n }\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {\n return false;\n }\n\n return originalValue;\n },\n canUserRenameSelfAndObserved: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),\n\n canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),\n\n canShareWhiteBoard: (displayHints, policies) =>\n displayHints.includes(DISPLAY_HINTS.SHARE_WHITEBOARD) &&\n !!policies[SELF_POLICY.SUPPORT_WHITEBOARD],\n\n /**\n * Adds the current locus sequence information to a request body\n * @param {Object} meeting The meeting object\n * @param {Object} requestBody The body of a request to locus\n * @returns {void}\n */\n addSequence: (meeting, requestBody) => {\n const sequence = meeting?.locusInfo?.sequence;\n\n if (!sequence) {\n return;\n }\n\n requestBody.sequence = sequence;\n },\n\n /**\n * Updates the locus info for the meeting with the delta locus\n * returned from requests that include the sequence information\n * Returns the original response object\n * @param {Object} meeting The meeting object\n * @param {Object} response The response of the http request\n * @returns {Object}\n */\n updateLocusWithDelta: (meeting, response) => {\n if (!meeting) {\n return response;\n }\n\n const locus = response?.body?.locus;\n\n if (locus) {\n meeting.locusInfo.handleLocusDelta(locus, meeting);\n }\n\n return response;\n },\n\n generateBuildLocusDeltaRequestOptions: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const buildLocusDeltaRequestOptions = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return originalOptions;\n }\n\n const options = cloneDeep(originalOptions);\n\n if (!options.body) {\n options.body = {};\n }\n\n MeetingUtil.addSequence(meeting, options.body);\n\n return options;\n };\n\n return buildLocusDeltaRequestOptions;\n },\n\n generateLocusDeltaRequest: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const buildLocusDeltaRequestOptions =\n MeetingUtil.generateBuildLocusDeltaRequestOptions(originalMeeting);\n\n const locusDeltaRequest = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return Promise.resolve();\n }\n\n const options = buildLocusDeltaRequestOptions(originalOptions);\n\n return meeting\n .request(options)\n .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));\n };\n\n return locusDeltaRequest;\n },\n\n selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => {\n if (!userPolicies) {\n return true;\n }\n\n return userPolicies[feature];\n },\n\n parseInterpretationInfo: (meeting, meetingInfo) => {\n if (!meeting || !meetingInfo) {\n return;\n }\n const siInfo = meetingInfo.simultaneousInterpretation;\n meeting.simultaneousInterpretation.updateMeetingSIEnabled(\n !!meetingInfo.turnOnSimultaneousInterpretation,\n !!siInfo?.currentSIInterpreter\n );\n const hostSIEnabled = !!(\n meetingInfo.turnOnSimultaneousInterpretation &&\n meetingInfo?.meetingSiteSetting?.enableHostInterpreterControlSI\n );\n meeting.simultaneousInterpretation.updateHostSIEnabled(hostSIEnabled);\n\n function renameKey(obj, oldKey, newKey) {\n if (oldKey in obj) {\n obj[newKey] = obj[oldKey];\n delete obj[oldKey];\n }\n }\n if (siInfo) {\n const lanuagesInfo = cloneDeep(siInfo.siLanguages);\n for (const language of lanuagesInfo) {\n renameKey(language, 'languageCode', 'languageName');\n renameKey(language, 'languageGroupId', 'languageCode');\n }\n if (!meeting.simultaneousInterpretation?.siLanguages?.length) {\n meeting.simultaneousInterpretation.updateInterpretation({siLanguages: lanuagesInfo});\n }\n }\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'parseInterpretationInfo',\n },\n EVENT_TRIGGERS.MEETING_INTERPRETATION_UPDATE\n );\n },\n\n /**\n * Returns a CA-recognized error payload for the specified raw error message/reason.\n *\n * New errors can be added to this function for handling in the future\n *\n * @param {String} reason the raw error message\n * @returns {Array<object>} an array of payload objects\n */\n getChangeMeetingFloorErrorPayload: (reason: string) => {\n const errorPayload = {\n errorDescription: reason,\n name: 'locus.response',\n shownToUser: false,\n };\n if (reason.includes(LOCAL_SHARE_ERRORS.UNDEFINED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 1100,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.DEVICE_NOT_JOINED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4050,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.NO_MEDIA_FOR_DEVICE)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'media',\n errorCode: 2048,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.NO_CONFLUENCE_ID)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4064,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.CONTENT_SHARING_DISABLED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'expected',\n errorCode: 4065,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.LOCUS_PARTICIPANT_DNE)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4066,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.CONTENT_REQUEST_WHILE_PENDING_WHITEBOARD)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'expected',\n errorCode: 4067,\n },\n ];\n }\n\n // return unknown error\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 1100,\n },\n ];\n },\n};\n\nexport default MeetingUtil;\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_lodash","require","_webexErrors","_loggerProxy","_interopRequireDefault","_constants","_browserDetection","_intentToJoin","_joinMeeting2","_parameter","_permission","_passwordError","_captchaError","_triggerProxy","_createForOfIteratorHelper","o","allowArrayLike","it","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","i","F","s","n","done","value","e","_e","f","TypeError","normalCompletion","didErr","err","call","step","next","_e2","return","minLen","_arrayLikeToArray","Object","prototype","toString","slice","constructor","name","_Array$from","test","arr","len","arr2","Array","ownKeys","r","t","_Object$keys","_Object$getOwnPropertySymbols","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","mediaConnection","mediaId","remoteUpdateAudioVideo","meeting","audioMuted","videoMuted","_promise","reject","ParameterError","locusMediaRequest","send","type","selfUrl","sequence","locusInfo","muteOptions","then","_response$body","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","_err$body","errorCode","INTENT_TO_JOIN","includes","getIpVersion","webex","_webex$internal$devic","internal","device","ipNetworkDetector","supportsIpV4","supportsIpV6","config","meetings","backendIpv6NativeSupport","BrowserDetection","isBrowser","undefined","IP_VERSION","ipv4_and_ipv6","only_ipv4","only_ipv6","unknown","joinMeeting","_joinMeeting","_asyncToGenerator2","_regenerator","mark","_callee","options","_meeting$meetingInfo","reachability","clientMediaPreferences","wrap","_callee$","_context","prev","abrupt","getWebexObject","newMetrics","submitClientEvent","meetingId","ipver","joinCookie","preferTranscoding","isMultistream","getClientMediaPreferences","sent","roapMessage","getReachabilityReportToAttachToRoap","t0","LoggerProxy","logger","error","meetingRequest","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","deviceUrl","locusClusterUrl","meetingInfo","correlationId","permissionToken","resourceId","moderator","pin","moveToResource","asResourceOccupant","breakoutsSupported","locale","deviceCapabilities","liveAnnotationSupported","alias","res","_res$headers","setLocus","isoLocalClientMeetingJoinTime","headers","date","payload","trigger","identifiers","trackingId","trackingid","stop","_x","_x2","cleanUp","meetingEnded","stopPeriodicLogUpload","breakouts","simultaneousInterpretation","stopStatsAnalyzer","statsAnalyzer","stopAnalyzer","resolve","closeRemoteStreams","closePeerConnections","cleanupLocalStreams","unsetRemoteStreams","unsetPeerConnections","reconnectionManager","stopKeepAlive","_meeting$config","enableAutomaticLLM","updateLLMConnection","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","catch","concat","prepareLeaveMeetingOptions","defaultOptions","leaveMeeting","isUserInLeftState","UserNotJoinedError","leaveOptions","moveMeeting","declineMeeting","reason","_locusInfo$parsedLocu","_locusInfo$parsedLocu2","parsedLocus","state","_LEFT_","isUserInIdleState","_locusInfo$parsedLocu3","_locusInfo$parsedLocu4","_IDLE_","isUserInJoinedState","_locusInfo$parsedLocu5","_locusInfo$parsedLocu6","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","IntentToJoinError","JoinMeetingError","buildLeaveFetchRequestOptions","buildLeaveMeetingRequestOptions","getTrack","stream","audioTrack","videoTrack","audioTracks","videoTracks","getAudioTracks","getVideoTracks","_audioTracks","_audioTracks2","_slicedToArray2","_videoTracks","_videoTracks2","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","getUserDisplayHintsFromLocusInfo","_locusInfo$parsedLocu7","_locusInfo$parsedLocu8","userDisplayHints","canInviteNewParticipants","displayHints","DISPLAY_HINTS","ADD_GUEST","canAdmitParticipant","ROSTER_WAITING_TO_JOIN","canUserLock","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRaiseHand","RAISE_HAND","canUserLowerAllHands","LOWER_ALL_HANDS","canUserLowerSomeoneElsesHand","LOWER_SOMEONE_ELSES_HAND","bothLeaveAndEndMeetingAvailable","LEAVE_TRANSFER_HOST_END_MEETING","LEAVE_END_MEETING","canManageBreakout","BREAKOUT_MANAGEMENT","canStartBreakout","DISABLE_BREAKOUT_START","canBroadcastMessageToBreakout","policies","BROADCAST_MESSAGE_TO_BREAKOUT","SELF_POLICY","SUPPORT_BROADCAST_MESSAGE","isSuppressBreakoutSupport","UCF_SUPPRESS_BREAKOUTS_SUPPORT","canAdmitLobbyToBreakout","DISABLE_LOBBY_TO_BREAKOUT","isBreakoutPreassignmentsEnabled","DISABLE_BREAKOUT_PREASSIGNMENTS","canUserAskForHelp","DISABLE_ASK_FOR_HELP","lockMeeting","actions","request","canLock","lock","PermissionError","unlockMeeting","canUnlock","handleAudioLogging","audioStream","LOG_HEADER","settings","getSettings","deviceId","log","_stringify","handleVideoLogging","videoStream","endMeetingForAll","endOptions","canEnableClosedCaption","CAPTION_START","isSaveTranscriptsEnabled","SAVE_TRANSCRIPTS_ENABLED","canStartTranscribing","TRANSCRIPTION_CONTROL_START","canStopTranscribing","TRANSCRIPTION_CONTROL_STOP","isClosedCaptionActive","CAPTION_STATUS_ACTIVE","canStartManualCaption","MANUAL_CAPTION_START","canStopManualCaption","MANUAL_CAPTION_STOP","isManualCaptionActive","MANUAL_CAPTION_STATUS_ACTIVE","isWebexAssistantActive","WEBEX_ASSISTANT_STATUS_ACTIVE","canViewCaptionPanel","ENABLE_CAPTION_PANEL","isRealTimeTranslationEnabled","DISPLAY_REAL_TIME_TRANSLATION","canSelectSpokenLanguages","DISPLAY_NON_ENGLISH_ASR","waitingForOthersToJoin","WAITING_FOR_OTHERS","canSendReactions","originalValue","REACTIONS_ACTIVE","REACTIONS_INACTIVE","canUserRenameSelfAndObserved","CAN_RENAME_SELF_AND_OBSERVED","canUserRenameOthers","CAN_RENAME_OTHERS","canShareWhiteBoard","SHARE_WHITEBOARD","SUPPORT_WHITEBOARD","addSequence","requestBody","_meeting$locusInfo","updateLocusWithDelta","_response$body2","handleLocusDelta","generateBuildLocusDeltaRequestOptions","originalMeeting","meetingRef","WeakRef","buildLocusDeltaRequestOptions","originalOptions","deref","cloneDeep","generateLocusDeltaRequest","locusDeltaRequest","selfSupportsFeature","feature","userPolicies","parseInterpretationInfo","_meetingInfo$meetingS","siInfo","updateMeetingSIEnabled","turnOnSimultaneousInterpretation","currentSIInterpreter","hostSIEnabled","meetingSiteSetting","enableHostInterpreterControlSI","updateHostSIEnabled","renameKey","obj","oldKey","newKey","_meeting$simultaneous","_meeting$simultaneous2","lanuagesInfo","siLanguages","_iterator","_step","language","updateInterpretation","Trigger","file","function","EVENT_TRIGGERS","MEETING_INTERPRETATION_UPDATE","getChangeMeetingFloorErrorPayload","errorPayload","errorDescription","shownToUser","LOCAL_SHARE_ERRORS","UNDEFINED","fatal","category","DEVICE_NOT_JOINED","NO_MEDIA_FOR_DEVICE","NO_CONFLUENCE_ID","CONTENT_SHARING_DISABLED","LOCUS_PARTICIPANT_DNE","CONTENT_REQUEST_WHILE_PENDING_WHITEBOARD","_default","exports"],"sources":["util.ts"],"sourcesContent":["import {LocalCameraStream, LocalMicrophoneStream} from '@webex/media-helpers';\n\nimport {cloneDeep} from 'lodash';\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n PASSWORD_STATUS,\n DISPLAY_HINTS,\n FULL_STATE,\n SELF_POLICY,\n EVENT_TRIGGERS,\n LOCAL_SHARE_ERRORS,\n IP_VERSION,\n} from '../constants';\nimport BrowserDetection from '../common/browser-detection';\nimport IntentToJoinError from '../common/errors/intent-to-join';\nimport JoinMeetingError from '../common/errors/join-meeting';\nimport ParameterError from '../common/errors/parameter';\nimport PermissionError from '../common/errors/permission';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\nimport Trigger from '../common/events/trigger-proxy';\n\nconst MeetingUtil = {\n parseLocusJoin: (response) => {\n const parsed: any = {};\n\n // First todo: add check for existance\n parsed.locus = response.body.locus;\n parsed.mediaConnections = response.body.mediaConnections;\n parsed.locusUrl = parsed.locus.url;\n parsed.locusId = parsed.locus.url.split('/').pop();\n parsed.selfId = parsed.locus.self.id;\n\n // we need mediaId before making roap calls\n parsed.mediaConnections.forEach((mediaConnection) => {\n if (mediaConnection.mediaId) {\n parsed.mediaId = mediaConnection.mediaId;\n }\n });\n\n return parsed;\n },\n\n remoteUpdateAudioVideo: (meeting, audioMuted?: boolean, videoMuted?: boolean) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n if (!meeting.locusMediaRequest) {\n return Promise.reject(\n new ParameterError(\n 'You need a meeting with a media connection, call Meeting.addMedia() first.'\n )\n );\n }\n\n return meeting.locusMediaRequest\n .send({\n type: 'LocalMute',\n selfUrl: meeting.selfUrl,\n mediaId: meeting.mediaId,\n sequence: meeting.locusInfo.sequence,\n muteOptions: {\n audioMuted,\n videoMuted,\n },\n })\n .then((response) => response?.body?.locus);\n },\n\n hasOwner: (info) => info && info.owner,\n\n isOwnerSelf: (owner, selfId) => owner === selfId,\n\n isPinOrGuest: (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode),\n\n /**\n * Returns the current state of knowledge about whether we are on an ipv4-only or ipv6-only or mixed (ipv4 and ipv6) network.\n * The return value matches the possible values of \"ipver\" parameter used by the backend APIs.\n *\n * @param {Object} webex webex instance\n * @returns {IP_VERSION|undefined} ipver value to be passed to the backend APIs or undefined if we should not pass any value to the backend\n */\n getIpVersion(webex: any): IP_VERSION | undefined {\n const {supportsIpV4, supportsIpV6} = webex.internal.device.ipNetworkDetector;\n\n if (\n !webex.config.meetings.backendIpv6NativeSupport &&\n BrowserDetection().isBrowser('firefox')\n ) {\n // when backend doesn't support native ipv6,\n // then our NAT64/DNS64 based solution relies on FQDN ICE candidates, but Firefox doesn't support them,\n // see https://bugzilla.mozilla.org/show_bug.cgi?id=1713128\n // so for Firefox we don't want the backend to activate the \"ipv6 feature\"\n return undefined;\n }\n\n if (supportsIpV4 && supportsIpV6) {\n return IP_VERSION.ipv4_and_ipv6;\n }\n\n if (supportsIpV4) {\n return IP_VERSION.only_ipv4;\n }\n\n if (supportsIpV6) {\n return IP_VERSION.only_ipv6;\n }\n\n return IP_VERSION.unknown;\n },\n\n joinMeeting: async (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const webex = meeting.getWebexObject();\n\n // @ts-ignore\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.join.request',\n options: {meetingId: meeting.id},\n });\n\n let reachability;\n let clientMediaPreferences = {\n // bare minimum fallback value that should allow us to join\n ipver: IP_VERSION.unknown,\n joinCookie: undefined,\n preferTranscoding: !meeting.isMultistream,\n };\n\n try {\n clientMediaPreferences = await webex.meetings.reachability.getClientMediaPreferences(\n meeting.isMultistream,\n MeetingUtil.getIpVersion(webex)\n );\n if (options.roapMessage) {\n // we only need to attach reachability if we are sending a roap message\n // sending reachability on its own will cause Locus to reject our join request\n reachability = await webex.meetings.reachability.getReachabilityReportToAttachToRoap();\n }\n } catch (e) {\n LoggerProxy.logger.error(\n 'Meeting:util#joinMeeting --> Error getting reachability or clientMediaPreferences:',\n e\n );\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: check if the meeting is in JOINING state\n // if Joining state termintate the request as user might click multiple times\n return meeting.meetingRequest\n .joinMeeting({\n inviteeAddress: meeting.meetingJoinUrl || meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n locusClusterUrl: meeting.meetingInfo?.locusClusterUrl,\n correlationId: meeting.correlationId,\n reachability,\n roapMessage: options.roapMessage,\n permissionToken: meeting.permissionToken,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n asResourceOccupant: options.asResourceOccupant,\n breakoutsSupported: options.breakoutsSupported,\n locale: options.locale,\n deviceCapabilities: options.deviceCapabilities,\n liveAnnotationSupported: options.liveAnnotationSupported,\n clientMediaPreferences,\n alias: options.alias,\n })\n .then((res) => {\n const parsed = MeetingUtil.parseLocusJoin(res);\n meeting.setLocus(parsed);\n meeting.isoLocalClientMeetingJoinTime = res?.headers?.date; // read from header if exist, else fall back to system clock : https://jira-eng-gpk2.cisco.com/jira/browse/SPARK-555657\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.locus.join.response',\n payload: {\n trigger: 'loci-update',\n identifiers: {\n trackingId: res.headers.trackingid,\n },\n },\n options: {\n meetingId: meeting.id,\n mediaConnections: parsed.mediaConnections,\n },\n });\n\n return parsed;\n });\n },\n\n cleanUp: (meeting) => {\n meeting.getWebexObject().internal.device.meetingEnded();\n meeting.stopPeriodicLogUpload();\n\n meeting.breakouts.cleanUp();\n meeting.simultaneousInterpretation.cleanUp();\n meeting.locusMediaRequest = undefined;\n\n // make sure we send last metrics before we close the peerconnection\n const stopStatsAnalyzer = meeting.statsAnalyzer\n ? meeting.statsAnalyzer.stopAnalyzer()\n : Promise.resolve();\n\n return stopStatsAnalyzer\n .then(() => meeting.closeRemoteStreams())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.cleanupLocalStreams();\n meeting.unsetRemoteStreams();\n meeting.unsetPeerConnections();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.stopKeepAlive())\n .then(() => {\n if (meeting.config?.enableAutomaticLLM) {\n meeting.updateLLMConnection();\n }\n });\n },\n\n disconnectPhoneAudio: (meeting, phoneUrl) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const options = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n phoneUrl,\n };\n\n return meeting.meetingRequest.disconnectPhoneAudio(options).catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n\n /**\n * Returns options for leaving a meeting.\n * @param {any} meeting\n * @param {any} options\n * @returns {any} leave options\n */\n prepareLeaveMeetingOptions: (meeting, options: any = {}) => {\n const defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl,\n };\n\n return {...defaultOptions, ...options};\n },\n\n // by default will leave on meeting's resourceId\n // if you explicity want it not to leave on resource id, pass\n // {resourceId: null}\n // TODO: chris, you can modify this however you want\n leaveMeeting: (meeting, options: any = {}) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n // TODO: clean up if the meeting is already inactive\n return Promise.reject(new MeetingNotActiveError());\n }\n\n if (MeetingUtil.isUserInLeftState(meeting.locusInfo)) {\n return Promise.reject(new UserNotJoinedError());\n }\n\n const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then(() => {\n if (options.moveMeeting) {\n return Promise.resolve();\n }\n\n return MeetingUtil.cleanUp(meeting);\n })\n .catch((err) => {\n // TODO: If the meeting state comes as LEFT or INACTIVE as response then\n // 1) on leave clean up the meeting or simply do a sync on the meeting\n // 2) If the error says meeting is inactive then destroy the meeting object\n LoggerProxy.logger.error(\n `Meeting:util#leaveMeeting --> An error occured while trying to leave meeting with an id of ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n declineMeeting: (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason,\n }),\n\n isUserInLeftState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _LEFT_,\n\n isUserInIdleState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _IDLE_,\n\n isUserInJoinedState: (locusInfo) => locusInfo.parsedLocus?.self?.state === _JOINED_,\n\n isMediaEstablished: (currentMediaStatus) =>\n currentMediaStatus &&\n (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share),\n\n joinMeetingOptions: (meeting, options: any = {}) => {\n const webex = meeting.getWebexObject();\n\n meeting.resourceId = meeting.resourceId || options.resourceId;\n\n if (meeting.requiredCaptcha) {\n return Promise.reject(new CaptchaError());\n }\n if (meeting.passwordStatus === PASSWORD_STATUS.REQUIRED) {\n return Promise.reject(new PasswordError());\n }\n\n if (options.pin) {\n // @ts-ignore\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.pin.collected',\n options: {\n meetingId: meeting.id,\n },\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options).catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n webex.internal.newMetrics.submitClientEvent({\n name: 'client.pin.prompt',\n options: {\n meetingId: meeting.id,\n },\n });\n\n // request host pin or non host for unclaimed PMR, start of Scenario C\n // see https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-Lobby-and--IVR-Feature\n return Promise.reject(new IntentToJoinError('Error Joining Meeting', err));\n }\n LoggerProxy.logger.error('Meeting:util#joinMeetingOptions --> Error joining the call, ', err);\n\n return Promise.reject(new JoinMeetingError(options, 'Error Joining Meeting', err));\n });\n },\n\n /**\n * Returns request options for leaving a meeting.\n * @param {any} meeting\n * @param {any} options\n * @returns {any} request options\n */\n buildLeaveFetchRequestOptions: (meeting, options: any = {}) => {\n const leaveOptions = MeetingUtil.prepareLeaveMeetingOptions(meeting, options);\n\n return meeting.meetingRequest.buildLeaveMeetingRequestOptions(leaveOptions);\n },\n\n getTrack: (stream) => {\n let audioTrack = null;\n let videoTrack = null;\n let audioTracks = null;\n let videoTracks = null;\n\n if (!stream) {\n return {audioTrack: null, videoTrack: null};\n }\n if (stream.getAudioTracks) {\n audioTracks = stream.getAudioTracks();\n }\n if (stream.getVideoTracks) {\n videoTracks = stream.getVideoTracks();\n }\n\n if (audioTracks && audioTracks.length > 0) {\n [audioTrack] = audioTracks;\n }\n\n if (videoTracks && videoTracks.length > 0) {\n [videoTrack] = videoTracks;\n }\n\n return {audioTrack, videoTrack};\n },\n\n getModeratorFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator,\n\n getPolicyFromLocusInfo: (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy,\n\n getUserDisplayHintsFromLocusInfo: (locusInfo) =>\n locusInfo?.parsedLocus?.info?.userDisplayHints || [],\n\n canInviteNewParticipants: (displayHints) => displayHints.includes(DISPLAY_HINTS.ADD_GUEST),\n\n canAdmitParticipant: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.ROSTER_WAITING_TO_JOIN),\n\n canUserLock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_LOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_UNLOCKED),\n\n canUserUnlock: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOCK_CONTROL_UNLOCK) &&\n displayHints.includes(DISPLAY_HINTS.LOCK_STATUS_LOCKED),\n\n canUserRaiseHand: (displayHints) => displayHints.includes(DISPLAY_HINTS.RAISE_HAND),\n\n canUserLowerAllHands: (displayHints) => displayHints.includes(DISPLAY_HINTS.LOWER_ALL_HANDS),\n\n canUserLowerSomeoneElsesHand: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LOWER_SOMEONE_ELSES_HAND),\n\n bothLeaveAndEndMeetingAvailable: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.LEAVE_TRANSFER_HOST_END_MEETING) ||\n displayHints.includes(DISPLAY_HINTS.LEAVE_END_MEETING),\n\n canManageBreakout: (displayHints) => displayHints.includes(DISPLAY_HINTS.BREAKOUT_MANAGEMENT),\n\n canStartBreakout: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_START),\n\n canBroadcastMessageToBreakout: (displayHints, policies = {}) =>\n displayHints.includes(DISPLAY_HINTS.BROADCAST_MESSAGE_TO_BREAKOUT) &&\n !!policies[SELF_POLICY.SUPPORT_BROADCAST_MESSAGE],\n\n isSuppressBreakoutSupport: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.UCF_SUPPRESS_BREAKOUTS_SUPPORT),\n\n canAdmitLobbyToBreakout: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_LOBBY_TO_BREAKOUT),\n\n isBreakoutPreassignmentsEnabled: (displayHints) =>\n !displayHints.includes(DISPLAY_HINTS.DISABLE_BREAKOUT_PREASSIGNMENTS),\n\n canUserAskForHelp: (displayHints) => !displayHints.includes(DISPLAY_HINTS.DISABLE_ASK_FOR_HELP),\n\n lockMeeting: (actions, request, locusUrl) => {\n if (actions && actions.canLock) {\n return request.lockMeeting({locusUrl, lock: true});\n }\n\n return Promise.reject(new PermissionError('Lock not allowed, due to joined property.'));\n },\n\n unlockMeeting: (actions, request, locusUrl) => {\n if (actions && actions.canUnlock) {\n return request.lockMeeting({locusUrl, lock: false});\n }\n\n return Promise.reject(new PermissionError('Unlock not allowed, due to joined property.'));\n },\n\n handleAudioLogging: (audioStream?: LocalMicrophoneStream) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioStream) {\n const settings = audioStream.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n },\n\n handleVideoLogging: (videoStream?: LocalCameraStream) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoStream) {\n const settings = videoStream.getSettings();\n const {deviceId} = settings;\n\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings =', JSON.stringify(settings));\n }\n },\n\n endMeetingForAll: (meeting) => {\n if (meeting.meetingState === FULL_STATE.INACTIVE) {\n return Promise.reject(new MeetingNotActiveError());\n }\n\n const endOptions = {\n locusUrl: meeting.locusUrl,\n };\n\n return meeting.meetingRequest\n .endMeetingForAll(endOptions)\n .then(() => MeetingUtil.cleanUp(meeting))\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#endMeetingForAll An error occured while trying to end meeting for all with an id of ${meeting.id}, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n },\n\n canEnableClosedCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAPTION_START),\n\n isSaveTranscriptsEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.SAVE_TRANSCRIPTS_ENABLED),\n\n canStartTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_START),\n\n canStopTranscribing: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.TRANSCRIPTION_CONTROL_STOP),\n\n isClosedCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAPTION_STATUS_ACTIVE),\n\n canStartManualCaption: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_START),\n\n canStopManualCaption: (displayHints) => displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STOP),\n\n isManualCaptionActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.MANUAL_CAPTION_STATUS_ACTIVE),\n\n isWebexAssistantActive: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.WEBEX_ASSISTANT_STATUS_ACTIVE),\n\n canViewCaptionPanel: (displayHints) => displayHints.includes(DISPLAY_HINTS.ENABLE_CAPTION_PANEL),\n\n isRealTimeTranslationEnabled: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_REAL_TIME_TRANSLATION),\n\n canSelectSpokenLanguages: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.DISPLAY_NON_ENGLISH_ASR),\n\n waitingForOthersToJoin: (displayHints) => displayHints.includes(DISPLAY_HINTS.WAITING_FOR_OTHERS),\n\n canSendReactions: (originalValue, displayHints) => {\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_ACTIVE)) {\n return true;\n }\n if (displayHints.includes(DISPLAY_HINTS.REACTIONS_INACTIVE)) {\n return false;\n }\n\n return originalValue;\n },\n canUserRenameSelfAndObserved: (displayHints) =>\n displayHints.includes(DISPLAY_HINTS.CAN_RENAME_SELF_AND_OBSERVED),\n\n canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),\n\n // Default empty value for policies if we get an undefined value (ie permissionToken is not available)\n canShareWhiteBoard: (displayHints, policies = {}) =>\n displayHints.includes(DISPLAY_HINTS.SHARE_WHITEBOARD) &&\n !!policies[SELF_POLICY.SUPPORT_WHITEBOARD],\n\n /**\n * Adds the current locus sequence information to a request body\n * @param {Object} meeting The meeting object\n * @param {Object} requestBody The body of a request to locus\n * @returns {void}\n */\n addSequence: (meeting, requestBody) => {\n const sequence = meeting?.locusInfo?.sequence;\n\n if (!sequence) {\n return;\n }\n\n requestBody.sequence = sequence;\n },\n\n /**\n * Updates the locus info for the meeting with the delta locus\n * returned from requests that include the sequence information\n * Returns the original response object\n * @param {Object} meeting The meeting object\n * @param {Object} response The response of the http request\n * @returns {Object}\n */\n updateLocusWithDelta: (meeting, response) => {\n if (!meeting) {\n return response;\n }\n\n const locus = response?.body?.locus;\n\n if (locus) {\n meeting.locusInfo.handleLocusDelta(locus, meeting);\n }\n\n return response;\n },\n\n generateBuildLocusDeltaRequestOptions: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const buildLocusDeltaRequestOptions = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return originalOptions;\n }\n\n const options = cloneDeep(originalOptions);\n\n if (!options.body) {\n options.body = {};\n }\n\n MeetingUtil.addSequence(meeting, options.body);\n\n return options;\n };\n\n return buildLocusDeltaRequestOptions;\n },\n\n generateLocusDeltaRequest: (originalMeeting) => {\n const meetingRef = new WeakRef(originalMeeting);\n\n const buildLocusDeltaRequestOptions =\n MeetingUtil.generateBuildLocusDeltaRequestOptions(originalMeeting);\n\n const locusDeltaRequest = (originalOptions) => {\n const meeting = meetingRef.deref();\n\n if (!meeting) {\n return Promise.resolve();\n }\n\n const options = buildLocusDeltaRequestOptions(originalOptions);\n\n return meeting\n .request(options)\n .then((response) => MeetingUtil.updateLocusWithDelta(meeting, response));\n };\n\n return locusDeltaRequest;\n },\n\n selfSupportsFeature: (feature: SELF_POLICY, userPolicies: Record<SELF_POLICY, boolean>) => {\n if (!userPolicies) {\n return true;\n }\n\n return userPolicies[feature];\n },\n\n parseInterpretationInfo: (meeting, meetingInfo) => {\n if (!meeting || !meetingInfo) {\n return;\n }\n const siInfo = meetingInfo.simultaneousInterpretation;\n meeting.simultaneousInterpretation.updateMeetingSIEnabled(\n !!meetingInfo.turnOnSimultaneousInterpretation,\n !!siInfo?.currentSIInterpreter\n );\n const hostSIEnabled = !!(\n meetingInfo.turnOnSimultaneousInterpretation &&\n meetingInfo?.meetingSiteSetting?.enableHostInterpreterControlSI\n );\n meeting.simultaneousInterpretation.updateHostSIEnabled(hostSIEnabled);\n\n function renameKey(obj, oldKey, newKey) {\n if (oldKey in obj) {\n obj[newKey] = obj[oldKey];\n delete obj[oldKey];\n }\n }\n if (siInfo) {\n const lanuagesInfo = cloneDeep(siInfo.siLanguages);\n for (const language of lanuagesInfo) {\n renameKey(language, 'languageCode', 'languageName');\n renameKey(language, 'languageGroupId', 'languageCode');\n }\n if (!meeting.simultaneousInterpretation?.siLanguages?.length) {\n meeting.simultaneousInterpretation.updateInterpretation({siLanguages: lanuagesInfo});\n }\n }\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'parseInterpretationInfo',\n },\n EVENT_TRIGGERS.MEETING_INTERPRETATION_UPDATE\n );\n },\n\n /**\n * Returns a CA-recognized error payload for the specified raw error message/reason.\n *\n * New errors can be added to this function for handling in the future\n *\n * @param {String} reason the raw error message\n * @returns {Array<object>} an array of payload objects\n */\n getChangeMeetingFloorErrorPayload: (reason: string) => {\n const errorPayload = {\n errorDescription: reason,\n name: 'locus.response',\n shownToUser: false,\n };\n if (reason.includes(LOCAL_SHARE_ERRORS.UNDEFINED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 1100,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.DEVICE_NOT_JOINED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4050,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.NO_MEDIA_FOR_DEVICE)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'media',\n errorCode: 2048,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.NO_CONFLUENCE_ID)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4064,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.CONTENT_SHARING_DISABLED)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'expected',\n errorCode: 4065,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.LOCUS_PARTICIPANT_DNE)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 4066,\n },\n ];\n }\n if (reason.includes(LOCAL_SHARE_ERRORS.CONTENT_REQUEST_WHILE_PENDING_WHITEBOARD)) {\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'expected',\n errorCode: 4067,\n },\n ];\n }\n\n // return unknown error\n return [\n {\n ...errorPayload,\n fatal: true,\n category: 'signaling',\n errorCode: 1100,\n },\n ];\n },\n};\n\nexport default MeetingUtil;\n"],"mappings":"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"}
|
@@ -47,11 +47,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
47
47
|
(0, _defineProperty2.default)(this, "turnInfo", void 0);
|
48
48
|
(0, _defineProperty2.default)(this, "responseTimer", void 0);
|
49
49
|
this.roapRequest = roapRequest;
|
50
|
-
this.
|
51
|
-
urls: [],
|
52
|
-
username: '',
|
53
|
-
password: ''
|
54
|
-
};
|
50
|
+
this.resetTurnInfo();
|
55
51
|
}
|
56
52
|
|
57
53
|
/**
|
@@ -62,6 +58,19 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
62
58
|
* @memberof Roap
|
63
59
|
*/
|
64
60
|
(0, _createClass2.default)(TurnDiscovery, [{
|
61
|
+
key: "resetTurnInfo",
|
62
|
+
value:
|
63
|
+
/** Resets the turnInfo structure to the defaults
|
64
|
+
* @returns {void}
|
65
|
+
*/
|
66
|
+
function resetTurnInfo() {
|
67
|
+
this.turnInfo = {
|
68
|
+
urls: [],
|
69
|
+
username: '',
|
70
|
+
password: ''
|
71
|
+
};
|
72
|
+
}
|
73
|
+
}, {
|
65
74
|
key: "waitForTurnDiscoveryResponse",
|
66
75
|
value: function waitForTurnDiscoveryResponse() {
|
67
76
|
if (!this.defer) {
|
@@ -113,6 +122,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
113
122
|
multipleAllowed: false
|
114
123
|
}];
|
115
124
|
var foundHeaders = {};
|
125
|
+
this.resetTurnInfo();
|
116
126
|
headers === null || headers === void 0 ? void 0 : headers.forEach(function (receivedHeader) {
|
117
127
|
// check if it matches any of our expected headers
|
118
128
|
expectedHeaders.forEach(function (expectedHeader) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","_types","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","turnInfo","urls","username","password","_createClass2","key","value","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","multipleAllowed","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","headerValue","substring","length","push","clearTimeout","undefined","some","header","filter","url","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","TurnDiscoverySkipReason","alreadyInProgress","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","missingHttpResponse","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","reachability","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport {TurnDiscoverySkipReason, TurnServerInfo, TurnDiscoveryResult} from './types';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n urls: [],\n username: '',\n password: '',\n };\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'urls', multipleAllowed: true},\n {headerName: 'x-cisco-turn-username', field: 'username', multipleAllowed: false},\n {headerName: 'x-cisco-turn-password', field: 'password', multipleAllowed: false},\n ];\n\n const foundHeaders = {};\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n foundHeaders[expectedHeader.headerName] = true;\n\n const headerValue = receivedHeader.substring(expectedHeader.headerName.length + 1);\n\n if (expectedHeader.multipleAllowed) {\n this.turnInfo[expectedHeader.field].push(headerValue);\n } else {\n // just store the last one we find\n this.turnInfo[expectedHeader.field] = headerValue;\n }\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (expectedHeaders.some((header) => !foundHeaders[header.headerName])) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, urls=${this.turnInfo.urls}`\n );\n\n this.turnInfo.urls = this.turnInfo.urls.filter((url) => url !== ''); // remove empty urls, we might get them if we land on video-mesh nodes (VMN)\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","_types","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","resetTurnInfo","_createClass2","key","value","turnInfo","urls","username","password","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","multipleAllowed","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","headerValue","substring","length","push","clearTimeout","undefined","some","header","filter","url","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","TurnDiscoverySkipReason","alreadyInProgress","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","missingHttpResponse","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","reachability","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport {TurnDiscoverySkipReason, TurnServerInfo, TurnDiscoveryResult} from './types';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /** Resets the turnInfo structure to the defaults\n * @returns {void}\n */\n private resetTurnInfo() {\n this.turnInfo = {\n urls: [],\n username: '',\n password: '',\n };\n }\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.resetTurnInfo();\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'urls', multipleAllowed: true},\n {headerName: 'x-cisco-turn-username', field: 'username', multipleAllowed: false},\n {headerName: 'x-cisco-turn-password', field: 'password', multipleAllowed: false},\n ];\n\n const foundHeaders = {};\n\n this.resetTurnInfo();\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n foundHeaders[expectedHeader.headerName] = true;\n\n const headerValue = receivedHeader.substring(expectedHeader.headerName.length + 1);\n\n if (expectedHeader.multipleAllowed) {\n this.turnInfo[expectedHeader.field].push(headerValue);\n } else {\n // just store the last one we find\n this.turnInfo[expectedHeader.field] = headerValue;\n }\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (expectedHeaders.some((header) => !foundHeaders[header.headerName])) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, urls=${this.turnInfo.urls}`\n );\n\n this.turnInfo.urls = this.turnInfo.urls.filter((url) => url !== ''); // remove empty urls, we might get them if we land on video-mesh nodes (VMN)\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
|
@@ -81,7 +81,7 @@ declare const MeetingUtil: {
|
|
81
81
|
canSendReactions: (originalValue: any, displayHints: any) => any;
|
82
82
|
canUserRenameSelfAndObserved: (displayHints: any) => any;
|
83
83
|
canUserRenameOthers: (displayHints: any) => any;
|
84
|
-
canShareWhiteBoard: (displayHints: any, policies
|
84
|
+
canShareWhiteBoard: (displayHints: any, policies?: {}) => boolean;
|
85
85
|
/**
|
86
86
|
* Adds the current locus sequence information to a request body
|
87
87
|
* @param {Object} meeting The meeting object
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
@@ -43,7 +43,7 @@
|
|
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.8.0-next.
|
46
|
+
"@webex/plugin-meetings": "3.8.0-next.38",
|
47
47
|
"@webex/plugin-rooms": "3.8.0-next.13",
|
48
48
|
"@webex/test-helper-chai": "3.8.0-next.11",
|
49
49
|
"@webex/test-helper-mocha": "3.8.0-next.11",
|
@@ -71,7 +71,7 @@
|
|
71
71
|
"@webex/internal-plugin-metrics": "3.8.0-next.11",
|
72
72
|
"@webex/internal-plugin-support": "3.8.0-next.13",
|
73
73
|
"@webex/internal-plugin-user": "3.8.0-next.11",
|
74
|
-
"@webex/internal-plugin-voicea": "3.8.0-next.
|
74
|
+
"@webex/internal-plugin-voicea": "3.8.0-next.38",
|
75
75
|
"@webex/media-helpers": "3.8.0-next.12",
|
76
76
|
"@webex/plugin-people": "3.8.0-next.13",
|
77
77
|
"@webex/plugin-rooms": "3.8.0-next.13",
|
@@ -92,5 +92,5 @@
|
|
92
92
|
"//": [
|
93
93
|
"TODO: upgrade jwt-decode when moving to node 18"
|
94
94
|
],
|
95
|
-
"version": "3.8.0-next.
|
95
|
+
"version": "3.8.0-next.38"
|
96
96
|
}
|
package/src/meeting/util.ts
CHANGED
@@ -575,7 +575,8 @@ const MeetingUtil = {
|
|
575
575
|
|
576
576
|
canUserRenameOthers: (displayHints) => displayHints.includes(DISPLAY_HINTS.CAN_RENAME_OTHERS),
|
577
577
|
|
578
|
-
|
578
|
+
// Default empty value for policies if we get an undefined value (ie permissionToken is not available)
|
579
|
+
canShareWhiteBoard: (displayHints, policies = {}) =>
|
579
580
|
displayHints.includes(DISPLAY_HINTS.SHARE_WHITEBOARD) &&
|
580
581
|
!!policies[SELF_POLICY.SUPPORT_WHITEBOARD],
|
581
582
|
|
@@ -31,6 +31,17 @@ export default class TurnDiscovery {
|
|
31
31
|
|
32
32
|
private responseTimer?: ReturnType<typeof setTimeout>;
|
33
33
|
|
34
|
+
/** Resets the turnInfo structure to the defaults
|
35
|
+
* @returns {void}
|
36
|
+
*/
|
37
|
+
private resetTurnInfo() {
|
38
|
+
this.turnInfo = {
|
39
|
+
urls: [],
|
40
|
+
username: '',
|
41
|
+
password: '',
|
42
|
+
};
|
43
|
+
}
|
44
|
+
|
34
45
|
/**
|
35
46
|
* Constructor
|
36
47
|
*
|
@@ -38,11 +49,7 @@ export default class TurnDiscovery {
|
|
38
49
|
*/
|
39
50
|
constructor(roapRequest: RoapRequest) {
|
40
51
|
this.roapRequest = roapRequest;
|
41
|
-
this.
|
42
|
-
urls: [],
|
43
|
-
username: '',
|
44
|
-
password: '',
|
45
|
-
};
|
52
|
+
this.resetTurnInfo();
|
46
53
|
}
|
47
54
|
|
48
55
|
/**
|
@@ -119,6 +126,8 @@ export default class TurnDiscovery {
|
|
119
126
|
|
120
127
|
const foundHeaders = {};
|
121
128
|
|
129
|
+
this.resetTurnInfo();
|
130
|
+
|
122
131
|
headers?.forEach((receivedHeader) => {
|
123
132
|
// check if it matches any of our expected headers
|
124
133
|
expectedHeaders.forEach((expectedHeader) => {
|
@@ -394,6 +394,44 @@ describe('TurnDiscovery', () => {
|
|
394
394
|
'failure: TURN_DISCOVERY_RESPONSE in http response has unexpected messageType: {"seq":"0","messageType":"ERROR"}'
|
395
395
|
);
|
396
396
|
});
|
397
|
+
|
398
|
+
it('resets turnInfo each time TURN discovery is done', async () => {
|
399
|
+
const runCheck = async (td, turnUrl, expectedResult) => {
|
400
|
+
mockRoapRequest.sendRoap = sinon.fake.resolves({
|
401
|
+
mediaConnections: [
|
402
|
+
{
|
403
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
404
|
+
remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${turnUrl}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
|
405
|
+
},
|
406
|
+
],
|
407
|
+
});
|
408
|
+
|
409
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
410
|
+
|
411
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
412
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
413
|
+
|
414
|
+
// @ts-ignore
|
415
|
+
mockRoapRequest.sendRoap.resetHistory();
|
416
|
+
|
417
|
+
await checkResult(result, undefined, expectedResult);
|
418
|
+
};
|
419
|
+
|
420
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
421
|
+
|
422
|
+
await runCheck(td, FAKE_TURN_URL1, {
|
423
|
+
urls: [FAKE_TURN_URL1],
|
424
|
+
username: FAKE_TURN_USERNAME,
|
425
|
+
password: FAKE_TURN_PASSWORD,
|
426
|
+
});
|
427
|
+
|
428
|
+
// call it again with different turn url, the result should not have the previous url
|
429
|
+
await runCheck(td, FAKE_TURN_URL2, {
|
430
|
+
urls: [FAKE_TURN_URL2],
|
431
|
+
username: FAKE_TURN_USERNAME,
|
432
|
+
password: FAKE_TURN_PASSWORD,
|
433
|
+
});
|
434
|
+
});
|
397
435
|
});
|
398
436
|
});
|
399
437
|
|