@@ -104,6 +104,7 @@ class CallSession extends Disposable {
104104 final InternetConnection networkMonitor;
105105 final StatsOptions statsOptions;
106106 final Tracer _tracer;
107+ final Tracer _zonedTracer = Tracer (null );
107108 final StreamVideo _streamVideo;
108109
109110 final Duration joinResponseTimeout;
@@ -121,6 +122,7 @@ class CallSession extends Disposable {
121122 StatsReporter ? statsReporter;
122123
123124 Timer ? _peerConnectionCheckTimer;
125+ bool _isLeavingOrClosed = false ;
124126
125127 sfu_models.ClientDetails ? _clientDetails;
126128
@@ -132,12 +134,13 @@ class CallSession extends Disposable {
132134 onCancel: () => Result .error ('UpdateViewportVisibility cancelled' ),
133135 );
134136
135- TraceSlice getTrace () {
136- return _tracer.take ();
137+ List < TraceSlice > getTrace () {
138+ return [ _tracer.take (), _zonedTracer. take ()] ;
137139 }
138140
139141 void setTraceEnabled (bool enabled) {
140142 _tracer.setEnabled (enabled);
143+ _zonedTracer.setEnabled (enabled);
141144 }
142145
143146 void trace (String tag, dynamic data) {
@@ -459,6 +462,12 @@ class CallSession extends Disposable {
459462 fastReconnectDeadline: event.fastReconnectDeadline,
460463 ),
461464 );
465+ } on TimeoutException catch (e, stk) {
466+ final message =
467+ 'Waiting for "joinResponse" has timed out after ${joinResponseTimeout .inMilliseconds }ms' ;
468+ _tracer.trace ('joinRequestTimeout' , message);
469+ _logger.e (() => '[start] failed: $e ' );
470+ return Result .failure (VideoErrors .compose (e, stk));
462471 } catch (e, stk) {
463472 _logger.e (() => '[start] failed: $e ' );
464473 return Result .failure (VideoErrors .compose (e, stk));
@@ -585,6 +594,7 @@ class CallSession extends Disposable {
585594
586595 void leave ({String ? reason}) {
587596 _logger.d (() => '[leave] no args' );
597+ _isLeavingOrClosed = true ;
588598 sfuWS.leave (sessionId: sessionId, reason: reason);
589599 }
590600
@@ -593,6 +603,7 @@ class CallSession extends Disposable {
593603 String ? closeReason,
594604 }) async {
595605 _logger.d (() => '[close] code: $code , closeReason: $closeReason ' );
606+ _isLeavingOrClosed = true ;
596607
597608 await _eventsSubscription? .cancel ();
598609 await _networkStatusSubscription? .cancel ();
@@ -614,6 +625,7 @@ class CallSession extends Disposable {
614625 @override
615626 Future <void > dispose () async {
616627 _logger.d (() => '[dispose] no args' );
628+ _isLeavingOrClosed = true ;
617629
618630 await close (StreamWebSocketCloseCode .normalClosure);
619631 return await super .dispose ();
@@ -683,6 +695,7 @@ class CallSession extends Disposable {
683695 } else if (event is SfuParticipantLeftEvent ) {
684696 stateManager.sfuParticipantLeft (event);
685697 } else if (event is SfuConnectionQualityChangedEvent ) {
698+ _tracer.trace ('ConnectionQualityChanged' , event.toJson ());
686699 stateManager.sfuConnectionQualityChanged (event);
687700 } else if (event is SfuAudioLevelChangedEvent ) {
688701 stateManager.sfuUpdateAudioLevelChanged (event);
@@ -905,7 +918,7 @@ class CallSession extends Disposable {
905918 }
906919
907920 Future <void > _onRenegotiationNeeded (StreamPeerConnection pc) async {
908- if (stateManager.callState.status.isDisconnected) {
921+ if (_isLeavingOrClosed || stateManager.callState.status.isDisconnected) {
909922 _logger.w (() => '[negotiate] call is disconnected' );
910923 return ;
911924 }
@@ -1037,7 +1050,7 @@ class CallSession extends Disposable {
10371050 }
10381051
10391052 final result = TracerZone .run (
1040- _tracer ,
1053+ _zonedTracer ,
10411054 ++ zonedTracerSeq,
10421055 () async {
10431056 return rtcManager.setCameraEnabled (
@@ -1060,7 +1073,7 @@ class CallSession extends Disposable {
10601073 }
10611074
10621075 final result = TracerZone .run (
1063- _tracer ,
1076+ _zonedTracer ,
10641077 ++ zonedTracerSeq,
10651078 () async {
10661079 return rtcManager.setMicrophoneEnabled (
0 commit comments