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:
C
2023-01-30 17:49:19 +05:00
parent 0c0201622b
commit 622556911c
8 changed files with 2527 additions and 38 deletions
+9 -1
View File
@@ -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=""
+7 -1
View File
@@ -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}`)
+2
View File
@@ -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,
+2420
View File
File diff suppressed because it is too large Load Diff
+4
View File
@@ -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
View File
@@ -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) => {
+35 -24
View File
@@ -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) => {
+35
View File
@@ -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
}