120 lines
3.0 KiB
JavaScript
120 lines
3.0 KiB
JavaScript
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
|
|
} |