Skip to content

Commit f838d8e

Browse files
fix: handle failed to create RTCPeerConnection object error in a call
1 parent 609ee1d commit f838d8e

File tree

5 files changed

+45
-8
lines changed

5 files changed

+45
-8
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ coverage/
1818
coverage_badge.svg
1919
coverage.xml
2020
TEST-report.*
21+
coverage_dir/*
2122

2223
# IntelliJ related
2324
*.iml

lib/src/voip/call_session.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,7 +1218,9 @@ class CallSession {
12181218
}
12191219
};
12201220
} catch (e) {
1221-
Logs().v('[VOIP] prepareMediaStream error => ${e.toString()}');
1221+
Logs().v('[VOIP] preparePeerConnection error => ${e.toString()}');
1222+
await _createPeerConnectionFailed(e);
1223+
rethrow;
12221224
}
12231225
}
12241226

@@ -1454,10 +1456,19 @@ class CallSession {
14541456
}
14551457
}
14561458

1459+
Future<void> _createPeerConnectionFailed(dynamic err) async {
1460+
Logs().e('Failed to create peer connection object ${err.toString()}');
1461+
fireCallEvent(CallStateChange.kError);
1462+
await terminate(
1463+
CallParty.kLocal,
1464+
CallErrorCode.createPeerConnectionFailed,
1465+
true,
1466+
);
1467+
}
1468+
14571469
Future<void> _getLocalOfferFailed(dynamic err) async {
14581470
Logs().e('Failed to get local offer ${err.toString()}');
14591471
fireCallEvent(CallStateChange.kError);
1460-
14611472
await terminate(CallParty.kLocal, CallErrorCode.localOfferFailed, true);
14621473
}
14631474

lib/src/voip/utils/types.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ enum CallErrorCode {
4040
/// The user chose to end the call
4141
userHangup('user_hangup'),
4242

43+
/// An error code when creating peer connection object fails locally.
44+
createPeerConnectionFailed('create_peer_connection_failed'),
45+
4346
/// An error code when the local client failed to create an offer.
4447
localOfferFailed('local_offer_failed'),
4548

test/calls_test.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,26 @@ void main() {
615615
);
616616
});
617617

618+
test('Call fails when peer connection creation fails', () async {
619+
final mockDelegate = MockWebRTCDelegate()
620+
..throwOnCreatePeerConnection = true;
621+
voip = VoIP(matrix, mockDelegate);
622+
VoIP.customTxid = '1234';
623+
624+
try {
625+
await voip.inviteToCall(
626+
room,
627+
CallType.kVoice,
628+
userId: '@alice:testing.com',
629+
);
630+
fail('Expected call to fail');
631+
} catch (e) {
632+
expect(e, isA<CallError>());
633+
expect((e as CallError).code, CallErrorCode.createPeerConnectionFailed);
634+
expect(voip.currentCID, null);
635+
}
636+
});
637+
618638
test('getFamedlyCallEvents sort order', () {
619639
room.setState(
620640
Event(

test/webrtc_stub.dart

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,21 @@ import 'package:webrtc_interface/webrtc_interface.dart';
55
import 'package:matrix/matrix.dart';
66

77
class MockWebRTCDelegate implements WebRTCDelegate {
8+
bool throwOnCreatePeerConnection = false;
9+
810
@override
911
bool get canHandleNewCall => true;
1012

1113
@override
1214
Future<RTCPeerConnection> createPeerConnection(
1315
Map<String, dynamic> configuration, [
1416
Map<String, dynamic> constraints = const {},
15-
]) async =>
16-
MockRTCPeerConnection();
17+
]) async {
18+
if (throwOnCreatePeerConnection) {
19+
throw Exception('Failed to create peer connection');
20+
}
21+
return MockRTCPeerConnection();
22+
}
1723

1824
@override
1925
Future<void> registerListeners(CallSession session) async {
@@ -844,8 +850,4 @@ class MockVideoRenderer implements VideoRenderer {
844850
// Mock implementation for disposing VideoRenderer
845851
Logs().i('Mock: Disposing VideoRenderer');
846852
}
847-
848-
@override
849-
// TODO: implement videoValue
850-
RTCVideoValue get videoValue => RTCVideoValue.empty;
851853
}

0 commit comments

Comments
 (0)