Skip to content
Draft
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
101 changes: 101 additions & 0 deletions examples/rpc-server-api/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package main

import (
"context"
"fmt"
"time"

"github.com/google/uuid"

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

const (
greeter = "greeter"
)

var (
host, apiKey, apiSecret string
)

func init() {
host = "ws://localhost:7880"
apiKey = "devkey"
apiSecret = "secret"
}

func performGreeting(room *lksdk.Room) {
roomClient := lksdk.NewRoomServiceClient(host, apiKey, apiSecret)

logger.Infow("[Server API] Triggering greeter's arrival RPC")
// timeout := 10 * time.Millisecond
res, err := roomClient.PerformRpc(context.Background(), &livekit.PerformRpcRequest{
Room: room.Name(),
DestinationIdentity: greeter,
Method: "arrival",
Payload: "Hello",
ResponseTimeoutMs: 5000,
})

if err != nil {
logger.Errorw("[Server API] RPC call failed: ", err)
return
}

logger.Infow(fmt.Sprintf("[Server API] That's nice, the greeter said: %s", res.GetPayload()))
}

func registerReceiverMethods(greeterRoom *lksdk.Room) error {
arrivalHandler := func(data lksdk.RpcInvocationData) (string, error) {
resultChan := make(chan string)

logger.Infow(fmt.Sprintf("[Greeter] Oh %s arrived and said %s", data.CallerIdentity, data.Payload))

time.AfterFunc(8000*time.Millisecond, func() {
resultChan <- "Welcome and have a wonderful day!"
})

return <-resultChan, nil
}
err := greeterRoom.RegisterRpcMethod("arrival", arrivalHandler)
if err != nil {
logger.Errorw("Failed to register arrival RPC method", err)
return err
}

return nil
}

func main() {
logger.InitFromConfig(&logger.Config{Level: "info"}, "rpc-demo")
lksdk.SetLogger(logger.GetLogger())

roomName := "rpc-server-api" + uuid.New().String()[:8]
logger.Infow("connecting participants to room", "roomName", roomName)

room, err := lksdk.ConnectToRoom(host, lksdk.ConnectInfo{
APIKey: apiKey,
APISecret: apiSecret,
RoomName: roomName,
ParticipantIdentity: greeter,
}, nil)
if err != nil {
logger.Errorw("failed to connect to room", err, "participant", greeter)
}
defer room.Disconnect()

err = registerReceiverMethods(room)
if err != nil {
logger.Errorw("failed to register RPC methods", err)
return
}

logger.Infow("participants connected to room, starting rpc demo", "roomName", roomName)

logger.Infow("Running greeting example...")
performGreeting(room)

time.Sleep(60 * time.Second)
}
1 change: 0 additions & 1 deletion examples/rpc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ func performGreetingWithTimeout(room *lksdk.Room) {
}

logger.Infow(fmt.Sprintf("[Caller] That's nice, the greeter said: %s", *res))

}

func performDisconnection(room *lksdk.Room) {
Expand Down
42 changes: 21 additions & 21 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,32 +10,32 @@ require (
github.com/livekit/mageutil v0.0.0-20250511045019-0f1ff63f7731
github.com/livekit/media-sdk v0.0.0-20250518151703-b07af88637c5
github.com/livekit/mediatransportutil v0.0.0-20250519131108-fb90f5acfded
github.com/livekit/protocol v1.40.1-0.20250826073447-c714707269e5
github.com/livekit/protocol v1.41.1-0.20250922095139-3d859a5bf06c
github.com/magefile/mage v1.15.0
github.com/pion/dtls/v3 v3.0.7
github.com/pion/interceptor v0.1.40
github.com/pion/rtcp v1.2.15
github.com/pion/rtp v1.8.21
github.com/pion/sdp/v3 v3.0.15
github.com/pion/rtp v1.8.22
github.com/pion/sdp/v3 v3.0.16
github.com/pion/webrtc/v4 v4.1.5-0.20250828044558-c376d0edf977
github.com/stretchr/testify v1.11.1
github.com/twitchtv/twirp v8.1.3+incompatible
go.uber.org/atomic v1.11.0
golang.org/x/crypto v0.41.0
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b
google.golang.org/protobuf v1.36.8
golang.org/x/crypto v0.42.0
golang.org/x/exp v0.0.0-20250911091902-df9299821621
google.golang.org/protobuf v1.36.9
)

require golang.org/x/mod v0.27.0
require golang.org/x/mod v0.28.0

require (
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3 // indirect
golang.org/x/tools v0.36.0 // indirect
golang.org/x/tools v0.37.0 // indirect
)

require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.8-20250717185734-6c6e0d3c608e.1 // indirect
buf.build/go/protovalidate v0.14.0 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.9-20250912141014-52f32327d4b0.1 // indirect
buf.build/go/protovalidate v1.0.0 // indirect
buf.build/go/protoyaml v0.6.0 // indirect
cel.dev/expr v0.24.0 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
Expand All @@ -50,16 +50,16 @@ require (
github.com/gammazero/deque v1.1.0
github.com/go-jose/go-jose/v3 v3.0.4 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/google/cel-go v0.26.0 // indirect
github.com/google/cel-go v0.26.1 // indirect
github.com/jfreymuth/oggvorbis v1.0.5 // indirect
github.com/jfreymuth/vorbis v1.0.2 // indirect
github.com/joho/godotenv v1.5.1
github.com/jxskiss/base62 v1.1.0 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/lithammer/shortuuid/v4 v4.2.0 // indirect
github.com/livekit/psrpc v0.6.1-0.20250726180611-3915e005e741 // indirect
github.com/nats-io/nats.go v1.45.0 // indirect
github.com/livekit/psrpc v0.7.0 // indirect
github.com/nats-io/nats.go v1.46.0 // indirect
github.com/nats-io/nkeys v0.4.11 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
github.com/opencontainers/runc v1.1.14 // indirect
Expand All @@ -75,20 +75,20 @@ require (
github.com/pion/turn/v4 v4.1.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect
github.com/redis/go-redis/v9 v9.12.1 // indirect
github.com/redis/go-redis/v9 v9.14.0 // indirect
github.com/stoewer/go-strcase v1.3.1 // indirect
github.com/wlynxg/anet v0.0.5 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/grpc v1.75.0 // indirect
golang.org/x/net v0.44.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.36.0 // indirect
golang.org/x/text v0.29.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250922171735-9219d122eba9 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250922171735-9219d122eba9 // indirect
google.golang.org/grpc v1.75.1 // indirect
gopkg.in/hraban/opus.v2 v2.0.0-20230925203106-0188a62cb302 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
Expand Down
Loading