Skip to content

Commit 6813231

Browse files
authored
Add participant RPC for getting remote headers. (#699)
1 parent 41e215b commit 6813231

5 files changed

Lines changed: 116 additions & 0 deletions

File tree

pkg/sip/inbound.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1444,6 +1444,9 @@ func (c *inboundCall) createLiveKitParticipant(ctx context.Context, rconf RoomCo
14441444
if err != nil {
14451445
return err
14461446
}
1447+
if err := registerSignalingRPC(c.lkRoom, c.cc); err != nil {
1448+
return err
1449+
}
14471450
return nil
14481451
}
14491452

pkg/sip/outbound.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,9 @@ func (c *outboundCall) connectToRoom(ctx context.Context, lkNew RoomConfig, getR
429429
}
430430
c.lkRoom = r
431431
c.lkRoomIn = local
432+
if err := registerSignalingRPC(c.lkRoom, c.cc); err != nil {
433+
return err
434+
}
432435
return nil
433436
}
434437

pkg/sip/outbound_utilities_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,10 @@ func (r *testRoom) NewTrack() *mixer.Input {
265265
return r.room.NewTrack()
266266
}
267267

268+
func (r *testRoom) RegisterRPC(method string, handler lksdk.RpcHandlerFunc) error {
269+
return r.room.RegisterRPC(method, handler)
270+
}
271+
268272
type testSIPClientTransaction struct {
269273
log logger.Logger
270274
responses chan *sip.Response

pkg/sip/room.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@ type RoomInterface interface {
162162
NewParticipantTrack(sampleRate int) (msdk.WriteCloser[msdk.PCM16Sample], error)
163163
SendData(data lksdk.DataPacket, opts ...lksdk.DataPublishOption) error
164164
NewTrack() *mixer.Input
165+
RegisterRPC(method string, handler lksdk.RpcHandlerFunc) error
165166
}
166167

167168
type GetRoomFunc func(log logger.Logger, st *RoomStats) RoomInterface
@@ -455,6 +456,10 @@ func (r *Room) Connect(ctx context.Context, conf *config.Config, rconf RoomConfi
455456
return nil
456457
}
457458

459+
func (r *Room) RegisterRPC(method string, handler lksdk.RpcHandlerFunc) error {
460+
return r.room.RegisterRpcMethod(method, handler)
461+
}
462+
458463
func (r *Room) Subscribe() {
459464
if r.room == nil {
460465
return

pkg/sip/rpc.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package sip
2+
3+
import (
4+
"encoding/json"
5+
"strings"
6+
7+
lksdk "github.com/livekit/server-sdk-go/v2"
8+
)
9+
10+
func registerRPCMethodJSON[Req any, Resp any](r RoomInterface, name string, fnc func(r Req) (Resp, error)) error {
11+
return r.RegisterRPC(name, func(data lksdk.RpcInvocationData) (string, error) {
12+
var req Req
13+
if len(data.Payload) != 0 {
14+
if err := json.Unmarshal([]byte(data.Payload), &req); err != nil {
15+
return "", err
16+
}
17+
}
18+
resp, err := fnc(req)
19+
if err != nil {
20+
return "", err
21+
}
22+
out, err := json.Marshal(&resp)
23+
return string(out), err
24+
})
25+
}
26+
27+
type getHeadersReq struct {
28+
Include []string `json:"include,omitempty"` // list of headers to include
29+
Exclude []string `json:"exclude,omitempty"` // list of headers to exclude
30+
}
31+
32+
type getHeadersResp struct {
33+
Headers map[string]string `json:"headers"`
34+
}
35+
36+
// getHeadersIgnore is a set of header that are filtered out of the participant RPC response.
37+
var getHeadersIgnore = map[string]struct{}{
38+
"route": {},
39+
"record-route": {},
40+
"via": {},
41+
"supported": {},
42+
"accept": {},
43+
"allow": {},
44+
"allow-events": {},
45+
"content-type": {},
46+
"content-length": {},
47+
"content-encoding": {},
48+
"content-disposition": {},
49+
"cseq": {},
50+
"event": {},
51+
"expires": {},
52+
"session-expires": {},
53+
"min-se": {},
54+
"max-forwards": {},
55+
}
56+
57+
func rpcGetHeaders(cc Signaling, r getHeadersReq) (getHeadersResp, error) {
58+
var (
59+
only map[string]struct{}
60+
skip map[string]struct{}
61+
)
62+
if list := r.Include; len(list) != 0 {
63+
only = make(map[string]struct{}, len(list))
64+
for _, h := range list {
65+
only[strings.ToLower(h)] = struct{}{}
66+
}
67+
}
68+
if list := r.Exclude; len(list) != 0 {
69+
skip = make(map[string]struct{}, len(list))
70+
for _, h := range list {
71+
skip[strings.ToLower(h)] = struct{}{}
72+
}
73+
}
74+
out := make(map[string]string)
75+
for _, h := range cc.RemoteHeaders() {
76+
name := strings.ToLower(h.Name())
77+
if _, ok := getHeadersIgnore[name]; ok {
78+
continue
79+
}
80+
if _, ok := skip[name]; ok {
81+
continue
82+
}
83+
if _, ok := only[name]; !ok && only != nil {
84+
continue
85+
}
86+
out[h.Name()] = h.Value()
87+
}
88+
return getHeadersResp{
89+
Headers: out,
90+
}, nil
91+
}
92+
93+
func registerSignalingRPC(r RoomInterface, cc Signaling) error {
94+
err := registerRPCMethodJSON(r, "lk.sip.GetRemoteHeaders", func(r getHeadersReq) (getHeadersResp, error) {
95+
return rpcGetHeaders(cc, r)
96+
})
97+
if err != nil {
98+
return err
99+
}
100+
return nil
101+
}

0 commit comments

Comments
 (0)