import{c as U,f as k}from"./connect-DkGLCYAo.js";const b=new URLSearchParams(location.search),R="https://cdn.1ms.ai",T="anon/camera-0",C=document.getElementById("relayUrl"),L=document.getElementById("path");C.value=b.get("relay")||R;L.value=b.get("path")||T;const r=document.getElementById("video"),S=document.getElementById("log"),y=document.getElementById("startBtn"),x=document.getElementById("stopBtn"),D=document.getElementById("status"),M=document.getElementById("groupCount"),A=document.getElementById("bytesReceived"),F=document.getElementById("bufferLength");let g=null,$=!1,u=null,i=null,m=0,B=0,E=[];function n(t,e="info"){const c=document.createElement("div");c.className=`log-entry log-${e}`,c.textContent=`[${new Date().toLocaleTimeString()}] ${t}`,S.appendChild(c),S.scrollTop=S.scrollHeight,console.log(t)}function V(t){return t<1024?`${t} B`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(2)} MB`}function w(){if(M.textContent=m,A.textContent=V(B),r.buffered.length>0){const t=r.buffered.end(0)-r.currentTime;F.textContent=`${Math.max(0,t).toFixed(1)}s`}}function p(t){D.textContent=t}function H(){if(E.length>0&&i&&!i.updating){const t=E.shift();try{i.appendBuffer(t)}catch(e){n(`Append error: ${e.message}`,"error")}}}async function P(t){if(!i||i.updating){E.push(t);return}try{i.appendBuffer(t)}catch(e){n(`Append error: ${e.message}`,"error")}}function j(t){const e=new Uint8Array(t),c=o=>o.toString(16).padStart(2,"0").toUpperCase();for(let o=0;o>5&7,f=e[s+1]&31,l=e[s+2]>>7&1,a=e[s+2]>>6&1,v=e[s+2]>>5&1,h=a?v?12:10:8,I=String(f).padStart(2,"0");return`av01.${d}.${I}${l?"H":"M"}.${String(h).padStart(2,"0")}`}}}return null}async function N(t){const e=j(t);if(!e)throw n("Could not detect codec from init segment","error"),new Error("No codec detected");const c=`video/mp4; codecs="${e}"`;if(!MediaSource.isTypeSupported(c))throw n(`Codec not supported: ${c}`,"error"),new Error(`Codec not supported: ${c}`);return n(`Detected codec: ${e}`,"success"),new Promise((o,s)=>{u=new MediaSource,r.src=URL.createObjectURL(u),u.addEventListener("sourceopen",()=>{n("MediaSource opened","success"),n(`Using codec: ${c}`,"success"),i=u.addSourceBuffer(c),i.mode="segments",i.addEventListener("updateend",()=>{if(H(),w(),r.buffered.length>0){const d=r.buffered.start(0),f=r.buffered.end(0);(r.currentTimef)&&(r.currentTime=Math.max(d,f-.1)),r.paused&&r.play().catch(()=>{})}}),i.addEventListener("error",d=>{n(`SourceBuffer error: ${d.type}`,"error"),console.error("SourceBuffer error:",d)}),o()}),u.addEventListener("error",s)})}y.addEventListener("click",async()=>{try{const t=C.value,e=L.value,c=`${t}/${e}`;y.disabled=!0,x.disabled=!1,$=!0,m=0,B=0,E=[],p("Connecting..."),n(`Connecting to ${c}...`),g=await U(new URL(c)),n("Connected!","success"),p("Subscribing...");const s=g.consume(k("")).subscribe("video",0);n("Subscribed to video track","success"),p("Streaming");let d=!1;for(;$;){const f=await s.nextGroup();if(!f){n("Track ended");break}for(;$;){const l=await f.readFrame();if(!l)break;m++,B+=l.byteLength;const a=new Uint8Array(l),v=Array.from(a.slice(0,8)).map(h=>h.toString(16).padStart(2,"0")).join(" ");if(m===1)n(`First segment: ${l.byteLength} bytes [${v}...]`,"data"),a[4]===102&&a[5]===116&&a[6]===121&&a[7]===112?n("Valid ftyp box detected (init segment)","success"):a[4]===109&&a[5]===111&&a[6]===111&&a[7]===102&&n("moof box (media segment without init?)","error");else if(m<=5){const h=String.fromCharCode(a[4],a[5],a[6],a[7]);n(`Segment ${m}: ${l.byteLength} bytes, box=${h}`,"data")}d||(await N(l),d=!0),await P(l),w()}}p("Ended")}catch(t){n(`Error: ${t.message}`,"error"),console.error(t),p("Error")}finally{y.disabled=!1,x.disabled=!0}});x.addEventListener("click",async()=>{$=!1,p("Stopping...");try{await(g==null?void 0:g.close())}catch{}if(g=null,(u==null?void 0:u.readyState)==="open")try{u.endOfStream()}catch{}y.disabled=!1,x.disabled=!0,p("Disconnected"),n("Disconnected","success")});r.addEventListener("error",t=>{const e=r.error;n(`Video error: ${(e==null?void 0:e.message)||"unknown"} (code: ${e==null?void 0:e.code})`,"error")});r.addEventListener("loadedmetadata",()=>{n(`Video metadata loaded: ${r.videoWidth}x${r.videoHeight}`,"success")});r.addEventListener("canplay",()=>{n("Video can play!","success")});setInterval(w,1e3);n("Ready. Enter relay URL and path, then click Connect.","info");(b.has("relay")||b.has("path"))&&(n("Auto-connecting from query params...","info"),y.click());