Skip to content

Commit 1f6a8a0

Browse files
committed
feat: server rpc apis
1 parent 37d6ce4 commit 1f6a8a0

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed

examples/rpc-server-api/main.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"time"
7+
8+
"github.com/google/uuid"
9+
10+
"github.com/livekit/protocol/livekit"
11+
"github.com/livekit/protocol/logger"
12+
lksdk "github.com/livekit/server-sdk-go/v2"
13+
)
14+
15+
const (
16+
greeter = "greeter"
17+
)
18+
19+
var (
20+
host, apiKey, apiSecret string
21+
)
22+
23+
func init() {
24+
host = "ws://localhost:7880"
25+
apiKey = "devkey"
26+
apiSecret = "secret"
27+
}
28+
29+
func performGreeting(room *lksdk.Room) {
30+
roomClient := lksdk.NewRoomServiceClient(host, apiKey, apiSecret)
31+
32+
logger.Infow("[Server API] Triggering greeter's arrival RPC")
33+
res, err := roomClient.PerformRpc(context.Background(), &livekit.PerformRpcRequest{
34+
Room: room.Name(),
35+
DestinationIdentity: greeter,
36+
Method: "arrival",
37+
Payload: "Hello",
38+
})
39+
40+
if err != nil {
41+
logger.Errorw("[Server API] RPC call failed: ", err)
42+
return
43+
}
44+
45+
logger.Infow(fmt.Sprintf("[Server API] That's nice, the greeter said: %s", res.GetPayload()))
46+
}
47+
48+
func registerReceiverMethods(greeterRoom *lksdk.Room) error {
49+
arrivalHandler := func(data lksdk.RpcInvocationData) (string, error) {
50+
resultChan := make(chan string)
51+
52+
logger.Infow(fmt.Sprintf("[Greeter] Oh %s arrived and said %s", data.CallerIdentity, data.Payload))
53+
54+
time.AfterFunc(2000*time.Millisecond, func() {
55+
resultChan <- "Welcome and have a wonderful day!"
56+
})
57+
58+
return <-resultChan, nil
59+
}
60+
err := greeterRoom.RegisterRpcMethod("arrival", arrivalHandler)
61+
if err != nil {
62+
logger.Errorw("Failed to register arrival RPC method", err)
63+
return err
64+
}
65+
66+
return nil
67+
}
68+
69+
func main() {
70+
logger.InitFromConfig(&logger.Config{Level: "info"}, "rpc-demo")
71+
lksdk.SetLogger(logger.GetLogger())
72+
73+
roomName := "rpc-server-api" + uuid.New().String()[:8]
74+
logger.Infow("connecting participants to room", "roomName", roomName)
75+
76+
room, err := lksdk.ConnectToRoom(host, lksdk.ConnectInfo{
77+
APIKey: apiKey,
78+
APISecret: apiSecret,
79+
RoomName: roomName,
80+
ParticipantIdentity: greeter,
81+
}, nil)
82+
if err != nil {
83+
logger.Errorw("failed to connect to room", err, "participant", greeter)
84+
}
85+
defer room.Disconnect()
86+
87+
err = registerReceiverMethods(room)
88+
if err != nil {
89+
logger.Errorw("failed to register RPC methods", err)
90+
return
91+
}
92+
93+
logger.Infow("participants connected to room, starting rpc demo", "roomName", roomName)
94+
95+
logger.Infow("Running greeting example...")
96+
performGreeting(room)
97+
98+
time.Sleep(60 * time.Second)
99+
}

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ module github.com/livekit/server-sdk-go/v2
22

33
go 1.24.2
44

5+
replace github.com/livekit/protocol => ../protocol
6+
57
require (
68
github.com/bep/debounce v1.2.1
79
github.com/go-logr/stdr v1.2.2

roomclient.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,11 @@ func (c *RoomServiceClient) SendData(ctx context.Context, req *livekit.SendDataR
170170
func (c *RoomServiceClient) CreateToken() *auth.AccessToken {
171171
return auth.NewAccessToken(c.apiKey, c.apiSecret)
172172
}
173+
174+
func (c *RoomServiceClient) PerformRpc(ctx context.Context, req *livekit.PerformRpcRequest) (*livekit.PerformRpcResponse, error) {
175+
ctx, err := c.withAuth(ctx, withVideoGrant{RoomAdmin: true, Room: req.Room})
176+
if err != nil {
177+
return nil, err
178+
}
179+
return c.roomService.PerformRpc(ctx, req)
180+
}

0 commit comments

Comments
 (0)