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:
@@ -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 = {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user