v0.35.1: performance, AGPL licensing and documentation overhaul
- Web Server reads static files inline; proxy middleware chain flattened - About window with license summary and project links; AGPL-3.0-or-later - Rewritten documentation: feature list, screenshots, performance guide - Fix false spikes in per-Vhost request-rate charts
This commit is contained in:
1 parent
d3b492874b
commit
eba9f89283
135 files changed
+1425
-1064
No files matched your search
@@ -21,8 +21,7 @@ function syncConfigHistoryRestoreButton() {
|
||||
button.hidden = configHistorySelectedRevision === null;
|
||||
button.disabled = busy || !envelope || !Number.isSafeInteger(revision) || revision >= Number(envelope.revision);
|
||||
}
|
||||
// Compare leaf fields, not serialized object/array blobs. Object IDs are used
|
||||
// for stable array paths so reordering vhosts does not become a huge fake diff.
|
||||
// Leaf-level diff keyed by object IDs, so reordering is not a change.
|
||||
function configDiff(before, after, path = "$", output = [], depth = 0) {
|
||||
if (output.length >= 200 || Object.is(before, after)) return output;
|
||||
if (depth >= 24) {
|
||||
|
||||
@@ -144,9 +144,7 @@ window.rustProxyDashboardLayout = (() => {
|
||||
widen.addEventListener("click", () => resize(id, 1));
|
||||
const widthValue = el("span", `${width}/12`, "overview-layout-width-value");
|
||||
widthValue.title = t("overviewLayoutWidth");
|
||||
// The visual editor intentionally keeps uniformly sized previews.
|
||||
// Group sizing separately from ordering/hiding so both sets wrap
|
||||
// inside a narrow dialog rather than spilling into adjacent tiles.
|
||||
// Size and order controls are grouped separately so they wrap in narrow dialogs.
|
||||
const sizeActions = el("span", undefined, "overview-layout-size-actions");
|
||||
sizeActions.append(narrow, widthValue, widen);
|
||||
const orderActions = el("span", undefined, "overview-layout-order-actions");
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
// One continuity policy for all browser-side counter-derived rates.
|
||||
// Background tabs cannot supply a valid instantaneous rate for an interval
|
||||
// spanning the pause. Keep the plotted history and rebase on the next sample.
|
||||
// Shared rate sampling: rebase after background-tab pauses instead of plotting a false spike.
|
||||
const rustProxyRateSampling = (() => {
|
||||
let generation = 0;
|
||||
const pause = () => { generation += 1; };
|
||||
@@ -19,6 +17,10 @@ const rustProxyRateSampling = (() => {
|
||||
at - previous.at <= Math.max(10000, seconds * 3000));
|
||||
}
|
||||
function difference(previous, values, at, intervalSeconds = 3) {
|
||||
if (previous && previous.generation === generation && Number.isFinite(at) &&
|
||||
Number.isFinite(previous.at) && at >= previous.at && at - previous.at < 250) {
|
||||
return { next: previous, deltas: null, seconds: null, rapid: true };
|
||||
}
|
||||
const next = { ...stamp(at), values: [...values] };
|
||||
if (!continuous(previous, at, intervalSeconds) ||
|
||||
values.some((value, i) => !Number.isFinite(value) || value < 0 ||
|
||||
|
||||
Reference in new issue
Block a user