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 }