EvalueTonSavoir/server/roomsProviders/base-provider.js

75 lines
2.1 KiB
JavaScript

/**
* @template T
* @typedef {import('../../types/room').RoomInfo} RoomInfo
* @typedef {import('../../types/room').RoomOptions} RoomOptions
* @typedef {import('../../types/room').BaseProviderConfig} BaseProviderConfig
*/
const MIN_NB_SECONDS_BEFORE_CLEANUP = process.env.MIN_NB_SECONDS_BEFORE_CLEANUP || 60
class BaseRoomProvider {
constructor(config = {}, roomRepository) {
this.config = config;
this.roomRepository = roomRepository;
this.quiz_docker_image = process.env.QUIZROOM_IMAGE || "evaluetonsavoir-quizroom";
this.quiz_docker_port = process.env.QUIZROOM_PORT || 4500;
this.quiz_expose_port = process.env.QUIZROOM_EXPOSE_PORT || false;
}
async createRoom(roomId, options) {
throw new Error("Fonction non-implantée - classe abstraite");
}
async deleteRoom(roomId) {
throw new Error("Fonction non-implantée - classe abstraite");
}
async getRoomStatus(roomId) {
throw new Error("Fonction non-implantée - classe abstraite");
}
async listRooms() {
throw new Error("Fonction non-implantée - classe abstraite");
}
async cleanup() {
throw new Error("Fonction non-implantée - classe abstraite");
}
async syncInstantiatedRooms(){
throw new Error("Fonction non-implantée - classe abstraite");
}
async updateRoomsInfo() {
const rooms = await this.roomRepository.getAll();
for(var room of rooms){
const url = `${room.host}/health`;
try {
const response = await fetch(url);
if (!response.ok) {
room.mustBeCleaned = true;
await this.roomRepository.update(room);
continue;
}
const json = await response.json();
room.nbStudents = json.connections;
room.mustBeCleaned = room.nbStudents === 0 && json.uptime >MIN_NB_SECONDS_BEFORE_CLEANUP;
await this.roomRepository.update(room);
} catch (error) {
room.mustBeCleaned = true;
await this.roomRepository.update(room);
}
}
}
async getRoomInfo(roomId) {
const info = await this.roomRepository.get(roomId);
return info;
}
}
module.exports = BaseRoomProvider;