Files
pixel-streaming-session-server/src/modules/session_observer.js
T
2023-04-20 09:02:44 +03:00

68 lines
2.1 KiB
JavaScript

const run_process = require('../modules/run_process')
const database = require('../database/database')
const {is_proc_running, kill_proc} = require('./run_process')
const coordinator = require('./coordinator')
const wait_list = require('./wait_list')
const {free_app_port, free_webrtc_port, free_sfu_port} = require('./port_alloc')
const observer_timeout = 100
let pending_list = new wait_list([])
const start_observer = () => {
check()
setTimeout(() => start_observer(), observer_timeout)
}
// check sessions in parallel
const check_sessions = async (sessions) => {
await Promise.all(sessions.map(async (session) => {
let webrtc_running = is_proc_running(session.webrtc_pid)
let app_running = is_proc_running(session.app_pid)
if (webrtc_running && app_running) {
return
}
// if something running kill process and skip remove from database
if (!webrtc_running || !app_running) {
// if session already in peding list skip
if (pending_list.is_waiting(session.session_id)) {
return
}
pending_list.add(session.session_id)
// kill process if running
kill_proc(session.webrtc_pid)
kill_proc(session.app_pid)
kill_proc(session.sfu_pid)
// free ports allocated for processes
free_webrtc_port(session.webrtc_port)
free_app_port(session.app_port)
free_sfu_port(session.sfu_port)
let close_session_result = await coordinator.close_session(session)
if (close_session_result) {
await database.add_running_session_to_history(session.session_id)
await database.remove_running_session(session.session_id)
} else {
console.error('can not connect to coordinator')
}
pending_list.remove(session.session_id)
}
}))
}
const check = async () => {
let sessions = await database.get_running_sessions()
if (!sessions) {
return
}
check_sessions(sessions)
}
module.exports = {
start_observer
}