karshard
Version:
Karshard: Fastify + System Information API with Load Balancer support for GCP, Azure, and Cloudflare. More info: https://github.com/DeveloperKubilay/Karshard
92 lines (71 loc) • 2.62 kB
JavaScript
const si = require('systeminformation');
const WebSocket = require('ws');
function plugin(fastify, opts, done) {
let ws;
let reconnectTimeout = null;
function connectWebSocket() {
ws = new WebSocket(`${opts.url}/?token=${opts.token}`);
ws.on('open', () => {
if (opts.log) console.log('WebSocket bağlantısı kuruldu.');
});
ws.on('message', (data) => {
const json = JSON.parse(data.toString());
if (!json.loadbalancer) return;
if (json.redirect) opts.redirect(json.redirect);
});
ws.on('close', (code, reason) => {
if (opts.log) console.log(`Connection closed. Code: ${code}, Reason: ${reason}`);
reconnectTimeout = setTimeout(connectWebSocket, 2000);
});
ws.on('error', (error) => {
});
}
connectWebSocket();
let reqBytes = 0;
let resBytes = 0;
let reqCount = 0;
fastify.addHook('onRequest', async (request, reply) => {
reqCount++;
const reqHeaders = JSON.stringify(request.headers);
reqBytes += Buffer.byteLength(reqHeaders, 'utf8');
request.raw.on('data', chunk => {
reqBytes += chunk.length;
});
const originalWrite = reply.raw.write;
const originalEnd = reply.raw.end;
reply.raw.write = function (chunk, encoding, callback) {
if (chunk) {
resBytes += Buffer.isBuffer(chunk) ? chunk.length : Buffer.byteLength(chunk, encoding || 'utf8');
}
return originalWrite.call(this, chunk, encoding, callback);
};
reply.raw.end = function (chunk, encoding, callback) {
if (chunk) {
resBytes += Buffer.isBuffer(chunk) ? chunk.length : Buffer.byteLength(chunk, encoding || 'utf8');
}
return originalEnd.call(this, chunk, encoding, callback);
};
});
const interval = setInterval(async () => {
let cpu = await si.currentLoad();
let mem = await si.mem();
cpu = cpu.currentLoad.toFixed(2);
mem = ((mem.active / mem.total) * 100).toFixed(2);
ws?.send(JSON.stringify({
loadbalancer: true,
cpu: cpu,
mem: mem,
reqBytes: reqBytes,
resBytes: resBytes,
reqCount: reqCount
}));
reqCount = 0;
reqBytes = 0;
resBytes = 0;
}, opts.Interval || 5000);
fastify.addHook('onClose', async () => {
clearInterval(interval);
});
done()
}
module.exports.default = plugin