[Protocol v7] Remote unpublish & expose permissions (#101)

* fix

* impl

* oldPermissions

* mods
This commit is contained in:
Hiroshi Horie
2022-04-04 16:09:15 +09:00
committed by GitHub
parent cd4a3f5c8a
commit 48754e1672
10 changed files with 100 additions and 2 deletions
+4
View File
@@ -211,6 +211,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
} else { } else {
await publication?.unmute(); await publication?.unmute();
} }
})
..on<SignalTrackUnpublishedEvent>((event) async {
// unpublish local track
await localParticipant?.unpublishTrack(event.trackSid);
}); });
void _setUpEngineListeners() => _engineListener void _setUpEngineListeners() => _engineListener
+5
View File
@@ -170,6 +170,11 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
track: msg.trackPublished.track, track: msg.trackPublished.track,
)); ));
break; break;
case lk_rtc.SignalResponse_Message.trackUnpublished:
events.emit(SignalTrackUnpublishedEvent(
trackSid: msg.trackUnpublished.trackSid,
));
break;
case lk_rtc.SignalResponse_Message.speakersChanged: case lk_rtc.SignalResponse_Message.speakersChanged:
events.emit( events.emit(
SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers)); SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers));
+19
View File
@@ -9,6 +9,7 @@ import 'publication/remote.dart';
import 'publication/track_publication.dart'; import 'publication/track_publication.dart';
import 'track/track.dart'; import 'track/track.dart';
import 'types/other.dart'; import 'types/other.dart';
import 'types/participant_permissions.dart';
/// Base type for all LiveKit events. /// Base type for all LiveKit events.
mixin LiveKitEvent {} mixin LiveKitEvent {}
@@ -360,3 +361,21 @@ class TrackSubscriptionPermissionChangedEvent with RoomEvent, ParticipantEvent {
'(participant: ${participant}, publication: ${publication}, ' '(participant: ${participant}, publication: ${publication}, '
'state: ${state})'; 'state: ${state})';
} }
/// The [ParticipantPermissions] updated for the [Participant].
/// Currently, only for [LocalParticipant].
/// Emitted by [Room] and [LocalParticipant].
class ParticipantPermissionsUpdatedEvent with RoomEvent, ParticipantEvent {
final Participant participant;
final ParticipantPermissions permissions;
final ParticipantPermissions oldPermissions;
const ParticipantPermissionsUpdatedEvent({
required this.participant,
required this.permissions,
required this.oldPermissions,
});
@override
String toString() => '${runtimeType}'
'(participant: ${participant}, permissions: ${permissions})';
}
+1
View File
@@ -43,6 +43,7 @@ extension ProtocolVersionExt on ProtocolVersion {
ProtocolVersion.v4: '4', ProtocolVersion.v4: '4',
ProtocolVersion.v5: '5', ProtocolVersion.v5: '5',
ProtocolVersion.v6: '6', ProtocolVersion.v6: '6',
ProtocolVersion.v7: '7',
}[this]!; }[this]!;
} }
+9
View File
@@ -194,6 +194,15 @@ class SignalLocalTrackPublishedEvent with SignalEvent, InternalEvent {
}); });
} }
@internal
class SignalTrackUnpublishedEvent with SignalEvent, InternalEvent {
final String trackSid;
const SignalTrackUnpublishedEvent({
required this.trackSid,
});
}
@internal @internal
class SignalRoomUpdateEvent with SignalEvent, InternalEvent { class SignalRoomUpdateEvent with SignalEvent, InternalEvent {
final lk_models.Room room; final lk_models.Room room;
+1 -1
View File
@@ -24,7 +24,7 @@ class ConnectOptions {
const ConnectOptions({ const ConnectOptions({
this.autoSubscribe = true, this.autoSubscribe = true,
this.rtcConfiguration = const RTCConfiguration(), this.rtcConfiguration = const RTCConfiguration(),
this.protocolVersion = ProtocolVersion.v6, this.protocolVersion = ProtocolVersion.v7,
}); });
} }
+16 -1
View File
@@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc; import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
@@ -17,6 +16,7 @@ import '../track/local/audio.dart';
import '../track/local/local.dart'; import '../track/local/local.dart';
import '../track/local/video.dart'; import '../track/local/video.dart';
import '../types/other.dart'; import '../types/other.dart';
import '../types/participant_permissions.dart';
import '../types/video_dimensions.dart'; import '../types/video_dimensions.dart';
import '../utils.dart'; import '../utils.dart';
import 'participant.dart'; import 'participant.dart';
@@ -339,4 +339,19 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
@internal @internal
Iterable<lk_rtc.TrackPublishedResponse> publishedTracksInfo() => Iterable<lk_rtc.TrackPublishedResponse> publishedTracksInfo() =>
trackPublications.values.map((e) => e.toPBTrackPublishedResponse()); trackPublications.values.map((e) => e.toPBTrackPublishedResponse());
@internal
@override
ParticipantPermissions? setPermissions(ParticipantPermissions newValue) {
final oldValue = super.setPermissions(newValue);
if (oldValue != null) {
// notify
[events, room.events].emit(ParticipantPermissionsUpdatedEvent(
participant: this,
permissions: newValue,
oldPermissions: oldValue,
));
}
return oldValue;
}
} }
+14
View File
@@ -12,6 +12,7 @@ import '../support/disposable.dart';
import '../track/local/local.dart'; import '../track/local/local.dart';
import '../track/track.dart'; import '../track/track.dart';
import '../types/other.dart'; import '../types/other.dart';
import '../types/participant_permissions.dart';
import 'local.dart'; import 'local.dart';
import 'remote.dart'; import 'remote.dart';
@@ -59,6 +60,9 @@ abstract class Participant<T extends TrackPublication>
/// Connection quality between the [Participant] and the server. /// Connection quality between the [Participant] and the server.
ConnectionQuality _connectionQuality = ConnectionQuality.unknown; ConnectionQuality _connectionQuality = ConnectionQuality.unknown;
ParticipantPermissions _permissions = const ParticipantPermissions();
ParticipantPermissions get permissions => _permissions;
/// when the participant joined the room /// when the participant joined the room
DateTime get joinedAt { DateTime get joinedAt {
final pi = _participantInfo; final pi = _participantInfo;
@@ -161,6 +165,16 @@ abstract class Participant<T extends TrackPublication>
_setMetadata(info.metadata); _setMetadata(info.metadata);
} }
_participantInfo = info; _participantInfo = info;
setPermissions(info.permission.toLKType());
}
@internal
// returns oldValue (if updated)
ParticipantPermissions? setPermissions(ParticipantPermissions newValue) {
if (_permissions == newValue) return null;
final oldValue = _permissions;
_permissions = newValue;
return oldValue;
} }
/// for internal use /// for internal use
+1
View File
@@ -13,6 +13,7 @@ enum ProtocolVersion {
v4, v4,
v5, v5,
v6, // Session migration v6, // Session migration
v7, // Remote unpublish
} }
/// Connection state type used throughout the SDK. /// Connection state type used throughout the SDK.
@@ -0,0 +1,30 @@
import 'package:meta/meta.dart';
import '../proto/livekit_models.pb.dart' as lk_models;
@immutable
class ParticipantPermissions {
final bool canSubscribe;
final bool canPublish;
final bool canPublishData;
final bool hidden;
final bool recorder;
const ParticipantPermissions({
this.canSubscribe = false,
this.canPublish = false,
this.canPublishData = false,
this.hidden = false,
this.recorder = false,
});
}
extension ParticipantPermissionExt on lk_models.ParticipantPermission {
ParticipantPermissions toLKType() => ParticipantPermissions(
canSubscribe: canSubscribe,
canPublish: canPublish,
canPublishData: canPublishData,
hidden: hidden,
recorder: recorder,
);
}