@webex/plugin-meetings 2.15.0 → 2.18.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 (112) hide show
  1. package/README.md +4 -0
  2. package/dist/analyzer/analyzer.js.map +1 -1
  3. package/dist/analyzer/calculator.js.map +1 -1
  4. package/dist/common/browser-detection.js.map +1 -1
  5. package/dist/common/collection.js +2 -3
  6. package/dist/common/collection.js.map +1 -1
  7. package/dist/common/errors/captcha-error.js.map +1 -1
  8. package/dist/common/errors/intent-to-join.js.map +1 -1
  9. package/dist/common/errors/join-meeting.js.map +1 -1
  10. package/dist/common/errors/media.js.map +1 -1
  11. package/dist/common/errors/parameter.js +20 -5
  12. package/dist/common/errors/parameter.js.map +1 -1
  13. package/dist/common/errors/password-error.js.map +1 -1
  14. package/dist/common/errors/permission.js.map +1 -1
  15. package/dist/common/errors/reconnection.js.map +1 -1
  16. package/dist/common/errors/stats.js.map +1 -1
  17. package/dist/common/events/events-scope.js.map +1 -1
  18. package/dist/common/events/events.js.map +1 -1
  19. package/dist/common/events/trigger-proxy.js.map +1 -1
  20. package/dist/common/events/util.js.map +1 -1
  21. package/dist/common/logs/logger-proxy.js.map +1 -1
  22. package/dist/common/logs/request.js.map +1 -1
  23. package/dist/common/queue.js +3 -0
  24. package/dist/common/queue.js.map +1 -1
  25. package/dist/config.js.map +1 -1
  26. package/dist/constants.js +2 -0
  27. package/dist/constants.js.map +1 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/locus-info/fullState.js.map +1 -1
  30. package/dist/locus-info/index.js +5 -3
  31. package/dist/locus-info/index.js.map +1 -1
  32. package/dist/locus-info/infoUtils.js +4 -4
  33. package/dist/locus-info/infoUtils.js.map +1 -1
  34. package/dist/locus-info/parser.js.map +1 -1
  35. package/dist/locus-info/selfUtils.js +22 -9
  36. package/dist/locus-info/selfUtils.js.map +1 -1
  37. package/dist/media/index.js.map +1 -1
  38. package/dist/media/properties.js.map +1 -1
  39. package/dist/media/util.js.map +1 -1
  40. package/dist/meeting/effectsState.js.map +1 -1
  41. package/dist/meeting/in-meeting-actions.js +14 -10
  42. package/dist/meeting/in-meeting-actions.js.map +1 -1
  43. package/dist/meeting/index.js +7 -2
  44. package/dist/meeting/index.js.map +1 -1
  45. package/dist/meeting/muteState.js.map +1 -1
  46. package/dist/meeting/request.js.map +1 -1
  47. package/dist/meeting/state.js.map +1 -1
  48. package/dist/meeting/util.js +8 -0
  49. package/dist/meeting/util.js.map +1 -1
  50. package/dist/meeting-info/index.js.map +1 -1
  51. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  52. package/dist/meeting-info/request.js.map +1 -1
  53. package/dist/meeting-info/util.js +0 -3
  54. package/dist/meeting-info/util.js.map +1 -1
  55. package/dist/meeting-info/utilv2.js +0 -3
  56. package/dist/meeting-info/utilv2.js.map +1 -1
  57. package/dist/meetings/index.js.map +1 -1
  58. package/dist/meetings/request.js.map +1 -1
  59. package/dist/meetings/util.js.map +1 -1
  60. package/dist/member/index.js.map +1 -1
  61. package/dist/members/index.js.map +1 -1
  62. package/dist/members/request.js.map +1 -1
  63. package/dist/members/util.js.map +1 -1
  64. package/dist/metrics/index.js.map +1 -1
  65. package/dist/metrics/mqa-processor.js.map +1 -1
  66. package/dist/networkQualityMonitor/index.js.map +1 -1
  67. package/dist/peer-connection-manager/index.js.map +1 -1
  68. package/dist/personal-meeting-room/request.js.map +1 -1
  69. package/dist/personal-meeting-room/util.js.map +1 -1
  70. package/dist/reachability/index.js.map +1 -1
  71. package/dist/reachability/request.js.map +1 -1
  72. package/dist/reconnection-manager/index.js +0 -3
  73. package/dist/reconnection-manager/index.js.map +1 -1
  74. package/dist/roap/collection.js.map +1 -1
  75. package/dist/roap/handler.js.map +1 -1
  76. package/dist/roap/index.js.map +1 -1
  77. package/dist/roap/request.js.map +1 -1
  78. package/dist/roap/state.js.map +1 -1
  79. package/dist/roap/util.js.map +1 -1
  80. package/dist/stats/data.js.map +1 -1
  81. package/dist/stats/events.js.map +1 -1
  82. package/dist/stats/filter.js.map +1 -1
  83. package/dist/stats/index.js.map +1 -1
  84. package/dist/stats/metrics.js.map +1 -1
  85. package/dist/stats/stats.js.map +1 -1
  86. package/dist/stats/stream.js.map +1 -1
  87. package/dist/stats/transformer.js.map +1 -1
  88. package/dist/stats/util.js.map +1 -1
  89. package/dist/statsAnalyzer/index.js.map +1 -1
  90. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  91. package/dist/transcription/index.js.map +1 -1
  92. package/package.json +6 -6
  93. package/src/common/{collection.js → collection.ts} +2 -2
  94. package/src/common/errors/parameter.ts +29 -0
  95. package/src/common/{queue.js → queue.ts} +1 -0
  96. package/src/{constants.js → constants.ts} +2 -0
  97. package/src/locus-info/index.js +4 -4
  98. package/src/locus-info/infoUtils.js +4 -4
  99. package/src/locus-info/selfUtils.js +18 -9
  100. package/src/meeting/{in-meeting-actions.js → in-meeting-actions.ts} +14 -12
  101. package/src/meeting/index.js +7 -1
  102. package/src/meeting/util.js +4 -0
  103. package/test/unit/spec/locus-info/index.js +4 -1
  104. package/test/unit/spec/locus-info/infoUtils.js +16 -0
  105. package/test/unit/spec/locus-info/selfUtils.js +20 -0
  106. package/test/unit/spec/meeting/{in-meeting-actions.js → in-meeting-actions.ts} +5 -2
  107. package/test/unit/spec/meeting/index.js +2 -2
  108. package/test/unit/spec/meeting/utils.js +14 -0
  109. package/dist/common/constants.js +0 -15
  110. package/dist/common/constants.js.map +0 -1
  111. package/src/common/constants.js +0 -6
  112. package/src/common/errors/parameter.js +0 -26
