UI Completed
This commit is contained in:
parent
32a8b868ea
commit
79d277443c
|
@ -1,5 +1,5 @@
|
||||||
const { CLIENT_SEND_MESSAGE, CLIENT_UPDATE_PROP } = require("./IPC");
|
const { CLIENT_SEND_MESSAGE, CLIENT_UPDATE_PROP } = require("./IPC");
|
||||||
|
const stats = require("./stats");
|
||||||
function Client()
|
function Client()
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -95,6 +95,7 @@ Client.prototype.send = function(obj){
|
||||||
{
|
{
|
||||||
CLIENT_SEND_MESSAGE(this.id, obj, this.proxyProcess)
|
CLIENT_SEND_MESSAGE(this.id, obj, this.proxyProcess)
|
||||||
}else{
|
}else{
|
||||||
|
stats.ws_sended_packs++;
|
||||||
this.socket.sendUTF(JSON.stringify(obj));
|
this.socket.sendUTF(JSON.stringify(obj));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,6 +6,7 @@ let compression = require("compression");
|
||||||
let {resolve} = require("path");
|
let {resolve} = require("path");
|
||||||
const { termoutput } = require("./config");
|
const { termoutput } = require("./config");
|
||||||
let server = http.createServer();
|
let server = http.createServer();
|
||||||
|
const stats = require("./stats");
|
||||||
let app = express();
|
let app = express();
|
||||||
server.addListener("request", app);
|
server.addListener("request", app);
|
||||||
app.use(compression({
|
app.use(compression({
|
||||||
|
@ -35,6 +36,9 @@ app.get("/webrtc.adapter.js",(request, response)=>{
|
||||||
app.get("/",(request, response)=>{
|
app.get("/",(request, response)=>{
|
||||||
response.sendFile(resolve("./script/index.html"))
|
response.sendFile(resolve("./script/index.html"))
|
||||||
});
|
});
|
||||||
|
app.post("/stats",(request, response)=>{
|
||||||
|
response.json(stats.others);
|
||||||
|
});
|
||||||
app.get("*",(request, response)=>{
|
app.get("*",(request, response)=>{
|
||||||
response.sendFile(resolve("./script/status.xml"))
|
response.sendFile(resolve("./script/status.xml"))
|
||||||
});
|
});
|
|
@ -6,6 +6,7 @@ let {randomUUID} = require("crypto");
|
||||||
const { Client } = require("./Client.js");
|
const { Client } = require("./Client.js");
|
||||||
const { termoutput } = require("./config");
|
const { termoutput } = require("./config");
|
||||||
const { CLIENT_CREATED, CLIENT_DESTROY } = require("./IPC");
|
const { CLIENT_CREATED, CLIENT_DESTROY } = require("./IPC");
|
||||||
|
const stats = require("./stats");
|
||||||
termoutput && console.log("Web Socket Protocol is ready");
|
termoutput && console.log("Web Socket Protocol is ready");
|
||||||
|
|
||||||
http.addListener("upgrade",() => {
|
http.addListener("upgrade",() => {
|
||||||
|
@ -16,9 +17,21 @@ let wsServer = new websocket.server({
|
||||||
httpServer: http,
|
httpServer: http,
|
||||||
autoAcceptConnections: true
|
autoAcceptConnections: true
|
||||||
});
|
});
|
||||||
|
/*
|
||||||
|
process.send({
|
||||||
|
core: "writestat",
|
||||||
|
writeBytes:0,
|
||||||
|
readBytes:0,
|
||||||
|
totalBytes:0,
|
||||||
|
recaivedPacket:0,
|
||||||
|
sendedPacket:0,
|
||||||
|
totalPacket:0
|
||||||
|
})*/
|
||||||
|
|
||||||
let global = new Map();
|
let global = new Map();
|
||||||
let clients = new Map();
|
let clients = new Map();
|
||||||
|
|
||||||
|
|
||||||
wsServer.addListener("connect",(socket) => {
|
wsServer.addListener("connect",(socket) => {
|
||||||
let xClient = new Client();
|
let xClient = new Client();
|
||||||
let id = randomUUID();
|
let id = randomUUID();
|
||||||
|
@ -34,12 +47,29 @@ wsServer.addListener("connect",(socket) => {
|
||||||
CLIENT_CREATED(id);
|
CLIENT_CREATED(id);
|
||||||
|
|
||||||
emit("connect", global, xClient);
|
emit("connect", global, xClient);
|
||||||
|
|
||||||
|
let oldw = 0, oldr = 0;
|
||||||
|
let timer = setInterval(()=>{
|
||||||
|
let writed = socket.socket.bytesRead - oldr;
|
||||||
|
let readed = socket.socket.bytesWritten - oldw;
|
||||||
|
stats.ws_total_bytes += (writed + readed);
|
||||||
|
stats.ws_readed_bytes += readed;
|
||||||
|
stats.ws_writed_bytes += writed;
|
||||||
|
oldr = socket.socket.bytesRead;
|
||||||
|
oldw = socket.socket.bytesWritten;
|
||||||
|
}, 1000)
|
||||||
|
|
||||||
socket.addListener("close",()=>{
|
socket.addListener("close",()=>{
|
||||||
emit("disconnect", global, xClient);
|
emit("disconnect", global, xClient);
|
||||||
CLIENT_DESTROY(id);
|
CLIENT_DESTROY(id);
|
||||||
Client.clients.set(id, xClient);
|
Client.clients.set(id, xClient);
|
||||||
|
clearInterval(timer);
|
||||||
});
|
});
|
||||||
|
|
||||||
socket.addListener("message",({type,utf8Data}) => {
|
socket.addListener("message",({type,utf8Data}) => {
|
||||||
|
stats.ws_recaived_packs++;
|
||||||
|
stats.ws_total_packs++;
|
||||||
|
|
||||||
if(type == "utf8")
|
if(type == "utf8")
|
||||||
{
|
{
|
||||||
let json;
|
let json;
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
exports.ws_writed_bytes = 0;
|
||||||
|
exports.ws_readed_bytes = 0;
|
||||||
|
exports.ws_total_bytes = 0;
|
||||||
|
exports.ws_sended_packs = 0;
|
||||||
|
exports.ws_recaived_packs = 0;
|
||||||
|
exports.ws_total_packs = 0;
|
||||||
|
|
||||||
|
|
||||||
|
process.send({
|
||||||
|
core: "writestat",
|
||||||
|
ws_writed_bytes: exports.ws_writed_bytes,
|
||||||
|
ws_readed_bytes: exports.ws_readed_bytes,
|
||||||
|
ws_total_bytes: exports.ws_total_bytes,
|
||||||
|
ws_sended_packs: exports.ws_sended_packs,
|
||||||
|
ws_recaived_packs: exports.ws_recaived_packs,
|
||||||
|
ws_total_packs: exports.ws_total_packs
|
||||||
|
});
|
||||||
|
setInterval(()=>{
|
||||||
|
process.send({
|
||||||
|
core: "writestat",
|
||||||
|
ws_writed_bytes: exports.ws_writed_bytes,
|
||||||
|
ws_readed_bytes: exports.ws_readed_bytes,
|
||||||
|
ws_total_bytes: exports.ws_total_bytes,
|
||||||
|
ws_sended_packs: exports.ws_sended_packs,
|
||||||
|
ws_recaived_packs: exports.ws_recaived_packs,
|
||||||
|
ws_total_packs: exports.ws_total_packs
|
||||||
|
})
|
||||||
|
exports.ws_writed_bytes = 0;
|
||||||
|
exports.ws_readed_bytes = 0;
|
||||||
|
exports.ws_total_bytes = 0;
|
||||||
|
exports.ws_sended_packs = 0;
|
||||||
|
exports.ws_recaived_packs = 0;
|
||||||
|
exports.ws_total_packs = 0;
|
||||||
|
process.send({
|
||||||
|
core: "readstat",
|
||||||
|
ws_writed_bytes: exports.ws_writed_bytes,
|
||||||
|
ws_readed_bytes: exports.ws_readed_bytes,
|
||||||
|
ws_total_bytes: exports.ws_total_bytes,
|
||||||
|
ws_sended_packs: exports.ws_sended_packs,
|
||||||
|
ws_recaived_packs: exports.ws_recaived_packs,
|
||||||
|
ws_total_packs: exports.ws_total_packs
|
||||||
|
})
|
||||||
|
}, 3000)
|
||||||
|
|
||||||
|
process.on('message', stat => {
|
||||||
|
if(stat.type == ':stats:')
|
||||||
|
{
|
||||||
|
exports.others = stat.data;
|
||||||
|
}
|
||||||
|
})
|
43
index.js
43
index.js
|
@ -1,6 +1,7 @@
|
||||||
/** @type {import('node:cluster').Cluster} */
|
/** @type {import('node:cluster').Cluster} */
|
||||||
const cluster = require("cluster");
|
const cluster = require("cluster");
|
||||||
const os = require("os");
|
const os = require("os");
|
||||||
|
let {randomUUID} = require("crypto");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Use Round Robin algorithm for cluster process load balancer
|
* Use Round Robin algorithm for cluster process load balancer
|
||||||
|
@ -37,7 +38,38 @@ async function main()
|
||||||
// This process want to send payload to sibling process with IPC
|
// This process want to send payload to sibling process with IPC
|
||||||
(workerId, payload) =>{
|
(workerId, payload) =>{
|
||||||
// Check Target worker
|
// Check Target worker
|
||||||
if(payload.process)
|
if(payload.core)
|
||||||
|
{
|
||||||
|
switch(payload.core)
|
||||||
|
{
|
||||||
|
case "writestat":{
|
||||||
|
master.get(workerId).setStats(payload)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "readstat":{
|
||||||
|
master.get(workerId).send({
|
||||||
|
type: ':stats:',
|
||||||
|
data: [
|
||||||
|
...master.entries()
|
||||||
|
].map((
|
||||||
|
[, master]
|
||||||
|
) => {
|
||||||
|
let e = master.getStats();
|
||||||
|
return {
|
||||||
|
core: master.uuid,
|
||||||
|
ws_writed_bytes:e.ws_writed_bytes,
|
||||||
|
ws_readed_bytes:e.ws_readed_bytes,
|
||||||
|
ws_total_bytes:e.ws_total_bytes,
|
||||||
|
ws_sended_packs:e.ws_sended_packs,
|
||||||
|
ws_recaived_packs:e.ws_recaived_packs,
|
||||||
|
ws_total_packs:e.ws_total_packs
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(payload.process)
|
||||||
{
|
{
|
||||||
master.get(payload.process).send({
|
master.get(payload.process).send({
|
||||||
...payload,
|
...payload,
|
||||||
|
@ -63,7 +95,7 @@ async function main()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async function generateFlow(N)
|
async function generateFlow()
|
||||||
{
|
{
|
||||||
// Mirror this process with for (low-level os multitasking)
|
// Mirror this process with for (low-level os multitasking)
|
||||||
const worker = cluster.fork();
|
const worker = cluster.fork();
|
||||||
|
@ -75,12 +107,17 @@ async function generateFlow(N)
|
||||||
});
|
});
|
||||||
// Get process pid on the os
|
// Get process pid on the os
|
||||||
let id = worker.process.pid;
|
let id = worker.process.pid;
|
||||||
|
|
||||||
|
let stats = {};
|
||||||
|
|
||||||
// Simplification wrapping send and get events with IPC's event functions
|
// Simplification wrapping send and get events with IPC's event functions
|
||||||
return {
|
return {
|
||||||
id,
|
id,
|
||||||
|
uuid: randomUUID(),
|
||||||
send: message => worker.send(message),
|
send: message => worker.send(message),
|
||||||
message: (callback) => worker.addListener("message", e => callback(id,e))
|
message: (callback) => worker.addListener("message", e => callback(id,e)),
|
||||||
|
getStats: () => stats,
|
||||||
|
setStats: e => Object.assign(stats, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
flex: 1 1 25%;
|
flex: 1 1 25%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
}
|
}
|
||||||
.speed-container > div canvas{
|
.speed-container > div canvas{
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
@ -597,7 +598,7 @@
|
||||||
{
|
{
|
||||||
iTargetSpeed = value;
|
iTargetSpeed = value;
|
||||||
createCanvas.ps.innerText = value;
|
createCanvas.ps.innerText = value;
|
||||||
createCanvas.pw.innerText = pressure;
|
createCanvas.pw.innerText = pressure + '%';
|
||||||
draw()
|
draw()
|
||||||
}
|
}
|
||||||
function convertSpeedToAngle(options) {
|
function convertSpeedToAngle(options) {
|
||||||
|
@ -630,6 +631,7 @@
|
||||||
update
|
update
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
let elem = document.querySelector(".speed-container");
|
let elem = document.querySelector(".speed-container");
|
||||||
for(let e = 0; e < 8; e++)
|
for(let e = 0; e < 8; e++)
|
||||||
{
|
{
|
||||||
|
@ -638,6 +640,39 @@
|
||||||
elem.appendChild(container);
|
elem.appendChild(container);
|
||||||
meter.update(54,25)
|
meter.update(54,25)
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
let elem = document.querySelector(".speed-container");
|
||||||
|
let meters = new Map();
|
||||||
|
async function reloadData()
|
||||||
|
{
|
||||||
|
let data = await fetchData();
|
||||||
|
setTimeout(reloadData, 3000)
|
||||||
|
};
|
||||||
|
let isFirst = true;
|
||||||
|
async function fetchData()
|
||||||
|
{
|
||||||
|
let response = await fetch("/stats",{
|
||||||
|
method: "post",
|
||||||
|
credentials: "same-origin",
|
||||||
|
cache: "no-cache",
|
||||||
|
mode:"no-cors"
|
||||||
|
}).then(e => e.json());
|
||||||
|
for (const {
|
||||||
|
ws_total_packs,
|
||||||
|
core
|
||||||
|
} of response) {
|
||||||
|
if(!meters.has(core))
|
||||||
|
{
|
||||||
|
let meter = CreateMeter();
|
||||||
|
let container = meter.createCanvas();
|
||||||
|
elem.appendChild(container);
|
||||||
|
meters.set(core, meter)
|
||||||
|
};
|
||||||
|
let _meter = meters.get(core);
|
||||||
|
_meter.update(ws_total_packs,0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reloadData();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
Loading…
Reference in New Issue