Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 14 additions & 2 deletions server/multiplayer/ServerMultiplayerRoomMixin.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import ServerPlayer from './ServerPlayer.js';
import Votekick from './VoteKick.js';
import { HEADER, ENDC, OKCYAN, OKBLUE } from '../bcolors.js';
import isAppropriateString from '../moderation/is-appropriate-string.js';
import { MODE_ENUM, QUESTION_TYPE_ENUM, TOSSUP_PROGRESS_ENUM } from '../../quizbowl/constants.js';
import { BONUS_PROGRESS_ENUM, MODE_ENUM, QUESTION_TYPE_ENUM, TOSSUP_PROGRESS_ENUM } from '../../quizbowl/constants.js';
import insertTokensIntoHTML from '../../quizbowl/insert-tokens-into-html.js';
// import TossupRoom from '../../quizbowl/TossupRoom.js';
import RateLimit from '../RateLimit.js';
Expand Down Expand Up @@ -47,7 +47,7 @@ const ServerMultiplayerRoomMixin = (RoomClass) => class extends RoomClass {
};

getSetList().then(setList => { this.packetList = setList; });
setInterval(this.cleanupExpiredBansAndKicks.bind(this), 5 * 60 * 1000); // 5 minutes
this.cleanupInterval = setInterval(this.cleanupExpiredBansAndKicks.bind(this), 5 * 60 * 1000); // 5 minutes
}

async message ({ userId, username }, message) {
Expand Down Expand Up @@ -254,6 +254,18 @@ const ServerMultiplayerRoomMixin = (RoomClass) => class extends RoomClass {
}

this.leave(userId);

// Reclaim non-permanent rooms once they empty out, so the room object and
// its cleanup interval don't leak. Skip while a question is in progress;
// its timers still hold a reference and the room will be reclaimed the next
// time it empties between questions.
const isEmpty = Object.keys(this.sockets).length === 0;
const isIdle = this.tossupProgress === TOSSUP_PROGRESS_ENUM.NOT_STARTED &&
this.bonusProgress === BONUS_PROGRESS_ENUM.NOT_STARTED;
if (isEmpty && isIdle && !this.isPermanent && !this.isVerified) {
clearInterval(this.cleanupInterval);
this.onEmpty?.();
}
}

giveAnswerLiveUpdate ({ userId, username }, { givenAnswer }) {
Expand Down
2 changes: 2 additions & 0 deletions server/multiplayer/handle-wss-connection.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ function createAndReturnRoom (roomName, userId, isPrivate = false, isControlled
// A room cannot be both public and controlled
room.settings.public = !isPrivate && !isControlled;
room.settings.controlled = isControlled;
// Remove the room once it empties out so it doesn't leak (see closeConnection).
room.onEmpty = () => { delete tossupBonusRooms[roomName]; };
tossupBonusRooms[roomName] = room;
}

Expand Down
Loading