diff --git a/pkg/rtc/room.go b/pkg/rtc/room.go index c677dd51e..0d6dfaff6 100644 --- a/pkg/rtc/room.go +++ b/pkg/rtc/room.go @@ -181,7 +181,7 @@ func (r *Room) Join(participant types.LocalParticipant, opts *ParticipantOptions return ErrAlreadyJoined } - if r.Room.MaxParticipants > 0 && int(r.Room.MaxParticipants) == len(r.participants) { + if r.Room.MaxParticipants > 0 && len(r.participants) >= int(r.Room.MaxParticipants) { prometheus.ServiceOperationCounter.WithLabelValues("participant_join", "error", "max_exceeded").Add(1) return ErrMaxParticipantsExceeded } diff --git a/pkg/service/roommanager.go b/pkg/service/roommanager.go index 1dddd23e9..38170d72c 100644 --- a/pkg/service/roommanager.go +++ b/pkg/service/roommanager.go @@ -260,6 +260,7 @@ func (r *RoomManager) StartSession(ctx context.Context, roomName livekit.RoomNam } if err = room.Join(participant, &opts, r.iceServersForRoom(room.Room)); err != nil { pLogger.Errorw("could not join room", err) + _ = participant.Close(true) return } if err = r.roomStore.StoreParticipant(ctx, roomName, participant.ToProto()); err != nil { diff --git a/pkg/service/rtcservice.go b/pkg/service/rtcservice.go index e7eaa4fd0..339a0e86b 100644 --- a/pkg/service/rtcservice.go +++ b/pkg/service/rtcservice.go @@ -151,8 +151,10 @@ func (s *RTCService) ServeHTTP(w http.ResponseWriter, r *http.Request) { _, err := s.store.LoadRoom(context.Background(), roomName) if err == ErrRoomNotFound { handleError(w, 404, err.Error()) + return } else if err != nil { handleError(w, 500, err.Error()) + return } } diff --git a/test/singlenode_test.go b/test/singlenode_test.go index 72673886b..17dae069d 100644 --- a/test/singlenode_test.go +++ b/test/singlenode_test.go @@ -361,6 +361,11 @@ func TestAutoCreate(t *testing.T) { token := joinToken(testRoom, "start-before-create") _, err := testclient.NewWebSocketConn(fmt.Sprintf("ws://localhost:%d", defaultServerPort), token, nil) require.Error(t, err) + + // second join should also fail + token = joinToken(testRoom, "start-before-create-2") + _, err = testclient.NewWebSocketConn(fmt.Sprintf("ws://localhost:%d", defaultServerPort), token, nil) + require.Error(t, err) }) t.Run("join with explicit createRoom", func(t *testing.T) {