@webex/plugin-meetings 1.153.1 → 1.154.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/common/errors/webex-errors.js +27 -3
  2. package/dist/common/errors/webex-errors.js.map +1 -1
  3. package/dist/constants.js +20 -13
  4. package/dist/constants.js.map +1 -1
  5. package/dist/meeting/index.js +54 -41
  6. package/dist/meeting/index.js.map +1 -1
  7. package/dist/meeting/request.js +24 -20
  8. package/dist/meeting/request.js.map +1 -1
  9. package/dist/meeting/state.js +8 -15
  10. package/dist/meeting/state.js.map +1 -1
  11. package/dist/meeting/util.js +2 -1
  12. package/dist/meeting/util.js.map +1 -1
  13. package/dist/meetings/index.js +8 -1
  14. package/dist/meetings/index.js.map +1 -1
  15. package/dist/metrics/config.js +3 -1
  16. package/dist/metrics/config.js.map +1 -1
  17. package/dist/metrics/index.js +23 -9
  18. package/dist/metrics/index.js.map +1 -1
  19. package/dist/peer-connection-manager/index.js +63 -56
  20. package/dist/peer-connection-manager/index.js.map +1 -1
  21. package/dist/reconnection-manager/index.js +1 -1
  22. package/dist/reconnection-manager/index.js.map +1 -1
  23. package/dist/roap/handler.js +4 -4
  24. package/dist/roap/handler.js.map +1 -1
  25. package/package.json +5 -5
  26. package/src/common/errors/webex-errors.js +21 -2
  27. package/src/constants.js +16 -11
  28. package/src/meeting/index.js +85 -68
  29. package/src/meeting/request.js +10 -5
  30. package/src/meeting/state.js +8 -17
  31. package/src/meeting/util.js +2 -1
  32. package/src/meetings/index.js +14 -3
  33. package/src/metrics/config.js +1 -0
  34. package/src/metrics/index.js +23 -9
  35. package/src/peer-connection-manager/index.js +61 -60
  36. package/src/reconnection-manager/index.js +3 -3
  37. package/src/roap/handler.js +5 -5
  38. package/test/unit/spec/meeting/index.js +39 -7
  39. package/test/unit/spec/meeting/request.js +53 -1
  40. package/test/unit/spec/meeting/utils.js +41 -0
  41. package/test/unit/spec/meetings/index.js +3 -1
  42. package/test/unit/spec/metrics/index.js +6 -6
  43. package/test/unit/spec/peerconnection-manager/index.js +69 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["util.js"],"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","sipUri","meetingNumber","roapMessage","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","canUserLock","joined","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device"],"mappings":"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","sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n FULL_STATE,\n PASSWORD_STATUS\n} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\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';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\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\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\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 sipUri: meeting.sipUri,\n meetingNumber: meeting.meetingNumber,\n deviceUrl: meeting.deviceUrl,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n roapMessage: options.roapMessage,\n resourceId: options.resourceId || null,\n moderator: options.moderator,\n pin: options.pin,\n moveToResource: options.moveToResource,\n preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.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\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\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\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\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 defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\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 ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\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 Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\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\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.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\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.canUserLock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_LOCK && joined.LOCK_STATUS_UNLOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserUnlock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_UNLOCK && joined.LOCK_STATUS_LOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserRecord = (moderator) => moderator.RECORDING_CONTROL_START;\n\nMeetingUtil.canUserPause = (moderator) => moderator.RECORDING_CONTROL_PAUSE;\n\nMeetingUtil.canUserResume = (moderator) => moderator.RECORDING_CONTROL_RESUME;\n\nMeetingUtil.canUserStop = (moderator) => moderator.RECORDING_CONTROL_STOP;\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserRecord(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserPause(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserResume(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserStop(moderator)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.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\nMeetingUtil.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\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.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\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.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\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nexport default MeetingUtil;\n"]}
