Skip to content

Commit 54544c4

Browse files
authored
Helper method to receive WebhookEvent (livekit#109)
1 parent 6ba1221 commit 54544c4

File tree

3 files changed

+100
-19
lines changed

3 files changed

+100
-19
lines changed

auth/provider.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,26 @@ func (p *FileBasedKeyProvider) GetSecret(key string) string {
3636
func (p *FileBasedKeyProvider) NumKeys() int {
3737
return len(p.keys)
3838
}
39+
40+
type SimpleKeyProvider struct {
41+
apiKey string
42+
apiSecret string
43+
}
44+
45+
func NewSimpleKeyProvider(apiKey, apiSecret string) *SimpleKeyProvider {
46+
return &SimpleKeyProvider{
47+
apiKey: apiKey,
48+
apiSecret: apiSecret,
49+
}
50+
}
51+
52+
func (p *SimpleKeyProvider) GetSecret(key string) string {
53+
if key == p.apiKey {
54+
return p.apiSecret
55+
}
56+
return ""
57+
}
58+
59+
func (p *SimpleKeyProvider) NumKeys() int {
60+
return 1
61+
}

webhook/verifier.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ import (
66
"io/ioutil"
77
"net/http"
88

9+
"google.golang.org/protobuf/encoding/protojson"
10+
911
"github.com/livekit/protocol/auth"
12+
"github.com/livekit/protocol/livekit"
1013
)
1114

1215
// Receive reads and verifies incoming webhook is signed with key/secret pair
@@ -48,3 +51,20 @@ func Receive(r *http.Request, provider auth.KeyProvider) ([]byte, error) {
4851

4952
return data, nil
5053
}
54+
55+
// ReceiveWebhookEvent reads and verifies incoming webhook, and returns a parsed WebhookEvent
56+
func ReceiveWebhookEvent(r *http.Request, provider auth.KeyProvider) (*livekit.WebhookEvent, error) {
57+
data, err := Receive(r, provider)
58+
if err != nil {
59+
return nil, err
60+
}
61+
unmarshalOpts := protojson.UnmarshalOptions{
62+
DiscardUnknown: true,
63+
AllowPartial: true,
64+
}
65+
event := livekit.WebhookEvent{}
66+
if err = unmarshalOpts.Unmarshal(data, &event); err != nil {
67+
return nil, err
68+
}
69+
return &event, nil
70+
}

webhook/webhook_test.go

Lines changed: 57 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,45 +5,83 @@ import (
55
"encoding/json"
66
"net"
77
"net/http"
8+
"sync"
89
"testing"
910

1011
"github.com/stretchr/testify/require"
1112

1213
"github.com/livekit/protocol/auth"
14+
"github.com/livekit/protocol/livekit"
1315
"github.com/livekit/protocol/webhook"
1416
)
1517

18+
const (
19+
apiKey = "mykey"
20+
apiSecret = "mysecret"
21+
)
22+
1623
func TestWebHook(t *testing.T) {
1724
s := newServer(":8765")
1825
require.NoError(t, s.Start())
1926
defer s.Stop()
2027

21-
authProvider := auth.NewFileBasedKeyProviderFromMap(map[string]string{
22-
"mykey": "mysecret",
28+
authProvider := auth.NewSimpleKeyProvider(
29+
apiKey, apiSecret,
30+
)
31+
notifier := webhook.NewNotifier(apiKey, apiSecret, []string{
32+
"http://localhost:8765",
2333
})
2434

25-
payload := map[string]interface{}{
26-
"test": "payload",
27-
"nested": map[string]interface{}{
28-
"structure": true,
29-
},
30-
}
35+
t.Run("test json payload", func(t *testing.T) {
36+
payload := map[string]interface{}{
37+
"test": "payload",
38+
"nested": map[string]interface{}{
39+
"structure": true,
40+
},
41+
}
3142

32-
s.handler = func(r *http.Request) {
33-
// receive logic
34-
data, err := webhook.Receive(r, authProvider)
35-
require.NoError(t, err)
43+
wg := sync.WaitGroup{}
44+
wg.Add(1)
45+
s.handler = func(r *http.Request) {
46+
defer wg.Done()
47+
// receive logic
48+
data, err := webhook.Receive(r, authProvider)
49+
require.NoError(t, err)
3650

37-
var decoded map[string]interface{}
38-
require.NoError(t, json.Unmarshal(data, &decoded))
51+
var decoded map[string]interface{}
52+
require.NoError(t, json.Unmarshal(data, &decoded))
3953

40-
require.EqualValues(t, decoded, payload)
41-
}
54+
require.EqualValues(t, decoded, payload)
55+
}
4256

43-
notifier := webhook.NewNotifier("mykey", "mysecret", []string{
44-
"http://localhost:8765",
57+
require.NoError(t, notifier.Notify(context.Background(), payload))
58+
wg.Wait()
4559
})
46-
require.NoError(t, notifier.Notify(context.Background(), payload))
60+
61+
t.Run("test event payload", func(t *testing.T) {
62+
event := &livekit.WebhookEvent{
63+
Event: webhook.EventTrackPublished,
64+
Participant: &livekit.ParticipantInfo{
65+
Identity: "test",
66+
},
67+
Track: &livekit.TrackInfo{
68+
Sid: "TR_abcde",
69+
},
70+
}
71+
72+
wg := sync.WaitGroup{}
73+
wg.Add(1)
74+
s.handler = func(r *http.Request) {
75+
defer wg.Done()
76+
decodedEvent, err := webhook.ReceiveWebhookEvent(r, authProvider)
77+
require.NoError(t, err)
78+
79+
require.EqualValues(t, event, decodedEvent)
80+
}
81+
require.NoError(t, notifier.Notify(context.Background(), event))
82+
wg.Wait()
83+
})
84+
4785
}
4886

4987
type testServer struct {

0 commit comments

Comments
 (0)