diff --git a/lib/src/core/engine.dart b/lib/src/core/engine.dart index 918c995..93b38fc 100644 --- a/lib/src/core/engine.dart +++ b/lib/src/core/engine.dart @@ -592,7 +592,7 @@ class Engine extends Disposable with EventsEmittable { events.emit(event); }) ..on((event) async { - if (event.connectionState == ConnectionState.disconnected) { + if (event.newState == ConnectionState.disconnected) { await _onDisconnected(DisconnectReason.signal); } // Relay to Room diff --git a/lib/src/core/signal_client.dart b/lib/src/core/signal_client.dart index ae3475f..32600fe 100644 --- a/lib/src/core/signal_client.dart +++ b/lib/src/core/signal_client.dart @@ -152,10 +152,12 @@ class SignalClient extends Disposable with EventsEmittable { bool didReconnect = _connectionState == ConnectionState.reconnecting && newValue == ConnectionState.connected; + final oldState = _connectionState; _connectionState = newValue; events.emit(SignalConnectionStateUpdatedEvent( - connectionState: _connectionState, + newState: _connectionState, + oldState: oldState, didReconnect: didReconnect, )); } diff --git a/lib/src/internal/events.dart b/lib/src/internal/events.dart index e792840..dd19dba 100644 --- a/lib/src/internal/events.dart +++ b/lib/src/internal/events.dart @@ -89,23 +89,41 @@ class SignalJoinResponseEvent with SignalEvent, EngineEvent, InternalEvent { }); } +/// Base class for a ConnectionStateUpdated event @internal -class SignalConnectionStateUpdatedEvent - with SignalEvent, EngineEvent, InternalEvent { - final ConnectionState connectionState; +abstract class ConnectionStateUpdatedEvent with EngineEvent, InternalEvent { + final ConnectionState newState; + final ConnectionState oldState; final bool didReconnect; final DisconnectReason? disconnectReason; - const SignalConnectionStateUpdatedEvent({ - required this.connectionState, + const ConnectionStateUpdatedEvent({ + required this.newState, + required this.oldState, required this.didReconnect, this.disconnectReason, }); @override - String toString() => '$runtimeType(state: ${connectionState.name}, ' + String toString() => '$runtimeType(newState: ${newState.name}, ' 'didReconnect: ${didReconnect}, ' 'disconnectReason: ${disconnectReason})'; } +@internal +class SignalConnectionStateUpdatedEvent extends ConnectionStateUpdatedEvent + with SignalEvent { + const SignalConnectionStateUpdatedEvent({ + required ConnectionState newState, + required ConnectionState oldState, + required bool didReconnect, + DisconnectReason? disconnectReason, + }) : super( + newState: newState, + oldState: oldState, + didReconnect: didReconnect, + disconnectReason: disconnectReason, + ); +} + @internal class SignalOfferEvent with SignalEvent, InternalEvent { final rtc.RTCSessionDescription sd; diff --git a/test/core/signal_client_test.dart b/test/core/signal_client_test.dart index 22b6980..f470e4b 100644 --- a/test/core/signal_client_test.dart +++ b/test/core/signal_client_test.dart @@ -25,9 +25,9 @@ void main() { client.events.streamCtrl.stream, emitsInOrder([ predicate( - (event) => event.connectionState == ConnectionState.connecting), + (event) => event.newState == ConnectionState.connecting), predicate( - (event) => event.connectionState == ConnectionState.connected), + (event) => event.newState == ConnectionState.connected), ])); await client.connect(exampleUri, token); }); @@ -36,9 +36,9 @@ void main() { client.events.streamCtrl.stream, emitsInOrder([ predicate((event) => - event.connectionState == ConnectionState.reconnecting), + event.newState == ConnectionState.reconnecting), predicate((event) => - event.connectionState == ConnectionState.connected && + event.newState == ConnectionState.connected && event.didReconnect == true), ])); await client.connect(exampleUri, token, reconnect: true);