This commit is contained in:
Mateusz Gruszczyński committed 2026-11-07 13:13:25 +01:00
1 parent 3a384baa6b
commit 672c84bc13
21 files changed
+450 -70

No files matched your search

+7 -3
View File
@@ -379,9 +379,13 @@ function renderFooter(s) {
}
let lastLogs = null;
function renderLogs(data) { lastLogs = data; window.rustProxyLogs?.render(data); }
async function refresh(force = false) {
async function refresh(force = false, includeLogs = false) {
if (!authenticated) return;
if (force) return Promise.all([rustProxyRefresh.manual("status-full"), rustProxyRefresh.manual("logs-fallback")]);
if (force) {
const tasks = [rustProxyRefresh.manual("status-full")];
if (includeLogs) tasks.push(rustProxyRefresh.manual("logs-fallback"));
return Promise.all(tasks);
}
return rustProxyRefresh.manual("status-fallback");
}
function renderLiveStatus(value) { renderStatus(value); }
@@ -525,7 +529,7 @@ async function activate(info) {
void window.rustProxyApiTokens?.refresh?.();
window.rustProxySettings?.scrollToApiTokens?.();
}
void refresh(true).catch(error => {
void refresh(true, true).catch(error => {
if (authenticated && epoch === authEpoch && error?.status !== 401) toast(error.message, true);
});
return true;
+12 -3
View File
@@ -1,6 +1,6 @@
"use strict";
(() => {
let loading = false, offset = 0, generation = 0;
let loading = false, offset = 0, generation = 0, staticData = null, staticRevision = null;
let liveChartScope = "", liveChartPrevious = null, liveChartPreviousAt = null, liveChartGeneration = null;
const liveChartSamples = { hits: [], misses: [], bypasses: [] };
const LIVE_CHART_LIMITS = new Set([60, 120, 300, 600]);
@@ -229,7 +229,16 @@
const query = new URLSearchParams({ offset: String(offset), limit: "50" });
if (scope() !== "*") query.set("vhost", scope());
try {
const data = await api(`/api/cache?${query}`, { signal });
const base = `/api/cache?${query}`;
if (staticData) query.set("view", "live");
let data = await api(`/api/cache?${query}`, { signal });
if (staticData && data.revision !== staticRevision) data = await api(base, { signal });
if (data.settings && Array.isArray(data.vhosts)) {
staticData = { settings: data.settings, vhosts: data.vhosts };
staticRevision = data.revision;
} else if (staticData) {
data = { ...staticData, ...data };
}
if (isCurrent() && token === generation) render(data);
} catch (error) {
if (error?.name !== "AbortError" && epoch === authEpoch && isCurrent()) {
@@ -343,7 +352,7 @@
$("cache-live")?.addEventListener("change", () => rustProxyRefresh.sync());
window.rustProxyCachePanel = {
refresh, configure, reason, reset() {
generation++; offset = 0; resetLiveChart(); closeInvalidation(); closeBans();
generation++; offset = 0; staticData = null; staticRevision = null; resetLiveChart(); closeInvalidation(); closeBans();
$("cache-domain-rows").replaceChildren(); $("cache-object-rows").replaceChildren(); $("cache-ban-rows").replaceChildren();
$("cache-panel-state").textContent = ""; operationMessage("cache-invalidation-status"); operationMessage("cache-bans-status"); operationMessage("cache-toolbar-operation-status");
}
-1
View File
@@ -243,5 +243,4 @@ curl --fail --show-error --request POST \
}
};
renderCertificateApi();
loadCertificateApi();
})();
+3 -1
View File
@@ -50,6 +50,7 @@
window.rustProxyRefresh?.setSettingsTab(name);
if (authenticated && name === "security") void window.rustProxyApiTokens?.refresh?.();
if (authenticated && name === "prometheus") void window.rustProxyPrometheusToken?.refresh?.();
if (authenticated && name === "certificate-api") void window.rustProxyCertificateApi?.load?.();
if (name !== "prometheus") window.rustProxyPrometheusToken?.hideSecret?.();
if (name !== "security") window.rustProxyApiTokens?.hideSecret?.();
}
@@ -251,7 +252,8 @@
$("tls-policy-key-exchange").textContent = kxGroups.length ? `${t("tlsPqcKeyExchangeGroups")}: ${kxGroups.join(", ")}` : "";
$("tls-policy-effective").textContent = effective.length ? `${t("tlsEffectiveCiphers")}: ${effective.join(", ")}` : "";
$("tls-policy-available").textContent = available.length ? `${t("tlsAvailableCiphers")}: ${available.join(", ")}` : "";
window.rustProxyCertificateApi?.render(); window.rustProxyCertificateApi?.load();
window.rustProxyCertificateApi?.render();
if (authenticated && active === "certificate-api") void window.rustProxyCertificateApi?.load?.();
}
$("geoip-format").addEventListener("change", syncGeoipFormat); $("geoip-enabled").addEventListener("change", syncGeoipFormat);
bindSettingsForm("geoip-form", next => {
+13 -3
View File
@@ -1,6 +1,6 @@
"use strict";
(() => {
let loading = false, lastData = null, activeTab = "overview";
let loading = false, lastData = null, activeTab = "overview", staticData = null, staticRevision = null;
const chartPalette = ["var(--chart-accent)", "var(--chart-secondary)", "var(--chart-tertiary)", "var(--chart-quaternary)", "var(--chart-quinary)", "var(--chart-senary)", "var(--chart-septenary)", "var(--chart-octonary)"];
const scope = () => $("traffic-scope")?.value || "*";
const number = value => fmt(Number(value) || 0);
@@ -116,7 +116,17 @@
if (!authenticated || currentPanel !== "traffic" || loading) return;
loading = true;
try {
const data = await api(`/api/traffic?vhost=${encodeURIComponent(scope())}`, { signal });
const base = `/api/traffic?vhost=${encodeURIComponent(scope())}`;
let data = await api(staticData ? `${base}&view=live` : base, { signal });
if (staticData && data.revision !== staticRevision) {
data = await api(base, { signal });
}
if (Array.isArray(data.vhosts)) {
staticData = { vhosts: data.vhosts };
staticRevision = data.revision;
} else if (staticData) {
data = { ...staticData, ...data };
}
if (isCurrent()) render(data);
} catch (error) {
if (error?.name !== "AbortError" && isCurrent()) $("traffic-panel-state").textContent = error.message;
@@ -125,7 +135,7 @@
function refresh() { return rustProxyRefresh.manual("traffic"); }
function reset() {
lastData = null; if ($("traffic-panel-state")) $("traffic-panel-state").textContent = "";
lastData = null; staticData = null; staticRevision = null; if ($("traffic-panel-state")) $("traffic-panel-state").textContent = "";
document.querySelectorAll(".traffic-bar-chart").forEach(chart => chart.replaceChildren());
for (const id of ["countries", "methods", "methods-detail", "statuses", "statuses-detail", "cache", "cache-detail"]) {
const chart = $(`traffic-chart-${id}`), legend = $(`traffic-chart-${id}-legend`), total = $(`traffic-chart-${id}-total`);
+10 -3
View File
@@ -1,6 +1,6 @@
"use strict";
(() => {
let loading = false, generation = 0, lastData = null;
let loading = false, generation = 0, lastData = null, staticData = null, staticRevision = null;
let liveChartScope = "", liveChartPrevious = null, liveChartPreviousAt = null, liveChartGeneration = null;
const liveChartSamples = { applied: [], cache_hits: [], skipped: [], errors: [] };
const LIVE_CHART_LIMITS = new Set([60, 120, 300, 600]);
@@ -155,7 +155,14 @@
loading = true;
const epoch = authEpoch, token = generation;
try {
const data = await api("/api/transform", { signal });
let data = await api(staticData ? "/api/transform?view=live" : "/api/transform", { signal });
if (staticData && data.revision !== staticRevision) data = await api("/api/transform", { signal });
if (data.settings && Array.isArray(data.vhosts)) {
staticData = { settings: data.settings, vhosts: data.vhosts };
staticRevision = data.revision;
} else if (staticData) {
data = { ...staticData, ...data };
}
if (isCurrent() && token === generation) render(data);
} catch (error) {
if (error?.name !== "AbortError" && epoch === authEpoch && isCurrent()) {
@@ -179,7 +186,7 @@
window.rustProxyTransformPanel = {
refresh,
reset() {
generation++; lastData = null; resetLiveChart();
generation++; lastData = null; staticData = null; staticRevision = null; resetLiveChart();
$("transform-type-rows")?.replaceChildren();
$("transform-vhost-rows")?.replaceChildren();
$("transform-reason-list")?.replaceChildren();