diff --git a/lib/src/core/engine.dart b/lib/src/core/engine.dart index 6e8b2c8..6ab4995 100644 --- a/lib/src/core/engine.dart +++ b/lib/src/core/engine.dart @@ -656,6 +656,8 @@ class Engine extends Disposable with EventsEmittable { ..on((event) => events.emit(event)) // relay to Room ..on((event) => events.emit(event)) + // relay to Room + ..on((event) => events.emit(event)) ..on((event) { logger.fine('Server refreshed the token'); token = event.token; diff --git a/lib/src/core/room.dart b/lib/src/core/room.dart index 63bb202..7c7f96a 100644 --- a/lib/src/core/room.dart +++ b/lib/src/core/room.dart @@ -52,6 +52,9 @@ class Room extends DisposableChangeNotifier with EventsEmittable { /// sid of the room String? sid; + /// metadata of the room + String? metadata; + /// Server version String? get serverVersion => _serverVersion; String? _serverVersion; @@ -202,6 +205,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable { // await publication.updateSubscriptionAllowed(event.allowed); }) + ..on((event) async { + metadata = event.room.metadata; + events.emit(RoomMetadataChangedEvent(metadata: event.room.metadata)); + }) ..on((event) async { logger.fine('EngineTrackAddedEvent trackSid:${event.track.id}'); diff --git a/lib/src/core/signal_client.dart b/lib/src/core/signal_client.dart index dbfbccd..e16ee42 100644 --- a/lib/src/core/signal_client.dart +++ b/lib/src/core/signal_client.dart @@ -176,7 +176,7 @@ class SignalClient extends Disposable with EventsEmittable { SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers)); break; case lk_rtc.SignalResponse_Message.roomUpdate: - // TODO + events.emit(SignalRoomUpdateEvent(room: msg.roomUpdate.room)); break; case lk_rtc.SignalResponse_Message.connectionQuality: events.emit(SignalConnectionQualityUpdateEvent( diff --git a/lib/src/events.dart b/lib/src/events.dart index 802fb6a..20affd7 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -56,11 +56,25 @@ class RoomDisconnectedEvent with RoomEvent { String toString() => '${runtimeType}()'; } +/// Room metadata has changed. +/// Emitted by [Room]. +class RoomMetadataChangedEvent with RoomEvent { + final String? metadata; + + const RoomMetadataChangedEvent({ + required this.metadata, + }); + + @override + String toString() => '${runtimeType}()'; +} + /// When a new [RemoteParticipant] joins *after* the current participant has connected /// It will not fire for participants that are already in the room /// Emitted by [Room]. class ParticipantConnectedEvent with RoomEvent { final RemoteParticipant participant; + const ParticipantConnectedEvent({ required this.participant, }); diff --git a/lib/src/internal/events.dart b/lib/src/internal/events.dart index ae191d1..3a123f3 100644 --- a/lib/src/internal/events.dart +++ b/lib/src/internal/events.dart @@ -155,17 +155,26 @@ class SignalConnectionQualityUpdateEvent class SignalLocalTrackPublishedEvent with SignalEvent, InternalEvent { final String cid; final lk_models.TrackInfo track; + const SignalLocalTrackPublishedEvent({ required this.cid, required this.track, }); } +@internal +class SignalRoomUpdateEvent with SignalEvent, EngineEvent, InternalEvent { + final lk_models.Room room; + + const SignalRoomUpdateEvent({required this.room}); +} + @internal // Speaker update received through websocket // relayed by Engine class SignalSpeakersChangedEvent with SignalEvent, EngineEvent, InternalEvent { final List speakers; + const SignalSpeakersChangedEvent({ required this.speakers, }); diff --git a/test/core/room_e2e_test.dart b/test/core/room_e2e_test.dart index 8581486..def7942 100644 --- a/test/core/room_e2e_test.dart +++ b/test/core/room_e2e_test.dart @@ -84,10 +84,15 @@ void main() { ); }); - test('room update', () async { + test('room metadata update', () async { + expect( + room.events.streamCtrl.stream, + emits(predicate((event) => + event.metadata == roomUpdateResponse.roomUpdate.room.metadata && + room.metadata == event.metadata)), + ); ws.onData(roomUpdateResponse.writeToBuffer()); - // TODO: room update event and handling - }, skip: 'todo'); + }); test('connection quality', () async { expect(