[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 {
await publication?.unmute();
}
})
..on<SignalTrackUnpublishedEvent>((event) async {
// unpublish local track
await localParticipant?.unpublishTrack(event.trackSid);
});
void _setUpEngineListeners() => _engineListener
+5
View File
@@ -170,6 +170,11 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
track: msg.trackPublished.track,
));
break;
case lk_rtc.SignalResponse_Message.trackUnpublished:
events.emit(SignalTrackUnpublishedEvent(
trackSid: msg.trackUnpublished.trackSid,
));
break;
case lk_rtc.SignalResponse_Message.speakersChanged:
events.emit(
SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers));
+19
View File
@@ -9,6 +9,7 @@ import 'publication/remote.dart';
import 'publication/track_publication.dart';
import 'track/track.dart';
import 'types/other.dart';
import 'types/participant_permissions.dart';
/// Base type for all LiveKit events.
mixin LiveKitEvent {}
@@ -360,3 +361,21 @@ class TrackSubscriptionPermissionChangedEvent with RoomEvent, ParticipantEvent {
'(participant: ${participant}, publication: ${publication}, '
'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.v5: '5',
ProtocolVersion.v6: '6',
ProtocolVersion.v7: '7',
}[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
class SignalRoomUpdateEvent with SignalEvent, InternalEvent {
final lk_models.Room room;
+1 -1
View File
@@ -24,7 +24,7 @@ class ConnectOptions {
const ConnectOptions({
this.autoSubscribe = true,
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_webrtc/flutter_webrtc.dart' as rtc;
import 'package:meta/meta.dart';
@@ -17,6 +16,7 @@ import '../track/local/audio.dart';
import '../track/local/local.dart';
import '../track/local/video.dart';
import '../types/other.dart';
import '../types/participant_permissions.dart';
import '../types/video_dimensions.dart';
import '../utils.dart';
import 'participant.dart';
@@ -339,4 +339,19 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
@internal
Iterable<lk_rtc.TrackPublishedResponse> publishedTracksInfo() =>
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/track.dart';
import '../types/other.dart';
import '../types/participant_permissions.dart';
import 'local.dart';
import 'remote.dart';
@@ -59,6 +60,9 @@ abstract class Participant<T extends TrackPublication>
/// Connection quality between the [Participant] and the server.
ConnectionQuality _connectionQuality = ConnectionQuality.unknown;
ParticipantPermissions _permissions = const ParticipantPermissions();
ParticipantPermissions get permissions => _permissions;
/// when the participant joined the room
DateTime get joinedAt {
final pi = _participantInfo;
@@ -161,6 +165,16 @@ abstract class Participant<T extends TrackPublication>
_setMetadata(info.metadata);
}
_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
+1
View File
@@ -13,6 +13,7 @@ enum ProtocolVersion {
v4,
v5,
v6, // Session migration
v7, // Remote unpublish
}
/// 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,
);
}