Merge branch 'td/cleanExpiredMemberStateEvents' into 'main'

fix: clean expired member state events in group calls

See merge request famedly/company/frontend/famedlysdk!1237
This commit is contained in:
td 2023-02-15 09:34:35 +00:00
commit 40c553c44d
4 changed files with 39 additions and 15 deletions

View File

@ -667,8 +667,8 @@ class Client extends MatrixApi {
if (groupCall) { if (groupCall) {
powerLevelContentOverride ??= {}; powerLevelContentOverride ??= {};
powerLevelContentOverride['events'] = <String, dynamic>{ powerLevelContentOverride['events'] = <String, dynamic>{
'org.matrix.msc3401.call.member': 0, EventTypes.GroupCallMemberPrefix: 0,
'org.matrix.msc3401.call': 0, EventTypes.GroupCallPrefix: 0,
}; };
} }
final roomId = await createRoom( final roomId = await createRoom(

View File

@ -1740,10 +1740,10 @@ class Room {
} }
bool get canCreateGroupCall => bool get canCreateGroupCall =>
canChangeStateEvent('org.matrix.msc3401.call') && groupCallsEnabled; canChangeStateEvent(EventTypes.GroupCallPrefix) && groupCallsEnabled;
bool get canJoinGroupCall => bool get canJoinGroupCall =>
canChangeStateEvent('org.matrix.msc3401.call.member') && canChangeStateEvent(EventTypes.GroupCallMemberPrefix) &&
groupCallsEnabled; groupCallsEnabled;
/// if returned value is not null `org.matrix.msc3401.call.member` is present /// if returned value is not null `org.matrix.msc3401.call.member` is present
@ -1751,9 +1751,9 @@ class Room {
bool get groupCallsEnabled { bool get groupCallsEnabled {
final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content; final powerLevelMap = getState(EventTypes.RoomPowerLevels)?.content;
if (powerLevelMap == null) return false; if (powerLevelMap == null) return false;
return powerForChangingStateEvent('org.matrix.msc3401.call.member') <= return powerForChangingStateEvent(EventTypes.GroupCallMemberPrefix) <=
getDefaultPowerLevel(powerLevelMap) && getDefaultPowerLevel(powerLevelMap) &&
powerForChangingStateEvent('org.matrix.msc3401.call') <= powerForChangingStateEvent(EventTypes.GroupCallPrefix) <=
getDefaultPowerLevel(powerLevelMap); getDefaultPowerLevel(powerLevelMap);
} }
@ -1766,8 +1766,8 @@ class Room {
final newPowerLevelMap = currentPowerLevelsMap; final newPowerLevelMap = currentPowerLevelsMap;
final eventsMap = newPowerLevelMap['events'] ?? {}; final eventsMap = newPowerLevelMap['events'] ?? {};
eventsMap.addAll({ eventsMap.addAll({
'org.matrix.msc3401.call': getDefaultPowerLevel(currentPowerLevelsMap), EventTypes.GroupCallPrefix: getDefaultPowerLevel(currentPowerLevelsMap),
'org.matrix.msc3401.call.member': EventTypes.GroupCallMemberPrefix:
getDefaultPowerLevel(currentPowerLevelsMap) getDefaultPowerLevel(currentPowerLevelsMap)
}); });
newPowerLevelMap.addAll({'events': eventsMap}); newPowerLevelMap.addAll({'events': eventsMap});

View File

@ -733,7 +733,31 @@ class GroupCall {
if (currentStateEvent != null) { if (currentStateEvent != null) {
final memberStateEvent = final memberStateEvent =
IGroupCallRoomMemberState.fromJson(currentStateEvent); IGroupCallRoomMemberState.fromJson(currentStateEvent);
calls = memberStateEvent.calls; final unCheckedCalls = memberStateEvent.calls;
// don't keep pushing stale devices every update
final validCalls = <IGroupCallRoomMemberCallState>[];
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 = final existingCallIndex =
calls.indexWhere((element) => groupCallId == element.call_id); calls.indexWhere((element) => groupCallId == element.call_id);

View File

@ -494,7 +494,7 @@ void main() {
room: room, room: room,
eventId: '123a', eventId: '123a',
content: { content: {
'events': {'org.matrix.msc3401.call.member': 100}, 'events': {EventTypes.GroupCallMemberPrefix: 100},
'state_default': 50, 'state_default': 50,
'users_default': 0 'users_default': 0
}, },
@ -512,7 +512,7 @@ void main() {
room: room, room: room,
eventId: '123a', eventId: '123a',
content: { content: {
'events': {'org.matrix.msc3401.call.member': 27}, 'events': {EventTypes.GroupCallMemberPrefix: 27},
'state_default': 50, 'state_default': 50,
'users_default': 49 'users_default': 49
}, },
@ -532,8 +532,8 @@ void main() {
eventId: '123a', eventId: '123a',
content: { content: {
'events': { 'events': {
'org.matrix.msc3401.call.member': 27, EventTypes.GroupCallMemberPrefix: 27,
'org.matrix.msc3401.call': 0 EventTypes.GroupCallPrefix: 0
}, },
'state_default': 50, 'state_default': 50,
'users_default': 2 'users_default': 2
@ -555,8 +555,8 @@ void main() {
eventId: '123a', eventId: '123a',
content: { content: {
'events': { 'events': {
'org.matrix.msc3401.call.member': 25, EventTypes.GroupCallMemberPrefix: 25,
'org.matrix.msc3401.call': 25 EventTypes.GroupCallPrefix: 25
}, },
'state_default': 50, 'state_default': 50,
'users_default': 26 'users_default': 26