fix: group calls terminator having sync glares

this will be removed with the new calls, we should ignore expired calls rather than cleaning up unless you have complete ownership of the event
This commit is contained in:
td 2024-02-13 11:34:28 +01:00
parent 231399fe16
commit c2a2e419cb
No known key found for this signature in database
GPG Key ID: 62A30523D4D6CE28
1 changed files with 24 additions and 15 deletions

View File

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