1 line
10 KiB
JavaScript
1 line
10 KiB
JavaScript
import{D as e,E as t,F as n,G as r,L as i,M as a,N as o,Q as s,T as c,U as l,V as u,Y as d,Z as f,a as p,b as m,c as h,g,i as _,n as v,o as y,p as b,q as x,r as S,s as C,w}from"./ui-IRgYFSdb.js";import{t as T}from"./arrow-right-0sCpnO2l.js";import{n as E,t as D}from"./monitor-play-C-PzXW6Y.js";import{t as O}from"./hash-CWttfl8h.js";import{t as k}from"./radio-tower-Dh2kkAT-.js";import{t as A}from"./shield-check-BlUgqha3.js";import{a as j,s as M}from"./index-BdWedm3z.js";var N=[[`rect`,{width:`20`,height:`8`,x:`2`,y:`2`,rx:`2`,ry:`2`,key:`ngkwjq`}],[`rect`,{width:`20`,height:`8`,x:`2`,y:`14`,rx:`2`,ry:`2`,key:`iecqi9`}],[`line`,{x1:`6`,x2:`6.01`,y1:`6`,y2:`6`,key:`16zg32`}],[`line`,{x1:`6`,x2:`6.01`,y1:`18`,y2:`18`,key:`nzw8ys`}]],P=e=>u(m,d(e,{iconNode:N,name:`server`})),F=a(`<div class="mt-6 flex flex-col items-center gap-3 border border-dashed border-line px-6 py-14 text-center"><div><p class=font-medium></p><p class="mt-1 text-sm text-muted-foreground">`),I=a(`<div class="flex items-center gap-2.5"><span class="size-2 bg-success pulse"></span><span class="mono-label text-muted-foreground">SyncLive / 对标 SyncTV · fan-out`),L=a(`<h1 class="display mt-6 text-[clamp(3.4rem,9vw,7.75rem)] will-change-transform"data-parallax=10><span class=block>一路推流,</span><span class=block><span class=text-acid-lime>多端扇出</span><span class="mono-label ml-3 align-top text-acid-lime sm:ml-5">/ fan-out`),R=a(`<p class="mt-6 max-w-xl text-base leading-relaxed text-muted-foreground sm:text-lg">Cloudflare Realtime 与 SRS 双 SFU 分发,浏览器经服务端反代直连,凭证不出服务端。`),z=a(`<div class="mt-3 flex flex-wrap items-center gap-x-5 gap-y-1.5 border-t border-line/70 pt-3"><span class="mono-label flex items-center gap-1.5 text-muted-foreground">role <span class=text-acid-cyan></span></span><span class="mono-label text-muted-foreground">chat · <span>`),B=a(`<div class="relative max-w-3xl border border-line bg-card/60 p-3 backdrop-blur-sm will-change-transform sm:p-4"data-parallax=6><div class="flex flex-col gap-2 sm:flex-row"><div class="flex h-11 flex-1 items-center gap-2.5 border border-line bg-background/70 px-3 transition-colors focus-within:border-ring"><input class="field-mono h-full w-full bg-transparent text-sm outline-none placeholder:text-muted-foreground/50"placeholder=输入房间名 aria-label=房间名>`),V=a(`<div class="grid max-w-3xl grid-cols-3 divide-x divide-line/80 border border-line bg-card/40 will-change-transform"data-parallax=4><div class="px-4 py-3 sm:px-5"><p class="display text-3xl sm:text-4xl dark:text-primary"></p><p class="mono-label mt-1.5 text-muted-foreground">sfu backends</p></div><div class="px-4 py-3 sm:px-5"><p class="display text-3xl sm:text-4xl dark:text-primary"></p><p class="mono-label mt-1.5 text-muted-foreground">online rooms</p></div><div class="px-4 py-3 sm:px-5"><p class="display text-3xl sm:text-4xl dark:text-primary">4</p><p class="mono-label mt-1.5 text-muted-foreground">protocols`),H=a(`<div class="flex items-end justify-between gap-4 border-b border-line pb-4"><div><p class="mono-label text-muted-foreground">online rooms</p><h2 class="display mt-1.5 text-3xl sm:text-4xl">在线房间`),U=a(`<div class=mt-2>`),W=a(`<div class="relative border border-line bg-card/50 p-4 sm:p-5"><div class="flex items-center justify-between gap-2"><div class="flex items-center gap-2"><h2 class=font-semibold>Signal Stack</h2></div></div><div class="mt-4 space-y-2.5"></div><div class="mt-4 border-t border-line/70 pt-4"><p class="micro-label text-muted-foreground">distribution protocols</p><div class="mt-2.5 flex flex-wrap gap-1.5"></div></div><div class="mt-4 flex items-start gap-2.5 border border-line/70 bg-background/40 p-3"><p class="text-xs leading-relaxed text-muted-foreground">凭据由服务端代理注入,浏览器不持有 SFU 密钥。`),G=a(`<div class=relative><section class="relative overflow-hidden"><div class=spotlight aria-hidden=true></div><div class="ghost-text display pointer-events-none absolute -top-8 right-0 hidden text-[24vw] leading-none will-change-transform xl:block"data-parallax=-40 aria-hidden=true>SFU</div><div class="relative mx-auto max-w-[1400px] px-4 pt-14 pb-12 sm:px-6 sm:pt-20"></div></section><section class="mx-auto grid max-w-[1400px] gap-10 px-4 py-14 sm:px-6 lg:grid-cols-[minmax(0,1fr)_360px]"><div class=min-w-0></div><aside class=min-w-0>`),K=a(`<div class="group -mx-3 grid grid-cols-[auto_1fr] items-center gap-x-3 gap-y-2 border-b border-line/80 py-4 transition-colors hover:bg-accent/40 sm:mx-0 sm:-mx-4 sm:grid-cols-[3rem_auto_minmax(0,1fr)_auto] sm:gap-4 sm:px-4"><span class="hidden font-mono text-xs text-muted-foreground/70 sm:block"></span><div class=min-w-0><p class="display truncate text-xl transition-colors sm:text-2xl dark:group-hover:text-primary"></p><p class="mono-label mt-1 text-muted-foreground"> targets · </p></div><div class="col-span-2 flex gap-2 sm:col-span-1">`),q=a(`<p class="text-sm text-muted-foreground">正在读取后端配置…`),J=a(`<div><div class="flex min-w-0 items-center gap-3"><span class="flex size-9 shrink-0 items-center justify-center border border-line bg-background text-foreground/80"></span><div class=min-w-0><p class="truncate text-sm font-medium"></p><p class="micro-label mt-0.5 text-muted-foreground"></p></div></div><div class="flex shrink-0 items-center gap-2.5">`),Y=[`WHIP`,`WHEP`,`HLS`,`FLV`];function X(e){return e===`BACKEND_KIND_CLOUDFLARE`?E:P}function Z(e){return e.targets?.length??0}function Q(e){return(()=>{var n=F(),r=n.firstChild,a=r.firstChild,o=a.nextSibling;return t(n,u(D,{class:`size-6 text-muted-foreground/60`}),r),t(a,()=>e.authed?`暂无在线房间`:`房间列表需登录`),t(o,()=>e.authed?`创建一个房间后,分发拓扑会出现在这里。`:`登录后可查看与管理房间分发拓扑。`),t(n,u(i,{get when(){return!e.authed},get children(){return u(M,{to:`/login`,class:`btn btn-outline btn-sm mt-1`,children:`去登录`})}}),null),n})()}var $=()=>{let a=j(),[c,d]=x([]),[m,E]=x([]),[D,M]=x(``),N;s(()=>{g.getConfig().then(e=>d(e.backends||[])).catch(()=>{});let e=N;if(e&&!window.matchMedia(`(prefers-reduced-motion: reduce)`).matches){let t=Array.from(e.querySelectorAll(`[data-parallax]`)),n=0,r=0,i=0,a=0,o=0,s=t=>{let i=e.getBoundingClientRect();n=(t.clientX-i.left)/i.width-.5,r=(t.clientY-i.top)/i.height-.5,e.style.setProperty(`--mx`,`${t.clientX-i.left}px`),e.style.setProperty(`--my`,`${t.clientY-i.top}px`)},c=()=>{n=0,r=0},l=()=>{i+=(n-i)*.08,a+=(r-a)*.08;for(let e of t){let t=Number(e.dataset.parallax||0);e.style.transform=`translate3d(${(i*t).toFixed(2)}px, ${(a*t).toFixed(2)}px, 0)`}o=requestAnimationFrame(l)};e.addEventListener(`mousemove`,s),e.addEventListener(`mouseleave`,c),o=requestAnimationFrame(l),f(()=>{e.removeEventListener(`mousemove`,s),e.removeEventListener(`mouseleave`,c),cancelAnimationFrame(o)})}}),l(()=>{b.check()&&b.isAuthed()&&g.listRooms().then(e=>E(e.rooms||[])).catch(()=>{})});let P=e=>a({to:e,search:{room:D()}});return(()=>{var s=G(),l=s.firstChild,d=l.firstChild.nextSibling.nextSibling,f=l.nextSibling,g=f.firstChild,x=g.nextSibling;return o(e=>N=e,l),t(d,u(h,{get children(){return I()}}),null),t(d,u(h,{delay:1,get children(){return L()}}),null),t(d,u(h,{delay:2,get children(){return R()}}),null),t(d,u(h,{delay:3,class:`mt-10`,get children(){var e=B(),n=e.firstChild,a=n.firstChild,o=a.firstChild;return t(e,u(_,{}),n),t(a,u(O,{class:`size-4 shrink-0 text-muted-foreground`}),o),o.$$keydown=e=>{e.key===`Enter`&&P(`/room`)},o.$$input=e=>M(e.currentTarget.value),t(n,u(S,{class:`h-11 sm:w-auto`,onClick:()=>P(`/room`),get children(){return[`进入房间`,u(T,{class:`size-4`})]}}),null),t(e,u(i,{get when(){return b.isAuthed()},get children(){var e=z(),n=e.firstChild,i=n.firstChild.nextSibling,a=n.nextSibling.firstChild.nextSibling;return t(i,()=>b.role()),t(a,()=>b.can(`room:chat`)?`ON`:`OFF`),r(()=>w(a,b.can(`room:chat`)?`text-success`:`opacity-50`)),e}}),null),r(()=>o.value=D()),e}}),null),t(d,u(h,{delay:4,class:`mt-12`,get children(){var n=V(),r=n.firstChild,i=r.firstChild,a=r.nextSibling.firstChild;return t(i,()=>c().length||`–`),t(a,(()=>{var t=e(()=>!!b.isAuthed());return()=>t()?m().length:`–`})()),n}}),null),t(s,u(y,{items:[`WHIP → SFU`,`SRS FAN-OUT`,`WHEP / HLS / FLV`,`CLOUDFLARE REALTIME`,`WEBRTC LOW-LATENCY`,`一路推流 · 多端扇出`,`FAN-OUT CONSOLE`]}),f),t(g,u(h,{get children(){var e=H();return e.firstChild,t(e,u(S,{variant:`ghost`,size:`sm`,class:`hidden sm:inline-flex`,onClick:()=>a({to:`/rooms`}),get children(){return[`全部`,u(T,{class:`size-3.5`})]}}),null),e}}),null),t(g,u(i,{get when(){return m().length>0},get fallback(){return u(Q,{get authed(){return b.isAuthed()}})},get children(){var e=U();return t(e,u(n,{get each(){return m()},children:(e,n)=>u(h,{get delay(){return Math.min(n()+1,5)},get children(){var r=K(),i=r.firstChild,o=i.nextSibling,s=o.firstChild,c=s.nextSibling,l=c.firstChild,d=o.nextSibling;return t(i,()=>String(n()+1).padStart(2,`0`)),t(r,u(p,{get active(){return Z(e)>0}}),o),t(s,()=>e.name),t(c,()=>Z(e),l),t(c,()=>Z(e)>0?`live`:`idle`,null),t(d,u(S,{size:`sm`,variant:`outline`,class:`flex-1 sm:flex-none`,onClick:()=>a({to:`/room`,search:{room:e.name}}),children:`进入`})),r}})})),e}}),null),t(x,u(h,{get children(){var a=W(),o=a.firstChild,s=o.firstChild,l=s.firstChild,d=o.nextSibling,f=d.nextSibling,p=f.firstChild.nextSibling,m=f.nextSibling,h=m.firstChild;return t(a,u(_,{}),o),t(s,u(k,{class:`size-4 text-acid-lime`}),l),t(o,u(v,{variant:`muted`,get children(){return[e(()=>c().length),` 路`]}}),null),t(d,u(i,{get when(){return c().length>0},get fallback(){return q()},get children(){return u(n,{get each(){return c()},children:e=>{let n=X(e.kind);return(()=>{var i=J(),a=i.firstChild,o=a.firstChild,s=o.nextSibling.firstChild,c=s.nextSibling,l=a.nextSibling;return t(o,u(n,{class:`size-4`})),t(s,()=>e.name),t(c,()=>e.primary?`primary sfu`:`standby`),t(l,u(C,{get active(){return e.configured}}),null),t(l,u(v,{get variant(){return e.configured?`success`:`muted`},get children(){return e.configured?`在线`:`未配置`}}),null),r(()=>w(i,`flex items-center justify-between gap-3 border p-3 transition-colors ${e.configured?`border-line bg-background/50`:`border-line/60 bg-background/20 opacity-70`}`)),i})()}})}})),t(p,u(n,{each:Y,children:e=>u(v,{variant:`outline`,class:`font-mono`,children:e})})),t(m,u(A,{class:`mt-px size-4 shrink-0 text-success`}),h),a}})),s})()};c([`input`,`keydown`]);export{$ as Home}; |