mirror of
https://github.com/pyMC-dev/pyMC_Repeater.git
synced 2026-11-04 12:22:26 +01:00
1 line
7.3 KiB
JavaScript
1 line
7.3 KiB
JavaScript
import{G as e,U as t,o as n}from"./runtime-core.esm-bundler-Bf9AMS9g.js";import{b as r,t as i}from"./api-Dqef3oK3.js";import{t as a}from"./packets-LMZdG6Cm.js";import{t as o}from"./system-DycvJgJD.js";import{c as s}from"./formatters-vw234I-c.js";var c={timeout:`no reply`,send_failed:`could not send`};function l(e){return(e||``).split(`,`).map(e=>e.trim()).map(e=>e.startsWith(`#`)?e.slice(1).trim():e).filter(e=>e.length>0)}function u(e){return e?` (${s(new Date(e*1e3))})`:``}function d(e){if(!e)return{state:`unknown`,names:[],stale:!1,label:`—`,summary:`Not queried`,title:`Scopes not queried yet`};let t=l(e.scopes),n=t.every(e=>e===`*`)?[]:t,r=e.status===`responded`||e.responded_at!=null,i=r&&e.status!==`responded`;if(!r){let t=c[e.status]||e.status;return{state:`failed`,names:[],stale:!1,label:`⚠`,summary:`Query ${t}`,title:`Scope query ${t}${u(e.queried_at)}`}}let a=i?`; last query ${c[e.status]||e.status}${u(e.queried_at)}`:``,o=`Answered${u(e.responded_at??e.queried_at)}`;return n.length===0?{state:`unscoped`,names:n,stale:i,label:`*`,summary:`Unscoped only`,title:`Unscoped traffic only. ${o}${a}`}:{state:`scoped`,names:n,stale:i,label:String(n.length),summary:n.join(`, `),title:`${n.join(`, `)}. ${o}${a}`}}var f={0:`Unknown`,1:`Chat Node`,2:`Repeater`,3:`Room Server`,4:`Hybrid Node`},p=r(`neighbors`,()=>{let t=e({}),r=e({}),a=e([]),o=e(!1),s=e(null),c=e(48),u=n(()=>Object.values(t.value).flat()),d=n(()=>u.value.length);function p(e=10*6e4){return s.value===null?!0:Date.now()-s.value>e}async function m(e=c.value){o.value=!0,c.value=e;let n=Object.entries(f),r=await Promise.allSettled(n.map(async([t,n])=>{try{let r=[],a=0,o=0;for(;o<200;){let t=await i.get(`/adverts_by_contact_type?contact_type=${encodeURIComponent(n)}&hours=${e}&limit=500&offset=${a}`),s=t.success&&Array.isArray(t.data)?t.data:[];if(s.length===0||(r.push(...s),s.length<500))break;a+=500,o+=1}return{typeKey:t,adverts:r}}catch{return{typeKey:t,adverts:[]}}})),a={};for(let e of r)e.status===`fulfilled`&&e.value.adverts.length>0&&(a[e.value.typeKey]=e.value.adverts);t.value=a,s.value=Date.now(),o.value=!1,await h()}async function h(){try{let e=await i.getNeighborScopes(),t=e.success===!0;return r.value=t&&e.data?e.data:{},a.value=t?l(e.served?.scopes):[],t}catch{return r.value={},a.value=[],!1}}let g=n(()=>{let e=new Map;for(let[t,n]of Object.entries(r.value))for(let r of l(n.scopes)){if(r===`*`)continue;let n=r.toLowerCase(),i=e.get(n);i?i.neighbors.includes(t)||i.neighbors.push(t):e.set(n,{name:r,neighbors:[t]})}return[...e.values()].sort((e,t)=>e.name.localeCompare(t.name))});function _(e){let t=e.trim().toLowerCase();return a.value.some(e=>e.toLowerCase()===t)}function v(e,t){r.value={...r.value,[e.toLowerCase()]:t}}function y(){t.value={},r.value={},a.value=[],o.value=!1,s.value=null,c.value=48}return{advertsByType:t,scopesByPubkey:r,servedScopes:a,discoveredScopes:g,isLoading:o,lastFetched:s,currentHours:c,allAdverts:u,totalCount:d,isStale:p,fetchAll:m,fetchScopes:h,servesScope:_,setScope:v,reset:y}}),m={stats:3e4,packetStats:6e4,noiseFloor:3e5,recentPackets:3e4,sparklines:3e5,advertTier:6e4,neighbors:10*6e4,radioConfig:2**53-1},h=r(`dataService`,()=>{let n=o(),r=a(),s=p(),c=e({currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}),l=e(!1),u=e(null),d=t({stats:`pending`,packetStats:`pending`,noiseFloor:`pending`,recentPackets:`pending`,sparklines:`pending`,advertTier:`pending`,neighbors:`pending`,radioConfig:`pending`}),f=new Map,h=new Map,g=[],_=!1,v=null;async function y(e,t=2){for(let n=0;n<t;n++)try{return await e()}catch(e){if(n===t-1)throw e;await new Promise(e=>setTimeout(e,500*2**n))}throw Error(`unreachable`)}async function b(){try{let e=(await i.get(`/advert_rate_limit_stats`))?.data;c.value={currentTier:typeof e?.adaptive?.current_tier==`string`?e.adaptive.current_tier:`unknown`,advertsAllowed:e?.stats?.adverts_allowed||0,advertsDropped:e?.stats?.adverts_dropped||0,activePenalties:Object.keys(e?.active_penalties||{}).length},f.set(`advertTier`,Date.now())}catch{}}function x(e){f.set(e,Date.now())}function S(e){c.value={currentTier:typeof e.current_tier==`string`?e.current_tier:`unknown`,advertsAllowed:e.adverts_allowed??0,advertsDropped:e.adverts_dropped??0,activePenalties:e.active_penalties??0},f.set(`advertTier`,Date.now())}async function C(e){if(e===`neighbors`){if(!s.isStale())return}else{let t=f.get(e);if(t!==void 0&&Date.now()-t<m[e])return}let t=h.get(e);if(t)return t;let i;switch(e){case`stats`:i=n.fetchStats().then(()=>{f.set(`stats`,Date.now()),f.set(`radioConfig`,Date.now())});break;case`radioConfig`:i=C(`stats`).then(()=>{f.set(`radioConfig`,Date.now())});break;case`packetStats`:i=r.fetchPacketStats({hours:24}).then(()=>{f.set(`packetStats`,Date.now())});break;case`noiseFloor`:i=r.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{f.set(`noiseFloor`,Date.now())});break;case`recentPackets`:i=r.fetchRecentPackets({limit:100}).then(()=>{f.set(`recentPackets`,Date.now())});break;case`sparklines`:i=r.initializeSparklineHistory().then(()=>{f.set(`sparklines`,Date.now())});break;case`advertTier`:i=b();break;case`neighbors`:i=s.fetchAll(s.currentHours).then(()=>{});break}return h.set(e,i),i.finally(()=>h.delete(e)),i}async function w(e,t){d[e]=`loading`;try{await t(),d[e]=`done`}catch{d[e]=`error`}}async function T(e,t){let n=[...e],r=0;return new Promise(e=>{function i(){if(n.length===0&&r===0){e();return}for(;r<t&&n.length>0;)r++,n.shift()().finally(()=>{r--,i()})}i()})}async function E(){if(!_){_=!0,l.value=!0,d.stats=`loading`,u.value=`requesting`;try{await y(()=>n.fetchStats({onFirstByte:()=>{u.value=`reading`}})),f.set(`stats`,Date.now()),f.set(`radioConfig`,Date.now()),d.stats=`done`}catch{d.stats=`error`,console.error(`[DataService] Failed to fetch stats after retries`)}finally{u.value=null}await T([()=>w(`packetStats`,()=>r.fetchPacketStats({hours:24}).then(()=>{f.set(`packetStats`,Date.now())})),()=>w(`noiseFloor`,()=>r.fetchNoiseFloorHistory({hours:1,limit:500}).then(()=>{f.set(`noiseFloor`,Date.now())})),()=>w(`recentPackets`,()=>r.fetchRecentPackets({limit:100}).then(()=>{f.set(`recentPackets`,Date.now())})),()=>w(`sparklines`,()=>r.initializeSparklineHistory().then(()=>{f.set(`sparklines`,Date.now())})),()=>w(`advertTier`,()=>b()),()=>w(`neighbors`,()=>s.fetchAll(s.currentHours).then(()=>{}))],3),l.value=!1,D()}}function D(){M(),g.push(window.setInterval(()=>{let e=n.lastUpdated?.getTime()??0;Date.now()-e>25e3&&C(`stats`),C(`advertTier`),C(`packetStats`),C(`noiseFloor`),C(`sparklines`)},15e3))}function O(){v=Math.floor(Date.now()/1e3)}async function k(e){try{let t=await i.get(`/filtered_packets`,{start_timestamp:e,limit:1e3});t.success&&t.data&&(r.mergeRecentPackets(t.data),f.set(`recentPackets`,Date.now()))}catch{}}async function A(){await new Promise(e=>setTimeout(e,3e3));let e=Math.floor(Date.now()/1e3)-600,t=v===null?e:Math.max(v,e);v=null,j(`noiseFloor`),await Promise.allSettled([C(`stats`),C(`packetStats`),C(`noiseFloor`),k(t)])}function j(e){f.delete(e)}function M(){for(let e of g)clearInterval(e);g=[]}function N(){M(),_=!1,f.clear(),h.clear(),l.value=!1,Object.keys(d).forEach(e=>{d[e]=`pending`}),c.value={currentTier:`unknown`,advertsAllowed:0,advertsDropped:0,activePenalties:0}}return{advertTier:c,isBootstrapping:l,statsSubStatus:u,loadProgress:d,bootstrap:E,ensure:C,noteWsDelivery:x,applyAdvertTierBroadcast:S,invalidate:j,noteDisconnect:O,onReconnect:A,stopPolling:M,reset:N}});export{d as i,f as n,p as r,h as t}; |