config 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
This commit is contained in:
@@ -1,3 +1,11 @@
|
|||||||
# pixel-streaming-coordinator
|
# pixel-streaming-coordinator
|
||||||
|
|
||||||
pixel streaming coordinator
|
pixel streaming coordinator
|
||||||
|
|
||||||
|
configure environment variables with .env file
|
||||||
|
|
||||||
|
.env:
|
||||||
|
|
||||||
|
PORT=
|
||||||
|
DATABASE_URL=""
|
||||||
|
DATABASE_NAME=""
|
||||||
@@ -8,6 +8,13 @@ const {request_logger, error_logger} = require('./src/middlewares/logger')
|
|||||||
const {options, cors} = require('./src/middlewares/cors')
|
const {options, cors} = require('./src/middlewares/cors')
|
||||||
const {error_handler} = require('./src/middlewares/error_handler')
|
const {error_handler} = require('./src/middlewares/error_handler')
|
||||||
//const limiter = require('./src/middlewares/limiter')
|
//const limiter = require('./src/middlewares/limiter')
|
||||||
|
const {test_config} = require('./tests/config')
|
||||||
|
|
||||||
|
if (!test_config()) {
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('all initial tests successfully passed')
|
||||||
|
|
||||||
app.options(options)
|
app.options(options)
|
||||||
|
|
||||||
@@ -32,5 +39,4 @@ app.use(error_handler)
|
|||||||
|
|
||||||
// start listen server
|
// start listen server
|
||||||
app.listen(port)
|
app.listen(port)
|
||||||
console.log('all config.js tests passed successfully [not developed]')
|
|
||||||
console.log(`Listening at http://localhost:${port}`)
|
console.log(`Listening at http://localhost:${port}`)
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
require('dotenv').config()
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
port: parseInt(process.env.PORT),
|
port: parseInt(process.env.PORT),
|
||||||
database_url: process.env.DATABASE_URL,
|
database_url: process.env.DATABASE_URL,
|
||||||
|
|||||||
Generated
+2420
File diff suppressed because it is too large
Load Diff
@@ -20,8 +20,12 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"body-parser": "^1.20.1",
|
"body-parser": "^1.20.1",
|
||||||
"celebrate": "^15.0.1",
|
"celebrate": "^15.0.1",
|
||||||
|
"dotenv": "^16.0.3",
|
||||||
"express": "^4.18.2",
|
"express": "^4.18.2",
|
||||||
"express-rate-limit": "^6.7.0",
|
"express-rate-limit": "^6.7.0",
|
||||||
|
"helmet": "^6.0.1",
|
||||||
|
"mongodb": "^4.13.0",
|
||||||
|
"node-datetime": "^2.1.2",
|
||||||
"request": "^2.88.2"
|
"request": "^2.88.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-12
@@ -3,18 +3,21 @@ const { database_url, database_name } = require('../../config')
|
|||||||
const crypto = require("crypto")
|
const crypto = require("crypto")
|
||||||
let max_database_connection_timeout = 1000
|
let max_database_connection_timeout = 1000
|
||||||
|
|
||||||
|
const client = new MongoClient(database_url, {
|
||||||
|
serverSelectionTimeoutMS: max_database_connection_timeout,
|
||||||
|
useUnifiedTopology: true
|
||||||
|
})
|
||||||
|
|
||||||
const get_db = async () => {
|
const get_db = async () => {
|
||||||
const client = new MongoClient(database_url, {
|
|
||||||
serverSelectionTimeoutMS: max_database_connection_timeout,
|
|
||||||
useUnifiedTopology: true
|
|
||||||
})
|
|
||||||
try {
|
try {
|
||||||
await client.connect()
|
await client.connect()
|
||||||
|
await client.db(database_name).command({ ping: 1 })
|
||||||
|
return client.db(database_name)
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.log('can not connect to database')
|
console.error('can not connect to database')
|
||||||
|
await client.close()
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
return client.db(database_name)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const get_titles = async (start, count) => {
|
const get_titles = async (start, count) => {
|
||||||
@@ -41,14 +44,14 @@ const get_free_session_servers = async (title) => {
|
|||||||
var active_session = db.collection('active_session')
|
var active_session = db.collection('active_session')
|
||||||
|
|
||||||
var free_servers = []
|
var free_servers = []
|
||||||
var servers_length = servers.length
|
|
||||||
for (var i = 0; i < servers_length; ++i) {
|
for (const server of servers) {
|
||||||
var sessions = await active_session.find({url:servers[i].url}).toArray()
|
var sessions = await active_session.find({server_url:server.url}).toArray()
|
||||||
if (servers[i].limit > sessions.length) {
|
if (server.limit > sessions.length) {
|
||||||
free_servers.push(servers[i])
|
free_servers.push(server)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return free_servers
|
return (free_servers.length) ? free_servers : null
|
||||||
}
|
}
|
||||||
|
|
||||||
const add_active_session = async (server_url, session_id, websocket_url) => {
|
const add_active_session = async (server_url, session_id, websocket_url) => {
|
||||||
|
|||||||
@@ -1,44 +1,55 @@
|
|||||||
var request = require('request')
|
var request = require('request')
|
||||||
const max_response_timeout = 1000
|
const max_response_timeout = 1000
|
||||||
const max_run_session_timeout = 10000
|
const max_run_session_timeout = 5000
|
||||||
|
|
||||||
|
|
||||||
|
const ping_session_server = async (url) => {
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
url: url + '/ping',
|
||||||
|
method: "GET",
|
||||||
|
timeout: max_response_timeout
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
request(options,
|
||||||
|
async function(err, answer, data) {
|
||||||
|
if (err || answer.statusCode != 200) {
|
||||||
|
resolve(false)
|
||||||
|
} else {
|
||||||
|
resolve(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const get_fastest_session_server = async (free_servers) => {
|
const get_fastest_session_server = async (free_servers) => {
|
||||||
var fastest_server = null
|
var fastest_server = null
|
||||||
var free_servers_length = free_servers.length
|
|
||||||
|
Promise.all(free_servers.map(async (server) => {
|
||||||
for (var i = 0; i < free_servers_length; ++i) {
|
const is_working = await ping_session_server(server.url)
|
||||||
var options = {
|
if (is_working) {
|
||||||
url: free_servers[i].url + '/ping',
|
if (!fastest_server) {
|
||||||
method: "GET",
|
fastest_server = server
|
||||||
timeout: max_response_timeout
|
}
|
||||||
}
|
}
|
||||||
|
}))
|
||||||
var f = (async function(server) {
|
|
||||||
request(options,
|
|
||||||
async function(err, answer, data) {
|
|
||||||
if (err) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if (!fastest_server) {
|
|
||||||
fastest_server = server
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})(free_servers[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
var timeout_count = 0
|
var timeout_count = 0
|
||||||
var check_times = 1000
|
var check_times = 100
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
++timeout_count
|
++timeout_count
|
||||||
if (fastest_server) {
|
if (fastest_server) {
|
||||||
return fastest_server
|
return fastest_server
|
||||||
}
|
}
|
||||||
if (timeout_count > check_times) {
|
if (timeout_count > check_times) {
|
||||||
return fastest_server
|
break
|
||||||
}
|
}
|
||||||
await new Promise(resolve => setTimeout(resolve, max_response_timeout / check_times))
|
await new Promise(resolve => setTimeout(resolve, max_response_timeout / check_times))
|
||||||
}
|
}
|
||||||
|
return fastest_server
|
||||||
}
|
}
|
||||||
|
|
||||||
const run_session = async (server_url, session_id, title) => {
|
const run_session = async (server_url, session_id, title) => {
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
var config = require('../config')
|
||||||
|
|
||||||
|
const not_valid = (message) => {
|
||||||
|
console.log('not valid: ', message)
|
||||||
|
}
|
||||||
|
|
||||||
|
const test_config = () => {
|
||||||
|
var config_pass = true
|
||||||
|
|
||||||
|
if (!config) {
|
||||||
|
not_valid('config')
|
||||||
|
config_pass = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.port) {
|
||||||
|
not_valid('port')
|
||||||
|
config_pass = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.database_url) {
|
||||||
|
not_valid('database_url')
|
||||||
|
config_pass = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!config.database_name) {
|
||||||
|
not_valid('database_name')
|
||||||
|
config_pass = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return config_pass
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
test_config
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user