database separated and stability improved, celebrate argument parse added, fastest session server search added, session server work check added, session server websocket get added, error handling improved, overal stability improved, overal scalability improved, everything refactored
This commit is contained in:
@@ -0,0 +1,119 @@
|
||||
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) {
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user