@webex/plugin-meetings 3.8.0-next.30 → 3.8.0-next.32
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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/media/index.js +3 -15
- package/dist/media/index.js.map +1 -1
- package/dist/meeting/index.js +196 -189
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +0 -2
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -2
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +31 -23
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/types.js +17 -0
- package/dist/roap/types.js.map +1 -0
- package/dist/types/meeting/index.d.ts +2 -1
- package/dist/types/meeting/muteState.d.ts +0 -1
- package/dist/types/roap/index.d.ts +3 -2
- package/dist/types/roap/turnDiscovery.d.ts +1 -17
- package/dist/types/roap/types.d.ts +16 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +3 -3
- package/src/media/index.ts +5 -21
- package/src/meeting/index.ts +13 -7
- package/src/meeting/muteState.ts +0 -2
- package/src/reconnection-manager/index.ts +2 -2
- package/src/roap/index.ts +3 -7
- package/src/roap/turnDiscovery.ts +21 -35
- package/src/roap/types.ts +23 -0
- package/test/unit/spec/media/index.ts +6 -16
- package/test/unit/spec/meeting/index.js +32 -21
- package/test/unit/spec/meeting/muteState.js +0 -2
- package/test/unit/spec/reconnection-manager/index.js +4 -4
- package/test/unit/spec/roap/turnDiscovery.ts +72 -28
|
@@ -18,6 +18,7 @@ var _metrics = _interopRequireDefault(require("../metrics"));
|
|
|
18
18
|
var _constants = _interopRequireDefault(require("../metrics/constants"));
|
|
19
19
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
20
20
|
var _constants2 = require("../constants");
|
|
21
|
+
var _types = require("./types");
|
|
21
22
|
// @ts-ignore - Types not available for @webex/common
|
|
22
23
|
|
|
23
24
|
var TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
@@ -27,15 +28,7 @@ var TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
|
27
28
|
// so we can do it with seq=0 or not do it at all and then we create the RoapMediaConnection
|
|
28
29
|
// and do the SDP offer with seq=1
|
|
29
30
|
var TURN_DISCOVERY_SEQ = 0;
|
|
30
|
-
var TurnDiscoverySkipReason = {
|
|
31
|
-
missingHttpResponse: 'missing http response',
|
|
32
|
-
// when we asked for the TURN discovery response to be in the http response, but it wasn't there
|
|
33
|
-
reachability: 'reachability',
|
|
34
|
-
// when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
|
|
35
|
-
alreadyInProgress: 'already in progress' // when we try to start TURN discovery while it's already in progress
|
|
36
|
-
};
|
|
37
31
|
|
|
38
|
-
// used when TURN discovery is not skipped
|
|
39
32
|
/**
|
|
40
33
|
* Handles the process of finding out TURN server information from Linus.
|
|
41
34
|
* This is achieved by sending a TURN_DISCOVERY_REQUEST.
|
|
@@ -55,7 +48,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
55
48
|
(0, _defineProperty2.default)(this, "responseTimer", void 0);
|
|
56
49
|
this.roapRequest = roapRequest;
|
|
57
50
|
this.turnInfo = {
|
|
58
|
-
|
|
51
|
+
urls: [],
|
|
59
52
|
username: '',
|
|
60
53
|
password: ''
|
|
61
54
|
};
|
|
@@ -108,31 +101,46 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
108
101
|
}
|
|
109
102
|
var expectedHeaders = [{
|
|
110
103
|
headerName: 'x-cisco-turn-url',
|
|
111
|
-
field: '
|
|
104
|
+
field: 'urls',
|
|
105
|
+
multipleAllowed: true
|
|
112
106
|
}, {
|
|
113
107
|
headerName: 'x-cisco-turn-username',
|
|
114
|
-
field: 'username'
|
|
108
|
+
field: 'username',
|
|
109
|
+
multipleAllowed: false
|
|
115
110
|
}, {
|
|
116
111
|
headerName: 'x-cisco-turn-password',
|
|
117
|
-
field: 'password'
|
|
112
|
+
field: 'password',
|
|
113
|
+
multipleAllowed: false
|
|
118
114
|
}];
|
|
119
|
-
var foundHeaders =
|
|
115
|
+
var foundHeaders = {};
|
|
120
116
|
headers === null || headers === void 0 ? void 0 : headers.forEach(function (receivedHeader) {
|
|
121
117
|
// check if it matches any of our expected headers
|
|
122
118
|
expectedHeaders.forEach(function (expectedHeader) {
|
|
123
119
|
if (receivedHeader.startsWith("".concat(expectedHeader.headerName, "="))) {
|
|
124
|
-
|
|
125
|
-
|
|
120
|
+
foundHeaders[expectedHeader.headerName] = true;
|
|
121
|
+
var headerValue = receivedHeader.substring(expectedHeader.headerName.length + 1);
|
|
122
|
+
if (expectedHeader.multipleAllowed) {
|
|
123
|
+
_this.turnInfo[expectedHeader.field].push(headerValue);
|
|
124
|
+
} else {
|
|
125
|
+
// just store the last one we find
|
|
126
|
+
_this.turnInfo[expectedHeader.field] = headerValue;
|
|
127
|
+
}
|
|
126
128
|
}
|
|
127
129
|
});
|
|
128
130
|
});
|
|
129
131
|
clearTimeout(this.responseTimer);
|
|
130
132
|
this.responseTimer = undefined;
|
|
131
|
-
if (
|
|
133
|
+
if (expectedHeaders.some(function (header) {
|
|
134
|
+
return !foundHeaders[header.headerName];
|
|
135
|
+
})) {
|
|
132
136
|
_loggerProxy.default.logger.warn("Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ".concat(from, ": ").concat((0, _stringify.default)(headers)));
|
|
133
137
|
this.defer.reject(new Error("TURN_DISCOVERY_RESPONSE ".concat(from, " missing some headers: ").concat((0, _stringify.default)(headers))));
|
|
134
138
|
} else {
|
|
135
|
-
_loggerProxy.default.logger.info("Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ".concat(from, ",
|
|
139
|
+
_loggerProxy.default.logger.info("Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ".concat(from, ", urls=").concat(this.turnInfo.urls));
|
|
140
|
+
this.turnInfo.urls = this.turnInfo.urls.filter(function (url) {
|
|
141
|
+
return url !== '';
|
|
142
|
+
}); // remove empty urls, we might get them if we land on video-mesh nodes (VMN)
|
|
143
|
+
|
|
136
144
|
this.defer.resolve({
|
|
137
145
|
isOkRequired: !(headers !== null && headers !== void 0 && headers.includes('noOkInTransaction'))
|
|
138
146
|
});
|
|
@@ -163,7 +171,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
163
171
|
_loggerProxy.default.logger.warn('Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress');
|
|
164
172
|
return _context.abrupt("return", {
|
|
165
173
|
roapMessage: undefined,
|
|
166
|
-
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress
|
|
174
|
+
turnDiscoverySkippedReason: _types.TurnDiscoverySkipReason.alreadyInProgress
|
|
167
175
|
});
|
|
168
176
|
case 3:
|
|
169
177
|
if (isForced) {
|
|
@@ -263,7 +271,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
263
271
|
}
|
|
264
272
|
return _context2.abrupt("return", {
|
|
265
273
|
turnServerInfo: undefined,
|
|
266
|
-
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse
|
|
274
|
+
turnDiscoverySkippedReason: _types.TurnDiscoverySkipReason.missingHttpResponse
|
|
267
275
|
});
|
|
268
276
|
case 5:
|
|
269
277
|
_context2.prev = 5;
|
|
@@ -274,7 +282,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
274
282
|
}
|
|
275
283
|
return _context2.abrupt("return", {
|
|
276
284
|
turnServerInfo: undefined,
|
|
277
|
-
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse
|
|
285
|
+
turnDiscoverySkippedReason: _types.TurnDiscoverySkipReason.missingHttpResponse
|
|
278
286
|
});
|
|
279
287
|
case 9:
|
|
280
288
|
this.handleTurnDiscoveryResponse(roapMessage, 'in http response');
|
|
@@ -386,7 +394,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
386
394
|
_loggerProxy.default.logger.warn('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress');
|
|
387
395
|
return _promise.default.resolve({
|
|
388
396
|
turnServerInfo: undefined,
|
|
389
|
-
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress
|
|
397
|
+
turnDiscoverySkippedReason: _types.TurnDiscoverySkipReason.alreadyInProgress
|
|
390
398
|
});
|
|
391
399
|
}
|
|
392
400
|
this.defer = new _common.Defer();
|
|
@@ -481,7 +489,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
481
489
|
break;
|
|
482
490
|
}
|
|
483
491
|
_loggerProxy.default.logger.info('Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery');
|
|
484
|
-
return _context4.abrupt("return", TurnDiscoverySkipReason.reachability);
|
|
492
|
+
return _context4.abrupt("return", _types.TurnDiscoverySkipReason.reachability);
|
|
485
493
|
case 6:
|
|
486
494
|
return _context4.abrupt("return", undefined);
|
|
487
495
|
case 7:
|
|
@@ -576,7 +584,7 @@ var TurnDiscovery = exports.default = /*#__PURE__*/function () {
|
|
|
576
584
|
return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);
|
|
577
585
|
case 9:
|
|
578
586
|
turnDiscoveryResult = _context6.sent;
|
|
579
|
-
if (!(turnDiscoveryResult.turnDiscoverySkippedReason !== TurnDiscoverySkipReason.missingHttpResponse)) {
|
|
587
|
+
if (!(turnDiscoveryResult.turnDiscoverySkippedReason !== _types.TurnDiscoverySkipReason.missingHttpResponse)) {
|
|
580
588
|
_context6.next = 12;
|
|
581
589
|
break;
|
|
582
590
|
}
|
|
@@ -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","turnInfo","urls","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","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 /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n urls: [],\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: '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 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"}
|
|
@@ -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
|
|
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';
|
|
@@ -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,7 +1,8 @@
|
|
|
1
1
|
import { StatelessWebexPlugin } from '@webex/webex-core';
|
|
2
|
-
import TurnDiscovery
|
|
2
|
+
import TurnDiscovery from './turnDiscovery';
|
|
3
|
+
import { TurnDiscoveryResult } from './types';
|
|
3
4
|
import Meeting from '../meeting';
|
|
4
|
-
export { type TurnDiscoveryResult, type TurnServerInfo, type TurnDiscoverySkipReason
|
|
5
|
+
export { type TurnDiscoveryResult, type TurnServerInfo, type TurnDiscoverySkipReason } from './types';
|
|
5
6
|
/**
|
|
6
7
|
* Roap options
|
|
7
8
|
* @typedef {Object} RoapOptions
|
|
@@ -1,21 +1,6 @@
|
|
|
1
|
-
import { Enum } from '../constants';
|
|
2
1
|
import RoapRequest from './request';
|
|
3
2
|
import Meeting from '../meeting';
|
|
4
|
-
|
|
5
|
-
readonly missingHttpResponse: "missing http response";
|
|
6
|
-
readonly reachability: "reachability";
|
|
7
|
-
readonly alreadyInProgress: "already in progress";
|
|
8
|
-
};
|
|
9
|
-
export type TurnDiscoverySkipReason = Enum<typeof TurnDiscoverySkipReason> | string | undefined;
|
|
10
|
-
export type TurnServerInfo = {
|
|
11
|
-
url: string;
|
|
12
|
-
username: string;
|
|
13
|
-
password: string;
|
|
14
|
-
};
|
|
15
|
-
export type TurnDiscoveryResult = {
|
|
16
|
-
turnServerInfo?: TurnServerInfo;
|
|
17
|
-
turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
18
|
-
};
|
|
3
|
+
import { TurnDiscoverySkipReason, TurnDiscoveryResult } from './types';
|
|
19
4
|
/**
|
|
20
5
|
* Handles the process of finding out TURN server information from Linus.
|
|
21
6
|
* This is achieved by sending a TURN_DISCOVERY_REQUEST.
|
|
@@ -152,4 +137,3 @@ export default class TurnDiscovery {
|
|
|
152
137
|
*/
|
|
153
138
|
doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean, isForced?: boolean): Promise<TurnDiscoveryResult>;
|
|
154
139
|
}
|
|
155
|
-
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Enum } from '../constants';
|
|
2
|
+
export declare const TurnDiscoverySkipReason: {
|
|
3
|
+
readonly missingHttpResponse: "missing http response";
|
|
4
|
+
readonly reachability: "reachability";
|
|
5
|
+
readonly alreadyInProgress: "already in progress";
|
|
6
|
+
};
|
|
7
|
+
export type TurnDiscoverySkipReason = Enum<typeof TurnDiscoverySkipReason> | string | undefined;
|
|
8
|
+
export type TurnServerInfo = {
|
|
9
|
+
urls: string[];
|
|
10
|
+
username: string;
|
|
11
|
+
password: string;
|
|
12
|
+
};
|
|
13
|
+
export type TurnDiscoveryResult = {
|
|
14
|
+
turnServerInfo?: TurnServerInfo;
|
|
15
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
16
|
+
};
|
package/dist/webinar/index.js
CHANGED
package/package.json
CHANGED
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
44
44
|
"@webex/jest-config-legacy": "0.0.0",
|
|
45
45
|
"@webex/legacy-tools": "0.0.0",
|
|
46
|
-
"@webex/plugin-meetings": "3.8.0-next.
|
|
46
|
+
"@webex/plugin-meetings": "3.8.0-next.32",
|
|
47
47
|
"@webex/plugin-rooms": "3.8.0-next.13",
|
|
48
48
|
"@webex/test-helper-chai": "3.8.0-next.11",
|
|
49
49
|
"@webex/test-helper-mocha": "3.8.0-next.11",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"@webex/internal-plugin-metrics": "3.8.0-next.11",
|
|
72
72
|
"@webex/internal-plugin-support": "3.8.0-next.13",
|
|
73
73
|
"@webex/internal-plugin-user": "3.8.0-next.11",
|
|
74
|
-
"@webex/internal-plugin-voicea": "3.8.0-next.
|
|
74
|
+
"@webex/internal-plugin-voicea": "3.8.0-next.32",
|
|
75
75
|
"@webex/media-helpers": "3.8.0-next.12",
|
|
76
76
|
"@webex/plugin-people": "3.8.0-next.13",
|
|
77
77
|
"@webex/plugin-rooms": "3.8.0-next.13",
|
|
@@ -92,5 +92,5 @@
|
|
|
92
92
|
"//": [
|
|
93
93
|
"TODO: upgrade jwt-decode when moving to node 18"
|
|
94
94
|
],
|
|
95
|
-
"version": "3.8.0-next.
|
|
95
|
+
"version": "3.8.0-next.32"
|
|
96
96
|
}
|
package/src/media/index.ts
CHANGED
|
@@ -21,6 +21,7 @@ import {MEDIA_TRACK_CONSTRAINT} from '../constants';
|
|
|
21
21
|
import Config from '../config';
|
|
22
22
|
import StaticConfig from '../common/config';
|
|
23
23
|
import BrowserDetection from '../common/browser-detection';
|
|
24
|
+
import {TurnServerInfo} from '../roap/types';
|
|
24
25
|
|
|
25
26
|
const {isBrowser} = BrowserDetection();
|
|
26
27
|
|
|
@@ -138,11 +139,7 @@ Media.createMediaConnection = (
|
|
|
138
139
|
remoteQualityLevel?: 'LOW' | 'MEDIUM' | 'HIGH';
|
|
139
140
|
enableRtx?: boolean;
|
|
140
141
|
enableExtmap?: boolean;
|
|
141
|
-
turnServerInfo?:
|
|
142
|
-
url: string;
|
|
143
|
-
username: string;
|
|
144
|
-
password: string;
|
|
145
|
-
};
|
|
142
|
+
turnServerInfo?: TurnServerInfo;
|
|
146
143
|
bundlePolicy?: BundlePolicy;
|
|
147
144
|
iceCandidatesTimeout?: number;
|
|
148
145
|
}
|
|
@@ -160,24 +157,11 @@ Media.createMediaConnection = (
|
|
|
160
157
|
|
|
161
158
|
const iceServers = [];
|
|
162
159
|
|
|
163
|
-
// we might not have any TURN server if TURN discovery failed or wasn't done or
|
|
164
|
-
|
|
165
|
-
if (turnServerInfo?.url) {
|
|
166
|
-
if (!isBrowser('firefox')) {
|
|
167
|
-
let bareTurnServer = turnServerInfo.url;
|
|
168
|
-
bareTurnServer = bareTurnServer.replace('turns:', 'turn:');
|
|
169
|
-
bareTurnServer = bareTurnServer.replace('443', '5004');
|
|
170
|
-
|
|
171
|
-
iceServers.push({
|
|
172
|
-
urls: bareTurnServer,
|
|
173
|
-
username: turnServerInfo.username || '',
|
|
174
|
-
credential: turnServerInfo.password || '',
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
|
|
160
|
+
// we might not have any TURN server if TURN discovery failed or wasn't done or we land on a video mesh node
|
|
161
|
+
if (turnServerInfo?.urls.length > 0) {
|
|
178
162
|
// TURN-TLS server
|
|
179
163
|
iceServers.push({
|
|
180
|
-
urls: turnServerInfo.
|
|
164
|
+
urls: turnServerInfo.urls,
|
|
181
165
|
username: turnServerInfo.username || '',
|
|
182
166
|
credential: turnServerInfo.password || '',
|
|
183
167
|
});
|
package/src/meeting/index.ts
CHANGED
|
@@ -60,11 +60,8 @@ import {
|
|
|
60
60
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
61
61
|
import EventsUtil from '../common/events/util';
|
|
62
62
|
import Trigger from '../common/events/trigger-proxy';
|
|
63
|
-
import Roap, {
|
|
64
|
-
|
|
65
|
-
type TurnServerInfo,
|
|
66
|
-
type TurnDiscoverySkipReason,
|
|
67
|
-
} from '../roap/index';
|
|
63
|
+
import Roap, {type TurnDiscoveryResult, type TurnDiscoverySkipReason} from '../roap/index';
|
|
64
|
+
import {type TurnServerInfo} from '../roap/types';
|
|
68
65
|
import Media, {type BundlePolicy} from '../media';
|
|
69
66
|
import MediaProperties from '../media/properties';
|
|
70
67
|
import MeetingStateMachine from './state';
|
|
@@ -3802,7 +3799,13 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
3802
3799
|
return Promise.reject(error);
|
|
3803
3800
|
}
|
|
3804
3801
|
|
|
3805
|
-
return this.brbState.enable(enabled, this.sendSlotManager)
|
|
3802
|
+
return this.brbState.enable(enabled, this.sendSlotManager).then(() => {
|
|
3803
|
+
if (this.audio && enabled) {
|
|
3804
|
+
// locus mutes the participant with brb enabled request,
|
|
3805
|
+
// so we need to explicitly update remote mute for correct logic flow
|
|
3806
|
+
this.audio.handleServerRemoteMuteUpdate(this, enabled);
|
|
3807
|
+
}
|
|
3808
|
+
});
|
|
3806
3809
|
}
|
|
3807
3810
|
|
|
3808
3811
|
/**
|
|
@@ -6870,7 +6873,10 @@ export default class Meeting extends StatelessWebexPlugin {
|
|
|
6870
6873
|
* @param {AddMediaOptions} [options] Options for enabling/disabling audio/video
|
|
6871
6874
|
* @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
|
|
6872
6875
|
*/
|
|
6873
|
-
private async createMediaConnection(
|
|
6876
|
+
private async createMediaConnection(
|
|
6877
|
+
turnServerInfo?: TurnServerInfo,
|
|
6878
|
+
bundlePolicy?: BundlePolicy
|
|
6879
|
+
) {
|
|
6874
6880
|
this.rtcMetrics = this.isMultistream
|
|
6875
6881
|
? // @ts-ignore
|
|
6876
6882
|
new RtcMetrics(this.webex, {meetingId: this.id}, this.correlationId)
|
package/src/meeting/muteState.ts
CHANGED
|
@@ -147,7 +147,6 @@ export class MuteState {
|
|
|
147
147
|
* @public
|
|
148
148
|
* @memberof MuteState
|
|
149
149
|
* @param {Object} [meeting] the meeting object
|
|
150
|
-
* @param {Boolean} [mute] true for muting, false for unmuting request
|
|
151
150
|
* @returns {void}
|
|
152
151
|
*/
|
|
153
152
|
public handleLocalStreamMuteStateChange(meeting?: any) {
|
|
@@ -350,7 +349,6 @@ export class MuteState {
|
|
|
350
349
|
* @param {Meeting} meeting
|
|
351
350
|
* @returns {void}
|
|
352
351
|
*/
|
|
353
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
354
352
|
private applyUnmuteAllowedToStream(meeting: any) {
|
|
355
353
|
if (this.type === AUDIO) {
|
|
356
354
|
meeting.mediaProperties.audioStream?.setUnmuteAllowed(this.state.server.unmuteAllowed);
|
|
@@ -591,9 +591,9 @@ export default class ReconnectionManager {
|
|
|
591
591
|
|
|
592
592
|
const iceServers = [];
|
|
593
593
|
|
|
594
|
-
if (turnServerResult.turnServerInfo?.
|
|
594
|
+
if (turnServerResult.turnServerInfo?.urls.length > 0) {
|
|
595
595
|
iceServers.push({
|
|
596
|
-
urls: turnServerResult.turnServerInfo.
|
|
596
|
+
urls: turnServerResult.turnServerInfo.urls,
|
|
597
597
|
username: turnServerResult.turnServerInfo.username || '',
|
|
598
598
|
credential: turnServerResult.turnServerInfo.password || '',
|
|
599
599
|
});
|
package/src/roap/index.ts
CHANGED
|
@@ -5,17 +5,13 @@ import {ROAP} from '../constants';
|
|
|
5
5
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
6
|
|
|
7
7
|
import RoapRequest from './request';
|
|
8
|
-
import TurnDiscovery
|
|
8
|
+
import TurnDiscovery from './turnDiscovery';
|
|
9
|
+
import {TurnDiscoveryResult} from './types';
|
|
9
10
|
import Meeting from '../meeting';
|
|
10
|
-
import MeetingUtil from '../meeting/util';
|
|
11
11
|
import Metrics from '../metrics';
|
|
12
12
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
13
13
|
|
|
14
|
-
export {
|
|
15
|
-
type TurnDiscoveryResult,
|
|
16
|
-
type TurnServerInfo,
|
|
17
|
-
type TurnDiscoverySkipReason,
|
|
18
|
-
} from './turnDiscovery';
|
|
14
|
+
export {type TurnDiscoveryResult, type TurnServerInfo, type TurnDiscoverySkipReason} from './types';
|
|
19
15
|
|
|
20
16
|
/**
|
|
21
17
|
* Roap options
|