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
|
||||
|
||||
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 {error_handler} = require('./src/middlewares/error_handler')
|
||||
//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)
|
||||
|
||||
@@ -32,5 +39,4 @@ app.use(error_handler)
|
||||
|
||||
// start listen server
|
||||
app.listen(port)
|
||||
console.log('all config.js tests passed successfully [not developed]')
|
||||
console.log(`Listening at http://localhost:${port}`)
|
||||
@@ -1,3 +1,5 @@
|
||||
require('dotenv').config()
|
||||
|
||||
module.exports = {
|
||||
port: parseInt(process.env.PORT),
|
||||
database_url: process.env.DATABASE_URL,
|
||||
|
||||
Generated
+2420
File diff suppressed because it is too large
Load Diff
@@ -20,8 +20,12 @@
|
||||
"dependencies": {
|
||||
"body-parser": "^1.20.1",
|
||||
"celebrate": "^15.0.1",
|
||||
"dotenv": "^16.0.3",
|
||||
"express": "^4.18.2",
|
||||
"express-rate-limit": "^6.7.0",
|
||||
"helmet": "^6.0.1",
|
||||
"mongodb": "^4.13.0",
|
||||
"node-datetime": "^2.1.2",
|
||||
"request": "^2.88.2"
|
||||
}
|
||||
}
|
||||
|
||||
+15
-12
@@ -3,18 +3,21 @@ const { database_url, database_name } = require('../../config')
|
||||
const crypto = require("crypto")
|
||||
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 get_titles = async (start, count) => {
|
||||
@@ -41,14 +44,14 @@ const get_free_session_servers = async (title) => {
|
||||
var active_session = db.collection('active_session')
|
||||
|
||||
var free_servers = []
|
||||
var servers_length = servers.length
|
||||
for (var i = 0; i < servers_length; ++i) {
|
||||
var sessions = await active_session.find({url:servers[i].url}).toArray()
|
||||
if (servers[i].limit > sessions.length) {
|
||||
free_servers.push(servers[i])
|
||||
|
||||
for (const server of servers) {
|
||||
var sessions = await active_session.find({server_url:server.url}).toArray()
|
||||
if (server.limit > sessions.length) {
|
||||
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) => {
|
||||
|
||||
@@ -1,44 +1,55 @@
|
||||
var request = require('request')
|
||||
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) => {
|
||||
var fastest_server = null
|
||||
var free_servers_length = free_servers.length
|
||||
|
||||
for (var i = 0; i < free_servers_length; ++i) {
|
||||
var options = {
|
||||
url: free_servers[i].url + '/ping',
|
||||
method: "GET",
|
||||
timeout: max_response_timeout
|
||||
|
||||
Promise.all(free_servers.map(async (server) => {
|
||||
const is_working = await ping_session_server(server.url)
|
||||
if (is_working) {
|
||||
if (!fastest_server) {
|
||||
fastest_server = server
|
||||
}
|
||||
}
|
||||
|
||||
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 check_times = 1000
|
||||
var check_times = 100
|
||||
|
||||
while (true) {
|
||||
++timeout_count
|
||||
if (fastest_server) {
|
||||
return fastest_server
|
||||
}
|
||||
if (timeout_count > check_times) {
|
||||
return fastest_server
|
||||
break
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, max_response_timeout / check_times))
|
||||
}
|
||||
return fastest_server
|
||||
}
|
||||
|
||||
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