[Protocol v7] Remote unpublish & expose permissions (#101)
* fix * impl * oldPermissions * mods
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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})';
|
||||||
|
}
|
||||||
|
|||||||
@@ -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]!;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user