Files
pixel-streaming-coordinator/src/database/database.js
T

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
}