@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/dist/common/errors/webex-errors.js +5 -29
  2. package/dist/common/errors/webex-errors.js.map +1 -1
  3. package/dist/constants.js +15 -74
  4. package/dist/constants.js.map +1 -1
  5. package/dist/media/index.js +68 -213
  6. package/dist/media/index.js.map +1 -1
  7. package/dist/media/internal-media-core-wrapper.js +22 -0
  8. package/dist/media/internal-media-core-wrapper.js.map +1 -0
  9. package/dist/media/properties.js +20 -25
  10. package/dist/media/properties.js.map +1 -1
  11. package/dist/media/util.js +0 -27
  12. package/dist/media/util.js.map +1 -1
  13. package/dist/meeting/index.js +694 -432
  14. package/dist/meeting/index.js.map +1 -1
  15. package/dist/meeting/request.js +1 -0
  16. package/dist/meeting/request.js.map +1 -1
  17. package/dist/meeting/util.js +3 -44
  18. package/dist/meeting/util.js.map +1 -1
  19. package/dist/meetings/index.js +64 -5
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/meetings/util.js +24 -1
  22. package/dist/meetings/util.js.map +1 -1
  23. package/dist/members/index.js +68 -0
  24. package/dist/members/index.js.map +1 -1
  25. package/dist/multistream/mediaRequestManager.js +132 -0
  26. package/dist/multistream/mediaRequestManager.js.map +1 -0
  27. package/dist/multistream/multistreamMedia.js +116 -0
  28. package/dist/multistream/multistreamMedia.js.map +1 -0
  29. package/dist/multistream/receiveSlot.js +209 -0
  30. package/dist/multistream/receiveSlot.js.map +1 -0
  31. package/dist/multistream/receiveSlotManager.js +195 -0
  32. package/dist/multistream/receiveSlotManager.js.map +1 -0
  33. package/dist/multistream/remoteMedia.js +284 -0
  34. package/dist/multistream/remoteMedia.js.map +1 -0
  35. package/dist/multistream/remoteMediaGroup.js +243 -0
  36. package/dist/multistream/remoteMediaGroup.js.map +1 -0
  37. package/dist/multistream/remoteMediaManager.js +1113 -0
  38. package/dist/multistream/remoteMediaManager.js.map +1 -0
  39. package/dist/reconnection-manager/index.js +109 -130
  40. package/dist/reconnection-manager/index.js.map +1 -1
  41. package/dist/roap/index.js +57 -240
  42. package/dist/roap/index.js.map +1 -1
  43. package/dist/roap/request.js +2 -114
  44. package/dist/roap/request.js.map +1 -1
  45. package/dist/roap/turnDiscovery.js +11 -5
  46. package/dist/roap/turnDiscovery.js.map +1 -1
  47. package/dist/statsAnalyzer/global.js +2 -0
  48. package/dist/statsAnalyzer/global.js.map +1 -1
  49. package/dist/statsAnalyzer/index.js +39 -36
  50. package/dist/statsAnalyzer/index.js.map +1 -1
  51. package/package.json +20 -19
  52. package/src/common/errors/webex-errors.js +0 -18
  53. package/src/constants.ts +139 -180
  54. package/src/media/index.js +60 -194
  55. package/src/media/internal-media-core-wrapper.ts +9 -0
  56. package/src/media/properties.js +19 -25
  57. package/src/media/util.js +0 -22
  58. package/src/meeting/index.js +565 -320
  59. package/src/meeting/request.js +1 -0
  60. package/src/meeting/util.js +3 -46
  61. package/src/meetings/index.js +30 -1
  62. package/src/meetings/util.js +23 -2
  63. package/src/members/index.js +48 -0
  64. package/src/multistream/mediaRequestManager.ts +164 -0
  65. package/src/multistream/multistreamMedia.ts +92 -0
  66. package/src/multistream/receiveSlot.ts +141 -0
  67. package/src/multistream/receiveSlotManager.ts +142 -0
  68. package/src/multistream/remoteMedia.ts +219 -0
  69. package/src/multistream/remoteMediaGroup.ts +224 -0
  70. package/src/multistream/remoteMediaManager.ts +911 -0
  71. package/src/reconnection-manager/index.js +40 -53
  72. package/src/roap/index.js +47 -207
  73. package/src/roap/request.js +1 -72
  74. package/src/roap/turnDiscovery.ts +12 -6
  75. package/src/statsAnalyzer/global.js +2 -0
  76. package/src/statsAnalyzer/index.js +32 -46
  77. package/test/integration/spec/journey.js +1 -1
  78. package/test/unit/spec/media/index.ts +223 -0
  79. package/test/unit/spec/media/properties.ts +73 -82
  80. package/test/unit/spec/meeting/effectsState.js +1 -3
  81. package/test/unit/spec/meeting/index.js +420 -228
  82. package/test/unit/spec/meeting/muteState.js +7 -0
  83. package/test/unit/spec/meeting/utils.js +61 -2
  84. package/test/unit/spec/meetings/index.js +0 -4
  85. package/test/unit/spec/members/index.js +164 -2
  86. package/test/unit/spec/multistream/mediaRequestManager.ts +511 -0
  87. package/test/unit/spec/multistream/receiveSlot.ts +104 -0
  88. package/test/unit/spec/multistream/receiveSlotManager.ts +173 -0
  89. package/test/unit/spec/multistream/remoteMedia.ts +217 -0
  90. package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
  91. package/test/unit/spec/multistream/remoteMediaManager.ts +1251 -0
  92. package/test/unit/spec/roap/index.ts +63 -35
  93. package/test/unit/spec/stats-analyzer/index.js +19 -22
  94. package/dist/peer-connection-manager/index.js +0 -794
  95. package/dist/peer-connection-manager/index.js.map +0 -1
  96. package/dist/roap/collection.js +0 -73
  97. package/dist/roap/collection.js.map +0 -1
  98. package/dist/roap/handler.js +0 -337
  99. package/dist/roap/handler.js.map +0 -1
  100. package/dist/roap/state.js +0 -164
  101. package/dist/roap/state.js.map +0 -1
  102. package/dist/roap/util.js +0 -102
  103. package/dist/roap/util.js.map +0 -1
  104. package/src/peer-connection-manager/index.js +0 -723
  105. package/src/roap/collection.js +0 -63
  106. package/src/roap/handler.js +0 -252
  107. package/src/roap/state.js +0 -149
  108. package/src/roap/util.js +0 -93
  109. package/test/unit/spec/peerconnection-manager/index.js +0 -188
  110. package/test/unit/spec/peerconnection-manager/utils.js +0 -48
  111. package/test/unit/spec/roap/util.js +0 -30
