@@ -465,9 +465,14 @@ class CallSession {
465465 await pc! .setLocalDescription (answer);
466466 }
467467 } catch (e, s) {
468- Logs ().e ('[VOIP] onNegotiateReceived => ' , e, s);
469- await _getLocalOfferFailed (e);
470- return ;
468+ Logs ().e ('[VOIP] onNegotiateReceived => Failed to get local offer' , e, s);
469+ fireCallEvent (CallStateChange .kError);
470+ await terminate (CallParty .kLocal, CallErrorCode .localOfferFailed, true );
471+ throw CallError (
472+ CallErrorCode .localOfferFailed,
473+ 'Failed to get local offer' ,
474+ e,
475+ );
471476 }
472477
473478 final newLocalOnHold = await isLocalOnHold ();
@@ -592,7 +597,6 @@ class CallSession {
592597 await addLocalStream (stream, SDPStreamMetadataPurpose .Screenshare );
593598 return true ;
594599 } catch (err) {
595- fireCallEvent (CallStateChange .kError);
596600 return false ;
597601 }
598602 } else {
@@ -1147,9 +1151,15 @@ class CallSession {
11471151 await Future .delayed (voip.timeouts! .delayBeforeOffer);
11481152 final offer = await pc! .createOffer ({});
11491153 await _gotLocalOffer (offer);
1150- } catch (e) {
1151- await _getLocalOfferFailed (e);
1152- return ;
1154+ } catch (e, s) {
1155+ Logs ().e ('[VOIP] onNegotiationNeeded => Failed to get local offer' , e, s);
1156+ fireCallEvent (CallStateChange .kError);
1157+ await terminate (CallParty .kLocal, CallErrorCode .localOfferFailed, true );
1158+ throw CallError (
1159+ CallErrorCode .localOfferFailed,
1160+ 'Failed to get local offer' ,
1161+ e,
1162+ );
11531163 } finally {
11541164 _makingOffer = false ;
11551165 }
@@ -1326,20 +1336,33 @@ class CallSession {
13261336 };
13271337 try {
13281338 return await voip.delegate.mediaDevices.getUserMedia (mediaConstraints);
1329- } catch (e) {
1330- await _getUserMediaFailed (e);
1331- rethrow ;
1339+ } catch (e, s) {
1340+ Logs ().w ('Failed to get user media - ending call' , e, s);
1341+ fireCallEvent (CallStateChange .kError);
1342+ await terminate (CallParty .kLocal, CallErrorCode .userMediaFailed, true );
1343+ throw CallError (
1344+ CallErrorCode .userMediaFailed,
1345+ 'Failed to get user media' ,
1346+ e,
1347+ );
13321348 }
13331349 }
13341350
13351351 Future <MediaStream ?> _getDisplayMedia () async {
13361352 try {
13371353 return await voip.delegate.mediaDevices
13381354 .getDisplayMedia (UserMediaConstraints .screenMediaConstraints);
1339- } catch (e) {
1340- await _getUserMediaFailed (e);
1355+ } catch (e, s) {
1356+ Logs ().w ('Failed to get display media' , e, s);
1357+ fireCallEvent (CallStateChange .kError);
1358+ // We don't terminate the call here because the user might still want to stay
1359+ // on the call and try again later.
1360+ throw CallError (
1361+ CallErrorCode .displayMediaFailed,
1362+ 'Failed to get display media' ,
1363+ e,
1364+ );
13411365 }
1342- return null ;
13431366 }
13441367
13451368 Future <RTCPeerConnection > _createPeerConnection () async {
@@ -1469,19 +1492,6 @@ class CallSession {
14691492 }
14701493 }
14711494
1472- Future <void > _getLocalOfferFailed (dynamic err) async {
1473- Logs ().e ('Failed to get local offer ${err .toString ()}' );
1474- fireCallEvent (CallStateChange .kError);
1475-
1476- await terminate (CallParty .kLocal, CallErrorCode .localOfferFailed, true );
1477- }
1478-
1479- Future <void > _getUserMediaFailed (dynamic err) async {
1480- Logs ().w ('Failed to get user media - ending call ${err .toString ()}' );
1481- fireCallEvent (CallStateChange .kError);
1482- await terminate (CallParty .kLocal, CallErrorCode .userMediaFailed, true );
1483- }
1484-
14851495 Future <void > onSelectAnswerReceived (String ? selectedPartyId) async {
14861496 if (direction != CallDirection .kIncoming) {
14871497 Logs ().w ('Got select_answer for an outbound call: ignoring' );
0 commit comments