1
+ {"version":3,"sources":["util.js"],"names":["MeetingUtil","parseLocusJoin","response","parsed","locus","body","mediaConnections","locusUrl","url","locusId","split","pop","selfId","self","id","forEach","mediaConnection","mediaId","remoteUpdateAudioVideo","audioMuted","videoMuted","meeting","reject","ParameterError","localMedias","Media","generateLocalMedias","Metrics","postEvent","event","eventType","MEDIA_REQUEST","meetingRequest","remoteAudioVideoToggle","deviceUrl","correlationId","then","MEDIA_RESPONSE","hasOwner","info","owner","isOwnerSelf","isPinOrGuest","err","errorCode","INTENT_TO_JOIN","includes","joinMeeting","options","LOCUS_JOIN_REQUEST","inviteeAddress","meetingJoinUrl","sipUri","meetingNumber","roapMessage","permissionToken","resourceId","moderator","pin","moveToResource","preferTranscoding","asResourceOccupant","res","LOCUS_JOIN_RESPONSE","data","trigger","LOCI_UPDATE","trackingId","headers","trackingid","cleanUp","statsAnalyzer","stopAnalyzer","closeLocalStream","closeLocalShare","closeRemoteTracks","closePeerConnections","unsetLocalVideoTrack","unsetLocalShareTrack","unsetRemoteTracks","unsetPeerConnections","cleanMQAInterval","reconnectionManager","roap","stop","roapSeq","disconnectPhoneAudio","phoneUrl","meetingState","FULL_STATE","INACTIVE","MeetingNotActiveError","locusInfo","onFullLocus","catch","LoggerProxy","logger","error","leaveMeeting","isUserInLeftState","UserNotJoinedError","defaultOptions","leaveOptions","resolve","moveMeeting","declineMeeting","reason","parsedLocus","state","_LEFT_","isUserInIdleState","_IDLE_","isUserInJoinedState","_JOINED_","isMediaEstablished","currentMediaStatus","audio","video","share","joinMeetingOptions","requiredCaptcha","CaptchaError","passwordStatus","PASSWORD_STATUS","REQUIRED","PasswordError","PIN_COLLECTED","setLocus","PIN_PROMPT","IntentToJoinError","JoinMeetingError","updateTransceiver","meetingOptions","type","sendTrack","receiveTrack","track","transceiver","peerConnection","previousMediaDirection","undefined","meetingId","remoteQualityLevel","mediaProperties","enableRtx","config","enableExtmap","sendRoapMediaRequest","sdp","e","sender","replaceTrack","validateOptions","sendVideo","sendAudio","sendShare","localStream","localShare","getTrack","videoTrack","audioTrack","stream","audioTracks","videoTracks","getAudioTracks","getVideoTracks","length","getModeratorFromLocusInfo","getPolicyFromLocusInfo","policy","canUserLock","joined","LOCK_CONTROL_LOCK","LOCK_STATUS_UNLOCKED","canUserUnlock","LOCK_CONTROL_UNLOCK","LOCK_STATUS_LOCKED","canUserRecord","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","startRecording","request","recordMeeting","recording","paused","PermissionError","pauseRecording","resumeRecording","stopRecording","lockMeeting","actions","canLock","lock","unlockMeeting","canUnlock","startInternalStats","internalStats","useConfig","senders","correlate","history","onEvent","kind","stat","Trigger","file","function","EVENT_TRIGGERS","MEETING_MEDIA_LOCAL_STARTED","mediaType","AUDIO","SENDING_MEDIA_START","SENDING_MEDIA_STOP","onData","VIDEO","SHARE","SENDING_SHARE_START","SENDING_SHARE_STOP","receivers","MEETING_MEDIA_REMOTE_STARTED","RECEIVING_MEDIA_START","RECEIVING_MEDIA_STOP","StatsUtil","generateOptions","STATS","CONFIG","WebRTCStats","attrs","handleAudioLogging","LOG_HEADER","settings","getSettings","deviceId","log","handleVideoLogging","handleDeviceLogging","devices","device"],"mappings":"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","sourcesContent":["import {isEmpty} from 'lodash';\n\nimport {MeetingNotActiveError, UserNotJoinedError} from '../common/errors/webex-errors';\nimport StatsUtil from '../stats/util';\nimport Metrics from '../metrics';\nimport {eventType, trigger, mediaType} from '../metrics/config';\nimport Media from '../media';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport WebRTCStats from '../stats/index';\nimport {\n INTENT_TO_JOIN,\n _LEFT_,\n _IDLE_,\n _JOINED_,\n STATS,\n EVENT_TRIGGERS,\n FULL_STATE,\n PASSWORD_STATUS\n} from '../constants';\nimport Trigger from '../common/events/trigger-proxy';\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';\n\nconst MeetingUtil = {};\n\nMeetingUtil.parseLocusJoin = (response) => {\n const parsed = {};\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\nMeetingUtil.remoteUpdateAudioVideo = (audioMuted, videoMuted, meeting) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n const localMedias = Media.generateLocalMedias(meeting.mediaId, audioMuted, videoMuted);\n\n if (isEmpty(localMedias)) {\n return Promise.reject(new ParameterError('You need a media id on the meeting to change remote audio.'));\n }\n\n Metrics.postEvent({event: eventType.MEDIA_REQUEST, meeting});\n\n return meeting.meetingRequest.remoteAudioVideoToggle({\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n localMedias,\n deviceUrl: meeting.deviceUrl,\n correlationId: meeting.correlationId\n }).then((response) => {\n Metrics.postEvent({event: eventType.MEDIA_RESPONSE, meeting});\n\n return response.body.locus;\n });\n};\n\nMeetingUtil.hasOwner = (info) => info && info.owner;\n\nMeetingUtil.isOwnerSelf = (owner, selfId) => owner === selfId;\n\nMeetingUtil.isPinOrGuest = (err) => err?.body?.errorCode && INTENT_TO_JOIN.includes(err.body.errorCode);\n\nMeetingUtil.joinMeeting = (meeting, options) => {\n if (!meeting) {\n return Promise.reject(new ParameterError('You need a meeting object.'));\n }\n\n Metrics.postEvent({event: eventType.LOCUS_JOIN_REQUEST, meeting});\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 correlationId: meeting.correlationId,\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 preferTranscoding: options.preferTranscoding,\n asResourceOccupant: options.asResourceOccupant\n })\n .then((res) => {\n Metrics.postEvent({\n event: eventType.LOCUS_JOIN_RESPONSE,\n meeting,\n data: {\n trigger: trigger.LOCI_UPDATE,\n locus: res.body.locus,\n mediaConnections: res.body.mediaConnections,\n trackingId: res.headers.trackingid\n }\n });\n\n return MeetingUtil.parseLocusJoin(res);\n });\n};\n\nMeetingUtil.cleanUp = (meeting) => {\n // make sure we send last metrics before we close the peerconnection\n if (meeting.statsAnalyzer) meeting.statsAnalyzer.stopAnalyzer();\n\n return meeting.closeLocalStream()\n .then(() => meeting.closeLocalShare())\n .then(() => meeting.closeRemoteTracks())\n .then(() => meeting.closePeerConnections())\n .then(() => {\n meeting.unsetLocalVideoTrack();\n meeting.unsetLocalShareTrack();\n meeting.unsetRemoteTracks();\n meeting.unsetPeerConnections();\n meeting.cleanMQAInterval();\n meeting.reconnectionManager.cleanUp();\n })\n .then(() => meeting.roap.stop(meeting.correlationId, meeting.roapSeq));\n};\n\nMeetingUtil.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\n .disconnectPhoneAudio(options)\n .then((response) => {\n if (response?.body?.locus) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.error(\n `Meeting:util#disconnectPhoneAudio --> An error occured while disconnecting phone audio in meeting ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\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\nMeetingUtil.leaveMeeting = (meeting, options = {}) => {\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 defaultOptions = {\n locusUrl: meeting.locusUrl,\n selfId: meeting.selfId,\n correlationId: meeting.correlationId,\n resourceId: meeting.resourceId,\n deviceUrl: meeting.deviceUrl\n };\n\n const leaveOptions = {...defaultOptions, ...options};\n\n return meeting.meetingRequest\n .leaveMeeting(leaveOptions)\n .then((response) => {\n if (response && response.body && response.body.locus) { // && !options.moveMeeting) {\n meeting.locusInfo.onFullLocus(response.body.locus);\n }\n\n return Promise.resolve();\n })\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 ${\n meeting.id\n }, error: ${err}`\n );\n\n return Promise.reject(err);\n });\n};\nMeetingUtil.declineMeeting = (meeting, reason) =>\n meeting.meetingRequest.declineMeeting({\n locusUrl: meeting.locusUrl,\n deviceUrl: meeting.deviceUrl,\n reason\n });\n\nMeetingUtil.isUserInLeftState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _LEFT_;\n\nMeetingUtil.isUserInIdleState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _IDLE_;\n\nMeetingUtil.isUserInJoinedState = (locusInfo) =>\n locusInfo.parsedLocus?.self?.state === _JOINED_;\n\nMeetingUtil.isMediaEstablished = (currentMediaStatus) =>\n currentMediaStatus && (currentMediaStatus.audio || currentMediaStatus.video || currentMediaStatus.share);\n\n\nMeetingUtil.joinMeetingOptions = (meeting, options = {}) => {\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 Metrics.postEvent({\n event: eventType.PIN_COLLECTED,\n meeting\n });\n }\n\n // normal join meeting, scenario A, D\n return MeetingUtil.joinMeeting(meeting, options)\n .then((response) => {\n meeting.setLocus(response);\n\n return Promise.resolve(response);\n })\n .catch((err) => {\n // joining a claimed PMR that is not my own, scenario B\n if (MeetingUtil.isPinOrGuest(err)) {\n Metrics.postEvent({\n event: eventType.PIN_PROMPT,\n meeting\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\nMeetingUtil.updateTransceiver = (options, meetingOptions) => {\n const {\n type,\n sendTrack,\n receiveTrack,\n track,\n transceiver,\n peerConnection,\n previousMediaDirection\n } = options;\n\n if ((sendTrack !== undefined && sendTrack !== previousMediaDirection.sendTrack) ||\n (receiveTrack !== undefined && receiveTrack !== previousMediaDirection.receiveTrack)) {\n return Media.updateTransceiver({\n meetingId: meetingOptions.meeting.id,\n remoteQualityLevel: meetingOptions.mediaProperties.remoteQualityLevel,\n enableRtx: meetingOptions.meeting.config.enableRtx,\n enableExtmap: meetingOptions.meeting.config.enableExtmap\n }, peerConnection, transceiver,\n {\n track,\n type,\n receiveTrack,\n sendTrack\n })\n .then(() => meetingOptions.meeting.roap\n .sendRoapMediaRequest({\n sdp: meetingOptions.mediaProperties.peerConnection.sdp,\n roapSeq: meetingOptions.meeting.roapSeq,\n meeting: meetingOptions.meeting // or can pass meeting ID\n }))\n .catch((e) => {\n LoggerProxy.logger.error(`Meeting:util#updateTransceiver --> Error updating the ${type} streams with error: ${e}`);\n });\n } if (track) {\n transceiver.sender.replaceTrack(track);\n\n return Promise.resolve();\n }\n\n return Promise.reject(new ParameterError('update Failed: please pass valid parameter'));\n};\n\nMeetingUtil.validateOptions = (options) => {\n const {\n sendVideo, sendAudio, sendShare, localStream, localShare\n } = options;\n\n if (sendVideo && !MeetingUtil.getTrack(localStream).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid video streams'));\n }\n\n if (sendAudio && !MeetingUtil.getTrack(localStream).audioTrack) {\n return Promise.reject(new ParameterError('please pass valid audio streams'));\n }\n\n if (sendShare && !MeetingUtil.getTrack(localShare).videoTrack) {\n return Promise.reject(new ParameterError('please pass valid share streams'));\n }\n\n return Promise.resolve();\n};\n\nMeetingUtil.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\nMeetingUtil.getModeratorFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.moderator;\n\nMeetingUtil.getPolicyFromLocusInfo = (locusInfo) =>\n locusInfo &&\n locusInfo.parsedLocus &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info &&\n locusInfo.parsedLocus.info.policy;\n\nMeetingUtil.canUserLock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_LOCK && joined.LOCK_STATUS_UNLOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserUnlock = (moderator, joined) => {\n if (moderator.LOCK_CONTROL_UNLOCK && joined.LOCK_STATUS_LOCKED) {\n return true;\n }\n\n return false;\n};\n\nMeetingUtil.canUserRecord = (moderator) => moderator.RECORDING_CONTROL_START;\n\nMeetingUtil.canUserPause = (moderator) => moderator.RECORDING_CONTROL_PAUSE;\n\nMeetingUtil.canUserResume = (moderator) => moderator.RECORDING_CONTROL_RESUME;\n\nMeetingUtil.canUserStop = (moderator) => moderator.RECORDING_CONTROL_STOP;\n\nMeetingUtil.startRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserRecord(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Start recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.pauseRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserPause(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: true});\n }\n\n return Promise.reject(new PermissionError('Pause recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.resumeRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserResume(moderator)) {\n return request.recordMeeting({locusUrl, recording: true, paused: false});\n }\n\n return Promise.reject(new PermissionError('Resume recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.stopRecording = (request, locusUrl, locusInfo) => {\n const moderator = MeetingUtil.getModeratorFromLocusInfo(locusInfo);\n\n if (moderator && MeetingUtil.canUserStop(moderator)) {\n return request.recordMeeting({locusUrl, recording: false, paused: false});\n }\n\n return Promise.reject(new PermissionError('Stop recording not allowed, due to moderator property.'));\n};\n\nMeetingUtil.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\nMeetingUtil.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\nMeetingUtil.startInternalStats = (meeting) => {\n if (!meeting.internalStats) {\n const options = {\n useConfig: true,\n senders: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n // TODO: we don't need checks like this since it comes from the transceiver\n // refactor event linkage to use callbacks instead of events\n if (event.kind === 'audio' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesSent') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_LOCAL_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesSent') {\n Metrics.postEvent({\n event: eventType.SENDING_SHARE_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ],\n receivers: [\n {\n id: 'mainAudio',\n correlate: 'audio',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'audio' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.AUDIO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.AUDIO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainVideo',\n correlate: 'video',\n history: true,\n onEvent: (event) => {\n if (event.kind === 'video' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.VIDEO\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.VIDEO\n }\n });\n }\n },\n onData: () => {}\n },\n {\n id: 'mainShare',\n correlate: 'video',\n onEvent: (event) => {\n if (event.kind === 'share' && event.stat === 'bytesReceived') {\n Trigger.trigger(\n meeting,\n {\n file: 'meeting/util',\n function: 'startInternalStats'\n },\n EVENT_TRIGGERS.MEETING_MEDIA_REMOTE_STARTED,\n {\n type: mediaType.SHARE\n }\n );\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_START,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n else if (event.stop && event.stat === 'bytesReceived') {\n Metrics.postEvent({\n event: eventType.RECEIVING_MEDIA_STOP,\n meeting,\n data: {\n mediaType: mediaType.SHARE\n }\n });\n }\n },\n onData: () => {}\n }\n ]\n };\n\n StatsUtil.generateOptions(options, STATS.CONFIG, meeting);\n\n options.config = STATS.CONFIG;\n\n // pass the attrs and options for the webex instance\n meeting.internalStats = new WebRTCStats(meeting.attrs, meeting.options, options);\n }\n\n return meeting.internalStats;\n};\n\nMeetingUtil.handleAudioLogging = (audioTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleAudioLogging -->';\n\n if (audioTrack) {\n const settings = audioTrack.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\nMeetingUtil.handleVideoLogging = (videoTrack) => {\n const LOG_HEADER = 'MeetingUtil#handleVideoLogging -->';\n\n if (videoTrack) {\n const settings = videoTrack.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\nMeetingUtil.handleDeviceLogging = (devices = []) => {\n const LOG_HEADER = 'MeetingUtil#handleDeviceLogging -->';\n\n devices.forEach((device) => {\n LoggerProxy.logger.log(LOG_HEADER, `deviceId = ${device.deviceId}`);\n LoggerProxy.logger.log(LOG_HEADER, 'settings', JSON.stringify(device));\n });\n};\n\nexport default MeetingUtil;\n"]}
@@ -518,9 +518,16 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
518
518
  }, _constants.EVENT_TRIGGERS.MEETINGS_REGISTERED);