@@ -1 +1 @@
1
- {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","LoggerProxy","logger","log","clearTimeout","reject","setTimeout","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","networkDisconnect","networkRetry","id","validate","Metrics","postEvent","event","eventType","MEDIA_RECONNECTING","executeReconnection","then","MEDIA_RECOVERED","data","recoveredBy","RECOVERED_BY_NEW","catch","reconnectError","reconnect","message","reconnectMetric","CALL_ABORTED","errors","category","errorObjects","expected","errorCode","fatal","name","mediaEngine","shownToUser","rejoinMeeting","IN_PROGRESS","reconnectMercuryWebSocket","internal","device","url","FAILURE","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","previousCorrelationId","correlationId","join","rejoin","RoapCollection","deleteSession","Media","stopTracks","mediaProperties","shareTrack","isSharing","NO_SHARE","mediaDirection","sendShare","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","reason","SHARE_STOPPED_REASON","MEETING_REJOIN","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","setupPeerConnection","attachMedia","meetingId","remoteQualityLevel","enableRtx","enableExtmap","peerConnection","setRemoteStream","roap","sendRoapMediaRequest","sdp","roapSeq","mercury","connected","disconnect","connect","PeerConnectionManager","close","unsetPeerConnection","doTurnDiscovery","turnInfo","reInitiatePeerconnection","setPeerConnectionEvents","statsAnalyzer","updatePeerconnection"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport PeerConnectionManager from '../peer-connection-manager';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\nimport RoapCollection from '../roap/collection';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({wasSharing, error = new Error('Meeting needs to be rejoined')}) {\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n*/\nexport default class ReconnectionManager {\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout\n };\n\n /**\n * @instance\n * @type {String}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect');\n\n this.iceState.disconnected = true;\n\n return new Promise((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n }\n else {\n this.iceState.disconnected = false;\n reject(new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`));\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n cleanUp() {\n this.reset();\n this.meeting = null;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection already in progress.');\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n async reconnect({networkDisconnect = false, networkRetry = false} = {}) {\n LoggerProxy.logger.info(`ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`);\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n }\n catch (error) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection unable to begin.', error);\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect start metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECONNECTING,\n meeting: this.meeting\n });\n }\n\n return this.executeReconnection({networkDisconnect})\n .then(() => {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection successful.');\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect success metric.');\n Metrics.postEvent({\n event: eventType.MEDIA_RECOVERED,\n meeting: this.meeting,\n data: {recoveredBy: reconnection.RECOVERED_BY_NEW}\n });\n })\n .catch((reconnectError) => {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.');\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error('ReconnectionManager:index#reconnect --> Reconnection failed.', reconnectError.message);\n LoggerProxy.logger.info('ReconnectionManager:index#reconnect --> Sending reconnect abort metric.');\n\n const reconnectMetric = {\n event: eventType.CALL_ABORTED,\n meeting: this.meeting,\n data: {\n errors: [\n {\n category: errorObjects.category.expected,\n errorCode: 2008,\n fatal: true,\n name: errorObjects.name.mediaEngine,\n shownToUser: false\n }\n ]\n }\n };\n\n Metrics.postEvent(reconnectMetric);\n if (reconnectError instanceof NeedsRejoinError) {\n // send call aborded event with catogery as expected as we are trying to rejoin\n\n if (this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n }\n\n\n throw reconnectError;\n });\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n async executeReconnection({networkDisconnect = false}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.');\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Websocket reconnected.', this.webex.internal.device.url);\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.');\n this.status = RECONNECTION.STATE.FAILURE;\n throw (error);\n }\n }\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');\n await this.webex.meetings.syncMeetings();\n }\n catch (syncError) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', syncError);\n throw (new NeedsRetryError(syncError));\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely ');\n\n throw new Error('Unable to rejoin a meeting already ended or inactive .');\n }\n\n LoggerProxy.logger.info(`ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`);\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw (new NeedsRejoinError({wasSharing}));\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log('ReconnectionManager:index#executeReconnection --> Media reestablished');\n this.status = RECONNECTION.STATE.COMPLETE;\n\n return media;\n }\n catch (error) {\n LoggerProxy.logger.error('ReconnectionManager:index#executeReconnection --> Media reestablishment failed');\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw (error);\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin');\n const previousCorrelationId = this.meeting.correlationId;\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n RoapCollection.deleteSession(previousCorrelationId);\n\n if (wasSharing) {\n // Stop the share streams if user tried to rejoin\n Media.stopTracks(this.meeting.mediaProperties.shareTrack);\n this.meeting.isSharing = false;\n if (this.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE) {\n this.meeting.shareStatus = SHARE_STATUS.NO_SHARE;\n }\n this.meeting.mediaProperties.mediaDirection.sendShare = false;\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'rejoinMeeting'\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason: SHARE_STOPPED_REASON.MEETING_REJOIN\n }\n );\n }\n }\n catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(`ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`, joinError);\n this.rejoinMeeting();\n }\n else {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.', joinError);\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE,\n {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack\n }\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n }\n catch (mediaError) {\n LoggerProxy.logger.error('ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.', mediaError);\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');\n\n return ReconnectionManager.setupPeerConnection(this.meeting)\n .then(() => 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 async 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\n const turnInfo = await meeting.roap.doTurnDiscovery(meeting, true);\n\n meeting.mediaProperties.reInitiatePeerconnection(turnInfo);\n PeerConnectionManager.setPeerConnectionEvents(meeting);\n\n // update the peerconnection in the stats manager when ever we reconnect\n meeting.statsAnalyzer.updatePeerconnection(meeting.mediaProperties.peerConnection);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["NeedsRetryError","Error","NeedsRejoinError","wasSharing","error","ReconnectionManager","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","clearTimeout","LoggerProxy","logger","log","resetReconnectionTimer","reject","setTimeout","IN_PROGRESS","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","reconnectMercuryWebSocket","internal","device","url","FAILURE","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","meetings","syncMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","media","join","rejoin","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","closePeerConnections","unsetPeerConnection","roap","doTurnDiscovery","turnServerInfo","mc","createMediaConnection","statsAnalyzer","updateMediaConnection","initiateOffer","mercury","connected","disconnect","connect"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectionError from '../common/errors/reconnection';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport {eventType, reconnection, errorObjects} from '../metrics/config';\nimport Media from '../media';\nimport Metrics from '../metrics';\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 * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\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\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.resetReconnectionTimer();\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 /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return (this.status === RECONNECTION.STATE.IN_PROGRESS);\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\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\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 async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> Begin reestablishment of media');\n\n // we are not simply calling this.meeting.mediaProperties.webrtcMediaConnection.reconnect(),\n // but instead manually closing and creating new media connection, because we need to do the TURN discovery again\n\n await this.meeting.closePeerConnections();\n this.meeting.mediaProperties.unsetPeerConnection();\n\n const turnServerInfo = await this.meeting.roap.doTurnDiscovery(this.meeting, true);\n\n const mc = this.meeting.createMediaConnection(turnServerInfo);\n\n this.meeting.statsAnalyzer.updateMediaConnection(mc);\n\n return mc.initiateOffer();\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"],"mappings":"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"}
@@ -12,42 +12,26 @@ _Object$defineProperty(exports, "__esModule", {
12
12
 
13
13
  exports.default = void 0;
14
14
 
15
- var _isNan = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/number/is-nan"));
16
-
17
- var _parseFloat2 = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/parse-float"));
18
-
19
- var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
20
-
21
15
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
22
16
 
23
17
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
24
18
 
25
19
  var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
26
20
 
27
- var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
28
-
29
21
  var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
30
22
 
31
23
  var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
32
24
 
33
25
  var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
34
26
 
35
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
36
-
37
27
  var _webexCore = require("@webex/webex-core");
38
28
 
39
29
  var _constants = require("../constants");
40
30
 
41
31
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
42
32
 
43
- var _util = _interopRequireDefault(require("../meeting/util"));
44
-
45
- var _handler = _interopRequireDefault(require("./handler"));
46
-
47
33
  var _request = _interopRequireDefault(require("./request"));
48
34
 
49
- var _collection = _interopRequireDefault(require("./collection"));
50
-
51
35
  var _turnDiscovery = _interopRequireDefault(require("./turnDiscovery"));
52
36
 
53
37
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
@@ -59,8 +43,9 @@ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_R
59
43
  * @typedef {Object} RoapOptions
60
44
  * @property {String} sdp
61
45
  * @property {Meeting} meeting
62
- * @property {Number} roapSeq
63
- * @property {Boolean} reconnect
46
+ * @property {Number} seq
47
+ * @property {Number} tieBreaker
48
+ * @property {Boolean} reconnect
64
49
  */
65
50
 
66
51
  /**
@@ -85,11 +70,11 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
85
70
  * @param {Object} attrs
86
71
  * @param {Object} options
87
72
  */
88
- function Roap(attrs, _options) {
73
+ function Roap(attrs, options) {
89
74
  var _this;
90
75
 
91
76
  (0, _classCallCheck2.default)(this, Roap);
92
- _this = _super.call(this, {}, _options);
77
+ _this = _super.call(this, {}, options);
93
78
  /**
94
79
  * @instance
95
80
  * @type {Object}
@@ -97,51 +82,6 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
97
82
  * @memberof Roap
98
83
  */
99
84
 
100
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendRoapCallRequest", function (options) {
101
- var meeting = options.meeting;
102
- var roapMessage = {
103
- messageType: _constants.ROAP.ROAP_TYPES.OFFER,
104
- sdps: [options.sdp],
105
- version: _constants.ROAP.ROAP_VERSION,
106
- seq: typeof options.roapSeq !== 'number' && (0, _isNan.default)((0, _parseFloat2.default)(options.roapSeq)) ? 0 : options.roapSeq + 1,
107
- tieBreaker: 4294967294 // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
108
-
109
- };
110
-
111
- _this.roapHandler.submit({
112
- type: _constants.ROAP.SEND_ROAP_MSG,
113
- msg: roapMessage,
114
- correlationId: meeting.correlationId
115
- });
116
-
117
- var roapBody = {
118
- localMedias: [{
119
- localSdp: (0, _stringify.default)(_this.roapRequest.attachRechabilityData({
120
- roapMessage: roapMessage,
121
- // eslint-disable-next-line no-warning-comments
122
- // TODO: check whats the need for video and audiomute
123
- audioMuted: !!meeting.isAudioMuted(),
124
- videoMuted: !!meeting.isVideoMuted()
125
- })) // mediaId: meeting.mediaId
126
-
127
- }]
128
- };
129
- return _util.default.joinMeetingOptions(meeting, {
130
- roapMessage: roapBody
131
- }).then(function (locus) {
132
- _this.roapHandler.submit({
133
- type: _constants.ROAP.SEND_ROAP_MSG_SUCCESS,
134
- seq: roapMessage.seq,
135
- correlationId: meeting.correlationId
136
- });
137
-
138
- meeting.setRoapSeq(roapMessage.seq); // eslint-disable-next-line no-warning-comments
139
- // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
140
-
141
- return locus; // eslint-disable-next-line no-warning-comments
142
- // TODO: check where to update the sequence number
143
- });
144
- });
145
85
  _this.attrs = attrs;
146
86
  /**
147
87
  * @instance
@@ -150,16 +90,7 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
150
90
  * @memberof Roap
151
91
  */
152
92
 
153
- _this.options = _options;
154
- /**
155
- * The Roap Process State Handler
156
- * @instance
157
- * @type {RoapHandler}
158
- * @private
159
- * @memberof Roap
160
- */
161
-
162
- _this.roapHandler = new _handler.default(_this.attrs, _this.options, _this.sendRoapOK.bind((0, _assertThisInitialized2.default)(_this)), _this.sendRoapAnswer.bind((0, _assertThisInitialized2.default)(_this)), _this.roapFinished.bind((0, _assertThisInitialized2.default)(_this)));
93
+ _this.options = options;
163
94
  /**
164
95
  * The Roap Request Server Proxy Object
165
96
  * @instance
@@ -168,76 +99,20 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
168
99
  * @memberof Roap
169
100
  */
170
101
 
171
- _this.roapRequest = new _request.default({}, _options);
172
- /**
173
- * The last roap offer sent to server and acked
174
- * @instance
175
- * @type {Object}
176
- * @private
177
- * @memberof Roap
178
- */
179
-
180
- _this.lastRoapOffer = {};
102
+ _this.roapRequest = new _request.default({}, options);
181
103
  _this.turnDiscovery = new _turnDiscovery.default(_this.roapRequest);
182
104
  return _this;
183
105
  }
184
106
  /**
185
- * Starts listening to mercury events for Roap messages
186
- * @param {object} data event object
187
- * @returns {Promise}
107
+ *
108
+ * @param {SeqOptions} options
109
+ * @returns {null}
188
110
  * @private
189
111
  * @memberof Roap
190
112
  */
191
113
 
192
114
 
193
115
  (0, _createClass2.default)(Roap, [{
194
- key: "roapEvent",
195
- value: function roapEvent(data) {
196
- var msg = data.message;
197
- var correlationId = data.correlationId;
198
-
199
- _loggerProxy.default.logger.log("Roap:index#roapEvent --> Received Roap Message [".concat((0, _stringify.default)(msg, null, 2), "]"));
200
-
201
- if (msg.messageType === _constants.ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
202
- // turn discovery is not part of normal roap protocol and so we are not handling it
203
- // through the usual roap state machine
204
- this.turnDiscovery.handleTurnDiscoveryResponse(msg);
205
- } else {
206
- this.roapHandler.submit({
207
- type: _constants.ROAP.RECEIVE_ROAP_MSG,
208
- msg: msg,
209
- correlationId: correlationId
210
- });
211
- }
212
- }
213
- /**
214
- *
215
- * @param {String} correlationId correlation id of a meeting
216
- * @param {Number} seq ROAP sequence number
217
- * @returns {Promise}
218
- * @private
219
- * @memberof Roap
220
- */
221
-
222
- }, {
223
- key: "stop",
224
- value: function stop(correlationId, seq) {
225
- this.roapHandler.submit({
226
- type: _constants.ROAP.RECEIVE_CALL_LEAVE,
227
- seq: seq,
228
- correlationId: correlationId
229
- });
230
- return _promise.default.resolve();
231
- }
232
- /**
233
- *
234
- * @param {SeqOptions} options
235
- * @returns {null}
236
- * @private
237
- * @memberof Roap
238
- */
239
-
240
- }, {
241
116
  key: "sendRoapOK",
242
117
  value: function sendRoapOK(options) {
243
118
  var _this2 = this;
@@ -260,22 +135,13 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
260
135
  correlationId: options.correlationId,
261
136
  audioMuted: meeting.isAudioMuted(),
262
137
  videoMuted: meeting.isVideoMuted(),
263
- meetingId: meeting.id
138
+ meetingId: meeting.id,
139
+ preferTranscoding: !meeting.isMultistream
264
140
  }).then(function () {
265
- _this2.roapHandler.submit({
266
- type: _constants.ROAP.SEND_ROAP_MSG,
267
- msg: roapMessage,
268
- correlationId: options.correlationId
269
- });
270
-
271
141
  _loggerProxy.default.logger.log("Roap:index#sendRoapOK --> ROAP OK sent with seq ".concat(options.seq));
272
-
273
- meeting.setRoapSeq(options.seq);
274
142
  });
275
143
  });
276
- } // eslint-disable-next-line no-warning-comments
277
- // TODO: try to merge sendRoapOk and roapAnswer
278
-
144
+ }
279
145
  /**
280
146
  * Sends a ROAP answer...
281
147
  * @param {SeqOptions} options
@@ -289,43 +155,27 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
289
155
  }, {
290
156
  key: "sendRoapAnswer",
291
157
  value: function sendRoapAnswer(options) {
292
- var _this3 = this;
293
-
294
158
  var meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
295
159
  var roapMessage = {
296
160
  messageType: _constants.ROAP.ROAP_TYPES.ANSWER,
297
- sdps: options.sdps,
161
+ sdps: [options.sdp],
298
162
  version: _constants.ROAP.ROAP_VERSION,
299
163
  seq: options.seq
300
164
  };
301
- this.roapHandler.submit({
302
- type: _constants.ROAP.SEND_ROAP_MSG,
303
- msg: roapMessage,
304
- correlationId: options.correlationId
305
- });
306
165
  return this.roapRequest.sendRoap({
307
166
  roapMessage: roapMessage,
308
167
  locusSelfUrl: meeting.selfUrl,
309
168
  mediaId: options.mediaId,
310
169
  correlationId: options.correlationId,
311
- audioMuted: options.audioMuted,
312
- videoMuted: options.videoMuted,
313
- meetingId: meeting.id
314
- }).then(function () {
315
- meeting.setRoapSeq(options.seq);
316
-
317
- _this3.roapHandler.submit({
318
- type: _constants.ROAP.SEND_ROAP_MSG_SUCCESS,
319
- seq: roapMessage.seq,
320
- correlationId: meeting.correlationId
321
- });
170
+ audioMuted: meeting.isAudioMuted(),
171
+ videoMuted: meeting.isVideoMuted(),
172
+ meetingId: meeting.id,
173
+ preferTranscoding: !meeting.isMultistream
322
174
  });
323
175
  }
324
176
  /**
325
177
  * Sends a ROAP error...
326
- * @param {Object} session
327
- * @param {Object} locus
328
- * @param {String} errorType
178
+ * @param {Object} options
329
179
  * @returns {Promise}
330
180
  * @private
331
181
  * @memberof Roap
@@ -333,14 +183,26 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
333
183
 
334
184
  }, {
335
185
  key: "sendRoapError",
336
- value: function sendRoapError(session, locus, errorType) {
337
- var msg = {
186
+ value: function sendRoapError(options) {
187
+ var meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
188
+ var roapMessage = {
338
189
  messageType: _constants.ROAP.ROAP_TYPES.ERROR,
339
190
  version: _constants.ROAP.ROAP_VERSION,
340
- errorType: errorType,
341
- seq: session.OFFER.seq
191
+ errorType: options.errorType,
192
+ seq: options.seq
342
193
  };
343
- return this.roapRequest.sendRoap(msg, locus);
194
+ return this.roapRequest.sendRoap({
195
+ roapMessage: roapMessage,
196
+ locusSelfUrl: meeting.selfUrl,
197
+ mediaId: options.mediaId,
198
+ correlationId: options.correlationId,
199
+ audioMuted: meeting.isAudioMuted(),
200
+ videoMuted: meeting.isVideoMuted(),
201
+ meetingId: meeting.id,
202
+ preferTranscoding: !meeting.isMultistream
203
+ }).then(function () {
204
+ _loggerProxy.default.logger.log("Roap:index#sendRoapError --> ROAP ERROR sent with seq ".concat(options.seq));
205
+ });
344
206
  }
345
207
  /**
346
208
  * sends a roap media request
@@ -353,24 +215,18 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
353
215
  }, {
354
216
  key: "sendRoapMediaRequest",
355
217
  value: function sendRoapMediaRequest(options) {
356
- var _this4 = this;
357
-
358
218
  var meeting = options.meeting,
359
- reconnect = options.reconnect;
219
+ seq = options.seq,
220
+ sdp = options.sdp,
221
+ reconnect = options.reconnect,
222
+ tieBreaker = options.tieBreaker;
360
223
  var roapMessage = {
361
224
  messageType: _constants.ROAP.ROAP_TYPES.OFFER,
362
- sdps: [options.sdp],
363
- // sdps: [options.sdp],
225
+ sdps: [sdp],
364
226
  version: _constants.ROAP.ROAP_VERSION,
365
- seq: typeof options.roapSeq !== 'number' && (0, _isNan.default)((0, _parseFloat2.default)(options.roapSeq)) ? 0 : options.roapSeq + 1,
366
- tieBreaker: 4294967294 // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario
367
-
368
- };
369
- this.roapHandler.submit({
370
- type: _constants.ROAP.SEND_ROAP_MSG,
371
- msg: roapMessage,
372
- correlationId: meeting.correlationId
373
- }); // When reconnecting, it's important that the first roap message being sent out has empty media id.
227
+ seq: seq,
228
+ tieBreaker: tieBreaker
229
+ }; // When reconnecting, it's important that the first roap message being sent out has empty media id.
374
230
  // Normally this is the roap offer, but when TURN discovery is enabled,
375
231
  // then this is the TURN discovery request message
376
232
 
@@ -382,68 +238,29 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
382
238
  mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
383
239
  audioMuted: meeting.isAudioMuted(),
384
240
  videoMuted: meeting.isVideoMuted(),
385
- meetingId: meeting.id
241
+ meetingId: meeting.id,
242
+ preferTranscoding: !meeting.isMultistream
386
243
  }).then(function (_ref) {
387
244
  var locus = _ref.locus,
388
245
  mediaConnections = _ref.mediaConnections;
389
246
 
390
- _this4.roapHandler.submit({
391
- type: _constants.ROAP.SEND_ROAP_MSG_SUCCESS,
392
- seq: roapMessage.seq,
393
- correlationId: meeting.correlationId
394
- });
395
-
396
- meeting.setRoapSeq(roapMessage.seq);
397
-
398
247
  if (mediaConnections) {
399
248
  meeting.updateMediaConnections(mediaConnections);
400
- } // eslint-disable-next-line no-warning-comments
401
- // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here
402
-
249
+ }
403
250
 
404
- return locus; // eslint-disable-next-line no-warning-comments
405
- // TODO: check where to update the sequence number
251
+ return locus;
406
252
  });
407
253
  }
408
254
  /**
409
- * sends a roap media request
410
- * @param {RoapOptions} options
411
- * @returns {Promise}
412
- * @private
413
- * @memberof Roap
414
- */
415
-
416
- }, {
417
- key: "roapFinished",
418
- value:
419
- /**
420
- * Called when the roap sequence is finished (completed successfully or failed)
421
- * @param {String} correlationId id of the meeting affected
422
- * @param {String} sequenceId the id of the finished sequence
423
- * @returns {undefined}
424
- * @private
425
- * @memberof Roap
426
- */
427
- function roapFinished(correlationId, sequenceId) {
428
- _collection.default.onSessionSequenceFinish(correlationId, sequenceId);
429
-
430
- var meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);
431
- meeting.mediaNegotiatedEvent();
432
-
433
- if (!_collection.default.isBusy(correlationId)) {
434
- meeting.processNextQueuedMediaUpdate();
435
- }
436
- }
437
- /**
438
- * Performs a TURN server discovery procedure, which involves exchanging
439
- * some roap messages with the server. This exchange has to be done before
440
- * any other roap messages are sent
441
- *
442
- * @param {Meeting} meeting
443
- * @param {Boolean} isReconnecting should be set to true if this is a new
444
- * media connection just after a reconnection
445
- * @returns {Promise}
446
- */
255
+ * Performs a TURN server discovery procedure, which involves exchanging
256
+ * some roap messages with the server. This exchange has to be done before
257
+ * any other roap messages are sent
258
+ *
259
+ * @param {Meeting} meeting
260
+ * @param {Boolean} isReconnecting should be set to true if this is a new
261
+ * media connection just after a reconnection
262
+ * @returns {Promise}
263
+ */
447
264
 
448
265
  }, {
449
266
  key: "doTurnDiscovery",