@@ -1 +1 @@
1
- {"version":3,"names":["isBrowser","pc","insertBandwidthLimit","sdpLines","index","limit","periodicKeyFrame","search","AUDIO","StaticConfig","meetings","bandwidth","audio","video","SDP","PERIODIC_KEYFRAME","splice","B_LINE","setMaxFs","sdp","level","QUALITY_LEVELS","HIGH","MAX_FRAMESIZES","ParameterError","replaceSdp","maxFsLine","MAX_FS","replace","setStartBitrateOnRemoteSdp","startBitrate","checkH264Support","videoPresent","match","h264Present","isSdpInvalid","parsedSdp","sdpTransform","parse","media","mediaLine","candidates","length","LoggerProxy","logger","error","BAD_MEDIA_PORTS","includes","port","icePwd","iceUfrag","limitBandwidth","offerSdp","split","CARRIAGE_RETURN","i","M_LINE","join","setContentSlides","screenPc","A_CONTENT_SLIDES","iceCandidate","peerConnection","remoteQualityLevel","resolve","reject","now","doneGatheringIceCandidate","miliseconds","Math","abs","localDescription","PeerConnectionUtils","convertCLineToIpv4","invalidSdpPresent","InvalidSdpError","log","iceGatheringState","COMPLETE","onIceGatheringStateChange","GATHERING","onicecandidate","evt","candidate","type","protocol","address","onicecandidateerror","event","IceGatheringFailed","replaceTrack","track","senders","getSenders","forEach","sender","kind","err","addStream","stream","tracksPresent","find","getTracks","addTrack","setRemoteSessionDetails","typeStr","remoteSdp","meetingId","signalingState","Metrics","postEvent","eventType","REMOTE_SDP_RECEIVED","data","canProceed","errors","generateErrorPayload","name","MEDIA_ENGINE","HAVE_LOCAL_OFFER","STABLE","OFFER","enableExtmap","setRemoteDescription","window","RTCSessionDescription","then","catch","metricName","BEHAVIORAL_METRICS","PEERCONNECTION_FAILURE","correlation_id","reason","message","stack","metadata","sendBehavioralMetric","MediaError","createOffer","enableRtx","description","setLocalDescription","LOCAL_SDP_GENERATED","INVALID_ICE_CANDIDATE","code","close","rollBackLocalDescription","ROLLBACK","updatePeerConnection","params","createAnswer","peerconnection","HAVE_REMOTE_OFFER","sdpConstraints","answer","connectionState","PEER_CONNECTION_STATE","CLOSED","setPeerConnectionEvents","meeting","mediaProperties","connectionFailed","reconnectionManager","iceState","reconnect","networkDisconnect","ICE_END","uploadLogs","file","function","CONNECTION_FAILURE","correlationId","locus_id","locusId","oniceconnectionstatechange","info","iceConnectionState","ICE_STATE","CHECKING","ICE_START","COMPLETED","CONNECTED","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","iceReconnected","DISCONNECTED","waitForIceReconnect","FAILED","onconnectionstatechange","CONNECTION_STATE","NEW","CONNECTING"],"sources":["index.js"],"sourcesContent":["\n// We need to figure out how to pass a webex logger instance to these util files\n\n/* globals RTCSessionDescription */\n\nimport window from 'global/window';\nimport sdpTransform from 'sdp-transform'; // https://github.com/clux/sdp-transform\n\nimport Metrics from '../metrics';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport StaticConfig from '../common/config';\nimport {\n COMPLETE,\n GATHERING,\n AUDIO,\n SDP,\n ICE_STATE,\n CONNECTION_STATE,\n NETWORK_STATUS,\n PEER_CONNECTION_STATE,\n OFFER,\n QUALITY_LEVELS,\n MAX_FRAMESIZES\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {error, eventType} from '../metrics/config';\nimport MediaError from '../common/errors/media';\nimport ParameterError from '../common/errors/parameter';\nimport {InvalidSdpError, IceGatheringFailed} from '../common/errors/webex-errors';\nimport BrowserDetection from '../common/browser-detection';\n\nimport PeerConnectionUtils from './util';\n\nconst {isBrowser} = BrowserDetection();\n\n/**\n * @export\n * @public\n */\nconst pc = {};\n\n/**\n * munges the bandwidth limit into the sdp\n * @param {String} sdpLines\n * @param {Number} index\n * @returns {String}\n */\nconst insertBandwidthLimit = (sdpLines, index) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser\n let limit;\n let periodicKeyFrame = '';\n\n if (sdpLines[index].search(AUDIO) !== -1) {\n limit = StaticConfig.meetings.bandwidth.audio;\n }\n else {\n limit = StaticConfig.meetings.bandwidth.video;\n periodicKeyFrame = SDP.PERIODIC_KEYFRAME;\n sdpLines.splice(index + 2, 0, periodicKeyFrame);\n }\n sdpLines.splice(index + 1, 0, `${SDP.B_LINE}:${limit}`);\n\n return sdpLines;\n};\n\n/**\n * needed for calliope max-fs\n * @param {String} sdp\n * @param {String} [level=QUALITY_LEVELS.HIGH] quality level for max-fs\n * @returns {String}\n */\nconst setMaxFs = (sdp, level = QUALITY_LEVELS.HIGH) => {\n if (!MAX_FRAMESIZES[level]) {\n throw new ParameterError(`setMaxFs: unable to set max framesize, value for level \"${level}\" is not defined`);\n }\n // eslint-disable-next-line no-warning-comments\n // TODO convert with sdp parser, no munging\n let replaceSdp = sdp;\n const maxFsLine = `${SDP.MAX_FS}${MAX_FRAMESIZES[level]}`;\n\n replaceSdp = replaceSdp.replace(/(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi, `$1;${maxFsLine}`);\n\n return replaceSdp;\n};\n\n\nconst setStartBitrateOnRemoteSdp = (sdp) => {\n if (StaticConfig.meetings.bandwidth.startBitrate) {\n sdp = sdp.replace(/(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi, `$1;x-google-start-bitrate=${StaticConfig.meetings.bandwidth.startBitrate}`);\n }\n\n return sdp;\n};\n\n/**\n * checks that sdp has h264 codec in it\n * @param {String} sdp\n * @returns {boolean}\n */\nconst checkH264Support = (sdp) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser to read rtp.codec\n const videoPresent = sdp.match(/\\nm=video.*/g);\n const h264Present = sdp.match(/\\na=rtpmap:\\d+\\sH264.*/g);\n\n if (videoPresent) {\n return !!h264Present;\n }\n\n return true;\n};\n\n/**\n * validates the sdp, checks port, candidates, and ice info\n * @param {String} sdp\n * @returns {String}\n */\nconst isSdpInvalid = (sdp) => {\n const parsedSdp = sdpTransform.parse(sdp);\n\n for (const mediaLine of parsedSdp.media) {\n if (!mediaLine.candidates || mediaLine.candidates?.length === 0) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Ice candadate never completed');\n\n return 'iceCandidate: Ice gathering never completed';\n }\n\n if (SDP.BAD_MEDIA_PORTS.includes(mediaLine.port)) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Found invalid port number for the ice candidate');\n\n return 'iceCandidate: Found invalid port number for the ice candidate';\n }\n if (!mediaLine.icePwd || !mediaLine.iceUfrag) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: ice ufrag and password not found');\n\n return 'iceCandidate: ice ufrag and password not found';\n }\n }\n\n return '';\n};\n\n/**\n * munges the bandwidth into the sdp\n * @param {String} sdp\n * @returns {String}\n */\nconst limitBandwidth = (sdp) => {\n // TODO convert to sdp parser\n let offerSdp = sdp;\n let sdpLines = offerSdp.split(SDP.CARRIAGE_RETURN);\n\n for (let i = 0; i < sdpLines.length; i += 1) {\n if (sdpLines[i].search(SDP.M_LINE) !== -1) {\n sdpLines = insertBandwidthLimit(sdpLines, i);\n }\n }\n offerSdp = sdpLines.join(SDP.CARRIAGE_RETURN);\n\n return offerSdp;\n};\n\n/**\n * makes sure the screen pc sdp has content:slides for server\n * @param {RTCPeerConnection} screenPc\n * @returns {RTCPeerConnection}\n */\npc.setContentSlides = (screenPc) => {\n if (screenPc && screenPc.sdp) {\n screenPc.sdp += `${SDP.A_CONTENT_SLIDES}${SDP.CARRIAGE_RETURN}`;\n }\n\n return screenPc;\n};\n\n/**\n * handles ice trickling and establishes ICE connection onto peer connection object\n * @param {Object} peerConnection\n * @param {Object} options\n * @param {String} options.remoteQualityLevel\n * @returns {Promise.RTCPeerConnection}\n */\npc.iceCandidate = (peerConnection, {remoteQualityLevel}) =>\n new Promise((resolve, reject) => {\n const now = Date.now();\n const doneGatheringIceCandidate = () => {\n const miliseconds = parseInt(Math.abs(Date.now() - now), 4);\n\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n\n const invalidSdpPresent = isSdpInvalid(peerConnection.sdp);\n\n if (invalidSdpPresent) {\n LoggerProxy.logger.error('PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.');\n reject(new InvalidSdpError(invalidSdpPresent));\n }\n LoggerProxy.logger.log(`PeerConnectionManager:index#iceCandidate --> Time to gather ice candidate ${miliseconds} miliseconds`);\n\n\n resolve();\n };\n\n // If ice has already been gathered\n if (peerConnection.iceGatheringState === COMPLETE) {\n doneGatheringIceCandidate();\n }\n\n peerConnection.onIceGatheringStateChange = () => {\n if (peerConnection.iceGatheringState === COMPLETE) {\n doneGatheringIceCandidate(peerConnection);\n }\n if (peerConnection.iceGatheringState === GATHERING) {\n LoggerProxy.logger.log('PeerConnectionManager:index#onIceGatheringStateChange --> Ice state changed to gathering');\n }\n };\n\n peerConnection.onicecandidate = (evt) => {\n if (evt.candidate === null) {\n doneGatheringIceCandidate(peerConnection);\n }\n else {\n LoggerProxy.logger.log(`PeerConnectionManager:index#onicecandidate --> Candidate ${evt.candidate?.type} ${evt.candidate?.protocol} ${evt.candidate?.address}:${evt.candidate?.port}`);\n }\n };\n\n peerConnection.onicecandidateerror = (event) => {\n LoggerProxy.logger.error('PeerConnectionManager:index#onicecandidateerror --> Failed to gather ice candidate.', event);\n reject(new IceGatheringFailed());\n };\n });\n\n/**\n * swapping tracks\n * @param {Object} peerConnection\n * @param {Object} track\n * @returns {undefined}\n */\npc.replaceTrack = (peerConnection, track) => {\n try {\n const senders = peerConnection.getSenders();\n\n if (senders.length > 0) {\n senders.forEach((sender) => {\n if (sender.track && sender.track.kind === track.kind) {\n sender.replaceTrack(track);\n }\n });\n }\n }\n catch (err) {\n LoggerProxy.logger.error(`PeerConnectionManager:index#replaceTrack --> Error replacing track, ${err}`);\n }\n};\n\n/**\n * adding streams to peerConnection\n * @param {Object} peerConnection\n * @param {Object} stream\n * @returns {undefined}\n */\npc.addStream = (peerConnection, stream) => {\n try {\n if (stream && !isBrowser('edge')) {\n const tracksPresent = peerConnection.getSenders && peerConnection.getSenders().find((sender) => sender.track != null);\n\n if (tracksPresent) {\n stream.getTracks().forEach((track) => {\n pc.replaceTrack(peerConnection, track);\n });\n\n return;\n }\n stream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, stream);\n });\n // // TODO : may come back disable addTracks for chrome they are moving back to addStream\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=764414\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=738918#c7\n // peerConnection.addStream(stream);\n }\n else if (isBrowser('edge')) {\n peerConnection.addStream(stream);\n }\n }\n catch (err) {\n LoggerProxy.logger.error(`PeerConnectionManager:index#addStream --> Error adding stream, error: ${error}`);\n }\n};\n\n/**\n * setting the remote description\n * @param {Object} peerConnection\n * @param {String} typeStr\n * @param {String} remoteSdp\n * @param {String} meetingId\n * @returns {undefined}\n */\npc.setRemoteSessionDetails = (\n peerConnection,\n typeStr,\n remoteSdp,\n meetingId,\n) => {\n LoggerProxy.logger.log(`PeerConnectionManager:index#setRemoteSessionDetails --> Setting the remote description type: ${typeStr}State: ${peerConnection.signalingState}`);\n let sdp = remoteSdp;\n\n // making sure that the remoteDescription is only set when there is a answer for offer\n // or there is a offer from the server\n\n if (!sdp) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE, 'missing remoteSdp')]\n }\n });\n }\n if (peerConnection.signalingState === SDP.HAVE_LOCAL_OFFER || (peerConnection.signalingState === SDP.STABLE && typeStr === SDP.OFFER)) {\n sdp = setStartBitrateOnRemoteSdp(sdp);\n\n if (!peerConnection.enableExtmap) {\n sdp = sdp.replace(/\\na=extmap.*/g, '');\n }\n\n\n return peerConnection.setRemoteDescription(\n new window.RTCSessionDescription({\n type: typeStr,\n sdp\n })\n )\n .then(() => {\n if (peerConnection.signalingState === SDP.STABLE) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId\n });\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#setRemoteDescription --> ${error} missing remotesdp`);\n\n\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n\n return Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE, 'missing remoteSdp')]\n }\n });\n });\n }\n\n return Promise.reject(new MediaError('PeerConnection in wrong state'));\n};\n\n/**\n * create offer with a valid paramater\n * @param {Object} peerConnection\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @param {string} meetingProperties.enableRtx\n * @param {string} meetingProperties.enableExtmap\n * @returns {RTCPeerConnection}\n */\npc.createOffer = (peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}) => {\n LoggerProxy.logger.log('PeerConnectionManager:index#createOffer --> creating a new offer');\n\n // saving the extMap State to use in setRemoteDescription\n\n peerConnection.enableExtmap = enableExtmap;\n\n return peerConnection\n .createOffer()\n .then((description) => {\n // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1020642\n // chrome currently generates RTX line irrespective of weither the server side supports it\n // we are removing apt as well because its associated with rtx line\n\n if (!enableRtx) {\n description.sdp = description.sdp.replace(/\\r\\na=rtpmap:\\d+ rtx\\/\\d+/g, '');\n description.sdp = description.sdp.replace(/\\r\\na=fmtp:\\d+ apt=\\d+/g, '');\n }\n\n return peerConnection.setLocalDescription(description);\n })\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError('openH264 is downloading please Wait. Upload logs if not working on second try');\n }\n\n if (!enableExtmap) {\n peerConnection.sdp = peerConnection.sdp.replace(/\\na=extmap.*/g, '');\n }\n\n pc.setContentSlides(peerConnection);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId\n });\n\n return peerConnection;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#createOffer --> ${error}`);\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE,\n {\n correlation_id: meetingId,\n code: error.code,\n reason: error.message\n }\n );\n }\n else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE)]\n }\n });\n pc.close(peerConnection);\n throw error;\n });\n};\n\n/**\n * rollBack local description in peerconnection\n * @param {Object} peerConnection\n * @returns {Promise.RTCPeerConnection}\n */\npc.rollBackLocalDescription = (peerConnection) => peerConnection\n .setLocalDescription(new RTCSessionDescription({type: SDP.ROLLBACK}))\n .then(() => peerConnection)\n .catch((err) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#setLocalDescription --> ${err} `);\n\n return Promise.error(err);\n });\n\n/**\n * @param {Object} params {\n * @param {Boolean} params.offerToReceiveAudio\n * @param {Boolean} params.offerToReceiveVideo\n * @param {string} params.offerSdp\n * @param {MediaStream} params.stream\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Promise.<Array>} [MediaSDP, ScreenSDP]\n */\npc.updatePeerConnection = (params, {meetingId, remoteQualityLevel}) => {\n LoggerProxy.logger.log(`PeerConnectionManager:index#updatePeerConnection --> updating the peerConnection with params: ${params}`);\n\n const {peerConnection, offerSdp} = params;\n\n return pc.createAnswer({\n peerConnection,\n offerSdp: offerSdp[0]\n }, {meetingId, remoteQualityLevel}).then((peerconnection) => {\n // The content slides should also be set when we are sending inactive\n pc.setContentSlides(peerconnection);\n\n return Promise.resolve([peerconnection.sdp]);\n });\n};\n\n/**\n * @param {Object} params\n * @param {Object} params.peerConnection\n * @param {Object} params.sdpConstraints\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {RTCPeerConnection} peerConnection\n */\npc.createAnswer = (params, {meetingId, remoteQualityLevel}) => {\n const {peerConnection} = params;\n\n // TODO: Some times to many mercury event comes at the same time\n // Need to maintain state of peerconnection\n if (peerConnection.signalingState === SDP.HAVE_REMOTE_OFFER) {\n return Promise.resolve(peerConnection);\n }\n\n return pc.setRemoteSessionDetails(peerConnection, OFFER, params.offerSdp, meetingId)\n .then(() => peerConnection.createAnswer(params.sdpConstraints))\n .then((answer) =>\n\n peerConnection.setLocalDescription(answer))\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError('openH264 is downloading please Wait. Upload logs if not working on second try');\n }\n\n return peerConnection;\n })\n .catch((error) => {\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE,\n {\n correlation_id: meetingId\n }\n );\n }\n else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n LoggerProxy.logger.error(`PeerConnectionManager:index#setRemoteSessionDetails --> Error creating remote session, error: ${error}`);\n });\n};\n\n/**\n * shut down the peer connection\n * @param {Object} peerConnection\n * @returns {undefined}\n */\npc.close = (peerConnection) => {\n // peerConnection.close() fails on firefox on network changes and gives a Dom exception\n // To avoid this we have added a try catch block.\n // Please refer to https://bugzilla.mozilla.org/show_bug.cgi?id=1274407 for more information\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> attempting to close the peer connection');\n\n if (peerConnection && peerConnection.connectionState === PEER_CONNECTION_STATE.CLOSED) {\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> connection already closed');\n\n return Promise.resolve();\n }\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> closing the mediaPeerConnection');\n\n return Promise.resolve()\n .then(() => {\n if (peerConnection && peerConnection.close) {\n peerConnection.close();\n }\n });\n};\n\n\npc.setPeerConnectionEvents = (meeting) => {\n // In case ICE fail\n const {peerConnection} = meeting.mediaProperties;\n\n const connectionFailed = () => {\n if (meeting.reconnectionManager.iceState.resolve) {\n // DISCONNECTED state triggers first then it goes to FAILED STATE\n // sometimes the failed state can happen before 10 seconds (Which is the timer for the reconnect for ice disconnect)\n meeting.reconnectionManager.iceState.resolve();\n }\n\n meeting.reconnect({networkDisconnect: true});\n Metrics.postEvent({\n event: eventType.ICE_END,\n meeting,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(\n 2004, false, error.name.MEDIA_ENGINE\n )]\n }\n });\n\n meeting.uploadLogs({\n file: 'peer-connection-manager/index',\n function: 'connectionFailed'\n });\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.CONNECTION_FAILURE,\n {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId\n }\n );\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHANGE.');\n switch (peerConnection.iceConnectionState) {\n case ICE_STATE.CHECKING:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHECKING.');\n Metrics.postEvent({event: eventType.ICE_START, meeting});\n break;\n case ICE_STATE.COMPLETED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE COMPLETED.');\n break;\n case ICE_STATE.CONNECTED:\n // Ice connection state goes to connected when both client and server sends STUN packets and\n // Established connected between them. Firefox does not trigger COMPLETED and only trigger CONNECTED\n Metrics.postEvent({event: eventType.ICE_END, meeting});\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.CONNECTION_SUCCESS,\n {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId\n }\n );\n meeting.setNetworkStatus(NETWORK_STATUS.CONNECTED);\n meeting.reconnectionManager.iceReconnected();\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CONNECTED.');\n break;\n case ICE_STATE.CLOSED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CLOSED.');\n break;\n case ICE_STATE.DISCONNECTED:\n meeting.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\n meeting.reconnectionManager.waitForIceReconnect()\n .catch(() => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED. Automatic Reconnection Timed Out.');\n\n connectionFailed();\n });\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED.');\n break;\n case ICE_STATE.FAILED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE FAILED.');\n // notify of ice failure\n // Ice failure is the only indicator currently for identifying the actual connection drop\n // Firefox takes sometime 10-15 seconds to go to failed state\n connectionFailed();\n break;\n default:\n break;\n }\n };\n\n peerConnection.onconnectionstatechange = () => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CHANGE.');\n switch (peerConnection.connectionState) {\n case CONNECTION_STATE.NEW:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE NEW.');\n break;\n case CONNECTION_STATE.CONNECTING:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTING.');\n break;\n case CONNECTION_STATE.CONNECTED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTED.');\n break;\n case CONNECTION_STATE.CLOSED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CLOSED.');\n break;\n case CONNECTION_STATE.DISCONNECTED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE DISCONNECTED.');\n break;\n case CONNECTION_STATE.FAILED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE FAILED.');\n // Special case happens only on chrome where there is no ICE FAILED event\n // only CONNECTION FAILED event gets triggered\n\n connectionFailed();\n break;\n default:\n break;\n }\n };\n};\n\nexport default pc;\n"],"mappings":"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"}
1
+ {"version":3,"names":["BrowserDetection","isBrowser","pc","insertBandwidthLimit","sdpLines","index","limit","periodicKeyFrame","search","AUDIO","StaticConfig","meetings","bandwidth","audio","video","SDP","PERIODIC_KEYFRAME","splice","B_LINE","setMaxFs","sdp","level","QUALITY_LEVELS","HIGH","MAX_FRAMESIZES","ParameterError","replaceSdp","maxFsLine","MAX_FS","replace","setStartBitrateOnRemoteSdp","startBitrate","checkH264Support","videoPresent","match","h264Present","isSdpInvalid","parsedSdp","sdpTransform","parse","media","mediaLine","candidates","length","LoggerProxy","logger","error","BAD_MEDIA_PORTS","includes","port","icePwd","iceUfrag","limitBandwidth","offerSdp","split","CARRIAGE_RETURN","i","M_LINE","join","setContentSlides","screenPc","A_CONTENT_SLIDES","iceCandidate","peerConnection","remoteQualityLevel","resolve","reject","now","doneGatheringIceCandidate","miliseconds","Math","abs","localDescription","PeerConnectionUtils","convertCLineToIpv4","invalidSdpPresent","InvalidSdpError","log","iceGatheringState","COMPLETE","onIceGatheringStateChange","GATHERING","onicecandidate","evt","candidate","type","protocol","address","onicecandidateerror","event","IceGatheringFailed","replaceTrack","track","senders","getSenders","forEach","sender","kind","err","addStream","stream","tracksPresent","find","getTracks","addTrack","setRemoteSessionDetails","typeStr","remoteSdp","meetingId","signalingState","Metrics","postEvent","eventType","REMOTE_SDP_RECEIVED","data","canProceed","errors","generateErrorPayload","name","MEDIA_ENGINE","HAVE_LOCAL_OFFER","STABLE","OFFER","enableExtmap","setRemoteDescription","window","RTCSessionDescription","then","catch","metricName","BEHAVIORAL_METRICS","PEERCONNECTION_FAILURE","correlation_id","reason","message","stack","metadata","sendBehavioralMetric","MediaError","createOffer","enableRtx","description","setLocalDescription","LOCAL_SDP_GENERATED","INVALID_ICE_CANDIDATE","code","close","rollBackLocalDescription","ROLLBACK","updatePeerConnection","params","createAnswer","peerconnection","HAVE_REMOTE_OFFER","sdpConstraints","answer","connectionState","PEER_CONNECTION_STATE","CLOSED","setPeerConnectionEvents","meeting","mediaProperties","connectionFailed","reconnectionManager","iceState","reconnect","networkDisconnect","ICE_END","uploadLogs","file","function","CONNECTION_FAILURE","correlationId","locus_id","locusId","oniceconnectionstatechange","info","iceConnectionState","ICE_STATE","CHECKING","ICE_START","COMPLETED","CONNECTED","CONNECTION_SUCCESS","setNetworkStatus","NETWORK_STATUS","iceReconnected","DISCONNECTED","waitForIceReconnect","FAILED","onconnectionstatechange","CONNECTION_STATE","NEW","CONNECTING"],"sources":["index.js"],"sourcesContent":["\n// We need to figure out how to pass a webex logger instance to these util files\n\n/* globals RTCSessionDescription */\n\nimport window from 'global/window';\nimport sdpTransform from 'sdp-transform'; // https://github.com/clux/sdp-transform\n\nimport Metrics from '../metrics';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport StaticConfig from '../common/config';\nimport {\n COMPLETE,\n GATHERING,\n AUDIO,\n SDP,\n ICE_STATE,\n CONNECTION_STATE,\n NETWORK_STATUS,\n PEER_CONNECTION_STATE,\n OFFER,\n QUALITY_LEVELS,\n MAX_FRAMESIZES\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport {error, eventType} from '../metrics/config';\nimport MediaError from '../common/errors/media';\nimport ParameterError from '../common/errors/parameter';\nimport {InvalidSdpError, IceGatheringFailed} from '../common/errors/webex-errors';\nimport BrowserDetection from '../common/browser-detection';\n\nimport PeerConnectionUtils from './util';\n\nconst {isBrowser} = BrowserDetection();\n\n/**\n * @export\n * @public\n */\nconst pc = {};\n\n/**\n * munges the bandwidth limit into the sdp\n * @param {String} sdpLines\n * @param {Number} index\n * @returns {String}\n */\nconst insertBandwidthLimit = (sdpLines, index) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser\n let limit;\n let periodicKeyFrame = '';\n\n if (sdpLines[index].search(AUDIO) !== -1) {\n limit = StaticConfig.meetings.bandwidth.audio;\n }\n else {\n limit = StaticConfig.meetings.bandwidth.video;\n periodicKeyFrame = SDP.PERIODIC_KEYFRAME;\n sdpLines.splice(index + 2, 0, periodicKeyFrame);\n }\n sdpLines.splice(index + 1, 0, `${SDP.B_LINE}:${limit}`);\n\n return sdpLines;\n};\n\n/**\n * needed for calliope max-fs\n * @param {String} sdp\n * @param {String} [level=QUALITY_LEVELS.HIGH] quality level for max-fs\n * @returns {String}\n */\nconst setMaxFs = (sdp, level = QUALITY_LEVELS.HIGH) => {\n if (!MAX_FRAMESIZES[level]) {\n throw new ParameterError(`setMaxFs: unable to set max framesize, value for level \"${level}\" is not defined`);\n }\n // eslint-disable-next-line no-warning-comments\n // TODO convert with sdp parser, no munging\n let replaceSdp = sdp;\n const maxFsLine = `${SDP.MAX_FS}${MAX_FRAMESIZES[level]}`;\n\n replaceSdp = replaceSdp.replace(/(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi, `$1;${maxFsLine}`);\n\n return replaceSdp;\n};\n\n\nconst setStartBitrateOnRemoteSdp = (sdp) => {\n if (StaticConfig.meetings.bandwidth.startBitrate) {\n sdp = sdp.replace(/(\\na=fmtp:(\\d+).*profile-level-id=.*)/gi, `$1;x-google-start-bitrate=${StaticConfig.meetings.bandwidth.startBitrate}`);\n }\n\n return sdp;\n};\n\n/**\n * checks that sdp has h264 codec in it\n * @param {String} sdp\n * @returns {boolean}\n */\nconst checkH264Support = (sdp) => {\n // eslint-disable-next-line no-warning-comments\n // TODO convert to sdp parser to read rtp.codec\n const videoPresent = sdp.match(/\\nm=video.*/g);\n const h264Present = sdp.match(/\\na=rtpmap:\\d+\\sH264.*/g);\n\n if (videoPresent) {\n return !!h264Present;\n }\n\n return true;\n};\n\n/**\n * validates the sdp, checks port, candidates, and ice info\n * @param {String} sdp\n * @returns {String}\n */\nconst isSdpInvalid = (sdp) => {\n const parsedSdp = sdpTransform.parse(sdp);\n\n for (const mediaLine of parsedSdp.media) {\n if (!mediaLine.candidates || mediaLine.candidates?.length === 0) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Ice candadate never completed');\n\n return 'iceCandidate: Ice gathering never completed';\n }\n\n if (SDP.BAD_MEDIA_PORTS.includes(mediaLine.port)) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: Found invalid port number for the ice candidate');\n\n return 'iceCandidate: Found invalid port number for the ice candidate';\n }\n if (!mediaLine.icePwd || !mediaLine.iceUfrag) {\n LoggerProxy.logger.error('PeerConnectionManager:index#isSdpInvalid --> iceCandidate: ice ufrag and password not found');\n\n return 'iceCandidate: ice ufrag and password not found';\n }\n }\n\n return '';\n};\n\n/**\n * munges the bandwidth into the sdp\n * @param {String} sdp\n * @returns {String}\n */\nconst limitBandwidth = (sdp) => {\n // TODO convert to sdp parser\n let offerSdp = sdp;\n let sdpLines = offerSdp.split(SDP.CARRIAGE_RETURN);\n\n for (let i = 0; i < sdpLines.length; i += 1) {\n if (sdpLines[i].search(SDP.M_LINE) !== -1) {\n sdpLines = insertBandwidthLimit(sdpLines, i);\n }\n }\n offerSdp = sdpLines.join(SDP.CARRIAGE_RETURN);\n\n return offerSdp;\n};\n\n/**\n * makes sure the screen pc sdp has content:slides for server\n * @param {RTCPeerConnection} screenPc\n * @returns {RTCPeerConnection}\n */\npc.setContentSlides = (screenPc) => {\n if (screenPc && screenPc.sdp) {\n screenPc.sdp += `${SDP.A_CONTENT_SLIDES}${SDP.CARRIAGE_RETURN}`;\n }\n\n return screenPc;\n};\n\n/**\n * handles ice trickling and establishes ICE connection onto peer connection object\n * @param {Object} peerConnection\n * @param {Object} options\n * @param {String} options.remoteQualityLevel\n * @returns {Promise.RTCPeerConnection}\n */\npc.iceCandidate = (peerConnection, {remoteQualityLevel}) =>\n new Promise((resolve, reject) => {\n const now = Date.now();\n const doneGatheringIceCandidate = () => {\n const miliseconds = parseInt(Math.abs(Date.now() - now), 4);\n\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n\n const invalidSdpPresent = isSdpInvalid(peerConnection.sdp);\n\n if (invalidSdpPresent) {\n LoggerProxy.logger.error('PeerConnectionManager:index#iceCandidate --> SDP not valid after waiting.');\n reject(new InvalidSdpError(invalidSdpPresent));\n }\n LoggerProxy.logger.log(`PeerConnectionManager:index#iceCandidate --> Time to gather ice candidate ${miliseconds} miliseconds`);\n\n\n resolve();\n };\n\n // If ice has already been gathered\n if (peerConnection.iceGatheringState === COMPLETE) {\n doneGatheringIceCandidate();\n }\n\n peerConnection.onIceGatheringStateChange = () => {\n if (peerConnection.iceGatheringState === COMPLETE) {\n doneGatheringIceCandidate(peerConnection);\n }\n if (peerConnection.iceGatheringState === GATHERING) {\n LoggerProxy.logger.log('PeerConnectionManager:index#onIceGatheringStateChange --> Ice state changed to gathering');\n }\n };\n\n peerConnection.onicecandidate = (evt) => {\n if (evt.candidate === null) {\n doneGatheringIceCandidate(peerConnection);\n }\n else {\n LoggerProxy.logger.log(`PeerConnectionManager:index#onicecandidate --> Candidate ${evt.candidate?.type} ${evt.candidate?.protocol} ${evt.candidate?.address}:${evt.candidate?.port}`);\n }\n };\n\n peerConnection.onicecandidateerror = (event) => {\n LoggerProxy.logger.error('PeerConnectionManager:index#onicecandidateerror --> Failed to gather ice candidate.', event);\n reject(new IceGatheringFailed());\n };\n });\n\n/**\n * swapping tracks\n * @param {Object} peerConnection\n * @param {Object} track\n * @returns {undefined}\n */\npc.replaceTrack = (peerConnection, track) => {\n try {\n const senders = peerConnection.getSenders();\n\n if (senders.length > 0) {\n senders.forEach((sender) => {\n if (sender.track && sender.track.kind === track.kind) {\n sender.replaceTrack(track);\n }\n });\n }\n }\n catch (err) {\n LoggerProxy.logger.error(`PeerConnectionManager:index#replaceTrack --> Error replacing track, ${err}`);\n }\n};\n\n/**\n * adding streams to peerConnection\n * @param {Object} peerConnection\n * @param {Object} stream\n * @returns {undefined}\n */\npc.addStream = (peerConnection, stream) => {\n try {\n if (stream && !isBrowser('edge')) {\n const tracksPresent = peerConnection.getSenders && peerConnection.getSenders().find((sender) => sender.track != null);\n\n if (tracksPresent) {\n stream.getTracks().forEach((track) => {\n pc.replaceTrack(peerConnection, track);\n });\n\n return;\n }\n stream.getTracks().forEach((track) => {\n peerConnection.addTrack(track, stream);\n });\n // // TODO : may come back disable addTracks for chrome they are moving back to addStream\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=764414\n // // https://bugs.chromium.org/p/chromium/issues/detail?id=738918#c7\n // peerConnection.addStream(stream);\n }\n else if (isBrowser('edge')) {\n peerConnection.addStream(stream);\n }\n }\n catch (err) {\n LoggerProxy.logger.error(`PeerConnectionManager:index#addStream --> Error adding stream, error: ${error}`);\n }\n};\n\n/**\n * setting the remote description\n * @param {Object} peerConnection\n * @param {String} typeStr\n * @param {String} remoteSdp\n * @param {String} meetingId\n * @returns {undefined}\n */\npc.setRemoteSessionDetails = (\n peerConnection,\n typeStr,\n remoteSdp,\n meetingId,\n) => {\n LoggerProxy.logger.log(`PeerConnectionManager:index#setRemoteSessionDetails --> Setting the remote description type: ${typeStr}State: ${peerConnection.signalingState}`);\n let sdp = remoteSdp;\n\n // making sure that the remoteDescription is only set when there is a answer for offer\n // or there is a offer from the server\n\n if (!sdp) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE, 'missing remoteSdp')]\n }\n });\n }\n if (peerConnection.signalingState === SDP.HAVE_LOCAL_OFFER || (peerConnection.signalingState === SDP.STABLE && typeStr === SDP.OFFER)) {\n sdp = setStartBitrateOnRemoteSdp(sdp);\n\n if (!peerConnection.enableExtmap) {\n sdp = sdp.replace(/\\na=extmap.*/g, '');\n }\n\n\n return peerConnection.setRemoteDescription(\n new window.RTCSessionDescription({\n type: typeStr,\n sdp\n })\n )\n .then(() => {\n if (peerConnection.signalingState === SDP.STABLE) {\n Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId\n });\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#setRemoteDescription --> ${error} missing remotesdp`);\n\n\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n\n return Metrics.postEvent({\n event: eventType.REMOTE_SDP_RECEIVED,\n meetingId,\n data: {\n canProceed: false,\n errors: [Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE, 'missing remoteSdp')]\n }\n });\n });\n }\n\n return Promise.reject(new MediaError('PeerConnection in wrong state'));\n};\n\n/**\n * create offer with a valid paramater\n * @param {Object} peerConnection\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @param {string} meetingProperties.enableRtx\n * @param {string} meetingProperties.enableExtmap\n * @returns {RTCPeerConnection}\n */\npc.createOffer = (peerConnection, {\n meetingId,\n remoteQualityLevel,\n enableRtx,\n enableExtmap\n}) => {\n LoggerProxy.logger.log('PeerConnectionManager:index#createOffer --> creating a new offer');\n\n // saving the extMap State to use in setRemoteDescription\n\n peerConnection.enableExtmap = enableExtmap;\n\n return peerConnection\n .createOffer()\n .then((description) => {\n // bug https://bugs.chromium.org/p/chromium/issues/detail?id=1020642\n // chrome currently generates RTX line irrespective of weither the server side supports it\n // we are removing apt as well because its associated with rtx line\n\n if (!enableRtx) {\n description.sdp = description.sdp.replace(/\\r\\na=rtpmap:\\d+ rtx\\/\\d+/g, '');\n description.sdp = description.sdp.replace(/\\r\\na=fmtp:\\d+ apt=\\d+/g, '');\n }\n\n return peerConnection.setLocalDescription(description);\n })\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError('openH264 is downloading please Wait. Upload logs if not working on second try');\n }\n\n if (!enableExtmap) {\n peerConnection.sdp = peerConnection.sdp.replace(/\\na=extmap.*/g, '');\n }\n\n pc.setContentSlides(peerConnection);\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId\n });\n\n return peerConnection;\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#createOffer --> ${error}`);\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE,\n {\n correlation_id: meetingId,\n code: error.code,\n reason: error.message\n }\n );\n }\n else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n Metrics.postEvent({\n event: eventType.LOCAL_SDP_GENERATED,\n meetingId,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(2001, true,\n error.name.MEDIA_ENGINE)]\n }\n });\n pc.close(peerConnection);\n throw error;\n });\n};\n\n/**\n * rollBack local description in peerconnection\n * @param {Object} peerConnection\n * @returns {Promise.RTCPeerConnection}\n */\npc.rollBackLocalDescription = (peerConnection) => peerConnection\n .setLocalDescription(new RTCSessionDescription({type: SDP.ROLLBACK}))\n .then(() => peerConnection)\n .catch((err) => {\n LoggerProxy.logger.error(`Peer-connection-manager:index#setLocalDescription --> ${err} `);\n\n return Promise.error(err);\n });\n\n/**\n * @param {Object} params {\n * @param {Boolean} params.offerToReceiveAudio\n * @param {Boolean} params.offerToReceiveVideo\n * @param {string} params.offerSdp\n * @param {MediaStream} params.stream\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {Promise.<Array>} [MediaSDP, ScreenSDP]\n */\npc.updatePeerConnection = (params, {meetingId, remoteQualityLevel}) => {\n LoggerProxy.logger.log(`PeerConnectionManager:index#updatePeerConnection --> updating the peerConnection with params: ${params}`);\n\n const {peerConnection, offerSdp} = params;\n\n return pc.createAnswer({\n peerConnection,\n offerSdp: offerSdp[0]\n }, {meetingId, remoteQualityLevel}).then((peerconnection) => {\n // The content slides should also be set when we are sending inactive\n pc.setContentSlides(peerconnection);\n\n return Promise.resolve([peerconnection.sdp]);\n });\n};\n\n/**\n * @param {Object} params\n * @param {Object} params.peerConnection\n * @param {Object} params.sdpConstraints\n * @param {Object} meetingProperties\n * @param {string} meetingProperties.meetingId\n * @param {string} meetingProperties.remoteQualityLevel LOW|MEDIUM|HIGH\n * @returns {RTCPeerConnection} peerConnection\n */\npc.createAnswer = (params, {meetingId, remoteQualityLevel}) => {\n const {peerConnection} = params;\n\n // TODO: Some times to many mercury event comes at the same time\n // Need to maintain state of peerconnection\n if (peerConnection.signalingState === SDP.HAVE_REMOTE_OFFER) {\n return Promise.resolve(peerConnection);\n }\n\n return pc.setRemoteSessionDetails(peerConnection, OFFER, params.offerSdp, meetingId)\n .then(() => peerConnection.createAnswer(params.sdpConstraints))\n .then((answer) =>\n\n peerConnection.setLocalDescription(answer))\n .then(() => pc.iceCandidate(peerConnection, {remoteQualityLevel}))\n .then(() => {\n peerConnection.sdp = limitBandwidth(peerConnection.localDescription.sdp);\n peerConnection.sdp = setMaxFs(peerConnection.sdp, remoteQualityLevel);\n peerConnection.sdp = PeerConnectionUtils.convertCLineToIpv4(peerConnection.sdp);\n if (!checkH264Support(peerConnection.sdp)) {\n throw new MediaError('openH264 is downloading please Wait. Upload logs if not working on second try');\n }\n\n return peerConnection;\n })\n .catch((error) => {\n if (error instanceof InvalidSdpError) {\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE,\n {\n correlation_id: meetingId\n }\n );\n }\n else {\n const metricName = BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;\n const data = {\n correlation_id: meetingId,\n reason: error.message,\n stack: error.stack\n };\n const metadata = {\n type: error.name\n };\n\n Metrics.sendBehavioralMetric(metricName, data, metadata);\n }\n\n LoggerProxy.logger.error(`PeerConnectionManager:index#setRemoteSessionDetails --> Error creating remote session, error: ${error}`);\n });\n};\n\n/**\n * shut down the peer connection\n * @param {Object} peerConnection\n * @returns {undefined}\n */\npc.close = (peerConnection) => {\n // peerConnection.close() fails on firefox on network changes and gives a Dom exception\n // To avoid this we have added a try catch block.\n // Please refer to https://bugzilla.mozilla.org/show_bug.cgi?id=1274407 for more information\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> attempting to close the peer connection');\n\n if (peerConnection && peerConnection.connectionState === PEER_CONNECTION_STATE.CLOSED) {\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> connection already closed');\n\n return Promise.resolve();\n }\n LoggerProxy.logger.log('PeerConnectionManager:index#close --> pc: close() -> closing the mediaPeerConnection');\n\n return Promise.resolve()\n .then(() => {\n if (peerConnection && peerConnection.close) {\n peerConnection.close();\n }\n });\n};\n\n\npc.setPeerConnectionEvents = (meeting) => {\n // In case ICE fail\n const {peerConnection} = meeting.mediaProperties;\n\n const connectionFailed = () => {\n if (meeting.reconnectionManager.iceState.resolve) {\n // DISCONNECTED state triggers first then it goes to FAILED STATE\n // sometimes the failed state can happen before 10 seconds (Which is the timer for the reconnect for ice disconnect)\n meeting.reconnectionManager.iceState.resolve();\n }\n\n meeting.reconnect({networkDisconnect: true});\n Metrics.postEvent({\n event: eventType.ICE_END,\n meeting,\n data: {\n canProceed: false,\n errors: [\n Metrics.generateErrorPayload(\n 2004, false, error.name.MEDIA_ENGINE\n )]\n }\n });\n\n meeting.uploadLogs({\n file: 'peer-connection-manager/index',\n function: 'connectionFailed'\n });\n\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.CONNECTION_FAILURE,\n {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId\n }\n );\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHANGE.');\n switch (peerConnection.iceConnectionState) {\n case ICE_STATE.CHECKING:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CHECKING.');\n Metrics.postEvent({event: eventType.ICE_START, meeting});\n break;\n case ICE_STATE.COMPLETED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE COMPLETED.');\n break;\n case ICE_STATE.CONNECTED:\n // Ice connection state goes to connected when both client and server sends STUN packets and\n // Established connected between them. Firefox does not trigger COMPLETED and only trigger CONNECTED\n Metrics.postEvent({event: eventType.ICE_END, meeting});\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.CONNECTION_SUCCESS,\n {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusId\n }\n );\n meeting.setNetworkStatus(NETWORK_STATUS.CONNECTED);\n meeting.reconnectionManager.iceReconnected();\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CONNECTED.');\n break;\n case ICE_STATE.CLOSED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE CLOSED.');\n break;\n case ICE_STATE.DISCONNECTED:\n meeting.setNetworkStatus(NETWORK_STATUS.DISCONNECTED);\n meeting.reconnectionManager.waitForIceReconnect()\n .catch(() => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED. Automatic Reconnection Timed Out.');\n\n connectionFailed();\n });\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE DISCONNECTED.');\n break;\n case ICE_STATE.FAILED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> ICE STATE FAILED.');\n // notify of ice failure\n // Ice failure is the only indicator currently for identifying the actual connection drop\n // Firefox takes sometime 10-15 seconds to go to failed state\n connectionFailed();\n break;\n default:\n break;\n }\n };\n\n peerConnection.onconnectionstatechange = () => {\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CHANGE.');\n switch (peerConnection.connectionState) {\n case CONNECTION_STATE.NEW:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE NEW.');\n break;\n case CONNECTION_STATE.CONNECTING:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTING.');\n break;\n case CONNECTION_STATE.CONNECTED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CONNECTED.');\n break;\n case CONNECTION_STATE.CLOSED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE CLOSED.');\n break;\n case CONNECTION_STATE.DISCONNECTED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE DISCONNECTED.');\n break;\n case CONNECTION_STATE.FAILED:\n LoggerProxy.logger.info('PeerConnectionManager:index#setPeerConnectionEvents --> CONNECTION STATE FAILED.');\n // Special case happens only on chrome where there is no ICE FAILED event\n // only CONNECTION FAILED event gets triggered\n\n connectionFailed();\n break;\n default:\n break;\n }\n };\n};\n\nexport default pc;\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["PersonalMeetingRoomRequest","MEETINGS","options","userId","passcode","meetingAddress","preferred","ParameterError","validPin","PersonalMeetingRoomUtil","getClaimPmrPin","reject","validLink","getClaimPmrLink","request","getClaimedRequestParams","StatelessWebexPlugin"],"sources":["request.js"],"sourcesContent":["import {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {MEETINGS} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nimport PersonalMeetingRoomUtil from './util';\n\n\n/**\n * @class MeetingInfoRequest\n */\nexport default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {\n namespace = MEETINGS;\n\n /**\n *\n * @param {Object} options with format of {userId, passcode, meetingAddress, preferred}\n * @returns {Promise} returns a promise that resolves/rejects the result of the request\n * @memberof PersonalMeetingRoomRequest\n */\n claimPmr(options) {\n if (!options || !options.userId || !options.passcode || !options.meetingAddress || !options.preferred) {\n throw new ParameterError('Claiming a PMR should be done with userId, passcode, preferred, and meetingAddress in options.');\n }\n const validPin = PersonalMeetingRoomUtil.getClaimPmrPin(options.passcode);\n\n if (!validPin) {\n return Promise.reject(new ParameterError('The host pin provided was of an invalid format'));\n }\n const validLink = PersonalMeetingRoomUtil.getClaimPmrLink(options.meetingAddress);\n\n if (!validLink) {\n return Promise.reject(new ParameterError('The PMR link provided was of an invalid format'));\n }\n const request = PersonalMeetingRoomUtil.getClaimedRequestParams(validLink, validPin, options);\n\n return this.request(request);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;AAEA;;;;;;AAGA;AACA;AACA;IACqBA,0B;;;;;;;;;;;;;;;4FACPC,mB;;;;;;;IAEZ;AACF;AACA;AACA;AACA;AACA;IACE,kBAASC,OAAT,EAAkB;MAChB,IAAI,CAACA,OAAD,IAAY,CAACA,OAAO,CAACC,MAArB,IAA+B,CAACD,OAAO,CAACE,QAAxC,IAAoD,CAACF,OAAO,CAACG,cAA7D,IAA+E,CAACH,OAAO,CAACI,SAA5F,EAAuG;QACrG,MAAM,IAAIC,kBAAJ,CAAmB,gGAAnB,CAAN;MACD;;MACD,IAAMC,QAAQ,GAAGC,cAAwBC,cAAxB,CAAuCR,OAAO,CAACE,QAA/C,CAAjB;;MAEA,IAAI,CAACI,QAAL,EAAe;QACb,OAAO,iBAAQG,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMK,SAAS,GAAGH,cAAwBI,eAAxB,CAAwCX,OAAO,CAACG,cAAhD,CAAlB;;MAEA,IAAI,CAACO,SAAL,EAAgB;QACd,OAAO,iBAAQD,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMO,OAAO,GAAGL,cAAwBM,uBAAxB,CAAgDH,SAAhD,EAA2DJ,QAA3D,EAAqEN,OAArE,CAAhB;;MAEA,OAAO,KAAKY,OAAL,CAAaA,OAAb,CAAP;IACD;;;EA1BqDE,+B"}
1
+ {"version":3,"names":["PersonalMeetingRoomRequest","MEETINGS","options","userId","passcode","meetingAddress","preferred","ParameterError","validPin","PersonalMeetingRoomUtil","getClaimPmrPin","reject","validLink","getClaimPmrLink","request","getClaimedRequestParams","StatelessWebexPlugin"],"sources":["request.js"],"sourcesContent":["import {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {MEETINGS} from '../constants';\nimport ParameterError from '../common/errors/parameter';\n\nimport PersonalMeetingRoomUtil from './util';\n\n\n/**\n * @class MeetingInfoRequest\n */\nexport default class PersonalMeetingRoomRequest extends StatelessWebexPlugin {\n namespace = MEETINGS;\n\n /**\n *\n * @param {Object} options with format of {userId, passcode, meetingAddress, preferred}\n * @returns {Promise} returns a promise that resolves/rejects the result of the request\n * @memberof PersonalMeetingRoomRequest\n */\n claimPmr(options) {\n if (!options || !options.userId || !options.passcode || !options.meetingAddress || !options.preferred) {\n throw new ParameterError('Claiming a PMR should be done with userId, passcode, preferred, and meetingAddress in options.');\n }\n const validPin = PersonalMeetingRoomUtil.getClaimPmrPin(options.passcode);\n\n if (!validPin) {\n return Promise.reject(new ParameterError('The host pin provided was of an invalid format'));\n }\n const validLink = PersonalMeetingRoomUtil.getClaimPmrLink(options.meetingAddress);\n\n if (!validLink) {\n return Promise.reject(new ParameterError('The PMR link provided was of an invalid format'));\n }\n const request = PersonalMeetingRoomUtil.getClaimedRequestParams(validLink, validPin, options);\n\n return this.request(request);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;AAEA;;AACA;;AAEA;;;;;;AAGA;AACA;AACA;IACqBA,0B;;;;;;;;;;;;;;;4FACPC,mB;;;;;;;IAEZ;AACF;AACA;AACA;AACA;AACA;IACE,kBAASC,OAAT,EAAkB;MAChB,IAAI,CAACA,OAAD,IAAY,CAACA,OAAO,CAACC,MAArB,IAA+B,CAACD,OAAO,CAACE,QAAxC,IAAoD,CAACF,OAAO,CAACG,cAA7D,IAA+E,CAACH,OAAO,CAACI,SAA5F,EAAuG;QACrG,MAAM,IAAIC,kBAAJ,CAAmB,gGAAnB,CAAN;MACD;;MACD,IAAMC,QAAQ,GAAGC,aAAA,CAAwBC,cAAxB,CAAuCR,OAAO,CAACE,QAA/C,CAAjB;;MAEA,IAAI,CAACI,QAAL,EAAe;QACb,OAAO,iBAAQG,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMK,SAAS,GAAGH,aAAA,CAAwBI,eAAxB,CAAwCX,OAAO,CAACG,cAAhD,CAAlB;;MAEA,IAAI,CAACO,SAAL,EAAgB;QACd,OAAO,iBAAQD,MAAR,CAAe,IAAIJ,kBAAJ,CAAmB,gDAAnB,CAAf,CAAP;MACD;;MACD,IAAMO,OAAO,GAAGL,aAAA,CAAwBM,uBAAxB,CAAgDH,SAAhD,EAA2DJ,QAA3D,EAAqEN,OAArE,CAAhB;;MAEA,OAAO,KAAKY,OAAL,CAAaA,OAAb,CAAP;IACD;;;EA1BqDE,+B"}
@@ -1 +1 @@
1
- {"version":3,"names":["PersonalMeetingRoomUtil","getClaimPmrLink","pmrLink","validator","VALID_PMR_ADDRESS","test","match","VALID_PMR_LINK","WEBEX_DOT_COM","getClaimPmrPin","hostPin","VALID_PIN","getClaimedRequestParams","link","pin","options","method","HTTP_VERBS","POST","api","HECATE","resource","CMR_MEETINGS","CLAIM","body","userId","passcode","preferred","meetingAddress"],"sources":["util.js"],"sourcesContent":["import {\n HTTP_VERBS,\n VALID_PIN,\n VALID_PMR_ADDRESS,\n VALID_PMR_LINK,\n CMR_MEETINGS,\n CLAIM,\n HECATE,\n WEBEX_DOT_COM\n} from '../constants';\n\nconst PersonalMeetingRoomUtil = {};\n\nPersonalMeetingRoomUtil.getClaimPmrLink = (pmrLink) => {\n let validator = VALID_PMR_ADDRESS.test(pmrLink);\n\n if (validator) {\n return pmrLink;\n }\n validator = pmrLink.match(VALID_PMR_LINK);\n if (validator) {\n // userId + '@' + site + '.webex.com'\n return `${validator[4]}@${validator[2]}.${WEBEX_DOT_COM}`;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimPmrPin = (hostPin) => {\n if (VALID_PIN.test(hostPin)) {\n return hostPin;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimedRequestParams = (link, pin, options) => ({\n method: HTTP_VERBS.POST,\n api: HECATE,\n resource: `/${CMR_MEETINGS}/${CLAIM}`,\n body: {\n userId: options.userId,\n passcode: pin,\n preferred: options.preferred,\n meetingAddress: link\n }\n});\n\nexport default PersonalMeetingRoomUtil;\n"],"mappings":";;;;;;;;;;AAAA;;AAWA,IAAMA,uBAAuB,GAAG,EAAhC;;AAEAA,uBAAuB,CAACC,eAAxB,GAA0C,UAACC,OAAD,EAAa;EACrD,IAAIC,SAAS,GAAGC,6BAAkBC,IAAlB,CAAuBH,OAAvB,CAAhB;;EAEA,IAAIC,SAAJ,EAAe;IACb,OAAOD,OAAP;EACD;;EACDC,SAAS,GAAGD,OAAO,CAACI,KAAR,CAAcC,yBAAd,CAAZ;;EACA,IAAIJ,SAAJ,EAAe;IACb;IACA,iBAAUA,SAAS,CAAC,CAAD,CAAnB,cAA0BA,SAAS,CAAC,CAAD,CAAnC,cAA0CK,wBAA1C;EACD;;EAED,OAAO,IAAP;AACD,CAbD;;AAeAR,uBAAuB,CAACS,cAAxB,GAAyC,UAACC,OAAD,EAAa;EACpD,IAAIC,qBAAUN,IAAV,CAAeK,OAAf,CAAJ,EAA6B;IAC3B,OAAOA,OAAP;EACD;;EAED,OAAO,IAAP;AACD,CAND;;AAQAV,uBAAuB,CAACY,uBAAxB,GAAkD,UAACC,IAAD,EAAOC,GAAP,EAAYC,OAAZ;EAAA,OAAyB;IACzEC,MAAM,EAAEC,sBAAWC,IADsD;IAEzEC,GAAG,EAAEC,iBAFoE;IAGzEC,QAAQ,aAAMC,uBAAN,cAAsBC,gBAAtB,CAHiE;IAIzEC,IAAI,EAAE;MACJC,MAAM,EAAEV,OAAO,CAACU,MADZ;MAEJC,QAAQ,EAAEZ,GAFN;MAGJa,SAAS,EAAEZ,OAAO,CAACY,SAHf;MAIJC,cAAc,EAAEf;IAJZ;EAJmE,CAAzB;AAAA,CAAlD;;eAYeb,uB"}
1
+ {"version":3,"names":["PersonalMeetingRoomUtil","getClaimPmrLink","pmrLink","validator","VALID_PMR_ADDRESS","test","match","VALID_PMR_LINK","WEBEX_DOT_COM","getClaimPmrPin","hostPin","VALID_PIN","getClaimedRequestParams","link","pin","options","method","HTTP_VERBS","POST","api","HECATE","resource","CMR_MEETINGS","CLAIM","body","userId","passcode","preferred","meetingAddress"],"sources":["util.js"],"sourcesContent":["import {\n HTTP_VERBS,\n VALID_PIN,\n VALID_PMR_ADDRESS,\n VALID_PMR_LINK,\n CMR_MEETINGS,\n CLAIM,\n HECATE,\n WEBEX_DOT_COM\n} from '../constants';\n\nconst PersonalMeetingRoomUtil = {};\n\nPersonalMeetingRoomUtil.getClaimPmrLink = (pmrLink) => {\n let validator = VALID_PMR_ADDRESS.test(pmrLink);\n\n if (validator) {\n return pmrLink;\n }\n validator = pmrLink.match(VALID_PMR_LINK);\n if (validator) {\n // userId + '@' + site + '.webex.com'\n return `${validator[4]}@${validator[2]}.${WEBEX_DOT_COM}`;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimPmrPin = (hostPin) => {\n if (VALID_PIN.test(hostPin)) {\n return hostPin;\n }\n\n return null;\n};\n\nPersonalMeetingRoomUtil.getClaimedRequestParams = (link, pin, options) => ({\n method: HTTP_VERBS.POST,\n api: HECATE,\n resource: `/${CMR_MEETINGS}/${CLAIM}`,\n body: {\n userId: options.userId,\n passcode: pin,\n preferred: options.preferred,\n meetingAddress: link\n }\n});\n\nexport default PersonalMeetingRoomUtil;\n"],"mappings":";;;;;;;;;;AAAA;;AAWA,IAAMA,uBAAuB,GAAG,EAAhC;;AAEAA,uBAAuB,CAACC,eAAxB,GAA0C,UAACC,OAAD,EAAa;EACrD,IAAIC,SAAS,GAAGC,4BAAA,CAAkBC,IAAlB,CAAuBH,OAAvB,CAAhB;;EAEA,IAAIC,SAAJ,EAAe;IACb,OAAOD,OAAP;EACD;;EACDC,SAAS,GAAGD,OAAO,CAACI,KAAR,CAAcC,yBAAd,CAAZ;;EACA,IAAIJ,SAAJ,EAAe;IACb;IACA,iBAAUA,SAAS,CAAC,CAAD,CAAnB,cAA0BA,SAAS,CAAC,CAAD,CAAnC,cAA0CK,wBAA1C;EACD;;EAED,OAAO,IAAP;AACD,CAbD;;AAeAR,uBAAuB,CAACS,cAAxB,GAAyC,UAACC,OAAD,EAAa;EACpD,IAAIC,oBAAA,CAAUN,IAAV,CAAeK,OAAf,CAAJ,EAA6B;IAC3B,OAAOA,OAAP;EACD;;EAED,OAAO,IAAP;AACD,CAND;;AAQAV,uBAAuB,CAACY,uBAAxB,GAAkD,UAACC,IAAD,EAAOC,GAAP,EAAYC,OAAZ;EAAA,OAAyB;IACzEC,MAAM,EAAEC,qBAAA,CAAWC,IADsD;IAEzEC,GAAG,EAAEC,iBAFoE;IAGzEC,QAAQ,aAAMC,uBAAN,cAAsBC,gBAAtB,CAHiE;IAIzEC,IAAI,EAAE;MACJC,MAAM,EAAEV,OAAO,CAACU,MADZ;MAEJC,QAAQ,EAAEZ,GAFN;MAGJa,SAAS,EAAEZ,OAAO,CAACY,SAHf;MAIJC,cAAc,EAAEf;IAJZ;EAJmE,CAAzB;AAAA,CAAlD;;eAYeb,uB"}
@@ -1 +1 @@
1
- {"version":3,"names":["Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","cluster","iceServers","udp","tcp","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","log","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","reachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","e","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","ELAPSED","waitTime","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n buildPeerConnectionConfig(cluster) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n createPeerConnection(cluster) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n getElapsedTime(peerConnection) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n getLocalSDPForClusters(clusterList) {\n let clusters = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleIceGatheringStateChange(peerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleOnIceCandidate(peerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @returns {Promise}\n */\n iceGatheringState(peerConnection) {\n const ELAPSED = 'elapsed';\n const waitTime = 5e3;\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const CLOSED = {CONNECTION_STATE};\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, waitTime);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n parseIceResultsToReachabilityResults(iceResults) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n performReachabilityCheck(clusterList) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setLatencyAndClose(peerConnection, elapsed) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","cluster","iceServers","udp","tcp","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","log","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","reachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","e","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","ELAPSED","waitTime","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n buildPeerConnectionConfig(cluster) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n createPeerConnection(cluster) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n getElapsedTime(peerConnection) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n getLocalSDPForClusters(clusterList) {\n let clusters = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleIceGatheringStateChange(peerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleOnIceCandidate(peerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @returns {Promise}\n */\n iceGatheringState(peerConnection) {\n const ELAPSED = 'elapsed';\n const waitTime = 5e3;\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const CLOSED = {CONNECTION_STATE};\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, waitTime);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n parseIceResultsToReachabilityResults(iceResults) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n performReachabilityCheck(clusterList) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setLatencyAndClose(peerConnection, elapsed) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["RechabilityRequest","webex","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","then","res","clusters","body","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.js"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {\n HTTP_VERBS,\n RESOURCE,\n API\n} from '../constants';\n\n/**\n * @class RechabilityRequest\n */\nclass RechabilityRequest {\n /**\n * Creates an instance of RechabilityRequest.\n * @param {object} webex\n * @memberof RechabilityRequest\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * gets the cluster information\n * @returns {Promise}\n */\n getClusters = () => this.webex.request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS\n })\n .then((res) => {\n const {clusters} = res.body;\n\n LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);\n\n return clusters;\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList) => this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList}\n })\n .then((res) => {\n LoggerProxy.logger.log('Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully');\n\n return res.body;\n });\n}\n\nexport default RechabilityRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAMA;AACA;AACA;IACMA,kB;AACJ;AACF;AACA;AACA;AACA;AACE,4BAAYC,KAAZ,EAAmB;EAAA;;EAAA;EAAA,mDAQL;IAAA,OAAM,KAAI,CAACA,KAAL,CAAWC,OAAX,CAAmB;MACrCC,MAAM,EAAEC,sBAAWC,GADkB;MAErCC,wBAAwB,EAAE,KAFW;MAGrCC,GAAG,EAAEC,eAAIC,iBAH4B;MAIrCC,QAAQ,EAAEC,oBAASC;IAJkB,CAAnB,EAMjBC,IANiB,CAMZ,UAACC,GAAD,EAAS;MACb,IAAOC,QAAP,GAAmBD,GAAG,CAACE,IAAvB,CAAOD,QAAP;;MAEAE,qBAAYC,MAAZ,CAAmBC,GAAnB,wEAAuF,wBAAeJ,QAAf,CAAvF;;MAEA,OAAOA,QAAP;IACD,CAZiB,CAAN;EAAA,CARK;EAAA,4DA2BI,UAACK,YAAD;IAAA,OAAkB,KAAI,CAACnB,KAAL,CAAWC,OAAX,CAAmB;MAC1DC,MAAM,EAAEC,sBAAWiB,IADuC;MAE1Df,wBAAwB,EAAE,KAFgC;MAG1DC,GAAG,EAAEC,eAAIC,iBAHiD;MAI1DC,QAAQ,EAAEC,oBAASW,YAJuC;MAK1DN,IAAI,EAAE;QAACO,MAAM,EAAEH;MAAT;IALoD,CAAnB,EAOtCP,IAPsC,CAOjC,UAACC,GAAD,EAAS;MACbG,qBAAYC,MAAZ,CAAmBC,GAAnB,CAAuB,6EAAvB;;MAEA,OAAOL,GAAG,CAACE,IAAX;IACD,CAXsC,CAAlB;EAAA,CA3BJ;EACjB,KAAKf,KAAL,GAAaA,KAAb;AACD;AAED;AACF;AACA;AACA;;eAkCeD,kB"}
1
+ {"version":3,"names":["RechabilityRequest","webex","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","then","res","clusters","body","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.js"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {\n HTTP_VERBS,\n RESOURCE,\n API\n} from '../constants';\n\n/**\n * @class RechabilityRequest\n */\nclass RechabilityRequest {\n /**\n * Creates an instance of RechabilityRequest.\n * @param {object} webex\n * @memberof RechabilityRequest\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * gets the cluster information\n * @returns {Promise}\n */\n getClusters = () => this.webex.request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS\n })\n .then((res) => {\n const {clusters} = res.body;\n\n LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);\n\n return clusters;\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList) => this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList}\n })\n .then((res) => {\n LoggerProxy.logger.log('Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully');\n\n return res.body;\n });\n}\n\nexport default RechabilityRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAMA;AACA;AACA;IACMA,kB;AACJ;AACF;AACA;AACA;AACA;AACE,4BAAYC,KAAZ,EAAmB;EAAA;;EAAA;EAAA,mDAQL;IAAA,OAAM,KAAI,CAACA,KAAL,CAAWC,OAAX,CAAmB;MACrCC,MAAM,EAAEC,qBAAA,CAAWC,GADkB;MAErCC,wBAAwB,EAAE,KAFW;MAGrCC,GAAG,EAAEC,cAAA,CAAIC,iBAH4B;MAIrCC,QAAQ,EAAEC,mBAAA,CAASC;IAJkB,CAAnB,EAMjBC,IANiB,CAMZ,UAACC,GAAD,EAAS;MACb,IAAOC,QAAP,GAAmBD,GAAG,CAACE,IAAvB,CAAOD,QAAP;;MAEAE,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,wEAAuF,wBAAeJ,QAAf,CAAvF;;MAEA,OAAOA,QAAP;IACD,CAZiB,CAAN;EAAA,CARK;EAAA,4DA2BI,UAACK,YAAD;IAAA,OAAkB,KAAI,CAACnB,KAAL,CAAWC,OAAX,CAAmB;MAC1DC,MAAM,EAAEC,qBAAA,CAAWiB,IADuC;MAE1Df,wBAAwB,EAAE,KAFgC;MAG1DC,GAAG,EAAEC,cAAA,CAAIC,iBAHiD;MAI1DC,QAAQ,EAAEC,mBAAA,CAASW,YAJuC;MAK1DN,IAAI,EAAE;QAACO,MAAM,EAAEH;MAAT;IALoD,CAAnB,EAOtCP,IAPsC,CAOjC,UAACC,GAAD,EAAS;MACbG,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,CAAuB,6EAAvB;;MAEA,OAAOL,GAAG,CAACE,IAAX;IACD,CAXsC,CAAlB;EAAA,CA3BJ;EACjB,KAAKf,KAAL,GAAaA,KAAb;AACD;AAED;AACF;AACA;AACA;;eAkCeD,kB"}
@@ -365,10 +365,8 @@ var ReconnectionManager = /*#__PURE__*/function () {
365
365
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'); // Reset our reconnect status since we are looping back to the beginning
366
366
 
367
367
 
368
- // Reset our reconnect status since we are looping back to the beginning
369
368
  _this3.status = _constants.RECONNECTION.STATE.DEFAULT_STATUS; // This is a network retry, so we should not log START metrics again
370
369
 
371
- // This is a network retry, so we should not log START metrics again
372
370
  return _this3.reconnect({
373
371
  networkDisconnect: true,
374
372
  networkRetry: true
@@ -376,7 +374,6 @@ var ReconnectionManager = /*#__PURE__*/function () {
376
374
  } // Reconnect has failed
377
375
 
378
376
 
379
- // Reconnect has failed
380
377
  _loggerProxy.default.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);
381
378
 
382
379
  _loggerProxy.default.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');
@@ -1 +1 @@
1
- {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","LoggerProxy","logger","log","clearTimeout","reject","setTimeout","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","IN_PROGRESS","reconnectMercuryWebSocket","internal","device","url","FAILURE","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","previousCorrelationId","correlationId","join","rejoin","RoapCollection","deleteSession","Media","stopTracks","mediaProperties","shareTrack","isSharing","NO_SHARE","mediaDirection","sendShare","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","reason","SHARE_STOPPED_REASON","MEETING_REJOIN","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","setupPeerConnection","attachMedia","meetingId","remoteQualityLevel","enableRtx","enableExtmap","peerConnection","setRemoteStream","roap","sendRoapMediaRequest","sdp","roapSeq","mercury","connected","disconnect","connect","PeerConnectionManager","close","unsetPeerConnection","reInitiatePeerconnection","setPeerConnectionEvents","statsAnalyzer","updatePeerconnection"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport PeerConnectionManager from '../peer-connection-manager';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\nimport RoapCollection from '../roap/collection';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({wasSharing, error = new Error('Meeting needs to be rejoined')}) {\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n*/\nexport default class ReconnectionManager {\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout\n };\n\n /**\n * @instance\n * @type {String}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');\n\n this.iceState.disconnected = true;\n\n return new Promise((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n }\n else {\n this.iceState.disconnected = false;\n reject(new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`));\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n cleanUp() {\n this.reset();\n this.meeting = null;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection already in progress.');\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n async reconnect({networkDisconnect = false, networkRetry = false} = {}) {\n LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n }\n catch (error) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection unable to begin.', error);\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect start metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW}\n });\n })\n .catch((reconnectError) => {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');\n\n const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false\n }\n ]\n }\n };\n\n Metrics.postEvent(reconnectMetric);\n if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n\n throw reconnectError;\n });\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n async executeReconnection({networkDisconnect = false}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Websocket reconnected.', this.webex.internal.device.url);\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.');\n this.status = RECONNECTION.STATE.FAILURE;\n throw (error);\n }\n }\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');\n await this.webex.meetings.syncMeetings();\n }\n catch (syncError) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', syncError);\n throw (new NeedsRetryError(syncError));\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely ');\n\n throw new Error('Unable to rejoin a meeting already ended or inactive .');\n }\n\n LoggerProxy.logger.info(`ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`);\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw (new NeedsRejoinError({wasSharing}));\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log('ReconnectionManager:index#executeReconnection --> Media reestablished');\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Media reestablishment failed');\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw (error);\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');\n const previousCorrelationId = this.meeting.correlationId;\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n RoapCollection.deleteSession(previousCorrelationId);\n\n if (wasSharing) {\n // Stop the share streams if user tried to rejoin\n Media.stopTracks(this.meeting.mediaProperties.shareTrack);\n this.meeting.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.meeting.mediaProperties.mediaDirection.sendShare = false;\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'rejoinMeeting'\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason: SHARE_STOPPED_REASON.MEETING_REJOIN\n }\n );\n }\n }\n catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(`ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`, joinError);\n this.rejoinMeeting();\n }\n else {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.', joinError);\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE,\n {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack\n }\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n }\n catch (mediaError) {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.', mediaError);\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');\n\n ReconnectionManager.setupPeerConnection(this.meeting);\n\n return Media.attachMedia(this.meeting.mediaProperties, {\n meetingId: this.meeting.id,\n remoteQualityLevel: this.meeting.mediaProperties.remoteQualityLevel,\n enableRtx: this.meeting.config.enableRtx,\n enableExtmap: this.meeting.config.enableExtmap\n })\n .then((peerConnection) => this.meeting.setRemoteStream(peerConnection))\n .then(() => {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Sending ROAP media request');\n\n return this.meeting.roap\n .sendRoapMediaRequest({\n sdp: this.meeting.mediaProperties.peerConnection.sdp,\n roapSeq: this.meeting.roapSeq,\n meeting: this.meeting,\n reconnect: true\n });\n });\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.');\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.');\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.');\n }\n catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.', disconnectError);\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.');\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.');\n }\n catch (connectError) {\n LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.', connectError);\n\n throw (connectError);\n }\n }\n\n /**\n * @param {Meeting} meeting\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n static setupPeerConnection(meeting) {\n LoggerProxy.logger.log('ReconnectionManager:index#setupPeerConnection --> Begin resetting peer connection');\n // close pcs, unset to null and create a new one with out closing any streams\n PeerConnectionManager.close(meeting.mediaProperties.peerConnection);\n meeting.mediaProperties.unsetPeerConnection();\n meeting.mediaProperties.reInitiatePeerconnection();\n PeerConnectionManager.setPeerConnectionEvents(meeting);\n // update the peerconnection in the stats manager when ever we reconnect\n meeting.statsAnalyzer.updatePeerconnection(meeting.mediaProperties.peerConnection);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","LoggerProxy","logger","log","clearTimeout","reject","setTimeout","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","IN_PROGRESS","reconnectMercuryWebSocket","internal","device","url","FAILURE","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","previousCorrelationId","correlationId","join","rejoin","RoapCollection","deleteSession","Media","stopTracks","mediaProperties","shareTrack","isSharing","NO_SHARE","mediaDirection","sendShare","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","reason","SHARE_STOPPED_REASON","MEETING_REJOIN","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","setupPeerConnection","attachMedia","meetingId","remoteQualityLevel","enableRtx","enableExtmap","peerConnection","setRemoteStream","roap","sendRoapMediaRequest","sdp","roapSeq","mercury","connected","disconnect","connect","PeerConnectionManager","close","unsetPeerConnection","reInitiatePeerconnection","setPeerConnectionEvents","statsAnalyzer","updatePeerconnection"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport PeerConnectionManager from '../peer-connection-manager';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\nimport RoapCollection from '../roap/collection';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({wasSharing, error = new Error('Meeting needs to be rejoined')}) {\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n*/\nexport default class ReconnectionManager {\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout\n };\n\n /**\n * @instance\n * @type {String}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');\n\n this.iceState.disconnected = true;\n\n return new Promise((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n }\n else {\n this.iceState.disconnected = false;\n reject(new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`));\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n cleanUp() {\n this.reset();\n this.meeting = null;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection already in progress.');\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n async reconnect({networkDisconnect = false, networkRetry = false} = {}) {\n LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n }\n catch (error) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection unable to begin.', error);\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect start metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW}\n });\n })\n .catch((reconnectError) => {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');\n\n const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false\n }\n ]\n }\n };\n\n Metrics.postEvent(reconnectMetric);\n if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n\n throw reconnectError;\n });\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n async executeReconnection({networkDisconnect = false}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Websocket reconnected.', this.webex.internal.device.url);\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.');\n this.status = RECONNECTION.STATE.FAILURE;\n throw (error);\n }\n }\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');\n await this.webex.meetings.syncMeetings();\n }\n catch (syncError) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', syncError);\n throw (new NeedsRetryError(syncError));\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely ');\n\n throw new Error('Unable to rejoin a meeting already ended or inactive .');\n }\n\n LoggerProxy.logger.info(`ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`);\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw (new NeedsRejoinError({wasSharing}));\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log('ReconnectionManager:index#executeReconnection --> Media reestablished');\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Media reestablishment failed');\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw (error);\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');\n const previousCorrelationId = this.meeting.correlationId;\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n RoapCollection.deleteSession(previousCorrelationId);\n\n if (wasSharing) {\n // Stop the share streams if user tried to rejoin\n Media.stopTracks(this.meeting.mediaProperties.shareTrack);\n this.meeting.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.meeting.mediaProperties.mediaDirection.sendShare = false;\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'rejoinMeeting'\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason: SHARE_STOPPED_REASON.MEETING_REJOIN\n }\n );\n }\n }\n catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(`ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`, joinError);\n this.rejoinMeeting();\n }\n else {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.', joinError);\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE,\n {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack\n }\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n }\n catch (mediaError) {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.', mediaError);\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');\n\n ReconnectionManager.setupPeerConnection(this.meeting);\n\n return Media.attachMedia(this.meeting.mediaProperties, {\n meetingId: this.meeting.id,\n remoteQualityLevel: this.meeting.mediaProperties.remoteQualityLevel,\n enableRtx: this.meeting.config.enableRtx,\n enableExtmap: this.meeting.config.enableExtmap\n })\n .then((peerConnection) => this.meeting.setRemoteStream(peerConnection))\n .then(() => {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Sending ROAP media request');\n\n return this.meeting.roap\n .sendRoapMediaRequest({\n sdp: this.meeting.mediaProperties.peerConnection.sdp,\n roapSeq: this.meeting.roapSeq,\n meeting: this.meeting,\n reconnect: true\n });\n });\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.');\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.');\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.');\n }\n catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.', disconnectError);\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.');\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info('ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.');\n }\n catch (connectError) {\n LoggerProxy.logger.error('ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.', connectError);\n\n throw (connectError);\n }\n }\n\n /**\n * @param {Meeting} meeting\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n static setupPeerConnection(meeting) {\n LoggerProxy.logger.log('ReconnectionManager:index#setupPeerConnection --> Begin resetting peer connection');\n // close pcs, unset to null and create a new one with out closing any streams\n PeerConnectionManager.close(meeting.mediaProperties.peerConnection);\n meeting.mediaProperties.unsetPeerConnection();\n meeting.mediaProperties.reInitiatePeerconnection();\n PeerConnectionManager.setPeerConnectionEvents(meeting);\n // update the peerconnection in the stats manager when ever we reconnect\n meeting.statsAnalyzer.updatePeerconnection(meeting.mediaProperties.peerConnection);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"names":["RoapCollection","sessions","getSession","id","activeSequences","deleteSession","getSessionSequence","seqId","session","state","RoapStateMachine","createState","finished","deleteSessionSequence","seq","isBusy","onSessionSequenceFinish"],"sources":["collection.js"],"sourcesContent":["import RoapStateMachine from '../roap/state';\n\n/* eslint-disable */\nconst RoapCollection = {\n sessions: {},\n\n getSession(id) {\n if (!this.sessions[id]) {\n this.sessions[id] = {\n activeSequences: 0,\n };\n }\n return this.sessions[id];\n },\n\n deleteSession(id) {\n if (this.getSession(id)) {\n delete this.sessions[id];\n }\n },\n\n getSessionSequence(id, seqId) {\n const session = this.getSession(id);\n if (!session[seqId]) {\n session[seqId] = {\n state: RoapStateMachine.createState(),\n finished: false,\n };\n session.activeSequences += 1;\n\n }\n return session[seqId];\n },\n\n deleteSessionSequence(id, seqId) {\n const seq = this.getSessionSequence(id, seqId);\n if (seq) {\n if (!seq.finished) {\n session.activeSequences -= 1;\n }\n delete this.sessions[id][seqId];\n }\n },\n\n isBusy(id) {\n const session = this.getSession(id);\n if (!session) return false;\n\n return session.activeSequences > 0;\n },\n\n onSessionSequenceFinish(id, seqId) {\n const session = this.getSession(id);\n const seq = session[seqId];\n if (seq && !seq.finished) {\n seq.finished = true;\n session.activeSequences -= 1;\n }\n }\n\n};\n\nexport default RoapCollection;\n"],"mappings":";;;;;;;;;;;;AAAA;;AAEA;AACA,IAAMA,cAAc,GAAG;EACrBC,QAAQ,EAAE,EADW;EAGrBC,UAHqB,sBAGVC,EAHU,EAGN;IACb,IAAI,CAAC,KAAKF,QAAL,CAAcE,EAAd,CAAL,EAAwB;MACtB,KAAKF,QAAL,CAAcE,EAAd,IAAoB;QAClBC,eAAe,EAAE;MADC,CAApB;IAGD;;IACD,OAAO,KAAKH,QAAL,CAAcE,EAAd,CAAP;EACD,CAVoB;EAYrBE,aAZqB,yBAYPF,EAZO,EAYH;IAChB,IAAI,KAAKD,UAAL,CAAgBC,EAAhB,CAAJ,EAAyB;MACvB,OAAO,KAAKF,QAAL,CAAcE,EAAd,CAAP;IACD;EACF,CAhBoB;EAkBrBG,kBAlBqB,8BAkBFH,EAlBE,EAkBEI,KAlBF,EAkBS;IAC5B,IAAMC,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;;IACA,IAAI,CAACK,OAAO,CAACD,KAAD,CAAZ,EAAqB;MACnBC,OAAO,CAACD,KAAD,CAAP,GAAiB;QACfE,KAAK,EAAEC,eAAiBC,WAAjB,EADQ;QAEfC,QAAQ,EAAE;MAFK,CAAjB;MAIAJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;IAED;;IACD,OAAOI,OAAO,CAACD,KAAD,CAAd;EACD,CA7BoB;EA+BrBM,qBA/BqB,iCA+BCV,EA/BD,EA+BKI,KA/BL,EA+BY;IAC/B,IAAMO,GAAG,GAAG,KAAKR,kBAAL,CAAwBH,EAAxB,EAA4BI,KAA5B,CAAZ;;IACA,IAAIO,GAAJ,EAAS;MACP,IAAI,CAACA,GAAG,CAACF,QAAT,EAAmB;QACjBJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;MACD;;MACD,OAAO,KAAKH,QAAL,CAAcE,EAAd,EAAkBI,KAAlB,CAAP;IACD;EACF,CAvCoB;EAyCrBQ,MAzCqB,kBAyCdZ,EAzCc,EAyCV;IACT,IAAMK,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;IACA,IAAI,CAACK,OAAL,EAAc,OAAO,KAAP;IAEd,OAAOA,OAAO,CAACJ,eAAR,GAA0B,CAAjC;EACD,CA9CoB;EAgDrBY,uBAhDqB,mCAgDGb,EAhDH,EAgDOI,KAhDP,EAgDc;IACjC,IAAMC,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;IACA,IAAMW,GAAG,GAAGN,OAAO,CAACD,KAAD,CAAnB;;IACA,IAAIO,GAAG,IAAI,CAACA,GAAG,CAACF,QAAhB,EAA0B;MACxBE,GAAG,CAACF,QAAJ,GAAe,IAAf;MACAJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;IACD;EACF;AAvDoB,CAAvB;eA2DeJ,c"}
1
+ {"version":3,"names":["RoapCollection","sessions","getSession","id","activeSequences","deleteSession","getSessionSequence","seqId","session","state","RoapStateMachine","createState","finished","deleteSessionSequence","seq","isBusy","onSessionSequenceFinish"],"sources":["collection.js"],"sourcesContent":["import RoapStateMachine from '../roap/state';\n\n/* eslint-disable */\nconst RoapCollection = {\n sessions: {},\n\n getSession(id) {\n if (!this.sessions[id]) {\n this.sessions[id] = {\n activeSequences: 0,\n };\n }\n return this.sessions[id];\n },\n\n deleteSession(id) {\n if (this.getSession(id)) {\n delete this.sessions[id];\n }\n },\n\n getSessionSequence(id, seqId) {\n const session = this.getSession(id);\n if (!session[seqId]) {\n session[seqId] = {\n state: RoapStateMachine.createState(),\n finished: false,\n };\n session.activeSequences += 1;\n\n }\n return session[seqId];\n },\n\n deleteSessionSequence(id, seqId) {\n const seq = this.getSessionSequence(id, seqId);\n if (seq) {\n if (!seq.finished) {\n session.activeSequences -= 1;\n }\n delete this.sessions[id][seqId];\n }\n },\n\n isBusy(id) {\n const session = this.getSession(id);\n if (!session) return false;\n\n return session.activeSequences > 0;\n },\n\n onSessionSequenceFinish(id, seqId) {\n const session = this.getSession(id);\n const seq = session[seqId];\n if (seq && !seq.finished) {\n seq.finished = true;\n session.activeSequences -= 1;\n }\n }\n\n};\n\nexport default RoapCollection;\n"],"mappings":";;;;;;;;;;;;AAAA;;AAEA;AACA,IAAMA,cAAc,GAAG;EACrBC,QAAQ,EAAE,EADW;EAGrBC,UAHqB,sBAGVC,EAHU,EAGN;IACb,IAAI,CAAC,KAAKF,QAAL,CAAcE,EAAd,CAAL,EAAwB;MACtB,KAAKF,QAAL,CAAcE,EAAd,IAAoB;QAClBC,eAAe,EAAE;MADC,CAApB;IAGD;;IACD,OAAO,KAAKH,QAAL,CAAcE,EAAd,CAAP;EACD,CAVoB;EAYrBE,aAZqB,yBAYPF,EAZO,EAYH;IAChB,IAAI,KAAKD,UAAL,CAAgBC,EAAhB,CAAJ,EAAyB;MACvB,OAAO,KAAKF,QAAL,CAAcE,EAAd,CAAP;IACD;EACF,CAhBoB;EAkBrBG,kBAlBqB,8BAkBFH,EAlBE,EAkBEI,KAlBF,EAkBS;IAC5B,IAAMC,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;;IACA,IAAI,CAACK,OAAO,CAACD,KAAD,CAAZ,EAAqB;MACnBC,OAAO,CAACD,KAAD,CAAP,GAAiB;QACfE,KAAK,EAAEC,cAAA,CAAiBC,WAAjB,EADQ;QAEfC,QAAQ,EAAE;MAFK,CAAjB;MAIAJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;IAED;;IACD,OAAOI,OAAO,CAACD,KAAD,CAAd;EACD,CA7BoB;EA+BrBM,qBA/BqB,iCA+BCV,EA/BD,EA+BKI,KA/BL,EA+BY;IAC/B,IAAMO,GAAG,GAAG,KAAKR,kBAAL,CAAwBH,EAAxB,EAA4BI,KAA5B,CAAZ;;IACA,IAAIO,GAAJ,EAAS;MACP,IAAI,CAACA,GAAG,CAACF,QAAT,EAAmB;QACjBJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;MACD;;MACD,OAAO,KAAKH,QAAL,CAAcE,EAAd,EAAkBI,KAAlB,CAAP;IACD;EACF,CAvCoB;EAyCrBQ,MAzCqB,kBAyCdZ,EAzCc,EAyCV;IACT,IAAMK,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;IACA,IAAI,CAACK,OAAL,EAAc,OAAO,KAAP;IAEd,OAAOA,OAAO,CAACJ,eAAR,GAA0B,CAAjC;EACD,CA9CoB;EAgDrBY,uBAhDqB,mCAgDGb,EAhDH,EAgDOI,KAhDP,EAgDc;IACjC,IAAMC,OAAO,GAAG,KAAKN,UAAL,CAAgBC,EAAhB,CAAhB;IACA,IAAMW,GAAG,GAAGN,OAAO,CAACD,KAAD,CAAnB;;IACA,IAAIO,GAAG,IAAI,CAACA,GAAG,CAACF,QAAhB,EAA0B;MACxBE,GAAG,CAACF,QAAJ,GAAe,IAAf;MACAJ,OAAO,CAACJ,eAAR,IAA2B,CAA3B;IACD;EACF;AAvDoB,CAAvB;eA2DeJ,c"}