Skip to content

Commit

Permalink
Rename some parameters. (#435)
Browse files Browse the repository at this point in the history
* rename some parameters.

* fix.

* fix.

* update.

* mapping RemoteParticipant by identites.
  • Loading branch information
cloudwebrtc authored Jan 8, 2024
1 parent dcffb22 commit 668e22f
Show file tree
Hide file tree
Showing 8 changed files with 201 additions and 82 deletions.
2 changes: 1 addition & 1 deletion example/lib/pages/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class _RoomPageState extends State<RoomPage> {
void _sortParticipants() {
List<ParticipantTrack> userMediaTracks = [];
List<ParticipantTrack> screenTracks = [];
for (var participant in widget.room.participants.values) {
for (var participant in widget.room.remoteParticipants.values) {
for (var t in participant.videoTracks) {
if (t.isScreenShare) {
screenTracks.add(ParticipantTrack(
Expand Down
108 changes: 69 additions & 39 deletions lib/src/core/room.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
ConnectOptions get connectOptions => engine.connectOptions;
RoomOptions get roomOptions => engine.roomOptions;

/// map of SID to RemoteParticipant
UnmodifiableMapView<String, RemoteParticipant> get participants =>
UnmodifiableMapView(_participants);
final _participants = <String, RemoteParticipant>{};
/// map of identity: [[RemoteParticipant]]
UnmodifiableMapView<String, RemoteParticipant> get remoteParticipants =>
UnmodifiableMapView(_remoteParticipants);
final _remoteParticipants = <String, RemoteParticipant>{};
final Map<String, String> _sidToIdentity = <String, String>{};

/// the current participant
LocalParticipant? get localParticipant => _localParticipant;
Expand Down Expand Up @@ -250,9 +251,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
}

for (final info in event.response.otherParticipants) {
logger.fine('Creating RemoteParticipant: ${info.sid}(${info.identity}) '
logger.fine(
'Creating RemoteParticipant: sid = ${info.sid}(identity:${info.identity}) '
'tracks:${info.tracks.map((e) => e.sid)}');
_getOrCreateRemoteParticipant(info.sid, info);
_getOrCreateRemoteParticipant(info.identity, info);
}

if (e2eeManager != null && event.response.sifTrailer.isNotEmpty) {
Expand Down Expand Up @@ -314,12 +316,12 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
'allowed:${event.allowed}');

// find participant
final participant = _participants[event.participantSid];
final participant = _getRemoteParticipantBySid(event.participantSid);
if (participant == null) {
return;
}
// find track
final publication = participant.trackPublications[event.trackSid];
final publication = participant.getTrackPublicationBySid(event.trackSid);
if (publication == null) {
return;
}
Expand Down Expand Up @@ -365,9 +367,10 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
events.emit(const RoomRestartingEvent());

// clean up RemoteParticipants
var copy = _participants.values.toList();
var copy = _remoteParticipants.values.toList();

_participants.clear();
_remoteParticipants.clear();
_sidToIdentity.clear();
_activeSpeakers.clear();
// reset params
_name = null;
Expand All @@ -388,7 +391,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
// re-publish all tracks
await localParticipant?.rePublishAllTracks();

for (var participant in participants.values) {
for (var participant in remoteParticipants.values) {
for (var pub in participant.trackPublications.values) {
if (pub.subscribed) {
pub.sendUpdateTrackSettings();
Expand Down Expand Up @@ -437,14 +440,21 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
final idParts = event.stream.id.split('|');
final participantSid = idParts[0];
final trackSid = idParts.elementAtOrNull(1) ?? event.track.id;
final participant = _getOrCreateRemoteParticipant(participantSid, null);
final participant = _getRemoteParticipantBySid(participantSid);
try {
if (trackSid == null || trackSid.isEmpty) {
throw TrackSubscriptionExceptionEvent(
participant: participant,
reason: TrackSubscribeFailReason.invalidServerResponse,
);
}
if (participant == null) {
throw TrackSubscriptionExceptionEvent(
participant: participant,
sid: trackSid,
reason: TrackSubscribeFailReason.noParticipantFound,
);
}
await participant.addSubscribedMediaTrack(
event.track,
event.stream,
Expand All @@ -454,7 +464,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
);
} on TrackSubscriptionExceptionEvent catch (event) {
logger.severe('addSubscribedMediaTrack() throwed ${event}');
[participant.room.events, participant.events].emit(event);
events.emit(event);
} catch (exception) {
// We don't want to pass up any exception so catch everything here.
logger.warning(
Expand All @@ -480,9 +490,25 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
}
}

/// retrieves a participant by identity
Participant? getParticipantByIdentity(String identity) {
if (_localParticipant?.identity == identity) {
return _localParticipant;
}
return remoteParticipants[identity];
}

RemoteParticipant? _getRemoteParticipantBySid(String sid) {
final identity = _sidToIdentity[sid];
if (identity != null) {
return remoteParticipants[identity];
}
return null;
}

RemoteParticipant _getOrCreateRemoteParticipant(
String sid, lk_models.ParticipantInfo? info) {
RemoteParticipant? participant = _participants[sid];
String identity, lk_models.ParticipantInfo? info) {
RemoteParticipant? participant = _remoteParticipants[identity];
if (participant != null) {
if (info != null) {
participant.updateFromInfo(info);
Expand All @@ -491,11 +517,11 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
}

if (info == null) {
logger.warning('RemoteParticipant.info is null trackSid: $sid');
logger.warning('RemoteParticipant.info is null identity: $identity');
participant = RemoteParticipant(
room: this,
sid: sid,
identity: '',
sid: '',
identity: identity,
name: '',
);
} else {
Expand All @@ -505,8 +531,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
);
}

_participants[sid] = participant;

_remoteParticipants[identity] = participant;
_sidToIdentity[participant.sid] = identity;
return participant;
}

Expand All @@ -515,28 +541,31 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
// trigger change notifier only if list of participants membership is changed
var hasChanged = false;
for (final info in updates) {
if (localParticipant?.sid == info.sid) {
localParticipant?.updateFromInfo(info);
if (localParticipant?.identity == info.identity) {
await localParticipant?.updateFromInfo(info);
continue;
}

final isNew = !_participants.containsKey(info.sid);
final isNew = !_remoteParticipants.containsKey(info.identity);

if (info.state == lk_models.ParticipantInfo_State.DISCONNECTED &&
!isNew) {
hasChanged = true;
await _handleParticipantDisconnect(info.sid);
await _handleParticipantDisconnect(info.identity);
continue;
}

final participant = _getOrCreateRemoteParticipant(info.sid, info);
final participant = _getOrCreateRemoteParticipant(info.identity, info);

if (isNew) {
hasChanged = true;
// fire connected event
emitWhenConnected(ParticipantConnectedEvent(participant: participant));
} else {
await participant.updateFromInfo(info);
final wasUpdated = await participant.updateFromInfo(info);
if (wasUpdated) {
_sidToIdentity[info.sid] = info.identity;
}
}
}

Expand All @@ -546,13 +575,12 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
}

void _onSignalSpeakersChangedEvent(List<lk_models.SpeakerInfo> speakers) {
//
final lastSpeakers = {
for (final p in _activeSpeakers) p.sid: p,
};

for (final speaker in speakers) {
Participant? p = _participants[speaker.sid];
Participant? p = _getRemoteParticipantBySid(speaker.sid);
if (speaker.sid == localParticipant?.sid) p = localParticipant;
if (p == null) continue;

Expand Down Expand Up @@ -580,7 +608,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
// localParticipant & remote participants
final allParticipants = <String, Participant>{
if (localParticipant != null) localParticipant!.sid: localParticipant!,
..._participants,
..._remoteParticipants,
};

for (final speaker in speakers) {
Expand Down Expand Up @@ -612,7 +640,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
if (entry.participantSid == localParticipant?.sid) {
participant = localParticipant;
} else {
participant = _participants[entry.participantSid];
participant = _getRemoteParticipantBySid(entry.participantSid);
}

if (participant != null) {
Expand All @@ -626,7 +654,7 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
List<lk_rtc.StreamStateInfo> updates) async {
for (final update in updates) {
// try to find RemoteParticipant
final participant = participants[update.participantSid];
final participant = remoteParticipants[update.participantSid];
if (participant == null) continue;
// try to find RemoteTrackPublication
final trackPublication = participant.trackPublications[update.trackSid];
Expand All @@ -646,7 +674,8 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
final senderSid = dataPacketEvent.packet.participantSid;
RemoteParticipant? senderParticipant;
if (senderSid.isNotEmpty) {
senderParticipant = participants[dataPacketEvent.packet.participantSid];
senderParticipant =
_getRemoteParticipantBySid(dataPacketEvent.packet.participantSid);
}

// participant.delegate?.onDataReceived(participant, event.packet.payload);
Expand All @@ -661,21 +690,21 @@ class Room extends DisposableChangeNotifier with EventsEmittable<RoomEvent> {
events.emit(event);
}

Future<void> _handleParticipantDisconnect(String sid) async {
final participant = _participants.remove(sid);
Future<void> _handleParticipantDisconnect(String identity) async {
final participant = _remoteParticipants.remove(identity);
if (participant == null) {
return;
}

await participant.unpublishAllTracks(notify: true);
await participant.removeAllPublishedTracks(notify: true);

emitWhenConnected(ParticipantDisconnectedEvent(participant: participant));
}

Future<void> _sendSyncState() async {
final sendUnSub = connectOptions.autoSubscribe;
final participantTracks =
participants.values.map((e) => e.participantTracks());
remoteParticipants.values.map((e) => e.participantTracks());
engine.sendSyncState(
subscription: lk_rtc.UpdateSubscription(
participantTracks: participantTracks,
Expand All @@ -693,12 +722,13 @@ extension RoomPrivateMethods on Room {
logger.fine('[${objectId}] cleanUp()');

// clean up RemoteParticipants
var participants = _participants.values.toList();
var participants = _remoteParticipants.values.toList();
for (final participant in participants) {
// RemoteParticipant is responsible for disposing resources
await participant.dispose();
}
_participants.clear();
_remoteParticipants.clear();
_sidToIdentity.clear();

// clean up LocalParticipant
await localParticipant?.unpublishAllTracks();
Expand Down Expand Up @@ -777,7 +807,7 @@ extension RoomHardwareManagementMethods on Room {
/// Set audio output device.
Future<void> setAudioOutputDevice(MediaDevice device) async {
if (lkPlatformIs(PlatformType.web)) {
participants.forEach((_, participant) {
remoteParticipants.forEach((_, participant) {
for (var audioTrack in participant.audioTracks) {
audioTrack.track?.setSinkId(device.deviceId);
}
Expand Down
4 changes: 2 additions & 2 deletions lib/src/events.dart
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,11 @@ class TrackSubscribedEvent with RoomEvent, ParticipantEvent {
/// An error has occured during track subscription.
/// Emitted by [Room] and [RemoteParticipant].
class TrackSubscriptionExceptionEvent with RoomEvent, ParticipantEvent {
final RemoteParticipant participant;
final RemoteParticipant? participant;
final String? sid;
final TrackSubscribeFailReason reason;
const TrackSubscriptionExceptionEvent({
required this.participant,
this.participant,
this.sid,
required this.reason,
});
Expand Down
42 changes: 40 additions & 2 deletions lib/src/participant/local.dart
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,10 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
name: info.name,
) {
updateFromInfo(info);

onDispose(() async {
await unpublishAllTracks();
});
}

/// Publish an [AudioTrack] to the [Room].
Expand Down Expand Up @@ -333,8 +337,6 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
return pub;
}

/// Unpublish a [LocalTrackPublication] that's already published by this [LocalParticipant].
@override
Future<void> removePublishedTrack(String trackSid,
{bool notify = true}) async {
logger.finer('Unpublish track sid: $trackSid, notify: $notify');
Expand Down Expand Up @@ -387,6 +389,15 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
await pub.dispose();
}

/// Convenience method to unpublish all tracks.
Future<void> unpublishAllTracks(
{bool notify = true, bool? stopOnUnpublish}) async {
final trackSids = trackPublications.keys.toSet();
for (final trackid in trackSids) {
await removePublishedTrack(trackid, notify: notify);
}
}

Future<void> rePublishAllTracks() async {
final tracks = trackPublications.values.toList();
trackPublications.clear();
Expand Down Expand Up @@ -461,6 +472,33 @@ class LocalParticipant extends Participant<LocalTrackPublication> {
.whereType<LocalTrackPublication<LocalAudioTrack>>()
.toList();

@override
LocalTrackPublication? getTrackPublicationByName(String name) {
final track = super.getTrackPublicationByName(name);
if (track != null) {
return track;
}
return null;
}

@override
LocalTrackPublication? getTrackPublicationBySid(String sid) {
final track = super.getTrackPublicationBySid(sid);
if (track != null) {
return track;
}
return null;
}

@override
LocalTrackPublication? getTrackPublicationBySource(TrackSource source) {
final track = super.getTrackPublicationBySource(source);
if (track != null) {
return track;
}
return null;
}

/// Shortcut for publishing a [TrackSource.camera]
Future<LocalTrackPublication?> setCameraEnabled(bool enabled,
{CameraCaptureOptions? cameraCaptureOptions}) async {
Expand Down
Loading

0 comments on commit 668e22f

Please sign in to comment.