diff --git a/lib/src/core/engine.dart b/lib/src/core/engine.dart index eb30984..c811743 100644 --- a/lib/src/core/engine.dart +++ b/lib/src/core/engine.dart @@ -139,6 +139,7 @@ class Engine extends Disposable with EventsEmittable { await publisher?.dispose(); publisher = null; + _hasPublished = false; await subscriber?.dispose(); subscriber = null; @@ -367,11 +368,11 @@ class Engine extends Disposable with EventsEmittable { )); events.on((event) { - // only listen to primary ice events - if (!event.isPrimary) return; + // + final isPrimaryOrPublisher = event.isPrimary || + (_hasPublished && event is EnginePublisherPeerStateUpdatedEvent); - if (event.state == - rtc.RTCPeerConnectionState.RTCPeerConnectionStateFailed) { + if (isPrimaryOrPublisher && event.state.isDisconnectedOrFailed()) { // trigger reconnect sequence _onDisconnected(DisconnectReason.peerConnection); } diff --git a/lib/src/extensions.dart b/lib/src/extensions.dart index 80ac9e2..69c30df 100644 --- a/lib/src/extensions.dart +++ b/lib/src/extensions.dart @@ -77,6 +77,11 @@ extension RTCIceCandidateExt on rtc.RTCIceCandidate { extension RTCPeerConnectionStateExt on rtc.RTCPeerConnectionState { bool isConnected() => this == rtc.RTCPeerConnectionState.RTCPeerConnectionStateConnected; + + bool isDisconnectedOrFailed() => [ + rtc.RTCPeerConnectionState.RTCPeerConnectionStateDisconnected, + rtc.RTCPeerConnectionState.RTCPeerConnectionStateFailed, + ].contains(this); } extension RTCIceTransportPolicyExt on RTCIceTransportPolicy {