SPA (cmd/frontend/web): - New "lb buckets" column backed by a 1s-debounced GetVPPLBState fetch loop with leading+trailing edge coalesce. - Per-frontend health icon (✅/⚠️/❗/‼️/❓) in the Zippy header, gated by a settling flag that suppresses ‼️ until the next lb-state reconciliation after a backend transition or weight change. - In-place leaf merge on lb-state so stable bucket values (e.g. "0") don't retrigger the Flash animation on every refresh. - Zippy cards remember open state in a cookie, default closed on fresh load; fixed-width frontend-title-name + reserved icon slot so headers line up across all cards. - Clock-drift watchdog in sse.ts that forces a fresh EventSource on laptop-wake so the broker emits a resync instead of hanging on a dead half-open socket. Frontend service (cmd/frontend): - maglevClient.lbStateLoop, trigger on backend transitions + vpp-connect, best-effort fetch on refreshAll. - Admin handlers explicitly wake the lb-state loop after lifecycle ops and set-weight (the latter emits no transition event on the maglevd side, so the WatchEvents path wouldn't have caught it). - /favicon.ico served from embedded web/public IPng logo. VPP integration: - internal/vpp/lbstate.go: dumpASesForVIP drops Pfx from the dump request (setting it silently wipes IPv4 replies in the LB plugin) and filters results by prefix on the response side instead, which also demuxes multi-VIP-on-same-port cases correctly. maglevc: - Walk now returns the unconsumed token tail; dispatch and the question listener reject unknown commands with a targeted error instead of dumping the full command tree prefixed with garbage. - On '?', echo the current line (including the '?') before the help list so the output reads like birdc. Checker / prober: - internal/checker: ±10% jitter on NextInterval so probes across restart don't all fire on the same tick. - internal/prober: HTTP User-Agent now carries the build version and project URL. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2 lines
39 KiB
JavaScript
2 lines
39 KiB
JavaScript
(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))r(s);new MutationObserver(s=>{for(const l of s)if(l.type==="childList")for(const o of l.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const l={};return s.integrity&&(l.integrity=s.integrity),s.referrerPolicy&&(l.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?l.credentials="include":s.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function r(s){if(s.ep)return;s.ep=!0;const l=n(s);fetch(s.href,l)}})();const dt=!1,gt=(e,t)=>e===t,G=Symbol("solid-proxy"),Ee=Symbol("solid-track"),de={equals:gt};let Ve=Ye;const V=1,ge=2,Ke={owned:null,cleanups:null,context:null,owner:null};var k=null;let Ae=null,ht=null,_=null,O=null,R=null,ye=0;function le(e,t){const n=_,r=k,s=e.length===0,l=t===void 0?r:t,o=s?Ke:{owned:null,cleanups:null,context:l?l.context:null,owner:l},i=s?e:()=>e(()=>B(()=>oe(o)));k=o,_=null;try{return J(i,!0)}finally{_=n,k=r}}function A(e,t){t=t?Object.assign({},de,t):de;const n={value:e,observers:null,observerSlots:null,comparator:t.equals||void 0},r=s=>(typeof s=="function"&&(s=s(n.value)),qe(n,s));return[Ge.bind(n),r]}function E(e,t,n){const r=Pe(e,t,!1,V);ce(r)}function K(e,t,n){Ve=_t;const r=Pe(e,t,!1,V);(!n||!n.render)&&(r.user=!0),R?R.push(r):ce(r)}function H(e,t,n){n=n?Object.assign({},de,n):de;const r=Pe(e,t,!0,0);return r.observers=null,r.observerSlots=null,r.comparator=n.equals||void 0,ce(r),Ge.bind(r)}function bt(e){return J(e,!1)}function B(e){if(_===null)return e();const t=_;_=null;try{return e()}finally{_=t}}function mt(e,t,n){const r=Array.isArray(e);let s,l=n&&n.defer;return o=>{let i;if(r){i=Array(e.length);for(let c=0;c<e.length;c++)i[c]=e[c]()}else i=e();if(l)return l=!1,o;const a=B(()=>t(i,s,o));return s=i,a}}function pt(e){K(()=>B(e))}function q(e){return k===null||(k.cleanups===null?k.cleanups=[e]:k.cleanups.push(e)),e}function Ce(){return _}function $t(){return k}function wt(e,t){const n=k,r=_;k=e,_=null;try{return J(t,!0)}catch(s){Ne(s)}finally{k=n,_=r}}function Ge(){if(this.sources&&this.state)if(this.state===V)ce(this);else{const e=O;O=null,J(()=>be(this),!1),O=e}if(_){const e=this.observers?this.observers.length:0;_.sources?(_.sources.push(this),_.sourceSlots.push(e)):(_.sources=[this],_.sourceSlots=[e]),this.observers?(this.observers.push(_),this.observerSlots.push(_.sources.length-1)):(this.observers=[_],this.observerSlots=[_.sources.length-1])}return this.value}function qe(e,t,n){let r=e.value;return(!e.comparator||!e.comparator(r,t))&&(e.value=t,e.observers&&e.observers.length&&J(()=>{for(let s=0;s<e.observers.length;s+=1){const l=e.observers[s],o=Ae&&Ae.running;o&&Ae.disposed.has(l),(o?!l.tState:!l.state)&&(l.pure?O.push(l):R.push(l),l.observers&&Je(l)),o||(l.state=V)}if(O.length>1e6)throw O=[],new Error},!1)),t}function ce(e){if(!e.fn)return;oe(e);const t=ye;vt(e,e.value,t)}function vt(e,t,n){let r;const s=k,l=_;_=k=e;try{r=e.fn(t)}catch(o){return e.pure&&(e.state=V,e.owned&&e.owned.forEach(oe),e.owned=null),e.updatedAt=n+1,Ne(o)}finally{_=l,k=s}(!e.updatedAt||e.updatedAt<=n)&&(e.updatedAt!=null&&"observers"in e?qe(e,r):e.value=r,e.updatedAt=n)}function Pe(e,t,n,r=V,s){const l={fn:e,state:r,updatedAt:null,owned:null,sources:null,sourceSlots:null,cleanups:null,value:t,owner:k,context:k?k.context:null,pure:n};return k===null||k!==Ke&&(k.owned?k.owned.push(l):k.owned=[l]),l}function he(e){if(e.state===0)return;if(e.state===ge)return be(e);if(e.suspense&&B(e.suspense.inFallback))return e.suspense.effects.push(e);const t=[e];for(;(e=e.owner)&&(!e.updatedAt||e.updatedAt<ye);)e.state&&t.push(e);for(let n=t.length-1;n>=0;n--)if(e=t[n],e.state===V)ce(e);else if(e.state===ge){const r=O;O=null,J(()=>be(e,t[0]),!1),O=r}}function J(e,t){if(O)return e();let n=!1;t||(O=[]),R?n=!0:R=[],ye++;try{const r=e();return yt(n),r}catch(r){n||(R=null),O=null,Ne(r)}}function yt(e){if(O&&(Ye(O),O=null),e)return;const t=R;R=null,t.length&&J(()=>Ve(t),!1)}function Ye(e){for(let t=0;t<e.length;t++)he(e[t])}function _t(e){let t,n=0;for(t=0;t<e.length;t++){const r=e[t];r.user?e[n++]=r:he(r)}for(t=0;t<n;t++)he(e[t])}function be(e,t){e.state=0;for(let n=0;n<e.sources.length;n+=1){const r=e.sources[n];if(r.sources){const s=r.state;s===V?r!==t&&(!r.updatedAt||r.updatedAt<ye)&&he(r):s===ge&&be(r,t)}}}function Je(e){for(let t=0;t<e.observers.length;t+=1){const n=e.observers[t];n.state||(n.state=ge,n.pure?O.push(n):R.push(n),n.observers&&Je(n))}}function oe(e){let t;if(e.sources)for(;e.sources.length;){const n=e.sources.pop(),r=e.sourceSlots.pop(),s=n.observers;if(s&&s.length){const l=s.pop(),o=n.observerSlots.pop();r<s.length&&(l.sourceSlots[o]=r,s[r]=l,n.observerSlots[r]=o)}}if(e.tOwned){for(t=e.tOwned.length-1;t>=0;t--)oe(e.tOwned[t]);delete e.tOwned}if(e.owned){for(t=e.owned.length-1;t>=0;t--)oe(e.owned[t]);e.owned=null}if(e.cleanups){for(t=e.cleanups.length-1;t>=0;t--)e.cleanups[t]();e.cleanups=null}e.state=0}function kt(e){return e instanceof Error?e:new Error(typeof e=="string"?e:"Unknown error",{cause:e})}function Ne(e,t=k){throw kt(e)}const St=Symbol("fallback");function Be(e){for(let t=0;t<e.length;t++)e[t]()}function xt(e,t,n={}){let r=[],s=[],l=[],o=0,i=t.length>1?[]:null;return q(()=>Be(l)),()=>{let a=e()||[],c=a.length,u,f;return a[Ee],B(()=>{let g,v,w,T,C,p,m,y,S;if(c===0)o!==0&&(Be(l),l=[],r=[],s=[],o=0,i&&(i=[])),n.fallback&&(r=[St],s[0]=le(x=>(l[0]=x,n.fallback())),o=1);else if(o===0){for(s=new Array(c),f=0;f<c;f++)r[f]=a[f],s[f]=le($);o=c}else{for(w=new Array(c),T=new Array(c),i&&(C=new Array(c)),p=0,m=Math.min(o,c);p<m&&r[p]===a[p];p++);for(m=o-1,y=c-1;m>=p&&y>=p&&r[m]===a[y];m--,y--)w[y]=s[m],T[y]=l[m],i&&(C[y]=i[m]);for(g=new Map,v=new Array(y+1),f=y;f>=p;f--)S=a[f],u=g.get(S),v[f]=u===void 0?-1:u,g.set(S,f);for(u=p;u<=m;u++)S=r[u],f=g.get(S),f!==void 0&&f!==-1?(w[f]=s[u],T[f]=l[u],i&&(C[f]=i[u]),f=v[f],g.set(S,f)):l[u]();for(f=p;f<c;f++)f in w?(s[f]=w[f],l[f]=T[f],i&&(i[f]=C[f],i[f](f))):s[f]=le($);s=s.slice(0,o=c),r=a.slice(0)}return s});function $(g){if(l[f]=g,i){const[v,w]=A(f);return i[f]=w,t(a[f],v)}return t(a[f])}}}function h(e,t){return B(()=>e(t||{}))}const At=e=>`Stale read from <${e}>.`;function Q(e){const t="fallback"in e&&{fallback:()=>e.fallback};return H(xt(()=>e.each,e.children,t||void 0))}function N(e){const t=e.keyed,n=H(()=>e.when,void 0,void 0),r=t?n:H(n,void 0,{equals:(s,l)=>!s==!l});return H(()=>{const s=r();if(s){const l=e.children;return typeof l=="function"&&l.length>0?B(()=>l(t?s:()=>{if(!B(r))throw At("Show");return n()})):l}return e.fallback},void 0,void 0)}const I=e=>H(()=>e());function Et(e,t,n){let r=n.length,s=t.length,l=r,o=0,i=0,a=t[s-1].nextSibling,c=null;for(;o<s||i<l;){if(t[o]===n[i]){o++,i++;continue}for(;t[s-1]===n[l-1];)s--,l--;if(s===o){const u=l<r?i?n[i-1].nextSibling:n[l-i]:a;for(;i<l;)e.insertBefore(n[i++],u)}else if(l===i)for(;o<s;)(!c||!c.has(t[o]))&&t[o].remove(),o++;else if(t[o]===n[l-1]&&n[i]===t[s-1]){const u=t[--s].nextSibling;e.insertBefore(n[i++],t[o++].nextSibling),e.insertBefore(n[--l],u),t[s]=n[l]}else{if(!c){c=new Map;let f=i;for(;f<l;)c.set(n[f],f++)}const u=c.get(t[o]);if(u!=null)if(i<u&&u<l){let f=o,$=1,g;for(;++f<s&&f<l&&!((g=c.get(t[f]))==null||g!==u+$);)$++;if($>u-i){const v=t[o];for(;i<u;)e.insertBefore(n[i++],v)}else e.replaceChild(n[i++],t[o++])}else o++;else t[o++].remove()}}}const We="_$DX_DELEGATE";function Ct(e,t,n,r={}){let s;return le(l=>{s=l,t===document?e():d(t,e(),t.firstChild?null:void 0,n)},r.owner),()=>{s(),t.textContent=""}}function b(e,t,n,r){let s;const l=()=>{const i=document.createElement("template");return i.innerHTML=e,i.content.firstChild},o=()=>(s||(s=l())).cloneNode(!0);return o.cloneNode=o,o}function _e(e,t=window.document){const n=t[We]||(t[We]=new Set);for(let r=0,s=e.length;r<s;r++){const l=e[r];n.has(l)||(n.add(l),t.addEventListener(l,Pt))}}function L(e,t,n){n==null?e.removeAttribute(t):e.setAttribute(t,n)}function Ot(e,t){t==null?e.removeAttribute("class"):e.className=t}function Tt(e,t,n,r){Array.isArray(n)?(e[`$$${t}`]=n[0],e[`$$${t}Data`]=n[1]):e[`$$${t}`]=n}function ke(e,t,n){return B(()=>e(t,n))}function d(e,t,n,r){if(n!==void 0&&!r&&(r=[]),typeof t!="function")return me(e,t,r,n);E(s=>me(e,t(),s,n),r)}function Pt(e){let t=e.target;const n=`$$${e.type}`,r=e.target,s=e.currentTarget,l=a=>Object.defineProperty(e,"target",{configurable:!0,value:a}),o=()=>{const a=t[n];if(a&&!t.disabled){const c=t[`${n}Data`];if(c!==void 0?a.call(t,c,e):a.call(t,e),e.cancelBubble)return}return t.host&&typeof t.host!="string"&&!t.host._$host&&t.contains(e.target)&&l(t.host),!0},i=()=>{for(;o()&&(t=t._$host||t.parentNode||t.host););};if(Object.defineProperty(e,"currentTarget",{configurable:!0,get(){return t||document}}),e.composedPath){const a=e.composedPath();l(a[0]);for(let c=0;c<a.length-2&&(t=a[c],!!o());c++){if(t._$host){t=t._$host,i();break}if(t.parentNode===s)break}}else i();l(r)}function me(e,t,n,r,s){for(;typeof n=="function";)n=n();if(t===n)return n;const l=typeof t,o=r!==void 0;if(e=o&&n[0]&&n[0].parentNode||e,l==="string"||l==="number"){if(l==="number"&&(t=t.toString(),t===n))return n;if(o){let i=n[0];i&&i.nodeType===3?i.data!==t&&(i.data=t):i=document.createTextNode(t),n=X(e,n,r,i)}else n!==""&&typeof n=="string"?n=e.firstChild.data=t:n=e.textContent=t}else if(t==null||l==="boolean")n=X(e,n,r);else{if(l==="function")return E(()=>{let i=t();for(;typeof i=="function";)i=i();n=me(e,i,n,r)}),()=>n;if(Array.isArray(t)){const i=[],a=n&&Array.isArray(n);if(Oe(i,t,n,s))return E(()=>n=me(e,i,n,r,!0)),()=>n;if(i.length===0){if(n=X(e,n,r),o)return n}else a?n.length===0?Ue(e,i,r):Et(e,n,i):(n&&X(e),Ue(e,i));n=i}else if(t.nodeType){if(Array.isArray(n)){if(o)return n=X(e,n,r,t);X(e,n,null,t)}else n==null||n===""||!e.firstChild?e.appendChild(t):e.replaceChild(t,e.firstChild);n=t}}return n}function Oe(e,t,n,r){let s=!1;for(let l=0,o=t.length;l<o;l++){let i=t[l],a=n&&n[e.length],c;if(!(i==null||i===!0||i===!1))if((c=typeof i)=="object"&&i.nodeType)e.push(i);else if(Array.isArray(i))s=Oe(e,i,a)||s;else if(c==="function")if(r){for(;typeof i=="function";)i=i();s=Oe(e,Array.isArray(i)?i:[i],Array.isArray(a)?a:[a])||s}else e.push(i),s=!0;else{const u=String(i);a&&a.nodeType===3&&a.data===u?e.push(a):e.push(document.createTextNode(u))}}return s}function Ue(e,t,n=null){for(let r=0,s=t.length;r<s;r++)e.insertBefore(t[r],n)}function X(e,t,n,r){if(n===void 0)return e.textContent="";const s=r||document.createTextNode("");if(t.length){let l=!1;for(let o=t.length-1;o>=0;o--){const i=t[o];if(s!==i){const a=i.parentNode===e;!l&&!o?a?e.replaceChild(s,i):e.insertBefore(s,n):a&&i.remove()}else l=!0}}else e.insertBefore(s,n);return[s]}const Nt="http://www.w3.org/2000/svg";function Lt(e,t=!1,n=void 0){return t?document.createElementNS(Nt,e):document.createElement(e,{is:n})}function It(e){const{useShadow:t}=e,n=document.createTextNode(""),r=()=>e.mount||document.body,s=$t();let l;return K(()=>{l||(l=wt(s,()=>H(()=>e.children)));const o=r();if(o instanceof HTMLHeadElement){const[i,a]=A(!1),c=()=>a(!0);le(u=>d(o,()=>i()?u():l(),null)),q(c)}else{const i=Lt(e.isSVG?"g":"div",e.isSVG),a=t&&i.attachShadow?i.attachShadow({mode:"open"}):i;Object.defineProperty(i,"_$host",{get(){return n.parentNode},configurable:!0}),d(a,l),o.appendChild(i),e.ref&&e.ref(i),q(()=>o.removeChild(i))}},void 0,{render:!0}),n}async function Xe(e){const t=await fetch(e,{credentials:"same-origin"});if(!t.ok)throw new Error(`${e}: ${t.status} ${t.statusText}`);return await t.json()}function Ze(){return Xe("/view/api/state")}function jt(){return Xe("/view/api/version")}const pe=Symbol("store-raw"),z=Symbol("store-node"),M=Symbol("store-has"),ze=Symbol("store-self");function Qe(e){let t=e[G];if(!t&&(Object.defineProperty(e,G,{value:t=new Proxy(e,Rt)}),!Array.isArray(e))){const n=Object.keys(e),r=Object.getOwnPropertyDescriptors(e);for(let s=0,l=n.length;s<l;s++){const o=n[s];r[o].get&&Object.defineProperty(e,o,{enumerable:r[o].enumerable,get:r[o].get.bind(t)})}}return t}function ee(e){let t;return e!=null&&typeof e=="object"&&(e[G]||!(t=Object.getPrototypeOf(e))||t===Object.prototype||Array.isArray(e))}function te(e,t=new Set){let n,r,s,l;if(n=e!=null&&e[pe])return n;if(!ee(e)||t.has(e))return e;if(Array.isArray(e)){Object.isFrozen(e)?e=e.slice(0):t.add(e);for(let o=0,i=e.length;o<i;o++)s=e[o],(r=te(s,t))!==s&&(e[o]=r)}else{Object.isFrozen(e)?e=Object.assign({},e):t.add(e);const o=Object.keys(e),i=Object.getOwnPropertyDescriptors(e);for(let a=0,c=o.length;a<c;a++)l=o[a],!i[l].get&&(s=e[l],(r=te(s,t))!==s&&(e[l]=r))}return e}function $e(e,t){let n=e[t];return n||Object.defineProperty(e,t,{value:n=Object.create(null)}),n}function ae(e,t,n){if(e[t])return e[t];const[r,s]=A(n,{equals:!1,internal:!0});return r.$=s,e[t]=r}function Dt(e,t){const n=Reflect.getOwnPropertyDescriptor(e,t);return!n||n.get||!n.configurable||t===G||t===z||(delete n.value,delete n.writable,n.get=()=>e[G][t]),n}function et(e){Ce()&&ae($e(e,z),ze)()}function Mt(e){return et(e),Reflect.ownKeys(e)}const Rt={get(e,t,n){if(t===pe)return e;if(t===G)return n;if(t===Ee)return et(e),n;const r=$e(e,z),s=r[t];let l=s?s():e[t];if(t===z||t===M||t==="__proto__")return l;if(!s){const o=Object.getOwnPropertyDescriptor(e,t);Ce()&&(typeof l!="function"||e.hasOwnProperty(t))&&!(o&&o.get)&&(l=ae(r,t,l)())}return ee(l)?Qe(l):l},has(e,t){return t===pe||t===G||t===Ee||t===z||t===M||t==="__proto__"?!0:(Ce()&&ae($e(e,M),t)(),t in e)},set(){return!0},deleteProperty(){return!0},ownKeys:Mt,getOwnPropertyDescriptor:Dt};function ne(e,t,n,r=!1){if(!r&&e[t]===n)return;const s=e[t],l=e.length;n===void 0?(delete e[t],e[M]&&e[M][t]&&s!==void 0&&e[M][t].$()):(e[t]=n,e[M]&&e[M][t]&&s===void 0&&e[M][t].$());let o=$e(e,z),i;if((i=ae(o,t,s))&&i.$(()=>n),Array.isArray(e)&&e.length!==l){for(let a=e.length;a<l;a++)(i=o[a])&&i.$();(i=ae(o,"length",l))&&i.$(e.length)}(i=o[ze])&&i.$()}function tt(e,t){const n=Object.keys(t);for(let r=0;r<n.length;r+=1){const s=n[r];ne(e,s,t[s])}}function Bt(e,t){if(typeof t=="function"&&(t=t(e)),t=te(t),Array.isArray(t)){if(e===t)return;let n=0,r=t.length;for(;n<r;n++){const s=t[n];e[n]!==s&&ne(e,n,s)}ne(e,"length",r)}else tt(e,t)}function se(e,t,n=[]){let r,s=e;if(t.length>1){r=t.shift();const o=typeof r,i=Array.isArray(e);if(Array.isArray(r)){for(let a=0;a<r.length;a++)se(e,[r[a]].concat(t),n);return}else if(i&&o==="function"){for(let a=0;a<e.length;a++)r(e[a],a)&&se(e,[a].concat(t),n);return}else if(i&&o==="object"){const{from:a=0,to:c=e.length-1,by:u=1}=r;for(let f=a;f<=c;f+=u)se(e,[f].concat(t),n);return}else if(t.length>1){se(e[r],t,[r].concat(n));return}s=e[r],n=[r].concat(n)}let l=t[0];typeof l=="function"&&(l=l(s,n),l===s)||r===void 0&&l==null||(l=te(l),r===void 0||ee(s)&&ee(l)&&!Array.isArray(l)?tt(s,l):ne(e,r,l))}function Wt(...[e,t]){const n=te(e||{}),r=Array.isArray(n),s=Qe(n);function l(...o){bt(()=>{r&&o.length===1?Bt(n,o[0]):se(n,o)})}return[s,l]}const we=new WeakMap,nt={get(e,t){if(t===pe)return e;const n=e[t];let r;return ee(n)?we.get(n)||(we.set(n,r=new Proxy(n,nt)),r):n},set(e,t,n){return ne(e,t,te(n)),!0},deleteProperty(e,t){return ne(e,t,void 0,!0),!0}};function F(e){return t=>{if(ee(t)){let n;(n=we.get(t))||we.set(t,n=new Proxy(t,nt)),e(n)}return t}}const[Ut,Ht]=A(0);setInterval(()=>Ht(e=>e+1),5e3);function Le(e){const t={};for(const n of e.backends)t[n.name]=n.state;for(const n of e.frontends){let r=0;for(let a=0;a<n.pools.length;a++){let c=!1;for(const u of n.pools[a].backends)if(t[u.name]==="up"&&u.weight>0){c=!0;break}if(c){r=a;break}}let s=!1,l=!1,o=!0;const i=new Set;for(let a=0;a<n.pools.length;a++)for(const c of n.pools[a].backends){const u=t[c.name];c.effective_weight=u==="up"&&a===r?c.weight:0,c.effective_weight>0&&(s=!0),i.has(c.name)||(i.add(c.name),l=!0,u!=="unknown"&&(o=!1))}!l||o?n.state="unknown":s?n.state="up":n.state="down"}}const[Y,W]=Wt({byName:{},settling:{}}),Ft=2e3,ie=new Map;function Vt(e,t){return`${e}\0${t}`}function rt(e,t){W(F(s=>{s.settling[e]||(s.settling[e]={}),s.settling[e][t]=!0}));const n=Vt(e,t),r=ie.get(n);r&&clearTimeout(r),ie.set(n,setTimeout(()=>{ie.delete(n),W(F(s=>{s.settling[e]&&delete s.settling[e][t]}))},Ft))}function Kt(e){for(const[t,n]of ie)t.startsWith(e+"\0")&&(clearTimeout(n),ie.delete(t));W(F(t=>{t.settling[e]&&(t.settling[e]={})}))}function st(e){const t={};for(const n of e)Le(n),t[n.maglevd.name]=n;W({byName:t})}function Gt(e,t){W(F(r=>{const s=r.byName[e];if(!s)return;const l=s.backends.find(o=>o.name===t.backend);l&&(l.state=t.transition.to,l.enabled=t.transition.to!=="disabled",l.last_transition=t.transition,l.transitions||(l.transitions=[]),l.transitions.push(t.transition),l.transitions.length>20&&(l.transitions=l.transitions.slice(l.transitions.length-20)),Le(s))}));const n=Y.byName[e];if(n)for(const r of n.frontends)r.pools.some(s=>s.backends.some(l=>l.name===t.backend))&&rt(e,r.name)}function qt(e,t){W(F(n=>{const r=n.byName[e];if(!r)return;const s=t.per_frontend;if(!s||Object.keys(s).length===0){r.lb_state!==void 0&&(r.lb_state=void 0);return}r.lb_state||(r.lb_state={per_frontend:{}});const o=r.lb_state.per_frontend;for(const i of Object.keys(s)){o[i]||(o[i]={});const a=o[i],c=s[i];for(const u of Object.keys(c))a[u]!==c[u]&&(a[u]=c[u]);for(const u of Object.keys(a))u in c||delete a[u]}for(const i of Object.keys(o))i in s||delete o[i]})),Kt(e)}function Yt(e,t,n){return e?.lb_state?.per_frontend?.[t]?.[n]}function Jt(e,t){W(F(n=>{const r=n.byName[e];r&&(r.vpp_state=t)}))}function Xt(e,t){W(F(n=>{const r=n.byName[e];r&&(r.maglevd.connected=t.connected,r.maglevd.last_error=t.last_error)}))}function Zt(e,t,n,r,s){W(F(l=>{const o=l.byName[e];if(!o)return;const i=o.frontends.find(u=>u.name===t);if(!i)return;const a=i.pools.find(u=>u.name===n);if(!a)return;const c=a.backends.find(u=>u.name===r);c&&(c.weight=s,Le(o))})),rt(e,t)}function zt(e,t){const n={};for(const f of e.backends)n[f.name]=f.state;const r=!!e.lb_state,s=e.lb_state?.per_frontend?.[t.name],l=!!Y.settling[e.maglevd.name]?.[t.name];let o=!1,i=!1;for(const f of t.pools)for(const $ of f.backends)if(n[$.name]!=="up"&&(o=!0),!l&&r&&$.effective_weight>0){const g=s?.[$.name];(g===void 0||g===0)&&(i=!0)}const a=t.pools[0],c=!!a&&a.backends.some(f=>f.weight>0),u=!a||a.backends.every(f=>f.effective_weight===0);return!o&&c&&!i?"ok":i?"bug-buckets":u?"primary-drained":o?"degraded":"unknown"}function Qt(e,t){switch(zt(e,t)){case"ok":return"✅";case"bug-buckets":return"‼️";case"primary-drained":return"❗";case"degraded":return"⚠️";case"unknown":return"❓"}}function en(e,t){return e.includes(":")?`[${e}]:${t}`:`${e}:${t}`}function tn(e){if(Ut(),!e||!e.at_unix_ns||e.at_unix_ns<=0)return"";const t=Date.now()-e.at_unix_ns/1e6,n=Math.floor(t/1e3);if(n<=1)return"now";const r=n%60,s=Math.floor(n/60);if(s<1)return`${n}s ago`;const l=s%60,o=Math.floor(s/60);if(o<1)return`${l}m${r}s ago`;const i=o%24,a=Math.floor(o/24);return a<1?`${o}h${l}m ago`:`${a}d${i}h ago`}const He=500,[ve,nn]=A([]);function rn(e){nn(t=>{const n=[...t,e];return n.length>He?n.slice(n.length-He):n})}const sn=1e4,ln=3e4;function on(){let e,t=!1;const n=i=>{try{const a=JSON.parse(i.data);an(a)}catch(a){console.error("sse parse error",a,i.data)}},r=async()=>{try{const i=await Ze();st(i)}catch(i){console.error("resync refetch failed",i)}},s=()=>{e&&(e.close(),e=void 0),e=new EventSource("/view/api/events"),e.onmessage=n,e.addEventListener("resync",r),e.onerror=i=>{console.debug("sse error, browser will reconnect",i)}},l=i=>{t||(t=!0,console.info("sse reconnecting:",i),s(),setTimeout(()=>{t=!1},1e3))};let o=Date.now();setInterval(()=>{const i=Date.now(),a=i-o;o=i,a>ln&&l(`wake detected (${Math.round(a/1e3)}s gap)`)},sn),s()}function an(e){switch(rn(e),e.type){case"backend":Gt(e.maglevd,e.payload);break;case"frontend":e.maglevd,e.payload;break;case"maglevd-status":Xt(e.maglevd,e.payload);break;case"vpp-status":Jt(e.maglevd,e.payload.state);break;case"lb-state":qt(e.maglevd,e.payload);break}}const[Se,lt]=A(void 0);var cn=b("<nav class=scope-selector>"),un=b("<button class=scope-tab><span class=dot>");const fn=()=>{const e=()=>Object.keys(Y.byName).sort();return(()=>{var t=cn();return d(t,h(Q,{get each(){return e()},children:n=>{const r=()=>Y.byName[n],s=()=>r()?.maglevd.connected??!1;return(()=>{var l=un();return l.firstChild,l.$$click=()=>lt(n),d(l,n,null),E(o=>{var i=Se()===n,a=!!s(),c=!s(),u=r()?.maglevd.address??"";return i!==o.e&&l.classList.toggle("active",o.e=i),a!==o.t&&l.classList.toggle("connected",o.t=a),c!==o.a&&l.classList.toggle("disconnected",o.a=c),u!==o.o&&L(l,"title",o.o=u),o},{e:void 0,t:void 0,a:void 0,o:void 0}),l})()}})),t})()};_e(["click"]);var dn=b("<span class=status-badge>");const it=e=>(()=>{var t=dn();return d(t,()=>e.label??e.state),E(()=>L(t,"data-state",e.state)),t})();var gn=b("<span class=probe-heartbeat>");const hn="▶",bn="⏸",mn="⏹",pn="❤️",Fe=400;function $n(e){switch(e){case"paused":return bn;case"disabled":case"removed":return mn;default:return hn}}const wn=e=>{const[t,n]=A(!1);let r,s;return K(()=>{const l=ve();if(l.length===0)return;const o=l[l.length-1];if(o.type!=="log"||o.maglevd!==e.maglevd)return;const i=o.payload;i.attrs?.backend===e.backend&&i.msg==="probe-start"&&(n(!0),r?.animate([{transform:"scale(1)"},{transform:"scale(1.6)",offset:.25},{transform:"scale(1)"}],{duration:Fe,easing:"ease-out"}),s!==void 0&&clearTimeout(s),s=window.setTimeout(()=>{n(!1),s=void 0},Fe))}),q(()=>{s!==void 0&&clearTimeout(s)}),(()=>{var l=gn(),o=r;return typeof o=="function"?ke(o,l):r=l,d(l,(()=>{var i=I(()=>!!t());return()=>i()?pn:$n(e.state)})()),E(()=>l.classList.toggle("in-flight",!!t())),l})()};var vn=b("<span class=flash-target>");const Z=e=>{let t;return K(mt(()=>e.value,()=>{t?.animate([{transform:"scale(1)",backgroundColor:"#facc15",boxShadow:"0 0 0 2px #facc15",offset:0},{transform:"scale(1.35)",backgroundColor:"#facc15",boxShadow:"0 0 0 4px #facc15",offset:.18},{transform:"scale(1)",backgroundColor:"#facc15",boxShadow:"0 0 0 2px #facc15",offset:.5},{transform:"scale(1)",backgroundColor:"transparent",boxShadow:"0 0 0 0 transparent",offset:1}],{duration:1500,easing:"ease-out"})},{defer:!0})),(()=>{var n=vn(),r=t;return typeof r=="function"?ke(r,n):t=n,d(n,()=>e.children??e.value),n})()};async function yn(e,t,n){const r=`/admin/api/${encodeURIComponent(e)}/backend/${encodeURIComponent(t)}/${n}`,s=await fetch(r,{method:"POST",credentials:"same-origin"});if(!s.ok){const l=(await s.text()).trim();throw new Error(l||`${s.status} ${s.statusText}`)}return await s.json()}async function _n(e,t,n,r,s,l){const o=`/admin/api/${encodeURIComponent(e)}/frontend/${encodeURIComponent(t)}/pool/${encodeURIComponent(n)}/backend/${encodeURIComponent(r)}/weight`,i=await fetch(o,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({weight:s,flush:l})});if(!i.ok){const a=(await i.text()).trim();throw new Error(a||`${i.status} ${i.statusText}`)}return await i.json()}var kn=b("<div class=modal-backdrop><div class=modal-card role=dialog aria-modal=true><header class=modal-header><h3></h3><button type=button class=modal-close aria-label=close>×</button></header><div class=modal-body>");const Sn=e=>(K(()=>{const t=n=>{n.key==="Escape"&&e.onClose()};document.addEventListener("keydown",t),q(()=>document.removeEventListener("keydown",t))}),h(It,{get mount(){return document.body},get children(){var t=kn(),n=t.firstChild,r=n.firstChild,s=r.firstChild,l=s.nextSibling,o=r.nextSibling;return t.$$mousedown=i=>{i.target===i.currentTarget&&e.onClose()},d(s,()=>e.title),Tt(l,"click",e.onClose),d(o,()=>e.children),E(()=>L(n,"aria-label",e.title)),t}}));_e(["mousedown","click"]);var xn=b("<div class=kebab-menu role=menu>"),An=b('<div class=kebab-wrap><button type=button class=kebab-btn aria-haspopup=menu title="backend actions">⋮'),En=b("<button type=button class=kebab-item role=menuitem>"),Cn=b("<p class=dialog-error>"),On=b("<footer class=dialog-footer><button type=button class=btn-secondary>cancel</button><button type=button class=btn-primary>"),Tn=b("<p class=dialog-warn>VPP's flow table will be cleared for this backend. Active sessions will be dropped immediately."),Pn=b('<div class=dialog-body><p class=dialog-target><code></code> in pool <code></code> of frontend <code></code></p><label class=dialog-field><span class=weight-slider-label>weight<output class=weight-slider-value></output></span><input type=range class=weight-slider min=0 max=100 step=1><small>0–100; 0 keeps the backend in the pool but assigns it no traffic</small></label><label class="dialog-field checkbox"><input type=checkbox><span>flush existing flows'),Nn=b("<p class=dialog-note>VPP's flow table is left alone. Existing sessions keep reaching this backend until they finish."),Ln=b("<div class=dialog-body><p class=dialog-consequence>");function In(e){const t={label:"set weight…",action:"weight"};switch(e){case"up":case"down":case"unknown":return[t,{label:"pause",action:"pause"},{label:"disable",action:"disable"}];case"paused":return[t,{label:"resume",action:"resume"},{label:"disable",action:"disable"}];case"disabled":return[t,{label:"enable",action:"enable"}];default:return[]}}function jn(e){switch(e){case"pause":return"This will stop health checks and set the weight to 0, but existing flows to this backend are kept. New traffic will be rerouted to other backends.";case"resume":return"This will restart health checks. The backend re-enters the 'unknown' state and will start receiving traffic once it probes up.";case"disable":return"This will stop health checks, set the weight to 0, AND flush VPP's flow table for this backend. Active sessions will be dropped immediately.";case"enable":return"This will restart health checks on a previously disabled backend. It re-enters the 'unknown' state and will start receiving traffic once it probes up."}}const Dn=e=>{const[t,n]=A(!1),[r,s]=A(),[l,o]=A(!1),[i,a]=A(),[c,u]=A(e.configuredWeight),[f,$]=A(!1);let g;const v=()=>In(e.state);K(()=>{if(!t())return;const p=y=>{g&&(g.contains(y.target)||n(!1))},m=y=>{y.key==="Escape"&&n(!1)};document.addEventListener("mousedown",p),document.addEventListener("keydown",m),q(()=>{document.removeEventListener("mousedown",p),document.removeEventListener("keydown",m)})});const w=p=>{n(!1),a(void 0),p==="weight"&&(u(e.configuredWeight),$(!1)),s(p)},T=()=>{l()||(s(void 0),a(void 0))},C=async()=>{const p=r();if(p){o(!0),a(void 0);try{if(p==="weight"){const m=c();if(!Number.isFinite(m)||m<0||m>100)throw new Error("weight must be an integer in [0, 100]");const y=Math.floor(m);await _n(e.maglevd,e.frontend,e.pool,e.backend,y,f()),Zt(e.maglevd,e.frontend,e.pool,e.backend,y)}else await yn(e.maglevd,e.backend,p);s(void 0)}catch(m){a(`${m}`)}finally{o(!1)}}};return h(N,{get when(){return v().length>0},get children(){var p=An(),m=p.firstChild,y=g;return typeof y=="function"?ke(y,p):g=p,m.$$click=S=>{S.stopPropagation(),n(x=>!x)},d(p,h(N,{get when(){return t()},get children(){var S=xn();return d(S,h(Q,{get each(){return v()},children:x=>(()=>{var P=En();return P.$$click=()=>w(x.action),d(P,()=>x.label),P})()})),S}}),null),d(p,h(N,{get when(){return r()},children:S=>h(Sn,{get title(){return Mn(S(),e.backend)},onClose:T,get children(){return[I(()=>I(()=>S()==="weight")()?(()=>{var x=Pn(),P=x.firstChild,j=P.firstChild,D=j.nextSibling,re=D.nextSibling,ue=re.nextSibling,fe=ue.nextSibling,je=P.nextSibling,De=je.firstChild,ct=De.firstChild,ut=ct.nextSibling,Me=De.nextSibling,ft=je.nextSibling,Re=ft.firstChild;return d(j,()=>e.backend),d(re,()=>e.pool),d(fe,()=>e.frontend),d(ut,c),Me.$$input=xe=>u(Number(xe.currentTarget.value)),Re.addEventListener("change",xe=>$(xe.currentTarget.checked)),d(x,h(N,{get when(){return f()},get fallback(){return Nn()},get children(){return Tn()}}),null),E(()=>Me.value=c()),E(()=>Re.checked=f()),x})():(()=>{var x=Ln(),P=x.firstChild;return d(P,()=>jn(S())),x})()),h(N,{get when(){return i()},get children(){var x=Cn();return d(x,i),x}}),(()=>{var x=On(),P=x.firstChild,j=P.nextSibling;return P.$$click=T,j.$$click=C,d(j,()=>l()?"committing…":"commit"),E(D=>{var re=l(),ue=!!(S()==="disable"||S()==="weight"&&f()),fe=l();return re!==D.e&&(P.disabled=D.e=re),ue!==D.t&&j.classList.toggle("btn-danger",D.t=ue),fe!==D.a&&(j.disabled=D.a=fe),D},{e:void 0,t:void 0,a:void 0}),x})()]}})}),null),E(()=>L(m,"aria-expanded",t())),p}})};function Mn(e,t){switch(e){case"weight":return`Set weight — ${t}`;case"pause":return`Pause ${t}?`;case"resume":return`Resume ${t}?`;case"disable":return`Disable ${t}?`;case"enable":return`Enable ${t}?`}}_e(["click","input"]);const U=window.location.pathname.startsWith("/admin");var Rn=b("<td class=actions>"),Bn=b("<tr class=backend-row><td class=col-pool></td><td class=backend-name><span class=backend-name-text></span></td><td class=backend-address></td><td></td><td class=numeric></td><td class=numeric></td><td class=numeric></td><td class=age>");const Wn=e=>{const t=()=>e.backend,n=H(()=>{const r=Yt(Y.byName[e.maglevd],e.frontend,t().name);return r===void 0?"—":r});return(()=>{var r=Bn(),s=r.firstChild,l=s.nextSibling,o=l.firstChild,i=l.nextSibling,a=i.nextSibling,c=a.nextSibling,u=c.nextSibling,f=u.nextSibling,$=f.nextSibling;return d(s,(()=>{var g=I(()=>!!e.showPool);return()=>g()?e.pool:""})()),d(l,h(wn,{get maglevd(){return e.maglevd},get backend(){return t().name},get state(){return t().state}}),o),d(o,()=>t().name),d(i,()=>t().address),d(a,h(Z,{get value(){return t().state},get children(){return h(it,{get state(){return t().state}})}})),d(c,h(Z,{get value(){return e.poolBackend.weight}})),d(u,h(Z,{get value(){return e.poolBackend.effective_weight}})),d(f,h(Z,{get value(){return n()}})),d($,()=>tn(t().last_transition)),d(r,h(N,{when:U,get children(){var g=Rn();return d(g,h(Dn,{get maglevd(){return e.maglevd},get frontend(){return e.frontend},get pool(){return e.pool},get backend(){return t().name},get state(){return t().state},get configuredWeight(){return e.poolBackend.weight}})),g}}),null),E(g=>{var v=!e.poolActive,w=t().state;return v!==g.e&&r.classList.toggle("pool-standby",g.e=v),w!==g.t&&L(r,"data-state",g.t=w),g},{e:void 0,t:void 0}),r})()},Te="maglev_zippy_open",Un=60*60*24*365;function Hn(){try{const e=document.cookie.split("; ").find(n=>n.startsWith(Te+"="));if(!e)return new Set;const t=decodeURIComponent(e.slice(Te.length+1));return t?new Set(t.split(",")):new Set}catch{return new Set}}function Fn(e){try{const t=encodeURIComponent([...e].join(","));document.cookie=`${Te}=${t}; Path=/; Max-Age=${Un}; SameSite=Lax`}catch{}}const[ot,Vn]=A(Hn());function Kn(e){return ot().has(e)}function Gn(e,t){const n=ot();if(t===n.has(e))return;const r=new Set(n);t?r.add(e):r.delete(e),Vn(r),Fn(r)}var qn=b("<details class=zippy><summary></summary><div class=zippy-body>");const Ie=e=>(()=>{var t=qn(),n=t.firstChild,r=n.nextSibling;return t.addEventListener("toggle",s=>Gn(e.id,s.currentTarget.open)),d(n,()=>e.title),d(r,()=>e.children),E(()=>t.open=Kn(e.id)),t})();var Yn=b("<span class=frontend-title><span class=frontend-title-icon aria-label=health role=img></span><span class=frontend-title-name></span><span class=frontend-title-addr></span><span class=frontend-title-proto>"),Jn=b("<span class=tag>sticky"),Xn=b("<span class=frontend-title-desc>"),Zn=b('<th class="col-actions actions">'),zn=b('<table class=backend-table><thead><tr><th class=col-pool>pool</th><th class=col-name>backend</th><th class=col-address>address</th><th class=col-state>state</th><th class="col-weight numeric">weight</th><th class="col-effective numeric">effective</th><th class="col-buckets numeric">lb buckets</th><th class=col-age>last transition</th></tr></thead><tbody>');const Qn=e=>{const t=()=>Object.fromEntries(e.snap.backends.map(s=>[s.name,s])),n=()=>e.frontend,r=(()=>{var s=Yn(),l=s.firstChild,o=l.nextSibling,i=o.nextSibling,a=i.nextSibling;return d(l,()=>Qt(e.snap,n())),d(o,()=>n().name),d(s,h(Z,{get value(){return n().state??"unknown"},get children(){return h(it,{get state(){return n().state??"unknown"}})}}),i),d(i,()=>en(n().address,n().port)),d(a,()=>n().protocol.toUpperCase()),d(s,(()=>{var c=I(()=>!!n().src_ip_sticky);return()=>c()&&Jn()})(),null),d(s,(()=>{var c=I(()=>!!n().description);return()=>c()&&(()=>{var u=Xn();return d(u,()=>n().description),u})()})(),null),s})();return h(Ie,{get id(){return`frontend-${e.snap.maglevd.name}-${n().name}`},title:r,get children(){var s=zn(),l=s.firstChild,o=l.firstChild,i=o.firstChild,a=i.nextSibling,c=a.nextSibling,u=c.nextSibling,f=u.nextSibling,$=f.nextSibling,g=$.nextSibling;g.nextSibling;var v=l.nextSibling;return d(o,h(N,{when:U,get children(){return Zn()}}),null),d(v,h(Q,{get each(){return n().pools},children:w=>{const T=()=>w.backends.some(C=>C.effective_weight>0);return h(Q,{get each(){return w.backends},children:(C,p)=>{const m=t()[C.name];return m?h(Wn,{get maglevd(){return e.snap.maglevd.name},get frontend(){return n().name},get pool(){return w.name},get showPool(){return p()===0},get poolActive(){return T()},backend:m,poolBackend:C}):null}})}})),s}})};var er=b("<span class=vpp-badge>"),tr=b("<span class=zippy-title>VPP<span class=vpp-io aria-hidden=true><span class=vpp-io-label>API:</span><span class=vpp-tx>↑</span><span class=vpp-rx>↓"),nr=b("<p class=empty>No VPP information available."),rr=b("<dl class=kv><dt>version</dt><dd></dd><dt>build date</dt><dd></dd><dt>pid</dt><dd></dd><dt>booted</dt><dd></dd><dt>connected</dt><dd>");const sr=e=>{const t=()=>e.info?.boottime_ns?new Date(e.info.boottime_ns/1e6).toISOString():"",n=()=>e.info?.connecttime_ns?new Date(e.info.connecttime_ns/1e6).toISOString():"",r=()=>e.state==="connected"?"connected":"disconnected",[s,l]=A(!1),[o,i]=A(!1);let a,c;const u=()=>{l(!0),a&&clearTimeout(a),a=window.setTimeout(()=>{l(!1),a=void 0},250)},f=()=>{i(!0),c&&clearTimeout(c),c=window.setTimeout(()=>{i(!1),c=void 0},250)};K(()=>{const g=ve();if(!g.length)return;const v=g[g.length-1];if(v.maglevd!==e.name||v.type!=="log")return;const w=v.payload?.msg;w&&(w.startsWith("vpp-api-send")?u():w.startsWith("vpp-api-recv")&&f())}),q(()=>{a&&clearTimeout(a),c&&clearTimeout(c)});const $=(()=>{var g=tr(),v=g.firstChild,w=v.nextSibling,T=w.firstChild,C=T.nextSibling,p=C.nextSibling;return d(g,h(Z,{get value(){return r()},get children(){var m=er();return d(m,r),E(()=>L(m,"data-state",r())),m}}),w),E(m=>{var y=!!s(),S=!!o();return y!==m.e&&C.classList.toggle("lit",m.e=y),S!==m.t&&p.classList.toggle("lit",m.t=S),m},{e:void 0,t:void 0}),g})();return h(Ie,{get id(){return`vpp-${e.name}`},title:$,get children(){return h(N,{get when(){return e.info},get fallback(){return nr()},children:g=>(()=>{var v=rr(),w=v.firstChild,T=w.nextSibling,C=T.nextSibling,p=C.nextSibling,m=p.nextSibling,y=m.nextSibling,S=y.nextSibling,x=S.nextSibling,P=x.nextSibling,j=P.nextSibling;return d(T,()=>g().version),d(p,()=>g().build_date),d(y,()=>g().pid),d(x,t),d(j,n),v})()})}})};var lr=b("<main class=overview>"),ir=b("<p class=empty>No maglevd selected."),or=b('<div class="banner warn"> disconnected'),ar=b("<div class=frontend-list>");const cr=()=>{const e=()=>{const t=Se();return t?Y.byName[t]:void 0};return(()=>{var t=lr();return d(t,h(N,{get when(){return e()},get fallback(){return ir()},children:n=>[h(N,{get when(){return!n().maglevd.connected},get children(){var r=or(),s=r.firstChild;return d(r,()=>n().maglevd.name,s),d(r,(()=>{var l=I(()=>!!n().maglevd.last_error);return()=>l()&&`: ${n().maglevd.last_error}`})(),null),r}}),(()=>{var r=ar();return d(r,h(Q,{get each(){return n().frontends},children:s=>h(Qn,{get snap(){return n()},frontend:s})})),r})(),h(sr,{get name(){return n().maglevd.name},get info(){return n().vpp_info},get state(){return n().vpp_state}})]})),t})()};var ur=b("<ol class=event-tail>"),fr=b("<div class=debug-toolbar><label><input type=checkbox>all maglevds</label><button></button><span class=count> events"),dr=b("<li>");const gr=()=>{const[e,t]=A(!1),[n,r]=A(!1),[s,l]=A([]),o=H(()=>{const c=n()?s():ve();if(e())return c;const u=Se();return u?c.filter(f=>f.maglevd===u):c}),i=()=>{n()?r(!1):(l([...ve()]),r(!0))};let a;return K(()=>{o(),!n()&&a&&(a.scrollTop=a.scrollHeight)}),h(Ie,{id:"debug-events",title:"Event stream",get children(){return[(()=>{var c=ur(),u=a;return typeof u=="function"?ke(u,c):a=c,d(c,h(Q,{get each(){return o()},children:f=>(()=>{var $=dr();return d($,()=>mr(f)),E(g=>{var v=`event-row event-${f.type}`,w=!!hr(f);return v!==g.e&&Ot($,g.e=v),w!==g.t&&$.classList.toggle("event-sync",g.t=w),g},{e:void 0,t:void 0}),$})()})),c})(),(()=>{var c=fr(),u=c.firstChild,f=u.firstChild,$=u.nextSibling,g=$.nextSibling,v=g.firstChild;return f.addEventListener("change",w=>t(w.currentTarget.checked)),$.$$click=i,d($,()=>n()?"resume":"pause"),d(g,()=>o().length,v),E(()=>f.checked=e()),c})()]}})};function hr(e){return e.type!=="log"?!1:e.payload.msg.startsWith("vpp-lb-sync-")}function br(e){if(!e)return"";const t=["vip","protocol","port","address","weight","from","to","encap","src-ip-sticky","flush"],n=[],r=new Set;for(const s of t)s in e&&(n.push(`${s}=${e[s]}`),r.add(s));for(const[s,l]of Object.entries(e))r.has(s)||n.push(`${s}=${l}`);return n.join(" ")}function mr(e){const t=new Date(e.at_unix_ns/1e6).toISOString().substring(11,23),n=`[${e.maglevd}]`;switch(e.type){case"backend":{const r=e.payload;return`${t} ${n} backend ${r.backend}: ${r.transition.from} → ${r.transition.to}`}case"frontend":{const r=e.payload;return`${t} ${n} frontend ${r.frontend}: ${r.transition.from} → ${r.transition.to}`}case"log":{const r=e.payload;if(r.msg.startsWith("vpp-lb-sync-"))return`${t} ${n} ${r.msg} ${br(r.attrs)}`.trimEnd();const s=r.attrs?Object.entries(r.attrs).map(([l,o])=>`${l}=${o}`).join(" "):"";return`${t} ${n} ${r.level} ${r.msg} ${s}`.trimEnd()}case"maglevd-status":return`${t} ${n} maglevd status: ${JSON.stringify(e.payload)}`;default:return`${t} ${n} ${e.type}`}}_e(["click"]);const pr="/view/assets/logo-bimi-Bguc6E_L.svg";var $r=b("<span class=mode-tag>"),wr=b("<a class=admin-toggle>"),vr=b('<div class=app><header class=app-header><div class=brand><a class=brand-logo href=https://ipng.ch/ target=_blank rel=noopener title="IPng Networks"><img alt=IPng></a><a class=brand-name href=https://git.ipng.ch/ipng/vpp-maglev target=_blank rel=noopener title="vpp-maglev on git.ipng.ch"><strong>vpp-maglev'),yr=b("<span class=version> (<!>)"),_r=b('<div class="banner err">'),kr=b("<p class=loading>Loading…");const Sr=()=>{const[e,t]=A(),[n,r]=A();pt(async()=>{try{const[l,o]=await Promise.all([Ze(),jt()]);st(l),r(o),!Se()&&l.length>0&<(l[0].maglevd.name),on()}catch(l){t(`${l}`)}});const s=()=>n()?.admin_enabled===!0;return(()=>{var l=vr(),o=l.firstChild,i=o.firstChild,a=i.firstChild,c=a.firstChild;return a.nextSibling,L(c,"src",pr),d(i,(()=>{var u=I(()=>!!n());return()=>u()&&(()=>{var f=yr(),$=f.firstChild,g=$.nextSibling;return g.nextSibling,d(f,()=>n().version,$),d(f,()=>n().commit,g),E(()=>L(f,"title",`commit ${n().commit} · built ${n().date}`)),f})()})(),null),d(o,h(fn,{}),null),d(o,h(N,{get when(){return U||s()},get children(){var u=$r();return d(u,U?"admin":"view"),u}}),null),d(o,h(N,{get when(){return s()},get children(){var u=wr();return L(u,"href",U?"/view/":"/admin/"),L(u,"title",U?"exit admin mode":"enter admin mode"),d(u,U?"exit admin":"admin…"),u}}),null),d(l,(()=>{var u=I(()=>!!e());return()=>u()&&(()=>{var f=_r();return d(f,e),f})()})(),null),d(l,(()=>{var u=I(()=>!e()&&Object.keys(Y.byName).length===0);return()=>u()&&kr()})(),null),d(l,h(cr,{}),null),d(l,h(N,{when:U,get children(){return h(gr,{})}}),null),l})()},at=document.getElementById("root");if(!at)throw new Error("no #root element");Ct(()=>h(Sr,{}),at);
|