Merge pull request #1703 from famedly/td/fixSyncGlareTerminator

fix: group calls terminator having sync glares
This commit is contained in:
Mohammadreza Moradi 2024-02-13 15:11:10 +01:00 committed by GitHub
commit e542e91622
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 24 additions and 15 deletions

View File

@ -56,10 +56,16 @@ extension GroupCallUtils on Room {
if (call != null) { if (call != null) {
return call.devices.where((device) => device.expires_ts != null).every( return call.devices.where((device) => device.expires_ts != null).every(
(device) => (device) =>
device.expires_ts! < DateTime.now().millisecondsSinceEpoch); (device.expires_ts ?? 0) +
staleCallCheckerDuration
.inMilliseconds < // buffer for sync glare
DateTime.now().millisecondsSinceEpoch);
} else {
Logs().d(
'[VOIP] Did not find $groupCallId in member events, probably sync glare');
return false;
} }
} } else {
// Last 30 seconds to get yourself together. // Last 30 seconds to get yourself together.
// This saves us from accidentally killing calls which were just created and // This saves us from accidentally killing calls which were just created and
// whose state event we haven't recieved yet in sync. // whose state event we haven't recieved yet in sync.
@ -70,17 +76,20 @@ extension GroupCallUtils on Room {
.add(staleCallCheckerDuration) .add(staleCallCheckerDuration)
.millisecondsSinceEpoch < .millisecondsSinceEpoch <
DateTime.now().millisecondsSinceEpoch; DateTime.now().millisecondsSinceEpoch;
if (!expiredfr) { if (!expiredfr) {
Logs().d( Logs().d(
'[VOIP] Last 30 seconds for state event from ${groupCallMemberStateEvent.senderId}'); '[VOIP] Last 30 seconds for state event from ${groupCallMemberStateEvent.senderId}');
} }
return expiredfr; return expiredfr;
} }
}
/// checks for stale calls in a room and sends `m.terminated` if all the /// checks for stale calls in a room and sends `m.terminated` if all the
/// expires_ts are expired. Called regularly on sync. /// expires_ts are expired. Called regularly on sync.
Future<void> singleShotStaleCallCheckerOnRoom() async { Future<void> singleShotStaleCallCheckerOnRoom() async {
if (partial) return; if (partial) return;
await client.oneShotSync();
final copyGroupCallIds = final copyGroupCallIds =
states.tryGetMap<String, Event>(EventTypes.GroupCallPrefix); states.tryGetMap<String, Event>(EventTypes.GroupCallPrefix);