const { MongoClient } = require("mongodb") const { database_url, database_name } = require('../../config') const crypto = require("crypto") let max_database_connection_timeout = 1000 const get_db = async () => { const client = new MongoClient(database_url, { serverSelectionTimeoutMS: max_database_connection_timeout, useUnifiedTopology: true }) try { await client.connect() } catch (err) { console.log('can not connect to database') return null } return client.db(database_name) } const get_titles = async (start, count) => { var db = await get_db() if (!db) { return null } var titles = await db.collection('title').find().skip(parseInt(start)).limit(parseInt(count)).toArray() return (!titles.length) ? null : titles } const get_free_session_servers = async (title) => { var db = await get_db() if (!db) { return null } var servers = await db.collection('session_server').find({title:title}).toArray() if (!servers.length) { return null } var active_session = db.collection('active_session') var free_servers = [] var servers_length = servers.length for (var i = 0; i < servers_length; ++i) { var sessions = await active_session.find({url:servers[i].url}).toArray() if (servers[i].limit > sessions.length) { free_servers.push(servers[i]) } } return free_servers } const add_active_session = async (server_url, session_id, websocket_url) => { var db = await get_db() if (!db) { return false } var active_session = db.collection('active_session') await active_session.insertOne({ server_url: server_url, session_id: session_id, websocket_url: websocket_url }) return true } const generate_session_id = async () => { var db = await get_db() if (!db) { return null } var active_session = db.collection('active_session') var session_id = {} var max_id_len = 6 var sessions_with_id = 0 while(true) { session_id = crypto.randomBytes(max_id_len/2).toString('hex').toUpperCase() sessions_with_id = await active_session.find({session_id:session_id}).toArray().length if (!sessions_with_id) { return session_id } } } const remove_active_session = async (session_id) => { var db = await get_db() if (!db) { return false } await db.collection('active_session').deleteOne({session_id:{$in:[session_id]}}) return true } const get_session_websocket_url = async (session_id) => { var db = await get_db() if (!db) { return null } var active_session = db.collection('active_session') var session = await active_session.findOne({session_id:session_id}) if (!session) { return null } return session.websocket_url } module.exports = { get_titles, get_free_session_servers, add_active_session, generate_session_id, remove_active_session, get_session_websocket_url }