ListRooms using sid (#842)

* ListRooms using `sid`

* correct field name

* Remove contains and latest protocol
This commit is contained in:
Raja Subramanian
2022-07-21 11:05:33 +05:30
committed by GitHub
parent 51073e8918
commit f2e1e67e58
10 changed files with 80 additions and 48 deletions
+1 -1
View File
@@ -15,7 +15,7 @@ require (
github.com/google/wire v0.5.0
github.com/gorilla/websocket v1.4.2
github.com/hashicorp/golang-lru v0.5.4
github.com/livekit/protocol v0.13.5-0.20220721030958-86da2252193b
github.com/livekit/protocol v0.13.5-0.20220721052645-5eea37b737f6
github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a
github.com/mackerelio/go-osstat v0.2.1
github.com/magefile/mage v1.13.0
+2 -2
View File
@@ -235,8 +235,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8=
github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts=
github.com/livekit/protocol v0.13.5-0.20220721030958-86da2252193b h1:7p5M5WoTFDyIvxcB+r2aqMYKU8tFYf8MA52vXY15naI=
github.com/livekit/protocol v0.13.5-0.20220721030958-86da2252193b/go.mod h1:Qd/Dn4BkJfZQy/IjtEeUOGXARrR7l09WDkg5SY8thkw=
github.com/livekit/protocol v0.13.5-0.20220721052645-5eea37b737f6 h1:+8Uw5Ron7LU1nXMn7lfwB91G0fGpjqMlRHvxdyE/JUk=
github.com/livekit/protocol v0.13.5-0.20220721052645-5eea37b737f6/go.mod h1:Qd/Dn4BkJfZQy/IjtEeUOGXARrR7l09WDkg5SY8thkw=
github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a h1:cENjhGfslLSDV07gt8ASy47Wd12Q0kBS7hsdunyQ62I=
github.com/livekit/rtcscore-go v0.0.0-20220524203225-dfd1ba40744a/go.mod h1:116ych8UaEs9vfIE8n6iZCZ30iagUFTls0vRmC+Ix5U=
github.com/mackerelio/go-osstat v0.2.1 h1:5AeAcBEutEErAOlDz6WCkEvm6AKYgHTUQrfwm5RbeQc=
+2 -2
View File
@@ -29,9 +29,9 @@ type ObjectStore interface {
//counterfeiter:generate . ServiceStore
type ServiceStore interface {
LoadRoom(ctx context.Context, name livekit.RoomName) (*livekit.Room, error)
// ListRooms returns currently active rooms. if names is not nil, it'll filter and return
// ListRooms returns currently active rooms. if names and/or sids is not nil, it'll filter and return
// only rooms that match
ListRooms(ctx context.Context, names []livekit.RoomName) ([]*livekit.Room, error)
ListRooms(ctx context.Context, names []livekit.RoomName, sids []livekit.RoomID) ([]*livekit.Room, error)
LoadParticipant(ctx context.Context, roomName livekit.RoomName, identity livekit.ParticipantIdentity) (*livekit.ParticipantInfo, error)
ListParticipants(ctx context.Context, roomName livekit.RoomName) ([]*livekit.ParticipantInfo, error)
+2 -2
View File
@@ -50,12 +50,12 @@ func (s *LocalStore) LoadRoom(_ context.Context, name livekit.RoomName) (*liveki
return room, nil
}
func (s *LocalStore) ListRooms(_ context.Context, names []livekit.RoomName) ([]*livekit.Room, error) {
func (s *LocalStore) ListRooms(_ context.Context, names []livekit.RoomName, sids []livekit.RoomID) ([]*livekit.Room, error) {
s.lock.RLock()
defer s.lock.RUnlock()
rooms := make([]*livekit.Room, 0, len(s.rooms))
for _, r := range s.rooms {
if names == nil || funk.Contains(names, livekit.RoomName(r.Name)) {
if (names == nil && sids == nil) || funk.Contains(names, livekit.RoomName(r.Name)) || funk.Contains(sids, livekit.RoomID(r.Sid)) {
rooms = append(rooms, r)
}
}
+9 -20
View File
@@ -6,6 +6,7 @@ import (
"github.com/go-redis/redis/v8"
"github.com/pkg/errors"
"github.com/thoas/go-funk"
"google.golang.org/protobuf/proto"
"github.com/livekit/protocol/livekit"
@@ -76,37 +77,25 @@ func (s *RedisStore) LoadRoom(_ context.Context, name livekit.RoomName) (*liveki
return &room, nil
}
func (s *RedisStore) ListRooms(_ context.Context, names []livekit.RoomName) ([]*livekit.Room, error) {
func (s *RedisStore) ListRooms(_ context.Context, names []livekit.RoomName, sids []livekit.RoomID) ([]*livekit.Room, error) {
var items []string
var err error
if names == nil {
items, err = s.rc.HVals(s.ctx, RoomsKey).Result()
if err != nil && err != redis.Nil {
return nil, errors.Wrap(err, "could not get rooms")
}
} else {
roomNames := livekit.RoomNamesAsStrings(names)
var results []interface{}
results, err = s.rc.HMGet(s.ctx, RoomsKey, roomNames...).Result()
if err != nil && err != redis.Nil {
return nil, errors.Wrap(err, "could not get rooms by names")
}
for _, r := range results {
if item, ok := r.(string); ok {
items = append(items, item)
}
}
items, err = s.rc.HVals(s.ctx, RoomsKey).Result()
if err != nil && err != redis.Nil {
return nil, errors.Wrap(err, "could not get rooms")
}
rooms := make([]*livekit.Room, 0, len(items))
for _, item := range items {
room := livekit.Room{}
err := proto.Unmarshal([]byte(item), &room)
if err != nil {
return nil, err
}
rooms = append(rooms, &room)
if (names == nil && sids == nil) || funk.Contains(names, livekit.RoomName(room.Name)) || funk.Contains(sids, livekit.RoomID(room.Sid)) {
rooms = append(rooms, &room)
}
}
return rooms, nil
}
+1 -1
View File
@@ -114,7 +114,7 @@ func (r *RoomManager) DeleteRoom(ctx context.Context, roomName livekit.RoomName)
func (r *RoomManager) CleanupRooms() error {
// cleanup rooms that have been left for over a day
ctx := context.Background()
rooms, err := r.roomStore.ListRooms(ctx, nil)
rooms, err := r.roomStore.ListRooms(ctx, nil, nil)
if err != nil {
return err
}
+5 -1
View File
@@ -61,7 +61,11 @@ func (s *RoomService) ListRooms(ctx context.Context, req *livekit.ListRoomsReque
if len(req.Names) > 0 {
names = livekit.StringsAsRoomNames(req.Names)
}
rooms, err := s.roomStore.ListRooms(ctx, names)
var sids []livekit.RoomID
if len(req.RoomSids) > 0 {
sids = livekit.StringsAsRoomIDs(req.RoomSids)
}
rooms, err := s.roomStore.ListRooms(ctx, names, sids)
if err != nil {
// TODO: translate error codes to twirp
return
+15 -8
View File
@@ -76,11 +76,12 @@ type FakeObjectStore struct {
result1 []*livekit.ParticipantInfo
result2 error
}
ListRoomsStub func(context.Context, []livekit.RoomName) ([]*livekit.Room, error)
ListRoomsStub func(context.Context, []livekit.RoomName, []livekit.RoomID) ([]*livekit.Room, error)
listRoomsMutex sync.RWMutex
listRoomsArgsForCall []struct {
arg1 context.Context
arg2 []livekit.RoomName
arg3 []livekit.RoomID
}
listRoomsReturns struct {
result1 []*livekit.Room
@@ -531,24 +532,30 @@ func (fake *FakeObjectStore) ListParticipantsReturnsOnCall(i int, result1 []*liv
}{result1, result2}
}
func (fake *FakeObjectStore) ListRooms(arg1 context.Context, arg2 []livekit.RoomName) ([]*livekit.Room, error) {
func (fake *FakeObjectStore) ListRooms(arg1 context.Context, arg2 []livekit.RoomName, arg3 []livekit.RoomID) ([]*livekit.Room, error) {
var arg2Copy []livekit.RoomName
if arg2 != nil {
arg2Copy = make([]livekit.RoomName, len(arg2))
copy(arg2Copy, arg2)
}
var arg3Copy []livekit.RoomID
if arg3 != nil {
arg3Copy = make([]livekit.RoomID, len(arg3))
copy(arg3Copy, arg3)
}
fake.listRoomsMutex.Lock()
ret, specificReturn := fake.listRoomsReturnsOnCall[len(fake.listRoomsArgsForCall)]
fake.listRoomsArgsForCall = append(fake.listRoomsArgsForCall, struct {
arg1 context.Context
arg2 []livekit.RoomName
}{arg1, arg2Copy})
arg3 []livekit.RoomID
}{arg1, arg2Copy, arg3Copy})
stub := fake.ListRoomsStub
fakeReturns := fake.listRoomsReturns
fake.recordInvocation("ListRooms", []interface{}{arg1, arg2Copy})
fake.recordInvocation("ListRooms", []interface{}{arg1, arg2Copy, arg3Copy})
fake.listRoomsMutex.Unlock()
if stub != nil {
return stub(arg1, arg2)
return stub(arg1, arg2, arg3)
}
if specificReturn {
return ret.result1, ret.result2
@@ -562,17 +569,17 @@ func (fake *FakeObjectStore) ListRoomsCallCount() int {
return len(fake.listRoomsArgsForCall)
}
func (fake *FakeObjectStore) ListRoomsCalls(stub func(context.Context, []livekit.RoomName) ([]*livekit.Room, error)) {
func (fake *FakeObjectStore) ListRoomsCalls(stub func(context.Context, []livekit.RoomName, []livekit.RoomID) ([]*livekit.Room, error)) {
fake.listRoomsMutex.Lock()
defer fake.listRoomsMutex.Unlock()
fake.ListRoomsStub = stub
}
func (fake *FakeObjectStore) ListRoomsArgsForCall(i int) (context.Context, []livekit.RoomName) {
func (fake *FakeObjectStore) ListRoomsArgsForCall(i int) (context.Context, []livekit.RoomName, []livekit.RoomID) {
fake.listRoomsMutex.RLock()
defer fake.listRoomsMutex.RUnlock()
argsForCall := fake.listRoomsArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
}
func (fake *FakeObjectStore) ListRoomsReturns(result1 []*livekit.Room, result2 error) {
+15 -8
View File
@@ -50,11 +50,12 @@ type FakeServiceStore struct {
result1 []*livekit.ParticipantInfo
result2 error
}
ListRoomsStub func(context.Context, []livekit.RoomName) ([]*livekit.Room, error)
ListRoomsStub func(context.Context, []livekit.RoomName, []livekit.RoomID) ([]*livekit.Room, error)
listRoomsMutex sync.RWMutex
listRoomsArgsForCall []struct {
arg1 context.Context
arg2 []livekit.RoomName
arg3 []livekit.RoomID
}
listRoomsReturns struct {
result1 []*livekit.Room
@@ -327,24 +328,30 @@ func (fake *FakeServiceStore) ListParticipantsReturnsOnCall(i int, result1 []*li
}{result1, result2}
}
func (fake *FakeServiceStore) ListRooms(arg1 context.Context, arg2 []livekit.RoomName) ([]*livekit.Room, error) {
func (fake *FakeServiceStore) ListRooms(arg1 context.Context, arg2 []livekit.RoomName, arg3 []livekit.RoomID) ([]*livekit.Room, error) {
var arg2Copy []livekit.RoomName
if arg2 != nil {
arg2Copy = make([]livekit.RoomName, len(arg2))
copy(arg2Copy, arg2)
}
var arg3Copy []livekit.RoomID
if arg3 != nil {
arg3Copy = make([]livekit.RoomID, len(arg3))
copy(arg3Copy, arg3)
}
fake.listRoomsMutex.Lock()
ret, specificReturn := fake.listRoomsReturnsOnCall[len(fake.listRoomsArgsForCall)]
fake.listRoomsArgsForCall = append(fake.listRoomsArgsForCall, struct {
arg1 context.Context
arg2 []livekit.RoomName
}{arg1, arg2Copy})
arg3 []livekit.RoomID
}{arg1, arg2Copy, arg3Copy})
stub := fake.ListRoomsStub
fakeReturns := fake.listRoomsReturns
fake.recordInvocation("ListRooms", []interface{}{arg1, arg2Copy})
fake.recordInvocation("ListRooms", []interface{}{arg1, arg2Copy, arg3Copy})
fake.listRoomsMutex.Unlock()
if stub != nil {
return stub(arg1, arg2)
return stub(arg1, arg2, arg3)
}
if specificReturn {
return ret.result1, ret.result2
@@ -358,17 +365,17 @@ func (fake *FakeServiceStore) ListRoomsCallCount() int {
return len(fake.listRoomsArgsForCall)
}
func (fake *FakeServiceStore) ListRoomsCalls(stub func(context.Context, []livekit.RoomName) ([]*livekit.Room, error)) {
func (fake *FakeServiceStore) ListRoomsCalls(stub func(context.Context, []livekit.RoomName, []livekit.RoomID) ([]*livekit.Room, error)) {
fake.listRoomsMutex.Lock()
defer fake.listRoomsMutex.Unlock()
fake.ListRoomsStub = stub
}
func (fake *FakeServiceStore) ListRoomsArgsForCall(i int) (context.Context, []livekit.RoomName) {
func (fake *FakeServiceStore) ListRoomsArgsForCall(i int) (context.Context, []livekit.RoomName, []livekit.RoomID) {
fake.listRoomsMutex.RLock()
defer fake.listRoomsMutex.RUnlock()
argsForCall := fake.listRoomsArgsForCall[i]
return argsForCall.arg1, argsForCall.arg2
return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3
}
func (fake *FakeServiceStore) ListRoomsReturns(result1 []*livekit.Room, result2 error) {
+28 -3
View File
@@ -202,11 +202,11 @@ func roomServiceListRoom(t *testing.T) {
createCtx := contextWithToken(createRoomToken())
listCtx := contextWithToken(listRoomToken())
// create rooms
_, err := roomClient.CreateRoom(createCtx, &livekit.CreateRoomRequest{
testRm, err := roomClient.CreateRoom(createCtx, &livekit.CreateRoomRequest{
Name: testRoom,
})
require.NoError(t, err)
_, err = roomClient.CreateRoom(contextWithToken(createRoomToken()), &livekit.CreateRoomRequest{
yourRm, err := roomClient.CreateRoom(contextWithToken(createRoomToken()), &livekit.CreateRoomRequest{
Name: "yourroom",
})
require.NoError(t, err)
@@ -216,7 +216,7 @@ func roomServiceListRoom(t *testing.T) {
require.NoError(t, err)
require.Len(t, res.Rooms, 2)
})
t.Run("list specific rooms", func(t *testing.T) {
t.Run("list specific rooms by name", func(t *testing.T) {
res, err := roomClient.ListRooms(listCtx, &livekit.ListRoomsRequest{
Names: []string{"yourroom"},
})
@@ -224,4 +224,29 @@ func roomServiceListRoom(t *testing.T) {
require.Len(t, res.Rooms, 1)
require.Equal(t, "yourroom", res.Rooms[0].Name)
})
t.Run("list specific rooms by sid", func(t *testing.T) {
res, err := roomClient.ListRooms(listCtx, &livekit.ListRoomsRequest{
RoomSids: []string{testRm.Sid},
})
require.NoError(t, err)
require.Len(t, res.Rooms, 1)
require.Equal(t, testRm.Sid, res.Rooms[0].Sid)
})
t.Run("list specific rooms by name and sid overlap", func(t *testing.T) {
res, err := roomClient.ListRooms(listCtx, &livekit.ListRoomsRequest{
Names: []string{testRoom},
RoomSids: []string{testRm.Sid},
})
require.NoError(t, err)
require.Len(t, res.Rooms, 1)
require.Equal(t, testRm.Sid, res.Rooms[0].Sid)
})
t.Run("list specific rooms by name and sid non-overlap", func(t *testing.T) {
res, err := roomClient.ListRooms(listCtx, &livekit.ListRoomsRequest{
Names: []string{testRoom},
RoomSids: []string{yourRm.Sid},
})
require.NoError(t, err)
require.Len(t, res.Rooms, 2)
})
}