add explicit room exists servicestore op (#4175)

This commit is contained in:
Paul Wells
2025-12-17 22:14:06 -08:00
committed by GitHub
parent 39bd077d24
commit 0a82438687
6 changed files with 185 additions and 2 deletions

View File

@@ -44,6 +44,7 @@ type ObjectStore interface {
//counterfeiter:generate . ServiceStore
type ServiceStore interface {
LoadRoom(ctx context.Context, roomName livekit.RoomName, includeInternal bool) (*livekit.Room, *livekit.RoomInternal, error)
RoomExists(ctx context.Context, roomName livekit.RoomName) (bool, error)
// ListRooms returns currently active rooms. if names is not nil, it'll filter and return
// only rooms that match

View File

@@ -84,6 +84,16 @@ func (s *LocalStore) LoadRoom(_ context.Context, roomName livekit.RoomName, incl
return room, internal, nil
}
func (s *LocalStore) RoomExists(ctx context.Context, roomName livekit.RoomName) (bool, error) {
_, _, err := s.LoadRoom(ctx, roomName, false)
if err == ErrRoomNotFound {
return false, nil
} else if err != nil {
return false, err
}
return true, nil
}
func (s *LocalStore) ListRooms(_ context.Context, roomNames []livekit.RoomName) ([]*livekit.Room, error) {
s.lock.RLock()
defer s.lock.RUnlock()

View File

@@ -195,6 +195,16 @@ func (s *RedisStore) LoadRoom(_ context.Context, roomName livekit.RoomName, incl
return room, internal, nil
}
func (s *RedisStore) RoomExists(ctx context.Context, roomName livekit.RoomName) (bool, error) {
_, _, err := s.LoadRoom(ctx, roomName, false)
if err == ErrRoomNotFound {
return false, nil
} else if err != nil {
return false, err
}
return true, nil
}
func (s *RedisStore) ListRooms(_ context.Context, roomNames []livekit.RoomName) ([]*livekit.Room, error) {
var items []string
var err error

View File

@@ -127,9 +127,11 @@ func (s *RoomService) DeleteRoom(ctx context.Context, req *livekit.DeleteRoomReq
return nil, twirpAuthError(err)
}
_, _, err := s.roomStore.LoadRoom(ctx, livekit.RoomName(req.Room), false)
exists, err := s.roomStore.RoomExists(ctx, livekit.RoomName(req.Room))
if err != nil {
return nil, err
} else if !exists {
return nil, ErrRoomNotFound
}
// ensure at least one node is available to handle the request
@@ -304,9 +306,11 @@ func (s *RoomService) UpdateRoomMetadata(ctx context.Context, req *livekit.Updat
return nil, twirpAuthError(err)
}
_, _, err := s.roomStore.LoadRoom(ctx, livekit.RoomName(req.Room), false)
exists, err := s.roomStore.RoomExists(ctx, livekit.RoomName(req.Room))
if err != nil {
return nil, err
} else if !exists {
return nil, ErrRoomNotFound
}
room, err := s.roomClient.UpdateRoomMetadata(ctx, s.topicFormatter.RoomTopic(ctx, livekit.RoomName(req.Room)), req)

View File

@@ -126,6 +126,20 @@ type FakeObjectStore struct {
result1 string
result2 error
}
RoomExistsStub func(context.Context, livekit.RoomName) (bool, error)
roomExistsMutex sync.RWMutex
roomExistsArgsForCall []struct {
arg1 context.Context
arg2 livekit.RoomName
}
roomExistsReturns struct {
result1 bool
result2 error
}
roomExistsReturnsOnCall map[int]struct {
result1 bool
result2 error
}
StoreParticipantStub func(context.Context, livekit.RoomName, *livekit.ParticipantInfo) error
storeParticipantMutex sync.RWMutex
storeParticipantArgsForCall []struct {
@@ -696,6 +710,71 @@ func (fake *FakeObjectStore) LockRoomReturnsOnCall(i int, result1 string, result
}{result1, result2}
}
func (fake *FakeObjectStore) RoomExists(arg1 context.Context, arg2 livekit.RoomName) (bool, error) {
fake.roomExistsMutex.Lock()
ret, specificReturn := fake.roomExistsReturnsOnCall[len(fake.roomExistsArgsForCall)]
fake.roomExistsArgsForCall = append(fake.roomExistsArgsForCall, struct {
arg1 context.Context
arg2 livekit.RoomName
}{arg1, arg2})
stub := fake.RoomExistsStub
fakeReturns := fake.roomExistsReturns
fake.recordInvocation("RoomExists", []interface{}{arg1, arg2})
fake.roomExistsMutex.Unlock()
if stub != nil {
return stub(arg1, arg2)
}
if specificReturn {
return ret.result1, ret.result2
}
return fakeReturns.result1, fakeReturns.result2
}
func (fake *FakeObjectStore) RoomExistsCallCount() int {
fake.roomExistsMutex.RLock()
defer fake.roomExistsMutex.RUnlock()
return len(fake.roomExistsArgsForCall)
}
func (fake *FakeObjectStore) RoomExistsCalls(stub func(context.Context, livekit.RoomName) (bool, error)) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = stub
}
func (fake *FakeObjectStore) RoomExistsArgsForCall(i int) (context.Context, livekit.RoomName) {
fake.roomExistsMutex.RLock()
defer fake.roomExistsMutex.RUnlock()
argsForCall := fake.roomExistsArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2
}
func (fake *FakeObjectStore) RoomExistsReturns(result1 bool, result2 error) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = nil
fake.roomExistsReturns = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeObjectStore) RoomExistsReturnsOnCall(i int, result1 bool, result2 error) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = nil
if fake.roomExistsReturnsOnCall == nil {
fake.roomExistsReturnsOnCall = make(map[int]struct {
result1 bool
result2 error
})
}
fake.roomExistsReturnsOnCall[i] = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeObjectStore) StoreParticipant(arg1 context.Context, arg2 livekit.RoomName, arg3 *livekit.ParticipantInfo) error {
fake.storeParticipantMutex.Lock()
ret, specificReturn := fake.storeParticipantReturnsOnCall[len(fake.storeParticipantArgsForCall)]

View File

@@ -70,6 +70,20 @@ type FakeServiceStore struct {
result2 *livekit.RoomInternal
result3 error
}
RoomExistsStub func(context.Context, livekit.RoomName) (bool, error)
roomExistsMutex sync.RWMutex
roomExistsArgsForCall []struct {
arg1 context.Context
arg2 livekit.RoomName
}
roomExistsReturns struct {
result1 bool
result2 error
}
roomExistsReturnsOnCall map[int]struct {
result1 bool
result2 error
}
invocations map[string][][]interface{}
invocationsMutex sync.RWMutex
}
@@ -344,6 +358,71 @@ func (fake *FakeServiceStore) LoadRoomReturnsOnCall(i int, result1 *livekit.Room
}{result1, result2, result3}
}
func (fake *FakeServiceStore) RoomExists(arg1 context.Context, arg2 livekit.RoomName) (bool, error) {
fake.roomExistsMutex.Lock()
ret, specificReturn := fake.roomExistsReturnsOnCall[len(fake.roomExistsArgsForCall)]
fake.roomExistsArgsForCall = append(fake.roomExistsArgsForCall, struct {
arg1 context.Context
arg2 livekit.RoomName
}{arg1, arg2})
stub := fake.RoomExistsStub
fakeReturns := fake.roomExistsReturns
fake.recordInvocation("RoomExists", []interface{}{arg1, arg2})
fake.roomExistsMutex.Unlock()
if stub != nil {
return stub(arg1, arg2)
}
if specificReturn {
return ret.result1, ret.result2
}
return fakeReturns.result1, fakeReturns.result2
}
func (fake *FakeServiceStore) RoomExistsCallCount() int {
fake.roomExistsMutex.RLock()
defer fake.roomExistsMutex.RUnlock()
return len(fake.roomExistsArgsForCall)
}
func (fake *FakeServiceStore) RoomExistsCalls(stub func(context.Context, livekit.RoomName) (bool, error)) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = stub
}
func (fake *FakeServiceStore) RoomExistsArgsForCall(i int) (context.Context, livekit.RoomName) {
fake.roomExistsMutex.RLock()
defer fake.roomExistsMutex.RUnlock()
argsForCall := fake.roomExistsArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2
}
func (fake *FakeServiceStore) RoomExistsReturns(result1 bool, result2 error) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = nil
fake.roomExistsReturns = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeServiceStore) RoomExistsReturnsOnCall(i int, result1 bool, result2 error) {
fake.roomExistsMutex.Lock()
defer fake.roomExistsMutex.Unlock()
fake.RoomExistsStub = nil
if fake.roomExistsReturnsOnCall == nil {
fake.roomExistsReturnsOnCall = make(map[int]struct {
result1 bool
result2 error
})
}
fake.roomExistsReturnsOnCall[i] = struct {
result1 bool
result2 error
}{result1, result2}
}
func (fake *FakeServiceStore) Invocations() map[string][][]interface{} {
fake.invocationsMutex.RLock()
defer fake.invocationsMutex.RUnlock()