feat: Forward leave reason of disconnected events. (#250)

* feat: Forward leave reason of disconnected events.

* fix analyze.

* chore: print room disconnect reason when event.reason != null.

* chore: rename InternalDisconnectReason => ClientDisconnectReason.
This commit is contained in:
CloudWebRTC
2023-03-07 17:54:18 +08:00
committed by GitHub
parent db2e25d424
commit c74e6777d8
9 changed files with 66 additions and 22 deletions
+4 -1
View File
@@ -54,7 +54,10 @@ class _RoomPageState extends State<RoomPage> {
} }
void _setUpListeners() => _listener void _setUpListeners() => _listener
..on<RoomDisconnectedEvent>((_) async { ..on<RoomDisconnectedEvent>((event) async {
if (event.reason != null) {
print('Room disconnected: reason => ${event.reason}');
}
WidgetsBindingCompatible.instance WidgetsBindingCompatible.instance
?.addPostFrameCallback((timeStamp) => Navigator.pop(context)); ?.addPostFrameCallback((timeStamp) => Navigator.pop(context));
}) })
+15 -11
View File
@@ -18,6 +18,7 @@ import '../proto/livekit_models.pb.dart' as lk_models;
import '../proto/livekit_rtc.pb.dart' as lk_rtc; import '../proto/livekit_rtc.pb.dart' as lk_rtc;
import '../support/disposable.dart'; import '../support/disposable.dart';
import '../support/websocket.dart'; import '../support/websocket.dart';
import '../types/internal.dart';
import '../types/other.dart'; import '../types/other.dart';
import '../types/video_dimensions.dart'; import '../types/video_dimensions.dart';
import '../utils.dart'; import '../utils.dart';
@@ -220,7 +221,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
if (error is NegotiationError) { if (error is NegotiationError) {
fullReconnect = true; fullReconnect = true;
} }
await handleDisconnect(DisconnectReason.negotiationFailed); await handleDisconnect(ClientDisconnectReason.negotiationFailed);
} }
} }
@@ -370,9 +371,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
events.on<EnginePeerStateUpdatedEvent>((event) { events.on<EnginePeerStateUpdatedEvent>((event) {
if (event.state.isDisconnectedOrFailed()) { if (event.state.isDisconnectedOrFailed()) {
handleDisconnect(DisconnectReason.reconnect); handleDisconnect(ClientDisconnectReason.reconnect);
} else if (event.state.isClosed()) { } else if (event.state.isClosed()) {
handleDisconnect(DisconnectReason.peerConnectionClosed); handleDisconnect(ClientDisconnectReason.peerConnectionClosed);
} }
}); });
@@ -536,7 +537,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
} }
} }
Future<void> handleDisconnect(DisconnectReason reason) async { Future<void> handleDisconnect(ClientDisconnectReason reason) async {
logger logger
.info('onDisconnected state:${_connectionState} reason:${reason.name}'); .info('onDisconnected state:${_connectionState} reason:${reason.name}');
@@ -544,9 +545,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
fullReconnect = _clientConfiguration?.resumeConnection == fullReconnect = _clientConfiguration?.resumeConnection ==
lk_models.ClientConfigSetting.DISABLED || lk_models.ClientConfigSetting.DISABLED ||
[ [
DisconnectReason.leaveReconnect, ClientDisconnectReason.leaveReconnect,
DisconnectReason.negotiationFailed, ClientDisconnectReason.negotiationFailed,
DisconnectReason.peerConnectionClosed ClientDisconnectReason.peerConnectionClosed
].contains(reason); ].contains(reason);
} }
@@ -732,7 +733,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
}) })
..on<SignalConnectionStateUpdatedEvent>((event) async { ..on<SignalConnectionStateUpdatedEvent>((event) async {
if (event.newState == ConnectionState.disconnected) { if (event.newState == ConnectionState.disconnected) {
await handleDisconnect(DisconnectReason.signal); await handleDisconnect(ClientDisconnectReason.signal);
} }
}) })
..on<SignalOfferEvent>((event) async { ..on<SignalOfferEvent>((event) async {
@@ -788,14 +789,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
// reconnect immediately instead of waiting for next attempt // reconnect immediately instead of waiting for next attempt
_connectionState = ConnectionState.reconnecting; _connectionState = ConnectionState.reconnecting;
_updateConnectionState(ConnectionState.reconnecting); _updateConnectionState(ConnectionState.reconnecting);
await handleDisconnect(DisconnectReason.leaveReconnect); await handleDisconnect(ClientDisconnectReason.leaveReconnect);
} else { } else {
if (_connectionState == ConnectionState.reconnecting) { if (_connectionState == ConnectionState.reconnecting) {
logger.warning( logger.warning(
'[Signal] Received Leave while engine is reconnecting, ignoring...'); '[Signal] Received Leave while engine is reconnecting, ignoring...');
return; return;
} }
_updateConnectionState(ConnectionState.disconnected); _updateConnectionState(ConnectionState.disconnected,
reason: event.reason.toSDKType());
await cleanUp(); await cleanUp();
} }
}); });
@@ -811,7 +813,8 @@ extension EnginePrivateMethods on Engine {
_publisherDataChannel(reliability)?.state ?? _publisherDataChannel(reliability)?.state ??
rtc.RTCDataChannelState.RTCDataChannelClosed; rtc.RTCDataChannelState.RTCDataChannelClosed;
void _updateConnectionState(ConnectionState newValue) { void _updateConnectionState(ConnectionState newValue,
{DisconnectReason? reason}) {
if (_connectionState == newValue) return; if (_connectionState == newValue) return;
logger.fine('Engine ConnectionState ' logger.fine('Engine ConnectionState '
@@ -828,6 +831,7 @@ extension EnginePrivateMethods on Engine {
oldState: oldState, oldState: oldState,
didReconnect: didReconnect, didReconnect: didReconnect,
fullReconnect: fullReconnect, fullReconnect: fullReconnect,
disconnectReason: reason,
)); ));
} }
} }
+1 -1
View File
@@ -314,7 +314,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
} else if (event.newState == ConnectionState.disconnected) { } else if (event.newState == ConnectionState.disconnected) {
if (!event.fullReconnect) { if (!event.fullReconnect) {
await _cleanUp(); await _cleanUp();
events.emit(const RoomDisconnectedEvent()); events.emit(RoomDisconnectedEvent(reason: event.disconnectReason));
} }
} }
// always notify ChangeNotifier // always notify ChangeNotifier
+2 -1
View File
@@ -210,7 +210,8 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
)); ));
break; break;
case lk_rtc.SignalResponse_Message.leave: case lk_rtc.SignalResponse_Message.leave:
events.emit(SignalLeaveEvent(canReconnect: msg.leave.canReconnect)); events.emit(SignalLeaveEvent(
canReconnect: msg.leave.canReconnect, reason: msg.leave.reason));
break; break;
case lk_rtc.SignalResponse_Message.mute: case lk_rtc.SignalResponse_Message.mute:
events.emit(SignalRemoteMuteTrackEvent( events.emit(SignalRemoteMuteTrackEvent(
+5 -2
View File
@@ -65,10 +65,13 @@ class RoomRestartedEvent with RoomEvent {
/// Disconnected from the room /// Disconnected from the room
/// Emitted by [Room]. /// Emitted by [Room].
class RoomDisconnectedEvent with RoomEvent { class RoomDisconnectedEvent with RoomEvent {
const RoomDisconnectedEvent(); DisconnectReason? reason;
RoomDisconnectedEvent({
this.reason,
});
@override @override
String toString() => '${runtimeType}()'; String toString() => '${runtimeType}($reason)';
} }
/// Room metadata has changed. /// Room metadata has changed.
+18
View File
@@ -170,3 +170,21 @@ extension WidgetsBindingCompatible on WidgetsBinding {
// always return optional type for compatibility with flutter v2 and v3 // always return optional type for compatibility with flutter v2 and v3
static WidgetsBinding? get instance => WidgetsBinding.instance; static WidgetsBinding? get instance => WidgetsBinding.instance;
} }
extension DisconnectReasonExt on lk_models.DisconnectReason {
DisconnectReason toSDKType() => {
lk_models.DisconnectReason.UNKNOWN_REASON: DisconnectReason.unknown,
lk_models.DisconnectReason.CLIENT_INITIATED:
DisconnectReason.clientInitiated,
lk_models.DisconnectReason.DUPLICATE_IDENTITY:
DisconnectReason.duplicateIdentity,
lk_models.DisconnectReason.SERVER_SHUTDOWN:
DisconnectReason.serverShutdown,
lk_models.DisconnectReason.PARTICIPANT_REMOVED:
DisconnectReason.participantRemoved,
lk_models.DisconnectReason.ROOM_DELETED: DisconnectReason.roomDeleted,
lk_models.DisconnectReason.STATE_MISMATCH:
DisconnectReason.stateMismatch,
lk_models.DisconnectReason.JOIN_FAILURE: DisconnectReason.joinFailure,
}[this]!;
}
+2
View File
@@ -247,8 +247,10 @@ class EngineActiveSpeakersUpdateEvent with EngineEvent, InternalEvent {
@internal @internal
class SignalLeaveEvent with SignalEvent, InternalEvent { class SignalLeaveEvent with SignalEvent, InternalEvent {
final bool canReconnect; final bool canReconnect;
final lk_models.DisconnectReason reason;
const SignalLeaveEvent({ const SignalLeaveEvent({
required this.canReconnect, required this.canReconnect,
required this.reason,
}); });
} }
+11
View File
@@ -0,0 +1,11 @@
import 'package:meta/meta.dart';
@internal
enum ClientDisconnectReason {
user,
peerConnectionClosed,
negotiationFailed,
signal,
reconnect,
leaveReconnect,
}
+8 -6
View File
@@ -61,12 +61,14 @@ enum StreamState {
} }
enum DisconnectReason { enum DisconnectReason {
user, unknown,
peerConnectionClosed, clientInitiated,
negotiationFailed, duplicateIdentity,
signal, serverShutdown,
reconnect, participantRemoved,
leaveReconnect, roomDeleted,
stateMismatch,
joinFailure,
} }
/// The reason why a track failed to publish. /// The reason why a track failed to publish.