From 0c9e129347b9088775bbe0fd50b44f6f9c9413fa Mon Sep 17 00:00:00 2001 From: td Date: Tue, 14 Feb 2023 23:08:50 +0530 Subject: [PATCH] fix: clean expired member state events in group calls --- lib/src/client.dart | 4 ++-- lib/src/room.dart | 12 ++++++------ lib/src/voip/group_call.dart | 26 +++++++++++++++++++++++++- test/room_test.dart | 12 ++++++------ 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/src/client.dart b/lib/src/client.dart index 30b62359..50215a83 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -667,8 +667,8 @@ class Client extends MatrixApi { if (groupCall) { powerLevelContentOverride ??= {}; powerLevelContentOverride['events'] = { - 'org.matrix.msc3401.call.member': 0, - 'org.matrix.msc3401.call': 0, + EventTypes.GroupCallMemberPrefix: 0, + EventTypes.GroupCallPrefix: 0, }; } final roomId = await createRoom( diff --git a/lib/src/room.dart b/lib/src/room.dart index ab84de62..12ff7299 100644 --- a/lib/src/room.dart +++ b/lib/src/room.dart @@ -1740,10 +1740,10 @@ class Room { } bool get canCreateGroupCall => - canChangeStateEvent('org.matrix.msc3401.call') && groupCallsEnabled; + canChangeStateEvent(EventTypes.GroupCallPrefix) && groupCallsEnabled; bool get canJoinGroupCall => - canChangeStateEvent('org.matrix.msc3401.call.member') && + canChangeStateEvent(EventTypes.GroupCallMemberPrefix) && groupCallsEnabled; /// if returned value is not null `org.matrix.msc3401.call.member` is present @@ -1751,9 +1751,9 @@ class Room { bool get groupCallsEnabled { final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content; if (powerLevelMap == null) return false; - return powerForChangingStateEvent('org.matrix.msc3401.call.member') <= + return powerForChangingStateEvent(EventTypes.GroupCallMemberPrefix) <= getDefaultPowerLevel(powerLevelMap) && - powerForChangingStateEvent('org.matrix.msc3401.call') <= + powerForChangingStateEvent(EventTypes.GroupCallPrefix) <= getDefaultPowerLevel(powerLevelMap); } @@ -1766,8 +1766,8 @@ class Room { final newPowerLevelMap = currentPowerLevelsMap; final eventsMap = newPowerLevelMap['events'] ?? {}; eventsMap.addAll({ - 'org.matrix.msc3401.call': getDefaultPowerLevel(currentPowerLevelsMap), - 'org.matrix.msc3401.call.member': + EventTypes.GroupCallPrefix: getDefaultPowerLevel(currentPowerLevelsMap), + EventTypes.GroupCallMemberPrefix: getDefaultPowerLevel(currentPowerLevelsMap) }); newPowerLevelMap.addAll({'events': eventsMap}); diff --git a/lib/src/voip/group_call.dart b/lib/src/voip/group_call.dart index 56cc8899..3985a8b9 100644 --- a/lib/src/voip/group_call.dart +++ b/lib/src/voip/group_call.dart @@ -733,7 +733,31 @@ class GroupCall { if (currentStateEvent != null) { final memberStateEvent = IGroupCallRoomMemberState.fromJson(currentStateEvent); - calls = memberStateEvent.calls; + final unCheckedCalls = memberStateEvent.calls; + + // don't keep pushing stale devices every update + final validCalls = []; + for (final call in unCheckedCalls) { + final validDevices = []; + for (final device in call.devices) { + if (device.expires_ts != null && + device.expires_ts! > + DateTime.now() + // safety buffer just incase we were slow to process a + // call event, if the device is actually dead it should + // get removed pretty soon + .add(Duration(seconds: 10)) + .millisecondsSinceEpoch) { + validDevices.add(device); + } + } + if (validDevices.isNotEmpty) { + validCalls.add(call); + } + } + + calls = validCalls; + final existingCallIndex = calls.indexWhere((element) => groupCallId == element.call_id); diff --git a/test/room_test.dart b/test/room_test.dart index 15638c8e..48380a73 100644 --- a/test/room_test.dart +++ b/test/room_test.dart @@ -494,7 +494,7 @@ void main() { room: room, eventId: '123a', content: { - 'events': {'org.matrix.msc3401.call.member': 100}, + 'events': {EventTypes.GroupCallMemberPrefix: 100}, 'state_default': 50, 'users_default': 0 }, @@ -512,7 +512,7 @@ void main() { room: room, eventId: '123a', content: { - 'events': {'org.matrix.msc3401.call.member': 27}, + 'events': {EventTypes.GroupCallMemberPrefix: 27}, 'state_default': 50, 'users_default': 49 }, @@ -532,8 +532,8 @@ void main() { eventId: '123a', content: { 'events': { - 'org.matrix.msc3401.call.member': 27, - 'org.matrix.msc3401.call': 0 + EventTypes.GroupCallMemberPrefix: 27, + EventTypes.GroupCallPrefix: 0 }, 'state_default': 50, 'users_default': 2 @@ -555,8 +555,8 @@ void main() { eventId: '123a', content: { 'events': { - 'org.matrix.msc3401.call.member': 25, - 'org.matrix.msc3401.call': 25 + EventTypes.GroupCallMemberPrefix: 25, + EventTypes.GroupCallPrefix: 25 }, 'state_default': 50, 'users_default': 26