519
519
 
520
520
  _this5.registered = true;
521
+
522
+ _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS);
521
523
  }).catch(function (error) {
522
524
  _loggerProxy.default.logger.error("Meetings:index#register --> ERROR, Unable to register, ".concat(error.message));
523
525
 
526
+ _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED, {
527
+ reason: error.message,
528
+ stack: error.stack
529
+ });
530
+
524
531
  return _promise.default.reject(error);
525
532
  });
526
533
  }
@@ -599,7 +606,7 @@ var Meetings = /*#__PURE__*/function (_WebexPlugin) {
599
606
  reason: uploadError
600
607
  });
601
608
 
602
- _metrics.default.sendOperationalMetric(_constants.METRICS_OPERATIONAL_MEASURES.UPLOAD_LOGS_FAILURE, {
609
+ _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE, {
603
610
  meetingId: options.meetingsId,
604
611
  reason: uploadError.message,
605
612
  stack: uploadError.stack,
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","LoggerProxy","set","logger","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","eventType","LOCUSEVENT","DIFFERENCE","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","reason","sendOperationalMetric","METRICS_OPERATIONAL_MEASURES","UPLOAD_LOGS_FAILURE","meetingsId","stack","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","fetchMeetingInfo","CaptchaError","PasswordError","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAwBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,YAAY,EAAEC,eAAMD,YADT;AAEXE,MAAAA,kBAAkB,EAAED,eAAMC;AAFf,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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n METRICS_OPERATIONAL_MEASURES\n} from '../constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n LoggerProxy.set(this.webex.logger);\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n if (data.eventType === LOCUSEVENT.DIFFERENCE) {\n // its a delta object and we have a new meeting\n meeting.locusInfo.initialSetup(data.locus, meeting);\n }\n else {\n // Its a new meeting and have a fresh locus object\n meeting.locusInfo.initialSetup(data.locus);\n }\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n this.personalMeetingRoom = new PersonalMeetingRoom({meetingInfo: this.meetingInfo}, {parent: this.webex});\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleUnifiedMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n this.config.experimental.enableUnifiedMeetings = changeState;\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendOperationalMetric(\n METRICS_OPERATIONAL_MEASURES.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n await meeting.fetchMeetingInfo({destination, type});\n }\n catch (err) {\n if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n }\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
1
+ {"version":3,"sources":["index.js"],"names":["Meetings","args","MEETINGS","request","Request","parent","webex","loggerRequest","LoggerRequest","meetingCollection","MeetingCollection","personalMeetingRoom","reachability","registered","media","getUserMedia","Media","getSupportedDevice","LoggerProxy","set","logger","onReady","MeetingsUtil","checkH264Support","disableNotifications","Metrics","initialSetup","data","meeting","getByKey","LOCUS_URL","locusUrl","CORRELATION_ID","checkForCorrelationId","internal","device","url","locus","SIP_URI","self","callbackInfo","callbackAddress","CONVERSATION_URL","conversationUrl","replaces","length","fullState","state","LOCUS","STATE","INACTIVE","warn","_LEFT_","removed","create","_LOCUS_ID_","then","newMeeting","eventType","LOCUSEVENT","DIFFERENCE","locusInfo","catch","e","console","log","finally","getMeetingByType","_ID_","id","postEvent","event","REMOTE_STARTED","trigger","MERCURY_EVENT","Trigger","file","function","EVENT_TRIGGERS","MEETING_ADDED","type","_MEETING_","_JOIN_","_INCOMING_","parse","envelope","MESSAGE_ROAP","handleLocusEvent","MEETINGS_NETWORK_DISCONNECTED","mercury","on","LOCUS_MERCURY","handleLocusMercury","ROAP","ROAP_MERCURY","handleRoapMercury","ONLINE","syncMeetings","OFFLINE","handleMercuryOffline","off","once","READY","StaticConfig","config","LoggerConfig","logging","meetingInfo","experimental","enableUnifiedMeetings","MeetingInfoV2","MeetingInfo","PersonalMeetingRoom","MEETINGS_READY","changeState","canAuthorize","error","reject","Error","info","resolve","all","getGeoHint","startReachability","message","register","connect","call","listenForEvents","MEETINGS_REGISTERED","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETINGS_REGISTRATION_SUCCESS","MEETINGS_REGISTRATION_FAILED","reason","stack","stopListeningForEvents","disconnect","unregister","MEETINGS_UNREGISTERED","options","uploadLogs","uploadResult","MEETING_LOG_UPLOAD_SUCCESS","meetingId","details","uploadError","MEETING_LOG_UPLOAD_FAILURE","UPLOAD_LOGS_FAILURE","meetingsId","code","Reachability","setReachability","getReachability","gatherReachability","fetchGeoHint","res","geoHintInfo","MeetingUtil","cleanUp","delete","MEETING_REMOVED","destination","fetchInfoOptions","targetDest","_CONVERSATION_URL_","createMeeting","createdMeeting","EVENTS","DESTROY_MEETING","payload","autoUploadLogs","callStart","lastActive","correlationId","feedbackId","locusId","webExMeetingId","destroy","REQUEST_UPLOAD_LOGS","meetingInstance","Meeting","userId","deviceUrl","orgId","roapSeq","meetingInfoProvider","fetchMeetingInfo","CaptchaError","PasswordError","debug","sipUri","setSipUri","meetingAddedType","getMeetingAddedType","value","getAll","getActiveMeetings","locusArray","activeLocusUrl","loci","forEach","push","meetingsCollection","includes","MEETING_REMOVED_REASON","NO_MEETINGS_TO_SYNC","scheduled","get","StatsAnalyzer","StatsCalculator","WebexPlugin"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;AACA;;AAEA;;AAEA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAwBA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AAEA;;AACA;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;IACqBA,Q;;;;;AAGjB;AACJ;AACA;AACA;AACA;AACA;AACI,sBAAqB;AAAA;;AAAA;;AAAA,sCAANC,IAAM;AAANA,MAAAA,IAAM;AAAA;;AACnB,oDAASA,IAAT;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AATyB,4FARTC,mBAQS;AAUnB,UAAKC,OAAL,GAAe,IAAIC,iBAAJ,CAAY,EAAZ,EAAgB;AAACC,MAAAA,MAAM,EAAE,MAAKC;AAAd,KAAhB,CAAf;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,aAAL,GAAqB,IAAIC,gBAAJ,CAAkB;AAACF,MAAAA,KAAK,EAAE,MAAKA;AAAb,KAAlB,CAArB;AACA,UAAKG,iBAAL,GAAyB,IAAIC,mBAAJ,EAAzB;AACA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,mBAAL,GAA2B,IAA3B;AACA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,YAAL,GAAoB,IAApB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,UAAL,GAAkB,KAAlB;AAEA;AACN;AACA;AACA;AACA;AACA;AACA;AACA;;AACM,UAAKC,KAAL,GAAa;AACXC,MAAAA,YAAY,EAAEC,eAAMD,YADT;AAEXE,MAAAA,kBAAkB,EAAED,eAAMC;AAFf,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","sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n*/\n\nimport '@webex/internal-plugin-mercury';\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport 'webrtc-adapter';\n\nimport Metrics from '../metrics';\nimport {trigger, eventType} from '../metrics/config';\nimport LoggerConfig from '../common/logs/logger-config';\nimport StaticConfig from '../common/config';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport LoggerRequest from '../common/logs/request';\nimport Trigger from '../common/events/trigger-proxy';\nimport Media from '../media';\nimport MeetingUtil from '../meeting/util';\nimport {\n MEETINGS,\n EVENTS,\n EVENT_TRIGGERS,\n READY,\n LOCUSEVENT,\n LOCUS_URL,\n ROAP,\n ONLINE,\n OFFLINE,\n _MEETING_,\n _JOIN_,\n _LOCUS_ID_,\n _INCOMING_,\n LOCUS,\n CORRELATION_ID,\n SIP_URI,\n _LEFT_,\n _ID_,\n MEETING_REMOVED_REASON,\n _CONVERSATION_URL_,\n CONVERSATION_URL,\n BEHAVIORAL_METRICS\n} from '../constants';\nimport MeetingInfo from '../meeting-info';\nimport MeetingInfoV2 from '../meeting-info/meeting-info-v2';\nimport Meeting from '../meeting';\nimport PersonalMeetingRoom from '../personal-meeting-room';\nimport Reachability from '../reachability';\nimport Request from '../meetings/request';\nimport StatsAnalyzer from '../analyzer/analyzer';\nimport StatsCalculator from '../analyzer/calculator';\nimport PasswordError from '../common/errors/password-error';\nimport CaptchaError from '../common/errors/captcha-error';\n\nimport MeetingCollection from './collection';\nimport MeetingsUtil from './util';\n\n\n/**\n * Meetings Ready Event\n * Emitted when the meetings instance on webex is ready\n * @event meetings:ready\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Network Disconnected Event\n * Emitted when the meetings instance is disconnected from\n * the internal mercury server\n * @event network:disconnected\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meetings Registered Event\n * Emitted when the meetings instance has been registered and listening\n * @event meetings:registered\n * @instance\n * @memberof Meetings\n */\n\n/**\n * Meeting Removed Event\n * Emitted when a meeting was removed from the cache of meetings\n * @event meeting:removed\n * @instance\n * @type {Object}\n * @property {String} meetingId the removed meeting\n * @property {Object} response the server response\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Meeting Added Event\n * Emitted when a meeting was added to the cache of meetings\n * @event meeting:added\n * @instance\n * @type {Object}\n * @property {String} meetingId the added meeting\n * @property {String} type what type of meeting it was\n * @memberof Meetings\n */\n\n/**\n * Maintain a cache of meetings and sync with services.\n * @class\n */\nexport default class Meetings extends WebexPlugin {\n namespace = MEETINGS;\n\n /**\n * Initializes the Meetings Plugin\n * @constructor\n * @public\n * @memberof Meetings\n */\n constructor(...args) {\n super(...args);\n\n /**\n * The Meetings request to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.request = new Request({}, {parent: this.webex});\n /**\n * Log upload request helper\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.loggerRequest = new LoggerRequest({webex: this.webex});\n this.meetingCollection = new MeetingCollection();\n /**\n * The PersonalMeetingRoom object to interact with server\n * @instance\n * @type {Object}\n * @public\n * @memberof Meetings\n */\n this.personalMeetingRoom = null;\n /**\n * The Reachability object to interact with server, starts as null until {@link Meeting#setReachability} is called\n * starts as null\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.reachability = null;\n\n /**\n * If the meetings plugin has been registered and listening via {@link Meetings#register}\n * @instance\n * @type {Boolean}\n * @public\n * @memberof Meetings\n */\n this.registered = false;\n\n /**\n * The public interface for the internal Media util files. These are helpful to expose outside the context\n * of a meeting so that a user can access media without creating a meeting instance.\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.media = {\n getUserMedia: Media.getUserMedia,\n getSupportedDevice: Media.getSupportedDevice\n };\n\n LoggerProxy.set(this.webex.logger);\n\n this.onReady();\n MeetingsUtil.checkH264Support({disableNotifications: true});\n Metrics.initialSetup(this.meetingCollection, this.webex);\n }\n\n /**\n * handle locus events and takes meeting actions with them as they come in\n * @param {Object} data a locus event\n * @param {String} data.locusUrl\n * @param {Object} data.locus\n * @param {String} data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusEvent(data) {\n let meeting = null;\n\n // getting meeting by correlationId. This will happen for the new event\n // Either the locus\n // TODO : Add check for the callBack Address\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locusUrl) ||\n this.meetingCollection.getByKey(CORRELATION_ID, MeetingsUtil.checkForCorrelationId(this.webex.internal.device.url, data.locus)) ||\n this.meetingCollection.getByKey(SIP_URI, data.locus.self && data.locus.self.callbackInfo && data.locus.self.callbackInfo.callbackAddress) ||\n this.meetingCollection.getByKey(CONVERSATION_URL, data.locus.conversationUrl);\n\n // Special case when locus has got replaced, This only happend once if a replace locus exists\n // https://sqbu-github.cisco.com/WebExSquared/locus/wiki/Locus-changing-mid-call\n\n if (!meeting && data.locus?.replaces?.length > 0) {\n // Always the last element in the replace is the active one\n meeting = this.meetingCollection.getByKey(LOCUS_URL, data.locus.replaces[data.locus.replaces.length - 1].locusUrl);\n }\n\n if (!meeting) {\n // TODO: create meeting when we get a meeting object\n // const checkForEnded = (locus) => {\n // TODO: you already ended the meeting but you got an event later\n // Mainly for 1:1 Callsor meeting\n // Happens mainly after refresh\n\n // 1:1 Meeting\n // 1) You ended a call before but you got a mercury event\n // Make sure end the call and cleanup the meeting only if the mercury\n // event says so\n // 2) Maintain lastSync time in the meetings object which helps to compare\n // If the meeting came befor or after the sync . ANy meeting start time before the sync time is invalid\n\n // For space Meeting\n // Check the locus object and see who has joined\n\n // };\n // rather then locus object change to locus url\n\n if (data.locus && data.locus.fullState && data.locus.fullState.state === LOCUS.STATE.INACTIVE) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n\n // When its wireless share or guest and user leaves the meeting we dont have to keep the meeting object\n // Any future events will be neglected\n\n if (data.locus && data.locus.self && (data.locus.self.state === _LEFT_ && data.locus.self.removed === true)) {\n // just ignore the event as its already ended and not active\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Locus event received for meeting, after it was ended.');\n\n return;\n }\n\n this.create(data.locus, _LOCUS_ID_).then((newMeeting) => {\n meeting = newMeeting;\n\n if (data.eventType === LOCUSEVENT.DIFFERENCE) {\n // its a delta object and we have a new meeting\n meeting.locusInfo.initialSetup(data.locus, meeting);\n }\n else {\n // Its a new meeting and have a fresh locus object\n meeting.locusInfo.initialSetup(data.locus);\n }\n }).catch((e) => {\n console.log(e);\n })\n .finally(() => {\n // There will be cases where locus event comes in gets created and deleted because its a 1:1 and meeting gets deleted\n // because the other user left so before sending 'added' event make sure it exists in the collection\n\n if (this.getMeetingByType(_ID_, meeting.id)) {\n Metrics.postEvent({event: eventType.REMOTE_STARTED, meeting, data: {trigger: trigger.MERCURY_EVENT}});\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'handleLocusEvent'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meeting.type === _MEETING_ ? _JOIN_ : _INCOMING_\n }\n );\n }\n else {\n // Meeting got added but was not found in the collection. It might have got destroyed\n LoggerProxy.logger.warn('Meetings:index#handleLocusEvent --> Created and destroyed meeting object before sending an event');\n }\n });\n }\n else {\n meeting.locusInfo.parse(meeting, data);\n }\n }\n\n /**\n * handles locus events through mercury that are not roap\n * @param {Object} envelope\n * @param {Object} envelope.data\n * @param {String} envelope.data.eventType\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleLocusMercury(envelope) {\n const {data} = envelope;\n const {eventType} = data;\n\n if (eventType && eventType !== LOCUSEVENT.MESSAGE_ROAP) {\n this.handleLocusEvent(data);\n }\n }\n\n\n /**\n * handles mecury offline event\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n handleMercuryOffline() {\n Trigger.trigger(\n this,\n {\n file: 'meetings/index',\n function: 'handleMercuryOffline'\n },\n EVENT_TRIGGERS.MEETINGS_NETWORK_DISCONNECTED,\n );\n }\n\n\n /**\n * registers for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n listenForEvents() {\n this.webex.internal.mercury.on(LOCUSEVENT.LOCUS_MERCURY, (envelope) => {\n this.handleLocusMercury(envelope);\n });\n this.webex.internal.mercury.on(ROAP.ROAP_MERCURY, (envelope) => {\n MeetingsUtil.handleRoapMercury(envelope, this.meetingCollection);\n });\n\n this.webex.internal.mercury.on(ONLINE, () => {\n this.syncMeetings();\n });\n\n this.webex.internal.mercury.on(OFFLINE, () => {\n this.handleMercuryOffline();\n });\n }\n\n /**\n * stops listening for locus and roap mercury events\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n stopListeningForEvents() {\n this.webex.internal.mercury.off(LOCUSEVENT.LOCUS_MERCURY);\n this.webex.internal.mercury.off(ROAP.ROAP_MERCURY);\n this.webex.internal.mercury.off(ONLINE);\n }\n\n /**\n * @returns {undefined}\n * @private\n * @memberof Meetings\n */\n onReady() {\n this.webex.once(READY, () => {\n StaticConfig.set(this.config);\n LoggerConfig.set(this.config.logging);\n\n /**\n * The MeetingInfo object to interact with server\n * @instance\n * @type {Object}\n * @private\n * @memberof Meetings\n */\n this.meetingInfo = this.config.experimental.enableUnifiedMeetings ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n this.personalMeetingRoom = new PersonalMeetingRoom({meetingInfo: this.meetingInfo}, {parent: this.webex});\n\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'onReady'\n },\n EVENT_TRIGGERS.MEETINGS_READY\n );\n });\n }\n\n /**\n * API to toggle unified meetings\n * @param {Boolean} changeState\n * @private\n * @memberof Meetings\n * @returns {undefined}\n */\n _toggleUnifiedMeetings(changeState) {\n if (typeof changeState !== 'boolean') {\n return;\n }\n if (this.config?.experimental?.enableUnifiedMeetings !== changeState) {\n this.config.experimental.enableUnifiedMeetings = changeState;\n this.meetingInfo = changeState ? new MeetingInfoV2(this.webex) : new MeetingInfo(this.webex);\n }\n }\n\n /**\n * Explicitly sets up the meetings plugin by registering\n * the device, connecting to mercury, and listening for locus events.\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n register() {\n if (!this.webex.canAuthorize) {\n LoggerProxy.logger.error('Meetings:index#register --> ERROR, Unable to register, SDK cannot authorize');\n\n return Promise.reject(new Error('SDK cannot authorize'));\n }\n\n\n if (this.registered) {\n LoggerProxy.logger.info('Meetings:index#register --> INFO, Meetings plugin already registered');\n\n return Promise.resolve();\n }\n\n return Promise.all([\n this.getGeoHint(),\n this.startReachability().catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> GDM error, ${error.message}`);\n }),\n this.webex.internal.device.register()\n .then(() => LoggerProxy.logger.info(`Meetings:index#register --> INFO, Device registered ${this.webex.internal.device.url}`))\n .then(() => this.webex.internal.mercury.connect()),\n MeetingsUtil.checkH264Support.call(this)\n ]).then(() => {\n this.listenForEvents();\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'register'\n },\n EVENT_TRIGGERS.MEETINGS_REGISTERED\n );\n this.registered = true;\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_SUCCESS,\n );\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Meetings:index#register --> ERROR, Unable to register, ${error.message}`);\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETINGS_REGISTRATION_FAILED,\n {\n reason: error.message,\n stack: error.stack\n }\n );\n\n return Promise.reject(error);\n });\n }\n\n /**\n * Explicitly tears down the meetings plugin by deregistering\n * the device, disconnecting from mercury, and stops listening to locus events\n *\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n unregister() {\n if (!this.registered) {\n LoggerProxy.logger.info('Meetings:index#unregister --> INFO, Meetings plugin already unregistered');\n\n return Promise.resolve();\n }\n\n this.stopListeningForEvents();\n\n return this.webex.internal.mercury.disconnect()\n .then(() => this.webex.internal.device.unregister())\n .then(() => {\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'unregister'\n },\n EVENT_TRIGGERS.MEETINGS_UNREGISTERED\n );\n this.registered = false;\n });\n }\n\n /**\n * Uploads logs to the webex services for tracking\n * @param {Object} [options={}]\n * @param {String} [options.callStart] Call Start Time\n * @param {String} [options.feedbackId] ID used for tracking\n * @param {String} [options.locusId]\n * @param {String} [options.correlationId]\n * @param {String} [options.meetingId] webex meeting ID\n * @param {String} [options.userId] userId\n * @param {String} [options.orgId] org id\n * @returns {String} feedback ID logs were submitted under\n */\n uploadLogs(options = {}) {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> uploading logs');\n\n return this.loggerRequest.uploadLogs(options)\n .then((uploadResult) => {\n LoggerProxy.logger.info('Meetings:index#uploadLogs --> Upload logs for meeting completed.', uploadResult);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_SUCCESS,\n {\n meetingId: options.meetingId,\n details: uploadResult\n }\n );\n })\n .catch((uploadError) => {\n LoggerProxy.logger.error('Meetings:index#uploadLogs --> Unable to upload logs for meeting', uploadError);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'uploadLogs'\n },\n EVENT_TRIGGERS.MEETING_LOG_UPLOAD_FAILURE,\n {\n meetingId: options.meetingId,\n reason: uploadError\n }\n );\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.UPLOAD_LOGS_FAILURE,\n {\n meetingId: options.meetingsId,\n reason: uploadError.message,\n stack: uploadError.stack,\n code: uploadError.code\n }\n );\n });\n }\n\n /**\n * initializes the reachability instance for Meetings\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n setReachability() {\n this.reachability = new Reachability(this.webex);\n }\n\n /**\n * gets the reachability instance for Meetings\n * @returns {Reachability}\n * @public\n * @memberof Meetings\n */\n getReachability() {\n return this.reachability;\n }\n\n /**\n * initializes and starts gathering reachability for Meetings\n * @returns {Promise}\n * @public\n * @memberof Meetings\n */\n startReachability() {\n if (!this.reachability) {\n this.setReachability();\n }\n\n return this.getReachability().gatherReachability();\n }\n\n /**\n * Get geoHint for info for meetings\n * @returns {Promise}\n * @private\n * @memberof Meetings\n */\n getGeoHint() {\n return this.request.fetchGeoHint().then((res) => {\n this.geoHintInfo = res;\n });\n }\n\n /**\n * gets the personal meeting room instance, for saved PMR values for this user\n * @returns {PersonalMeetingRoom}\n * @public\n * @memberof Meetings\n */\n getPersonalMeetingRoom() {\n return this.personalMeetingRoom;\n }\n\n /**\n * @param {Meeting} meeting\n * @param {Object} reason\n * @param {String} type\n * @returns {Undefined}\n * @private\n * @memberof Meetings\n */\n destroy(meeting, reason) {\n MeetingUtil.cleanUp(meeting);\n this.meetingCollection.delete(meeting.id);\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'destroy'\n },\n EVENT_TRIGGERS.MEETING_REMOVED,\n {\n meetingId: meeting.id,\n reason\n }\n );\n }\n\n /**\n * Create a meeting.\n * @param {string} destination - sipURL, spaceId, phonenumber, or locus object}\n * @param {string} [type] - the optional specified type, such as locusId\n * @returns {Promise<Meeting>} A new Meeting.\n * @public\n * @memberof Meetings\n */\n create(destination, type = null) {\n // TODO: type should be from a dictionary\n\n // Validate meeting information based on the provided destination and\n // type. This must be performed prior to determining if the meeting is\n // found in the collection, as we mutate the destination for hydra person\n // id values.\n return this.meetingInfo.fetchInfoOptions(destination, type)\n // Catch a failure to fetch info options.\n .catch((error) => {\n LoggerProxy.logger.info(`Meetings:index#create --> INFO, unable to determine info options: ${error.message}`);\n })\n .then((options = {}) => {\n // Normalize the destination.\n const targetDest = options.destination || destination;\n\n // check for the conversation URL then sip Url\n let meeting = null;\n\n if (type === _CONVERSATION_URL_ || options.type === _CONVERSATION_URL_) {\n meeting = this.meetingCollection.getByKey(CONVERSATION_URL, targetDest);\n }\n\n // Attempt to collect the meeting if it exists.\n if (!meeting) {\n meeting = this.meetingCollection.getByKey(SIP_URI, targetDest);\n }\n\n\n // Validate if a meeting was found.\n if (!meeting) {\n // Create a meeting based on the normalized destination and type.\n return this.createMeeting(targetDest, type)\n .then((createdMeeting) => {\n // If the meeting was successfully created.\n if (createdMeeting && createdMeeting.on) {\n // Create a destruction event for the meeting.\n createdMeeting.on(EVENTS.DESTROY_MEETING, (payload) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: createdMeeting.locusInfo?.fullState?.lastActive,\n correlationId: createdMeeting.correlationId,\n feedbackId: createdMeeting.correlationId,\n locusId: createdMeeting.locusId,\n meetingId: createdMeeting.locusInfo?.info?.webExMeetingId\n }).then(() => this.destroy(createdMeeting, payload.reason));\n }\n else {\n this.destroy(createdMeeting, payload.reason);\n }\n });\n\n createdMeeting.on(EVENTS.REQUEST_UPLOAD_LOGS, (meetingInstance) => {\n if (this.config.autoUploadLogs) {\n this.uploadLogs({\n callStart: meetingInstance?.locusInfo?.fullState?.lastActive,\n correlationId: meetingInstance.correlationId,\n feedbackId: meetingInstance.correlationId,\n locusId: meetingInstance.locusId,\n meetingId: meetingInstance.locusInfo?.info?.webExMeetingId\n });\n }\n });\n }\n else {\n LoggerProxy.logger.error(`Meetings:index#create --> ERROR, meeting does not have on method, will not be destroyed, meeting cleanup impossible for meeting: ${meeting}`);\n }\n\n // Return the newly created meeting.\n return Promise.resolve(createdMeeting);\n });\n }\n\n // Return the existing meeting.\n return Promise.resolve(meeting);\n });\n }\n\n /**\n * @param {String} destination see create()\n * @param {String} type see create()\n * @returns {Promise} a new meeting instance complete with meeting info and destination\n * @private\n * @memberof Meetings\n */\n async createMeeting(destination, type = null) {\n const meeting = new Meeting(\n {\n userId: this.webex.internal.device.userId,\n deviceUrl: this.webex.internal.device.url,\n orgId: this.webex.internal.device.orgId,\n roapSeq: 0,\n locus: type === _LOCUS_ID_ ? destination : null, // pass the locus object if present\n meetingInfoProvider: this.meetingInfo\n },\n {\n parent: this.webex\n }\n );\n\n this.meetingCollection.set(meeting);\n\n try {\n await meeting.fetchMeetingInfo({destination, type});\n }\n catch (err) {\n if (!(err instanceof CaptchaError) && !(err instanceof PasswordError)) {\n // if there is no meeting info we assume its a 1:1 call or wireless share\n LoggerProxy.logger.info(`Meetings:index#createMeeting --> Info Unable to fetch meeting info for ${destination}.`);\n LoggerProxy.logger.info('Meetings:index#createMeeting --> Info assuming this destination is a 1:1 or wireless share');\n }\n LoggerProxy.logger.debug(`Meetings:index#createMeeting --> Debug ${err} fetching /meetingInfo for creation.`);\n // We need to save this info for future reference\n meeting.destination = destination;\n }\n finally {\n // For type LOCUS_ID we need to parse the locus object to get the information\n // about the caller and callee\n // Meeting Added event will be created in `handleLocusEvent`\n if (type !== _LOCUS_ID_) {\n if (!meeting.sipUri) {\n meeting.setSipUri(destination);\n }\n\n // TODO: check if we have to move this to parser\n const meetingAddedType = MeetingsUtil.getMeetingAddedType(type);\n\n // We typically shouldn't need to trigger both and event and return a promise.\n // Is this a special case? We want to make the public API usage as simple as possible.\n Trigger.trigger(\n this,\n {\n file: 'meetings',\n function: 'createMeeting'\n },\n EVENT_TRIGGERS.MEETING_ADDED,\n {\n meeting,\n type: meetingAddedType\n }\n );\n }\n }\n\n return meeting;\n\n // Create the meeting calling the necessary service endpoints.\n\n // Internally, there are many more destinations:\n //\n // - locusID\n // - meetingURL\n // - globalMeetingID, e.g, *00*meetingID\n // - meetingID\n // - meetingURL\n // - PSTN\n // - phone number\n //\n // Our job is to determine the appropriate one\n // and its corresponding service so that developers\n // need only sipURL or spaceID to get a meeting\n // and its ID, but have the option to use createWithType()\n // and specify those types to get meetingInfo\n }\n\n /**\n * get a specifc meeting given it's type matched to the value, i.e., locus url\n * @param {String} type\n * @param {Object} value\n * @returns {Meeting}\n * @public\n * @memberof Meetings\n */\n getMeetingByType(type, value) {\n return this.meetingCollection.getByKey(type, value);\n }\n\n /**\n * Get all meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All currently active meetings.\n * @public\n * @memberof Meetings\n */\n getAllMeetings(options = {}) {\n // Options may include other parameters to filter this collection\n // of meetings.\n return this.meetingCollection.getAll(options);\n }\n\n /**\n * syncs all the meeting from server\n * @returns {undefined}\n * @public\n * @memberof Meetings\n */\n syncMeetings() {\n return this.request.getActiveMeetings().then((locusArray) => {\n const activeLocusUrl = [];\n\n if (locusArray?.loci && locusArray.loci.length > 0) {\n locusArray.loci.forEach((locus) => {\n activeLocusUrl.push(locus.url);\n this.handleLocusEvent({\n locus,\n locusUrl: locus.url\n });\n });\n }\n const meetingsCollection = this.meetingCollection.getAll();\n\n if (Object.keys(meetingsCollection).length > 0) {\n // Some time the mercury event is missed after mercury reconnect\n // if sync returns no locus then clear all the meetings\n for (const meeting of Object.values(meetingsCollection)) {\n if (!activeLocusUrl.includes(meeting.locusUrl)) {\n // destroy function also uploads logs\n this.destroy(meeting, MEETING_REMOVED_REASON.NO_MEETINGS_TO_SYNC);\n }\n }\n }\n });\n }\n\n /**\n * Get all scheduled meetings.\n * @param {object} options\n * @param {object} options.startDate - get meetings after this start date\n * @param {object} options.endDate - get meetings before this end date\n * @returns {Object} All scheduled meetings.\n * @memberof Meetings\n */\n getScheduledMeetings() {\n return this.meetingCollection.getAll({scheduled: true});\n }\n\n /**\n * Get the logger instance for plugin-meetings\n * @returns {Logger}\n */\n getLogger() {\n return LoggerProxy.get();\n }\n\n /**\n * Get the Stats Analyzer singleton\n * @returns {StatsAnalyzer}\n * @public\n * @memberof Meetings\n */\n getAnalyzer() {\n return StatsAnalyzer;\n }\n\n /**\n * Get the Stats Calculator singleton\n * @returns {StatsCalculator}\n * @public\n * @memberof Meetings\n */\n getCalculator() {\n return StatsCalculator;\n }\n}\n"]}
@@ -6,7 +6,7 @@ _Object$defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
 
9
- exports.CLIENT_NAME = exports.OS_NAME = exports.UNKNOWN = exports.errorObjects = exports.statusCodes = exports.errorCodes = exports.reconnection = exports.mediaType = exports.displayLocation = exports.pstnAudioType = exports.trigger = exports.error = exports.eventType = void 0;
9
+ exports.PLATFORM = exports.CLIENT_NAME = exports.OS_NAME = exports.UNKNOWN = exports.errorObjects = exports.statusCodes = exports.errorCodes = exports.reconnection = exports.mediaType = exports.displayLocation = exports.pstnAudioType = exports.trigger = exports.error = exports.eventType = void 0;
10
10
  var errorDescription = {
11
11
  UNKNOWN_CALL_FAILURE: 'UnknownCallFailure',
12
12
  LOCUS_RATE_LIMITED_INCOMING: 'LocusRateLimitedIncoming',
@@ -295,4 +295,6 @@ var OS_NAME = {
295
295
  exports.OS_NAME = OS_NAME;
296
296
  var CLIENT_NAME = 'webex-js-sdk';
297
297
  exports.CLIENT_NAME = CLIENT_NAME;
298
+ var PLATFORM = 'Web';
299
+ exports.PLATFORM = PLATFORM;
298
300
  //# sourceMappingURL=config.js.map