Skip to content

Commit 48754e1

Browse files
authored
[Protocol v7] Remote unpublish & expose permissions (#101)
* fix * impl * oldPermissions * mods
1 parent cd4a3f5 commit 48754e1

File tree

10 files changed

+100
-2
lines changed

10 files changed

+100
-2
lines changed

lib/src/core/room.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
211211
} else {
212212
await publication?.unmute();
213213
}
214+
})
215+
..on<SignalTrackUnpublishedEvent>((event) async {
216+
// unpublish local track
217+
await localParticipant?.unpublishTrack(event.trackSid);
214218
});
215219

216220
void _setUpEngineListeners() => _engineListener

lib/src/core/signal_client.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,11 @@ class SignalClient extends Disposable with EventsEmittable<SignalEvent> {
170170
track: msg.trackPublished.track,
171171
));
172172
break;
173+
case lk_rtc.SignalResponse_Message.trackUnpublished:
174+
events.emit(SignalTrackUnpublishedEvent(
175+
trackSid: msg.trackUnpublished.trackSid,
176+
));
177+
break;
173178
case lk_rtc.SignalResponse_Message.speakersChanged:
174179
events.emit(
175180
SignalSpeakersChangedEvent(speakers: msg.speakersChanged.speakers));

lib/src/events.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'publication/remote.dart';
99
import 'publication/track_publication.dart';
1010
import 'track/track.dart';
1111
import 'types/other.dart';
12+
import 'types/participant_permissions.dart';
1213

1314
/// Base type for all LiveKit events.
1415
mixin LiveKitEvent {}
@@ -360,3 +361,21 @@ class TrackSubscriptionPermissionChangedEvent with RoomEvent, ParticipantEvent {
360361
'(participant: ${participant}, publication: ${publication}, '
361362
'state: ${state})';
362363
}
364+
365+
/// The [ParticipantPermissions] updated for the [Participant].
366+
/// Currently, only for [LocalParticipant].
367+
/// Emitted by [Room] and [LocalParticipant].
368+
class ParticipantPermissionsUpdatedEvent with RoomEvent, ParticipantEvent {
369+
final Participant participant;
370+
final ParticipantPermissions permissions;
371+
final ParticipantPermissions oldPermissions;
372+
const ParticipantPermissionsUpdatedEvent({
373+
required this.participant,
374+
required this.permissions,
375+
required this.oldPermissions,
376+
});
377+
378+
@override
379+
String toString() => '${runtimeType}'
380+
'(participant: ${participant}, permissions: ${permissions})';
381+
}

lib/src/extensions.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ extension ProtocolVersionExt on ProtocolVersion {
4343
ProtocolVersion.v4: '4',
4444
ProtocolVersion.v5: '5',
4545
ProtocolVersion.v6: '6',
46+
ProtocolVersion.v7: '7',
4647
}[this]!;
4748
}
4849

lib/src/internal/events.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,15 @@ class SignalLocalTrackPublishedEvent with SignalEvent, InternalEvent {
194194
});
195195
}
196196

197+
@internal
198+
class SignalTrackUnpublishedEvent with SignalEvent, InternalEvent {
199+
final String trackSid;
200+
201+
const SignalTrackUnpublishedEvent({
202+
required this.trackSid,
203+
});
204+
}
205+
197206
@internal
198207
class SignalRoomUpdateEvent with SignalEvent, InternalEvent {
199208
final lk_models.Room room;

lib/src/options.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ class ConnectOptions {
2424
const ConnectOptions({
2525
this.autoSubscribe = true,
2626
this.rtcConfiguration = const RTCConfiguration(),
27-
this.protocolVersion = ProtocolVersion.v6,
27+
this.protocolVersion = ProtocolVersion.v7,
2828
});
2929
}
3030

lib/src/participant/local.dart

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import 'package:flutter/foundation.dart';
2-
32
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
43
import 'package:meta/meta.dart';
54

@@ -17,6 +16,7 @@ import '../track/local/audio.dart';
1716
import '../track/local/local.dart';
1817
import '../track/local/video.dart';
1918
import '../types/other.dart';
19+
import '../types/participant_permissions.dart';
2020
import '../types/video_dimensions.dart';
2121
import '../utils.dart';
2222
import 'participant.dart';
@@ -339,4 +339,19 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
339339
@internal
340340
Iterable<lk_rtc.TrackPublishedResponse> publishedTracksInfo() =>
341341
trackPublications.values.map((e) => e.toPBTrackPublishedResponse());
342+
343+
@internal
344+
@override
345+
ParticipantPermissions? setPermissions(ParticipantPermissions newValue) {
346+
final oldValue = super.setPermissions(newValue);
347+
if (oldValue != null) {
348+
// notify
349+
[events, room.events].emit(ParticipantPermissionsUpdatedEvent(
350+
participant: this,
351+
permissions: newValue,
352+
oldPermissions: oldValue,
353+
));
354+
}
355+
return oldValue;
356+
}
342357
}

lib/src/participant/participant.dart

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import '../support/disposable.dart';
1212
import '../track/local/local.dart';
1313
import '../track/track.dart';
1414
import '../types/other.dart';
15+
import '../types/participant_permissions.dart';
1516
import 'local.dart';
1617
import 'remote.dart';
1718

@@ -59,6 +60,9 @@ abstract class Participant<T extends TrackPublication>
5960
/// Connection quality between the [Participant] and the server.
6061
ConnectionQuality _connectionQuality = ConnectionQuality.unknown;
6162

63+
ParticipantPermissions _permissions = const ParticipantPermissions();
64+
ParticipantPermissions get permissions => _permissions;
65+
6266
/// when the participant joined the room
6367
DateTime get joinedAt {
6468
final pi = _participantInfo;
@@ -161,6 +165,16 @@ abstract class Participant<T extends TrackPublication>
161165
_setMetadata(info.metadata);
162166
}
163167
_participantInfo = info;
168+
setPermissions(info.permission.toLKType());
169+
}
170+
171+
@internal
172+
// returns oldValue (if updated)
173+
ParticipantPermissions? setPermissions(ParticipantPermissions newValue) {
174+
if (_permissions == newValue) return null;
175+
final oldValue = _permissions;
176+
_permissions = newValue;
177+
return oldValue;
164178
}
165179

166180
/// for internal use

lib/src/types/other.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum ProtocolVersion {
1313
v4,
1414
v5,
1515
v6, // Session migration
16+
v7, // Remote unpublish
1617
}
1718

1819
/// Connection state type used throughout the SDK.
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import 'package:meta/meta.dart';
2+
3+
import '../proto/livekit_models.pb.dart' as lk_models;
4+
5+
@immutable
6+
class ParticipantPermissions {
7+
final bool canSubscribe;
8+
final bool canPublish;
9+
final bool canPublishData;
10+
final bool hidden;
11+
final bool recorder;
12+
13+
const ParticipantPermissions({
14+
this.canSubscribe = false,
15+
this.canPublish = false,
16+
this.canPublishData = false,
17+
this.hidden = false,
18+
this.recorder = false,
19+
});
20+
}
21+
22+
extension ParticipantPermissionExt on lk_models.ParticipantPermission {
23+
ParticipantPermissions toLKType() => ParticipantPermissions(
24+
canSubscribe: canSubscribe,
25+
canPublish: canPublish,
26+
canPublishData: canPublishData,
27+
hidden: hidden,
28+
recorder: recorder,
29+
);
30+
}

0 commit comments

Comments
 (0)