Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/src/core/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions lib/src/core/signal_client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
19 changes: 19 additions & 0 deletions lib/src/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}
Expand Down Expand Up @@ -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 change: 1 addition & 0 deletions lib/src/extensions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ extension ProtocolVersionExt on ProtocolVersion {
ProtocolVersion.v4: '4',
ProtocolVersion.v5: '5',
ProtocolVersion.v6: '6',
ProtocolVersion.v7: '7',
}[this]!;
}

Expand Down
9 changes: 9 additions & 0 deletions lib/src/internal/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion lib/src/options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ class ConnectOptions {
const ConnectOptions({
this.autoSubscribe = true,
this.rtcConfiguration = const RTCConfiguration(),
this.protocolVersion = ProtocolVersion.v6,
this.protocolVersion = ProtocolVersion.v7,
});
}

Expand Down
17 changes: 16 additions & 1 deletion lib/src/participant/local.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:flutter/foundation.dart';

import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
import 'package:meta/meta.dart';

Expand All @@ -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';
Expand Down Expand Up @@ -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 changes: 14 additions & 0 deletions lib/src/participant/participant.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/src/types/other.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ enum ProtocolVersion {
v4,
v5,
v6, // Session migration
v7, // Remote unpublish
}

/// Connection state type used throughout the SDK.
Expand Down
30 changes: 30 additions & 0 deletions lib/src/types/participant_permissions.dart
Original file line number Diff line number Diff line change
@@ -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,
);
}