cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

fix/hero-release-note
goq / portal / focus-overlay.mjs
focus-overlay.mjs 1.6K
1function selfViewer(snapshot) {2 return snapshot?.viewers?.find((viewer) => viewer.you === true) ?? null;3}45export function handoffProposalForSelf(session) {6 const snapshot = session?.snapshot;7 const proposal = snapshot?.focus_proposal;8 const self = selfViewer(snapshot);9 if (!proposal || !self || !session.focused) return null;10 if (proposal.holder !== self.presence_id || proposal.holder_session_id !== self.session_id) {11 return null;12 }13 return Object.freeze({14 type: 'handoff',15 proposalId: proposal.proposal_id,16 requester: proposal.requester,17 revision: snapshot.revision,18 });19}2021export function preemptionCandidateForSelf(session) {22 const snapshot = session?.snapshot;23 const focus = snapshot?.focus;24 if (snapshot?.self_is_focus_owner !== true25 || !session.eligible26 || session.focused27 || focus?.state !== 'held') return null;28 return Object.freeze({29 type: 'preempt',30 holder: focus.holder,31 holderSessionId: focus.session_id,32 focusGeneration: focus.focus_generation,33 revision: snapshot.revision,34 });35}3637export function focusOverlayStillCurrent(overlay, session) {38 if (!overlay) return false;39 if (overlay.type === 'handoff') {40 const current = handoffProposalForSelf(session);41 return current?.proposalId === overlay.proposalId && current.revision >= overlay.revision;42 }43 if (overlay.type === 'preempt') {44 const current = preemptionCandidateForSelf(session);45 return current?.holder === overlay.holder46 && current.holderSessionId === overlay.holderSessionId47 && current.focusGeneration === overlay.focusGeneration48 && current.revision >= overlay.revision;49 }50 return false;51}