153 lines
4.9 KiB
JavaScript
153 lines
4.9 KiB
JavaScript
// session server
|
|
// http
|
|
const http = require('http')
|
|
// filesystem
|
|
const fs = require('fs')
|
|
// server config
|
|
const config = require('./config.json')
|
|
// node date time
|
|
const node_time = require('node-datetime')
|
|
// titles for process creation
|
|
const titles = require('./titles.json')
|
|
|
|
const { spawn } = require('node:child_process')
|
|
|
|
const child_process = require('child_process')
|
|
|
|
const port_alloc = require('../lib/port_alloc.js')
|
|
const http_client = require('../lib/http_client.js')
|
|
const logger = require('../lib/logger')
|
|
|
|
// logger
|
|
const logger_init = new logger('./logs/init.log')
|
|
const logger_runtime = new logger('./logs/runtime.log')
|
|
|
|
var app_port_alloc = new port_alloc(config.session_ports.app_begin, config.session_ports.count)
|
|
var http_port_alloc = new port_alloc(config.session_ports.http_begin, config.session_ports.count)
|
|
|
|
// response function
|
|
async function create_response(request, callback) {
|
|
var response = ''
|
|
try {
|
|
if (request.verb == 'CREATE_SESSION') {
|
|
var app_info
|
|
titles.forEach((title) => {
|
|
if (title.title == request.title) {
|
|
app_info = title
|
|
}
|
|
})
|
|
if (app_info == null) {
|
|
response = {msg:'TITLE_NOT_EXISTS'}
|
|
callback(response)
|
|
return
|
|
}
|
|
|
|
var app_port
|
|
var http_port
|
|
try {
|
|
app_port = app_port_alloc.get()
|
|
http_port = http_port_alloc.get()
|
|
} catch(e) {
|
|
logger_runtime.error(e)
|
|
response = {msg:'PORT_BUSY'}
|
|
callback(response)
|
|
return
|
|
}
|
|
|
|
// start app_proc
|
|
const app_proc = spawn(app_info.path, [].concat(config.app_args_static,
|
|
[config.app_args_runtime.ip + config.ip, config.app_args_runtime.port + app_port.toString()]), {
|
|
detached: true
|
|
})
|
|
app_proc.on('error', function(err) {
|
|
logger_runtime.error(err)
|
|
response = {msg:'APP_PROC_ERROR'}
|
|
callback(response)
|
|
return
|
|
})
|
|
app_proc.on('close', (code) => {
|
|
app_port_alloc.free(app_port)
|
|
})
|
|
|
|
// start webrtc server
|
|
const webrtc_proc = child_process.fork(config.webrtc_args_static.cirrus_path, [http_port.toString(), app_port.toString()], {
|
|
detached: true
|
|
})
|
|
webrtc_proc.on('error', function(err) {
|
|
logger_runtime.error(err)
|
|
response = {msg:'WEBRTC_PROC_ERROR'}
|
|
callback(response)
|
|
return
|
|
})
|
|
webrtc_proc.on('close', (code) => {
|
|
http_port_alloc.free(http_port)
|
|
// if webrtc server closed, kill app proc and send session end message to server
|
|
if (process.platform === 'win32') {
|
|
spawn('taskkill', ['/pid', app_proc.pid, '/f', '/t'])
|
|
}
|
|
else {
|
|
app_proc.kill('SIGINT')
|
|
}
|
|
new http_client(config.coordinator.ip, config.coordinator.port).post(
|
|
JSON.stringify({verb:'CLOSE_SESSION', session_id:request.session_id}), function(answer) {
|
|
|
|
},
|
|
function(error) {
|
|
|
|
})
|
|
|
|
})
|
|
|
|
response = {msg:'SESSION_CREATED', link:`http://${config.ip+':'+http_port}`}
|
|
callback(response)
|
|
return
|
|
} else if(request.verb == 'CONNECT_SESSION') {
|
|
response = ''
|
|
callback(response)
|
|
return
|
|
} else {
|
|
response = {msg:'UNKNOWN_VERB'}
|
|
callback(response)
|
|
return
|
|
}
|
|
}
|
|
catch(e) {
|
|
logger_runtime.error(e)
|
|
}
|
|
}
|
|
|
|
|
|
// start http server
|
|
const server = http.createServer(function(request, response) {
|
|
if (request.method == 'POST') {
|
|
var body = ''
|
|
request.on('data', function(data) {
|
|
body += data
|
|
})
|
|
request.on('end', function() {
|
|
logger_runtime.log('received: ', body)
|
|
response.writeHead(200, {'Content-Type': 'application/json'})
|
|
try {
|
|
create_response(JSON.parse(body), function(message) {
|
|
response.end(JSON.stringify(message))
|
|
logger_runtime.log('response:', message)
|
|
})
|
|
}
|
|
catch(e) {
|
|
logger_runtime.error(e)
|
|
}
|
|
})
|
|
}
|
|
else {
|
|
response.writeHead(501, {'Content-Type': 'application/json'})
|
|
response.end(JSON.stringify({msg:'UNKNOWN_METHOD'}))
|
|
}
|
|
})
|
|
|
|
|
|
try {
|
|
server.listen(config.port, config.ip)
|
|
logger_init.log(`Listening at http://${config.ip}:${config.port}`)
|
|
} catch (e) {
|
|
logger_init.error(e)
|
|
} |