style: отформатирован код для улучшения читаемости
All checks were successful
Build and Deploy Gateway / build-and-deploy (push) Successful in 22s

This commit is contained in:
2026-05-08 21:02:31 +03:00
parent 49be90a82c
commit f89cba4a24

View File

@@ -35,10 +35,13 @@ const trafficSubscribers = new Set();
// outbound/direct[tag]: dial tcp connection to host:port from ip:port
// [router] matched rule #0 [rule-name], outbound: vpn, domain: example.com
// [TCP] DIRECT host:port --> direct
const TRAFFIC_OUTBOUND_RE = /outbound[/\\]([a-z0-9_\-]+)|\boutbound:\s*([a-z0-9_\-]+)/i;
const TRAFFIC_DEST_RE = /(?:to|dial|connection to|DIRECT|REJECT)\s+(?:tcp\s+|udp\s+)?(?:[^\s]*\s+to\s+)?([a-zA-Z0-9._\-]+|\d{1,3}(?:\.\d{1,3}){3}):(\d{1,5})/i;
const TRAFFIC_OUTBOUND_RE =
/outbound[/\\]([a-z0-9_\-]+)|\boutbound:\s*([a-z0-9_\-]+)/i;
const TRAFFIC_DEST_RE =
/(?:to|dial|connection to|DIRECT|REJECT)\s+(?:tcp\s+|udp\s+)?(?:[^\s]*\s+to\s+)?([a-zA-Z0-9._\-]+|\d{1,3}(?:\.\d{1,3}){3}):(\d{1,5})/i;
const TRAFFIC_DOMAIN_RE = /\bdomain:\s*([a-zA-Z0-9._\-]+)/i;
const TRAFFIC_RULE_RE = /matched\s+rule\s+#\d+\s*\[([^\]]+)\]|matched\s+\[([^\]]+)\]/i;
const TRAFFIC_RULE_RE =
/matched\s+rule\s+#\d+\s*\[([^\]]+)\]|matched\s+\[([^\]]+)\]/i;
function parseTrafficLine(line) {
const clean = line.replace(/\x1b\[\d+m/g, "").trim();
@@ -49,8 +52,10 @@ function parseTrafficLine(line) {
if (!outboundRaw) return null;
let category = "other";
if (outboundRaw === "direct" || outboundRaw.startsWith("direct")) category = "direct";
else if (outboundRaw === "block" || outboundRaw === "reject") category = "block";
if (outboundRaw === "direct" || outboundRaw.startsWith("direct"))
category = "direct";
else if (outboundRaw === "block" || outboundRaw === "reject")
category = "block";
else if (outboundRaw !== "dns-out" && outboundRaw !== "dns") category = "vpn";
else return null; // пропускаем DNS-аутбаунды
@@ -78,7 +83,9 @@ function pushTrafficEntry(entry) {
trafficBuffer.push(entry);
if (trafficBuffer.length > TRAFFIC_BUFFER_SIZE) trafficBuffer.shift();
for (const sub of trafficSubscribers) {
try { sub(entry); } catch {}
try {
sub(entry);
} catch {}
}
}
@@ -474,8 +481,15 @@ async function handleApi(req, res) {
}
const sub = (entry) => res.write(`data: ${JSON.stringify(entry)}\n\n`);
trafficSubscribers.add(sub);
const keepalive = setInterval(() => { try { res.write(": ping\n\n"); } catch {} }, 15000);
req.on("close", () => { clearInterval(keepalive); trafficSubscribers.delete(sub); });
const keepalive = setInterval(() => {
try {
res.write(": ping\n\n");
} catch {}
}, 15000);
req.on("close", () => {
clearInterval(keepalive);
trafficSubscribers.delete(sub);
});
return;
}