There's a plan for using ping to detect XMPP WebSocket
disconnected instead of waiting for timeouts on the network layer.
This also simplifies ICE failed handling logic.
Takes disabled encodings into account when calculating the local resolution. (#1242)
* fix: Takes disabled encodings into account when calculating local resolution.
* feat: Adds a new event that's triggered when the max enabled resolution changes.
* feat: Broadcasts the max enabled resolution value along with other stats.
Adds extra 15 seconds before emitting ICE failed event. If the OS is capable of
reporting internet offline status then will start counting when the internet
comes back online.
The reason for that is when ICE restarts are disabled a user will get the page reload
screen immediately, but there's a chance to recover as long as the channels have not
expired on the bridge.
Switches from using JitsiConference.isJvbConnectionInterrupted
flag to peerconnection's ICE state. The interrupted
flag is not set if the connection fails initially.
Refactors the "connection status duration" analytics event. (#957)
This commit refactors 592f72a63c. It adds
the video type in the event and it also does a better job at managing
and properly cleaning up the state map.
feat(JitsiConference): delay the ICE failed notification
Because it's possible to go back from ICE FAILED state to CONNECTED it's
better to give it some time until the XMPP connection recovers and only
if they ICE does not recover in time send the ICE failed notification
to Jicofo. It's done by sending a ping to the XMPP server and checking
the ICE after 2 seconds past the ping successful response.
Exports additional statistics through ConnectionQuality (#813)
* feat: Read the server region from Jingle and broadcast it with statistics.
* feat: Adds the bridge count to local "statistics", refactors conference-properties.
* fix: Emits the conference properties with the event, small fixes.
* ref: Orders the imports alphabetically.
As described by @virtuacoplenny:
[T]he ordering is based on import path, not import name, with different
file depths being grouped together, node modules being grouped together
at the top.
* fix: Keeps JitsiConference#properties always defined.
* fix: Does not fire an event when the argument is undefined.
Revert "add debug logging for connection quality calculation" (#714)
This reverts commit 1c2c63e656.
The logging was initially added to help debug an issue with
connection quality showing lower than expected. The usefulness
of the logging has diminished and is noisy for browsers that
do not automatically filter console.debug, like Edge.
fix(connection-quality): set min percentage when exceeding a bitrate threshold (#708)
* fix(connection-quality): set min percentage when exceeding a bitrate threshold
In some cases a high bitrate does not equate to a high quality
percentage, because the target itself might be quite high, such
as the case for 1080. In those cases, give credit for the bitrate
being high.
* squash: impl 2, use a max bitrate
feat(1080p): support on chrome >= 61 using adapter (#617)
- Add a new browser check so adapter shim usage can be gated.
- Get track resolution for stats from the track itself to account
for browser resolution fallback logic. Do this only if
we can be sure adapter has shimmed it in.
- Create a new getUserMediaFlow, with RTC being the orchestration
for various RTCUtils calls.
- Remove connection quality stat "resolution" which was being
emitted but not used but listeners.
ESLint 4.8.0 discovers a lot of error related to formatting. While I
tried to fix as many of them as possible, a portion of them actually go
against our coding style. In such a case, I've disabled the indent rule
which effectively leaves it as it was before ESLint 4.8.0.
* doc(JitsiConference): deprecate 'isInLastN'
The 'isInLastN' method should not be used for the UI purposes, but
ParticipantConnectionStatus value should be used instead.
* fix(ParticipantConn..Status): speed up INACTIVE transition
Before this change when user's video stops playing, after user is
removed from last N we were waiting 2 seconds, before going to INACTIVE
state. This commit reduces the time to 500ms for such case.
* fix(ParticipantConn...): reduce logging
Reduce logging verbosity.
* fix(ParticipantConn...): handle LastN == 0
When LastN is set to 0 we should not rely on video playback and last N
set for figuring out participant connection status.
* fix(JitsiConference): undefined participants
Fixes a crash when this.participants field is accessed from _init.
* feat: multiple, simultaneous RTP stats
Makes it possible to have remote RTP stats running for more than one
peerconnection at a time.
* feat(stats): report RTT all the time
Will report JVB RTT (and end to end) while in P2P mode and vice versa.
* fix(JitsiConferenceEvents): remove CONNECTION_STATS
CONNECTION_STATS event is no longer emitted.
* fix(AvgRTPStatsReported): users with no video
Do not include FPS == 0 in average remote FPS calculation. Report NaN
for local FPS when video muted or no video device. NaN will be reported
for avg remote FPS if no video is received.
* fix(AvgRTPStatsReported): reset total packet loss
* feat(AvgRTPStatsReported): report 'screen' FPS
Will report average FPS for screen videos separately from camera videos,
but only if available (camera video reports NaN FPS when not available).
* fix(AvgRTPStatsReported): end2endRTT
Needs to report JSON with value.
* feat(AVG RTP stats): separate audio and video bitrate
Will report average audio and video bitrates separately.
* doc(JitsiConference): try to improve comment
* fix(AvgRTPStatsReporter): remove confusing reset
There's no a clear reason for doing reset there.
* ref(AvgRTPStatsReporter): rename var
Average end to end RTT calculated as a sum of local RTT towards the JVB
and an average of towards JVB RTTs reported by other participants.
Will be reported under 'stat.avg.end2endrtt' analytics event name.
Splits the participant connection status detection logic into two
separate flows one for P2P and one for JVB.
Fixes problem where user outside of last N would be reported as INACTIVE
when in P2P mode.
Added some improvements to the detection logic by adding more priority
for the video tracks frozen detection (if supported) over the last N.
When the browser supports this detection and it's playing video we
should not check the last N, because it's less reliable.
* Adds peer connection statuses (active/inactive/interrupted/restoring).
The peer connection used to be check with is connection active. Adding new states like active, inactive, when the connection was intentionally stopped by the bridge, interrupted due to network problem and restoring, which is the state of a peer which was inactive as being out of lastN and is now entering lastM and eventually will become active.
* Adds timers to track restoring status.
If restoring too long we set the connection status to interrupted. We save timestamps for all participants entering lastN and set the status for the connection to restoring for 5 seconds, or till it goes into active or exits lastN.
* Adds initial connectionStatus of newly created participant - active.
* Fixes some jsdocs.
* Uses symbols for strings and use of map, fixing comments on PR.
* Removes symbols.
* ref(RTC): store remote tracks in peer TPC
In order to implement P2P <-> JVB connection switching we need to
be able to associate remote tracks with the TraceablePeerConnections.
* feat(ChatRoom): multiple presence handlers
Add support for more than 1 presence handler per tag name.
* feat(JitsiLocalTrack): update stored MSID
* ref(stats): add peer connection arg to BYTE_SENT_STATS
Required to store local SSRCs in TraceablePeerConnection.
* ref: change local SSRCs strategy
* fix: generate recvonly SSRC if 0 video tracks
Video SSRC has to be generated for the recvonly stream if there are no
video tracks in the PeerConnection.
* feat: add "attach" and "detach" methods
* feat(jitsi tracks): improve logging
Adds toString methods and improve log messages around local and remote
tracks.
* ref(modify SSRCs): optimisations + fixes
- adds _doRenegotiate to JingleSessionPC that wraps some of
the duplicated logic
- fixes problems with attach/detach
- renames methods to reflect what that they really do (operate on
JitsiTrack rather than streams)
* ref(JingleSessionPC): remove duplication
Extracts common code for the 'modificationQueue' execution
* ref(VideoMuteSdpHack): rename, add docs, fix minor
Renames, adds docs and moves 'modified' flag and media direction
modification.
* ref(TPC): add 'isSimulcastOn'
* ref(MungeLocalSdp): move to RTC module
* ref: move "ufrag" events to the RTC module
* ref(JitsiConference): use promises for mute
* feat(XMPPEvents): add CONNECTION_ESTABLISHED
* feat: add peer to peer
* fix(P2P): deal with everyone's a moderator + fixes
* feat(P2P): implement "backToP2PDelay"
* fix(TPC): crash on FF accessing LD/RD
Firefox return null/undefined for localDescription/remoteDescription
objects if they have not been set yet, while Chrome does return empty
object instead. This commit makes the behaviour consistent by making
sure that at least empty object is returned for all browsers.
* fix(TPC): replace isFirefox with feature
* fix(JSPC): fix renegotiate crash on FF
FF does not allow to call 'createAnswer' in 'have-local-offer' state
* fix(JSPC): fix addIceCandidate crash on FF
* doc(JitsiConference): fix outdated comment
To be squashed with "ref(ChatRoom): remove unnecessary JingleSessionPC dependency"
* style(JitsiConference): rename arg to "jingleSession"
* feat(stats): add 'p2p' to 'transport'
The new p2p field will inform whether the transport comes from the peer
to peer type of connection or not.
* doc(TPC): describe local maps
* fix(P2P): multiplex between JVB and P2P ICE status
Will make sure that when in P2P mode the conference will be updated
with the ICE state coming from P2P and when in the JVB mode will get
the JVB one.
* doc(TPC): fixes docs and adds FIXME
* ref: use 'doesVideoMuteByStreamRemove'
* feat(P2P): stop P2P when ICE enters FAILED
The conference will switch back to the JVB connection when P2P
connection breaks (ICE enters failed state).
* feat(P2P): "connectivity-error" for ICE failed
Will use "connectivity-error" reason element name when ending P2P
session due to ICE failure.
* feat(xmpp): make P2P Stun servers configurable
STUN servers used in the P2P connection can be configured through
"p2pStunServers" option.
* ref(JitsiConference): use 'getActivePeerConnection'
* fix(P2P): re-create 'dtmfManager'
* ref(P2P): deal with ICE "completed" state
* ref(RTC): rename "owner" to "ownerEndpointId"
* fix(MungeLocalSdp): fix directions
* ref(ParticipantConnectionStatus): use for..of and () =>
* remove double 'l'
* ref: fix ESLint errors
* fix(MungeLocalSdp): adopt to new SdpTransformerUtil
* ref(MungeLocalSdp): use for .. of
* ref(SdpTransformUtil): remove "forEachSSRCAttr"
* fix(SDPDiffer): fix invalid "arrayEquals" call
* doc(MungeLocalSdp): add fixme
* fix(P2PEnabledConference): JVB tracks not added
* ref(JitsiConference): doc + rename mute methods
* ref(JitsiConference): adjust log level
* fix(JitsiConference): remove invalid eslint comments
Some mistake during rebase merge
* doc(JitsiConference): add FIXME
* ref(JitsiConferenceEventManager): stick to "tpc"
* ref(JitsiLocalTrack): use Set for "peerConnections"
* ref(JitsiLocalTrack): simplify expression
* ref(MungeLocalSdp): style + doc fixes
* ref: rename MungeLocalSdp to LocalSdpMunger
* ref(ParticipantConn..Status): rename method
* ref(SignalingLayerImpl): use Map and =>
* fix(strophe.jingle.js): minor style fixes + rename
* doc(XMPPEvents): typo
* doc(P2PEnabledConference): typo and style
* ref(P2PEnabledConference): rename methods
* ref(P2PEnabledConference): do not use "window"
* fix(P2PEnabledConference): cleanup deferred task
* ref(TPC): make options the last arg
* ref(TPC): use Map
* ref(TPC): syntax and other fixes...
* doc(ChatRoom): remove comment
* ref: remove P2PEnabledConference
* fix: remove JSUtil.js
* ref(LocalSdpMunger): re-use 'RtxModifier'
Reuses RtxModifier for injecting local RTX SSRCs as part of
the LocalSdpMunger logic.
* doc(LocalSdpMunger): remove confusing FIXME
* fix(TPC): setLocalDescription for FF
* fix(LocalSdpMunger): crash on react-native
* fix(JingleSessionPC): no events when ended
The instance once terminated should not emit connection state events.
* fix(P2P): do not start P2P on react-native
* fix: log meaningful error
Prior to this change you would see something like:
JitsiConference <error>: null
* fix(JingleSessionPC): no IQs once ended
* fix(JingleSessionPC): Jingle error logging
* fix: arguments order
* fix: make audio SSRC consistent
Audio SSRC needs to stay consistent between detach and attach operations
in order to avoid source-remove/source-add.
* fix(P2P): disable P2P on FF
There are problems with going back from P2P to JVB in FireFox. Other
participants will not see FF video. Looks like something related to
detach/attach.
* fix(JitsiConference): attach local tracks
Local tracks should be attached back to the JVB connection only
if the P2P was established.
* ref(JitsiConference): PR review fixes
ref(JitsiConference): else if
ref(JitsiConference): use getter
doc(JitsiConference): add comment
style(JitsiConference): remove extra line
log(JitsiConference): misleading msg
ref(JitsiConference): rename method
* ref(RTC): del _iteratePeerConnections
* ref: move getUfrag to SDPUtil
* fix(LocalSdpMunger): docs and if check
* fix(TPC): docs and typo
* ref(JingleSessionPC): PR review fixes
ref(JingleSessionPC): rename 'candidates'
ref(JitsiConference): remove extra check
ref(JitsiConference): rename isP2PEstablished
ref(JitsiConference): rename field (typo)
* doc(JitsiConferenceEventManager): typo
* ref(JitsiLocalTrack): rename var
* ref(JitsiConference): PR review fixes
ref(JitsiConference): rename var
doc(JitsiConference): add comment
doc(JitsiConference): add comment
doc(JitsiConference): fix comment
ref(JitsiConference): rename listener
ref(JitsiConference): rename var
* doc(RTC): remove duplicated arg description
doc(RTC): fill docs
* doc(SignalingLayerImpl): remove fixed FIXME
* ref(strophe.jingle.js): remove comment and break line
* style(TPC): formatting
doc(TPC): add FIXME
ref(TPC): remove unused code
doc(TPC): add docs
* doc(JingleSessionPC): mark "send" methods private
style(JingleSessionPC): extra lines