chore: fix group call id mismatch.

This commit is contained in:
Duan Weiwei 2022-08-03 14:16:08 +00:00 committed by Nicolas Werner
parent b146d18c81
commit 2ef59b0651
2 changed files with 62 additions and 3 deletions

View File

@ -491,6 +491,7 @@ class GroupCall {
); );
*/ */
voip.groupCalls.remove(room.id); voip.groupCalls.remove(room.id);
voip.groupCalls.remove(groupCallId);
if (emitStateEvent) { if (emitStateEvent) {
final existingStateEvent = await getStateEvent( final existingStateEvent = await getStateEvent(
@ -711,7 +712,7 @@ class GroupCall {
if (existingCallIndex != -1) { if (existingCallIndex != -1) {
if (memberCallState != null) { if (memberCallState != null) {
calls.replaceRange(existingCallIndex, 1, [memberCallState]); calls[existingCallIndex] = memberCallState;
} else { } else {
calls.removeAt(existingCallIndex); calls.removeAt(existingCallIndex);
} }
@ -752,8 +753,15 @@ class GroupCall {
} }
// Currently we only support a single call per room. So grab the first call. // Currently we only support a single call per room. So grab the first call.
final callState = IGroupCallRoomMemberCallState? callState;
callsState.calls.isNotEmpty ? callsState.calls.elementAt(0) : null;
if (callsState.calls.isNotEmpty) {
final index = callsState.calls
.indexWhere((element) => element.call_id == groupCallId);
if (index != -1) {
callState = callsState.calls[index];
}
}
if (callState == null) { if (callState == null) {
Logs().w( Logs().w(

View File

@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:core'; import 'dart:core';
import 'package:sdp_transform/sdp_transform.dart' as sdp_transform; import 'package:sdp_transform/sdp_transform.dart' as sdp_transform;
@ -37,6 +38,7 @@ class VoIP {
String? get localPartyId => client.deviceID; String? get localPartyId => client.deviceID;
final Client client; final Client client;
final WebRTCDelegate delegate; final WebRTCDelegate delegate;
final StreamController<GroupCall> onIncomingGroupCall = StreamController();
void _handleEvent( void _handleEvent(
Event event, Event event,
@ -536,6 +538,10 @@ class VoIP {
Future<GroupCall?> newGroupCall(String roomId, String type, String intent, Future<GroupCall?> newGroupCall(String roomId, String type, String intent,
[bool? dataChannelsEnabled, [bool? dataChannelsEnabled,
RTCDataChannelInit? dataChannelOptions]) async { RTCDataChannelInit? dataChannelOptions]) async {
if (getGroupCallForRoom(roomId) != null) {
Logs().e('[VOIP] [$roomId] already has an existing group call.');
return null;
}
final room = client.getRoomById(roomId); final room = client.getRoomById(roomId);
if (room == null) { if (room == null) {
Logs().v('[VOIP] Invalid room id [$roomId].'); Logs().v('[VOIP] Invalid room id [$roomId].');
@ -553,9 +559,53 @@ class VoIP {
dataChannelOptions: dataChannelOptions ?? RTCDataChannelInit(), dataChannelOptions: dataChannelOptions ?? RTCDataChannelInit(),
).create(); ).create();
groupCalls[groupId] = groupCall; groupCalls[groupId] = groupCall;
groupCalls[roomId] = groupCall;
return groupCall; return groupCall;
} }
Future<GroupCall?> fetchOrCreateGroupCall(String roomId) async {
final groupCall = getGroupCallForRoom(roomId);
if (groupCall != null) return groupCall;
final room = client.getRoomById(roomId);
if (room == null) {
Logs().w('Not found room id = $roomId');
return null;
}
if (!room.groupCallsEnabled) {
await room.enableGroupCalls();
}
if (room.canCreateGroupCall) {
// The call doesn't exist, but we can create it
return await newGroupCall(
roomId, GroupCallType.Video, GroupCallIntent.Prompt);
}
if (room.canJoinGroupCall) {
Logs().w('No permission to join group calls in room $roomId');
return null;
}
final completer = Completer<GroupCall?>();
Timer? timer;
final subscription = onIncomingGroupCall.stream.listen((GroupCall call) {
if (call.room.id == roomId) {
timer?.cancel();
completer.complete(call);
}
});
timer = Timer(Duration(seconds: 30), () {
subscription.cancel();
completer.completeError('timeout');
});
return completer.future;
}
GroupCall? getGroupCallForRoom(String roomId) { GroupCall? getGroupCallForRoom(String roomId) {
return groupCalls[roomId]; return groupCalls[roomId];
} }
@ -653,6 +703,7 @@ class VoIP {
groupCalls[groupCallId!] = groupCall; groupCalls[groupCallId!] = groupCall;
groupCalls[room.id] = groupCall; groupCalls[room.id] = groupCall;
onIncomingGroupCall.add(groupCall);
delegate.handleNewGroupCall(groupCall); delegate.handleNewGroupCall(groupCall);
return groupCall; return groupCall;
} }