Skip to content

Commit

Permalink
added examples for RoomCallback usage (#599)
Browse files Browse the repository at this point in the history
also changed:
- moved data defs to data.go
- added a few additional DisconnectReason
  • Loading branch information
davidzhao authored Jan 20, 2025
1 parent c476bac commit 93feba9
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 44 deletions.
24 changes: 19 additions & 5 deletions callback.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,20 +125,34 @@ func (cb *ParticipantCallback) Merge(other *ParticipantCallback) {
type DisconnectionReason string

const (
LeaveRequested DisconnectionReason = "leave requested by room"
UserUnavailable DisconnectionReason = "remote user unavailable"
RejectedByUser DisconnectionReason = "rejected by remote user"
Failed DisconnectionReason = "connection to room failed"
LeaveRequested DisconnectionReason = "leave requested by user"
UserUnavailable DisconnectionReason = "remote user unavailable"
RejectedByUser DisconnectionReason = "rejected by remote user"
Failed DisconnectionReason = "connection to room failed"
RoomClosed DisconnectionReason = "room closed"
ParticipantRemoved DisconnectionReason = "removed by server"
DuplicateIdentity DisconnectionReason = "duplicate identity"
OtherReason DisconnectionReason = "other reasons"
)

func GetDisconnectionReason(reason livekit.DisconnectReason) DisconnectionReason {
// TODO: SDK should forward the original reason and provide helpers like IsRequestedLeave.
r := LeaveRequested
r := OtherReason
switch reason {
case livekit.DisconnectReason_CLIENT_INITIATED:
r = LeaveRequested
case livekit.DisconnectReason_USER_UNAVAILABLE:
r = UserUnavailable
case livekit.DisconnectReason_USER_REJECTED:
r = RejectedByUser
case livekit.DisconnectReason_ROOM_CLOSED:
r = RoomClosed
case livekit.DisconnectReason_PARTICIPANT_REMOVED:
r = ParticipantRemoved
case livekit.DisconnectReason_DUPLICATE_IDENTITY:
r = DuplicateIdentity
case livekit.DisconnectReason_JOIN_FAILURE, livekit.DisconnectReason_SIGNAL_CLOSE, livekit.DisconnectReason_STATE_MISMATCH:
r = Failed
}
return r
}
Expand Down
39 changes: 39 additions & 0 deletions callback_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package lksdk_test

import (
"fmt"

"github.com/livekit/protocol/livekit"
lksdk "github.com/livekit/server-sdk-go/v2"
)

// ExampleRoomCallback demonstrates usage of RoomCallback to handle various room events
func ExampleRoomCallback() {
// Create a new callback handler
cb := lksdk.NewRoomCallback()

// Handle data packets received from other participants
cb.OnDataPacket = func(data lksdk.DataPacket, params lksdk.DataReceiveParams) {
// handle DTMF
switch val := data.(type) {
case *livekit.SipDTMF:
fmt.Printf("Received DTMF from %s: %s (%d)\n", params.SenderIdentity, val.Digit, val.Code)
case *lksdk.UserDataPacket:
fmt.Printf("Received user data from %s: %s\n", params.SenderIdentity, string(val.Payload))
}
}

// Handle participant metadata changes
cb.OnAttributesChanged = func(changed map[string]string, p lksdk.Participant) {
fmt.Printf("Participant %s attributes changed: %v\n", p.Identity(), changed)
}

// Handle when current participant becomes disconnected
cb.OnDisconnectedWithReason = func(reason lksdk.DisconnectionReason) {
fmt.Printf("Disconnected from room: %s\n", reason)
}

// Create a new room with the callback
room := lksdk.NewRoom(cb)
room.JoinWithToken("wss://myproject.livekit.cloud", "my-token")
}
54 changes: 50 additions & 4 deletions data.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,63 @@
package lksdk

type dataPublishOptions struct {
Reliable *bool
DestinationIdentities []string
Topic string
import (
"github.com/livekit/protocol/livekit"
"google.golang.org/protobuf/proto"
)

// Data types

type DataPacket interface {
ToProto() *livekit.DataPacket
}

// Compile-time assertion for all supported data packet types.
var (
_ DataPacket = (*UserDataPacket)(nil)
_ DataPacket = (*livekit.SipDTMF)(nil) // implemented in the protocol package
)

// UserData is a custom user data that can be sent via WebRTC.
func UserData(data []byte) *UserDataPacket {
return &UserDataPacket{Payload: data}
}

// UserDataPacket is a custom user data that can be sent via WebRTC on a custom topic.
type UserDataPacket struct {
Payload []byte
Topic string // optional
}

// ToProto implements DataPacket.
func (p *UserDataPacket) ToProto() *livekit.DataPacket {
var topic *string
if p.Topic != "" {
topic = proto.String(p.Topic)
}
return &livekit.DataPacket{Value: &livekit.DataPacket_User{
User: &livekit.UserPacket{
Payload: p.Payload,
Topic: topic,
},
}}
}

// receiving

type DataReceiveParams struct {
Sender *RemoteParticipant
SenderIdentity string
Topic string // Deprecated: Use UserDataPacket.Topic
}

// publishing

type dataPublishOptions struct {
Reliable *bool
DestinationIdentities []string
Topic string
}

type DataPublishOption func(*dataPublishOptions)

func WithDataPublishTopic(topic string) DataPublishOption {
Expand Down
35 changes: 0 additions & 35 deletions localparticipant.go
Original file line number Diff line number Diff line change
Expand Up @@ -342,41 +342,6 @@ func (p *LocalParticipant) PublishData(payload []byte, opts ...DataPublishOption
return p.PublishDataPacket(UserData(payload), opts...)
}

type DataPacket interface {
ToProto() *livekit.DataPacket
}

// Compile-time assertion for all supported data packet types.
var (
_ DataPacket = (*UserDataPacket)(nil)
_ DataPacket = (*livekit.SipDTMF)(nil) // implemented in the protocol package
)

// UserData is a custom user data that can be sent via WebRTC.
func UserData(data []byte) *UserDataPacket {
return &UserDataPacket{Payload: data}
}

// UserDataPacket is a custom user data that can be sent via WebRTC on a custom topic.
type UserDataPacket struct {
Payload []byte
Topic string // optional
}

// ToProto implements DataPacket.
func (p *UserDataPacket) ToProto() *livekit.DataPacket {
var topic *string
if p.Topic != "" {
topic = proto.String(p.Topic)
}
return &livekit.DataPacket{Value: &livekit.DataPacket_User{
User: &livekit.UserPacket{
Payload: p.Payload,
Topic: topic,
},
}}
}

// PublishDataPacket sends a packet via a WebRTC data channel. UserData can be used for sending custom user data.
//
// By default, the message can be received by all participants in a room,
Expand Down

0 comments on commit 93feba9

Please sign in to comment.