mirror of
https://github.com/livekit/livekit.git
synced 2026-04-25 11:12:07 +00:00
* WIP commit * Add some tests * allowedSubscribers uses participant sid * correct variable name * correct another variable name * Add ParticipantSid to SubscriptionPermissionUpdate message * protocol v0.11.2 * WIP commit * WIP commit * fix tests * Remove unused code * Close uptrack manager * Remove duplicate close * move comment to the correct line where the loop could be long * Fix disallowed list revocation, thank you Jie * Remove unneeded interface method * RemoveSubscriber in Participant * Clean up disallowed subscriptions and handle permissions on new track addition * add test for track addition after permission set * Remove unnecessary check
92 lines
2.9 KiB
Go
92 lines
2.9 KiB
Go
package rtc
|
|
|
|
import (
|
|
"github.com/livekit/protocol/livekit"
|
|
"github.com/livekit/protocol/logger"
|
|
|
|
"github.com/livekit/livekit-server/pkg/rtc/types"
|
|
)
|
|
|
|
func HandleParticipantSignal(room types.Room, participant types.Participant, req *livekit.SignalRequest, pLogger logger.Logger) error {
|
|
switch msg := req.Message.(type) {
|
|
case *livekit.SignalRequest_Offer:
|
|
_, err := participant.HandleOffer(FromProtoSessionDescription(msg.Offer))
|
|
if err != nil {
|
|
pLogger.Errorw("could not handle offer", err)
|
|
return err
|
|
}
|
|
case *livekit.SignalRequest_AddTrack:
|
|
pLogger.Debugw("add track request", "track", msg.AddTrack.Cid)
|
|
participant.AddTrack(msg.AddTrack)
|
|
case *livekit.SignalRequest_Answer:
|
|
sd := FromProtoSessionDescription(msg.Answer)
|
|
if err := participant.HandleAnswer(sd); err != nil {
|
|
pLogger.Errorw("could not handle answer", err)
|
|
// connection cannot be successful if we can't answer
|
|
return err
|
|
}
|
|
case *livekit.SignalRequest_Trickle:
|
|
candidateInit, err := FromProtoTrickle(msg.Trickle)
|
|
if err != nil {
|
|
pLogger.Warnw("could not decode trickle", err)
|
|
return nil
|
|
}
|
|
if err := participant.AddICECandidate(candidateInit, msg.Trickle.Target); err != nil {
|
|
pLogger.Warnw("could not handle trickle", err)
|
|
}
|
|
case *livekit.SignalRequest_Mute:
|
|
participant.SetTrackMuted(msg.Mute.Sid, msg.Mute.Muted, false)
|
|
case *livekit.SignalRequest_Subscription:
|
|
var err error
|
|
if participant.CanSubscribe() {
|
|
updateErr := room.UpdateSubscriptions(
|
|
participant,
|
|
msg.Subscription.TrackSids,
|
|
msg.Subscription.ParticipantTracks,
|
|
msg.Subscription.Subscribe,
|
|
)
|
|
if updateErr != nil {
|
|
err = updateErr
|
|
}
|
|
} else {
|
|
err = ErrCannotSubscribe
|
|
}
|
|
if err != nil {
|
|
pLogger.Warnw("could not update subscription", err,
|
|
"tracks", msg.Subscription.TrackSids,
|
|
"subscribe", msg.Subscription.Subscribe)
|
|
}
|
|
case *livekit.SignalRequest_TrackSetting:
|
|
for _, sid := range msg.TrackSetting.TrackSids {
|
|
subTrack := participant.GetSubscribedTrack(sid)
|
|
if subTrack == nil {
|
|
pLogger.Warnw("unable to find SubscribedTrack", nil,
|
|
"track", sid)
|
|
continue
|
|
}
|
|
|
|
// find quality for published track
|
|
pLogger.Debugw("updating track settings",
|
|
"settings", msg.TrackSetting)
|
|
subTrack.UpdateSubscriberSettings(msg.TrackSetting)
|
|
}
|
|
case *livekit.SignalRequest_UpdateLayers:
|
|
track := participant.GetPublishedTrack(msg.UpdateLayers.TrackSid)
|
|
if track == nil {
|
|
pLogger.Warnw("could not find published track", nil,
|
|
"track", msg.UpdateLayers.TrackSid)
|
|
return nil
|
|
}
|
|
track.UpdateVideoLayers(msg.UpdateLayers.Layers)
|
|
case *livekit.SignalRequest_Leave:
|
|
_ = participant.Close()
|
|
case *livekit.SignalRequest_SubscriptionPermissions:
|
|
err := room.UpdateSubscriptionPermissions(participant, msg.SubscriptionPermissions)
|
|
if err != nil {
|
|
pLogger.Warnw("could not update subscription permissions", err,
|
|
"permissions", msg.SubscriptionPermissions)
|
|
}
|
|
}
|
|
return nil
|
|
}
|