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 stats = require("./stats");
 | 
			
		||||
function Client()
 | 
			
		||||
{
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -95,6 +95,7 @@ Client.prototype.send = function(obj){
 | 
			
		|||
    {
 | 
			
		||||
        CLIENT_SEND_MESSAGE(this.id, obj, this.proxyProcess)
 | 
			
		||||
    }else{
 | 
			
		||||
        stats.ws_sended_packs++;
 | 
			
		||||
        this.socket.sendUTF(JSON.stringify(obj));
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ let compression = require("compression");
 | 
			
		|||
let {resolve} = require("path");
 | 
			
		||||
const { termoutput } = require("./config");
 | 
			
		||||
let server = http.createServer();
 | 
			
		||||
const stats = require("./stats");
 | 
			
		||||
let app = express();
 | 
			
		||||
server.addListener("request", app);
 | 
			
		||||
app.use(compression({
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +36,9 @@ app.get("/webrtc.adapter.js",(request, response)=>{
 | 
			
		|||
app.get("/",(request, response)=>{
 | 
			
		||||
    response.sendFile(resolve("./script/index.html"))
 | 
			
		||||
});
 | 
			
		||||
app.post("/stats",(request, response)=>{
 | 
			
		||||
    response.json(stats.others);
 | 
			
		||||
});
 | 
			
		||||
app.get("*",(request, response)=>{
 | 
			
		||||
    response.sendFile(resolve("./script/status.xml"))
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ let {randomUUID} = require("crypto");
 | 
			
		|||
const { Client } = require("./Client.js");
 | 
			
		||||
const { termoutput } = require("./config");
 | 
			
		||||
const { CLIENT_CREATED, CLIENT_DESTROY } = require("./IPC");
 | 
			
		||||
const stats = require("./stats");
 | 
			
		||||
termoutput && console.log("Web Socket Protocol is ready");
 | 
			
		||||
 | 
			
		||||
http.addListener("upgrade",() => {
 | 
			
		||||
| 
						 | 
				
			
			@ -16,9 +17,21 @@ let wsServer = new websocket.server({
 | 
			
		|||
    httpServer: http,
 | 
			
		||||
    autoAcceptConnections: true
 | 
			
		||||
});
 | 
			
		||||
/*
 | 
			
		||||
process.send({
 | 
			
		||||
    core: "writestat",
 | 
			
		||||
    writeBytes:0,
 | 
			
		||||
    readBytes:0,
 | 
			
		||||
    totalBytes:0,
 | 
			
		||||
    recaivedPacket:0,
 | 
			
		||||
    sendedPacket:0,
 | 
			
		||||
    totalPacket:0
 | 
			
		||||
})*/
 | 
			
		||||
 | 
			
		||||
let global = new Map();
 | 
			
		||||
let clients = new Map();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
wsServer.addListener("connect",(socket) => {
 | 
			
		||||
    let xClient = new Client();
 | 
			
		||||
    let id = randomUUID();
 | 
			
		||||
| 
						 | 
				
			
			@ -34,12 +47,29 @@ wsServer.addListener("connect",(socket) => {
 | 
			
		|||
    CLIENT_CREATED(id);
 | 
			
		||||
 | 
			
		||||
    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",()=>{
 | 
			
		||||
        emit("disconnect",  global, xClient);
 | 
			
		||||
        CLIENT_DESTROY(id);
 | 
			
		||||
        Client.clients.set(id, xClient);
 | 
			
		||||
        clearInterval(timer);
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    socket.addListener("message",({type,utf8Data}) => {
 | 
			
		||||
        stats.ws_recaived_packs++;
 | 
			
		||||
        stats.ws_total_packs++;
 | 
			
		||||
 | 
			
		||||
        if(type == "utf8")
 | 
			
		||||
        {
 | 
			
		||||
            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} */
 | 
			
		||||
const cluster = require("cluster");
 | 
			
		||||
const os = require("os");
 | 
			
		||||
let {randomUUID} = require("crypto");
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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
 | 
			
		||||
            (workerId, payload) =>{
 | 
			
		||||
                // 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({
 | 
			
		||||
                        ...payload,
 | 
			
		||||
| 
						 | 
				
			
			@ -63,7 +95,7 @@ async function main()
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
async function generateFlow(N)
 | 
			
		||||
async function generateFlow()
 | 
			
		||||
{
 | 
			
		||||
    // Mirror this process with for (low-level os multitasking)
 | 
			
		||||
    const worker = cluster.fork();
 | 
			
		||||
| 
						 | 
				
			
			@ -75,12 +107,17 @@ async function generateFlow(N)
 | 
			
		|||
    });
 | 
			
		||||
    // Get process pid on the os
 | 
			
		||||
    let id = worker.process.pid;
 | 
			
		||||
 | 
			
		||||
    let stats = {};
 | 
			
		||||
    
 | 
			
		||||
    // Simplification wrapping send and get events with IPC's event functions
 | 
			
		||||
    return {
 | 
			
		||||
        id,
 | 
			
		||||
        uuid: randomUUID(),
 | 
			
		||||
        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%;
 | 
			
		||||
            max-width: 100%;
 | 
			
		||||
            overflow: auto;
 | 
			
		||||
            margin-bottom: 50px;
 | 
			
		||||
        }
 | 
			
		||||
        .speed-container > div canvas{
 | 
			
		||||
            max-width: 100%;
 | 
			
		||||
| 
						 | 
				
			
			@ -597,7 +598,7 @@
 | 
			
		|||
            {
 | 
			
		||||
                iTargetSpeed = value;
 | 
			
		||||
                createCanvas.ps.innerText = value;
 | 
			
		||||
                createCanvas.pw.innerText = pressure;
 | 
			
		||||
                createCanvas.pw.innerText = pressure + '%';
 | 
			
		||||
                draw()
 | 
			
		||||
            }
 | 
			
		||||
            function convertSpeedToAngle(options) {
 | 
			
		||||
| 
						 | 
				
			
			@ -630,6 +631,7 @@
 | 
			
		|||
                update
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        /*
 | 
			
		||||
        let elem = document.querySelector(".speed-container");
 | 
			
		||||
        for(let e = 0; e < 8; e++)
 | 
			
		||||
        {
 | 
			
		||||
| 
						 | 
				
			
			@ -638,6 +640,39 @@
 | 
			
		|||
            elem.appendChild(container);
 | 
			
		||||
            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>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
		Loading…
	
		Reference in New Issue