2 lines
15 KiB
JavaScript
2 lines
15 KiB
JavaScript
import"./engine-DDeQk6Ow.js";import{c as ye}from"./presentations-DTbzrNOf.js";import{_ as be}from"./DeckViewer.vue_vue_type_style_index_0_lang-B-kKlUbt.js";import{A as X,d as ke,o as Ee,aH as Se,aN as ie,c as F,s as Me,f as ne,b as K,F as _e,r as Z,aO as se,n as A,aM as Re,aP as Ce,Z as Te}from"./index-48caA657.js";import{C as re,f as ue,a as Le,c as Ae,r as Ne,b as Pe}from"./log-Xlt5jeld.js";import{b as De,R as Ie}from"./remote-aOKX75Mt.js";const Fe=/^U\+(0-FF|100-2BA)\b/i;function Oe(e){return e.status==="unloaded"&&Fe.test(e.unicodeRange.trim())}async function je(e){const r=[...e].filter(Oe);return await Promise.allSettled(r.map(a=>a.load())),r.length}async function Be(e,r){const a=e.filter(d=>d.classList.contains("on"));try{for(const d of e){for(const c of e)c.classList.toggle("on",c===d);d.offsetHeight,await r()}}finally{for(const d of e)d.classList.toggle("on",a.includes(d))}return e.length}async function ze(e,r,a=50){const d=Date.now()+r;for(;;){if(e())return!0;if(Date.now()>=d)return!1;await new Promise(c=>setTimeout(c,a))}}function fe(){return{raf:e=>requestAnimationFrame(()=>e()),cancelRaf:e=>cancelAnimationFrame(e),setTimeout:(e,r)=>window.setTimeout(e,r),clearTimeout:e=>window.clearTimeout(e),now:()=>performance.now()}}async function Ue(e,r=fe()){return(await de(Number.POSITIVE_INFINITY,e,r)).frames}function de(e,r,a=fe()){return new Promise(d=>{const c=a.now();let u=0,g=0,h=0,y=!1;const p=l=>{y||(y=!0,a.cancelRaf(g),a.clearTimeout(h),d({frames:u,ms:Math.round(a.now()-c),ok:l}))},E=()=>{y||(u++,u>=e?p(!0):g=a.raf(E))};h=a.setTimeout(()=>p(!1),r),g=a.raf(E)})}const We="https://www.gstatic.com/cast/sdk/libs/caf_receiver/v3/cast_receiver_framework.js",ce="bm-caf",me=["READY","SENDER_CONNECTED","SENDER_DISCONNECTED","SHUTDOWN","VISIBILITY_CHANGED","STANDBY_CHANGED","ERROR"];function O(){const r=globalThis.cast?.framework;return r&&typeof r.CastReceiverContext?.getInstance=="function"?r:null}function $e(){return O()!==null}function He(e=1e4){return O()?Promise.resolve(!0):new Promise(r=>{let a=document.getElementById(ce);a||(a=document.createElement("script"),a.id=ce,a.src=We,document.head.appendChild(a));const d=a;let c=!1;const u=E=>{c||(c=!0,window.clearInterval(y),window.clearTimeout(p),d.removeEventListener("load",g),d.removeEventListener("error",h),r(E))},g=()=>u(O()!==null),h=()=>u(!1);d.addEventListener("load",g),d.addEventListener("error",h);const y=window.setInterval(()=>{O()&&u(!0)},50),p=window.setTimeout(()=>u(O()!==null),e)})}function Ve(e){const r=O();if(!r)throw new Error("cast: the receiver SDK is not loaded");const a=r.CastReceiverContext.getInstance(),d=()=>{try{return a.getSenders().length}catch{return 0}},c=new r.CastReceiverOptions;c.customNamespaces={[re]:r.system.MessageType.JSON},c.skipPlayersLoad=!0,c.disableIdleTimeout=!0,c.maxInactivity=3600,c.statusText=e.statusText;for(const u of me){const g=r.system.EventType[u];g!==void 0&&a.addEventListener(g,h=>{e.onEvent(u,{reason:h?.reason,senderId:h?.senderId,isVisible:h?.isVisible,isStandby:h?.isStandby,senders:d()})})}return a.addCustomMessageListener(re,u=>e.onMessage(u?.data,u?.senderId)),a.start(c),{send(u,g){if(!ue(u))return e.onEvent("send-dropped",{type:u.type}),!1;try{return a.sendCustomMessage(re,g,u),!0}catch(h){return e.onEvent("send-failed",{type:u.type,error:h instanceof Error?h.message:String(h)}),!1}},senders:d,setStatusText(u){try{a.setApplicationState(u)}catch{}},deviceCapabilities(){try{return a.getDeviceCapabilities?.()??null}catch{return null}}}}const Ge=2e3,qe=5e3,xe=/data-deck-image="([^"]+)"/g;function Je(e){const r=new Set,a=c=>{if(c)for(const u of c.matchAll(xe))r.add(u[1])},d=c=>{a(c.body_html),a(c.comment_html),a(c.sources_html),c.special&&d(c.special)};for(const c of e.slides??[])d(c);return[...r]}function V(e){return e instanceof X?e.status:0}function Q(e){return e instanceof X?`${e.status} ${e.message}`:e instanceof Error?e.message:String(e)}function Ye(e){const r=e.now??(()=>Date.now());let a=null,d=null,c=null,u=null,g="waiting",h="off",y="",p=0,E=-1/0,l=!1,S,M=-1/0,v=null,j=!1,C=[],B="",z=0,U=0,G=0;function T(){const t=e.view.current();return{type:"status",phase:g,ws:h,number:t?.number??0,special:t?.special??!1,title:y}}function W(){const t=T();e.onStatus?.(t),e.send(t)}function N(t){g!==t&&(g=t,e.log("phase",t),W())}function P(t){if(h===t)return;const n=h;n==="connected"&&t==="connecting"&&G++,h=t,e.log("ws",`${n} -> ${t}`),W()}function D(t){const n=r();n-E<Ge||(E=n,e.log("ticket","need-ticket",{why:t}),e.send({type:"need-ticket"}))}async function I(t,n,o=a){if(!o)throw new X(401,"no ticket");try{return await n(o)}catch(f){throw V(f)===401&&o===a&&D(t),f}}async function $(t){const n=r();try{const o=await I(t,e.api.realtime);return e.log("token",`${t} ok`,{kind:t,outcome:"ok",ms:Math.round(r()-n)}),o}catch(o){const f=V(o),w=f===401||f===403||f===404?"refused":"failed";throw e.log("token",`${t} ${w}`,{kind:t,outcome:w,status:f,ms:Math.round(r()-n)}),o}}function q(){e.realtime.setTokenSource({connection:async()=>(await $("connection")).token,subscription:async t=>{const n=await $("subscription");if(n.channel!==t)throw e.log("token","subscription channel mismatch"),new X(403,"cast: channel mismatch");return n.channel_token}})}function x(t=C){for(const n of t)e.revokeURL(n);t===C&&(C=[])}async function J(t,n,o){const f={};return await Promise.all(Je(t).map(async w=>{try{const L=await I("image",k=>e.api.image(k,w),n);if(o!==p||l)return;const R=e.objectURL(L);C.push(R),f[w]=R}catch(L){e.log("image","image skipped",{name:w,status:V(L)})}})),f}function H(){u?.close(),u=null}function i(t){const n=()=>t===p&&!l;return{onPublication(o){if(!n())return;const f=De(o);if(!f||f.event!==Ie)return;const w=f.payload;if(w.tab!==d){U++,e.log("foreign","state from another tab",{tab:w.tab});return}z++,e.view.show(w.number,w.special,w.panel==="notes"||w.panel==="srcs"?w.panel:null),e.log("state","applied",{number:w.number,special:w.special})},onSubscribed(){n()&&(e.log("ws","subscribed"),g==="ready"&&W())},onConnection(o){n()&&P(o)},onDenied(o){n()&&(e.log("ws","subscription denied",{code:o}),o===401&&D("subscription denied"))},onUnavailable(){n()&&(P("off"),D("realtime unavailable"))}}}async function s(t,n){const o=await e.realtime.openChannel(n,i(t));if(t!==p||l){o.close();return}u=o}async function m(t,n){const o=++p,f=a,w=r();H(),e.realtime.disconnect(),c=null,B="",N("loading");const L=C;C=[];let R;try{if(R=n??await I("deck",e.api.deck,f),o!==p||l)return;y=R.title??"";const k=r(),oe=await J(R,f??"",o);if(o!==p||l)return;const ae=r();if(await e.view.load(R,oe),o!==p||l)return;B=JSON.stringify(R),e.log("perf","deck up",{fetchMs:Math.round(k-w),imagesMs:Math.round(ae-k),images:Object.keys(oe).length,loadMs:Math.round(r()-ae),totalMs:Math.round(r()-w),slides:R.slides?.length??0})}catch(k){if(o!==p||l)return;e.log("error","deck load failed",{error:Q(k)}),N("error");return}finally{x(L)}try{q();const k=t??await I("realtime",e.api.realtime,f);if(o!==p||l)return;c=k.channel,await s(o,k.channel)}catch(k){if(o!==p||l)return;e.log("error","channel join failed",{error:Q(k)}),P("off")}o!==p||l||N("ready")}async function b(){if(!c)return;const t=p;H(),e.realtime.disconnect();try{await s(t,c)}catch(n){e.log("error","channel reopen failed",{error:Q(n)})}}async function _(t,n,o){if(!a){a=t,d=n,e.log("ticket","first hello",{tab:n}),await m(),a===t&&g==="ready"&&(S=o);return}if(t===a){if(d!==n&&e.log("tab","casting tab switched",{tab:n}),d=n,S=o,g==="error"||g==="ready"&&!u){await m();return}e.send(T(),o);return}let f;try{f=await e.api.realtime(t)}catch(w){e.log("ticket","refused",{status:V(w)}),e.send(T(),o);return}if(!l){if(a=t,d=n,S=o,E=-1/0,c&&f.channel===c&&g==="ready"){let w=null;try{w=await e.api.deck(t)}catch(L){e.log("ticket","deck check failed",{status:V(L)})}if(l)return;if(w&&JSON.stringify(w)!==B){e.log("ticket","deck changed",{tab:n}),await m(f,w);return}if(e.log("ticket","swapped",{tab:n}),await b(),l)return;e.send(T(),o);return}e.log("ticket","new deck",{tab:n}),await m(f)}}function Y(t){const n=e.report?.()??{summary:null,device:null,events:[],previousRun:[]},o=Ae(JSON.stringify(Ne(n)));e.log("log","sending",{parts:o.length,senderId:t});for(const f of o){if(!ue(f)){e.log("log","part dropped",{part:f.part});continue}e.send(f,t)}}function ee(t){const n=e.view.current();e.send({type:"position",number:n?.number??0,special:n?.special??!1},t)}async function te(t,n){if(l)return;const o=Le(t);if(!o){e.log("foreign","unknown message",{senderId:n});return}if(e.log("rx",o.type,{senderId:n}),o.type==="where"){ee(n);return}if(o.type==="log"){Y(n);return}const f=S!==void 0&&n===S||o.ticket===a;if(!f&&S!==void 0){if(r()<M){e.log("foreign","hello throttled",{senderId:n});return}M=r()+qe}await we(o.ticket,o.tab,n,f)}function we(t,n,o,f){return new Promise(w=>{if(v){if(v.trusted&&!f){e.log("foreign","hello dropped behind a trusted one",{senderId:o}),w();return}e.log("rx","hello superseded",{senderId:v.senderId}),v.settle()}v={ticket:t,tab:n,senderId:o,trusted:f,settle:w},j||ge()})}async function ge(){j=!0;try{for(;v&&!l;){const t=v;v=null;try{await _(t.ticket,t.tab,t.senderId)}catch(n){e.log("error","hello failed",{error:Q(n)})}finally{t.settle()}}}finally{j=!1,v?.settle(),v=null}}function ve(t){t===void 0||t!==S||(S=void 0,e.log("rx","pinned sender left",{senderId:t}))}function he(){l=!0,p++,H(),e.realtime.setTokenSource(null),x()}function pe(){return{ws:h,applied:z,foreign:U,reconnects:G}}return{handle:te,senderLeft:ve,status:T,stats:pe,close:he}}const Ke={key:1,class:"cast-screen cast-cover",role:"status"},Ze={key:2,class:"cast-screen"},Qe={key:0,class:"cast-hint"},Xe={key:3,class:"cast-screen"},et={key:4,class:"cast-screen"},tt=6e4,le=1e3,ct=ke({__name:"CastReceiverView",setup(e){const r=Z("boot"),a=se(null),d=se({}),c=Z("pending"),u=Z(null),g=Z(!1);let h=null,y=null,p=0;const E=new Set(me),l=Pe("bm.cast.log"),S=Date.now();let M={};function v(i,s,m){l.note(i,s,m),i==="error"&&l.persist()}function j(){const i=performance.memory;return i?Math.round(i.usedJSHeapSize/1048576):null}function C(){const i=navigator;return{ua:navigator.userAgent,screen:`${window.screen.width}x${window.screen.height}`,viewport:`${window.innerWidth}x${window.innerHeight}`,dpr:window.devicePixelRatio,cores:navigator.hardwareConcurrency,memoryGB:i.deviceMemory??null}}function B(i,s){if(!E.has(i)){v("send",i,s);return}i==="READY"&&h?(M={...M,capabilities:h.deviceCapabilities()},v("caf",i,{...s,capabilities:M.capabilities})):v("caf",i,s),i==="SENDER_DISCONNECTED"&&typeof s?.senderId=="string"&&y?.senderLeft(s.senderId),l.persist()}function z(){return"serviceWorker"in navigator&&navigator.serviceWorker.controller!==null}function U(){return{screen:r.value,covered:g.value,coverInDom:document.querySelector(".cast-cover")!==null,visibility:document.visibilityState,focus:document.hasFocus(),sw:z()}}async function G(){const i=await Ue(le),s=y?.stats();v("beat","heartbeat",{uptimeMin:+((Date.now()-S)/6e4).toFixed(1),ws:s?.ws??"off",applied:s?.applied??0,foreign:s?.foreign??0,reconnects:s?.reconnects??0,heapMB:j(),frames:i,frameSampleMs:le,...U()}),l.persist(),y&&h?.send(y.status())}async function T(){const i=await de(3,3e3);v("paint",i.ok?"frames after the cover":"no frames after the cover",{...i,...U()}),l.persist()}async function W(){if(!("serviceWorker"in navigator))return;const i=navigator.serviceWorker;try{const s=await i.getRegistrations(),m=i.controller!==null;if(s.length===0&&!m)return;const b=await Promise.all(s.map(_=>_.unregister().catch(()=>!1)));v("boot","service worker unregistered",{controlled:m,scopes:s.map(_=>_.scope),unregistered:b.filter(Boolean).length})}catch(s){v("boot","service worker check failed",String(s))}l.persist()}function N(i){v("error","window error",{message:String(i.message),source:i.filename,line:i.lineno})}function P(i){const s=i.reason instanceof Error?i.reason.message:String(i.reason);v("error","unhandled rejection",{reason:s})}function D(){v("boot","pagehide"),l.persist()}function I(i){return new Promise(s=>window.setTimeout(s,i))}function $(){return new Promise(i=>requestAnimationFrame(()=>i()))}function q(){return u.value?.sections()??[]}async function x(i,s){g.value=!0;const m=performance.now();try{a.value=i,d.value=s,c.value="ready",r.value="deck",await Te(),await ze(()=>q().some(te=>te.classList.contains("on")),2e4)||v("error","the first slide did not show in 20 s"),await document.fonts.ready,await I(50);const b=performance.now(),_=await je(document.fonts),Y=performance.now(),ee=await Be(q(),$);await $(),v("perf","warm-up",{stageMs:Math.round(b-m),faces:_,warmMs:Math.round(Y-b),sections:ee,prerenderMs:Math.round(performance.now()-Y),totalMs:Math.round(performance.now()-m)})}finally{g.value=!1,T()}h?.setStatusText(`BM · ${i.title}`)}let J=null;function H(i){i.phase!==J&&(J=i.phase,i.phase==="loading"?g.value=!0:i.phase==="error"?(g.value=!1,r.value="error"):i.phase==="ready"&&a.value&&(g.value=!1,r.value="deck"))}return Ee(async()=>{M=C();const i=l.previous[l.previous.length-1];if(v("boot","receiver loaded",{...M,cafAtBoot:$e(),sw:z(),previousRunEvents:l.previous.length,lastPrevious:i??null}),l.persist(),W(),window.addEventListener("error",N),window.addEventListener("unhandledrejection",P),window.addEventListener("pagehide",D),p=window.setInterval(()=>{G()},tt),document.documentElement.classList.add("deck-public"),!document.querySelector('meta[data-deck-public="1"]')){const m=document.createElement("meta");m.name="robots",m.content="noindex",m.dataset.deckPublic="1",document.head.appendChild(m)}if(!await He()){r.value="unsupported",v("boot","no CAF SDK");return}r.value="waiting",y=Ye({api:ye,realtime:{setTokenSource:Ce,openChannel:Re,disconnect:ie},view:{load:x,show:(m,b,_)=>{u.value?.showSlide(m,b,_)},current:()=>u.value?.current()??null},send:(m,b)=>{h?.send(m,b)},log:v,objectURL:m=>URL.createObjectURL(m),revokeURL:m=>URL.revokeObjectURL(m),onStatus:H,report:()=>({summary:l.summary(),device:M,events:l.events,previousRun:l.previous})});const s=y;try{h=Ve({statusText:"BM · prezentacja",onMessage:(m,b)=>{s.handle(m,b)},onEvent:B}),v("caf","started")}catch(m){v("error","receiver start failed",String(m)),r.value="unsupported"}}),Se(()=>{window.clearInterval(p),window.removeEventListener("error",N),window.removeEventListener("unhandledrejection",P),window.removeEventListener("pagehide",D),l.persist(),y?.close(),ie(),document.documentElement.classList.remove("deck-public"),document.querySelector('meta[data-deck-public="1"]')?.remove()}),(i,s)=>(A(),F(_e,null,[a.value?(A(),Me(be,{key:0,ref_key:"viewer",ref:u,phase:c.value,deck:a.value,error:"",mode:"public","no-toolbar":"","extra-css":a.value.css,theme:a.value.theme,images:d.value},null,8,["phase","deck","extra-css","theme","images"])):ne("",!0),g.value?(A(),F("div",Ke,[...s[0]||(s[0]=[K("p",null,"Przygotowuję slajdy…",-1)])])):r.value==="boot"||r.value==="waiting"?(A(),F("div",Ze,[s[1]||(s[1]=K("p",null,"BM · czekam na pilota…",-1)),r.value==="waiting"?(A(),F("p",Qe,"Na telefonie otwórz pilota prezentacji i wybierz Wyświetl na TV.")):ne("",!0)])):r.value==="unsupported"?(A(),F("div",Xe,[...s[2]||(s[2]=[K("p",null,"Ta strona działa tylko na urządzeniu Google Cast.",-1)])])):r.value==="error"?(A(),F("div",et,[...s[3]||(s[3]=[K("p",null,"Nie mogę wczytać prezentacji. Połącz ponownie z telefonu.",-1)])])):ne("",!0)],64))}});export{ct as default};
|