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 observer_timeout = 100 var 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) => { var webrtc_running = is_proc_running(session.webrtc_pid) var 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) var close_session_result = await coordinator.close_session(session.session_id) if (close_session_result) { await database.remove_running_session(session.session_id) } else { console.log('can not connect to coordinator') } pending_list.remove(session.session_id) } })) } const check = async () => { var sessions = await database.get_running_sessions() if (!sessions) { return } check_sessions(sessions) } module.exports = { start_observer }