@webex/plugin-meetings 3.8.0-next.5 → 3.8.0-next.51

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 (133) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.js +1 -0
  4. package/dist/config.js.map +1 -1
  5. package/dist/constants.js +14 -1
  6. package/dist/constants.js.map +1 -1
  7. package/dist/controls-options-manager/enums.js +2 -0
  8. package/dist/controls-options-manager/enums.js.map +1 -1
  9. package/dist/controls-options-manager/types.js.map +1 -1
  10. package/dist/controls-options-manager/util.js +52 -0
  11. package/dist/controls-options-manager/util.js.map +1 -1
  12. package/dist/interpretation/index.js +1 -1
  13. package/dist/interpretation/siLanguage.js +1 -1
  14. package/dist/locus-info/controlsUtils.js +28 -10
  15. package/dist/locus-info/controlsUtils.js.map +1 -1
  16. package/dist/locus-info/index.js +20 -1
  17. package/dist/locus-info/index.js.map +1 -1
  18. package/dist/media/index.js +3 -15
  19. package/dist/media/index.js.map +1 -1
  20. package/dist/meeting/in-meeting-actions.js +11 -1
  21. package/dist/meeting/in-meeting-actions.js.map +1 -1
  22. package/dist/meeting/index.js +544 -324
  23. package/dist/meeting/index.js.map +1 -1
  24. package/dist/meeting/locusMediaRequest.js +26 -23
  25. package/dist/meeting/locusMediaRequest.js.map +1 -1
  26. package/dist/meeting/muteState.js +0 -2
  27. package/dist/meeting/muteState.js.map +1 -1
  28. package/dist/meeting/request.js +30 -0
  29. package/dist/meeting/request.js.map +1 -1
  30. package/dist/meeting/request.type.js.map +1 -1
  31. package/dist/meeting/util.js +27 -2
  32. package/dist/meeting/util.js.map +1 -1
  33. package/dist/meeting-info/meeting-info-v2.js +359 -60
  34. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  35. package/dist/meetings/index.js +69 -1
  36. package/dist/meetings/index.js.map +1 -1
  37. package/dist/meetings/util.js +14 -0
  38. package/dist/meetings/util.js.map +1 -1
  39. package/dist/member/index.js +10 -0
  40. package/dist/member/index.js.map +1 -1
  41. package/dist/member/util.js +3 -0
  42. package/dist/member/util.js.map +1 -1
  43. package/dist/metrics/constants.js +9 -0
  44. package/dist/metrics/constants.js.map +1 -1
  45. package/dist/reachability/clusterReachability.js +63 -27
  46. package/dist/reachability/clusterReachability.js.map +1 -1
  47. package/dist/reachability/index.js +112 -47
  48. package/dist/reachability/index.js.map +1 -1
  49. package/dist/reachability/reachability.types.js +14 -0
  50. package/dist/reachability/reachability.types.js.map +1 -1
  51. package/dist/reachability/request.js +19 -3
  52. package/dist/reachability/request.js.map +1 -1
  53. package/dist/reconnection-manager/index.js +2 -2
  54. package/dist/reconnection-manager/index.js.map +1 -1
  55. package/dist/recording-controller/util.js +5 -5
  56. package/dist/recording-controller/util.js.map +1 -1
  57. package/dist/roap/index.js.map +1 -1
  58. package/dist/roap/turnDiscovery.js +45 -27
  59. package/dist/roap/turnDiscovery.js.map +1 -1
  60. package/dist/roap/types.js +17 -0
  61. package/dist/roap/types.js.map +1 -0
  62. package/dist/types/config.d.ts +1 -0
  63. package/dist/types/constants.d.ts +10 -0
  64. package/dist/types/controls-options-manager/enums.d.ts +3 -1
  65. package/dist/types/controls-options-manager/types.d.ts +7 -1
  66. package/dist/types/locus-info/index.d.ts +1 -0
  67. package/dist/types/meeting/in-meeting-actions.d.ts +10 -0
  68. package/dist/types/meeting/index.d.ts +50 -3
  69. package/dist/types/meeting/muteState.d.ts +0 -1
  70. package/dist/types/meeting/request.d.ts +12 -1
  71. package/dist/types/meeting/request.type.d.ts +6 -0
  72. package/dist/types/meeting/util.d.ts +8 -1
  73. package/dist/types/meeting-info/meeting-info-v2.d.ts +80 -0
  74. package/dist/types/meetings/index.d.ts +29 -0
  75. package/dist/types/member/index.d.ts +1 -0
  76. package/dist/types/metrics/constants.d.ts +9 -0
  77. package/dist/types/reachability/clusterReachability.d.ts +15 -7
  78. package/dist/types/reachability/index.d.ts +10 -1
  79. package/dist/types/reachability/reachability.types.d.ts +5 -0
  80. package/dist/types/roap/index.d.ts +3 -2
  81. package/dist/types/roap/turnDiscovery.d.ts +5 -17
  82. package/dist/types/roap/types.d.ts +16 -0
  83. package/dist/webinar/index.js +1 -1
  84. package/package.json +22 -22
  85. package/src/config.ts +1 -0
  86. package/src/constants.ts +17 -0
  87. package/src/controls-options-manager/enums.ts +2 -0
  88. package/src/controls-options-manager/types.ts +11 -1
  89. package/src/controls-options-manager/util.ts +62 -0
  90. package/src/locus-info/controlsUtils.ts +44 -14
  91. package/src/locus-info/index.ts +23 -1
  92. package/src/media/index.ts +5 -21
  93. package/src/meeting/in-meeting-actions.ts +20 -0
  94. package/src/meeting/index.ts +351 -99
  95. package/src/meeting/locusMediaRequest.ts +33 -23
  96. package/src/meeting/muteState.ts +0 -2
  97. package/src/meeting/request.ts +36 -1
  98. package/src/meeting/request.type.ts +7 -0
  99. package/src/meeting/util.ts +27 -2
  100. package/src/meeting-info/meeting-info-v2.ts +247 -6
  101. package/src/meetings/index.ts +87 -1
  102. package/src/meetings/util.ts +18 -0
  103. package/src/member/index.ts +11 -0
  104. package/src/member/util.ts +3 -0
  105. package/src/metrics/constants.ts +9 -0
  106. package/src/reachability/clusterReachability.ts +73 -26
  107. package/src/reachability/index.ts +70 -1
  108. package/src/reachability/reachability.types.ts +6 -0
  109. package/src/reachability/request.ts +7 -0
  110. package/src/reconnection-manager/index.ts +2 -2
  111. package/src/recording-controller/util.ts +17 -13
  112. package/src/roap/index.ts +3 -7
  113. package/src/roap/turnDiscovery.ts +34 -39
  114. package/src/roap/types.ts +23 -0
  115. package/test/unit/spec/controls-options-manager/util.js +120 -0
  116. package/test/unit/spec/locus-info/controlsUtils.js +103 -9
  117. package/test/unit/spec/locus-info/index.js +28 -0
  118. package/test/unit/spec/media/index.ts +6 -16
  119. package/test/unit/spec/meeting/in-meeting-actions.ts +13 -4
  120. package/test/unit/spec/meeting/index.js +558 -145
  121. package/test/unit/spec/meeting/locusMediaRequest.ts +101 -88
  122. package/test/unit/spec/meeting/muteState.js +0 -2
  123. package/test/unit/spec/meeting/request.js +32 -1
  124. package/test/unit/spec/meeting/utils.js +123 -18
  125. package/test/unit/spec/meeting-info/meetinginfov2.js +443 -114
  126. package/test/unit/spec/meetings/index.js +96 -1
  127. package/test/unit/spec/member/index.js +7 -0
  128. package/test/unit/spec/member/util.js +24 -0
  129. package/test/unit/spec/reachability/clusterReachability.ts +88 -56
  130. package/test/unit/spec/reachability/index.ts +101 -0
  131. package/test/unit/spec/reachability/request.js +47 -2
  132. package/test/unit/spec/reconnection-manager/index.js +4 -4
  133. package/test/unit/spec/roap/turnDiscovery.ts +110 -28
