@webex/plugin-meetings 2.60.1-next.16 → 2.60.1-next.18
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/constants.d.ts +1 -0
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/index.js +4 -1
- package/dist/locus-info/index.js.map +1 -1
- package/dist/meeting/index.js +27 -8
- package/dist/meeting/index.js.map +1 -1
- package/dist/meetings/index.d.ts +1 -1
- package/dist/meetings/index.js +6 -20
- package/dist/meetings/index.js.map +1 -1
- package/dist/reconnection-manager/index.js +22 -26
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +5 -1
- package/dist/statsAnalyzer/index.js +75 -88
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -23
- package/src/constants.ts +1 -0
- package/src/locus-info/index.ts +4 -1
- package/src/meeting/index.ts +25 -1
- package/src/meetings/index.ts +10 -23
- package/src/reconnection-manager/index.ts +11 -13
- package/src/statsAnalyzer/index.ts +131 -153
- package/test/integration/spec/journey.js +2 -2
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/locus-info/index.js +13 -6
- package/test/unit/spec/meeting/index.js +49 -1
- package/test/unit/spec/meetings/index.js +21 -0
- package/test/unit/spec/metrics/index.js +1 -2
- package/test/unit/spec/reconnection-manager/index.js +1 -11
- package/test/unit/spec/stats-analyzer/index.js +686 -493
|
@@ -496,67 +496,63 @@ var ReconnectionManager = exports.default = /*#__PURE__*/function () {
|
|
|
496
496
|
this.status = _constants.RECONNECTION.STATE.FAILURE;
|
|
497
497
|
throw _context3.t0;
|
|
498
498
|
case 19:
|
|
499
|
-
|
|
500
|
-
_context3.next = 30;
|
|
501
|
-
break;
|
|
502
|
-
}
|
|
503
|
-
_context3.prev = 20;
|
|
499
|
+
_context3.prev = 19;
|
|
504
500
|
_loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Updating meeting data from server.');
|
|
505
|
-
_context3.next =
|
|
501
|
+
_context3.next = 23;
|
|
506
502
|
return this.webex.meetings.syncMeetings({
|
|
507
503
|
keepOnlyLocusMeetings: false
|
|
508
504
|
});
|
|
509
|
-
case
|
|
510
|
-
_context3.next =
|
|
505
|
+
case 23:
|
|
506
|
+
_context3.next = 29;
|
|
511
507
|
break;
|
|
512
|
-
case
|
|
513
|
-
_context3.prev =
|
|
514
|
-
_context3.t1 = _context3["catch"](
|
|
508
|
+
case 25:
|
|
509
|
+
_context3.prev = 25;
|
|
510
|
+
_context3.t1 = _context3["catch"](19);
|
|
515
511
|
_loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.', _context3.t1);
|
|
516
512
|
throw new NeedsRetryError(_context3.t1);
|
|
517
|
-
case
|
|
513
|
+
case 29:
|
|
518
514
|
if (!(!this.meeting || !this.webex.meetings.getMeetingByType(_constants._ID_, this.meeting.id))) {
|
|
519
|
-
_context3.next =
|
|
515
|
+
_context3.next = 32;
|
|
520
516
|
break;
|
|
521
517
|
}
|
|
522
518
|
_loggerProxy.default.logger.info('ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.');
|
|
523
519
|
throw new Error('Unable to rejoin a meeting already ended or inactive.');
|
|
524
|
-
case
|
|
520
|
+
case 32:
|
|
525
521
|
_loggerProxy.default.logger.info("ReconnectionManager:index#executeReconnection --> Current state of meeting is ".concat(this.meeting.state));
|
|
526
522
|
|
|
527
523
|
// If the meeting state was left, no longer reconnect media
|
|
528
524
|
if (!(this.meeting.state === _constants._LEFT_)) {
|
|
529
|
-
_context3.next =
|
|
525
|
+
_context3.next = 37;
|
|
530
526
|
break;
|
|
531
527
|
}
|
|
532
528
|
if (!(this.meeting.type === _constants._CALL_)) {
|
|
533
|
-
_context3.next =
|
|
529
|
+
_context3.next = 36;
|
|
534
530
|
break;
|
|
535
531
|
}
|
|
536
532
|
throw new Error('Unable to rejoin a call in LEFT state.');
|
|
537
|
-
case
|
|
533
|
+
case 36:
|
|
538
534
|
throw new NeedsRejoinError({
|
|
539
535
|
wasSharing: wasSharing
|
|
540
536
|
});
|
|
541
|
-
case
|
|
542
|
-
_context3.prev =
|
|
543
|
-
_context3.next =
|
|
537
|
+
case 37:
|
|
538
|
+
_context3.prev = 37;
|
|
539
|
+
_context3.next = 40;
|
|
544
540
|
return this.reconnectMedia();
|
|
545
|
-
case
|
|
541
|
+
case 40:
|
|
546
542
|
media = _context3.sent;
|
|
547
543
|
_loggerProxy.default.logger.log('ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent');
|
|
548
544
|
return _context3.abrupt("return", media);
|
|
549
|
-
case
|
|
550
|
-
_context3.prev =
|
|
551
|
-
_context3.t2 = _context3["catch"](
|
|
545
|
+
case 45:
|
|
546
|
+
_context3.prev = 45;
|
|
547
|
+
_context3.t2 = _context3["catch"](37);
|
|
552
548
|
_loggerProxy.default.logger.error('ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer');
|
|
553
549
|
this.status = _constants.RECONNECTION.STATE.FAILURE;
|
|
554
550
|
throw _context3.t2;
|
|
555
|
-
case
|
|
551
|
+
case 50:
|
|
556
552
|
case "end":
|
|
557
553
|
return _context3.stop();
|
|
558
554
|
}
|
|
559
|
-
}, _callee3, this, [[8, 14], [
|
|
555
|
+
}, _callee3, this, [[8, 14], [19, 25], [37, 45]]);
|
|
560
556
|
}));
|
|
561
557
|
function executeReconnection(_x2) {
|
|
562
558
|
return _executeReconnection.apply(this, arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnectionInProgress","_metrics","_reconnection","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","NeedsRetryError","_Error","_inherits2","_super","_classCallCheck2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_super2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","_assertThisInitialized2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_callee$","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","setStatus","validate","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","_reconnect","_callee2","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","media","_args2","_callee2$","_context2","length","id","t0","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","t1","executeReconnection","sent","abrupt","t2","reconnect","message","payload","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","_callee3$","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","credentials","isUnverifiedGuest","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","_x2","_rejoinMeeting","_callee4","_args4","_callee4$","_context4","join","rejoin","MEETING_REJOIN","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","_reconnectMedia","_callee5","turnServerResult","iceServers","_callee5$","_context5","roap","doTurnDiscovery","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","_reconnectMercuryWebSocket","_callee6","_callee6$","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\nimport ReconnectionError from '../common/errors/reconnection';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n tryCount: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * Sets the reconnection status\n *\n * @public\n * @param {RECONNECTION_STATE} status\n * @memberof ReconnectionManager\n * @returns {undefined}\n */\n public setStatus(status: RECONNECTION_STATE) {\n this.status = status;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability();\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n const media = await this.executeReconnection({networkDisconnect});\n\n return media;\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\n // send call aborted event with catogery as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n\n throw reconnectError;\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n if (!this.webex.credentials.isUnverifiedGuest) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_loggerProxy","_interopRequireDefault","require","_triggerProxy","_constants","_constants2","_reconnectionInProgress","_metrics","_reconnection","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","NeedsRetryError","_Error","_inherits2","_super","_classCallCheck2","_createClass2","_wrapNativeSuper2","Error","NeedsRejoinError","_Error2","_super2","_ref","_this","wasSharing","_ref$error","error","_defineProperty2","_assertThisInitialized2","ReconnectionManager","exports","meeting","iceState","disconnected","resolve","timer","undefined","timeoutDuration","config","reconnection","iceReconnectionTimeout","status","RECONNECTION","STATE","DEFAULT_STATUS","tryCount","DEFAULT_TRY_COUNT","webex","maxRejoinAttempts","rejoinAttempts","autoRejoinEnabled","autoRejoin","reset","key","value","resetReconnectionTimer","clearTimeout","iceReconnected","LoggerProxy","logger","log","waitForIceReconnect","_this2","_promise","reject","setTimeout","concat","cleanUp","_stopLocalShareStream","_asyncToGenerator2","_regenerator","mark","_callee","reason","wrap","_callee$","_context","prev","next","unpublishStreams","mediaProperties","shareVideoStream","shareAudioStream","Trigger","trigger","file","function","EVENT_TRIGGERS","MEETING_STOPPED_SHARING_LOCAL","stop","stopLocalShareStream","_x","isReconnectInProgress","IN_PROGRESS","setStatus","validate","enabled","COMPLETE","info","ReconnectInProgress","ReconnectionError","_reconnect","_callee2","_ref2","_ref2$networkDisconne","networkDisconnect","_ref2$networkRetry","networkRetry","media","_args2","_callee2$","_context2","length","id","t0","internal","newMetrics","submitClientEvent","name","options","meetingId","meetings","startReachability","t1","executeReconnection","sent","abrupt","t2","reconnect","message","payload","errors","category","errorCode","fatal","shownToUser","rejoinMeeting","_executeReconnection","_callee3","_ref3","_ref3$networkDisconne","_callee3$","_context3","shareStatus","SHARE_STATUS","LOCAL_SHARE_ACTIVE","SHARE_STOPPED_REASON","MEDIA_RECONNECTION","reconnectMercuryWebSocket","device","url","FAILURE","syncMeetings","keepOnlyLocusMeetings","getMeetingByType","_ID_","state","_LEFT_","type","_CALL_","reconnectMedia","_x2","_rejoinMeeting","_callee4","_args4","_callee4$","_context4","join","rejoin","MEETING_REJOIN","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","MEETING_MAX_REJOIN_FAILURE","locus_id","locusUrl","split","pop","stack","_reconnectMedia","_callee5","turnServerResult","iceServers","_callee5$","_context5","roap","doTurnDiscovery","turnServerInfo","push","urls","username","credential","password","webrtcMediaConnection","isMultistream","_values","mediaRequestManagers","forEach","mediaRequestManager","clearPreviousRequests","commit","_reconnectMercuryWebSocket","_callee6","_callee6$","_context6","mercury","connected","disconnect","connect"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable no-warning-comments */\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport Trigger from '../common/events/trigger-proxy';\nimport {\n EVENT_TRIGGERS,\n RECONNECTION,\n SHARE_STATUS,\n SHARE_STOPPED_REASON,\n _CALL_,\n _LEFT_,\n _ID_,\n RECONNECTION_STATE,\n} from '../constants';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport ReconnectInProgress from '../common/errors/reconnection-in-progress';\nimport Metrics from '../metrics';\nimport Meeting from '../meeting';\nimport {MediaRequestManager} from '../multistream/mediaRequestManager';\nimport ReconnectionError from '../common/errors/reconnection';\n\n/**\n * Used to indicate that the reconnect logic needs to be retried.\n *\n * @class NeedsRetryError\n * @extends {Error}\n */\nclass NeedsRetryError extends Error {}\n\n/**\n * Used to indicate that the meeting needs to be rejoined, not just media reconnected\n *\n * @class NeedsRejoinError\n * @extends {Error}\n */\nclass NeedsRejoinError extends Error {\n wasSharing: any;\n\n /**\n * Creates an instance of NeedsRejoinError.\n * @param {Object} params\n * @param {boolean} params.wasSharing\n * @param {Error} params.error\n * @memberof NeedsRejoinError\n */\n constructor({\n wasSharing,\n error = new Error('Meeting needs to be rejoined'),\n }: {\n wasSharing?: boolean;\n error?: Error;\n }) {\n // @ts-ignore\n super(error);\n\n this.wasSharing = wasSharing;\n }\n}\n\n/**\n * @export\n * @class ReconnectionManager\n */\nexport default class ReconnectionManager {\n autoRejoinEnabled: any;\n iceState: any;\n maxRejoinAttempts: any;\n meeting: any;\n rejoinAttempts: any;\n shareStatus: any;\n status: any;\n tryCount: any;\n webex: any;\n /**\n * @param {Meeting} meeting\n */\n constructor(meeting: Meeting) {\n /**\n * Stores ICE reconnection state data.\n *\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n this.iceState = {\n disconnected: false,\n resolve: () => {},\n timer: undefined,\n // @ts-ignore\n timeoutDuration: meeting.config.reconnection.iceReconnectionTimeout,\n };\n\n /**\n * @instance\n * @type {RECONNECTION_STATE}\n * @private\n * @memberof ReconnectionManager\n */\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n /**\n * @instance\n * @type {Number}\n * @private\n * @memberof ReconnectionManager\n */\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO : change this logic to not save the meeting instance\n // It gets complicated when meeting ends on remote side , We have a old meeting instance which is not up to date\n // @ts-ignore\n this.webex = meeting.webex;\n /**\n * @instance\n * @type {Meeting}\n * @private\n * @memberof ReconnectionManager\n */\n // TODO: try removing the circular dependency for meeting and reconnection manager\n // try moving this to meetings collection\n this.meeting = meeting;\n\n // @ts-ignore\n this.maxRejoinAttempts = meeting.config.reconnection.maxRejoinAttempts;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n // @ts-ignore\n this.autoRejoinEnabled = meeting.config.reconnection.autoRejoin;\n\n // Make sure reconnection state is in default\n this.reset();\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {void}\n */\n resetReconnectionTimer() {\n this.iceState.resolve();\n this.iceState.resolve = () => {};\n\n if (this.iceState.timer) {\n clearTimeout(this.iceState.timer);\n delete this.iceState.timer;\n }\n }\n\n /**\n * Sets the iceState to connected and clears any disconnect timeouts and\n * related timeout data within the iceState.\n *\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public iceReconnected() {\n if (this.iceState.disconnected) {\n LoggerProxy.logger.log('ReconnectionManager:index#iceReconnected --> ice has reconnected');\n\n this.resetReconnectionTimer();\n\n this.iceState.disconnected = false;\n }\n }\n\n /**\n * Set the iceState to disconnected and generates a timeout that waits for the\n * iceState to reconnect and then resolves. If the ice state is already\n * processing a reconnect, it immediately resolves. Rejects if the timeout\n * duration is reached.\n *\n * @returns {Promise<undefined>}\n * @public\n * @memberof ReconnectionManager\n */\n public waitForIceReconnect() {\n if (!this.iceState.disconnected) {\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#waitForIceReconnect --> waiting for ice reconnect'\n );\n\n this.iceState.disconnected = true;\n\n return new Promise<void>((resolve, reject) => {\n this.iceState.timer = setTimeout(() => {\n if (this.iceState.disconnected === false) {\n resolve();\n } else {\n this.iceState.disconnected = false;\n reject(\n new Error(`ice reconnection did not occur in ${this.iceState.timeoutDuration}ms`)\n );\n }\n }, this.iceState.timeoutDuration);\n\n this.iceState.resolve = resolve;\n });\n }\n\n // return a resolved promise to prevent multiple catch executions of reconnect\n return Promise.resolve();\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public reset() {\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n this.tryCount = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n this.rejoinAttempts = RECONNECTION.STATE.DEFAULT_TRY_COUNT;\n }\n\n /**\n * @returns {undefined}\n * @public\n * @memberof ReconnectionManager\n */\n public cleanUp() {\n this.reset();\n }\n\n /**\n * Stop the local share stream.\n *\n * @param {string} reason a {@link SHARE_STOPPED_REASON}\n * @returns {undefined}\n * @private\n * @memberof ReconnectionManager\n */\n private async stopLocalShareStream(reason: string) {\n await this.meeting.unpublishStreams([\n this.meeting.mediaProperties.shareVideoStream,\n this.meeting.mediaProperties.shareAudioStream,\n ]);\n Trigger.trigger(\n this.meeting,\n {\n file: 'reconnection-manager/index',\n function: 'stopLocalShareStream',\n },\n EVENT_TRIGGERS.MEETING_STOPPED_SHARING_LOCAL,\n {\n reason,\n }\n );\n }\n\n /**\n * @public\n * @memberof ReconnectionManager\n * @returns {Boolean} true if reconnection operation is in progress\n */\n isReconnectInProgress() {\n return this.status === RECONNECTION.STATE.IN_PROGRESS;\n }\n\n /**\n * Sets the reconnection status\n *\n * @public\n * @param {RECONNECTION_STATE} status\n * @memberof ReconnectionManager\n * @returns {undefined}\n */\n public setStatus(status: RECONNECTION_STATE) {\n this.status = status;\n }\n\n /**\n * @returns {Boolean}\n * @throws {ReconnectionError}\n * @private\n * @memberof ReconnectionManager\n */\n private validate() {\n if (this.meeting.config.reconnection.enabled) {\n if (\n this.status === RECONNECTION.STATE.DEFAULT_STATUS ||\n this.status === RECONNECTION.STATE.COMPLETE\n ) {\n return true;\n }\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#validate --> Reconnection already in progress.'\n );\n\n throw new ReconnectInProgress('Reconnection already in progress.');\n }\n\n LoggerProxy.logger.info('ReconnectionManager:index#validate --> Reconnection is not enabled.');\n\n throw new ReconnectionError('Reconnection is not enabled.');\n }\n\n /**\n * Initiates a media reconnect for the active meeting\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @param {boolean} [reconnectOptions.networkRetry=false] indicates if we are retrying the reconnect\n * @returns {Promise}\n * @public\n * @memberof ReconnectionManager\n */\n public async reconnect({\n networkDisconnect = false,\n networkRetry = false,\n }: {\n networkDisconnect?: boolean;\n networkRetry?: boolean;\n } = {}) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#reconnect --> Reconnection start for meeting ${this.meeting.id}.`\n );\n // First, validate that we can reconnect, if not, it will throw an error\n try {\n this.validate();\n } catch (error) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection unable to begin.',\n error\n );\n throw error;\n }\n\n if (!networkRetry) {\n // Only log START metrics on the initial reconnect\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect start metric.'\n );\n\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.media.reconnecting',\n options: {\n meetingId: this.meeting.id,\n },\n });\n }\n\n try {\n await this.webex.meetings.startReachability();\n } catch (err) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reachability failed, continuing with reconnection attempt, err: ',\n err\n );\n }\n\n try {\n const media = await this.executeReconnection({networkDisconnect});\n\n return media;\n } catch (reconnectError) {\n if (reconnectError instanceof NeedsRetryError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Reconnection not successful, retrying.'\n );\n // Reset our reconnect status since we are looping back to the beginning\n this.status = RECONNECTION.STATE.DEFAULT_STATUS;\n\n // This is a network retry, so we should not log START metrics again\n return this.reconnect({networkDisconnect: true, networkRetry: true});\n }\n\n // Reconnect has failed\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnect --> Reconnection failed.',\n reconnectError.message\n );\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnect --> Sending reconnect abort metric.'\n );\n\n // send call aborted event with catogery as expected as we are trying to rejoin\n // @ts-ignore\n this.webex.internal.newMetrics.submitClientEvent({\n name: 'client.call.aborted',\n payload: {\n errors: [\n {\n category: 'expected',\n errorCode: 2008,\n fatal: true,\n name: 'media-engine',\n shownToUser: false,\n },\n ],\n },\n options: {\n meetingId: this.meeting.id,\n },\n });\n\n if (reconnectError instanceof NeedsRejoinError && this.autoRejoinEnabled) {\n return this.rejoinMeeting(reconnectError.wasSharing);\n }\n\n throw reconnectError;\n }\n }\n\n /**\n * @param {Object} reconnectOptions\n * @param {boolean} [reconnectOptions.networkDisconnect=false] indicates if a network disconnect event happened\n * @returns {Promise}\n * @throws {NeedsRetryError}\n * @private\n * @memberof ReconnectionManager\n */\n private async executeReconnection({networkDisconnect = false}: {networkDisconnect?: boolean}) {\n this.status = RECONNECTION.STATE.IN_PROGRESS;\n\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Attempting to reconnect to meeting.'\n );\n\n const wasSharing = this.meeting.shareStatus === SHARE_STATUS.LOCAL_SHARE_ACTIVE;\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEDIA_RECONNECTION);\n }\n\n if (networkDisconnect) {\n try {\n await this.reconnectMercuryWebSocket();\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Websocket reconnected.',\n this.webex.internal.device.url\n );\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> Unable to reconnect to websocket, giving up.'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n throw error;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Updating meeting data from server.'\n );\n await this.webex.meetings.syncMeetings({keepOnlyLocusMeetings: false});\n } catch (syncError) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Unable to sync meetings, reconnecting.',\n syncError\n );\n throw new NeedsRetryError(syncError);\n }\n\n // TODO: try to improve this logic as the reconnection manager saves the instance of deleted meeting object\n // So that on rejoin it known what parametrs it was using\n if (!this.meeting || !this.webex.meetings.getMeetingByType(_ID_, this.meeting.id)) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#executeReconnection --> Meeting got deleted due to inactivity or ended remotely.'\n );\n\n throw new Error('Unable to rejoin a meeting already ended or inactive.');\n }\n\n LoggerProxy.logger.info(\n `ReconnectionManager:index#executeReconnection --> Current state of meeting is ${this.meeting.state}`\n );\n\n // If the meeting state was left, no longer reconnect media\n if (this.meeting.state === _LEFT_) {\n if (this.meeting.type === _CALL_) {\n throw new Error('Unable to rejoin a call in LEFT state.');\n }\n\n throw new NeedsRejoinError({wasSharing});\n }\n\n try {\n const media = await this.reconnectMedia();\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#executeReconnection --> webRTC media connection renewed and local sdp offer sent'\n );\n\n return media;\n } catch (error) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#executeReconnection --> failed to renew webRTC media connection or initiate offer'\n );\n this.status = RECONNECTION.STATE.FAILURE;\n\n throw error;\n }\n }\n\n /**\n * Rejoins a meeting after detecting the member was in a LEFT state\n *\n * @async\n * @param {boolean} wasSharing\n * @returns {Promise}\n */\n async rejoinMeeting(wasSharing = false) {\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#rejoinMeeting --> attemping meeting rejoin'\n );\n\n await this.meeting.join({rejoin: true});\n LoggerProxy.logger.info('ReconnectionManager:index#rejoinMeeting --> meeting rejoined');\n\n if (wasSharing) {\n await this.stopLocalShareStream(SHARE_STOPPED_REASON.MEETING_REJOIN);\n }\n } catch (joinError) {\n this.rejoinAttempts += 1;\n if (this.rejoinAttempts <= this.maxRejoinAttempts) {\n LoggerProxy.logger.info(\n `ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting, attempt #${this.rejoinAttempts}, retrying.`,\n joinError\n );\n this.rejoinMeeting();\n } else {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to rejoin meeting after max attempts.',\n joinError\n );\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.MEETING_MAX_REJOIN_FAILURE, {\n locus_id: this.meeting.locusUrl.split('/').pop(),\n reason: joinError.message,\n stack: joinError.stack,\n });\n this.status = RECONNECTION.STATE.FAILURE;\n throw joinError;\n }\n }\n\n try {\n await this.reconnectMedia();\n } catch (mediaError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#rejoinMeeting --> Unable to reestablish media after rejoining.',\n mediaError\n );\n throw mediaError;\n }\n }\n\n /**\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n async reconnectMedia() {\n LoggerProxy.logger.log('ReconnectionManager:index#reconnectMedia --> do turn discovery');\n\n // do the TURN server discovery again and ignore reachability results since the TURN server might change\n const turnServerResult = await this.meeting.roap.doTurnDiscovery(this.meeting, true, true);\n\n const iceServers = [];\n\n if (turnServerResult.turnServerInfo) {\n iceServers.push({\n urls: turnServerResult.turnServerInfo.url,\n username: turnServerResult.turnServerInfo.username || '',\n credential: turnServerResult.turnServerInfo.password || '',\n });\n }\n\n LoggerProxy.logger.log(\n 'ReconnectionManager:index#reconnectMedia --> renew webRTC media connection and send local sdp offer'\n );\n\n await this.meeting.mediaProperties.webrtcMediaConnection.reconnect(iceServers);\n\n // resend media requests\n if (this.meeting.isMultistream) {\n Object.values(this.meeting.mediaRequestManagers).forEach(\n (mediaRequestManager: MediaRequestManager) => {\n mediaRequestManager.clearPreviousRequests();\n mediaRequestManager.commit();\n }\n );\n }\n }\n\n /**\n * Attempt to Reconnect Mercury Websocket\n * @returns {Promise}\n * @private\n * @memberof ReconnectionManager\n */\n private async reconnectMercuryWebSocket() {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Reconnecting websocket.'\n );\n // First, attempt to disconnect if we think we are already connected.\n if (this.webex.internal.mercury.connected) {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Disconnecting existing websocket.'\n );\n try {\n await this.webex.internal.mercury.disconnect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket disconnected successfully.'\n );\n } catch (disconnectError) {\n // If we can't disconnect, the sdk is in such a bad state that reconnecting is not going to happen.\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to disconnect from websocket, giving up.',\n disconnectError\n );\n throw disconnectError;\n }\n }\n\n try {\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Connecting websocket.'\n );\n await this.webex.internal.mercury.connect();\n LoggerProxy.logger.info(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Websocket connected successfully.'\n );\n } catch (connectError) {\n LoggerProxy.logger.error(\n 'ReconnectionManager:index#reconnectMercuryWebSocket --> Unable to connect to websocket, giving up.',\n connectError\n );\n\n throw connectError;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -9,6 +9,10 @@ export declare const EVENTS: {
|
|
|
9
9
|
REMOTE_MEDIA_STOPPED: string;
|
|
10
10
|
};
|
|
11
11
|
type ReceiveSlotCallback = (csi: number) => ReceiveSlot | undefined;
|
|
12
|
+
type MediaStatus = {
|
|
13
|
+
actual?: any;
|
|
14
|
+
expected?: any;
|
|
15
|
+
};
|
|
12
16
|
/**
|
|
13
17
|
* Stats Analyzer class that will emit events based on detected quality
|
|
14
18
|
*
|
|
@@ -59,7 +63,7 @@ export declare class StatsAnalyzer extends EventsScope {
|
|
|
59
63
|
* @memberof StatsAnalyzer
|
|
60
64
|
* @returns {void}
|
|
61
65
|
*/
|
|
62
|
-
updateMediaStatus(status:
|
|
66
|
+
updateMediaStatus(status: MediaStatus): void;
|
|
63
67
|
/**
|
|
64
68
|
* captures MQA data from media connection
|
|
65
69
|
*
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
|
|
4
|
+
var _Object$keys2 = require("@babel/runtime-corejs2/core-js/object/keys");
|
|
5
|
+
var _Object$getOwnPropertySymbols = require("@babel/runtime-corejs2/core-js/object/get-own-property-symbols");
|
|
6
|
+
var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
|
|
7
|
+
var _Object$getOwnPropertyDescriptors = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptors");
|
|
8
|
+
var _Object$defineProperties = require("@babel/runtime-corejs2/core-js/object/define-properties");
|
|
4
9
|
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
5
10
|
var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
|
|
6
11
|
_Object$defineProperty(exports, "__esModule", {
|
|
@@ -25,6 +30,8 @@ var _config = require("../mediaQualityMetrics/config");
|
|
|
25
30
|
var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
|
|
26
31
|
var _global = _interopRequireDefault(require("./global"));
|
|
27
32
|
var _mqaUtil = require("./mqaUtil");
|
|
33
|
+
function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
34
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
28
35
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
29
36
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } /* eslint-disable prefer-destructuring */
|
|
30
37
|
var EVENTS = exports.EVENTS = {
|
|
@@ -280,7 +287,11 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
|
|
|
280
287
|
}, {
|
|
281
288
|
key: "updateMediaStatus",
|
|
282
289
|
value: function updateMediaStatus(status) {
|
|
283
|
-
|
|
290
|
+
var _this$meetingMediaSta, _this$meetingMediaSta2;
|
|
291
|
+
this.meetingMediaStatus = {
|
|
292
|
+
actual: _objectSpread(_objectSpread({}, (_this$meetingMediaSta = this.meetingMediaStatus) === null || _this$meetingMediaSta === void 0 ? void 0 : _this$meetingMediaSta.actual), status === null || status === void 0 ? void 0 : status.actual),
|
|
293
|
+
expected: _objectSpread(_objectSpread({}, (_this$meetingMediaSta2 = this.meetingMediaStatus) === null || _this$meetingMediaSta2 === void 0 ? void 0 : _this$meetingMediaSta2.expected), status === null || status === void 0 ? void 0 : status.expected)
|
|
294
|
+
};
|
|
284
295
|
}
|
|
285
296
|
|
|
286
297
|
/**
|
|
@@ -710,122 +721,77 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
|
|
|
710
721
|
return prev + (((_this7$lastStatsResul = _this7.lastStatsResults[cur]) === null || _this7$lastStatsResul === void 0 ? void 0 : _this7$lastStatsResul.recv[value]) || 0);
|
|
711
722
|
}, 0);
|
|
712
723
|
};
|
|
713
|
-
|
|
724
|
+
|
|
725
|
+
// Audio Transmit
|
|
726
|
+
if (this.lastStatsResults['audio-send']) {
|
|
714
727
|
// compare audio stats sent
|
|
715
728
|
// NOTE: relies on there being only one sender.
|
|
716
729
|
var currentStats = this.statsResults['audio-send'].send;
|
|
717
730
|
var previousStats = this.lastStatsResults['audio-send'].send;
|
|
718
|
-
if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
731
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
719
732
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent", currentStats.totalPacketsSent);
|
|
720
733
|
} else {
|
|
721
|
-
if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
|
|
734
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
|
|
722
735
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present", currentStats.totalAudioEnergy);
|
|
723
736
|
}
|
|
724
|
-
if (currentStats.audioLevel === 0) {
|
|
737
|
+
if (this.meetingMediaStatus.expected.sendAudio && currentStats.audioLevel === 0) {
|
|
725
738
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
|
|
726
739
|
}
|
|
727
740
|
}
|
|
728
741
|
this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
|
|
729
742
|
}
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
} else if (currentSamplesReceived === previousSamplesReceived || currentSamplesReceived === 0) {
|
|
739
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio samples received", currentSamplesReceived);
|
|
740
|
-
}
|
|
741
|
-
this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);
|
|
742
|
-
}
|
|
743
|
-
if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {
|
|
743
|
+
|
|
744
|
+
// Audio Receive
|
|
745
|
+
var currentAudioPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
|
|
746
|
+
var previousAudioPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
|
|
747
|
+
this.emitStartStopEvents('audio', previousAudioPacketsReceived, currentAudioPacketsReceived, false);
|
|
748
|
+
|
|
749
|
+
// Video Transmit
|
|
750
|
+
if (this.lastStatsResults['video-send']) {
|
|
744
751
|
// compare video stats sent
|
|
745
752
|
var _currentStats = this.statsResults['video-send'].send;
|
|
746
753
|
var _previousStats = this.lastStatsResults['video-send'].send;
|
|
747
|
-
if (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0) {
|
|
754
|
+
if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0)) {
|
|
748
755
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent", _currentStats.totalPacketsSent);
|
|
749
756
|
} else {
|
|
750
|
-
if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
|
|
757
|
+
if (this.meetingMediaStatus.expected.sendVideo && (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0)) {
|
|
751
758
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded", _currentStats.framesEncoded);
|
|
752
759
|
}
|
|
753
|
-
if (this.statsResults['video-send'].send.framesSent === this.lastStatsResults['video-send'].send.framesSent || this.statsResults['video-send'].send.framesSent === 0) {
|
|
760
|
+
if (this.meetingMediaStatus.expected.sendVideo && (this.statsResults['video-send'].send.framesSent === this.lastStatsResults['video-send'].send.framesSent || this.statsResults['video-send'].send.framesSent === 0)) {
|
|
754
761
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent", this.statsResults['video-send'].send.framesSent);
|
|
755
762
|
}
|
|
756
763
|
}
|
|
757
764
|
this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
|
|
758
765
|
}
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
var currentFramesDropped = getCurrentStatsTotals('video-recv', 'framesDropped');
|
|
768
|
-
var previousFramesDropped = getPreviousStatsTotals('video-recv', 'framesDropped');
|
|
769
|
-
if (_currentPacketsReceived === _previousPacketsReceived || _currentPacketsReceived === 0) {
|
|
770
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received", _currentPacketsReceived);
|
|
771
|
-
} else {
|
|
772
|
-
if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
|
|
773
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames received", currentFramesReceived);
|
|
774
|
-
}
|
|
775
|
-
if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
|
|
776
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded", currentFramesDecoded);
|
|
777
|
-
}
|
|
778
|
-
if (currentFramesDropped - previousFramesDropped > 10) {
|
|
779
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped", currentFramesDropped - previousFramesDropped);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
|
|
783
|
-
}
|
|
784
|
-
if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
|
|
766
|
+
|
|
767
|
+
// Video Receive
|
|
768
|
+
var currentVideoFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
|
|
769
|
+
var previousVideoFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
|
|
770
|
+
this.emitStartStopEvents('video', previousVideoFramesDecoded, currentVideoFramesDecoded, false);
|
|
771
|
+
|
|
772
|
+
// Share Transmit
|
|
773
|
+
if (this.lastStatsResults['video-share-send']) {
|
|
785
774
|
// compare share stats sent
|
|
786
775
|
|
|
787
776
|
var _currentStats2 = this.statsResults['video-share-send'].send;
|
|
788
777
|
var _previousStats2 = this.lastStatsResults['video-share-send'].send;
|
|
789
|
-
if (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0) {
|
|
778
|
+
if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0)) {
|
|
790
779
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent", _currentStats2.totalPacketsSent);
|
|
791
780
|
} else {
|
|
792
|
-
if (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0) {
|
|
781
|
+
if (this.meetingMediaStatus.expected.sendShare && (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0)) {
|
|
793
782
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded", _currentStats2.framesEncoded);
|
|
794
783
|
}
|
|
795
|
-
if (this.statsResults['video-share-send'].send.framesSent === this.lastStatsResults['video-share-send'].send.framesSent || this.statsResults['video-share-send'].send.framesSent === 0) {
|
|
784
|
+
if (this.meetingMediaStatus.expected.sendShare && (this.statsResults['video-share-send'].send.framesSent === this.lastStatsResults['video-share-send'].send.framesSent || this.statsResults['video-share-send'].send.framesSent === 0)) {
|
|
796
785
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent", this.statsResults['video-share-send'].send.framesSent);
|
|
797
786
|
}
|
|
798
787
|
}
|
|
788
|
+
this.emitStartStopEvents('share', _previousStats2.framesSent, _currentStats2.framesSent, true);
|
|
799
789
|
}
|
|
800
|
-
if (this.meetingMediaStatus.expected.sendShare) {
|
|
801
|
-
// TODO:need to check receive share value
|
|
802
|
-
// compare share stats received
|
|
803
|
-
var _currentPacketsReceived2 = getCurrentStatsTotals('video-share-recv', 'totalPacketsReceived');
|
|
804
|
-
var _previousPacketsReceived2 = getPreviousStatsTotals('video-share-recv', 'totalPacketsReceived');
|
|
805
|
-
var _currentFramesReceived = getCurrentStatsTotals('video-share-recv', 'framesReceived');
|
|
806
|
-
var _previousFramesReceived = getPreviousStatsTotals('video-share-recv', 'framesReceived');
|
|
807
|
-
var _currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
|
|
808
|
-
var _previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
|
|
809
|
-
var _currentFramesDropped = getCurrentStatsTotals('video-share-recv', 'framesDropped');
|
|
810
|
-
var _previousFramesDropped = getPreviousStatsTotals('video-share-recv', 'framesDropped');
|
|
811
|
-
if (_currentPacketsReceived2 === _previousPacketsReceived2 || _currentPacketsReceived2 === 0) {
|
|
812
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received", _currentPacketsReceived2);
|
|
813
|
-
} else {
|
|
814
|
-
if (_currentFramesReceived === _previousFramesReceived || _currentFramesReceived === 0) {
|
|
815
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames received", _currentFramesReceived);
|
|
816
|
-
}
|
|
817
|
-
if (_currentFramesDecoded === _previousFramesDecoded || _currentFramesDecoded === 0) {
|
|
818
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded", _currentFramesDecoded);
|
|
819
|
-
}
|
|
820
|
-
if (_currentFramesDropped - _previousFramesDropped > 10) {
|
|
821
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped", _currentFramesDropped - _previousFramesDropped);
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
790
|
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
791
|
+
// Share receive
|
|
792
|
+
var currentShareFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
|
|
793
|
+
var previousShareFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
|
|
794
|
+
this.emitStartStopEvents('share', previousShareFramesDecoded, currentShareFramesDecoded, false);
|
|
829
795
|
}
|
|
830
796
|
}
|
|
831
797
|
|
|
@@ -953,11 +919,6 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
|
|
|
953
919
|
var receiveSlot = this.receiveSlotCallback(result.ssrc);
|
|
954
920
|
var sourceState = receiveSlot === null || receiveSlot === void 0 ? void 0 : receiveSlot.sourceState;
|
|
955
921
|
var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
|
|
956
|
-
if (result.frameWidth && result.frameHeight) {
|
|
957
|
-
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
958
|
-
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
959
|
-
this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
960
|
-
}
|
|
961
922
|
var bytes = result.bytesReceived - this.statsResults[mediaType][sendrecvType].totalBytesReceived;
|
|
962
923
|
kilobytes = bytes / 1024;
|
|
963
924
|
this.statsResults[mediaType][sendrecvType].availableBandwidth = kilobytes.toFixed(1);
|
|
@@ -965,19 +926,44 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
|
|
|
965
926
|
if (currentPacketsLost < 0) {
|
|
966
927
|
currentPacketsLost = 0;
|
|
967
928
|
}
|
|
968
|
-
var
|
|
929
|
+
var packetsReceivedDiff = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
|
|
969
930
|
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
970
|
-
if (
|
|
931
|
+
if (packetsReceivedDiff === 0) {
|
|
971
932
|
if (receiveSlot && sourceState === 'live') {
|
|
972
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ".concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
|
|
933
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
if (mediaType.startsWith('video') || mediaType.startsWith('share')) {
|
|
937
|
+
var videoFramesReceivedDiff = result.framesReceived - this.statsResults[mediaType][sendrecvType].framesReceived;
|
|
938
|
+
if (videoFramesReceivedDiff === 0) {
|
|
939
|
+
if (receiveSlot && sourceState === 'live') {
|
|
940
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames received for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames received on slot: "), result.framesReceived);
|
|
941
|
+
}
|
|
942
|
+
}
|
|
943
|
+
var videoFramesDecodedDiff = result.framesDecoded - this.statsResults[mediaType][sendrecvType].framesDecoded;
|
|
944
|
+
if (videoFramesDecodedDiff === 0) {
|
|
945
|
+
if (receiveSlot && sourceState === 'live') {
|
|
946
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No frames decoded for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames decoded on slot: "), result.framesDecoded);
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
var videoFramesDroppedDiff = result.framesDropped - this.statsResults[mediaType][sendrecvType].framesDropped;
|
|
950
|
+
if (videoFramesDroppedDiff > 10) {
|
|
951
|
+
if (receiveSlot && sourceState === 'live') {
|
|
952
|
+
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Frames dropped for mediaType: ".concat(mediaType, ", receive slot ").concat(idAndCsi, ". Total frames dropped on slot: "), result.framesDropped);
|
|
953
|
+
}
|
|
973
954
|
}
|
|
974
955
|
}
|
|
975
956
|
|
|
976
957
|
// Check the over all packet Lost ratio
|
|
977
|
-
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (
|
|
958
|
+
this.statsResults[mediaType][sendrecvType].currentPacketLossRatio = currentPacketsLost > 0 ? currentPacketsLost / (packetsReceivedDiff + currentPacketsLost) : 0;
|
|
978
959
|
if (this.statsResults[mediaType][sendrecvType].currentPacketLossRatio > 3) {
|
|
979
960
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> Packets getting lost from the receiver with slot ".concat(idAndCsi), this.statsResults[mediaType][sendrecvType].currentPacketLossRatio);
|
|
980
961
|
}
|
|
962
|
+
if (result.frameWidth && result.frameHeight) {
|
|
963
|
+
this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
|
|
964
|
+
this.statsResults[mediaType][sendrecvType].height = result.frameHeight;
|
|
965
|
+
this.statsResults[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
966
|
+
}
|
|
981
967
|
|
|
982
968
|
// TODO: check the packet loss value is negative values here
|
|
983
969
|
|
|
@@ -993,6 +979,7 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
|
|
|
993
979
|
this.statsResults[mediaType][sendrecvType].totalPliCount = result.pliCount;
|
|
994
980
|
this.statsResults[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
995
981
|
this.statsResults[mediaType][sendrecvType].keyFramesDecoded = result.keyFramesDecoded;
|
|
982
|
+
this.statsResults[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
996
983
|
this.statsResults[mediaType][sendrecvType].decoderImplementation = result.decoderImplementation;
|
|
997
984
|
this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
|
|
998
985
|
this.statsResults[mediaType][sendrecvType].fecPacketsDiscarded = result.fecPacketsDiscarded;
|