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