feat(rtcstats): report pc connection failure (#12560)
* report pc connection failure * typos * code review / update rtcstats * check for undefined APP
This commit is contained in:
parent
b11e14ea34
commit
94ec2c720d
|
@ -1936,6 +1936,27 @@ class API {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notify the external application that a PeerConnection lost connectivity. This event is fired only if
|
||||||
|
* a PC `failed` but connectivity to the rtcstats server is still maintained signaling that there is a
|
||||||
|
* problem establishing a link between the app and the JVB server or the remote peer in case of P2P.
|
||||||
|
* Will only fire if rtcstats is enabled.
|
||||||
|
*
|
||||||
|
* @param {boolean} isP2P - Type of PC.
|
||||||
|
* @param {boolean} wasConnected - Was this connection previously connected. If it was it could mean
|
||||||
|
* that connectivity was disrupted, if not it most likely means that the app could not reach
|
||||||
|
* the JVB server, or the other peer in case of P2P.
|
||||||
|
*
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
notifyPeerConnectionFailure(isP2P, wasConnected) {
|
||||||
|
this._sendEvent({
|
||||||
|
name: 'peer-connection-failure',
|
||||||
|
isP2P,
|
||||||
|
wasConnected
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disposes the allocated resources.
|
* Disposes the allocated resources.
|
||||||
*
|
*
|
||||||
|
|
|
@ -135,6 +135,7 @@ const events = {
|
||||||
'participant-role-changed': 'participantRoleChanged',
|
'participant-role-changed': 'participantRoleChanged',
|
||||||
'participants-pane-toggled': 'participantsPaneToggled',
|
'participants-pane-toggled': 'participantsPaneToggled',
|
||||||
'password-required': 'passwordRequired',
|
'password-required': 'passwordRequired',
|
||||||
|
'peer-connection-failure': 'peerConnectionFailure',
|
||||||
'prejoin-screen-loaded': 'prejoinScreenLoaded',
|
'prejoin-screen-loaded': 'prejoinScreenLoaded',
|
||||||
'proxy-connection-event': 'proxyConnectionEvent',
|
'proxy-connection-event': 'proxyConnectionEvent',
|
||||||
'raise-hand-updated': 'raiseHandUpdated',
|
'raise-hand-updated': 'raiseHandUpdated',
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
"@jitsi/js-utils": "2.0.4",
|
"@jitsi/js-utils": "2.0.4",
|
||||||
"@jitsi/logger": "2.0.0",
|
"@jitsi/logger": "2.0.0",
|
||||||
"@jitsi/rnnoise-wasm": "0.1.0",
|
"@jitsi/rnnoise-wasm": "0.1.0",
|
||||||
"@jitsi/rtcstats": "9.4.1",
|
"@jitsi/rtcstats": "9.5.0",
|
||||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||||
"@microsoft/microsoft-graph-client": "3.0.1",
|
"@microsoft/microsoft-graph-client": "3.0.1",
|
||||||
"@mui/material": "5.10.2",
|
"@mui/material": "5.10.2",
|
||||||
|
@ -3780,9 +3780,9 @@
|
||||||
"integrity": "sha512-JujivPbOUvdRYa2xqByHYKfKGNGa7ZPyNLaNuh8hEp9XsiNfjaJAHdboq6M1VY9TP+765nyxC0LjpAw1VkikOQ=="
|
"integrity": "sha512-JujivPbOUvdRYa2xqByHYKfKGNGa7ZPyNLaNuh8hEp9XsiNfjaJAHdboq6M1VY9TP+765nyxC0LjpAw1VkikOQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@jitsi/rtcstats": {
|
"node_modules/@jitsi/rtcstats": {
|
||||||
"version": "9.4.1",
|
"version": "9.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/@jitsi/rtcstats/-/rtcstats-9.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@jitsi/rtcstats/-/rtcstats-9.5.0.tgz",
|
||||||
"integrity": "sha512-JrRBk9xLAnRgBP9aqTjR41DBAQYMkupOfy8XMIumdjxlDqf8dQygvYRc253xdHejr/kSHCvnaFoVIM3hHfeooQ==",
|
"integrity": "sha512-jKB+1IzKuqynA2etmWAA4uDFF0oAFUZWxRq+m+rOt8FfBp6pXojWbWA7xblcjxerj/3njGc8nEQbcK9qck1How==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jitsi/js-utils": "^2.0.0",
|
"@jitsi/js-utils": "^2.0.0",
|
||||||
"sdp": "^3.0.3",
|
"sdp": "^3.0.3",
|
||||||
|
@ -23208,9 +23208,9 @@
|
||||||
"integrity": "sha512-JujivPbOUvdRYa2xqByHYKfKGNGa7ZPyNLaNuh8hEp9XsiNfjaJAHdboq6M1VY9TP+765nyxC0LjpAw1VkikOQ=="
|
"integrity": "sha512-JujivPbOUvdRYa2xqByHYKfKGNGa7ZPyNLaNuh8hEp9XsiNfjaJAHdboq6M1VY9TP+765nyxC0LjpAw1VkikOQ=="
|
||||||
},
|
},
|
||||||
"@jitsi/rtcstats": {
|
"@jitsi/rtcstats": {
|
||||||
"version": "9.4.1",
|
"version": "9.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/@jitsi/rtcstats/-/rtcstats-9.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@jitsi/rtcstats/-/rtcstats-9.5.0.tgz",
|
||||||
"integrity": "sha512-JrRBk9xLAnRgBP9aqTjR41DBAQYMkupOfy8XMIumdjxlDqf8dQygvYRc253xdHejr/kSHCvnaFoVIM3hHfeooQ==",
|
"integrity": "sha512-jKB+1IzKuqynA2etmWAA4uDFF0oAFUZWxRq+m+rOt8FfBp6pXojWbWA7xblcjxerj/3njGc8nEQbcK9qck1How==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jitsi/js-utils": "^2.0.0",
|
"@jitsi/js-utils": "^2.0.0",
|
||||||
"sdp": "^3.0.3",
|
"sdp": "^3.0.3",
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
"@jitsi/js-utils": "2.0.4",
|
"@jitsi/js-utils": "2.0.4",
|
||||||
"@jitsi/logger": "2.0.0",
|
"@jitsi/logger": "2.0.0",
|
||||||
"@jitsi/rnnoise-wasm": "0.1.0",
|
"@jitsi/rnnoise-wasm": "0.1.0",
|
||||||
"@jitsi/rtcstats": "9.4.1",
|
"@jitsi/rtcstats": "9.5.0",
|
||||||
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
"@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz",
|
||||||
"@microsoft/microsoft-graph-client": "3.0.1",
|
"@microsoft/microsoft-graph-client": "3.0.1",
|
||||||
"@mui/material": "5.10.2",
|
"@mui/material": "5.10.2",
|
||||||
|
|
|
@ -1,9 +1,18 @@
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
import { PC_CON_STATE_CHANGE,
|
||||||
|
PC_STATE_CONNECTED,
|
||||||
|
PC_STATE_FAILED
|
||||||
|
|
||||||
|
// @ts-ignore
|
||||||
|
} from '@jitsi/rtcstats/events';
|
||||||
|
// eslint-disable-next-line lines-around-comment
|
||||||
|
// @ts-ignore
|
||||||
import rtcstatsInit from '@jitsi/rtcstats/rtcstats';
|
import rtcstatsInit from '@jitsi/rtcstats/rtcstats';
|
||||||
// eslint-disable-next-line lines-around-comment
|
// eslint-disable-next-line lines-around-comment
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
import traceInit from '@jitsi/rtcstats/trace-ws';
|
import traceInit from '@jitsi/rtcstats/trace-ws';
|
||||||
|
|
||||||
|
|
||||||
import { createRTCStatsTraceCloseEvent } from '../analytics/AnalyticsEvents';
|
import { createRTCStatsTraceCloseEvent } from '../analytics/AnalyticsEvents';
|
||||||
import { sendAnalytics } from '../analytics/functions';
|
import { sendAnalytics } from '../analytics/functions';
|
||||||
|
|
||||||
|
@ -39,6 +48,7 @@ function connectionFilter(config: any) {
|
||||||
class RTCStats {
|
class RTCStats {
|
||||||
trace: any;
|
trace: any;
|
||||||
initialized = false;
|
initialized = false;
|
||||||
|
connStateEvents: any = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the rtcstats components. First off we initialize the trace, which is a wrapped websocket
|
* Initialize the rtcstats components. First off we initialize the trace, which is a wrapped websocket
|
||||||
|
@ -71,7 +81,8 @@ class RTCStats {
|
||||||
connectionFilter,
|
connectionFilter,
|
||||||
pollInterval,
|
pollInterval,
|
||||||
useLegacy,
|
useLegacy,
|
||||||
sendSdp
|
sendSdp,
|
||||||
|
eventCallback: this.handleRtcstatsEvent.bind(this)
|
||||||
};
|
};
|
||||||
|
|
||||||
this.trace = traceInit(traceOptions);
|
this.trace = traceInit(traceOptions);
|
||||||
|
@ -185,6 +196,40 @@ class RTCStats {
|
||||||
this.trace?.close();
|
this.trace?.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* RTCStats client can notify the APP of any PeerConnection related event that occurs.
|
||||||
|
*
|
||||||
|
* @param {Object} event - Rtcstats event.
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
handleRtcstatsEvent(event: any) {
|
||||||
|
switch (event.type) {
|
||||||
|
case PC_CON_STATE_CHANGE: {
|
||||||
|
const { body: { isP2P, state } = { state: null,
|
||||||
|
isP2P: null } } = event;
|
||||||
|
|
||||||
|
this.connStateEvents.push(event.body);
|
||||||
|
|
||||||
|
// We only report PC related connection issues. If the rtcstats websocket is not connected at this point
|
||||||
|
// it usually means that none of our services can be reached i.e. there's problem with the internet
|
||||||
|
// connection and not necessarily with reaching the JVB (due to a firewall or other reasons).
|
||||||
|
if (state === PC_STATE_FAILED && this.trace.isConnected()) {
|
||||||
|
const connectionType = isP2P ? 'P2P' : 'JVB';
|
||||||
|
const wasConnected = this.connStateEvents.some((connectionEvent: { isP2P: any; state: string; }) =>
|
||||||
|
(connectionEvent.isP2P === isP2P) && (connectionEvent.state === PC_STATE_CONNECTED));
|
||||||
|
|
||||||
|
logger.info(`${connectionType} PeerConnection failed, previously connected: ${wasConnected}`);
|
||||||
|
|
||||||
|
if (typeof APP !== 'undefined') {
|
||||||
|
APP.API.notifyPeerConnectionFailure(isP2P, wasConnected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The way rtcstats is currently designed the ws wouldn't normally be closed by the application logic but rather
|
* The way rtcstats is currently designed the ws wouldn't normally be closed by the application logic but rather
|
||||||
* by the page being closed/reloaded. Using this assumption any onclose event is most likely something abnormal
|
* by the page being closed/reloaded. Using this assumption any onclose event is most likely something abnormal
|
||||||
|
|
Loading…
Reference in New Issue