"use strict"; // Per-vhost rate limit editors, shared in the bundled vhost closure. function userAgentRateEditor(parent, values = []) { parent.append(text("h3", "vhUaRateTitle", "subheading vh-wide")); const rows = el("div", undefined, "vh-wide vh-ua-rates"); parent.append(rows); const add = (value = {}) => { if (rows.children.length >= 64) { toast(t("vhUaRateMax"), true); return; } const row = el("div", undefined, "vh-row vh-grid"); field(row, "ua-rate-pattern", "vhUaRatePattern", value.pattern || "", "text", { required: true, maxLength: 256 }); field(row, "ua-rate-requests", "vhRateRequests", value.requests ?? 120, "number", { required: true, min: 1, max: 1000000 }); field(row, "ua-rate-window", "vhRateWindow", value.window_seconds ?? 60, "number", { required: true, min: 1, max: 3600 }); field(row, "ua-rate-burst", "vhRateBurst", value.burst ?? 0, "number", { required: true, min: 0, max: 1000000 }); row.append(button("remove", () => { row.remove(); changed(); })); rows.append(row); }; for (const value of values) add(value); parent.append(button("vhAddUaRate", () => { add(); changed(); })); note(parent, "vhUaRateHelp"); return () => [...rows.children].map(row => ({ pattern: str("ua-rate-pattern", row).trim(), requests: num("ua-rate-requests", row), window_seconds: num("ua-rate-window", row), burst: num("ua-rate-burst", row) })); }