index-a6d1dde3.js 28 KB

1234
  1. import{bd as Oe,be as We,d as ce,F as Ke,c as T,o as we,i as Ze,bf as Ge,n as x,p as Y,m as qe,bg as Qe,bh as ke,bi as Ye,bj as ve,Z as k,$ as E,a0 as A,aW as N,a1 as H,a2 as Me,aZ as se,T as v,a9 as Q,a7 as p,aC as Xe,Q as Je,f as G,e as et,bk as O,aK as Ae,h as ye,b6 as tt,C as he,j as xe,b4 as ae,bl as ge,a5 as q,a6 as I,aQ as le,b9 as st,bm as _e,bn as rt,ay as ot,bc as be,bo as nt,bp as at}from"./index-a8341fa1.js";import"./dayjs-919e6097.js";import{u as lt}from"./index-7b240cde.js";import{P as ut,u as ct,_ as it,a as dt,b as ft}from"./vue-flow-background-c4c69975.js";import{s as pt,c as mt,S as U,a as vt}from"./Statistic-b3feae57.js";import{t as yt}from"./toInteger-461bf1e0.js";function ht(i,s,y){i=Oe(i),s=yt(s);var _=s?pt(i):0;return s&&_<s?mt(s-_,y)+i:i}var gt=[["Y",1e3*60*60*24*365],["M",1e3*60*60*24*30],["D",1e3*60*60*24],["H",1e3*60*60],["m",1e3*60],["s",1e3],["S",1]];function _t(i,s){var y=i,_=/\[[^\]]*]/g,b=(s.match(_)||[]).map(function(D){return D.slice(1,-1)}),$=s.replace(_,"[]"),z=gt.reduce(function(D,l){var g=We(l,2),L=g[0],f=g[1];if(D.indexOf(L)!==-1){var w=Math.floor(y/f);return y-=w*f,D.replace(new RegExp("".concat(L,"+"),"g"),function(R){var P=R.length;return ht(w.toString(),P,"0")})}return D},$),B=0;return z.replace(_,function(){var D=b[B];return B+=1,D})}function bt(i,s){var y=s.format,_=y===void 0?"":y,b=new Date(i).getTime(),$=Date.now(),z=Math.max(b-$,0);return _t(z,_)}var $t=1e3/30;function $e(i){return new Date(i).getTime()}var wt=function(){return Y(Y({},vt()),{},{value:[Number,String,Object],format:String,onFinish:Function,onChange:Function})};const St=ce({compatConfig:{MODE:3},name:"AStatisticCountdown",props:Ke(wt(),{format:"HH:mm:ss"}),setup:function(s,y){var _=y.emit,b=y.slots,$=T(),z=T(),B=function(){var w=s.value,R=$e(w);R>=Date.now()?D():l()},D=function(){if(!$.value){var w=$e(s.value);$.value=setInterval(function(){z.value.$forceUpdate(),w>Date.now()&&_("change",w-Date.now()),B()},$t)}},l=function(){var w=s.value;if($.value){clearInterval($.value),$.value=void 0;var R=$e(w);R<Date.now()&&_("finish")}},g=function(w){var R=w.value,P=w.config,X=s.format;return bt(R,Y(Y({},P),{},{format:X}))},L=function(w){return w};return we(function(){B()}),Ze(function(){B()}),Ge(function(){l()}),function(){var f=s.value;return x(U,Y({ref:z},Y(Y({},qe(s,["onFinish","onChange"])),{},{value:f,valueRender:L,formatter:g})),b)}}});U.Countdown=St;U.install=function(i){return i.component(U.name,U),i.component(U.Countdown.name,U.Countdown),i};U.Countdown;const re=Qe({requestOptions:{apiUrl:()=>ke("cluster")}});function Ct(){return re.get({url:"/roles"})}function At(){return re.get({url:"/servers"})}function xt(){return re.get({url:"/summaries"})}function It(){return re.get({url:"/status/local"})}function Ie(i){return re.get({url:`/servers/${i}/streams`})}const kt=Ye("cluster",()=>{const i=T([]),s=T({version:0,updated_at:0,servers:[],owner:""}),y=T([]),_=T(null),b=async()=>{try{const l=await Ct(),g=l.data||l;i.value=g,i.value}catch(l){console.error(`getRoles-err: ${l}`)}},$=async()=>{try{const l=await At(),g=l.data||l;g&&g.updatedAt&&(g.updated_at=g.updatedAt,delete g.updatedAt),s.value=g,s.value}catch(l){console.error(`getServerList-err: ${l}`)}},z=async()=>{try{const l=await xt();Array.isArray(l);let g=[];Array.isArray(l)?g=l:l&&typeof l=="object"&&("data"in l&&Array.isArray(l.data)||"code"in l&&l.code===0&&"data"in l&&Array.isArray(l.data)?g=l.data:console.warn("Unexpected response format:",l));const L=g.map(f=>{if((f.serverId||f.server_id)&&f.summary){const w=f.serverId||f.server_id,R=f.summary,P=Object.assign({},R,{serverId:w});return P.address||console.warn("Warning: address is missing after transformation",{serverId:w,summaryKeys:Object.keys(R),transformedKeys:Object.keys(P),summaryAddress:R.address,transformedAddress:P.address}),P}return f});y.value=L,y.value,y.value.length,y.value.forEach((f,w)=>{`${w}`,f.serverId,f.address,f.cpuUsage,f.memory?.usage,f.memory,f.address,f.cpuUsage,f.memory})}catch(l){console.error(`getServerSummaries-err: ${l}`),y.value=[]}},B=async()=>{try{const l=await It();let g=null;l&&typeof l=="object"&&("data"in l&&l.data||"code"in l&&l.code===0&&"data"in l&&l.data?g=l.data:g=l),g&&(_.value=g)}catch(l){console.error(`getLocalClusterStatus-err: ${l}`),_.value=null}};return{roles:i,serverList:s,serverSummaries:y,localStatus:_,loadAll:async()=>{await Promise.all([b(),$(),z(),B()])},loadRoles:b,loadServerList:$,loadServerSummaries:z,loadLocalStatus:B}}),Mt={name:"ControlButton",compatConfig:{MODE:3}},Rt=(i,s)=>{const y=i.__vccOpts||i;for(const[_,b]of s)y[_]=b;return y},zt={class:"vue-flow__controls-button"};function Dt(i,s,y,_,b,$){return k(),H("button",zt,[N(i.$slots,"default")])}const ue=Rt(Mt,[["render",Dt]]),Tt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 32"},Bt=p("path",{d:"M32 18.133H18.133V32h-4.266V18.133H0v-4.266h13.867V0h4.266v13.867H32z"},null,-1),Ft=[Bt];function Lt(i,s){return k(),H("svg",Tt,Ft)}const Pt={render:Lt},Nt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 5"},Ht=p("path",{d:"M0 0h32v4.2H0z"},null,-1),Ut=[Ht];function Vt(i,s){return k(),H("svg",Nt,Ut)}const jt={render:Vt},Et={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 32 30"},Ot=p("path",{d:"M3.692 4.63c0-.53.4-.938.939-.938h5.215V0H4.708C2.13 0 0 2.054 0 4.63v5.216h3.692V4.631zM27.354 0h-5.2v3.692h5.17c.53 0 .984.4.984.939v5.215H32V4.631A4.624 4.624 0 0 0 27.354 0zm.954 24.83c0 .532-.4.94-.939.94h-5.215v3.768h5.215c2.577 0 4.631-2.13 4.631-4.707v-5.139h-3.692v5.139zm-23.677.94a.919.919 0 0 1-.939-.94v-5.138H0v5.139c0 2.577 2.13 4.707 4.708 4.707h5.138V25.77H4.631z"},null,-1),Wt=[Ot];function Kt(i,s){return k(),H("svg",Et,Wt)}const Zt={render:Kt},Gt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32"},qt=p("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0 8 0 4.571 3.429 4.571 7.619v3.048H3.048A3.056 3.056 0 0 0 0 13.714v15.238A3.056 3.056 0 0 0 3.048 32h18.285a3.056 3.056 0 0 0 3.048-3.048V13.714a3.056 3.056 0 0 0-3.048-3.047zM12.19 24.533a3.056 3.056 0 0 1-3.047-3.047 3.056 3.056 0 0 1 3.047-3.048 3.056 3.056 0 0 1 3.048 3.048 3.056 3.056 0 0 1-3.048 3.047zm4.724-13.866H7.467V7.619c0-2.59 2.133-4.724 4.723-4.724 2.591 0 4.724 2.133 4.724 4.724v3.048z"},null,-1),Qt=[qt];function Yt(i,s){return k(),H("svg",Gt,Qt)}const Xt={render:Yt},Jt={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 25 32"},es=p("path",{d:"M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 0 0 0 13.714v15.238A3.056 3.056 0 0 0 3.048 32h18.285a3.056 3.056 0 0 0 3.048-3.048V13.714a3.056 3.056 0 0 0-3.048-3.047zM12.19 24.533a3.056 3.056 0 0 1-3.047-3.047 3.056 3.056 0 0 1 3.047-3.048 3.056 3.056 0 0 1 3.048 3.048 3.056 3.056 0 0 1-3.048 3.047z"},null,-1),ts=[es];function ss(i,s){return k(),H("svg",Jt,ts)}const rs={render:ss},os={name:"Controls",compatConfig:{MODE:3}},ns=ce({...os,props:{showZoom:{type:Boolean,default:!0},showFitView:{type:Boolean,default:!0},showInteractive:{type:Boolean,default:!0},fitViewParams:{},position:{default:()=>ut.BottomLeft}},emits:["zoomIn","zoomOut","fitView","interactionChange"],setup(i,{emit:s}){const{nodesDraggable:y,nodesConnectable:_,elementsSelectable:b,setInteractive:$,zoomIn:z,zoomOut:B,fitView:D,viewport:l,minZoom:g,maxZoom:L}=ct(),f=ve(()=>y.value||_.value||b.value),w=ve(()=>l.value.zoom<=g.value),R=ve(()=>l.value.zoom>=L.value);function P(){z(),s("zoomIn")}function X(){B(),s("zoomOut")}function ie(){D(i.fitViewParams),s("fitView")}function oe(){$(!f.value),s("interactionChange",!f.value)}return(M,j)=>(k(),E(v(it),{class:"vue-flow__controls",position:M.position},{default:A(()=>[N(M.$slots,"top"),M.showZoom?(k(),H(Me,{key:0},[N(M.$slots,"control-zoom-in",{},()=>[x(ue,{class:"vue-flow__controls-zoomin",disabled:R.value,onClick:P},{default:A(()=>[N(M.$slots,"icon-zoom-in",{},()=>[(k(),E(se(v(Pt))))])]),_:3},8,["disabled"])]),N(M.$slots,"control-zoom-out",{},()=>[x(ue,{class:"vue-flow__controls-zoomout",disabled:w.value,onClick:X},{default:A(()=>[N(M.$slots,"icon-zoom-out",{},()=>[(k(),E(se(v(jt))))])]),_:3},8,["disabled"])])],64)):Q("",!0),M.showFitView?N(M.$slots,"control-fit-view",{key:1},()=>[x(ue,{class:"vue-flow__controls-fitview",onClick:ie},{default:A(()=>[N(M.$slots,"icon-fit-view",{},()=>[(k(),E(se(v(Zt))))])]),_:3})]):Q("",!0),M.showInteractive?N(M.$slots,"control-interactive",{key:2},()=>[M.showInteractive?(k(),E(ue,{key:0,class:"vue-flow__controls-interactive",onClick:oe},{default:A(()=>[f.value?N(M.$slots,"icon-unlock",{key:0},()=>[(k(),E(se(v(rs))))]):Q("",!0),f.value?Q("",!0):N(M.$slots,"icon-lock",{key:1},()=>[(k(),E(se(v(Xt))))])]),_:3})):Q("",!0)]):Q("",!0),N(M.$slots,"default")]),_:3},8,["position"]))}});const as={class:"flex"},ls={class:"mt-4 mb-2 flex justify-end"},us={key:0,class:"mt-4",style:{height:"calc(100vh - 250px)"}},cs={class:"flex flex-col items-center leading-tight"},is={class:"text-xs text-gray-500"},ds={class:"flex items-center justify-center gap-2"},fs={style:{"white-space":"pre-wrap",margin:"0","font-family":"inherit"}},ps={key:1,class:"mt-4 border rounded bg-white",style:{height:"calc(100vh - 250px)"}},ms=["onDblclick"],vs={class:"font-bold border-b pb-1 mb-1 flex justify-between items-center"},ys=["title"],hs=["title"],gs={class:"flex-1 space-y-1"},_s={class:"flex items-center justify-between"},bs={key:0,class:"mt-2 text-xs space-y-1 text-gray-700"},$s={class:"flex justify-between"},ws={class:"flex justify-between"},Ss={class:"flex justify-between"},Cs={class:"pt-1 border-t mt-1 flex justify-between"},As={class:"font-bold"},xs={key:1,class:"mt-2 text-xs text-gray-400 text-center py-2"},Ts=ce({__name:"index",setup(i){const{t:s}=Xe(),y=kt(),{roles:_,serverList:b,serverSummaries:$,localStatus:z}=Je(y),B=G(()=>{const e=ke("cluster");let r="";try{r=new URL(e).host.split(":")[1]}catch{const C="/media";try{const a=new URL(C);r=a.port||a.host.split(":")[1]}catch{console.warn("Failed to parse host from env:",C)}}r||(r=location.host.split(":")[1]||"");const t={18081:"50052",18082:"50053",18083:"50054"},n=r&&t[r]?t[r]:r?String(parseInt(r)-13029):"",u=b.value?.servers||[];for(const c of u)if(c.address){const a=c.address.replace(/^https?:\/\//,"").split("/")[0].split(":")[1];if(c.id,a&&n&&a===n)return c.id,c.id}return b.value?.owner||""}),D=T(!1),l=G(()=>{const e=b.value?.servers||[],r=Array.isArray($.value)?$.value:[],t=new Map;return r.forEach(u=>{u.serverId&&t.set(u.serverId,u),u.address&&t.set(u.address,u)}),[...e].sort((u,o)=>u.status==="online"&&o.status!=="online"?-1:u.status!=="online"&&o.status==="online"?1:u.id.localeCompare(o.id)).map(u=>{let o=t.get(u.id);if(o||(o=t.get(u.address)),!o){const c=u.address.replace(/^https?:\/\//,"").split("/")[0];for(const[C,a]of t.entries())if(typeof C=="string"&&C.replace(/^https?:\/\//,"").split("/")[0]===c){o=a;break}}return{...u,_summary:o||null}})}),g=G(()=>{const e=Array.isArray($.value)?$.value:[],r=new Map;return e.forEach(t=>{t.serverId&&r.set(t.serverId,t),t.address&&r.set(t.address,t)}),r}),L=e=>{const r=b.value?.servers?.find(u=>u.id===e);if(!r)return null;const t=g.value;let n=t.get(e);if(n||(n=t.get(r.address)),!n){const u=r.address.replace(/^https?:\/\//,"").split("/")[0];for(const[o,c]of t.entries())if(typeof o=="string"&&o.replace(/^https?:\/\//,"").split("/")[0]===u){n=c;break}}return n||null},f=e=>e&&e.replace(/^https?:\/\//,"").split("/")[0]||"",w=e=>{if(!e&&e!==0)return 0;if(typeof e=="number")return e;if(typeof e=="string"){const r=e.trim().match(/^(-?\d+)(?:\.(\d+))?s$/);if(r){const n=parseInt(r[1],10),u=r[2]?parseFloat(`0.${r[2]}`):0;return(n+u)*1e3}const t=Number(e);return Number.isFinite(t)?t:0}if(typeof e=="object"){const r=e.seconds??e.Seconds??0,t=e.nanos??e.Nanos??0,n=typeof r=="string"?parseInt(r,10):Number(r),u=typeof t=="string"?parseInt(t,10):Number(t);return n*1e3+u/1e6}return 0},R=e=>!e||e<=0?"-":e>=1e3?`${(e/1e3).toFixed(2)} s`:`${Math.round(e)} ms`,P=(e,r)=>{if(!r||r==="connected")return e;const n={connecting:s("routes.cluster.连接中"),disconnected:s("routes.cluster.已断开")}[r]||r;return`${e}(${n})`},X=e=>{if(!e)return null;const r=e.serverId||e.server_id||e.clientId||e.client_id||"",t=e.address||"",n=e.state||"",u=w(e.rtt),o=e.source||e.Source||"";return{serverId:r,address:t,state:n,rttMs:u,source:o}},ie=G(()=>{const e=new Map,r=new Map,t=z.value,n=t&&t.upstreams!==void 0?t:t&&t.data?t.data:null;if(!n)return{byId:e,byAddress:r,localId:""};const u=n.serverId||n.server_id||"",o=(m,h)=>{if(!m)return{relation:h.relation,rttMs:h.rttMs,state:h.state,sources:new Set(h.sources)};const d=new Set([...m.sources,...h.sources]);let S=m.relation;d.has("upstream")&&d.has("downstream")?S="双向":h.relation!==m.relation&&(S=h.relation);const F=m.rttMs>0&&h.rttMs>0?Math.min(m.rttMs,h.rttMs):m.rttMs>0?m.rttMs:h.rttMs,K=h.state||m.state;return{relation:S,rttMs:F,state:K,sources:d}},c=(m,h)=>{const d=X(m);if(!d)return;const{serverId:S,address:F,state:K,rttMs:Z,source:ne}=d,ee={relation:h,rttMs:Z,state:K,sources:new Set([ne||h])};if(S){const te=o(e.get(S),ee);e.set(S,te)}if(F){const te=f(F);if(te){const Ee=o(r.get(te),ee);r.set(te,Ee)}}};return(Array.isArray(n.upstreams)?n.upstreams:[]).forEach(m=>c(m,s("routes.cluster.上游"))),(Array.isArray(n.downstreams)?n.downstreams:[]).forEach(m=>c(m,s("routes.cluster.下游"))),{byId:e,byAddress:r,localId:u}}),oe=(e,r)=>{const t=ie.value;if(e&&e===t.localId)return{relation:s("routes.cluster.当前节点"),rtt:"-"};let n=e?t.byId.get(e):void 0;return!n&&r&&(n=t.byAddress.get(f(r))),n?{relation:P(n.relation,n.state),rtt:R(n.rttMs)}:{relation:s("routes.cluster.未知"),rtt:"-"}},M={B:1,KB:1024,MB:1024**2,GB:1024**3},j=(e,r="B")=>{let t=typeof e=="string"?parseFloat(e):Number(e??0);if(isNaN(t)||t<0)return"0 B";const n=M[r]??1;let u=t*n;const o=["B","KB","MB","GB","TB"];let c=0;for(;u>=1024&&c<o.length-1;)u/=1024,c++;return`${u.toFixed(1)} ${o[c]}`},Se=e=>{if(!e)return s("routes.cluster.未知");const r=Date.now();let t;typeof e=="string"?t=new Date(e).getTime():t=e<1e12?e*1e3:e;const n=r-t;if(n<0)return s("routes.cluster.刚刚");const u=Math.floor(n/1e3),o=Math.floor(u/60),c=Math.floor(o/60),C=Math.floor(c/24);return u<60?s("routes.cluster.刚刚"):o<60?`${o}${s("routes.cluster.分钟前")}`:c<24?`${c}${s("routes.cluster.小时前")}`:C<30?`${C}${s("routes.cluster.天前")}`:new Date(t).toLocaleDateString("zh-CN",{year:"numeric",month:"short",day:"numeric"})},Re=e=>{const r=L(e);if(!r)return s("routes.cluster.暂无数据");const t=[`${s("routes.cluster.地址")}: ${r.address||"N/A"}`,`${s("routes.cluster.流数量")}: ${r.streamCount||0}`,`${s("routes.cluster.订阅数量")}: ${r.subscribeCount||0}`,`${s("routes.cluster.拉流数量")}: ${r.pullCount||0}`,`${s("routes.cluster.推流数量")}: ${r.pushCount||0}`,`${s("routes.cluster.录制数量")}: ${r.recordCount||0}`,`${s("routes.cluster.转换数量")}: ${r.transformCount||0}`,`${s("routes.cluster.CPU使用率")}: ${(r.cpuUsage||0).toFixed(1)}%`,`${s("routes.cluster.内存使用")}: ${j(r.memory?.used||0,"MB")} / ${j(r.memory?.total||0,"MB")} (${(r.memory?.usage||0).toFixed(1)}%)`,`${s("routes.cluster.硬盘使用")}: ${j(r.hardDisk?.used||0,"GB")} / ${j(r.hardDisk?.total||0,"GB")} (${(r.hardDisk?.usage||0).toFixed(1)}%)`];if(r.netWork&&r.netWork.length>0){const n=r.netWork.filter(u=>(u.receiveSpeed||0)>0||(u.sentSpeed||0)>0);n.length>0&&(t.push(""),t.push(`${s("routes.cluster.网络信息")}:`),n.forEach(u=>{u.name?t.push(` ${u.name}: ${s("routes.cluster.接收")} ${j(u.receiveSpeed||0)}/s, ${s("routes.cluster.发送")} ${j(u.sentSpeed||0)}/s`):t.push(` ${s("routes.cluster.接收")}: ${j(u.receiveSpeed||0)}/s, ${s("routes.cluster.发送")}: ${j(u.sentSpeed||0)}/s`)}))}return t.join(`
  2. `)},Ce=T(!1),de=T(""),W=T([]),ze=et(),De=G(()=>[{title:s("routes.cluster.流路径"),dataIndex:"stream_path",key:"stream_path",ellipsis:!0},{title:s("routes.cluster.状态"),dataIndex:"status",key:"status",width:100,align:"center",customRender:({text:e})=>O(_e,{color:e==="online"?"success":"default"},()=>s(e==="online"?"routes.cluster.在线":"routes.cluster.离线"))},{title:s("routes.cluster.源节点"),dataIndex:"source_node_id",key:"source_node_id",width:180,ellipsis:!0,customRender:({record:e})=>e.source_node_id?O(Ae,{title:e.source_node_addr?`${s("routes.cluster.地址")}: ${e.source_node_addr}`:s("routes.cluster.暂无数据")},{default:()=>e.source_node_id}):"-"},{title:s("routes.cluster.协议类型"),key:"protocol",width:150,align:"center",customRender:({record:e})=>{const r=e.protocol||"-",t=e.publish_type||"-";return`${r} / ${t}`}},{title:s("routes.cluster.订阅数"),dataIndex:"subscribe_count",key:"subscribe_count",width:110,align:"center",customRender:({record:e})=>typeof e.subscribe_count=="number"?e.subscribe_count:0},{title:s("routes.cluster.Relay数"),dataIndex:"relay_count",key:"relay_count",width:110,align:"center",customRender:({record:e})=>typeof e.relay_count=="number"?e.relay_count:0},{title:s("routes.cluster.更新时间"),dataIndex:"updated_at",key:"updated_at",width:180,align:"center",customRender:({record:e})=>Se(e.updated_at)}]),Te=ce({name:"StreamsModalContent",props:{serverId:{type:String,required:!0}},setup(e){const r=T([]),t=T(!1);let n=null;const u=async()=>{t.value=!0;try{const o=await Ie(e.serverId);let c=[];if(o&&typeof o=="object"&&(Array.isArray(o)?c=o:o.code===0&&o.data?c=Array.isArray(o.data)?o.data:[]:o.data&&Array.isArray(o.data)&&(c=o.data)),c.length>0){const C=a=>{if(typeof a=="number"&&Number.isFinite(a))return a;if(Array.isArray(a))return a.length;if(typeof a=="string"){const m=Number(a);return Number.isFinite(m)?m:void 0}};r.value=c.map((a,m)=>{let h=0;const d=a.updated_at||a.updatedAt;d&&(typeof d=="string"?h=new Date(d).getTime():typeof d=="number"?h=d<1e12?d*1e3:d:d.seconds!==void 0&&(h=d.seconds*1e3+(d.nanos||0)/1e6));const S=a.stream_path||a.streamPath||"",F=a.server_id||a.serverId||"",K=C(a.subscribe_count??a.subscribeCount??a.subscribe_nodes??a.subscribeNodes)??0,Z=C(a.relay_count??a.relayCount??a.relay_nodes??a.relayNodes)??0;return{key:`${F||"server"}-${S||m}`,stream_path:S,server_id:F,server_addr:a.server_addr||a.serverAddr||"",updated_at:h,status:a.status||"offline",source_node_id:a.source_node_id||a.sourceNodeId||F,source_node_addr:a.source_node_addr||a.sourceNodeAddr||a.server_addr||"",protocol:a.protocol||a.Protocol||"",publish_type:a.publish_type||a.publishType||"",subscribe_count:K,relay_count:Z}})}else r.value=[]}catch(o){console.error("Error refreshing streams:",o),be.error(o?.response?.data?.message||o?.message||s("routes.cluster.刷新流列表失败"))}finally{t.value=!1}};return we(()=>{u(),n=setInterval(()=>{u()},5e3)}),xe(()=>{n&&(clearInterval(n),n=null)}),()=>O("div",{},[O("div",{class:"mb-2 flex justify-between items-center"},[O("span",{class:"text-sm text-gray-500"},`${s("routes.cluster.服务器地址")}: ${de.value||"-"}`),O(le,{size:"small",loading:t.value,onClick:u},()=>s("routes.cluster.刷新"))]),O(at,{columns:De.value,dataSource:r.value,loading:t.value,pagination:{pageSize:20,showSizeChanger:!0,showTotal:o=>s("routes.cluster.共条",{total:o})},rowKey:"key",size:"small"})])}}),Be=e=>{nt({content:O(Te,{serverId:e}),modalConfig:{title:s("routes.cluster.服务器流列表",{serverId:e}),width:"900px",footer:null,maskClosable:!0,appContext:ze?.appContext}})},fe=async e=>{const r=b.value?.servers?.find(t=>t.id===e);de.value=r?.address||"",de.value,Ce.value=!0,W.value=[];try{await y.loadServerSummaries();const t=await Ie(e);t?.code,t?.data;let n=[];if(t&&typeof t=="object"&&(Array.isArray(t)?n=t:t.code===0&&t.data?n=Array.isArray(t.data)?t.data:[]:t.data&&Array.isArray(t.data)&&(n=t.data)),n.length>0){const u=o=>{if(typeof o=="number"&&Number.isFinite(o))return o;if(Array.isArray(o))return o.length;if(typeof o=="string"){const c=Number(o);return Number.isFinite(c)?c:void 0}};W.value=n.map((o,c)=>{let C=0;const a=o.updated_at||o.updatedAt;a&&(typeof a=="string"?C=new Date(a).getTime():typeof a=="number"?C=a<1e12?a*1e3:a:a.seconds!==void 0&&(C=a.seconds*1e3+(a.nanos||0)/1e6));const m=o.stream_path||o.streamPath||"",h=o.server_id||o.serverId||"",d=u(o.subscribe_count??o.subscribeCount??o.subscribe_nodes??o.subscribeNodes)??0,S=u(o.relay_count??o.relayCount??o.relay_nodes??o.relayNodes)??0,F={key:`${h||"server"}-${m||c}`,stream_path:m,server_id:h,server_addr:o.server_addr||o.serverAddr||"",updated_at:C,status:o.status||"offline",source_node_id:o.source_node_id||o.sourceNodeId||h,source_node_addr:o.source_node_addr||o.sourceNodeAddr||o.server_addr||"",protocol:o.protocol||o.Protocol||"",publish_type:o.publish_type||o.publishType||"",subscribe_count:d,relay_count:S};return F}),W.value,W.value,W.value.length}else console.warn("No streams found for serverId:",e),W.value=[],t?.code!==0&&t?.message&&be.error(t.message);Be(e)}catch(t){console.error("Error fetching streams:",t),console.error("Error details:",{message:t?.message,response:t?.response,data:t?.response?.data}),be.error(t?.response?.data?.message||t?.message||s("routes.cluster.获取流列表失败")),W.value=[]}finally{Ce.value=!1}},Fe=G(()=>(b.value?.servers||[]).filter(t=>t.status==="online").length),Le=G(()=>{const e=b.value?.servers||[];return e.length,e.length}),V=lt(),J=T("list"),pe=T([]),me=T([]),Pe=()=>{const e=l.value,r=B.value,t=e.length,n=Math.ceil(Math.sqrt(t))||1,u=300,o=200,c=[],C=[],a=new Map;e.forEach((d,S)=>{const F=S%n,K=Math.floor(S/n),Z=d.id===r,ne=d.status==="online",ee={id:d.id,type:"default",position:{x:F*u,y:K*o},data:{...d,isCurrent:Z},style:{background:Z?"#e6f7ff":ne?"#f6ffed":"#fff1f0",border:`1px solid ${Z?"#1890ff":ne?"#52c41a":"#ff4d4f"}`,borderRadius:"8px",padding:"10px",width:"240px",fontSize:"12px",textAlign:"left",boxShadow:"0 2px 4px rgba(0,0,0,0.1)"},label:`${d.id}
  3. ${d.address||""}`};c.push(ee),a.set(d.id,ee)});const m=z.value,h=m&&m.upstreams!==void 0?m:m&&m.data?m.data:null;h&&r&&(a.get(r),Array.isArray(h.upstreams)&&h.upstreams.forEach(d=>{const S=d.serverId||d.server_id;S&&a.has(S)&&C.push({id:`edge-${S}-${r}`,source:S,target:r,label:`${s("routes.cluster.上游")} (${R(w(d.rtt))})`,animated:!0,style:{stroke:"#52c41a",strokeWidth:2},labelStyle:{fill:"#52c41a",fontWeight:700}})}),Array.isArray(h.downstreams)&&h.downstreams.forEach(d=>{const S=d.serverId||d.server_id;S&&a.has(S)&&C.push({id:`edge-${r}-${S}`,source:r,target:S,label:`${s("routes.cluster.下游")} (${R(w(d.rtt))})`,animated:!0,style:{stroke:"#1890ff",strokeWidth:2},labelStyle:{fill:"#1890ff",fontWeight:700}})})),pe.value=c,me.value=C};ye([b,z,J],()=>{J.value==="topology"&&Pe()});const Ne=T(0),He=async()=>{D.value=!0;try{await y.loadAll(),_.value,b.value,$.value,Array.isArray(_.value)&&_.value.length,b.value&&Object.keys(b.value),Array.isArray($.value)&&$.value.length}finally{D.value=!1}},{pause:Ue,resume:Ve}=tt(async()=>{await y.loadServerSummaries(),await y.loadLocalStatus(),Array.isArray($.value)&&$.value.length,he(()=>{V.tableRef&&V.tableRef.reloadData&&V.tableRef.reloadData(l.value)})});ye(()=>$.value,()=>{he(()=>{V.tableRef&&V.tableRef.reloadData&&V.tableRef.reloadData(l.value)})},{deep:!0}),ye(()=>z.value,()=>{he(()=>{V.tableRef&&V.tableRef.reloadData&&V.tableRef.reloadData(l.value)})},{deep:!0}),we(async()=>{await He(),Ve()}),xe(()=>{Ue()});const je={height:"100%",rowConfig:{keyField:"id",useKey:!0},columnConfig:{useKey:!0},columns:[{field:"id",title:"ID",minWidth:"100px",showOverflow:"tooltip",formatter:({cellValue:e})=>e===B.value?`${e} (${s("routes.cluster.当前节点")})`:e,cellRender:{name:"VxeTag",props:({row:e})=>e.id===B.value?{type:"primary",content:`${e.id} (${s("routes.cluster.当前节点")})`}:{content:e.id}}},{field:"address",title:"Address",minWidth:"150px",showOverflow:"tooltip"},{field:"status",title:"Status",minWidth:"100px",align:"center",formatter:({cellValue:e})=>s(e==="online"?"routes.cluster.在线":"routes.cluster.离线"),cellRender:{name:"VxeTag",props:({row:e})=>({type:e.status==="online"?"success":"danger",content:e.status==="online"?s("routes.cluster.在线"):s("routes.cluster.离线")})}},{field:"connection",get title(){return`${s("routes.cluster.关系")} / ${s("routes.cluster.RTT")}`},minWidth:"150px",align:"center",slots:{default:"connection"}},{field:"roles",title:"Roles",minWidth:"200px",formatter:({cellValue:e})=>Array.isArray(e)?e.join(", "):e},{field:"lastSeen",title:"Last Seen",minWidth:"100px",formatter:({cellValue:e})=>Se(e)},{field:"streams",get title(){return`${s("routes.cluster.流数量")}/${s("routes.cluster.订阅数量")}`},minWidth:"100px",align:"center",slots:{default:"streams"}},{field:"summary",get title(){return`CPU | ${s("routes.cluster.内存使用")} | ${s("routes.cluster.硬盘使用")}`},minWidth:"200px",align:"center",slots:{default:"summary"}}]};return(e,r)=>(k(),H(Me,null,[p("div",as,[x(v(ae),{class:"w-1/4"},{default:A(()=>[x(v(U),{title:e.$t("routes.cluster.总服务器"),value:Le.value},null,8,["title","value"])]),_:1}),x(v(ae),{class:"w-1/4 ml-4"},{default:A(()=>[x(v(U),{title:e.$t("routes.cluster.在线服务器"),value:Fe.value},null,8,["title","value"])]),_:1}),x(v(ae),{class:"w-1/4 ml-4"},{default:A(()=>[x(v(U),{title:e.$t("routes.cluster.角色数量"),value:Array.isArray(v(_))?v(_).length:0},null,8,["title","value"])]),_:1}),x(v(ae),{class:"w-1/4 ml-4"},{default:A(()=>[x(v(U),{title:e.$t("routes.cluster.同步版本"),value:v(b)?.version||0},null,8,["title","value"])]),_:1})]),p("div",ls,[x(v(ge).Group,{value:J.value,"onUpdate:value":r[0]||(r[0]=t=>J.value=t),"button-style":"solid"},{default:A(()=>[x(v(ge).Button,{value:"list"},{default:A(()=>[q(I(e.$t("routes.cluster.列表视图")),1)]),_:1}),x(v(ge).Button,{value:"topology"},{default:A(()=>[q(I(e.$t("routes.cluster.拓扑视图")),1)]),_:1})]),_:1},8,["value"])]),J.value==="list"?(k(),H("div",us,[(k(),E(v(st),{key:`table-${Ne.value}`,uid:v(V).uid,gridOptions:je,data:l.value,loading:D.value},{connection:A(({row:t})=>[p("div",cs,[p("span",null,I(oe(t.id,t.address).relation),1),p("span",is,I(oe(t.id,t.address).rtt),1)])]),streams:A(({row:t})=>[p("div",ds,[p("span",null,I((()=>{const n=t._summary||L(t.id);return n?`${n.streamCount||0} / ${n.subscribeCount||0}`:"暂无数据"})()),1),x(v(le),{type:"link",size:"small",onClick:()=>fe(t.id)},{default:A(()=>[q(I(e.$t("routes.cluster.查看流列表")),1)]),_:2},1032,["onClick"])])]),summary:A(({row:t})=>[p("div",null,[x(v(Ae),{placement:"left"},{title:A(()=>[p("pre",fs,I(Re(t.id)),1)]),default:A(()=>[x(v(le),{type:"link",size:"small"},{default:A(()=>[q(I((()=>{const n=t._summary||L(t.id);return n?`${(n.cpuUsage||0).toFixed(1)}% | ${(n.memory?.usage||0).toFixed(1)}% | ${(n.hardDisk?.usage||0).toFixed(1)}%`:e.$t("routes.cluster.暂无数据")})()),1)]),_:2},1024)]),_:2},1024)])]),_:1},8,["uid","data","loading"]))])):(k(),H("div",ps,[x(v(ft),{nodes:pe.value,"onUpdate:nodes":r[1]||(r[1]=t=>pe.value=t),edges:me.value,"onUpdate:edges":r[2]||(r[2]=t=>me.value=t),"default-zoom":1,"min-zoom":.2,"max-zoom":4,"fit-view-on-init":""},{"node-default":A(({data:t})=>[p("div",{class:"h-full flex flex-col",onDblclick:()=>fe(t.id)},[p("div",vs,[p("span",{class:"truncate",title:t.id},I(t.id),9,ys),t.isCurrent?(k(),E(v(_e),{key:0,color:"blue",class:"m-0 scale-75 origin-right"},{default:A(()=>[q(I(e.$t("routes.cluster.当前节点")),1)]),_:1})):Q("",!0)]),p("div",{class:"text-xs text-gray-600 mb-2 truncate",title:t.address},I(t.address),9,hs),p("div",gs,[p("div",_s,[x(v(_e),{color:t.status==="online"?"success":"error",class:"m-0 scale-90 origin-left"},{default:A(()=>[q(I(t.status==="online"?e.$t("routes.cluster.在线"):e.$t("routes.cluster.离线")),1)]),_:2},1032,["color"]),x(v(le),{type:"link",size:"small",class:"p-0 h-auto text-xs",onClick:rt(()=>fe(t.id),["stop"])},{default:A(()=>[q(I(e.$t("routes.cluster.查看流列表")),1)]),_:2},1032,["onClick"])]),t._summary?(k(),H("div",bs,[p("div",$s,[p("span",null,I(e.$t("routes.cluster.CPU使用率"))+":",1),p("span",{class:ot({"text-red-500 font-bold":(t._summary.cpuUsage||0)>80})},I((t._summary.cpuUsage||0).toFixed(1))+"%",3)]),p("div",ws,[p("span",null,I(e.$t("routes.cluster.内存使用"))+":",1),p("span",null,I((t._summary.memory?.usage||0).toFixed(1))+"%",1)]),p("div",Ss,[p("span",null,I(e.$t("routes.cluster.硬盘使用"))+":",1),p("span",null,I((t._summary.hardDisk?.usage||0).toFixed(1))+"%",1)]),p("div",Cs,[p("span",null,I(e.$t("routes.cluster.流数量"))+":",1),p("span",As,I(t._summary.streamCount||0),1)])])):(k(),H("div",xs,I(e.$t("routes.cluster.暂无数据")),1))])],40,ms)]),default:A(()=>[x(v(dt)),x(v(ns))]),_:1},8,["nodes","edges"])]))],64))}});export{Ts as default};
  4. //# sourceMappingURL=index-a6d1dde3.js.map