* stats: disable stats collection if interval zero
* stats: add groupcall property for stats interval
* stats: disable collecting webrtc stats by default
* add setup methode for group call stats
* suppress lint errors in test
* Fix lack of media when a user reconnects
This fixes broken media when someone reconnects to the call after
a forced disconnect (when their old call gets replaced immediately
by a new call). We listen for changes in the call feeds and the tearing
down of the feeds for the old call caused us to remove the feed for
the new call.
Also adds the call to the calls map before it'as initialised, such that
it's the active call for the user/device when the feedsChanged event arrives,
otherwise we'll ignore the event.
* Fix tests
* stats: calculate received media by ignore not added tracks
* stats: fix lint issue
---------
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* stats: add max jitter and max packet loss
* stats: add test for max jitter and packet loss
* stats: add build summery report tests
* stats: switch to packetsLost instead of packetsTotal
* stats: Add Jitter stats
* Update src/webrtc/stats/trackStatsReporter.ts
Co-authored-by: Robin <robin@robin.town>
* stats: Fix typos in tests
* stats: differences between 0 and undefined in jitter val
---------
Co-authored-by: Robin <robin@robin.town>
* stats: add summery stats reporter
* stats: export summery stats reports
* stats: fix typo of event name
* stats: check promise condition for node 16 test linter
* stats: remove weak test to figure out memory leak
* stats: remove second weak test
* stats: add starting processing test
* stats: fix tests
* stats: fix typo in group call
* stats: fix stats report gathering test
* stats: reactivate promise merge
* stats: add track counter and track mute counter in summary stats
* stats: add summery calculation
* stats: fix PR issues
* stats: adjust summery reporter for inbound and mute state
* stats: check async state
* stats: switch from an `Or` to `And` condition for entire received media value
* stats: Add property description
---------
Co-authored-by: David Baker <dbkr@users.noreply.github.com>
* Refactor how group call end calls
We previously used disposeCall to terminate the call which meant that
sometimes a call would never get a hangup event. This changes it so
that we always end a call by calling hangup, then do the cleanup
when the hangup event arrives, so the cleanup is the same whether
we hang up or the other side does.
* Some fixes for failing & hanging tests
* Add type for the call map
As explained in the comment. I've added it to the end so this should
be completely backwards compatible (although it would be much nicer
if it were the first arg, probably).
* groupCall: add configuration param to allow no audio and no camera
* groupCall: enable datachannel to do no media group calls
* groupCall: changed call no media property as object property
* groupCall: fix existing unit tests
* groupCall: remove not needed flag
* groupCall: rename property to allow no media calls
* groupCall: mute unmute even without device
* groupCall: switch to promise callbacks
* groupCall: switch to try catch
* test: filter dummy code from coverage
* test: extend media mute tests
* groupCall: move permission check to device handler
* mediaHandler: add error in log statement
If the client uses a widget to join group calls, like Element Web does, then the local device could be joined to the call without GroupCall knowing. This adds a field to GroupCall that allows the client to tell GroupCall when it's using another session to join the call.
This refactoring brings a number of improvements to GroupCall, which I've unfortunately had to combine into a single commit due to coupling:
- Moves the expiration timestamp field on call membership state to be per-device
- Makes the participants of a group call visible without having to enter the call yourself
- Enables users to join group calls from multiple devices
- Identifies active speakers by their call feed, rather than just their user ID
- Plays nicely with clients that can be in multiple calls in a room at once
- Fixes a memory leak caused by the call retry loop never stopping
- Changes GroupCall to update its state synchronously, and write back to room state asynchronously
- This was already sort of halfway being done, but now we'd be committing to it
- Generally improves the robustness of the state machine
- It means that group call joins will appear instant, in a sense
For many reasons, this is a breaking change.
Unfortunately there are still other methods that could race with leave and result in broken group call state, such as enter and terminate. For the future, should consider writing a more careful specification of how the whole group call state machine is meant to work.