config tests added,

titles tests added,
.env file support added with dotenv,
README.md file updated for .evn file support,
database lost connection bug crash fixed,
session server run_session long timeout bug fixed,
links module added,
webrtc_proc json arguments added,
app_proc stdout and stderr support added,
infinity app_proc spawn freeze bug fixed
This commit is contained in:
C
2023-01-30 17:55:15 +05:00
parent e3e2cc97aa
commit dae22f393c
14 changed files with 3222 additions and 26 deletions
+3 -3
View File
@@ -4,7 +4,7 @@ const {get_app_path} = require('../modules/titles')
const not_found_error = require('../../lib/src/http/errors/not_found_error')
const server_error = require('../../lib/src/http/errors/server_error')
const {run_webrtc, run_app} = require('../modules/run_process')
const {external_url} = require('../../config')
const {create_websocket_url} = require('../modules/links')
const run_session = async (req, res, next) => {
@@ -42,8 +42,8 @@ const run_session = async (req, res, next) => {
next(new server_error('can not add session to database'))
return
}
res.json({websocket_url:`wss://${external_url}${webrtc_port}/`})
res.json({websocket_url:create_websocket_url(webrtc_port)})
}
module.exports = {
+9 -7
View File
@@ -2,18 +2,21 @@ const { MongoClient } = require("mongodb")
const { database_url, database_name } = require('../../config')
let max_database_connection_timeout = 1000
const client = new MongoClient(database_url, {
serverSelectionTimeoutMS: max_database_connection_timeout,
useUnifiedTopology: true
})
const get_db = async () => {
const client = new MongoClient(database_url, {
serverSelectionTimeoutMS: max_database_connection_timeout,
useUnifiedTopology: true
})
try {
await client.connect()
await client.db(database_name).command({ ping: 1 })
return client.db(database_name)
} catch (err) {
console.log('can not connect to database')
console.error('can not connect to database')
await client.close()
return null
}
return client.db(database_name)
}
const add_running_session = async (session_id, app_pid, webrtc_pid) => {
@@ -46,7 +49,6 @@ const get_running_sessions = async () => {
if (!db) {
return null
}
var running_sessions = await db.collection('running_session').find().toArray()
return (!running_sessions.length) ? null : running_sessions
}
+17
View File
@@ -0,0 +1,17 @@
const {external_domain} = require('../../config')
const create_websocket_url = (webrtc_port) => {
var valid_external_domain = external_domain
// if external domain contains http OR https part remove it
valid_external_domain = valid_external_domain.replace('http://', '').replace('https://', '')
valid_external_domain = (valid_external_domain.slice(-1) == '/') ?
valid_external_domain.substring(0, valid_external_domain.length - 1) : valid_external_domain
return `wss://${valid_external_domain}/${webrtc_port}/`
}
module.exports = {
create_websocket_url
}
+14 -4
View File
@@ -10,7 +10,7 @@ const is_proc_running = (pid) => {
return is_running(pid)
}
const is_proc_running_async = async (pid, check_time) => {
const is_proc_running_async = async (pid, time_ms) => {
var timeout_count = 0
var check_times = 10
@@ -22,7 +22,7 @@ const is_proc_running_async = async (pid, check_time) => {
if (timeout_count > check_times) {
return true
}
await new Promise(resolve => setTimeout(resolve, check_time / check_times))
await new Promise(resolve => setTimeout(resolve, time_ms / check_times))
}
}
@@ -33,7 +33,8 @@ const run_webrtc = async (webrtc_port, app_port) => {
var webrtc_proc
try {
webrtc_proc = fork(webrtc_server_path, [webrtc_port.toString(), app_port.toString()], {
var webrtc_proc_arg = JSON.stringify({webrtc_port:webrtc_port, app_port:app_port})
webrtc_proc = fork(webrtc_server_path, [webrtc_proc_arg], {
detached: true
})
} catch (err) {
@@ -49,9 +50,18 @@ const run_app = async (app_path, app_port) => {
var app_proc
try {
app_proc = spawn(app_path, [].concat(app_args_static,
[app_port_arg + app_port.toString()]), {
[app_port_arg + app_port.toString()], { cwd: './', stdio: ['ignore', 'pipe', 'pipe']}), {
detached: true
})
// bind some events to unfreez process
app_proc.stdout.on('data', data => {
//console.log('stdout: ' + data.toString());
})
app_proc.stderr.on('data', data => {
//console.log('stderr: ' + data.toString());
})
} catch (err) {
return null
}
+13 -5
View File
@@ -2,8 +2,10 @@ 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()
@@ -16,16 +18,22 @@ 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) {
var close_session_result = await coordinator.close_session(session.session_id)
if (close_session_result) {
database.remove_running_session(session.session_id)
if (!pending_list.is_waiting(session.session_id)) {
pending_list.add(session.session_id)
var close_session_result = await coordinator.close_session(session.session_id)
if (close_session_result) {
database.remove_running_session(session.session_id)
} else {
pending_list.remove(session.session_id)
console.log('can not connect to coordinator')
}
}
} else {
kill_proc(session.webrtc_pid)
@@ -36,7 +44,7 @@ const check_sessions = async (sessions) => {
const check = async () => {
var sessions = await database.get_running_sessions()
if (!sessions) {
return
}
+20
View File
@@ -0,0 +1,20 @@
module.exports = class wait_list {
constructor(list) {
this.list = list
}
is_waiting(id) {
return (this.list.indexOf(id) > -1)
}
add(id) {
if (this.is_waiting(id)) {
return
}
this.list.push(id)
}
remove(id) {
this.list.splice(this.list.indexOf(id), 1)
}
}