create session added
This commit is contained in:
@@ -0,0 +1,51 @@
|
|||||||
|
1. открыли страницу стриминга, после нажатия на кнопку демонстрации отправляем запрос на сервер для
|
||||||
|
получения названий жк, их описаний, картинок
|
||||||
|
|
||||||
|
Зпрос:
|
||||||
|
{"verb":"GET_TITLES", "start":0, "count":50}
|
||||||
|
|
||||||
|
Ответ:
|
||||||
|
[{
|
||||||
|
"title": {
|
||||||
|
"en": "Title",
|
||||||
|
"ru": "Название"
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"en": "Russia, Moscow",
|
||||||
|
"ru": "Россия, Москва"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en": "Best RC ...",
|
||||||
|
"ru": "Лучший ЖК ..."
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"main": "URL1",
|
||||||
|
"second": "URL2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": {
|
||||||
|
"en": "Title",
|
||||||
|
"ru": "Название"
|
||||||
|
},
|
||||||
|
"location": {
|
||||||
|
"en": "Russia, Moscow",
|
||||||
|
"ru": "Россия, Москва"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"en": "Best RC ...",
|
||||||
|
"ru": "Лучший ЖК ..."
|
||||||
|
},
|
||||||
|
"image": {
|
||||||
|
"main": "URL1",
|
||||||
|
"second": "URL2"
|
||||||
|
}
|
||||||
|
}]
|
||||||
|
|
||||||
|
2. если пользователь нажал на один из жк для создания сессии отправляем запрос
|
||||||
|
|
||||||
|
Запрос:
|
||||||
|
{"verb":"CREATE_SESSION", "title":"SomeRC"}
|
||||||
|
|
||||||
|
Ответ:
|
||||||
|
{"msg":"SESSION_CREATED", "link":"google.com"}
|
||||||
@@ -42,3 +42,25 @@
|
|||||||
{"verb":"CONNECT_SESSION_WITH_CODE", "code":"1234"},
|
{"verb":"CONNECT_SESSION_WITH_CODE", "code":"1234"},
|
||||||
в ответ придёт {"verb":"CONNECT_TO_SESSION", "ip":"0.0.0.1", "port":"1111", "code":"1234"}, или
|
в ответ придёт {"verb":"CONNECT_TO_SESSION", "ip":"0.0.0.1", "port":"1111", "code":"1234"}, или
|
||||||
если сессии не существует {"msg":"SESSION_NOT_EXIST"}.
|
если сессии не существует {"msg":"SESSION_NOT_EXIST"}.
|
||||||
|
|
||||||
|
|
||||||
|
COMMANDS:
|
||||||
|
{"verb":"GET_TITLES", "start":0, "count":50}
|
||||||
|
{"verb":"PLAN_SESSION", "title":"SomeRC", "year":2022, "month":11, "day":4, "hour":20, "minute":13, "period_minute":30}
|
||||||
|
|
||||||
|
{
|
||||||
|
"title":"SomeRC",
|
||||||
|
"data":[
|
||||||
|
{
|
||||||
|
"ip":"127.0.0.1",
|
||||||
|
"port":"0000",
|
||||||
|
"copies":5
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ip":"127.0.0.2",
|
||||||
|
"port":"0001",
|
||||||
|
"copies":2
|
||||||
|
}
|
||||||
|
]}
|
||||||
|
|
||||||
|
{"verb":"CREATE_SESSION", "title":"SomeRC"}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
CHECKOUT_DATABASE:
|
CHECKOUT_DATABASE:
|
||||||
how dbs - show all dbs
|
show dbs - show all dbs
|
||||||
se some_name_db - set current db
|
set some_name_db - set current db
|
||||||
how collections - all collections of current db
|
show collections - all collections of current db
|
||||||
b.stats() - stats of DB
|
db.stats() - stats of DB
|
||||||
b.users.stats() - some stats
|
db.users.stats() - some stats
|
||||||
|
|
||||||
ADD_DATA:
|
ADD_DATA:
|
||||||
nsertOne() - insert document to collection
|
insertOne() - insert document to collection
|
||||||
nsertMany()
|
insertMany()
|
||||||
|
|
||||||
EXAMPLE:
|
EXAMPLE:
|
||||||
db.collection_name.insertOne({"name":"Tom", "age": 28, languages: ["english":"spanish"]})
|
db.collection_name.insertOne({"name":"Tom", "age": 28, languages: ["english":"spanish"]})
|
||||||
@@ -25,7 +25,7 @@ WITH_FILE: example.js AND CONTENT
|
|||||||
load("example.js") - this command will load previous example in db
|
load("example.js") - this command will load previous example in db
|
||||||
|
|
||||||
DOCUMENT_FILTER:
|
DOCUMENT_FILTER:
|
||||||
b.collection_name.find() - show all documents in colleciton
|
db.collection_name.find() - show all documents in colleciton
|
||||||
|
|
||||||
EXAMPLES:
|
EXAMPLES:
|
||||||
db.collection_name.find({name: "Tom"}) - find documents with names
|
db.collection_name.find({name: "Tom"}) - find documents with names
|
||||||
|
|||||||
Vendored
+111
-69
@@ -1,11 +1,18 @@
|
|||||||
|
// coordinator
|
||||||
// http
|
// http
|
||||||
const http = require('http')
|
const http = require('http')
|
||||||
// filesystem
|
// filesystem
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
// server config
|
// server config
|
||||||
var config = require('./config.json');
|
const config = require('./config.json')
|
||||||
// node date time
|
// node date time
|
||||||
var node_time = require('node-datetime')
|
const node_time = require('node-datetime')
|
||||||
|
|
||||||
|
const mongodb_client = require('./mongodb_client.js')
|
||||||
|
|
||||||
|
const crypto = require('crypto')
|
||||||
|
|
||||||
|
var querystring = require('querystring')
|
||||||
|
|
||||||
// write startup server history
|
// write startup server history
|
||||||
var logs_dir = './logs'
|
var logs_dir = './logs'
|
||||||
@@ -15,89 +22,124 @@ if (!fs.existsSync(logs_dir))
|
|||||||
fs.appendFileSync(`./${logs_dir}/launch_history.log`, (node_time.create().format('Y-m-d H:M:S')).toString() + '\n')
|
fs.appendFileSync(`./${logs_dir}/launch_history.log`, (node_time.create().format('Y-m-d H:M:S')).toString() + '\n')
|
||||||
|
|
||||||
|
|
||||||
// mongodb connect function
|
async function PostSessionServer(data, ip, port, callback) {
|
||||||
async function connect_mongodb(MongoClient)
|
// Build the post string from an object
|
||||||
{
|
// An object of options to indicate where to post to
|
||||||
const mongodb_client = new MongoClient(config.mongodb_url)
|
var post_options = {
|
||||||
try
|
host: ip,
|
||||||
{
|
port: port,
|
||||||
// connect to the MongoDB cluster (now just database)
|
method: 'POST',
|
||||||
await mongodb_client.connect()
|
headers: {
|
||||||
|
'Content-Type': 'applicaiton/json',
|
||||||
// connect to database
|
'Content-Length': Buffer.byteLength(data)
|
||||||
const database = mongodb_client.db(config.database_name)
|
}
|
||||||
console.log('Database connection status:', await database.command({ping: 1}))
|
}
|
||||||
|
|
||||||
// get titles collection
|
// Set up the request
|
||||||
var title = database.collection("title")
|
var post_req = http.request(post_options, function(res) {
|
||||||
console.log(`Titles count: ${await title.countDocuments()}`)
|
res.setEncoding('utf8')
|
||||||
title.insertOne({title:{en:"Title", ru:"Название"},
|
res.on('data', async function (answer) {
|
||||||
location:{en:"Russia, Moscow", ru:"Россия, Москва"},
|
callback(answer)
|
||||||
description:{en:"Best RC ...", ru:"Лучший ЖК ..."},
|
|
||||||
image:{main:"URL1", second:"URL2"}
|
|
||||||
})
|
})
|
||||||
}
|
})
|
||||||
catch(e)
|
|
||||||
{
|
// post the data
|
||||||
console.error(e)
|
post_req.write(data)
|
||||||
}
|
post_req.end()
|
||||||
// finally
|
|
||||||
// {
|
|
||||||
// await mongodb_client.close()
|
|
||||||
// console.log("Database connection closed")
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// response function
|
// response function
|
||||||
function create_response(request)
|
async function create_response(request, callback) {
|
||||||
{
|
var mongo_client = new mongodb_client(config.mongodb_url)
|
||||||
var request_json = JSON.parse(request)
|
var database = await mongo_client.connect_database(config.database_name)
|
||||||
switch(request_json.verb)
|
|
||||||
{
|
var response = ''
|
||||||
case 'GET_TITLES':
|
try {
|
||||||
break;
|
if (request.verb == 'GET_TITLES') {
|
||||||
case 'PLAN_SESSION':
|
var title = database.collection('title')
|
||||||
break;
|
response = await title.find().skip(request.start).limit(request.count).toArray()
|
||||||
case 'CREATE_SESSION':
|
response = JSON.stringify(response)
|
||||||
break;
|
callback(response)
|
||||||
case 'CONNECT_SESSION':
|
|
||||||
break;
|
} else if (request.verb == 'PLAN_SESSION') {
|
||||||
case 'CONNECT_SESSION_WITH_CODE':
|
var session_sheduled = database.collection('session_sheduled')
|
||||||
break;
|
var sessions = await session_sheduled.find().toArray()
|
||||||
default:
|
|
||||||
|
} 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)
|
||||||
|
}
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
|
||||||
|
PostSessionServer(`{"verb":"CREATE_SESSION", "title":"${request.title}"}`, free_server.ip, free_server.port, async function(answer) {
|
||||||
|
var json_answer = JSON.parse(answer)
|
||||||
|
// add session to database
|
||||||
|
await session_active.insertOne({
|
||||||
|
server_id:free_server.server_id,
|
||||||
|
link:json_answer.link
|
||||||
|
})
|
||||||
|
response = `{"msg":"SESSION_CREATED", "link":"${json_answer.link}"}`
|
||||||
|
callback(response)
|
||||||
|
})
|
||||||
|
|
||||||
|
} else if (request.verb == 'CONNECT_SESSION') {
|
||||||
|
callback(response)
|
||||||
|
} else {
|
||||||
|
response = '{"msg":"UNKNOWN_VERB"}'
|
||||||
|
callback(response)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.error(e)
|
||||||
}
|
}
|
||||||
return '{"verb":"WAIT"}'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// connect to mongodb
|
|
||||||
const {MongoClient} = require('mongodb')
|
|
||||||
connect_mongodb(MongoClient).catch(console.error)
|
|
||||||
|
|
||||||
// start http server
|
// start http server
|
||||||
const server = http.createServer(function(request, response)
|
const server = http.createServer(function(request, response) {
|
||||||
{
|
if (request.method == 'POST') {
|
||||||
var message = ''
|
|
||||||
if (request.method == 'POST')
|
|
||||||
{
|
|
||||||
var body = ''
|
var body = ''
|
||||||
request.on('data', function(data)
|
|
||||||
{
|
request.on('data', function(data) {
|
||||||
body += data
|
body += data
|
||||||
})
|
})
|
||||||
|
|
||||||
request.on('end', function()
|
request.on('end', function() {
|
||||||
{
|
|
||||||
response.writeHead(200, {'Content-Type': 'message'})
|
response.writeHead(200, {'Content-Type': 'message'})
|
||||||
response.end(create_response(body))
|
try {
|
||||||
console.log(body)
|
create_response(JSON.parse(body), function(message) {
|
||||||
|
response.end(message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
console.log('received: "', body, '"')
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
{
|
var message = 'UNDEFINED_REQUEST' + ': ' + request.method.toString()
|
||||||
message = 'UNDEFINED_REQUEST' + ': ' + request.method.toString()
|
|
||||||
response.writeHead(200, {'Content-Type': 'message'})
|
response.writeHead(200, {'Content-Type': 'message'})
|
||||||
response.end(message)
|
response.end(message)
|
||||||
console.log(message)
|
console.log(message)
|
||||||
|
|||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
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")
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
+3384
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"ip" : "127.0.0.1",
|
||||||
|
"port" : "3002"
|
||||||
|
}
|
||||||
+3384
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
+91
@@ -0,0 +1,91 @@
|
|||||||
|
// 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')
|
||||||
|
|
||||||
|
// write startup server history
|
||||||
|
var logs_dir = './logs'
|
||||||
|
if (!fs.existsSync(logs_dir))
|
||||||
|
fs.mkdirSync(logs_dir)
|
||||||
|
|
||||||
|
fs.appendFileSync(`./${logs_dir}/launch_history.log`, (node_time.create().format('Y-m-d H:M:S')).toString() + '\n')
|
||||||
|
|
||||||
|
// response function
|
||||||
|
async function create_response(request, callback) {
|
||||||
|
var response = ''
|
||||||
|
try {
|
||||||
|
switch(request.verb) {
|
||||||
|
case 'CREATE_SESSION':
|
||||||
|
var title_info
|
||||||
|
titles.forEach((title) => {
|
||||||
|
if (title.title == request.title) {
|
||||||
|
title_info = title
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (title_info == null) {
|
||||||
|
response = '{"msg":"TITLE_NOT_EXISTS"}'
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
const process = spawn(title_info.path, ['', ''])
|
||||||
|
|
||||||
|
process.on('close', (code) => {
|
||||||
|
console.log(`child process exited with code ${code}`);
|
||||||
|
})
|
||||||
|
|
||||||
|
response = `{"msg":"SESSION_CREATED", "link":"http://${title_info.title}"}`
|
||||||
|
break
|
||||||
|
case 'CONNECT_SESSION':
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
response = '{"msg":"UNKNOWN_VERB"}'
|
||||||
|
}
|
||||||
|
callback(response)
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.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() {
|
||||||
|
response.writeHead(200, {'Content-Type': 'message'})
|
||||||
|
try {
|
||||||
|
create_response(JSON.parse(body), function(message) {
|
||||||
|
response.end(message)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
catch(e) {
|
||||||
|
console.error(e)
|
||||||
|
}
|
||||||
|
console.log('received: "', body, '"')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var message = 'UNDEFINED_REQUEST' + ': ' + request.method.toString()
|
||||||
|
response.writeHead(200, {'Content-Type': 'message'})
|
||||||
|
response.end(message)
|
||||||
|
console.log(message)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
server.listen(config.port, config.ip)
|
||||||
|
console.log(`Listening at http://${config.ip}:${config.port}`)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"title":"Fortis",
|
||||||
|
"path":"D:/shared/Builds/Fortis_UnStable_64/WindowsNoEditor/FORTIS_Taktika.exe"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title":"Ivazowsky",
|
||||||
|
"path":"D:/shared/Builds/Ivaz_Optimized_2/Ivazowsky.exe"
|
||||||
|
}
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user