From 93feba97d76d24efac2e57ef8dccaf12a4f6475c Mon Sep 17 00:00:00 2001 From: David Zhao Date: Sun, 19 Jan 2025 17:35:30 -0700 Subject: [PATCH] added examples for RoomCallback usage (#599) also changed: - moved data defs to data.go - added a few additional DisconnectReason --- callback.go | 24 +++++++++++++++----- callback_test.go | 39 ++++++++++++++++++++++++++++++++ data.go | 54 +++++++++++++++++++++++++++++++++++++++++---- localparticipant.go | 35 ----------------------------- 4 files changed, 108 insertions(+), 44 deletions(-) create mode 100644 callback_test.go diff --git a/callback.go b/callback.go index 79ef703c..cad04ff9 100644 --- a/callback.go +++ b/callback.go @@ -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 } diff --git a/callback_test.go b/callback_test.go new file mode 100644 index 00000000..15c8cb4c --- /dev/null +++ b/callback_test.go @@ -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") +} diff --git a/data.go b/data.go index 14e75797..04614784 100644 --- a/data.go +++ b/data.go @@ -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 { diff --git a/localparticipant.go b/localparticipant.go index a00d2173..e5e39e65 100644 --- a/localparticipant.go +++ b/localparticipant.go @@ -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,