@webex/plugin-meetings 1.156.0 → 1.156.1

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.
@@ -36,6 +36,8 @@ var _config = _interopRequireDefault(require("../common/config"));
36
36
 
37
37
  var _constants = require("../constants");
38
38
 
39
+ var _constants2 = _interopRequireDefault(require("../metrics/constants"));
40
+
39
41
  var _config2 = require("../metrics/config");
40
42
 
41
43
  var _media = _interopRequireDefault(require("../common/errors/media"));
@@ -385,7 +387,7 @@ pc.setRemoteSessionDetails = function (peerConnection, typeStr, remoteSdp, meeti
385
387
  }).catch(function (error) {
386
388
  _loggerProxy.default.logger.error("Peer-connection-manager:index#setRemoteDescription --> ".concat(error, " missing remotesdp"));
387
389
 
388
- var metricName = _constants.BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;
390
+ var metricName = _constants2.default.PEERCONNECTION_FAILURE;
389
391
  var data = {
390
392
  correlation_id: meetingId,
391
393
  reason: error.message,
@@ -467,13 +469,13 @@ pc.createOffer = function (peerConnection, _ref2) {
467
469
  _loggerProxy.default.logger.error("Peer-connection-manager:index#createOffer --> ".concat(error));
468
470
 
469
471
  if (error instanceof _webexErrors.InvalidSdpError) {
470
- _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {
472
+ _metrics.default.sendBehavioralMetric(_constants2.default.INVALID_ICE_CANDIDATE, {
471
473
  correlation_id: meetingId,
472
474
  code: error.code,
473
475
  reason: error.message
474
476
  });
475
477
  } else {
476
- var metricName = _constants.BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;
478
+ var metricName = _constants2.default.PEERCONNECTION_FAILURE;
477
479
  var data = {
478
480
  correlation_id: meetingId,
479
481
  reason: error.message,
@@ -591,11 +593,11 @@ pc.createAnswer = function (params, _ref4) {
591
593
  return peerConnection;
592
594
  }).catch(function (error) {
593
595
  if (error instanceof _webexErrors.InvalidSdpError) {
594
- _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.INVALID_ICE_CANDIDATE, {
596
+ _metrics.default.sendBehavioralMetric(_constants2.default.INVALID_ICE_CANDIDATE, {
595
597
  correlation_id: meetingId
596
598
  });
597
599
  } else {
598
- var metricName = _constants.BEHAVIORAL_METRICS.PEERCONNECTION_FAILURE;
600
+ var metricName = _constants2.default.PEERCONNECTION_FAILURE;
599
601
  var data = {
600
602
  correlation_id: meetingId,
601
603
  reason: error.message,
@@ -668,7 +670,7 @@ pc.setPeerConnectionEvents = function (meeting) {
668
670
  function: 'connectionFailed'
669
671
  });
670
672
 
671
- _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.CONNECTION_FAILURE, {
673
+ _metrics.default.sendBehavioralMetric(_constants2.default.CONNECTION_FAILURE, {
672
674
  correlation_id: meeting.correlationId,
673
675
  locus_id: meeting.locusId
674
676
  });
@@ -701,7 +703,7 @@ pc.setPeerConnectionEvents = function (meeting) {
701
703
  meeting: meeting
702
704
  });
703
705
 
704
- _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.CONNECTION_SUCCESS, {
706
+ _metrics.default.sendBehavioralMetric(_constants2.default.CONNECTION_SUCCESS, {
705
707
  correlation_id: meeting.correlationId,
706
708
  locus_id: meeting.locusId
707
709
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"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"],"mappings":"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","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 BEHAVIORAL_METRICS\n} from '../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"]}
1
+ {"version":3,"sources":["index.js"],"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"],"mappings":"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","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"]}
@@ -36,6 +36,8 @@ var _triggerProxy = _interopRequireDefault(require("../common/events/trigger-pro
36
36
 
37
37
  var _constants = require("../constants");
38
38
 
39
+ var _constants2 = _interopRequireDefault(require("../metrics/constants"));
40
+
39
41
  var _reconnection = _interopRequireDefault(require("../common/errors/reconnection"));
40
42
 
41
43
  var _reconnectionInProgress = _interopRequireDefault(require("../common/errors/reconnection-in-progress"));
@@ -632,7 +634,7 @@ var ReconnectionManager = /*#__PURE__*/function () {
632
634
  case 19:
633
635
  _loggerProxy.default.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.', _context3.t0);
634
636
 
635
- _metrics.default.sendBehavioralMetric(_constants.BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {
637
+ _metrics.default.sendBehavioralMetric(_constants2.default.MEETING_MAX_REJOIN_FAILURE, {
636
638
  locus_id: this.meeting.locusUrl.split('/').pop(),
637
639
  reason: _context3.t0.message,
638
640
  stack: _context3.t0.stack
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"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"],"mappings":"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","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 BEHAVIORAL_METRICS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_\n} from '../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"]}
1
+ {"version":3,"sources":["index.js"],"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"],"mappings":"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","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"]}
@@ -32,6 +32,8 @@ var _constants = require("../constants");
32
32
 
33
33
  var _metrics = _interopRequireDefault(require("../metrics"));
34
34
 
35
+ var _constants2 = _interopRequireDefault(require("../metrics/constants"));
36
+
35
37
  var _util = _interopRequireDefault(require("./util"));
36
38
 
37
39
  var _collection = _interopRequireDefault(require("./collection"));
@@ -82,7 +84,7 @@ var handleSessionStep = function handleSessionStep(_ref) {
82
84
  if (session.OFFER && messageType === _constants._OFFER_) {
83
85
  session.GLARE_OFFER = roap.msg;
84
86
  session.GLARE_OFFER.remote = !!roap.remote;
85
- var metricName = _constants.BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION;
87
+ var metricName = _constants2.default.ROAP_GLARE_CONDITION;
86
88
  var data = {
87
89
  correlation_id: correlationId,
88
90
  locus_id: locusUrl.split('/').pop(),
@@ -162,7 +164,7 @@ var RoapHandler = /*#__PURE__*/function (_StatelessWebexPlugin) {
162
164
  videoMuted: meeting.isVideoMuted()
163
165
  });
164
166
  }).catch(function (error) {
165
- var metricName = _constants.BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;
167
+ var metricName = _constants2.default.ROAP_ANSWER_FAILURE;
166
168
  var data = {
167
169
  correlation_id: meeting.correlationId,
168
170
  locus_id: meeting.locusUrl.split('/').pop(),
@@ -1 +1 @@
1
- {"version":3,"sources":["handler.js"],"names":["checkForAndHandleErrors","action","meeting","correlationId","type","msg","messageType","errorType","RoapUtil","findError","handleError","mediaProperties","peerConnection","then","res","RoapCollection","deleteSessionSequence","seq","catch","err","LoggerProxy","logger","warn","ensureMeeting","compareWithLastRoapMessage","lastRoapMessage","currentRoapMessage","handleSessionStep","roap","session","locusUrl","sequenceId","OFFER","_OFFER_","GLARE_OFFER","remote","metricName","BEHAVIORAL_METRICS","ROAP_GLARE_CONDITION","data","correlation_id","locus_id","split","pop","sequence","Metrics","sendBehavioralMetric","info","state","RoapHandler","attrs","options","roapOk","roapAnswer","roapFinished","ROAP","ROAP_STATE","INIT","WAIT_TX_ANSWER","shouldHandleMedia","updatePeerConnection","answerSdps","locusId","locusSelfId","locusInfo","self","id","mediaId","sdps","audioMuted","isAudioMuted","videoMuted","isVideoMuted","error","ROAP_ANSWER_FAILURE","reason","message","stack","metadata","name","WAIT_TX_OK","setRemoteDescription","ERROR","GLARE","tieBreaker","log","step","ROAP_SIGNAL","GLARE_RESOLVED","perform","signal","prefix","RECEIVE_ROAP_MSG","execute","RX_","SEND_ROAP_MSG","local","TX_","SEND_ROAP_MSG_SUCCESS","RECEIVE_CALL_LEAVE","deleteSession","RESET_ROAP_STATE","getSessionSequence","webex","meetings","meetingCollection","getByKey","handleAction","StatelessWebexPlugin"],"mappings":"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","sourcesContent":["/* no-param-reassign */\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP, _OFFER_, BEHAVIORAL_METRICS} from '../constants';\nimport Metrics from '../metrics';\n\nimport RoapUtil from './util';\nimport RoapCollection from './collection';\n\n\nconst checkForAndHandleErrors = (action, meeting, correlationId) => {\n if (action && action.type) {\n if (action.msg && action.msg.messageType && action.msg.errorType) {\n if (RoapUtil.findError(action.msg.messageType, action.msg.errorType, action.type)) {\n RoapUtil.handleError(meeting.mediaProperties.peerConnection)\n .then((res) => {\n if (res) {\n RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.warn(`Roap:handler#checkForAndHandleErrors --> Cannot reset the peer connection with error: ${err}`);\n });\n\n return true;\n }\n }\n if (!RoapUtil.ensureMeeting(meeting, action.type)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst compareWithLastRoapMessage = (lastRoapMessage, currentRoapMessage) => lastRoapMessage?.msg?.seq === currentRoapMessage.msg.seq && lastRoapMessage?.msg?.messageType === currentRoapMessage.msg.messageType;\n\nconst handleSessionStep = ({\n roap, session, locusUrl, correlationId\n}) => {\n const {seq: sequenceId, messageType} = roap.msg;\n\n if (session.OFFER && messageType === _OFFER_) {\n session.GLARE_OFFER = roap.msg;\n session.GLARE_OFFER.remote = !!roap.remote;\n const metricName = BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION;\n const data = {\n correlation_id: correlationId,\n locus_id: locusUrl.split('/').pop(),\n sequence: sequenceId\n };\n\n Metrics.sendBehavioralMetric(metricName, data);\n\n LoggerProxy.logger.warn(`Roap:handler#handleSessionStep --> Glare condition occurred with new mercury event, sequenceId: ${sequenceId}`);\n }\n else {\n LoggerProxy.logger.info(`Roap:handler#handleSessionStep --> Save OFFER/ANSWER seq:${sequenceId} new mercury event ${messageType}local state: ${JSON.stringify(session.state.state, null, 2)}`);\n session[messageType] = roap.msg;\n session[messageType].remote = !!roap.remote;\n }\n};\n\n/**\n * @class RoapHandler\n */\nexport default class RoapHandler extends StatelessWebexPlugin {\n constructor(attrs, options, roapOk, roapAnswer, roapFinished) {\n super({}, options);\n this.attrs = attrs;\n this.options = options;\n this.roapOk = roapOk;\n this.roapFinished = roapFinished;\n this.roapAnswer = roapAnswer;\n this.lastRoapMessage = null;\n }\n\n /**\n *\n * @param {Object} session\n * @param {Meeting} meeting\n * @param {Object} action\n * @returns {null}\n */\n perform(session, meeting, action) {\n switch (session.state.state) {\n case ROAP.ROAP_STATE.INIT:\n this.roapFinished(meeting.correlationId, action.msg.seq);\n break;\n\n // TODO: (important )handle roap state for sending offers as well\n // case ROAP.ROAP_STATE.WAIT_RX_OFFER:\n // case ROAP.ROAP_STATE.WAIT_RX_ANSWER:\n // case ROAP.ROAP_STATE.WAIT_RX_OK:\n case ROAP.ROAP_STATE.WAIT_TX_ANSWER:\n // eslint-disable-next-line no-warning-comments\n // TODO: sometime the you get an answer while you are creating an offer so SKIP\n // Server will send the mercury event comes back\n if (RoapUtil.shouldHandleMedia(meeting)) {\n RoapUtil.updatePeerConnection(meeting, session)\n .then((answerSdps) => {\n this.roapAnswer({\n locusId: meeting.locusId,\n locusSelfId: meeting.locusInfo.self.id,\n mediaId: meeting.mediaId,\n sdps: answerSdps,\n seq: session.OFFER.seq,\n correlationId: meeting.correlationId,\n audioMuted: meeting.isAudioMuted(),\n videoMuted: meeting.isVideoMuted()\n });\n })\n .catch((error) => {\n const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;\n const data = {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\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 LoggerProxy.logger.error(`Roap:handler#perform --> Error occured during wait receive answer, continuing, ${error}`);\n });\n }\n break;\n case ROAP.ROAP_STATE.WAIT_TX_OK:\n if (!RoapUtil.shouldHandleMedia(meeting)) {\n RoapUtil.setRemoteDescription(meeting, session).then((res) => {\n this.roapOk(res);\n });\n }\n break;\n // case ROAP.ROAP_STATE.IDLE_LOCAL_OFFER:\n case ROAP.ROAP_STATE.ERROR:\n LoggerProxy.logger.error(`Roap:handler#perform --> Roap State ERROR for session: ${session}`);\n break;\n case ROAP.ROAP_STATE.GLARE:\n session.GLARE_OFFER.tieBreaker = session.GLARE_OFFER.tieBreaker || 0;\n session.OFFER.tieBreaker = session.OFFER.tieBreaker || 0;\n LoggerProxy.logger.warn('Roap:handler#perform --> Roap State resolved the GLARE condition.');\n if (session.GLARE_OFFER.tieBreaker < session.OFFER.tieBreaker) {\n // 2\n LoggerProxy.logger.log('Roap:handler#perform --> Roap State local offer won after GLARE.');\n }\n else {\n LoggerProxy.logger.log('Roap:handler#perform --> Roap State remote offer won after GLARE.');\n }\n session.state.step(ROAP.ROAP_SIGNAL.GLARE_RESOLVED, meeting, action);\n this.perform(session, meeting);\n break;\n default:\n break;\n }\n }\n\n /**\n *\n * @param {String} signal\n * @param {Object} session\n * @param {Object} action\n * @param {Meeting} meeting\n * @param {String} prefix\n * @returns {null}\n */\n execute(signal, session, action, meeting, prefix) {\n if (session && session.state) {\n handleSessionStep({\n roap: action,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n session\n });\n signal = ROAP.ROAP_SIGNAL[`${prefix}${action.msg.messageType}`];\n session.state.step(signal, meeting, action);\n this.perform(session, meeting, action);\n }\n }\n\n /**\n *\n * @param {Object} session\n * @param {Object} action\n * @param {Meeting} meeting\n * @param {String} correlationId\n * @returns {Boolean}\n */\n handleAction(session, action, meeting, correlationId) {\n let signal;\n\n\n switch (action.type) {\n case ROAP.RECEIVE_ROAP_MSG:\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_ROAP_MSG event captured, reciving a roap message : ${JSON.stringify(action)}`);\n if (compareWithLastRoapMessage(this.lastRoapMessage, action)) {\n LoggerProxy.logger.warn(`Roap:handler#handleAction --> duplicate roap offer from server: ${action.msg.seq}`);\n }\n else {\n this.lastRoapMessage = action;\n action.remote = true;\n this.execute(signal, session, action, meeting, ROAP.RX_);\n }\n break;\n case ROAP.SEND_ROAP_MSG:\n LoggerProxy.logger.log(`Roap:handler#handleAction --> SEND_ROAP_MSG event captured, sending roap message ${JSON.stringify(action)}`);\n\n action.local = true;\n this.execute(signal, session, action, meeting, ROAP.TX_);\n break;\n case ROAP.SEND_ROAP_MSG_SUCCESS:\n // NOTE: When server send back an answer via mercury the\n // remote SDP is already saved sent and ok message is sent back\n // We dont have to indicate the roapHandler about the RX_ANSWER via SEND_ROAP_MSG_SUCCESS\n break;\n case ROAP.RECEIVE_CALL_LEAVE:\n RoapCollection.deleteSession(correlationId);\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_CALL_LEAVE event captured, cleaning up the RoapHandler for correlationId: ${correlationId}`); break;\n case ROAP.RESET_ROAP_STATE:\n RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RESET_ROAP_STATE event captured, resetting the RoapHandler state based on sequenceId: ${action.msg.seq}`); break;\n default:\n return true;\n }\n\n return true;\n }\n\n /**\n *\n * @param {Object} action\n * @returns {Boolean}\n */\n submit(action) {\n const {correlationId} = action;\n let {seq} = action;\n\n if (!seq && action.msg) {\n seq = action.msg.seq;\n }\n const session = RoapCollection.getSessionSequence(correlationId, seq);\n const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);\n\n if (checkForAndHandleErrors(action, meeting, correlationId)) {\n return true;\n }\n\n return this.handleAction(session, action, meeting, correlationId);\n }\n}\n"]}
1
+ {"version":3,"sources":["handler.js"],"names":["checkForAndHandleErrors","action","meeting","correlationId","type","msg","messageType","errorType","RoapUtil","findError","handleError","mediaProperties","peerConnection","then","res","RoapCollection","deleteSessionSequence","seq","catch","err","LoggerProxy","logger","warn","ensureMeeting","compareWithLastRoapMessage","lastRoapMessage","currentRoapMessage","handleSessionStep","roap","session","locusUrl","sequenceId","OFFER","_OFFER_","GLARE_OFFER","remote","metricName","BEHAVIORAL_METRICS","ROAP_GLARE_CONDITION","data","correlation_id","locus_id","split","pop","sequence","Metrics","sendBehavioralMetric","info","state","RoapHandler","attrs","options","roapOk","roapAnswer","roapFinished","ROAP","ROAP_STATE","INIT","WAIT_TX_ANSWER","shouldHandleMedia","updatePeerConnection","answerSdps","locusId","locusSelfId","locusInfo","self","id","mediaId","sdps","audioMuted","isAudioMuted","videoMuted","isVideoMuted","error","ROAP_ANSWER_FAILURE","reason","message","stack","metadata","name","WAIT_TX_OK","setRemoteDescription","ERROR","GLARE","tieBreaker","log","step","ROAP_SIGNAL","GLARE_RESOLVED","perform","signal","prefix","RECEIVE_ROAP_MSG","execute","RX_","SEND_ROAP_MSG","local","TX_","SEND_ROAP_MSG_SUCCESS","RECEIVE_CALL_LEAVE","deleteSession","RESET_ROAP_STATE","getSessionSequence","webex","meetings","meetingCollection","getByKey","handleAction","StatelessWebexPlugin"],"mappings":"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","sourcesContent":["/* no-param-reassign */\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP, _OFFER_} from '../constants';\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\n\nimport RoapUtil from './util';\nimport RoapCollection from './collection';\n\n\nconst checkForAndHandleErrors = (action, meeting, correlationId) => {\n if (action && action.type) {\n if (action.msg && action.msg.messageType && action.msg.errorType) {\n if (RoapUtil.findError(action.msg.messageType, action.msg.errorType, action.type)) {\n RoapUtil.handleError(meeting.mediaProperties.peerConnection)\n .then((res) => {\n if (res) {\n RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);\n }\n })\n .catch((err) => {\n LoggerProxy.logger.warn(`Roap:handler#checkForAndHandleErrors --> Cannot reset the peer connection with error: ${err}`);\n });\n\n return true;\n }\n }\n if (!RoapUtil.ensureMeeting(meeting, action.type)) {\n return true;\n }\n }\n\n return false;\n};\n\nconst compareWithLastRoapMessage = (lastRoapMessage, currentRoapMessage) => lastRoapMessage?.msg?.seq === currentRoapMessage.msg.seq && lastRoapMessage?.msg?.messageType === currentRoapMessage.msg.messageType;\n\nconst handleSessionStep = ({\n roap, session, locusUrl, correlationId\n}) => {\n const {seq: sequenceId, messageType} = roap.msg;\n\n if (session.OFFER && messageType === _OFFER_) {\n session.GLARE_OFFER = roap.msg;\n session.GLARE_OFFER.remote = !!roap.remote;\n const metricName = BEHAVIORAL_METRICS.ROAP_GLARE_CONDITION;\n const data = {\n correlation_id: correlationId,\n locus_id: locusUrl.split('/').pop(),\n sequence: sequenceId\n };\n\n Metrics.sendBehavioralMetric(metricName, data);\n\n LoggerProxy.logger.warn(`Roap:handler#handleSessionStep --> Glare condition occurred with new mercury event, sequenceId: ${sequenceId}`);\n }\n else {\n LoggerProxy.logger.info(`Roap:handler#handleSessionStep --> Save OFFER/ANSWER seq:${sequenceId} new mercury event ${messageType}local state: ${JSON.stringify(session.state.state, null, 2)}`);\n session[messageType] = roap.msg;\n session[messageType].remote = !!roap.remote;\n }\n};\n\n/**\n * @class RoapHandler\n */\nexport default class RoapHandler extends StatelessWebexPlugin {\n constructor(attrs, options, roapOk, roapAnswer, roapFinished) {\n super({}, options);\n this.attrs = attrs;\n this.options = options;\n this.roapOk = roapOk;\n this.roapFinished = roapFinished;\n this.roapAnswer = roapAnswer;\n this.lastRoapMessage = null;\n }\n\n /**\n *\n * @param {Object} session\n * @param {Meeting} meeting\n * @param {Object} action\n * @returns {null}\n */\n perform(session, meeting, action) {\n switch (session.state.state) {\n case ROAP.ROAP_STATE.INIT:\n this.roapFinished(meeting.correlationId, action.msg.seq);\n break;\n\n // TODO: (important )handle roap state for sending offers as well\n // case ROAP.ROAP_STATE.WAIT_RX_OFFER:\n // case ROAP.ROAP_STATE.WAIT_RX_ANSWER:\n // case ROAP.ROAP_STATE.WAIT_RX_OK:\n case ROAP.ROAP_STATE.WAIT_TX_ANSWER:\n // eslint-disable-next-line no-warning-comments\n // TODO: sometime the you get an answer while you are creating an offer so SKIP\n // Server will send the mercury event comes back\n if (RoapUtil.shouldHandleMedia(meeting)) {\n RoapUtil.updatePeerConnection(meeting, session)\n .then((answerSdps) => {\n this.roapAnswer({\n locusId: meeting.locusId,\n locusSelfId: meeting.locusInfo.self.id,\n mediaId: meeting.mediaId,\n sdps: answerSdps,\n seq: session.OFFER.seq,\n correlationId: meeting.correlationId,\n audioMuted: meeting.isAudioMuted(),\n videoMuted: meeting.isVideoMuted()\n });\n })\n .catch((error) => {\n const metricName = BEHAVIORAL_METRICS.ROAP_ANSWER_FAILURE;\n const data = {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\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 LoggerProxy.logger.error(`Roap:handler#perform --> Error occured during wait receive answer, continuing, ${error}`);\n });\n }\n break;\n case ROAP.ROAP_STATE.WAIT_TX_OK:\n if (!RoapUtil.shouldHandleMedia(meeting)) {\n RoapUtil.setRemoteDescription(meeting, session).then((res) => {\n this.roapOk(res);\n });\n }\n break;\n // case ROAP.ROAP_STATE.IDLE_LOCAL_OFFER:\n case ROAP.ROAP_STATE.ERROR:\n LoggerProxy.logger.error(`Roap:handler#perform --> Roap State ERROR for session: ${session}`);\n break;\n case ROAP.ROAP_STATE.GLARE:\n session.GLARE_OFFER.tieBreaker = session.GLARE_OFFER.tieBreaker || 0;\n session.OFFER.tieBreaker = session.OFFER.tieBreaker || 0;\n LoggerProxy.logger.warn('Roap:handler#perform --> Roap State resolved the GLARE condition.');\n if (session.GLARE_OFFER.tieBreaker < session.OFFER.tieBreaker) {\n // 2\n LoggerProxy.logger.log('Roap:handler#perform --> Roap State local offer won after GLARE.');\n }\n else {\n LoggerProxy.logger.log('Roap:handler#perform --> Roap State remote offer won after GLARE.');\n }\n session.state.step(ROAP.ROAP_SIGNAL.GLARE_RESOLVED, meeting, action);\n this.perform(session, meeting);\n break;\n default:\n break;\n }\n }\n\n /**\n *\n * @param {String} signal\n * @param {Object} session\n * @param {Object} action\n * @param {Meeting} meeting\n * @param {String} prefix\n * @returns {null}\n */\n execute(signal, session, action, meeting, prefix) {\n if (session && session.state) {\n handleSessionStep({\n roap: action,\n locusUrl: meeting.locusUrl,\n correlationId: meeting.correlationId,\n session\n });\n signal = ROAP.ROAP_SIGNAL[`${prefix}${action.msg.messageType}`];\n session.state.step(signal, meeting, action);\n this.perform(session, meeting, action);\n }\n }\n\n /**\n *\n * @param {Object} session\n * @param {Object} action\n * @param {Meeting} meeting\n * @param {String} correlationId\n * @returns {Boolean}\n */\n handleAction(session, action, meeting, correlationId) {\n let signal;\n\n\n switch (action.type) {\n case ROAP.RECEIVE_ROAP_MSG:\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_ROAP_MSG event captured, reciving a roap message : ${JSON.stringify(action)}`);\n if (compareWithLastRoapMessage(this.lastRoapMessage, action)) {\n LoggerProxy.logger.warn(`Roap:handler#handleAction --> duplicate roap offer from server: ${action.msg.seq}`);\n }\n else {\n this.lastRoapMessage = action;\n action.remote = true;\n this.execute(signal, session, action, meeting, ROAP.RX_);\n }\n break;\n case ROAP.SEND_ROAP_MSG:\n LoggerProxy.logger.log(`Roap:handler#handleAction --> SEND_ROAP_MSG event captured, sending roap message ${JSON.stringify(action)}`);\n\n action.local = true;\n this.execute(signal, session, action, meeting, ROAP.TX_);\n break;\n case ROAP.SEND_ROAP_MSG_SUCCESS:\n // NOTE: When server send back an answer via mercury the\n // remote SDP is already saved sent and ok message is sent back\n // We dont have to indicate the roapHandler about the RX_ANSWER via SEND_ROAP_MSG_SUCCESS\n break;\n case ROAP.RECEIVE_CALL_LEAVE:\n RoapCollection.deleteSession(correlationId);\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RECEIVE_CALL_LEAVE event captured, cleaning up the RoapHandler for correlationId: ${correlationId}`); break;\n case ROAP.RESET_ROAP_STATE:\n RoapCollection.deleteSessionSequence(correlationId, action.msg.seq);\n LoggerProxy.logger.log(`Roap:handler#handleAction --> RESET_ROAP_STATE event captured, resetting the RoapHandler state based on sequenceId: ${action.msg.seq}`); break;\n default:\n return true;\n }\n\n return true;\n }\n\n /**\n *\n * @param {Object} action\n * @returns {Boolean}\n */\n submit(action) {\n const {correlationId} = action;\n let {seq} = action;\n\n if (!seq && action.msg) {\n seq = action.msg.seq;\n }\n const session = RoapCollection.getSessionSequence(correlationId, seq);\n const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);\n\n if (checkForAndHandleErrors(action, meeting, correlationId)) {\n return true;\n }\n\n return this.handleAction(session, action, meeting, correlationId);\n }\n}\n"]}