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
..on<RoomDisconnectedEvent>((_) async {
..on<RoomDisconnectedEvent>((event) async {
if (event.reason != null) {
print('Room disconnected: reason => ${event.reason}');
}
WidgetsBindingCompatible.instance
?.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 '../support/disposable.dart';
import '../support/websocket.dart';
import '../types/internal.dart';
import '../types/other.dart';
import '../types/video_dimensions.dart';
import '../utils.dart';
@@ -220,7 +221,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
if (error is NegotiationError) {
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) {
if (event.state.isDisconnectedOrFailed()) {
handleDisconnect(DisconnectReason.reconnect);
handleDisconnect(ClientDisconnectReason.reconnect);
} 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
.info('onDisconnected state:${_connectionState} reason:${reason.name}');
@@ -544,9 +545,9 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
fullReconnect = _clientConfiguration?.resumeConnection ==
lk_models.ClientConfigSetting.DISABLED ||
[
DisconnectReason.leaveReconnect,
DisconnectReason.negotiationFailed,
DisconnectReason.peerConnectionClosed
ClientDisconnectReason.leaveReconnect,
ClientDisconnectReason.negotiationFailed,
ClientDisconnectReason.peerConnectionClosed
].contains(reason);
}
@@ -732,7 +733,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
})
..on<SignalConnectionStateUpdatedEvent>((event) async {
if (event.newState == ConnectionState.disconnected) {
await handleDisconnect(DisconnectReason.signal);
await handleDisconnect(ClientDisconnectReason.signal);
}
})
..on<SignalOfferEvent>((event) async {
@@ -788,14 +789,15 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
// reconnect immediately instead of waiting for next attempt
_connectionState = ConnectionState.reconnecting;
_updateConnectionState(ConnectionState.reconnecting);
await handleDisconnect(DisconnectReason.leaveReconnect);
await handleDisconnect(ClientDisconnectReason.leaveReconnect);
} else {
if (_connectionState == ConnectionState.reconnecting) {
logger.warning(
'[Signal] Received Leave while engine is reconnecting, ignoring...');
return;
}
_updateConnectionState(ConnectionState.disconnected);
_updateConnectionState(ConnectionState.disconnected,
reason: event.reason.toSDKType());
await cleanUp();
}
});
@@ -811,7 +813,8 @@ extension EnginePrivateMethods on Engine {
_publisherDataChannel(reliability)?.state ??
rtc.RTCDataChannelState.RTCDataChannelClosed;
void _updateConnectionState(ConnectionState newValue) {
void _updateConnectionState(ConnectionState newValue,
{DisconnectReason? reason}) {
if (_connectionState == newValue) return;
logger.fine('Engine ConnectionState '
@@ -828,6 +831,7 @@ extension EnginePrivateMethods on Engine {
oldState: oldState,
didReconnect: didReconnect,
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) {
if (!event.fullReconnect) {
await _cleanUp();
events.emit(const RoomDisconnectedEvent());
events.emit(RoomDisconnectedEvent(reason: event.disconnectReason));
}
}
// always notify ChangeNotifier
+2 -1
View File
@@ -210,7 +210,8 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
));
break;
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;
case lk_rtc.SignalResponse_Message.mute:
events.emit(SignalRemoteMuteTrackEvent(
+5 -2
View File
@@ -65,10 +65,13 @@ class RoomRestartedEvent with RoomEvent {
/// Disconnected from the room
/// Emitted by [Room].
class RoomDisconnectedEvent with RoomEvent {
const RoomDisconnectedEvent();
DisconnectReason? reason;
RoomDisconnectedEvent({
this.reason,
});
@override
String toString() => '${runtimeType}()';
String toString() => '${runtimeType}($reason)';
}
/// 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
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
class SignalLeaveEvent with SignalEvent, InternalEvent {
final bool canReconnect;
final lk_models.DisconnectReason reason;
const SignalLeaveEvent({
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 {
user,
peerConnectionClosed,
negotiationFailed,
signal,
reconnect,
leaveReconnect,
unknown,
clientInitiated,
duplicateIdentity,
serverShutdown,
participantRemoved,
roomDeleted,
stateMismatch,
joinFailure,
}
/// The reason why a track failed to publish.