REST API upgrade

This commit is contained in:
C
2022-12-14 19:03:49 +05:00
parent 288718779d
commit 39790bdd2a
25 changed files with 1010 additions and 3767 deletions
+6 -2
View File
@@ -1,6 +1,10 @@
{
"ip" : "192.168.1.115",
"port" : "3001",
"mongodb_url" : "mongodb://127.0.0.1:27017/",
"database_name" : "pixel_streaming"
"mongodb_url" : "mongodb://127.0.0.1:27017",
"database_name" : "pixel_streaming",
"cors":[
"http://192.168.1.171:3000",
"http://localhost:3000"
]
}
+79
View File
@@ -0,0 +1,79 @@
const db_connection = require('../database/connection.js')
// two bad headers
const http_client = require('../../lib/http_client.js')
const crypto = require('crypto')
module.exports.plan_session = async (req, res, next) => {
//var session_sheduled = database.collection('session_sheduled')
//var sessions = await session_sheduled.find().toArray()
//callback(response)
}
module.exports.create_session = async (req, res, next) => {
//create?title=name&next_var=0
try {
const db = await db_connection.get_db()
var servers = await db.collection('session_server').find({'title':req.query.title}).toArray()
if (!servers.length)
throw new Error('servers not found')
// find free server and create session
var session_active = db.collection('session_active')
var free_server
var servers_length = servers.length
for (var i = 0; i < servers_length; ++i) {
var sessions = await session_active.find({'server_id':servers[i].server_id}).toArray()
if (servers[i].limit > sessions.length) {
free_server = servers[i]
break
}
}
if (!free_server)
throw new Error('session limit reached')
var session_id = crypto.randomBytes(16).toString('hex')
// create session on session server
http_client.get({
host: free_server.ip,
port: free_server.port,
path: `/session/create?title=${req.query.title}&session_id=${session_id}`
}, async function(answer) {
answer = JSON.parse(answer)
//console.log(answer.method)
if (!answer.link) {
next(Error('session not created'))
return
}
// generate random code for session access
var code = Math.floor(1000 + Math.random() * 9000)
while ((await session_active.find({'code':code}).toArray()).length) {
code = Math.floor(1000 + Math.random() * 9000)
}
// add session to database
await session_active.insertOne({
server_id:free_server.server_id,
session_id:session_id,
connection_link:answer.link,
connection_code:code
})
res.json({msg:'SESSION_CREATED', link:answer.link})
}, function(err) {
next(Error('session server not working'))
})
} catch (e) {
next(e)
}
}
module.exports.connect_session = async (req, res, next) => {
}
module.exports.close_session = async (req, res, next) => {
const db = await db_connection.get_db()
await db.collection('session_active').deleteOne({session_id:req.query.session_id})
res.json({msg:"SESSION_CLOSED", session_id:req.session_id})
}
+12
View File
@@ -0,0 +1,12 @@
const config = require('../config.json')
const db_connection = require('../database/connection.js')
module.exports.get_titles = async (req, res, next) => {
try {
const db = await db_connection.get_db()
var titles = await db.collection('title').find().skip(parseInt(req.query.start)).limit(parseInt(req.query.count)).toArray()
res.json(titles)
} catch (e) {
next(e)
}
}
-157
View File
@@ -1,157 +0,0 @@
// coordinator
// 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')
const mongodb_client = require('./mongodb_client.js')
const crypto = require('crypto')
var querystring = require('querystring')
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')
// response function
async function create_response(request, callback) {
var mongo_client = new mongodb_client(config.mongodb_url)
var database = await mongo_client.connect_database(config.database_name)
var response = ''
try {
if (request.verb == 'GET_TITLES') {
var title = database.collection('title')
response = await title.find().skip(request.start).limit(request.count).toArray()
callback(response)
} else if (request.verb == 'PLAN_SESSION') {
var session_sheduled = database.collection('session_sheduled')
var sessions = await session_sheduled.find().toArray()
callback(response)
} else if (request.verb == 'CREATE_SESSION') {
var session_server = database.collection('session_server')
var servers = await session_server.find({'title':request.title}).toArray()
if (!servers.length) {
response = {msg:'SERVERS_NOT_FOUND'}
callback(response)
return
}
// find free server and create session
var session_active = database.collection('session_active')
// find free server
var free_server
var servers_length = servers.length
for (var i = 0; i < servers_length; ++i) {
var sessions = await session_active.find({'server_id':servers[i].server_id}).toArray()
if (servers[i].limit > sessions.length) {
free_server = servers[i]
break
}
}
if (free_server == null) {
response = {msg:'SESSION_LIMIT_REACHED'}
callback(response)
return
}
var session_id = crypto.randomBytes(16).toString('base64')
// create session on session server
new http_client(free_server.ip, free_server.port).post(
JSON.stringify({verb:'CREATE_SESSION', title:request.title, session_id:session_id}), async function(answer) {
var json_answer = await JSON.parse(answer)
if (json_answer.link == null) {
response = {msg:'SESSION_SERVER_NOT_WORKING'}
callback(response)
return
}
// generate random code for session access
var code = Math.floor(1000 + Math.random() * 9000)
while ((await session_active.find({'code':code}).toArray()).length) {
code = Math.floor(1000 + Math.random() * 9000)
}
// add session to database
await session_active.insertOne({
server_id:free_server.server_id,
session_id:session_id,
connection_link:json_answer.link,
connection_code:code
})
response = {msg:'SESSION_CREATED', link:json_answer.link}
callback(response)
return
},
function(error) {
logger_runtime.error(error)
callback({msg:'SESSION_SERVER_DISABLED'})
return
})
} else if (request.verb == 'CONNECT_SESSION') {
callback(response)
return
} else if (request.verb == 'CLOSE_SESSION') {
await database.collection('session_active').deleteOne({session_id:request.session_id})
response = {msg:"SESSION_CLOSED", session_id:request.session_id}
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)
}
+17
View File
@@ -0,0 +1,17 @@
const { MongoClient } = require("mongodb")
const { mongodb_url, database_name } = require('../config.json')
const client = new MongoClient(mongodb_url)
let database
// throw exception
module.exports.get_db = async () => {
try {
await client.connect()
database = client.db(database_name)
} catch (e) {
throw e
}
return database
}
-26
View File
@@ -1,26 +0,0 @@
module.exports = class mongodb_client {
mongo_client
constructor(url) {
const {MongoClient} = require('mongodb')
this.mongo_client = new MongoClient(url)
}
// database connect function
async connect_database(database_name) {
try {
await this.mongo_client.connect()
const database = this.mongo_client.db(database_name)
console.log('Database connection status:', await database.command({ping: 1}))
return database
}
catch(e) {
console.error(e)
}
// finally
// {
// await mongodb_client.close()
// console.log("Database connection closed")
// }
}
}
File diff suppressed because it is too large Load Diff
-18
View File
@@ -1,18 +0,0 @@
{
"name": "coordinator",
"version": "1.0.0",
"description": "",
"main": "coordinator.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"dependencies": {
"express": "^4.18.2",
"mongodb": "^4.12.0",
"node-datetime": "^2.1.2"
}
}
+8
View File
@@ -0,0 +1,8 @@
const router = require('express').Router()
const router_title = require('./title')
const router_session = require('./session')
router.use('/title', router_title)
router.use('/session', router_session)
module.exports = router
+10
View File
@@ -0,0 +1,10 @@
const router = require('express').Router()
const {plan_session, create_session, connect_session, close_session} = require('../controller/session')
router.get('/plan', plan_session)
router.get('/create', create_session)
router.get('/connect', connect_session)
router.get('/close', close_session)
module.exports = router
+7
View File
@@ -0,0 +1,7 @@
const router = require('express').Router()
const {get_titles} = require('../controller/title')
router.get('/get', get_titles)
module.exports = router