diff --git a/pkg/service/server.go b/pkg/service/server.go index bfdd5d4e5..0c298467e 100644 --- a/pkg/service/server.go +++ b/pkg/service/server.go @@ -107,18 +107,17 @@ func NewLivekitServer(conf *config.Config, middlewares = append(middlewares, NewAPIKeyAuthMiddleware(keyProvider)) } - twirpLoggingHook := TwirpLogger() - twirpRequestStatusHook := TwirpRequestStatusReporter() - roomServer := livekit.NewRoomServiceServer(roomService, twirpLoggingHook) - agentDispatchServer := livekit.NewAgentDispatchServiceServer(agentDispatchService, twirpLoggingHook) - egressServer := livekit.NewEgressServer(egressService, twirp.WithServerHooks( - twirp.ChainHooks( - twirpLoggingHook, - twirpRequestStatusHook, - ), - )) - ingressServer := livekit.NewIngressServer(ingressService, twirpLoggingHook) - sipServer := livekit.NewSIPServer(sipService, twirpLoggingHook) + serverOptions := []interface{}{ + twirp.WithServerHooks(twirp.ChainHooks( + TwirpLogger(), + TwirpRequestStatusReporter(), + )), + } + roomServer := livekit.NewRoomServiceServer(roomService, serverOptions...) + agentDispatchServer := livekit.NewAgentDispatchServiceServer(agentDispatchService, serverOptions...) + egressServer := livekit.NewEgressServer(egressService, serverOptions...) + ingressServer := livekit.NewIngressServer(ingressService, serverOptions...) + sipServer := livekit.NewSIPServer(sipService, serverOptions...) mux := http.NewServeMux() if conf.Development { diff --git a/pkg/service/twirp_test.go b/pkg/service/twirp_test.go new file mode 100644 index 000000000..103baad1a --- /dev/null +++ b/pkg/service/twirp_test.go @@ -0,0 +1,34 @@ +/* + * Copyright 2024 LiveKit, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package service + +import ( + "errors" + "testing" + + "github.com/stretchr/testify/require" + "github.com/twitchtv/twirp" +) + +func TestConvertErrToTwirp(t *testing.T) { + t.Run("handles not found", func(t *testing.T) { + err := ErrRoomNotFound + var tErr twirp.Error + require.True(t, errors.As(err, &tErr)) + require.Equal(t, twirp.NotFound, tErr.Code()) + }) +} diff --git a/test/singlenode_test.go b/test/singlenode_test.go index e136a8e68..9512b92b1 100644 --- a/test/singlenode_test.go +++ b/test/singlenode_test.go @@ -16,6 +16,7 @@ package test import ( "context" + "errors" "fmt" "net/http" "strings" @@ -26,6 +27,7 @@ import ( "github.com/pion/webrtc/v3" "github.com/stretchr/testify/require" "github.com/thoas/go-funk" + "github.com/twitchtv/twirp" "github.com/livekit/protocol/auth" "github.com/livekit/protocol/livekit" @@ -330,6 +332,32 @@ func TestSingleNodeRoomList(t *testing.T) { roomServiceListRoom(t) } +func TestSingleNodeUpdateParticipant(t *testing.T) { + if testing.Short() { + t.SkipNow() + return + } + _, finish := setupSingleNodeTest("TestSingleNodeRoomList") + defer finish() + + adminCtx := contextWithToken(adminRoomToken(testRoom)) + t.Run("update nonexistent participant", func(t *testing.T) { + _, err := roomClient.UpdateParticipant(adminCtx, &livekit.UpdateParticipantRequest{ + Room: testRoom, + Identity: "nonexistent", + Permission: &livekit.ParticipantPermission{ + CanPublish: true, + }, + }) + require.Error(t, err) + var twErr twirp.Error + require.True(t, errors.As(err, &twErr)) + // Note: for Cloud this would return 404, currently we are not able to differentiate between + // non-existent participant vs server being unavailable in OSS + require.Equal(t, twirp.Unavailable, twErr.Code()) + }) +} + // Ensure that CORS headers are returned func TestSingleNodeCORS(t *testing.T) { if testing.Short() {