@@ -1 +1 @@
1
- {"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscoverySkipReason","missingHttpResponse","reachability","alreadyInProgress","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","turnInfo","url","username","password","_createClass2","key","value","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP, Enum} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport MeetingUtil from '../meeting/util';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\nconst TurnDiscoverySkipReason = {\n missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there\n reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)\n alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress\n} as const;\n\nexport type TurnDiscoverySkipReason =\n | Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string\n | string // used in case of errors, contains the error message\n | undefined; // used when TURN discovery is not skipped\n\nexport type TurnServerInfo = {\n url: string;\n username: string;\n password: string;\n};\n\nexport type TurnDiscoveryResult = {\n turnServerInfo?: TurnServerInfo;\n turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n};\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n url: '',\n username: '',\n password: '',\n };\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'url'},\n {headerName: 'x-cisco-turn-username', field: 'username'},\n {headerName: 'x-cisco-turn-password', field: 'password'},\n ];\n\n let foundHeaders = 0;\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n this.turnInfo[expectedHeader.field] = receivedHeader.substring(\n expectedHeader.headerName.length + 1\n );\n foundHeaders += 1;\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (foundHeaders !== expectedHeaders.length) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`\n );\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","_types","TURN_DISCOVERY_TIMEOUT","TURN_DISCOVERY_SEQ","TurnDiscovery","exports","default","roapRequest","_classCallCheck2","_defineProperty2","resetTurnInfo","_createClass2","key","value","turnInfo","urls","username","password","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","from","_this","headers","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_RESPONSE","_stringify","expectedHeaders","headerName","field","multipleAllowed","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","headerValue","substring","length","push","clearTimeout","undefined","some","header","filter","url","resolve","isOkRequired","includes","_generateTurnDiscoveryRequestMessage","_asyncToGenerator2","_regenerator","mark","_callee","meeting","isForced","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","abrupt","TurnDiscoverySkipReason","alreadyInProgress","getSkipReason","sent","Defer","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","seq","stop","generateTurnDiscoveryRequestMessage","_x","_x2","apply","arguments","handleTurnDiscoveryFailure","error","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","correlationId","locus_id","locusUrl","split","pop","reason","message","stack","turnServerInfo","_handleTurnDiscoveryHttpResponse","_callee2","httpResponse","_yield$this$defer$pro","_callee2$","_context2","missingHttpResponse","parseHttpTurnDiscoveryResponse","sendRoapOK","t0","abort","handleTurnDiscoveryHttpResponse","_x3","_x4","_httpResponse$mediaCo","_httpResponse$mediaCo2","turnDiscoveryResponse","mediaConnections","remoteSdp","JSON","parse","_remoteSdp$roapMessag","errorType","errorCause","ROAP_HTTP_RESPONSE_MISSING","isMultistream","sendRoapTurnDiscoveryRequest","isReconnecting","_this2","sendRoap","locusSelfUrl","selfUrl","mediaId","locusMediaRequest","then","_ref","_callee3","response","_callee3$","_context3","updateMediaConnections","_x5","TURN_DISCOVERY_REQUIRES_OK","OK","_getSkipReason","_callee4","isAnyPublicClusterReachable","_callee4$","_context4","webex","meetings","reachability","_x6","_isSkipped","_callee5","skipReason","_callee5$","_context5","isSkipped","_x7","_doTurnDiscovery","_callee6","turnDiscoveryResult","_yield$this$waitForTu","_callee6$","_context6","doTurnDiscovery","_x8","_x9","_x10"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\nimport {TurnDiscoverySkipReason, TurnServerInfo, TurnDiscoveryResult} from './types';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n// Roap spec says that seq should start from 1, but TURN discovery works fine with seq=0\n// and this is handy for us, because TURN discovery is always done before the first SDP exchange,\n// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection\n// and do the SDP offer with seq=1\nconst TURN_DISCOVERY_SEQ = 0;\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: TurnServerInfo;\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /** Resets the turnInfo structure to the defaults\n * @returns {void}\n */\n private resetTurnInfo() {\n this.turnInfo = {\n urls: [],\n username: '',\n password: '',\n };\n }\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.resetTurnInfo();\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,\n * otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.\n *\n * @param {Object} roapMessage\n * @param {string} from string to indicate how we got the response (used just for logging)\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: any, from: string) {\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`\n );\n\n return;\n }\n\n if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(\n roapMessage\n )}`\n )\n );\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'urls', multipleAllowed: true},\n {headerName: 'x-cisco-turn-username', field: 'username', multipleAllowed: false},\n {headerName: 'x-cisco-turn-password', field: 'password', multipleAllowed: false},\n ];\n\n const foundHeaders = {};\n\n this.resetTurnInfo();\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n foundHeaders[expectedHeader.headerName] = true;\n\n const headerValue = receivedHeader.substring(expectedHeader.headerName.length + 1);\n\n if (expectedHeader.multipleAllowed) {\n this.turnInfo[expectedHeader.field].push(headerValue);\n } else {\n // just store the last one we find\n this.turnInfo[expectedHeader.field] = headerValue;\n }\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (expectedHeaders.some((header) => !foundHeaders[header.headerName])) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(\n `TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`\n )\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, urls=${this.turnInfo.urls}`\n );\n\n this.turnInfo.urls = this.turnInfo.urls.filter((url) => url !== ''); // remove empty urls, we might get them if we land on video-mesh nodes (VMN)\n\n this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});\n }\n }\n\n /**\n * Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.\n * It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response\n * or want to abort, you need to call abort().\n *\n * @param {Meeting} meeting\n * @param {boolean} isForced\n * @returns {Object}\n */\n public async generateTurnDiscoveryRequestMessage(\n meeting: Meeting,\n isForced: boolean\n ): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'\n );\n\n return {\n roapMessage: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n };\n }\n\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {roapMessage: undefined, turnDiscoverySkippedReason};\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'\n );\n\n return {roapMessage, turnDiscoverySkippedReason: undefined};\n }\n\n /**\n * Handles any errors that occur during TURN discovery without re-throwing them.\n *\n * @param {Meeting} meeting\n * @param {Error} error\n * @returns {TurnDiscoveryResult}\n */\n private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: error.message,\n stack: error.stack,\n });\n\n return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};\n }\n\n /**\n * Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,\n * it returns an object with turnServerInfo set to undefined. In that case you need to call abort()\n * to end the TURN discovery process.\n *\n * @param {Meeting} meeting\n * @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response\n * @returns {Promise<TurnDiscoveryResult>}\n * @memberof Roap\n */\n public async handleTurnDiscoveryHttpResponse(\n meeting: Meeting,\n httpResponse?: object\n ): Promise<TurnDiscoveryResult> {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'\n );\n\n throw new Error(\n 'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'\n );\n }\n\n if (httpResponse === undefined) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n try {\n const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);\n\n if (!roapMessage) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,\n };\n }\n\n this.handleTurnDiscoveryResponse(roapMessage, 'in http response');\n\n const {isOkRequired} = await this.defer.promise;\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (error) {\n this.abort();\n\n return this.handleTurnDiscoveryFailure(meeting, error);\n }\n }\n\n /**\n * Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),\n * but then never got any response from the server.\n * @returns {void}\n */\n public abort() {\n if (this.defer) {\n this.defer.reject(new Error('TURN discovery aborted'));\n this.defer = undefined;\n }\n }\n\n /**\n * Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response\n * and returns it.\n *\n * @param {Meeting} meeting\n * @param {any} httpResponse\n * @returns {any}\n */\n private parseHttpTurnDiscoveryResponse(\n meeting: Meeting,\n httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}\n ) {\n let turnDiscoveryResponse;\n\n if (httpResponse.mediaConnections?.[0]?.remoteSdp) {\n const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);\n\n if (remoteSdp.roapMessage) {\n // yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...\n const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;\n\n turnDiscoveryResponse = {\n seq,\n messageType,\n errorType,\n errorCause,\n headers,\n };\n }\n }\n\n if (!turnDiscoveryResponse) {\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {\n correlationId: meeting.correlationId,\n messageType: 'TURN_DISCOVERY_RESPONSE',\n isMultistream: meeting.isMultistream,\n });\n }\n\n return turnDiscoveryResponse;\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(\n meeting: Meeting,\n isReconnecting: boolean\n ): Promise<TurnDiscoveryResult> {\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,\n });\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n })\n .then(async (response) => {\n const {mediaConnections} = response;\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n return this.handleTurnDiscoveryHttpResponse(meeting, response);\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n });\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: TURN_DISCOVERY_SEQ,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n isMultistream: meeting.isMultistream,\n locusMediaRequest: meeting.locusMediaRequest,\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {\n const isAnyPublicClusterReachable =\n // @ts-ignore - fix type\n await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();\n\n if (isAnyPublicClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return TurnDiscoverySkipReason.reachability;\n }\n\n return undefined;\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * This TURN discovery roap exchange is always done with seq=0.\n * The RoapMediaConnection SDP exchange always starts with seq=1,\n * so it works fine no matter if TURN discovery is done or not.\n *\n * @param {Meeting} meeting\n * @param {Boolean} [isReconnecting] should be set to true if this is a new\n * media connection just after a reconnection\n * @param {Boolean} [isForced]\n * @returns {Promise}\n */\n async doTurnDiscovery(\n meeting: Meeting,\n isReconnecting?: boolean,\n isForced?: boolean\n ): Promise<TurnDiscoveryResult> {\n let turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n\n if (!isForced) {\n turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n }\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n try {\n const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);\n\n if (\n turnDiscoveryResult.turnDiscoverySkippedReason !==\n TurnDiscoverySkipReason.missingHttpResponse\n ) {\n return turnDiscoveryResult;\n }\n\n // if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury\n const {isOkRequired} = await this.waitForTurnDiscoveryResponse();\n\n if (isOkRequired) {\n await this.sendRoapOK(meeting);\n }\n\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n } catch (e) {\n return this.handleTurnDiscoveryFailure(meeting, e);\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.TurnDiscoverySkipReason = void 0;
8
+ var TurnDiscoverySkipReason = exports.TurnDiscoverySkipReason = {
9
+ missingHttpResponse: 'missing http response',
10
+ // when we asked for the TURN discovery response to be in the http response, but it wasn't there
11
+ reachability: 'reachability',
12
+ // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
13
+ alreadyInProgress: 'already in progress' // when we try to start TURN discovery while it's already in progress
14
+ };
15
+
16
+ // used when TURN discovery is not skipped
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TurnDiscoverySkipReason","exports","missingHttpResponse","reachability","alreadyInProgress"],"sources":["types.ts"],"sourcesContent":["import {Enum} from '../constants';\n\nexport const TurnDiscoverySkipReason = {\n missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there\n reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)\n alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress\n} as const;\n\nexport type TurnDiscoverySkipReason =\n | Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string\n | string // used in case of errors, contains the error message\n | undefined; // used when TURN discovery is not skipped\n\nexport type TurnServerInfo = {\n urls: string[];\n username: string;\n password: string;\n};\n\nexport type TurnDiscoveryResult = {\n turnServerInfo?: TurnServerInfo;\n turnDiscoverySkippedReason: TurnDiscoverySkipReason;\n};\n"],"mappings":";;;;;;;AAEO,IAAMA,uBAAuB,GAAAC,OAAA,CAAAD,uBAAA,GAAG;EACrCE,mBAAmB,EAAE,uBAAuB;EAAE;EAC9CC,YAAY,EAAE,cAAc;EAAE;EAC9BC,iBAAiB,EAAE,qBAAqB,CAAE;AAC5C,CAAU;;AAKK"}
@@ -70,6 +70,7 @@ declare const _default: {
70
70
  };
