live-sfu-demo/internal/server/static/assets/webrtc-C76mftVq.js

1 line
6.3 KiB
JavaScript

import{E as e,G as t,L as n,N as r,O as i,S as a,U as o,V as s,_ as c,b as l,j as u,r as d,x as f,z as p}from"./ui-BjxGELcM.js";import{t as m}from"./message-square-DGTwCJY8.js";var h=[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M15.033 13.44a.647.647 0 0 1 0 1.12l-4.065 2.352a.645.645 0 0 1-.968-.56v-4.704a.645.645 0 0 1 .967-.56z`,key:`1tzo1f`}]],g=e=>n(c,t(e,{iconNode:h,name:`file-play`})),_=[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]],v=e=>n(c,t(e,{iconNode:_,name:`send`})),y=i(`<div class="pointer-events-none absolute inset-0 overflow-hidden">`),b=i(`<span class=danmaku-item>`),x=i(`<div class="flex h-full min-h-24 flex-col items-center justify-center gap-2.5 text-center"><p class="text-sm text-muted-foreground">还没有弹幕</p><p class="micro-label text-muted-foreground/50">danmaku channel idle`),S=i(`<div class="flex gap-2 border-t border-line/80 p-2.5"><input class="field field-mono h-9 flex-1 text-sm"placeholder=发条弹幕… aria-label=弹幕内容>`),C=i(`<div class="flex h-full min-h-0 flex-col"><div class="flex-1 space-y-3 overflow-y-auto p-3">`),w=i(`<div class="flex items-start gap-2.5"><span></span><div class="min-w-0 flex-1"><div class="flex flex-wrap items-baseline gap-x-2"><span class="font-mono text-xs font-medium"></span><span class="micro-label text-[9px] text-muted-foreground"></span><span class="font-mono text-[9px] text-muted-foreground/60"></span></div><p class="mt-0.5 text-sm leading-snug break-words">`),T=i(`<p class="border-t border-line/80 p-3 text-xs text-muted-foreground">登录后可在房间内发送弹幕`);function E(t){let[r,i]=o([]),c=0,l=0,d=``,f=[6,18,30,42,54,66,78];p(()=>{let e=t.messages(),n=e[e.length-1];if(!n||n.id===d)return;d=n.id;let r=f[l%f.length];l++;let a=7+Math.random()*4,o={key:++c,text:n.message,color:n.color||`#f1f5f9`,top:r,dur:a};i(e=>{let t=[...e,o];return t.length>50?t.slice(t.length-50):t})});let m=e=>i(t=>t.filter(t=>t.key!==e));return(()=>{var t=y();return a(t,n(u,{get each(){return r()},children:t=>(()=>{var n=b();return n.addEventListener(`animationend`,()=>m(t.key)),a(n,()=>t.text),s(r=>{var i=`${t.top}%`,a=t.color,o=`${t.dur}s`;return i!==r.e&&e(n,`top`,r.e=i),a!==r.t&&e(n,`color`,r.t=a),o!==r.a&&e(n,`animation-duration`,r.a=o),r},{e:void 0,t:void 0,a:void 0}),n})()})),t})()}function D(e){return Number.isFinite(e)?new Date(e).toLocaleTimeString(`zh-CN`,{hour:`2-digit`,minute:`2-digit`}):`--:--`}function O(e){return e===`admin`?`border-acid-magenta/40 bg-acid-magenta/10 text-acid-magenta`:e===`publisher`?`border-warning/40 bg-warning/10 text-warning`:`border-acid-cyan/40 bg-acid-cyan/10 text-acid-cyan`}function k(e){let[t,i]=o(``),c=()=>{let n=t().trim();n&&(e.onSend(n),i(``))};return(()=>{var o=C(),f=o.firstChild;return a(f,n(r,{get when(){return e.messages().length>0},get children(){return n(u,{get each(){return e.messages()},children:e=>(()=>{var t=w(),n=t.firstChild,r=n.nextSibling.firstChild,i=r.firstChild,o=i.nextSibling,c=o.nextSibling,u=r.nextSibling;return a(n,()=>(e.user[0]??`?`).toUpperCase()),a(i,()=>e.user),a(o,()=>String(e.role)),a(c,()=>D(e.ts)),a(u,()=>e.message),s(()=>l(n,`mt-0.5 flex size-6 shrink-0 items-center justify-center border font-mono text-[10px] font-bold ${O(String(e.role))}`)),t})()})}}),null),a(f,n(r,{get when(){return e.messages().length===0},get children(){var e=x(),t=e.firstChild;return a(e,n(m,{class:`size-5 text-muted-foreground/50`}),t),e}}),null),a(o,n(r,{get when(){return e.canChat},get fallback(){return T()},get children(){var e=S(),r=e.firstChild;return r.$$keydown=e=>{e.key===`Enter`&&c()},r.$$input=e=>i(e.currentTarget.value),a(e,n(d,{onClick:c,size:`icon`,"aria-label":`发送弹幕`,class:`shrink-0`,get children(){return n(v,{class:`size-4`})}}),null),s(()=>r.value=t()),e}}),null),o})()}f([`input`,`keydown`]);function A(e,t){let n=new EventSource(`/api/room/${encodeURIComponent(e)}/events`,{withCredentials:!0});return n.addEventListener(`room`,e=>{try{t(JSON.parse(e.data))}catch{}}),()=>n.close()}function j(e,t){let n=new EventSource(`/api/room/${encodeURIComponent(e)}/chat`,{withCredentials:!0});return n.addEventListener(`chat`,e=>{try{t(JSON.parse(e.data))}catch{}}),()=>n.close()}async function M(e,t,n){await fetch(`/api/room/${encodeURIComponent(e)}/chat`,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`},body:JSON.stringify({message:t,color:n})})}function N(e){return{urls:e.urls,username:e.username,credential:e.credential}}async function P(e){let t=new RTCPeerConnection({iceServers:e.iceServers||[]});e.local.getTracks().forEach(n=>t.addTrack(n,e.local));let n=await t.createOffer();await t.setLocalDescription(n);let r=await(await fetch(`/rtc/v1/whip/?app=live&stream=${encodeURIComponent(e.stream)}&token=${encodeURIComponent(e.token)}`,{method:`POST`,headers:{"Content-Type":`application/sdp`},credentials:`same-origin`,body:n.sdp??``})).text();return await t.setRemoteDescription({type:`answer`,sdp:r}),t}async function F(e){let t=new RTCPeerConnection({iceServers:e.iceServers||[]});t.addTransceiver(`video`,{direction:`recvonly`}),t.addTransceiver(`audio`,{direction:`recvonly`});let n=await t.createOffer();await t.setLocalDescription(n);let r=await(await fetch(`/rtc/v1/whep/?app=live&stream=${encodeURIComponent(e.stream)}`,{method:`POST`,headers:{"Content-Type":`application/sdp`},credentials:`same-origin`,body:n.sdp??``})).text();return await t.setRemoteDescription({type:`answer`,sdp:r}),t}async function I(e){let t=new RTCPeerConnection({iceServers:e.iceServers||[]});t.addTransceiver(`video`,{direction:`recvonly`}),t.addTransceiver(`audio`,{direction:`recvonly`});let n=await t.createOffer();await t.setLocalDescription(n);let r=await(await fetch(`/api/cf/sessions/${e.viewerSessionId}/tracks/new`,{method:`POST`,headers:{"Content-Type":`application/json`},credentials:`same-origin`,body:JSON.stringify({sessionDescription:{type:`offer`,sdp:n.sdp},tracks:[{location:`remote`,sessionId:e.publisherSessionId}]})})).json();return await t.setRemoteDescription({type:r.sessionDescription.type,sdp:r.sessionDescription.sdp}),t}export{M as a,k as c,P as i,E as l,N as n,j as o,F as r,A as s,I as t,g as u};