@@ -557,16 +557,11 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
|
|||||||
// for subscriberPrimary, we negotiate when necessary (lazy)
|
// for subscriberPrimary, we negotiate when necessary (lazy)
|
||||||
await negotiate();
|
await negotiate();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Relay to Room
|
|
||||||
events.emit(event);
|
|
||||||
})
|
})
|
||||||
..on<SignalConnectionStateUpdatedEvent>((event) async {
|
..on<SignalConnectionStateUpdatedEvent>((event) async {
|
||||||
if (event.newState == ConnectionState.disconnected) {
|
if (event.newState == ConnectionState.disconnected) {
|
||||||
await _onDisconnected(DisconnectReason.signal);
|
await _onDisconnected(DisconnectReason.signal);
|
||||||
}
|
}
|
||||||
// Relay to Room
|
|
||||||
events.emit(event);
|
|
||||||
})
|
})
|
||||||
..on<SignalOfferEvent>((event) async {
|
..on<SignalOfferEvent>((event) async {
|
||||||
if (subscriber == null) {
|
if (subscriber == null) {
|
||||||
@@ -611,20 +606,6 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
|
|||||||
await publisher!.addIceCandidate(event.candidate);
|
await publisher!.addIceCandidate(event.candidate);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
// relay to Room
|
|
||||||
..on<SignalParticipantUpdateEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalSpeakersChangedEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalConnectionQualityUpdateEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalStreamStateUpdatedEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalSubscribedQualityUpdatedEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalSubscriptionPermissionUpdateEvent>((event) => events.emit(event))
|
|
||||||
// relay to Room
|
|
||||||
..on<SignalRoomUpdateEvent>((event) => events.emit(event))
|
|
||||||
..on<SignalTokenUpdatedEvent>((event) {
|
..on<SignalTokenUpdatedEvent>((event) {
|
||||||
logger.fine('Server refreshed the token');
|
logger.fine('Server refreshed the token');
|
||||||
token = event.token;
|
token = event.token;
|
||||||
@@ -636,12 +617,7 @@ class Engine extends Disposable with EventsEmittable<EngineEvent> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await cleanUp();
|
await cleanUp();
|
||||||
})
|
});
|
||||||
..on<SignalMuteTrackEvent>(
|
|
||||||
(event) => events.emit(EngineRemoteMuteChangedEvent(
|
|
||||||
sid: event.sid,
|
|
||||||
muted: event.muted,
|
|
||||||
)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extension EnginePrivateMethods on Engine {
|
extension EnginePrivateMethods on Engine {
|
||||||
|
|||||||
+43
-34
@@ -73,6 +73,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
final Engine engine;
|
final Engine engine;
|
||||||
// suppport for multiple event listeners
|
// suppport for multiple event listeners
|
||||||
late final EventsListener<EngineEvent> _engineListener;
|
late final EventsListener<EngineEvent> _engineListener;
|
||||||
|
//
|
||||||
|
late final EventsListener<SignalEvent> _signalListener;
|
||||||
|
|
||||||
Room({
|
Room({
|
||||||
ConnectOptions? connectOptions,
|
ConnectOptions? connectOptions,
|
||||||
@@ -82,7 +84,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
_roomOptions = roomOptions,
|
_roomOptions = roomOptions,
|
||||||
engine = engine ?? Engine() {
|
engine = engine ?? Engine() {
|
||||||
_engineListener = this.engine.createListener();
|
_engineListener = this.engine.createListener();
|
||||||
_setUpListeners();
|
_setUpEngineListeners();
|
||||||
|
|
||||||
|
_signalListener = this.engine.signalClient.createListener();
|
||||||
|
_setUpSignalListeners();
|
||||||
|
|
||||||
// Any event emitted will trigger ChangeNotifier
|
// Any event emitted will trigger ChangeNotifier
|
||||||
events.listen((event) {
|
events.listen((event) {
|
||||||
@@ -97,7 +102,9 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
await events.dispose();
|
await events.dispose();
|
||||||
// dispose local participant
|
// dispose local participant
|
||||||
await localParticipant?.dispose();
|
await localParticipant?.dispose();
|
||||||
// dispose all listeners for RTCEngine
|
// dispose all listeners for SignalClient
|
||||||
|
await _signalListener.dispose();
|
||||||
|
// dispose all listeners for Engine
|
||||||
await _engineListener.dispose();
|
await _engineListener.dispose();
|
||||||
// dispose the engine
|
// dispose the engine
|
||||||
await this.engine.dispose();
|
await this.engine.dispose();
|
||||||
@@ -117,27 +124,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
return engine.connect(url, token, this.connectOptions);
|
return engine.connect(url, token, this.connectOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _setUpListeners() => _engineListener
|
void _setUpSignalListeners() => _signalListener
|
||||||
..on<EngineConnectionStateUpdatedEvent>((event) async {
|
|
||||||
if (event.didReconnect) {
|
|
||||||
events.emit(const RoomReconnectedEvent());
|
|
||||||
await _handlePostReconnect(false);
|
|
||||||
} else if (event.newState == ConnectionState.reconnecting) {
|
|
||||||
events.emit(const RoomReconnectingEvent());
|
|
||||||
} else if (event.newState == ConnectionState.disconnected) {
|
|
||||||
await _cleanUp();
|
|
||||||
events.emit(const RoomDisconnectedEvent());
|
|
||||||
}
|
|
||||||
// always notify ChangeNotifier
|
|
||||||
notifyListeners();
|
|
||||||
})
|
|
||||||
..on<SignalConnectionStateUpdatedEvent>((event) {
|
|
||||||
// during reconnection, need to send sync state upon signal connection.
|
|
||||||
if (event.didReconnect) {
|
|
||||||
logger.fine('Sending syncState');
|
|
||||||
_sendSyncState();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
..on<SignalJoinResponseEvent>((event) {
|
..on<SignalJoinResponseEvent>((event) {
|
||||||
_sid = event.response.room.sid;
|
_sid = event.response.room.sid;
|
||||||
_name = event.response.room.name;
|
_name = event.response.room.name;
|
||||||
@@ -163,23 +150,12 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
})
|
})
|
||||||
..on<SignalParticipantUpdateEvent>(
|
..on<SignalParticipantUpdateEvent>(
|
||||||
(event) => _onParticipantUpdateEvent(event.participants))
|
(event) => _onParticipantUpdateEvent(event.participants))
|
||||||
..on<EngineActiveSpeakersUpdateEvent>(
|
|
||||||
(event) => _onEngineActiveSpeakersUpdateEvent(event.speakers))
|
|
||||||
..on<SignalSpeakersChangedEvent>(
|
..on<SignalSpeakersChangedEvent>(
|
||||||
(event) => _onSignalSpeakersChangedEvent(event.speakers))
|
(event) => _onSignalSpeakersChangedEvent(event.speakers))
|
||||||
..on<SignalConnectionQualityUpdateEvent>(
|
..on<SignalConnectionQualityUpdateEvent>(
|
||||||
(event) => _onSignalConnectionQualityUpdateEvent(event.updates))
|
(event) => _onSignalConnectionQualityUpdateEvent(event.updates))
|
||||||
..on<SignalStreamStateUpdatedEvent>(
|
..on<SignalStreamStateUpdatedEvent>(
|
||||||
(event) => _onSignalStreamStateUpdateEvent(event.updates))
|
(event) => _onSignalStreamStateUpdateEvent(event.updates))
|
||||||
..on<EngineDataPacketReceivedEvent>(_onDataMessageEvent)
|
|
||||||
..on<EngineRemoteMuteChangedEvent>((event) async {
|
|
||||||
final publication = localParticipant?.trackPublications[event.sid];
|
|
||||||
if (event.muted) {
|
|
||||||
await publication?.mute();
|
|
||||||
} else {
|
|
||||||
await publication?.unmute();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
..on<SignalSubscribedQualityUpdatedEvent>((event) {
|
..on<SignalSubscribedQualityUpdatedEvent>((event) {
|
||||||
// Signal for Dynacast
|
// Signal for Dynacast
|
||||||
final options = roomOptions ?? const RoomOptions();
|
final options = roomOptions ?? const RoomOptions();
|
||||||
@@ -221,6 +197,39 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
|
|||||||
_metadata = event.room.metadata;
|
_metadata = event.room.metadata;
|
||||||
events.emit(RoomMetadataChangedEvent(metadata: event.room.metadata));
|
events.emit(RoomMetadataChangedEvent(metadata: event.room.metadata));
|
||||||
})
|
})
|
||||||
|
..on<SignalConnectionStateUpdatedEvent>((event) {
|
||||||
|
// during reconnection, need to send sync state upon signal connection.
|
||||||
|
if (event.didReconnect) {
|
||||||
|
logger.fine('Sending syncState');
|
||||||
|
_sendSyncState();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
..on<SignalRemoteMuteTrackEvent>((event) async {
|
||||||
|
final publication = localParticipant?.trackPublications[event.sid];
|
||||||
|
if (event.muted) {
|
||||||
|
await publication?.mute();
|
||||||
|
} else {
|
||||||
|
await publication?.unmute();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
void _setUpEngineListeners() => _engineListener
|
||||||
|
..on<EngineConnectionStateUpdatedEvent>((event) async {
|
||||||
|
if (event.didReconnect) {
|
||||||
|
events.emit(const RoomReconnectedEvent());
|
||||||
|
await _handlePostReconnect(false);
|
||||||
|
} else if (event.newState == ConnectionState.reconnecting) {
|
||||||
|
events.emit(const RoomReconnectingEvent());
|
||||||
|
} else if (event.newState == ConnectionState.disconnected) {
|
||||||
|
await _cleanUp();
|
||||||
|
events.emit(const RoomDisconnectedEvent());
|
||||||
|
}
|
||||||
|
// always notify ChangeNotifier
|
||||||
|
notifyListeners();
|
||||||
|
})
|
||||||
|
..on<EngineActiveSpeakersUpdateEvent>(
|
||||||
|
(event) => _onEngineActiveSpeakersUpdateEvent(event.speakers))
|
||||||
|
..on<EngineDataPacketReceivedEvent>(_onDataMessageEvent)
|
||||||
..on<EngineTrackAddedEvent>((event) async {
|
..on<EngineTrackAddedEvent>((event) async {
|
||||||
logger.fine('EngineTrackAddedEvent trackSid:${event.track.id}');
|
logger.fine('EngineTrackAddedEvent trackSid:${event.track.id}');
|
||||||
|
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
|
|||||||
events.emit(SignalLeaveEvent(canReconnect: msg.leave.canReconnect));
|
events.emit(SignalLeaveEvent(canReconnect: msg.leave.canReconnect));
|
||||||
break;
|
break;
|
||||||
case lk_rtc.SignalResponse_Message.mute:
|
case lk_rtc.SignalResponse_Message.mute:
|
||||||
events.emit(SignalMuteTrackEvent(
|
events.emit(SignalRemoteMuteTrackEvent(
|
||||||
sid: msg.mute.sid,
|
sid: msg.mute.sid,
|
||||||
muted: msg.mute.muted,
|
muted: msg.mute.muted,
|
||||||
));
|
));
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ class InternalTrackMuteUpdatedEvent with TrackEvent, InternalEvent {
|
|||||||
|
|
||||||
@internal
|
@internal
|
||||||
// Received a JoinResponse from the server.
|
// Received a JoinResponse from the server.
|
||||||
class SignalJoinResponseEvent with SignalEvent, EngineEvent, InternalEvent {
|
class SignalJoinResponseEvent with SignalEvent, InternalEvent {
|
||||||
final lk_rtc.JoinResponse response;
|
final lk_rtc.JoinResponse response;
|
||||||
const SignalJoinResponseEvent({
|
const SignalJoinResponseEvent({
|
||||||
required this.response,
|
required this.response,
|
||||||
@@ -91,7 +91,7 @@ class SignalJoinResponseEvent with SignalEvent, EngineEvent, InternalEvent {
|
|||||||
|
|
||||||
/// Base class for a ConnectionStateUpdated event
|
/// Base class for a ConnectionStateUpdated event
|
||||||
@internal
|
@internal
|
||||||
abstract class ConnectionStateUpdatedEvent with EngineEvent, InternalEvent {
|
abstract class ConnectionStateUpdatedEvent with InternalEvent {
|
||||||
final ConnectionState newState;
|
final ConnectionState newState;
|
||||||
final ConnectionState oldState;
|
final ConnectionState oldState;
|
||||||
final bool didReconnect;
|
final bool didReconnect;
|
||||||
@@ -168,8 +168,7 @@ class SignalTrickleEvent with SignalEvent, InternalEvent {
|
|||||||
|
|
||||||
@internal
|
@internal
|
||||||
// relayed by Engine
|
// relayed by Engine
|
||||||
class SignalParticipantUpdateEvent
|
class SignalParticipantUpdateEvent with SignalEvent, InternalEvent {
|
||||||
with SignalEvent, EngineEvent, InternalEvent {
|
|
||||||
final List<lk_models.ParticipantInfo> participants;
|
final List<lk_models.ParticipantInfo> participants;
|
||||||
const SignalParticipantUpdateEvent({
|
const SignalParticipantUpdateEvent({
|
||||||
required this.participants,
|
required this.participants,
|
||||||
@@ -177,8 +176,7 @@ class SignalParticipantUpdateEvent
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalConnectionQualityUpdateEvent
|
class SignalConnectionQualityUpdateEvent with SignalEvent, InternalEvent {
|
||||||
with SignalEvent, EngineEvent, InternalEvent {
|
|
||||||
final List<lk_rtc.ConnectionQualityInfo> updates;
|
final List<lk_rtc.ConnectionQualityInfo> updates;
|
||||||
const SignalConnectionQualityUpdateEvent({
|
const SignalConnectionQualityUpdateEvent({
|
||||||
required this.updates,
|
required this.updates,
|
||||||
@@ -197,7 +195,7 @@ class SignalLocalTrackPublishedEvent with SignalEvent, InternalEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalRoomUpdateEvent with SignalEvent, EngineEvent, InternalEvent {
|
class SignalRoomUpdateEvent with SignalEvent, InternalEvent {
|
||||||
final lk_models.Room room;
|
final lk_models.Room room;
|
||||||
|
|
||||||
const SignalRoomUpdateEvent({required this.room});
|
const SignalRoomUpdateEvent({required this.room});
|
||||||
@@ -206,7 +204,7 @@ class SignalRoomUpdateEvent with SignalEvent, EngineEvent, InternalEvent {
|
|||||||
@internal
|
@internal
|
||||||
// Speaker update received through websocket
|
// Speaker update received through websocket
|
||||||
// relayed by Engine
|
// relayed by Engine
|
||||||
class SignalSpeakersChangedEvent with SignalEvent, EngineEvent, InternalEvent {
|
class SignalSpeakersChangedEvent with SignalEvent, InternalEvent {
|
||||||
final List<lk_models.SpeakerInfo> speakers;
|
final List<lk_models.SpeakerInfo> speakers;
|
||||||
|
|
||||||
const SignalSpeakersChangedEvent({
|
const SignalSpeakersChangedEvent({
|
||||||
@@ -232,18 +230,17 @@ class SignalLeaveEvent with SignalEvent, InternalEvent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalMuteTrackEvent with SignalEvent, InternalEvent {
|
class SignalRemoteMuteTrackEvent with SignalEvent, InternalEvent {
|
||||||
final String sid;
|
final String sid;
|
||||||
final bool muted;
|
final bool muted;
|
||||||
const SignalMuteTrackEvent({
|
const SignalRemoteMuteTrackEvent({
|
||||||
required this.sid,
|
required this.sid,
|
||||||
required this.muted,
|
required this.muted,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalStreamStateUpdatedEvent
|
class SignalStreamStateUpdatedEvent with SignalEvent, InternalEvent {
|
||||||
with SignalEvent, EngineEvent, InternalEvent {
|
|
||||||
final List<lk_rtc.StreamStateInfo> updates;
|
final List<lk_rtc.StreamStateInfo> updates;
|
||||||
const SignalStreamStateUpdatedEvent({
|
const SignalStreamStateUpdatedEvent({
|
||||||
required this.updates,
|
required this.updates,
|
||||||
@@ -251,8 +248,7 @@ class SignalStreamStateUpdatedEvent
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalSubscribedQualityUpdatedEvent
|
class SignalSubscribedQualityUpdatedEvent with SignalEvent, InternalEvent {
|
||||||
with SignalEvent, EngineEvent, InternalEvent {
|
|
||||||
final String trackSid;
|
final String trackSid;
|
||||||
final List<lk_rtc.SubscribedQuality> updates;
|
final List<lk_rtc.SubscribedQuality> updates;
|
||||||
const SignalSubscribedQualityUpdatedEvent({
|
const SignalSubscribedQualityUpdatedEvent({
|
||||||
@@ -262,8 +258,7 @@ class SignalSubscribedQualityUpdatedEvent
|
|||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
class SignalSubscriptionPermissionUpdateEvent
|
class SignalSubscriptionPermissionUpdateEvent with SignalEvent, InternalEvent {
|
||||||
with SignalEvent, EngineEvent, InternalEvent {
|
|
||||||
final String participantSid;
|
final String participantSid;
|
||||||
final String trackSid;
|
final String trackSid;
|
||||||
final bool allowed;
|
final bool allowed;
|
||||||
@@ -308,16 +303,6 @@ class EngineDataPacketReceivedEvent with EngineEvent, InternalEvent {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@internal
|
|
||||||
class EngineRemoteMuteChangedEvent with EngineEvent, InternalEvent {
|
|
||||||
final String sid;
|
|
||||||
final bool muted;
|
|
||||||
const EngineRemoteMuteChangedEvent({
|
|
||||||
required this.sid,
|
|
||||||
required this.muted,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@internal
|
@internal
|
||||||
abstract class DataChannelStateUpdatedEvent with EngineEvent, InternalEvent {
|
abstract class DataChannelStateUpdatedEvent with EngineEvent, InternalEvent {
|
||||||
final bool isPrimary;
|
final bool isPrimary;
|
||||||
|
|||||||
Reference in New Issue
Block a user