71
71
  iceCandidatesGatheringTimeout: any;
72
72
  backendIpv6NativeSupport: boolean;
73
+ enableReachabilityChecks: boolean;
73
74
  reachabilityGetClusterTimeout: number;
74
75
  logUploadIntervalMultiplicationFactor: number;
75
76
  };
@@ -275,6 +275,8 @@ export declare const EVENT_TRIGGERS: {
275
275
  MEETING_CONTROLS_WEBCAST_UPDATED: string;
276
276
  MEETING_CONTROLS_MEETING_FULL_UPDATED: string;
277
277
  MEETING_CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
278
+ MEETING_CONTROLS_ANNOTATION_UPDATED: string;
279
+ MEETING_CONTROLS_REMOTE_DESKTOP_CONTROL_UPDATED: string;
278
280
  MEETING_LOCUS_URL_UPDATE: string;
279
281
  MEETING_STREAM_PUBLISH_STATE_CHANGED: string;
280
282
  MEETING_TRANSCRIPTION_CONNECTED: string;
@@ -578,6 +580,8 @@ export declare const LOCUSINFO: {
578
580
  CONTROLS_PRACTICE_SESSION_STATUS_UPDATED: string;
579
581
  CONTROLS_VIDEO_CHANGED: string;
580
582
  CONTROLS_STAGE_VIEW_UPDATED: string;
583
+ CONTROLS_ANNOTATION_CHANGED: string;
584
+ CONTROLS_REMOTE_DESKTOP_CONTROL_CHANGED: string;
581
585
  SELF_UNADMITTED_GUEST: string;
582
586
  SELF_ADMITTED_GUEST: string;
583
587
  SELF_REMOTE_VIDEO_MUTE_STATUS_UPDATED: string;
@@ -737,6 +741,7 @@ export declare enum SELF_POLICY {
737
741
  ENFORCE_VIRTUAL_BACKGROUND = "enforceVirtualBackground",
738
742
  SUPPORT_LOCAL_RECORD = "supportLocalRecord",
739
743
  SUPPORT_NETWORK_BASED_RECORD = "supportNetworkBasedRecord",
744
+ SUPPORT_PREMISE_RECORD = "supportPremiseRecord",
740
745
  SUPPORT_REALTIME_CLOSE_CAPTION = "supportRealtimeCloseCaption",
741
746
  SUPPORT_CHAT = "supportChat",
742
747
  SUPPORT_DESKTOP_SHARE_REMOTE = "supportDesktopShareRemote",
@@ -838,6 +843,11 @@ export declare const DISPLAY_HINTS: {
838
843
  PRACTICE_SESSION_OFF: string;
839
844
  SHOW_PRACTICE_SESSION_START: string;
840
845
  SHOW_PRACTICE_SESSION_STOP: string;
846
+ SHOW_POST_MEETING_DATA_CONSENT_PROMPT: string;
847
+ ENABLE_ANNOTATION_MEETING_OPTION: string;
848
+ DISABLE_ANNOTATION_MEETING_OPTION: string;
849
+ ENABLE_RDC_MEETING_OPTION: string;
850
+ DISABLE_RDC_MEETING_OPTION: string;
841
851
  };
842
852
  export declare const INTERSTITIAL_DISPLAY_HINTS: string[];
843
853
  export declare const SELF_ROLES: {
@@ -10,7 +10,9 @@ declare enum Control {
10
10
  reactions = "reactions",
11
11
  shareControl = "shareControl",
12
12
  video = "video",
13
- viewTheParticipantList = "viewTheParticipantList"
13
+ viewTheParticipantList = "viewTheParticipantList",
14
+ annotation = "annotation",
15
+ rdc = "rdc"
14
16
  }
15
17
  export { Control, Setting };
16
18
  export default Setting;
@@ -32,7 +32,13 @@ export interface ViewTheParticipantListProperties {
32
32
  panelistEnabled?: boolean;
33
33
  attendeeCount?: boolean;
34
34
  }
35
- export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties;
35
+ export interface AnnotationProperties {
36
+ enabled?: boolean;
37
+ }
38
+ export interface RemoteDesktopControlProperties {
39
+ enabled?: boolean;
40
+ }
41
+ export type Properties = AudioProperties | RaiseHandProperties | ReactionsProperties | ShareControlProperties | VideoProperties | ViewTheParticipantListProperties | AnnotationProperties | RemoteDesktopControlProperties;
36
42
  export interface ControlConfig<Props = Properties> {
37
43
  /**
38
44
  * The scope of the control within this object.
@@ -37,6 +37,7 @@ export default class LocusInfo extends EventsScope {
37
37
  services: any;
38
38
  resources: any;
39
39
  mainSessionLocusCache: any;
40
+ self: any;
40
41
  /**
41
42
  * Constructor
42
43
  * @param {function} updateMeeting callback to update the meeting object from an object
@@ -95,6 +95,11 @@ interface IInMeetingActions {
95
95
  isPracticeSessionOff?: boolean;
96
96
  canStartPracticeSession?: boolean;
97
97
  canStopPracticeSession?: boolean;
98
+ requiresPostMeetingDataConsentPrompt?: boolean;
99
+ canEnableAnnotation?: boolean;
100
+ canDisableAnnotation?: boolean;
101
+ canEnableRemoteDesktopControl?: boolean;
102
+ canDisableRemoteDesktopControl?: boolean;
98
103
  }
99
104
  /**
100
105
  * @class InMeetingActions
@@ -190,6 +195,11 @@ export default class InMeetingActions implements IInMeetingActions {
190
195
  isPracticeSessionOff: any;
191
196
  canStartPracticeSession: any;
192
197
  canStopPracticeSession: any;
198
+ requiresPostMeetingDataConsentPrompt: any;
199
+ canEnableAnnotation: any;
200
+ canDisableAnnotation: any;
201
+ canEnableRemoteDesktopControl: any;
202
+ canDisableRemoteDesktopControl: any;
193
203
  /**
194
204
  * Returns all meeting action options
195
205
  * @returns {Object}
@@ -4,7 +4,8 @@ import { ClientEvent, ClientEventLeaveReason } from '@webex/internal-plugin-metr
4
4
  import { ClientEvent as RawClientEvent } from '@webex/event-dictionary-ts';
5
5
  import { MediaType, StatsAnalyzer, NetworkQualityMonitor } from '@webex/internal-media-core';
6
6
  import { LocalStream, LocalCameraStream, LocalDisplayStream, LocalSystemAudioStream, LocalMicrophoneStream } from '@webex/media-helpers';
7
- import Roap, { type TurnServerInfo, type TurnDiscoverySkipReason } from '../roap/index';
7
+ import Roap, { type TurnDiscoverySkipReason } from '../roap/index';
8
+ import { type TurnServerInfo } from '../roap/types';
8
9
  import { type BundlePolicy } from '../media';
9
10
  import MediaProperties from '../media/properties';
10
11
  import ReconnectionManager from '../reconnection-manager';
@@ -71,6 +72,8 @@ export type CallStateForMetrics = {
71
72
  sessionCorrelationId?: string;
72
73
  joinTrigger?: string;
73
74
  loginType?: string;
75
+ userNameInput?: string;
76
+ emailInput?: string;
74
77
  };
75
78
  export declare const MEDIA_UPDATE_TYPE: {
76
79
  TRANSCODED_MEDIA_CONNECTION: string;
@@ -447,6 +450,12 @@ export default class Meeting extends StatelessWebexPlugin {
447
450
  allowMediaInLobby: boolean;
448
451
  localShareInstanceId: string;
449
452
  remoteShareInstanceId: string;
453
+ shareCAEventSentStatus: {
454
+ transmitStart: boolean;
455
+ transmitStop: boolean;
456
+ receiveStart: boolean;
457
+ receiveStop: boolean;
458
+ };
450
459
  turnDiscoverySkippedReason: TurnDiscoverySkipReason;
451
460
  turnServerUsed: boolean;
452
461
  areVoiceaEventsSetup: boolean;
@@ -466,6 +475,7 @@ export default class Meeting extends StatelessWebexPlugin {
466
475
  private rtcMetrics?;
467
476
  private uploadLogsTimer?;
468
477
  private logUploadIntervalIndex;
478
+ private mediaServerIp;
469
479
  /**
470
480
  * @param {Object} attrs
471
481
  * @param {Object} options
@@ -495,6 +505,26 @@ export default class Meeting extends StatelessWebexPlugin {
495
505
  * @param {string} correlationId
496
506
  */
497
507
  set correlationId(correlationId: string);
508
+ /**
509
+ * Getter - Returns callStateForMetrics.userNameInput
510
+ * @returns {string}
511
+ */
512
+ get userNameInput(): string;
513
+ /**
514
+ * Setter - sets callStateForMetrics.userNameInput
515
+ * @param {string} userNameInput
516
+ */
517
+ set userNameInput(userNameInput: string);
518
+ /**
519
+ * Getter - Returns callStateForMetrics.emailInput
520
+ * @returns {string}
521
+ */
522
+ get emailInput(): string;
523
+ /**
524
+ * Setter - sets callStateForMetrics.emailInput
525
+ * @param {string} emailInput
526
+ */
527
+ set emailInput(emailInput: string);
498
528
  /**
499
529
  * Getter - Returns callStateForMetrics.sessionCorrelationId
500
530
  * @returns {string}
@@ -511,6 +541,14 @@ export default class Meeting extends StatelessWebexPlugin {
511
541
  * @returns {string | undefined}
512
542
  */
513
543
  get isoLocalClientMeetingJoinTime(): string | undefined;
544
+ /**
545
+ * Setter - sets isoLocalClientMeetingJoinTime
546
+ * This will be set once on meeting join, and not updated again
547
+ * this will always produce an ISO string
548
+ * If the iso string is invalid, it will fallback to the current system time
549
+ * @param {string | undefined} time
550
+ */
551
+ set isoLocalClientMeetingJoinTime(time: string | undefined);
514
552
  /**
515
553
  * Set meeting info and trigger `MEETING_INFO_AVAILABLE` event
516
554
  * @param {any} info
@@ -1308,10 +1346,10 @@ export default class Meeting extends StatelessWebexPlugin {
1308
1346
  /**
1309
1347
  * Handles ROAP_FAILURE event from the webrtc media connection
1310
1348
  *
1311
- * @param {Error} error
1349
+ * @param {Error} roapError
1312
1350
  * @returns {void}
1313
1351
  */
1314
- handleRoapFailure: (error: any) => void;
1352
+ handleRoapFailure: (roapError: any) => void;
1315
1353
  /**
1316
1354
  * This function makes sure we send the right metrics when local and remote SDPs are processed/generated
1317
1355
  *
@@ -1851,6 +1889,15 @@ export default class Meeting extends StatelessWebexPlugin {
1851
1889
  * @memberof Meeting
1852
1890
  */
1853
1891
  toggleReactions(enable: boolean): Promise<any>;
1892
+ /**
1893
+ * Method to set post meeting data consent.
1894
+ *
1895
+ * @param {boolean} accept - whether consent accepted or declined
1896
+ * @returns {Promise}
1897
+ * @public
1898
+ * @memberof Meeting
1899
+ */
1900
+ setPostMeetingDataConsent(accept: boolean): Promise<any>;
1854
1901
  /**
1855
1902
  * Throws if we don't have a media connection created
1856
1903
  *
@@ -69,7 +69,6 @@ export declare class MuteState {
69
69
  * @public
70
70
  * @memberof MuteState
71
71
  * @param {Object} [meeting] the meeting object
72
- * @param {Boolean} [mute] true for muting, false for unmuting request
73
72
  * @returns {void}
74
73
  */
75
74
  handleLocalStreamMuteStateChange(meeting?: any): void;
@@ -1,5 +1,5 @@
1
1
  import { StatelessWebexPlugin } from '@webex/webex-core';
2
- import { SendReactionOptions, BrbOptions, ToggleReactionsOptions } from './request.type';
2
+ import { SendReactionOptions, BrbOptions, ToggleReactionsOptions, PostMeetingDataConsentOptions } from './request.type';
3
3
  import { AnnotationInfo } from '../annotation/annotation.types';
4
4
  import { ClientMediaPreferences } from '../reachability/reachability.types';
5
5
  /**
@@ -303,4 +303,15 @@ export default class MeetingRequest extends StatelessWebexPlugin {
303
303
  * @returns {Promise}
304
304
  */
305
305
  setBrb({ enabled, locusUrl, deviceUrl, selfId }: BrbOptions): Promise<any>;
306
+ /**
307
+ * Sends a request to set post meeting data consent.
308
+ *
309
+ * @param {Object} options - The options for post meeting data consent request.
310
+ * @param {boolean} options.consent - Whether accepted or declined.
311
+ * @param {string} options.locusUrl - The URL of the locus.
312
+ * @param {string} options.deviceUrl - The URL of the device.
313
+ * @param {string} options.selfId - The ID of the participant.
314
+ * @returns {Promise}
315
+ */
316
+ setPostMeetingDataConsent({ postMeetingDataConsent, locusUrl, deviceUrl, selfId, }: PostMeetingDataConsentOptions): Promise<any>;
306
317
  }
@@ -15,3 +15,9 @@ export type BrbOptions = {
15
15
  deviceUrl: string;
16
16
  selfId: string;
17
17
  };
18
+ export type PostMeetingDataConsentOptions = {
19
+ postMeetingDataConsent: boolean;
20
+ locusUrl: string;
21
+ deviceUrl: string;
22
+ selfId: string;
23
+ };
@@ -80,8 +80,9 @@ declare const MeetingUtil: {
80
80
  waitingForOthersToJoin: (displayHints: any) => any;
81
81
  canSendReactions: (originalValue: any, displayHints: any) => any;
82
82
  canUserRenameSelfAndObserved: (displayHints: any) => any;
83
+ requiresPostMeetingDataConsentPrompt: (displayHints: any) => any;
83
84
  canUserRenameOthers: (displayHints: any) => any;
84
- canShareWhiteBoard: (displayHints: any) => any;
85
+ canShareWhiteBoard: (displayHints: any, policies?: {}) => boolean;
85
86
  /**
86
87
  * Adds the current locus sequence information to a request body
87
88
  * @param {Object} meeting The meeting object
@@ -118,5 +119,11 @@ declare const MeetingUtil: {
118
119
  name: string;
119
120
  shownToUser: boolean;
120
121
  }[];
122
+ /**
123
+ * Creates a proxy object to mark an error as handled by the SDK.
124
+ * @param {Error} error original error
125
+ * @returns {Proxy} proxy object with handledBySdk property
126
+ */
127
+ markErrorAsHandledBySdk: (error: any) => any;
121
128
  };
122
129
  export default MeetingUtil;
@@ -99,6 +99,52 @@ export declare class MeetingInfoV2JoinForbiddenError extends Error {
99
99
  */
100
100
  constructor(wbxAppApiErrorCode?: number, meetingInfo?: object, message?: string);
101
101
  }
102
+ /**
103
+ * Error fetching static link for a conversation when it does not exist
104
+ */
105
+ export declare class MeetingInfoV2StaticLinkDoesNotExistError extends Error {
106
+ sdkMessage: any;
107
+ wbxAppApiCode: any;
108
+ body: any;
109
+ /**
110
+ *
111
+ * @constructor
112
+ * @param {Number} [wbxAppApiErrorCode]
113
+ * @param {String} [message]
114
+ */
115
+ constructor(wbxAppApiErrorCode?: number, message?: string);
116
+ }
117
+ /**
118
+ * Error enabling/disabling static meeting link
119
+ */
120
+ export declare class MeetingInfoV2MeetingIsInProgressError extends Error {
121
+ sdkMessage: any;
122
+ wbxAppApiCode: any;
123
+ body: any;
124
+ /**
125
+ *
126
+ * @constructor
127
+ * @param {Number} [wbxAppApiErrorCode]
128
+ * @param {String} [message]
129
+ * @param {Boolean} [enable]
130
+ */
131
+ constructor(wbxAppApiErrorCode?: number, message?: string, enable?: boolean);
132
+ }
133
+ /**
134
+ * Error enabling/disabling static meeting link
135
+ */
136
+ export declare class MeetingInfoV2StaticMeetingLinkAlreadyExists extends Error {
137
+ sdkMessage: any;
138
+ wbxAppApiCode: any;
139
+ body: any;
140
+ /**
141
+ *
142
+ * @constructor
143
+ * @param {Number} [wbxAppApiErrorCode]
144
+ * @param {String} [message]
145
+ */
146
+ constructor(wbxAppApiErrorCode?: number, message?: string);
147
+ }
102
148
  /**
103
149
  * @class MeetingInfo
104
150
  */
@@ -136,6 +182,16 @@ export default class MeetingInfoV2 {
136
182
  * @returns {void}
137
183
  */
138
184
  handleForbiddenError: (err: any) => void;
185
+ /**
186
+ * helper function to either create an adhoc space meeting or enable static meeting link
187
+ * @param {String} conversationUrl conversationUrl to start adhoc meeting on
188
+ * @param {String} installedOrgID org ID of user's machine
189
+ * @param {Boolean} enableStaticMeetingLink whether or not to enable static meeting link
190
+ * @returns {Promise} returns a meeting info object
191
+ * @public
192
+ * @memberof MeetingInfo
193
+ */
194
+ createAdhocSpaceMeetingOrEnableStaticMeetingLink(conversationUrl: string, installedOrgID?: string, enableStaticMeetingLink?: boolean): Promise<any>;
139
195
  /**
140
196
  * Creates adhoc space meetings for a space by fetching the conversation infomation
141
197
  * @param {String} conversationUrl conversationUrl to start adhoc meeting on
@@ -145,6 +201,30 @@ export default class MeetingInfoV2 {
145
201
  * @memberof MeetingInfo
146
202
  */
147
203
  createAdhocSpaceMeeting(conversationUrl: string, installedOrgID?: string): Promise<any>;
204
+ /**
205
+ * Fetches details for static meeting link
206
+ * @param {String} conversationUrl conversationUrl that's required to find static meeting link if it exists
207
+ * @returns {Promise} returns a Promise
208
+ * @public
209
+ * @memberof MeetingInfo
210
+ */
211
+ fetchStaticMeetingLink(conversationUrl: string): Promise<any>;
212
+ /**
213
+ * Enables static meeting link
214
+ * @param {String} conversationUrl conversationUrl that's required to enable static meeting link
215
+ * @returns {Promise} returns a Promise
216
+ * @public
217
+ * @memberof MeetingInfo
218
+ */
219
+ enableStaticMeetingLink(conversationUrl: string): Promise<any>;
220
+ /**
221
+ * Disables static meeting link for given conversation url
222
+ * @param {String} conversationUrl conversationUrl that's required to disable static meeting link if it exists
223
+ * @returns {Promise} returns a Promise
224
+ * @public
225
+ * @memberof MeetingInfo
226
+ */
227
+ disableStaticMeetingLink(conversationUrl: string): Promise<any>;
148
228
  /**
149
229
  * Fetches meeting info from the server
150
230
  * @param {String} destination one of many different types of destinations to look up info for
@@ -348,6 +348,15 @@ export default class Meetings extends WebexPlugin {
348
348
  * @memberof Meetings
349
349
  */
350
350
  private destroy;
351
+ /**
352
+ * Fetch static meeting link for given conversation url.
353
+ *
354
+ * @param {string} conversationUrl - url for conversation
355
+ * @returns {Promise}
356
+ * @public
357
+ * @memberof Meetings
358
+ */
359
+ fetchStaticMeetingLink(conversationUrl: string): Promise<any>;
351
360
  /**
352
361
  * Create a meeting or return an existing meeting.
353
362
  *
@@ -368,6 +377,26 @@ export default class Meetings extends WebexPlugin {
368
377
  * @memberof Meetings
369
378
  */
370
379
  create(destination: string, type?: DESTINATION_TYPE, useRandomDelayForInfo?: boolean, infoExtraParams?: {}, correlationId?: string, failOnMissingMeetingInfo?: boolean, callStateForMetrics?: CallStateForMetrics, meetingInfo?: any, meetingLookupUrl?: any, sessionCorrelationId?: string): any;
380
+ /**
381
+ * Enable static meeting links for given conversation url.
382
+ *
383
+ *
384
+ * @param {string} conversationUrl - url for conversation
385
+ * @returns {Promise}
386
+ * @public
387
+ * @memberof Meetings
388
+ */
389
+ enableStaticMeetingLink(conversationUrl: string): Promise<any>;
390
+ /**
391
+ * Disable static meeting links for given conversation url.
392
+ *
393
+ *
394
+ * @param {string} conversationUrl - url for conversation
395
+ * @returns {Promise}
396
+ * @public
397
+ * @memberof Meetings
398
+ */
399
+ disableStaticMeetingLink(conversationUrl: string): Promise<any>;
371
400
  /**
372
401
  * Create meeting
373
402
  *
@@ -16,6 +16,7 @@ export default class Member {
16
16
  isInMeeting: any;
17
17
  isModerator: any;
18
18
  isModeratorAssignmentProhibited: any;
19
+ isPresenterAssignmentProhibited: any;
19
20
  isMutable: any;
20
21
  isNotAdmitted: any;
21
22
  isRecording: any;