live-sfu-demo/internal/server/static/assets/routes-Dwgi66GM.js

1 line
6.1 KiB
JavaScript

import{E as e,F as t,K as n,V as r,b as i,f as a,i as o,j as s,k as c,l,m as u,n as d,o as f,r as p,u as m,v as h,x as g,z as _}from"./ui-W1Pm8dqI.js";import{t as v}from"./arrow-right-DNPSxlbJ.js";import{t as y}from"./cloud-CTCP3hC3.js";import{t as b}from"./server-C0Pmpptj.js";import{t as x}from"./shield-check-D8IU7TWB.js";import{i as S,n as C,r as w,t as T}from"./index-CFU6bGFM.js";var E=e(`<div class="flex items-center gap-2"><h2 class=font-semibold>进入房间`),D=e(`<div class="flex flex-col gap-2 sm:flex-row sm:items-center"><div class="flex flex-wrap gap-2">`),O=e(`<div class="flex flex-wrap items-center gap-x-3 gap-y-1.5 border-t pt-3 text-xs text-muted-foreground"><span class="flex items-center gap-1.5">当前角色</span><span>发布:<b></b></span><span>发弹幕:<b>`),k=e(`<div class="flex items-center justify-between"><div class="flex items-center gap-2"><h2 class=font-semibold>后端状态`),A=e(`<div class=space-y-2>`),j=e(`<div><p class="label mb-2">分发协议</p><div class="flex flex-wrap gap-1.5">`),M=e(`<div class="flex gap-2 rounded-md border bg-muted/50 p-3 text-xs leading-relaxed text-muted-foreground"><span>凭据由服务端代理注入,浏览器不持有 SFU 密钥。`),N=e(`<section class=space-y-3><div class="flex items-end justify-between gap-3"><div><h2 class="text-lg font-semibold">在线房间</h2><p class="text-sm text-muted-foreground">当前已恢复的分发拓扑</p></div></div><div class="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">`),P=e(`<div class=space-y-8><section class="flex flex-col gap-6 lg:flex-row lg:items-start"><div class="min-w-0 flex-1 space-y-5"><div class=space-y-3><div class="inline-flex items-center gap-2 font-mono text-xs text-muted-foreground"><span class="size-1.5 rounded-full bg-success shadow-[0_0_0_3px_hsl(var(--success)/0.14)]"></span>live-sfu / fan-out console</div><h1 class="text-3xl leading-tight font-semibold sm:text-4xl">一路推流,<span class=acid-text>多端扇出</span></h1><p class="max-w-xl leading-relaxed text-muted-foreground">Cloudflare Realtime 与 SRS 双 SFU 分发,浏览器经服务端反代直连,凭证不出服务端。`),F=e(`<p class="text-sm text-muted-foreground">正在读取后端配置…`),I=e(`<div class="flex items-center justify-between gap-3 rounded-md border p-3"><div class="flex min-w-0 items-center gap-3"><span class="flex size-8 shrink-0 items-center justify-center rounded-md bg-secondary text-foreground/70"></span><div class=min-w-0><p class="truncate text-sm font-medium"></p><p class="text-xs text-muted-foreground">`),L=e(`<div class="flex items-center justify-between gap-2"><div class="flex min-w-0 items-center gap-2"><span class="truncate font-medium"></span></div><span class="shrink-0 font-mono text-xs text-muted-foreground"> 路`),R=e(`<div class="flex gap-2">`);function z(e){return e===`BACKEND_KIND_CLOUDFLARE`?y:b}function B(e){return e.targets?.length??0}var V=()=>{let e=S(),[y,b]=r([]),[V,H]=r([]),[U,W]=r(`demo`);n(async()=>{try{let e=await u.getConfig();b(e.backends||[])}catch{}if(a.isAuthed())try{let e=await u.listRooms();H(e.rooms||[])}catch{}});let G=t=>e({to:t,search:{room:U()}});return(()=>{var n=P(),r=n.firstChild,u=r.firstChild;return u.firstChild,i(u,t(o,{class:`space-y-4 p-5`,get children(){return[(()=>{var e=E(),n=e.firstChild;return i(e,t(w,{class:`size-4 text-primary`}),n),e})(),(()=>{var e=D(),n=e.firstChild;return i(e,t(m,{get value(){return U()},onInput:W,placeholder:`房间名,如 demo`,class:`sm:max-w-xs`}),n),i(n,t(p,{onClick:()=>G(`/room`),get children(){return[`进入房间`,t(v,{class:`size-4`})]}}),null),i(n,t(p,{variant:`outline`,onClick:()=>G(`/publish`),get children(){return[t(T,{class:`size-4`}),`开始直播`]}}),null),e})(),t(s,{get when(){return a.isAuthed()},get children(){var e=O(),n=e.firstChild;n.firstChild;var r=n.nextSibling,o=r.firstChild.nextSibling,s=r.nextSibling.firstChild.nextSibling;return i(n,t(d,{class:`border-acid-cyan/30 bg-acid-cyan/10 text-acid-cyan`,get children(){return a.role()}}),null),i(o,()=>a.can(`room:publish`)?`可`:`不可`),i(s,()=>a.can(`room:chat`)?`可`:`不可`),_(e=>{var t=a.can(`room:publish`)?`text-success`:`text-muted-foreground`,n=a.can(`room:chat`)?`text-success`:`text-muted-foreground`;return t!==e.e&&h(o,e.e=t),n!==e.t&&h(s,e.t=n),e},{e:void 0,t:void 0}),e}})]}}),null),i(r,t(o,{class:`w-full shrink-0 space-y-4 self-start p-5 lg:w-80 xl:w-[22rem]`,get children(){return[(()=>{var e=k(),n=e.firstChild,r=n.firstChild;return i(n,t(C,{class:`size-4 text-primary`}),r),i(e,t(d,{variant:`secondary`,get children(){return[g(()=>y().length),` 路`]}}),null),e})(),(()=>{var e=A();return i(e,t(s,{get when(){return y().length>0},get fallback(){return F()},get children(){return t(c,{get each(){return y()},children:e=>{let n=z(e.kind);return(()=>{var r=I(),a=r.firstChild.firstChild,o=a.nextSibling.firstChild,s=o.nextSibling;return i(a,t(n,{class:`size-4`})),i(o,()=>e.name),i(s,()=>e.primary?`主 SFU`:`对照后端`),i(r,t(d,{get variant(){return e.configured?`success`:`warning`},get children(){return e.configured?`已配置`:`未配置`}}),null),r})()}})}})),e})(),t(l,{}),(()=>{var e=j(),n=e.firstChild.nextSibling;return i(n,t(c,{each:[`WHIP`,`WHEP`,`HLS`,`FLV`],children:e=>t(d,{variant:`outline`,class:`font-mono`,children:e})})),e})(),(()=>{var e=M(),n=e.firstChild;return i(e,t(x,{class:`mt-px size-4 shrink-0 text-success`}),n),e})()]}}),null),i(n,t(s,{get when(){return V().length>0},get children(){var n=N(),r=n.firstChild;r.firstChild;var a=r.nextSibling;return i(r,t(p,{variant:`ghost`,size:`sm`,onClick:()=>e({to:`/rooms`}),get children(){return[`房间列表`,t(v,{class:`size-4`})]}}),null),i(a,t(c,{get each(){return V()},children:n=>t(o,{class:`space-y-3 p-4`,get children(){return[(()=>{var e=L(),r=e.firstChild,a=r.firstChild,o=r.nextSibling,s=o.firstChild;return i(r,t(f,{get active(){return B(n)>0}}),a),i(a,()=>n.name),i(o,()=>B(n),s),e})(),(()=>{var r=R();return i(r,t(p,{size:`sm`,class:`flex-1`,onClick:()=>e({to:`/room`,search:{room:n.name}}),children:`进入`}),null),i(r,t(p,{variant:`outline`,size:`sm`,class:`flex-1`,onClick:()=>e({to:`/publish`,search:{room:n.name}}),children:`直播`}),null),r})()]}})})),n}}),null),n})()};export{V as Home};