synxed-sdk 0.3.4 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/proto/sdk-streaming.ts","../src/transport/ProtocolCodec.ts","../src/core/EventEmitter.ts","../src/core/debug.ts","../src/transport/TransportManager.ts","../src/audio/AudioEngine.ts","../src/playlist/PlaylistManager.ts","../src/core/errors.ts","../src/core/contentSummary.ts","../src/core/adPayload.ts","../src/voice/voiceAudioFormats.ts","../src/core/voicePayload.ts","../src/voice/VoiceResponsePlayer.ts","../src/voice/VoiceCaptureManager.ts","../src/core/SynxedPlayer.ts","../src/radio/nowPlaying.ts","../src/web/dom.ts","../src/web/SynxedWebPlayer.ts"],"names":["schema","root","j","SdkClientEnvelope","SdkServerEnvelope","ContentKind","SdkVoiceAction","ErrorCode","ProtocolCodec","payload","message","data","decoded","EventEmitter","event","handler","set","onceHandler","args","debugEnabled","setSynxedDebug","enabled","synxedDebug","synxedWarn","buildSdkWebSocketUrl","serverUrl","apiKey","wsBase","url","TransportManager","reason","err","resolve","reject","ws","onOpen","cleanup","onError","onClose","params","bytes","AudioEngine","isHls","generation","isSafari","Hls","hls","xhr","audioEl","isStale","onPlay","onPause","onEnded","onLoadedMeta","onElementError","_event","e","Howl","_id","ms","volume","update","PlaylistManager","tracks","currentIndex","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","error","SynxedProtocolError","readString","obj","keys","key","v","readNumber","normalizeInitAck","raw","ack","playbackUrl","normalizeTrack","item","t","id","kind","albumArt","parseContentSummary","contentSummary","contentKind","summary","s","tracksRaw","rawIndex","value","readBool","normalizeAdPayload","ad","VOICE_CAPTURE_MIME","VOICE_RESPONSE_MIME","parsePcmSampleRate","mimeType","fallback","match","rate","normalizeVoiceAck","status","normalizeVoiceAudio","audio","audioData","isFinal","finalAudioData","binaryString","len","i","VoiceResponsePlayer","sampleRate","pcmData","int16","float32","audioBuffer","source","currentTime","VAD_WEB_CDN","ONNX_CDN","VoiceCaptureManager","options","utils","basePath","MicVAD","sequence","probabilities","frame","SynxedPlayer","config","positionMs","requiredMs","time","chunk","extras","voiceOpts","nextTrack","prevTrack","override","eventType","extra","intervalMs","interval","pos","parsed","canSkip","countdownSeconds","state","result","voiceAck","voiceAudio","endedAd","loadPromise","failedAd","fetchRadioNowPlaying","init","res","d","el","tag","props","node","k","c","svgIcon","path","size","svg","p","ICON_PLAY","ICON_PAUSE","ICON_SKIP","ICON_SKIP_BACK","ensureGlobalStyles","style","parseDisplayTitle","seps","sep","placementStyle","placement","offsetX","offsetY","base","resolveTheme","input","applyCssVars","theme","SYNXED_DJ_AVATAR_URL","SYNXED_VOICE_AVATAR_URL","SynxedWebPlayer","_SynxedWebPlayer","position","className","isDragging","hasMoved","startX","startY","initialLeft","initialTop","onPointerDown","evt","target","rect","onPointerMove","onPointerUp","currentX","currentY","dx","dy","liveTop","wrap","inner","shell","shellShadow","row","pillInset","avatar","info","titleRow","controls","card","head","meta","transport","box","onState","holdMs","clearHoldTimer","blockDragBubble","voiceVisual","tick","np","player","line","show","station","playing"],"mappings":"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","file":"index.js","sourcesContent":["import * as protobuf from 'protobufjs';\n\n/**\n * Protobuf schema definition for the SDK.\n * Matches the backend contract in src/modules/streaming/sdk-streaming.proto\n */\nconst schema = `\nsyntax = \"proto3\";\n\nenum ContentKind {\n CONTENT_KIND_UNSPECIFIED = 0;\n CONTENT_KIND_SONG = 1;\n CONTENT_KIND_PLAYLIST = 2;\n CONTENT_KIND_CATEGORY = 3;\n CONTENT_KIND_RADIO = 4;\n CONTENT_KIND_VOICE = 5;\n}\n\nenum SdkVoiceAction {\n VOICE_UNSPECIFIED = 0;\n VOICE_START = 1;\n VOICE_CHUNK = 2;\n VOICE_END = 3;\n}\n\nenum ErrorCode {\n ERROR_CODE_UNSPECIFIED = 0;\n UNAUTHORIZED = 1;\n VALIDATION_ERROR = 2;\n NOT_FOUND = 3;\n PROCESSING = 4;\n SERVICE_UNAVAILABLE = 5;\n BAD_PROTOBUF = 6;\n}\n\nenum SdkControlAction {\n CONTROL_UNSPECIFIED = 0;\n CONTROL_PLAY = 1;\n CONTROL_PAUSE = 2;\n CONTROL_STOP = 3;\n CONTROL_SEEK = 4;\n CONTROL_SKIP_NEXT = 5;\n CONTROL_SKIP_PREVIOUS = 6;\n}\n\nmessage SdkClientInit {\n ContentKind contentKind = 1;\n string catalogTrackId = 2;\n string internalTrackId = 3;\n string playlistCode = 4;\n string categoryQuery = 5;\n string listenerId = 6;\n string deviceType = 7;\n string countryCode = 8;\n string region = 9;\n string protocolVersion = 10;\n string gameContext = 11;\n}\n\nmessage SdkClientControl {\n SdkControlAction action = 1;\n uint32 positionMs = 2;\n}\n\nmessage SdkClientAnalytics {\n string eventType = 1;\n uint32 positionMs = 2;\n string extraJson = 3;\n}\n\nmessage SdkClientVoice {\n SdkVoiceAction action = 1;\n bytes audioData = 2;\n string mimeType = 3;\n uint32 sequence = 4;\n string listenerId = 5;\n string deviceType = 6;\n string gameContext = 7;\n}\n\nmessage SdkClientEnvelope {\n oneof payload {\n SdkClientInit init = 1;\n SdkClientControl control = 2;\n SdkClientAnalytics analytics = 3;\n SdkClientVoice voice = 4;\n }\n}\n\nmessage SdkServerInitAck {\n string sessionId = 1;\n string playbackUrl = 2;\n bool isHls = 3;\n uint32 heartbeatIntervalMs = 4;\n string contentSummary = 5;\n}\n\nmessage SdkServerVoiceAck {\n string status = 1;\n string transcript = 2;\n string playlistCode = 3;\n string playlistName = 4;\n}\n\nmessage SdkServerError {\n ErrorCode code = 1;\n string message = 2;\n}\n\nmessage SdkServerAdPayload {\n string adId = 1;\n string campaignId = 2;\n string playbackUrl = 3;\n bool isHls = 4;\n uint32 durationSeconds = 5;\n bool isSkippable = 6;\n uint32 skipAfterSeconds = 7;\n string ctaType = 8;\n string ctaValue = 9;\n string brandName = 10;\n string creativeName = 11;\n string companionBannerUrl = 12;\n string campaignName = 13;\n}\n\nmessage SdkServerVoiceAudio {\n bytes audioData = 1;\n string mimeType = 2;\n bool isFinal = 3;\n}\n\nmessage SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\n SdkServerAdPayload ad = 3;\n SdkServerVoiceAck voiceAck = 4;\n SdkServerVoiceAudio voiceAudio = 5;\n }\n}\n`;\n\nconst root = protobuf.parse(schema).root;\n\nexport const SdkClientEnvelope = root.lookupType('SdkClientEnvelope');\nexport const SdkServerEnvelope = root.lookupType('SdkServerEnvelope');\n\nexport enum ContentKind {\n UNSPECIFIED = 0,\n SONG = 1,\n PLAYLIST = 2,\n CATEGORY = 3,\n RADIO = 4,\n VOICE = 5,\n}\n\nexport enum SdkVoiceAction {\n VOICE_UNSPECIFIED = 0,\n VOICE_START = 1,\n VOICE_CHUNK = 2,\n VOICE_END = 3,\n}\n\nexport enum ErrorCode {\n UNSPECIFIED = 0,\n UNAUTHORIZED = 1,\n VALIDATION_ERROR = 2,\n NOT_FOUND = 3,\n PROCESSING = 4,\n SERVICE_UNAVAILABLE = 5,\n BAD_PROTOBUF = 6,\n}\n\nexport enum SdkControlAction {\n CONTROL_UNSPECIFIED = 0,\n CONTROL_PLAY = 1,\n CONTROL_PAUSE = 2,\n CONTROL_STOP = 3,\n CONTROL_SEEK = 4,\n CONTROL_SKIP_NEXT = 5,\n CONTROL_SKIP_PREVIOUS = 6,\n}\n","import { SdkClientEnvelope, SdkServerEnvelope } from '../proto/sdk-streaming';\n\nexport class ProtocolCodec {\n /**\n * Encodes a client envelope into a binary payload.\n */\n static encodeClientEnvelope(payload: any): Uint8Array {\n const message = SdkClientEnvelope.create(payload);\n return SdkClientEnvelope.encode(message).finish();\n }\n\n /**\n * Decodes a binary payload into a server envelope.\n */\n static decodeServerEnvelope(data: Uint8Array): any {\n const decoded = SdkServerEnvelope.decode(data);\n return SdkServerEnvelope.toObject(decoded, {\n enums: String,\n longs: String,\n bytes: String,\n defaults: true,\n oneofs: true,\n });\n }\n}\n","type Handler = (...args: any[]) => void;\n\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Handler>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: Events[K]): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n }\n\n off<K extends keyof Events>(event: K, handler: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n once<K extends keyof Events>(event: K, handler: Events[K]): void {\n const onceHandler = ((...args: any[]) => {\n handler(...args);\n this.off(event, onceHandler as Events[K]);\n }) as Events[K];\n this.on(event, onceHandler);\n }\n\n protected emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (set) {\n set.forEach((handler) => handler(...args));\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","let debugEnabled = false;\n\nexport function setSynxedDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\nexport function synxedDebug(...args: unknown[]): void {\n if (debugEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Synxed]', ...args);\n }\n}\n\nexport function synxedWarn(...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn('[Synxed]', ...args);\n}\n","import { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (reason: string) => void;\n error: (error: any) => void;\n message: (payload: any) => void;\n}\n\nexport function buildSdkWebSocketUrl(serverUrl: string, apiKey: string): string {\n const normalized = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n const wsBase = normalized.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:');\n const url = new URL(`${wsBase}/sdk`);\n url.searchParams.set('apiKey', apiKey);\n return url.toString();\n}\n\nexport class TransportManager extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private connectPromise: Promise<void> | null = null;\n\n connect(apiKey: string, serverUrl: string): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n const url = buildSdkWebSocketUrl(serverUrl, apiKey);\n synxedDebug('Opening native WebSocket', url.replace(/apiKey=[^&]+/, 'apiKey=***'));\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n this.ws.onopen = () => {\n this.connectPromise = null;\n this.emit('connected');\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason || `code ${event.code}`;\n this.ws = null;\n this.connectPromise = null;\n this.emit('disconnected', reason);\n };\n\n this.ws.onerror = () => {\n this.emit('error', new Error('WebSocket connection error'));\n };\n\n this.ws.onmessage = (event) => {\n try {\n const { data } = event;\n if (!(data instanceof ArrayBuffer)) return;\n\n const payload = ProtocolCodec.decodeServerEnvelope(new Uint8Array(data));\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n };\n }\n\n async waitForConnection(): Promise<void> {\n synxedDebug('Waiting for connection…');\n if (this.ws?.readyState === WebSocket.OPEN) {\n synxedDebug('Already connected');\n return;\n }\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized. Call connect() first.');\n }\n\n if (this.connectPromise) return this.connectPromise;\n\n this.connectPromise = new Promise((resolve, reject) => {\n const ws = this.ws!;\n\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n synxedDebug('WebSocket connected');\n cleanup();\n resolve();\n };\n\n const onError = () => {\n synxedWarn('WebSocket connection error');\n cleanup();\n reject(new Error('WebSocket connection failed'));\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('WebSocket closed before connection was established'));\n };\n\n const cleanup = () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n });\n\n return this.connectPromise;\n }\n\n disconnect(): void {\n if (!this.ws) return;\n\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n this.connectPromise = null;\n }\n\n sendInit(params: any): void {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n synxedDebug('Sending init packet', params);\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ init: params }));\n }\n\n sendControl(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ control: params }));\n }\n\n sendAnalytics(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ analytics: params }));\n }\n\n sendVoice(params: {\n action: number;\n audioData?: Uint8Array;\n mimeType?: string;\n sequence?: number;\n listenerId?: string;\n deviceType?: string;\n gameContext?: string;\n }): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ voice: params }));\n }\n\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private sendBytes(bytes: Uint8Array): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket not connected');\n }\n this.ws.send(bytes);\n }\n}\n","import { Howl } from 'howler';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface AudioEvents {\n playing: () => void;\n paused: () => void;\n stopped: () => void;\n ended: () => void;\n loading: () => void;\n loaded: () => void;\n error: (error: any) => void;\n timeupdate: (data: { currentTime: number; duration: number }) => void;\n}\n\nexport class AudioEngine extends EventEmitter<AudioEvents> {\n private howl: Howl | null = null;\n private hls: any = null;\n private audioEl: HTMLAudioElement | null = null;\n private updateTimer: number | null = null;\n private loadGeneration = 0;\n\n constructor() {\n super();\n }\n\n /**\n * Loads a track URL. Waits until HLS manifest is parsed (or Howler onload) before resolving.\n */\n async load(url: string, isHls: boolean): Promise<void> {\n const generation = ++this.loadGeneration;\n this.teardownPlayback();\n this.emit('loading');\n\n synxedDebug('AudioEngine loading', { url, isHls });\n\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n if (isHls && !isSafari) {\n try {\n const { default: Hls } = await import('hls.js');\n if (Hls.isSupported()) {\n synxedDebug('Using Hls.js for playback');\n\n const hls = new Hls({\n xhrSetup: (xhr) => {\n xhr.setRequestHeader('ngrok-skip-browser-warning', 'true');\n },\n });\n const audioEl = new Audio();\n\n return new Promise<void>((resolve, reject) => {\n const isStale = () => generation !== this.loadGeneration;\n\n const onPlay = () => {\n if (isStale()) return;\n this.emit('playing');\n this.startTimeUpdateLoop();\n };\n const onPause = () => {\n if (isStale()) return;\n this.emit('paused');\n this.stopTimeUpdateLoop();\n };\n const onEnded = () => {\n if (isStale()) return;\n this.emit('ended');\n this.stopTimeUpdateLoop();\n };\n const onLoadedMeta = () => {\n if (isStale()) return;\n this.emit('loaded');\n };\n const onElementError = () => {\n if (isStale()) return;\n synxedWarn('HLS audio element error');\n this.emit('error', new Error('HLS playback failed'));\n };\n\n audioEl.addEventListener('play', onPlay);\n audioEl.addEventListener('pause', onPause);\n audioEl.addEventListener('ended', onEnded);\n audioEl.addEventListener('loadedmetadata', onLoadedMeta);\n audioEl.addEventListener('error', onElementError);\n\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n if (isStale()) return;\n this.emit('loaded');\n resolve();\n });\n\n hls.on(Hls.Events.ERROR, (_event: unknown, data: { fatal?: boolean }) => {\n if (isStale()) return;\n if (data.fatal) {\n synxedWarn('Fatal HLS error', data);\n reject(data);\n }\n });\n\n hls.loadSource(url);\n hls.attachMedia(audioEl);\n\n this.hls = hls;\n this.audioEl = audioEl;\n });\n }\n } catch (e) {\n synxedWarn('hls.js not available, falling back to native playback', e);\n }\n }\n\n return new Promise<void>((resolve, reject) => {\n const isStale = () => generation !== this.loadGeneration;\n\n this.howl = new Howl({\n src: [url],\n html5: true,\n format: isHls ? ['m3u8'] : undefined,\n onload: () => {\n if (isStale()) return;\n synxedDebug('AudioEngine loaded');\n this.emit('loaded');\n resolve();\n },\n onloaderror: (_id, err) => {\n if (isStale()) return;\n synxedWarn('AudioEngine load error', err);\n reject(err);\n },\n onplay: () => {\n if (isStale()) return;\n this.emit('playing');\n this.startTimeUpdateLoop();\n },\n onpause: () => {\n if (isStale()) return;\n this.emit('paused');\n this.stopTimeUpdateLoop();\n },\n onstop: () => {\n if (isStale()) return;\n this.emit('stopped');\n this.stopTimeUpdateLoop();\n },\n onend: () => {\n if (isStale()) return;\n this.emit('ended');\n this.stopTimeUpdateLoop();\n },\n });\n });\n }\n\n play(): void {\n if (this.audioEl) {\n this.audioEl.play().catch((e) => synxedWarn('Play failed', e));\n } else {\n this.howl?.play();\n }\n }\n\n pause(): void {\n if (this.audioEl) {\n this.audioEl.pause();\n } else {\n this.howl?.pause();\n }\n }\n\n stop(): void {\n this.loadGeneration += 1;\n this.teardownPlayback();\n this.emit('stopped');\n }\n\n seek(ms: number): void {\n if (this.audioEl) {\n this.audioEl.currentTime = ms / 1000;\n } else {\n this.howl?.seek(ms / 1000);\n }\n }\n\n setVolume(volume: number): void {\n if (this.audioEl) {\n this.audioEl.volume = volume;\n }\n if (this.howl) {\n this.howl.volume(volume);\n }\n }\n\n get duration(): number {\n if (this.audioEl) return this.audioEl.duration * 1000;\n return (this.howl?.duration() || 0) * 1000;\n }\n\n get currentTime(): number {\n if (this.audioEl) return this.audioEl.currentTime * 1000;\n return ((this.howl?.seek() as number) || 0) * 1000;\n }\n\n private teardownPlayback(): void {\n if (this.hls) {\n try {\n this.hls.destroy();\n } catch {\n // ignore teardown races\n }\n this.hls = null;\n }\n if (this.audioEl) {\n this.audioEl.pause();\n this.audioEl.removeAttribute('src');\n this.audioEl.load();\n this.audioEl = null;\n }\n if (this.howl) {\n this.howl.stop();\n this.howl.unload();\n this.howl = null;\n }\n this.stopTimeUpdateLoop();\n }\n\n private startTimeUpdateLoop(): void {\n this.stopTimeUpdateLoop();\n const update = () => {\n const isPlaying = this.audioEl ? !this.audioEl.paused : this.howl?.playing();\n if (isPlaying) {\n this.emit('timeupdate', {\n currentTime: this.currentTime,\n duration: this.duration,\n });\n this.updateTimer = requestAnimationFrame(update);\n }\n };\n this.updateTimer = requestAnimationFrame(update);\n }\n\n private stopTimeUpdateLoop(): void {\n if (this.updateTimer !== null) {\n cancelAnimationFrame(this.updateTimer);\n this.updateTimer = null;\n }\n }\n}\n","import { EventEmitter } from '../core/EventEmitter';\nimport { TrackInfo } from '../types';\n\nexport interface PlaylistEvents {\n trackChanged: (track: TrackInfo) => void;\n queueUpdated: (tracks: TrackInfo[]) => void;\n}\n\nexport class PlaylistManager extends EventEmitter<PlaylistEvents> {\n private queue: TrackInfo[] = [];\n private currentIndex: number = -1;\n\n constructor() {\n super();\n }\n\n setQueue(tracks: TrackInfo[], currentIndex?: number): void {\n this.queue = tracks;\n this.currentIndex =\n typeof currentIndex === 'number' &&\n currentIndex >= 0 &&\n currentIndex < tracks.length\n ? currentIndex\n : tracks.length > 0\n ? 0\n : -1;\n this.emit('queueUpdated', this.queue);\n if (this.getCurrentTrack()) {\n this.emit('trackChanged', this.getCurrentTrack()!);\n }\n }\n\n getCurrentTrack(): TrackInfo | null {\n if (this.currentIndex >= 0 && this.currentIndex < this.queue.length) {\n return this.queue[this.currentIndex];\n }\n return null;\n }\n\n next(): TrackInfo | null {\n if (this.currentIndex < this.queue.length - 1) {\n this.currentIndex++;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n previous(): TrackInfo | null {\n if (this.currentIndex > 0) {\n this.currentIndex--;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n skipTo(index: number): TrackInfo | null {\n if (index >= 0 && index < this.queue.length) {\n this.currentIndex = index;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n reset(): void {\n this.queue = [];\n this.currentIndex = -1;\n this.emit('queueUpdated', []);\n }\n\n get hasNext(): boolean {\n return this.currentIndex < this.queue.length - 1;\n }\n\n get hasPrevious(): boolean {\n return this.currentIndex > 0;\n }\n\n get queueSnapshot(): TrackInfo[] {\n return [...this.queue];\n }\n\n get currentIndexSnapshot(): number {\n return this.currentIndex;\n }\n}\n","export class SynxedError extends Error {\n constructor(message: string, public code?: string) {\n super(message);\n this.name = 'SynxedError';\n }\n}\n\nexport class SynxedConnectionError extends SynxedError {\n constructor(message: string) {\n super(message);\n this.name = 'SynxedConnectionError';\n }\n}\n\nexport class SynxedPlaybackError extends SynxedError {\n constructor(error: any) {\n super(typeof error === 'string' ? error : 'Playback failed');\n this.name = 'SynxedPlaybackError';\n }\n}\n\nexport class SynxedProtocolError extends SynxedError {\n constructor(message: string) {\n super(message);\n this.name = 'SynxedProtocolError';\n }\n}\n","import { ContentKind } from '../proto/sdk-streaming';\nimport type { TrackInfo } from '../types';\n\nexport interface NormalizedInitAck {\n sessionId: string;\n playbackUrl: string;\n isHls: boolean;\n heartbeatIntervalMs: number;\n contentSummary?: string;\n}\n\nexport interface ParsedContentSummary {\n tracks: TrackInfo[];\n currentIndex: number;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string | undefined {\n for (const key of keys) {\n const v = obj[key];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return undefined;\n}\n\nfunction readNumber(obj: Record<string, unknown>, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const v = obj[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string' && v !== '' && !Number.isNaN(Number(v))) return Number(v);\n }\n return undefined;\n}\n\n/** Normalizes initAck from protobuf `toObject` (camelCase or snake_case). */\nexport function normalizeInitAck(payload: Record<string, unknown>): NormalizedInitAck | null {\n const raw = payload.initAck ?? payload.init_ack;\n if (!raw || typeof raw !== 'object') return null;\n\n const ack = raw as Record<string, unknown>;\n const playbackUrl = readString(ack, 'playbackUrl', 'playback_url');\n if (!playbackUrl) return null;\n\n return {\n sessionId: readString(ack, 'sessionId', 'session_id') ?? '',\n playbackUrl,\n isHls: Boolean(ack.isHls ?? ack.is_hls),\n heartbeatIntervalMs: readNumber(ack, 'heartbeatIntervalMs', 'heartbeat_interval_ms') ?? 0,\n contentSummary: readString(ack, 'contentSummary', 'content_summary'),\n };\n}\n\nfunction normalizeTrack(item: unknown): TrackInfo | null {\n if (!item || typeof item !== 'object') return null;\n const t = item as Record<string, unknown>;\n const id = t.id;\n if (typeof id !== 'string' || !id.trim()) return null;\n\n const kind: TrackInfo['kind'] = t.kind === 'internal' ? 'internal' : 'catalog';\n const albumArt = t.albumArt ?? t.album_art;\n\n return {\n id: id.trim(),\n kind,\n title: typeof t.title === 'string' ? t.title : undefined,\n artist: typeof t.artist === 'string' ? t.artist : undefined,\n duration: typeof t.duration === 'number' ? t.duration : undefined,\n albumArt: typeof albumArt === 'string' ? albumArt : undefined,\n };\n}\n\n/**\n * Parses `contentSummary` JSON from initAck into a playlist queue.\n * Returns `null` when summary is absent or has no usable queue (playback may still continue).\n */\nexport function parseContentSummary(\n contentSummary: string | undefined,\n contentKind: ContentKind,\n): ParsedContentSummary | null {\n if (!contentSummary?.trim()) return null;\n\n let summary: unknown;\n try {\n summary = JSON.parse(contentSummary);\n } catch {\n return null;\n }\n\n if (!summary || typeof summary !== 'object') return null;\n const s = summary as Record<string, unknown>;\n\n const type = s.type;\n if (type === 'live_radio' || contentKind === ContentKind.RADIO) {\n const station =\n typeof s.station === 'string' && s.station.trim() ? s.station.trim() : 'Synxed Radio';\n return {\n tracks: [{ id: 'synxed-radio', kind: 'catalog', title: station, artist: '' }],\n currentIndex: 0,\n };\n }\n\n const tracksRaw = s.tracks;\n if (!Array.isArray(tracksRaw) || tracksRaw.length === 0) return null;\n\n const tracks: TrackInfo[] = [];\n for (const item of tracksRaw) {\n const track = normalizeTrack(item);\n if (track) tracks.push(track);\n }\n if (tracks.length === 0) return null;\n\n const rawIndex =\n typeof s.currentIndex === 'number'\n ? s.currentIndex\n : typeof s.current_index === 'number'\n ? s.current_index\n : 0;\n\n const currentIndex = Math.max(0, Math.min(Math.floor(rawIndex), tracks.length - 1));\n return { tracks, currentIndex };\n}\n","export interface NormalizedAdPayload {\n adId: string;\n campaignId: string;\n playbackUrl: string;\n isHls: boolean;\n durationSeconds: number;\n isSkippable: boolean;\n skipAfterSeconds: number;\n ctaType: string;\n ctaValue: string;\n brandName: string;\n creativeName: string;\n companionBannerUrl: string;\n campaignName: string;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'string') return value;\n }\n return '';\n}\n\nfunction readBool(obj: Record<string, unknown>, ...keys: string[]): boolean {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'boolean') return value;\n }\n return false;\n}\n\nfunction readNumber(obj: Record<string, unknown>, ...keys: string[]): number {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim()) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n }\n return 0;\n}\n\nexport function normalizeAdPayload(\n payload: Record<string, unknown>,\n): NormalizedAdPayload | null {\n const raw = payload.ad;\n if (!raw || typeof raw !== 'object') return null;\n\n const ad = raw as Record<string, unknown>;\n const playbackUrl = readString(ad, 'playbackUrl', 'playback_url');\n if (!playbackUrl) return null;\n\n return {\n adId: readString(ad, 'adId', 'ad_id'),\n campaignId: readString(ad, 'campaignId', 'campaign_id'),\n playbackUrl,\n isHls: readBool(ad, 'isHls', 'is_hls') || playbackUrl.includes('.m3u8'),\n durationSeconds: readNumber(ad, 'durationSeconds', 'duration_seconds') || 15,\n isSkippable: readBool(ad, 'isSkippable', 'is_skippable'),\n skipAfterSeconds: readNumber(ad, 'skipAfterSeconds', 'skip_after_seconds'),\n ctaType: readString(ad, 'ctaType', 'cta_type'),\n ctaValue: readString(ad, 'ctaValue', 'cta_value'),\n brandName: readString(ad, 'brandName', 'brand_name'),\n creativeName: readString(ad, 'creativeName', 'creative_name'),\n companionBannerUrl: readString(ad, 'companionBannerUrl', 'companion_banner_url'),\n campaignName: readString(ad, 'campaignName', 'campaign_name'),\n };\n}\n","export const VOICE_CAPTURE_MIME = \"audio/pcm;rate=16000\";\r\nexport const VOICE_RESPONSE_MIME = \"audio/pcm;rate=24000\";\r\n\r\nexport function parsePcmSampleRate(mimeType: string, fallback: number): number {\r\n const match = /rate=(\\d+)/i.exec(mimeType);\r\n if (!match) return fallback;\r\n const rate = Number(match[1]);\r\n return Number.isFinite(rate) && rate > 0 ? rate : fallback;\r\n}\r\n","import { VOICE_RESPONSE_MIME } from \"../voice/voiceAudioFormats\";\n\nexport interface NormalizedVoiceAck {\n status: string;\n transcript?: string;\n playlistCode?: string;\n playlistName?: string;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\") return value;\n }\n return \"\";\n}\n\nexport function normalizeVoiceAck(\n payload: Record<string, unknown>,\n): NormalizedVoiceAck | null {\n const raw = payload.voiceAck ?? payload.voice_ack;\n if (!raw || typeof raw !== \"object\") return null;\n\n const ack = raw as Record<string, unknown>;\n const status = readString(ack, \"status\");\n if (!status) return null;\n\n return {\n status,\n transcript: readString(ack, \"transcript\") || undefined,\n playlistCode: readString(ack, \"playlistCode\", \"playlist_code\") || undefined,\n playlistName: readString(ack, \"playlistName\", \"playlist_name\") || undefined,\n };\n}\n\nexport interface NormalizedVoiceAudio {\n audioData: Uint8Array;\n mimeType: string;\n isFinal: boolean;\n}\n\nexport function normalizeVoiceAudio(\n payload: Record<string, unknown>,\n): NormalizedVoiceAudio | null {\n const raw = payload.voiceAudio ?? payload.voice_audio;\n if (!raw || typeof raw !== \"object\") return null;\n\n const audio = raw as Record<string, unknown>;\n const audioData = audio.audioData ?? audio.audio_data;\n const mimeType =\n readString(audio, \"mimeType\", \"mime_type\") || VOICE_RESPONSE_MIME;\n const isFinal = Boolean(audio.isFinal ?? audio.is_final);\n\n let finalAudioData: Uint8Array;\n\n if (typeof audioData === \"string\") {\n const binaryString = atob(audioData);\n const len = binaryString.length;\n finalAudioData = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n finalAudioData[i] = binaryString.charCodeAt(i);\n }\n } else if (audioData instanceof Uint8Array) {\n finalAudioData = audioData;\n } else {\n return null;\n }\n\n return {\n audioData: finalAudioData,\n mimeType,\n isFinal,\n };\n}\n","import { synxedWarn } from \"../core/debug\";\nimport {\n parsePcmSampleRate,\n VOICE_RESPONSE_MIME,\n} from \"./voiceAudioFormats\";\n\n/**\n * High-performance streaming PCM player for AI voice responses.\n * Buffers and schedules Int16 PCM chunks seamlessly using the Web Audio API.\n */\nexport class VoiceResponsePlayer {\n private audioContext: AudioContext | null = null;\n private nextStartTime = 0;\n private defaultSampleRate = parsePcmSampleRate(VOICE_RESPONSE_MIME, 24000);\n\n private initContext(sampleRate: number) {\n if (!this.audioContext) {\n this.audioContext = new (window.AudioContext ||\n (window as any).webkitAudioContext)({\n sampleRate,\n });\n this.nextStartTime = this.audioContext.currentTime;\n }\n }\n\n /**\n * Enqueues a chunk of raw 16-bit PCM data to be played seamlessly.\n */\n public enqueueChunk(\n pcmData: Uint8Array,\n mimeType = VOICE_RESPONSE_MIME,\n ): void {\n try {\n const sampleRate = parsePcmSampleRate(mimeType, this.defaultSampleRate);\n this.initContext(sampleRate);\n if (!this.audioContext) return;\n\n const int16 = new Int16Array(\n pcmData.buffer,\n pcmData.byteOffset,\n pcmData.byteLength / 2,\n );\n const float32 = new Float32Array(int16.length);\n for (let i = 0; i < int16.length; i++) {\n float32[i] = int16[i] / 32768.0;\n }\n\n const audioBuffer = this.audioContext.createBuffer(\n 1,\n float32.length,\n sampleRate,\n );\n audioBuffer.getChannelData(0).set(float32);\n\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n const currentTime = this.audioContext.currentTime;\n\n if (this.nextStartTime < currentTime) {\n this.nextStartTime = currentTime + 0.05;\n }\n\n source.start(this.nextStartTime);\n this.nextStartTime += audioBuffer.duration;\n } catch (err) {\n synxedWarn(\"VoiceResponsePlayer failed to enqueue chunk\", err);\n }\n }\n\n /**\n * Instantly halts playback and resets the streaming buffer state.\n */\n public stop(): void {\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n this.nextStartTime = 0;\n }\n}\n","import { EventEmitter } from \"../core/EventEmitter\";\nimport { synxedWarn } from \"../core/debug\";\nimport { VOICE_CAPTURE_MIME } from \"./voiceAudioFormats\";\n\nconst VAD_WEB_CDN =\n \"https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.29/dist/\";\nconst ONNX_CDN = \"https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/\";\n\nexport interface VoiceCaptureEvents {\n chunk: (data: Uint8Array, sequence: number) => void;\n error: (error: Error) => void;\n speechStart: () => void;\n speechEnd: () => void;\n}\n\nexport interface VoiceCaptureOptions {\n maxDurationMs?: number;\n vadBaseAssetPath?: string;\n onnxWasmBasePath?: string;\n}\n\n/**\n * Captures microphone audio using Silero VAD natively.\n * Waits for the user to finish talking, then emits the complete audio segment.\n */\nexport class VoiceCaptureManager extends EventEmitter<VoiceCaptureEvents> {\n private capturing = false;\n private mimeType = VOICE_CAPTURE_MIME;\n private micVad: {\n pause: () => void;\n destroy: () => void;\n start: () => void;\n } | null = null;\n private speechEndEmitted = false;\n\n get isCapturing(): boolean {\n return this.capturing;\n }\n\n public async preloadModels(options: VoiceCaptureOptions = {}): Promise<void> {\n setTimeout(async () => {\n try {\n const { utils } = await import(\"@ricky0123/vad-web\");\n const basePath = options.vadBaseAssetPath ?? VAD_WEB_CDN;\n fetch(`${basePath}silero_vad_legacy.onnx`).catch(() => {});\n fetch(`${basePath}vad.worklet.bundle.min.js`).catch(() => {});\n } catch (err) {\n synxedWarn(\"Failed to silently preload VAD models\", err);\n }\n }, 5000);\n }\n\n async start(options: VoiceCaptureOptions = {}): Promise<string> {\n if (this.capturing) return this.mimeType;\n this.speechEndEmitted = false;\n this.capturing = true;\n\n try {\n const { MicVAD } = await import(\"@ricky0123/vad-web\");\n\n let sequence = 0;\n\n this.micVad = await MicVAD.new({\n baseAssetPath: options.vadBaseAssetPath ?? VAD_WEB_CDN,\n onnxWASMBasePath: options.onnxWasmBasePath ?? ONNX_CDN,\n\n positiveSpeechThreshold: 0.5,\n negativeSpeechThreshold: 0.35,\n redemptionMs: 500,\n minSpeechMs: 250,\n\n onFrameProcessed: (probabilities: any, frame: Float32Array) => {\n if (!this.capturing || this.speechEndEmitted) return;\n const int16 = new Int16Array(frame.length);\n for (let i = 0; i < frame.length; i++) {\n let s = Math.max(-1, Math.min(1, frame[i]));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const pcmData = new Uint8Array(int16.buffer);\n sequence++;\n this.emit(\"chunk\", pcmData, sequence);\n },\n\n onSpeechStart: () => {\n if (!this.capturing) return;\n this.emit(\"speechStart\");\n },\n\n onSpeechEnd: () => {\n if (!this.capturing || this.speechEndEmitted) return;\n this.speechEndEmitted = true;\n this.emit(\"speechEnd\");\n },\n });\n\n this.micVad.start();\n } catch (err) {\n this.capturing = false;\n this.emit(\"error\", new Error(`Failed to init VAD: ${err}`));\n }\n\n return this.mimeType;\n }\n\n async stop(): Promise<void> {\n this.cancel();\n }\n\n cancel(): void {\n this.capturing = false;\n if (this.micVad) {\n try {\n this.micVad.pause();\n } catch (e) {}\n try {\n this.micVad.destroy();\n } catch (e) {}\n this.micVad = null;\n }\n }\n}\n","import { TransportManager } from \"../transport/TransportManager\";\nimport { AudioEngine } from \"../audio/AudioEngine\";\nimport { PlaylistManager } from \"../playlist/PlaylistManager\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { ContentKind, SdkControlAction, SdkVoiceAction } from \"../proto/sdk-streaming\";\nimport {\n SynxedConfig,\n PlayerState,\n PlaySongOptions,\n PlayPlaylistOptions,\n PlayRadioOptions,\n SynxedEvents,\n TrackInfo,\n VoiceState,\n VoiceHoldOptions,\n VoiceResult,\n AdSkipState,\n} from \"../types\";\nimport {\n SynxedError,\n SynxedPlaybackError,\n SynxedConnectionError,\n} from \"./errors\";\nimport { normalizeInitAck, parseContentSummary } from \"./contentSummary\";\nimport { normalizeAdPayload } from \"./adPayload\";\nimport { normalizeVoiceAck, normalizeVoiceAudio } from \"./voicePayload\";\nimport { VoiceResponsePlayer } from \"../voice/VoiceResponsePlayer\";\nimport { VoiceCaptureManager } from \"../voice/VoiceCaptureManager\";\nimport { setSynxedDebug, synxedDebug, synxedWarn } from \"./debug\";\nimport type { AdInfo } from \"../types\";\n\nexport class SynxedPlayer extends EventEmitter<SynxedEvents> {\n private transport: TransportManager;\n private audio: AudioEngine;\n private playlist: PlaylistManager;\n private voiceCapture: VoiceCaptureManager;\n private voiceResponsePlayer: VoiceResponsePlayer;\n private config: SynxedConfig;\n private status: PlayerState[\"status\"] = \"idle\";\n private volume = 0.8;\n private activeContentKind: ContentKind = ContentKind.UNSPECIFIED;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private adPlaying = false;\n private _currentAd: AdInfo | null = null;\n private _voiceState: VoiceState = \"idle\";\n private voiceMimeType = \"audio/webm\";\n private voiceListenerId: string | undefined;\n private pendingPlaybackLoad: Promise<void> | null = null;\n private voiceAutoEndOnSilence = true;\n private pausedForVoice = false;\n\n constructor(config: SynxedConfig) {\n super();\n this.config = config;\n setSynxedDebug(Boolean(config.debug));\n this.transport = new TransportManager();\n this.audio = new AudioEngine();\n this.playlist = new PlaylistManager();\n this.voiceCapture = new VoiceCaptureManager();\n this.voiceResponsePlayer = new VoiceResponsePlayer();\n\n this.setupListeners();\n\n // Silently prefetch the AI voice models in the background\n void this.voiceCapture.preloadModels(this.config.voice);\n\n if (config.autoConnect) {\n this.connect();\n }\n }\n\n get currentTrack(): TrackInfo | null {\n return this.playlist.getCurrentTrack();\n }\n\n /** Active playback init kind from the last `play*` call (RADIO, PLAYLIST, SONG, …). */\n get contentKind(): ContentKind {\n return this.activeContentKind;\n }\n\n get currentAd(): AdInfo | null {\n return this._currentAd;\n }\n\n get isAdPlaying(): boolean {\n return this.adPlaying;\n }\n\n /** True when a skippable ad has played for at least `skipAfterSeconds` (default 5s). */\n canSkipAd(): boolean {\n if (!this.adPlaying || !this._currentAd?.isSkippable) return false;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n return positionMs >= this._currentAd.skipAfterSeconds * 1000;\n }\n\n /** Seconds until skip unlocks; `0` when skip is available; `null` when not in a skippable ad. */\n getAdSkipCountdownSeconds(): number | null {\n if (!this.adPlaying || !this._currentAd?.isSkippable) return null;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n const requiredMs = this._currentAd.skipAfterSeconds * 1000;\n if (positionMs >= requiredMs) return 0;\n return Math.ceil((requiredMs - positionMs) / 1000);\n }\n\n get voiceState(): VoiceState {\n return this._voiceState;\n }\n\n private controlPositionMs(): number {\n if (this.activeContentKind === ContentKind.RADIO) return 0;\n return this.positionMsForAnalytics();\n }\n\n private setupListeners(): void {\n this.transport.on(\"connected\", () => this.emit(\"connected\"));\n this.transport.on(\"disconnected\", (reason) =>\n this.emit(\"disconnected\", reason),\n );\n this.transport.on(\"error\", (error) =>\n this.emit(\"error\", new SynxedConnectionError(error.message)),\n );\n this.transport.on(\"message\", (payload) =>\n this.handleServerMessage(payload),\n );\n\n this.audio.on(\"playing\", () => this.updateStatus(\"playing\"));\n this.audio.on(\"paused\", () => this.updateStatus(\"paused\"));\n this.audio.on(\"stopped\", () => {\n if (!this.adPlaying && this._voiceState === \"idle\") {\n this.updateStatus(\"idle\");\n }\n });\n this.audio.on(\"loading\", () => this.updateStatus(\"loading\"));\n this.audio.on(\"error\", (error) => {\n if (this.adPlaying) {\n synxedWarn(\"Ad playback error — waiting for next track\", error);\n return;\n }\n this.emit(\"error\", new SynxedPlaybackError(error));\n });\n this.audio.on(\"timeupdate\", (time) => {\n this.emit(\"timeUpdate\", time);\n if (this.adPlaying && this._currentAd) {\n this.emitAdSkipUpdate(time.currentTime);\n }\n });\n this.audio.on(\"ended\", () => this.handleTrackEnded());\n\n this.playlist.on(\"trackChanged\", (track) =>\n this.emit(\"trackChange\", track),\n );\n this.playlist.on(\"queueUpdated\", (tracks) =>\n this.emit(\"queueUpdated\", tracks),\n );\n\n this.voiceCapture.on(\"chunk\", (chunk, sequence) => {\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CHUNK,\n audioData: chunk,\n mimeType: this.voiceMimeType,\n sequence,\n listenerId: this.voiceListenerId,\n deviceType: this.config.deviceType,\n gameContext: this.config.gameContext,\n });\n });\n this.voiceCapture.on(\"error\", (error) => {\n this.setVoiceState(\"error\");\n this.emit(\"error\", new SynxedError(error.message, \"VOICE_CAPTURE_FAILED\"));\n });\n this.voiceCapture.on(\"speechStart\", () => {\n this.emit(\"voiceSpeechStart\");\n });\n this.voiceCapture.on(\"speechEnd\", () => {\n this.emit(\"voiceSpeechEnd\");\n if (this.voiceAutoEndOnSilence && this._voiceState === \"listening\") {\n void this.endVoiceHold();\n }\n });\n }\n\n private resolveVoiceOptions(\n options: VoiceHoldOptions = {},\n ): VoiceHoldOptions {\n return { ...this.config.voice, ...options };\n }\n\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\n }\n\n private buildInitExtras(): { gameContext?: string; deviceType?: string } {\n const extras: { gameContext?: string; deviceType?: string } = {};\n if (this.config.gameContext?.trim()) {\n extras.gameContext = this.config.gameContext.trim();\n }\n if (this.config.deviceType?.trim()) {\n extras.deviceType = this.config.deviceType.trim();\n }\n return extras;\n }\n\n async playSong(options: PlaySongOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.SONG;\n this.transport.sendInit({\n contentKind: ContentKind.SONG,\n catalogTrackId: options.catalogTrackId,\n internalTrackId: options.internalTrackId,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playPlaylist(options: PlayPlaylistOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.PLAYLIST;\n this.transport.sendInit({\n contentKind: ContentKind.PLAYLIST,\n playlistCode: options.playlistCode,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playRadio(options: PlayRadioOptions = {}): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.RADIO;\n this.transport.sendInit({\n contentKind: ContentKind.RADIO,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n /**\n * Press-and-hold the DJ avatar (or call manually): start mic capture and stream chunks.\n * Ends automatically when the user stops talking (`voiceSpeechEnd`) or call `endVoiceHold()`.\n */\n async beginVoiceHold(options: VoiceHoldOptions = {}): Promise<void> {\n if (\n this._voiceState === \"listening\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n return;\n }\n\n const voiceOpts = this.resolveVoiceOptions(options);\n this.voiceAutoEndOnSilence = voiceOpts.autoEndOnSilence !== false;\n\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.voiceListenerId = voiceOpts.listenerId?.trim() || undefined;\n\n this.pausedForVoice = this.status === \"playing\";\n if (this.pausedForVoice) {\n this.pause();\n }\n this.voiceResponsePlayer.stop();\n\n this.voiceMimeType = await this.voiceCapture.start({\n maxDurationMs: voiceOpts.maxDurationMs,\n });\n\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_START,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n this.setVoiceState(\"listening\");\n }\n\n /**\n * Release press-and-hold: flush final audio chunk and request playlist generation.\n */\n async endVoiceHold(): Promise<void> {\n if (this._voiceState !== \"listening\") return;\n\n await this.voiceCapture.stop();\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_END,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n this.setVoiceState(\"processing\");\n }\n\n /** Cancel an in-progress voice hold without sending audio to the server. */\n cancelVoiceHold(): void {\n if (this._voiceState !== \"listening\") return;\n this.voiceCapture.cancel();\n this.setVoiceState(\"idle\");\n }\n\n /**\n * Close the voice UI: cancel recording if active and resume playback if it was\n * paused for voice.\n */\n dismissVoiceAndResume(): void {\n if (this._voiceState === \"listening\") {\n this.cancelVoiceHold();\n }\n if (this.pausedForVoice) {\n this.resume();\n this.pausedForVoice = false;\n }\n }\n\n get isVoiceUiActive(): boolean {\n return (\n this._voiceState === \"listening\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n );\n }\n\n pause(): void {\n this.audio.pause();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_PAUSE,\n positionMs: this.controlPositionMs(),\n });\n }\n\n resume(): void {\n this.audio.play();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_PLAY,\n positionMs: this.controlPositionMs(),\n });\n }\n\n stop(): void {\n this.audio.stop();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_STOP,\n positionMs: this.controlPositionMs(),\n });\n }\n\n skip(): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n if (this.adPlaying) {\n this.skipAd();\n return;\n }\n if (this.playlist.queueSnapshot.length > 1) {\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SKIP_NEXT,\n positionMs: this.controlPositionMs(),\n });\n this.updateStatus(\"loading\");\n return;\n }\n\n const nextTrack = this.playlist.next();\n if (nextTrack) {\n this.playSong(\n nextTrack.kind === \"internal\"\n ? { internalTrackId: nextTrack.id }\n : { catalogTrackId: nextTrack.id },\n );\n }\n }\n\n previous(): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n if (this.playlist.queueSnapshot.length > 1) {\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SKIP_PREVIOUS,\n positionMs: this.controlPositionMs(),\n });\n this.updateStatus(\"loading\");\n return;\n }\n\n const prevTrack = this.playlist.previous();\n if (prevTrack) {\n this.playSong(\n prevTrack.kind === \"internal\"\n ? { internalTrackId: prevTrack.id }\n : { catalogTrackId: prevTrack.id },\n );\n }\n }\n\n skipTo(index: number): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n const track = this.playlist.skipTo(index);\n if (track) {\n this.playSong(\n track.kind === \"internal\"\n ? { internalTrackId: track.id }\n : { catalogTrackId: track.id },\n );\n }\n }\n\n seek(ms: number): void {\n if (this.activeContentKind === ContentKind.RADIO || this.adPlaying) return;\n this.audio.seek(ms);\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SEEK,\n positionMs: ms,\n });\n }\n\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n this.audio.setVolume(this.volume);\n }\n\n private positionMsForAnalytics(override?: number): number {\n if (typeof override === \"number\") {\n return Math.max(0, Math.min(0xffffffff, Math.floor(override)));\n }\n return Math.max(\n 0,\n Math.min(0xffffffff, Math.floor(this.audio.currentTime)),\n );\n }\n\n private emitAnalytics(\n eventType: string,\n positionMs?: number,\n extra?: unknown,\n ): void {\n this.transport.sendAnalytics({\n eventType,\n positionMs: this.positionMsForAnalytics(positionMs),\n extraJson: extra ? JSON.stringify(extra) : undefined,\n });\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private startHeartbeat(intervalMs: number): void {\n this.clearHeartbeat();\n const interval = Number(intervalMs);\n if (!interval || interval < 1000) return;\n\n this.heartbeatTimer = setInterval(() => {\n const pos =\n this.activeContentKind === ContentKind.RADIO\n ? 0\n : this.positionMsForAnalytics();\n this.emitAnalytics(\"heartbeat\", pos);\n }, interval);\n }\n\n private applyContentSummary(contentSummary: string | undefined): void {\n const parsed = parseContentSummary(contentSummary, this.activeContentKind);\n if (parsed) {\n this.playlist.setQueue(parsed.tracks, parsed.currentIndex);\n return;\n }\n\n if (!contentSummary?.trim()) return;\n\n synxedWarn(\"Could not parse contentSummary; queue metadata unavailable.\");\n }\n\n private emitAdSkipUpdate(positionMs: number): void {\n if (!this._currentAd) return;\n\n const requiredMs = this._currentAd.skipAfterSeconds * 1000;\n const canSkip = this._currentAd.isSkippable && positionMs >= requiredMs;\n const countdownSeconds = canSkip\n ? 0\n : Math.ceil((requiredMs - positionMs) / 1000);\n\n const state: AdSkipState = {\n ad: this._currentAd,\n canSkip,\n countdownSeconds,\n };\n this.emit(\"adSkipUpdate\", state);\n }\n\n private setVoiceState(state: VoiceState): void {\n this._voiceState = state;\n this.emit(\"voiceStateChange\", state);\n }\n\n private handleVoiceAck(ack: NonNullable<ReturnType<typeof normalizeVoiceAck>>): void {\n const status = ack.status;\n\n if (status === \"listening\") {\n this.setVoiceState(\"listening\");\n return;\n }\n\n if (status === \"processing\") {\n this.setVoiceState(\"processing\");\n return;\n }\n\n if (status === \"ready\") {\n this.activeContentKind = ContentKind.PLAYLIST;\n const result: VoiceResult = {\n status,\n transcript: ack.transcript,\n playlistCode: ack.playlistCode,\n playlistName: ack.playlistName,\n };\n this.setVoiceState(\"ready\");\n this.emit(\"voiceResult\", result);\n return;\n }\n\n this.emit(\"voiceResult\", {\n status,\n transcript: ack.transcript,\n playlistCode: ack.playlistCode,\n playlistName: ack.playlistName,\n });\n }\n\n private async handleServerMessage(\n payload: Record<string, unknown>,\n ): Promise<void> {\n synxedDebug(\"Received server message\", payload);\n\n const voiceAck = normalizeVoiceAck(payload);\n if (voiceAck) {\n this.handleVoiceAck(voiceAck);\n return;\n }\n\n const voiceAudio = normalizeVoiceAudio(payload);\n if (voiceAudio) {\n if (this._voiceState === \"processing\") {\n this.setVoiceState(\"responding\");\n }\n if (voiceAudio.audioData.length > 0) {\n this.voiceResponsePlayer.enqueueChunk(\n voiceAudio.audioData,\n voiceAudio.mimeType,\n );\n }\n return;\n }\n\n const ad = normalizeAdPayload(payload);\n if (ad) {\n await this.handleAdPlayback(ad);\n return;\n }\n\n const ack = normalizeInitAck(payload);\n if (ack) {\n await this.startContentPlayback(ack);\n return;\n }\n\n const err = payload.error;\n if (err && typeof err === \"object\") {\n const e = err as Record<string, unknown>;\n const message =\n typeof e.message === \"string\" ? e.message : \"Unknown server error\";\n const code = typeof e.code === \"string\" ? e.code : undefined;\n if (\n this._voiceState === \"processing\" ||\n this._voiceState === \"listening\" ||\n this._voiceState === \"responding\"\n ) {\n this.setVoiceState(\"error\");\n }\n this.emit(\"error\", new SynxedError(message, code));\n }\n }\n\n private async startContentPlayback(\n ack: NonNullable<ReturnType<typeof normalizeInitAck>>,\n ): Promise<void> {\n if (this.adPlaying && this._currentAd) {\n const endedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n this.emit(\"adEnd\", endedAd);\n } else {\n this.adPlaying = false;\n this._currentAd = null;\n }\n\n if (\n this._voiceState === \"ready\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n this.setVoiceState(\"idle\");\n }\n this.pausedForVoice = false;\n this.voiceResponsePlayer.stop();\n\n synxedDebug(\"Loading playback\", {\n url: ack.playbackUrl,\n isHls: ack.isHls,\n });\n\n const loadPromise = this.audio.load(ack.playbackUrl, ack.isHls);\n this.pendingPlaybackLoad = loadPromise;\n\n try {\n await loadPromise;\n if (this.pendingPlaybackLoad !== loadPromise) return;\n\n this.audio.play();\n this.emitAnalytics(\n \"stream_start\",\n this.activeContentKind === ContentKind.RADIO ? 0 : undefined,\n );\n this.startHeartbeat(ack.heartbeatIntervalMs);\n this.applyContentSummary(ack.contentSummary);\n } catch (error) {\n if (this.pendingPlaybackLoad !== loadPromise) return;\n this.emit(\"error\", new SynxedPlaybackError(error));\n } finally {\n if (this.pendingPlaybackLoad === loadPromise) {\n this.pendingPlaybackLoad = null;\n }\n }\n }\n\n private async handleAdPlayback(\n ad: NonNullable<ReturnType<typeof normalizeAdPayload>>,\n ): Promise<void> {\n if (this.pendingPlaybackLoad) {\n await this.pendingPlaybackLoad.catch(() => undefined);\n }\n this.audio.stop();\n\n this.adPlaying = true;\n this._currentAd = {\n adId: ad.adId,\n campaignId: ad.campaignId,\n brandName: ad.brandName,\n creativeName: ad.creativeName,\n durationSeconds: ad.durationSeconds,\n isSkippable: ad.isSkippable,\n skipAfterSeconds: ad.skipAfterSeconds,\n ctaType: ad.ctaType,\n ctaValue: ad.ctaValue,\n companionBannerUrl: ad.companionBannerUrl,\n campaignName: ad.campaignName,\n };\n\n synxedDebug(\"Loading ad playback\", {\n url: ad.playbackUrl,\n isHls: ad.isHls,\n });\n\n try {\n await this.audio.load(ad.playbackUrl, ad.isHls);\n this.audio.play();\n this.emit(\"adStart\", this._currentAd);\n this.emitAdSkipUpdate(0);\n } catch (error) {\n const failedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n if (failedAd) this.emit(\"adEnd\", failedAd);\n synxedWarn(\"Ad load failed\", error);\n this.updateStatus(\"loading\");\n }\n }\n\n skipAd(): void {\n if (!this.adPlaying || !this._currentAd) return;\n if (!this._currentAd.isSkippable) return;\n\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n if (positionMs < this._currentAd.skipAfterSeconds * 1000) return;\n\n const endedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n this.audio.stop();\n this.emit(\"adEnd\", endedAd);\n this.emitAnalytics(\"ad_skip\", positionMs);\n this.updateStatus(\"loading\");\n }\n\n clickAd(): void {\n if (!this.adPlaying || !this._currentAd) return;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n this.emitAnalytics(\"ad_cta_click\", positionMs);\n\n if (this._currentAd.ctaValue) {\n window.open(this._currentAd.ctaValue, \"_blank\");\n }\n }\n\n private handleTrackEnded(): void {\n if (this.activeContentKind === ContentKind.RADIO) {\n return;\n }\n\n if (this.adPlaying && this._currentAd) {\n const endedAd = this._currentAd;\n this.audio.stop();\n this.emitAnalytics(\n \"ad_complete\",\n Math.floor(this.audio.currentTime * 1000),\n );\n this.emit(\"adEnd\", endedAd);\n this.adPlaying = false;\n this._currentAd = null;\n this.updateStatus(\"loading\");\n return;\n }\n\n if (this.playlist.queueSnapshot.length > 1) {\n this.emitAnalytics(\n \"track_complete\",\n Math.floor(this.audio.duration * 1000),\n );\n this.updateStatus(\"loading\");\n return;\n }\n\n if (\n this.activeContentKind === ContentKind.SONG ||\n this.activeContentKind === ContentKind.PLAYLIST\n ) {\n this.emitAnalytics(\n \"track_complete\",\n Math.floor(this.audio.duration * 1000),\n );\n this.updateStatus(\"loading\");\n return;\n }\n\n this.updateStatus(\"idle\");\n }\n\n private updateStatus(status: PlayerState[\"status\"]): void {\n this.status = status;\n this.emit(\"stateChange\", {\n status,\n currentTrack: this.playlist.getCurrentTrack(),\n currentTime: this.audio.currentTime,\n duration: this.audio.duration,\n volume: this.volume,\n });\n }\n\n destroy(): void {\n this.clearHeartbeat();\n this.cancelVoiceHold();\n this.voiceResponsePlayer.stop();\n this.audio.stop();\n this.transport.disconnect();\n this.playlist.reset();\n this.removeAllListeners();\n }\n}\n","import type { RadioNowPlaying } from '../types';\n\n/**\n * Fetches live radio \"now playing\" metadata from the Synxed backend.\n * Poll every 10–15 seconds to keep UI in sync (see integration docs).\n */\nexport async function fetchRadioNowPlaying(\n serverUrl: string,\n init?: RequestInit,\n): Promise<RadioNowPlaying | null> {\n const base = serverUrl.replace(/\\/$/, '');\n const url = `${base}/radio/now-playing`;\n try {\n const res = await fetch(url, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(init?.headers as Record<string, string>),\n },\n });\n if (!res.ok) return null;\n const json = await res.json();\n const d = json?.data;\n if (!d?.title || typeof d.title !== 'string') return null;\n return {\n title: d.title,\n station: typeof d.station === 'string' ? d.station : undefined,\n isLive: typeof d.isLive === 'boolean' ? d.isLive : undefined,\n };\n } catch {\n return null;\n }\n}\n","import type { SynxedWebPlayerPlacement } from './types';\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: {\n className?: string;\n attrs?: Record<string, string>;\n style?: Partial<CSSStyleDeclaration>;\n text?: string;\n html?: string;\n onClick?: (e: Event) => void;\n children?: Node[];\n },\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props?.className) node.className = props.className;\n if (props?.attrs) {\n for (const [k, v] of Object.entries(props.attrs)) node.setAttribute(k, v);\n }\n if (props?.style) Object.assign(node.style, props.style);\n if (props?.text) node.textContent = props.text;\n if (props?.html) node.innerHTML = props.html;\n if (props?.onClick) node.addEventListener('click', props.onClick);\n if (props?.children) props.children.forEach((c) => node.appendChild(c));\n return node;\n}\n\nexport function svgIcon(path: string, size = 20): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('width', String(size));\n svg.setAttribute('height', String(size));\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'currentColor');\n svg.setAttribute('aria-hidden', 'true');\n const p = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n p.setAttribute('d', path);\n svg.appendChild(p);\n return svg;\n}\n\nexport const ICON_PLAY = 'M8 5v14l11-7L8 5z';\nexport const ICON_PAUSE = 'M6 5h4v14H6V5zm8 0h4v14h-4V5z';\nexport const ICON_SKIP = 'M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z';\nexport const ICON_SKIP_BACK = 'M6 6h2v12H6V6zm11.5 12L9 12l8.5-6v12z';\n\nexport function ensureGlobalStyles(): void {\n const id = 'synxed-web-player-styles';\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = `\n@keyframes synxed-wp-spin { from { transform: rotate(0); } to { transform: rotate(360deg); } }\n@keyframes synxed-wp-vbar {\n 0%, 100% { transform: scaleY(0.28); opacity: 0.45; }\n 50% { transform: scaleY(1); opacity: 1; }\n}\n`;\n document.head.appendChild(style);\n}\n\nexport function parseDisplayTitle(raw: string): { title: string; artist?: string } {\n const seps = [' — ', ' – ', ' - ', ' —', ' –', ' -'];\n for (const sep of seps) {\n const i = raw.indexOf(sep);\n if (i > 0) {\n return { title: raw.slice(0, i).trim(), artist: raw.slice(i + sep.length).trim() };\n }\n }\n return { title: raw.trim() };\n}\n\nexport function placementStyle(\n placement: SynxedWebPlayerPlacement = 'bottom-center',\n offsetX = 16,\n offsetY = 16,\n): Partial<CSSStyleDeclaration> {\n const base: Partial<CSSStyleDeclaration> = { position: 'fixed', zIndex: '50' };\n switch (placement) {\n case 'top-left':\n return { ...base, top: `${offsetY}px`, left: `${offsetX}px` };\n case 'top-right':\n return { ...base, top: `${offsetY}px`, right: `${offsetX}px` };\n case 'bottom-left':\n return { ...base, bottom: `${offsetY}px`, left: `${offsetX}px` };\n case 'bottom-right':\n return { ...base, bottom: `${offsetY}px`, right: `${offsetX}px` };\n case 'bottom-center':\n default:\n return { ...base, bottom: `${offsetY}px`, left: '50%', transform: 'translateX(-50%)' };\n }\n}\n\nexport function resolveTheme(input: import('./types').SynxedWebPlayerTheme = {}) {\n return {\n accent: input.accent ?? '#22c55e',\n accentMuted: input.accentMuted ?? input.accent ?? '#22c55e',\n background: input.background ?? '#051107',\n backgroundInner: input.backgroundInner ?? '#0a1f10',\n border: input.border ?? 'rgba(34, 197, 94, 0.35)',\n text: input.text ?? '#ffffff',\n textMuted: input.textMuted ?? 'rgba(255,255,255,0.35)',\n stationText: input.stationText ?? 'rgba(34, 197, 94, 0.85)',\n liveDot: input.liveDot ?? '#CCFF00',\n glow: input.glow ?? 'rgba(34, 197, 94, 0.35)',\n };\n}\n\nexport function applyCssVars(root: HTMLElement, theme: ReturnType<typeof resolveTheme>): void {\n root.style.setProperty('--sw-accent', theme.accent);\n root.style.setProperty('--sw-accent-muted', theme.accentMuted);\n root.style.setProperty('--sw-bg', theme.background);\n root.style.setProperty('--sw-bg-inner', theme.backgroundInner);\n root.style.setProperty('--sw-border', theme.border);\n root.style.setProperty('--sw-text', theme.text);\n root.style.setProperty('--sw-text-muted', theme.textMuted);\n root.style.setProperty('--sw-station', theme.stationText);\n root.style.setProperty('--sw-live', theme.liveDot);\n root.style.setProperty('--sw-glow', theme.glow);\n}\n","import { SynxedPlayer } from \"../core/SynxedPlayer\";\nimport { fetchRadioNowPlaying } from \"../radio/nowPlaying\";\nimport type {\n PlayerState,\n RadioNowPlaying,\n TrackInfo,\n AdSkipState,\n VoiceState,\n} from \"../types\";\nimport {\n ICON_PAUSE,\n ICON_PLAY,\n ICON_SKIP,\n ICON_SKIP_BACK,\n applyCssVars,\n el,\n ensureGlobalStyles,\n parseDisplayTitle,\n placementStyle,\n resolveTheme,\n svgIcon,\n} from \"./dom\";\nimport type { SynxedWebPlayerMode, SynxedWebPlayerOptions } from \"./types\";\n\nconst SYNXED_DJ_AVATAR_URL = \"https://cdn.synxed.com/avater-image/avatar.svg\";\n/** Animated AI Star UI GIF — shown during listening & processing voice states. */\nconst SYNXED_VOICE_AVATAR_URL =\n \"https://cdn.synxed.com/avater-image/AI%20Star%20UI%20animation.gif\";\n\nexport type {\n SynxedWebPlayerMode,\n SynxedWebPlayerOptions,\n SynxedWebPlayerPlacement,\n SynxedWebPlayerPosition,\n SynxedWebPlayerSource,\n SynxedWebPlayerTheme,\n} from \"./types\";\n\n/**\n * Framework-agnostic web overlay player (vanilla DOM).\n * Works in React, Vue, Angular, or plain HTML — no React dependency.\n */\nexport class SynxedWebPlayer {\n private readonly options: SynxedWebPlayerOptions;\n private readonly root: HTMLElement;\n private readonly ownsRoot: boolean;\n private readonly theme: ReturnType<typeof resolveTheme>;\n private engine: SynxedPlayer | null = null;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private destroyed = false;\n\n private isPlaying = false;\n private currentTrack: TrackInfo | null = null;\n private nowPlaying: RadioNowPlaying | null = null;\n private currentAd: import(\"../types\").AdInfo | null = null;\n\n private skipBtn: HTMLButtonElement | null = null;\n private avatarImgEl: HTMLImageElement | null = null;\n private avatarTextEl: HTMLElement | null = null;\n\n private avatarRing: HTMLElement | null = null;\n private titleEl: HTMLElement | null = null;\n private artistInlineEl: HTMLElement | null = null;\n private artistBlockEl: HTMLElement | null = null;\n private footerEl: HTMLElement | null = null;\n private playBtn: HTMLButtonElement | null = null;\n private avatarVoiceHolding = false;\n private suppressMiniClick = false;\n private voiceAvatarPreview = false;\n private voiceHoldActivated = false;\n private voiceUiDismissed = false;\n private voiceHoldTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly defaultVoiceHoldMs = 450;\n /** Avatar to restore after an ad (DJ / album art — not ad or voice AI). */\n private avatarImageBeforeAd: string | undefined;\n\n constructor(options: SynxedWebPlayerOptions) {\n this.options = {\n mode: \"wide\",\n attribution: \"Synxed\",\n nowPlayingPollMs: 12_000,\n powerByLabel: \"Powered by Synxed\",\n enableVoice: true,\n ...options,\n };\n this.theme = resolveTheme(this.options.theme);\n this.ownsRoot = !options.container;\n this.root = options.container ?? document.createElement(\"div\");\n if (this.ownsRoot) document.body.appendChild(this.root);\n\n ensureGlobalStyles();\n this.mountShell();\n this.initEngine();\n if (this.options.source.type === \"radio\") this.startNowPlayingPoll();\n }\n\n /** Convenience factory — same as `new SynxedWebPlayer(options)`. */\n static mount(options: SynxedWebPlayerOptions): SynxedWebPlayer {\n return new SynxedWebPlayer(options);\n }\n\n /** Underlying streaming engine (advanced integrations). */\n get player(): SynxedPlayer | null {\n return this.engine;\n }\n\n get element(): HTMLElement {\n return this.root;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.stopNowPlayingPoll();\n this.engine?.destroy();\n this.engine = null;\n if (this.ownsRoot) this.root.remove();\n }\n\n private get voiceEnabled(): boolean {\n return this.options.enableVoice !== false;\n }\n\n private get isRadio(): boolean {\n return this.options.source.type === \"radio\";\n }\n\n private get mode(): SynxedWebPlayerMode {\n return this.options.mode ?? \"wide\";\n }\n\n private mountShell(): void {\n const { position = {}, className, style } = this.options;\n const placement = position.placement ?? \"bottom-center\";\n const offsetX = position.offsetX ?? 16;\n const offsetY =\n position.offsetY ?? (placement === \"bottom-center\" ? 24 : 16);\n\n this.root.className = className ?? \"\";\n this.root.dataset.synxedWebPlayer = this.mode;\n applyCssVars(this.root, this.theme);\n Object.assign(this.root.style, placementStyle(placement, offsetX, offsetY));\n if (style) Object.assign(this.root.style, style);\n\n this.root.replaceChildren();\n if (this.mode === \"mini\") this.buildMini();\n else if (this.mode === \"large\") this.buildLarge();\n else this.buildWide();\n\n this.refreshLabels();\n this.setPlayingVisual(this.isPlaying);\n\n if (this.options.draggable && this.ownsRoot) {\n this.makeDraggable();\n }\n }\n\n private makeDraggable(): void {\n let isDragging = false;\n let hasMoved = false;\n let startX = 0;\n let startY = 0;\n let initialLeft = 0;\n let initialTop = 0;\n\n const onPointerDown = (e: Event) => {\n const evt = e as MouseEvent | TouchEvent;\n const target = evt.target as HTMLElement;\n\n if (target.closest(\"[data-synxed-avatar-ring]\")) return;\n if (this.avatarVoiceHolding) return;\n\n // In non-mini modes, prevent dragging if starting on buttons or inputs\n if (this.mode !== \"mini\" && target.closest(\"button, a, input\")) return;\n\n isDragging = true;\n hasMoved = false;\n const rect = this.root.getBoundingClientRect();\n initialLeft = rect.left;\n initialTop = rect.top;\n\n this.root.style.bottom = \"auto\";\n this.root.style.right = \"auto\";\n this.root.style.transform = \"none\";\n this.root.style.margin = \"0\";\n this.root.style.left = `${initialLeft}px`;\n this.root.style.top = `${initialTop}px`;\n\n if (\"touches\" in evt) {\n startX = evt.touches[0].clientX;\n startY = evt.touches[0].clientY;\n } else {\n startX = evt.clientX;\n startY = evt.clientY;\n }\n\n document.addEventListener(\"mousemove\", onPointerMove, { passive: false });\n document.addEventListener(\"mouseup\", onPointerUp);\n document.addEventListener(\"touchmove\", onPointerMove, { passive: false });\n document.addEventListener(\"touchend\", onPointerUp);\n };\n\n const onPointerMove = (e: Event) => {\n if (!isDragging) return;\n e.preventDefault();\n\n const evt = e as MouseEvent | TouchEvent;\n let currentX, currentY;\n if (\"touches\" in evt) {\n currentX = evt.touches[0].clientX;\n currentY = evt.touches[0].clientY;\n } else {\n currentX = evt.clientX;\n currentY = evt.clientY;\n }\n\n const dx = currentX - startX;\n const dy = currentY - startY;\n\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {\n hasMoved = true;\n }\n\n this.root.style.left = `${initialLeft + dx}px`;\n this.root.style.top = `${initialTop + dy}px`;\n };\n\n const onPointerUp = () => {\n isDragging = false;\n document.removeEventListener(\"mousemove\", onPointerMove);\n document.removeEventListener(\"mouseup\", onPointerUp);\n document.removeEventListener(\"touchmove\", onPointerMove);\n document.removeEventListener(\"touchend\", onPointerUp);\n\n // Reset hasMoved after the click event has a chance to fire\n setTimeout(() => {\n hasMoved = false;\n }, 0);\n };\n\n this.root.style.cursor = \"grab\";\n this.root.addEventListener(\"mousedown\", onPointerDown);\n this.root.addEventListener(\"touchstart\", onPointerDown, { passive: false });\n\n // Prevent accidental clicks if the user was dragging\n this.root.addEventListener(\n \"click\",\n (e) => {\n if (hasMoved) {\n e.stopPropagation();\n e.preventDefault();\n }\n },\n true,\n );\n }\n\n private buildAvatar(size: number, liveTop = false): HTMLElement {\n const wrap = el(\"div\", {\n style: { position: \"relative\", flexShrink: \"0\" },\n });\n this.avatarRing = el(\"div\", {\n attrs: { \"data-synxed-avatar-ring\": \"true\" },\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n border: \"3px solid var(--sw-accent)\",\n padding: \"3px\",\n boxShadow: `0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)`,\n background: \"var(--sw-bg)\",\n boxSizing: \"border-box\",\n },\n });\n const inner = el(\"div\", {\n style: {\n width: \"100%\",\n height: \"100%\",\n borderRadius: \"50%\",\n background: \"var(--sw-bg-inner)\",\n overflow: \"hidden\",\n },\n });\n this.avatarImgEl = el(\"img\", {\n attrs: { src: SYNXED_DJ_AVATAR_URL, alt: \"Synxed DJ\" },\n style: {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"top\",\n transform: this.mode === \"wide\" ? \"scale(1.15)\" : \"scale(1.12)\",\n display: \"block\",\n },\n });\n this.avatarTextEl = el(\"div\", {\n text: \"S\",\n style: {\n width: \"100%\",\n height: \"100%\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--sw-accent)\",\n fontWeight: \"900\",\n fontSize: `${Math.round(size * 0.28)}px`,\n },\n });\n inner.appendChild(this.avatarImgEl);\n inner.appendChild(this.avatarTextEl);\n\n inner.style.cursor = this.voiceEnabled ? \"pointer\" : \"default\";\n inner.addEventListener(\"click\", (e) => {\n if (this.isVoiceUiOpen()) {\n e.stopPropagation();\n this.dismissVoiceUi();\n return;\n }\n if (this.currentAd && this.engine) {\n e.stopPropagation();\n this.engine.clickAd();\n }\n });\n\n if (this.voiceEnabled) {\n this.avatarRing.style.touchAction = \"none\";\n this.avatarRing.setAttribute(\"aria-label\", \"Hold to speak to DJ\");\n }\n\n this.avatarRing.appendChild(inner);\n wrap.appendChild(this.avatarRing);\n wrap.appendChild(\n el(\"span\", {\n style: {\n position: \"absolute\",\n ...(liveTop\n ? { top: \"4px\", left: \"4px\" }\n : { bottom: \"6px\", left: \"6px\" }),\n width: liveTop ? \"10px\" : \"12px\",\n height: liveTop ? \"10px\" : \"12px\",\n borderRadius: \"50%\",\n background: \"var(--sw-live)\",\n border: \"2px solid var(--sw-bg)\",\n boxShadow: \"0 0 8px var(--sw-live)\",\n },\n }),\n );\n return wrap;\n }\n\n private buildMini(): void {\n const size = 72;\n const shell = el(\"div\", {\n attrs: {\n role: \"button\",\n tabindex: \"0\",\n \"aria-label\": \"Synxed mini player — tap to play, hold to speak\",\n \"data-synxed-mini-shell\": \"true\",\n },\n style: {\n position: \"relative\",\n padding: \"0\",\n cursor: \"pointer\",\n background: \"transparent\",\n },\n });\n shell.addEventListener(\"keydown\", (e) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n if (!this.suppressMiniClick && !this.avatarVoiceHolding) {\n this.handleMiniActivate();\n }\n });\n shell.addEventListener(\"click\", () => {\n if (this.suppressMiniClick) return;\n if (this.isVoiceUiOpen()) {\n this.dismissVoiceUi();\n return;\n }\n if (this.avatarVoiceHolding) return;\n this.handleMiniActivate();\n });\n shell.appendChild(this.buildAvatar(size));\n this.root.appendChild(shell);\n }\n\n private handleMiniActivate(): void {\n if (this.isVoiceUiOpen()) {\n this.dismissVoiceUi();\n return;\n }\n if (this.options.onMiniClick) {\n this.options.onMiniClick();\n } else {\n this.togglePlay();\n }\n }\n\n private buildWide(): void {\n const avatarSize = 90;\n const shellShadow = `0 8px 40px var(--sw-glow), 0 0 0 1px var(--sw-border)`;\n this.root.style.width = \"min(calc(100vw - 20px), 560px)\";\n\n const row = el(\"div\", {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n },\n });\n const pillInset = Math.max(avatarSize * 0.42, 40);\n row.appendChild(\n el(\"div\", {\n style: {\n position: \"absolute\",\n top: \"8px\",\n bottom: \"8px\",\n left: `${pillInset}px`,\n right: \"0\",\n background: \"var(--sw-bg)\",\n border: \"1px solid var(--sw-border)\",\n borderRadius: \"28px 20px 20px 28px\",\n boxShadow: shellShadow,\n overflow: \"hidden\",\n },\n children: [\n el(\"div\", {\n style: {\n position: \"absolute\",\n inset: \"0\",\n background:\n \"linear-gradient(90deg, color-mix(in srgb, var(--sw-accent) 12%, transparent), transparent)\",\n pointerEvents: \"none\",\n },\n }),\n ],\n }),\n );\n\n const avatar = this.buildAvatar(avatarSize);\n Object.assign(avatar.style, {\n position: \"relative\",\n zIndex: \"1\",\n marginLeft: \"-2px\",\n });\n row.appendChild(avatar);\n\n const info = el(\"div\", {\n style: {\n position: \"relative\",\n zIndex: \"1\",\n flex: \"1\",\n minWidth: \"0\",\n marginLeft: \"14px\",\n padding: \"18px 8px\",\n },\n });\n const titleRow = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"baseline\",\n gap: \"8px\",\n overflow: \"hidden\",\n },\n });\n this.titleEl = el(\"h3\", {\n style: {\n margin: \"0\",\n fontSize: \"clamp(15px, 2.8vw, 20px)\",\n fontWeight: \"900\",\n color: \"var(--sw-text)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n titleRow.appendChild(this.titleEl);\n this.artistInlineEl = el(\"span\", {\n style: {\n fontSize: \"clamp(12px, 2.4vw, 15px)\",\n fontWeight: \"300\",\n color: \"var(--sw-text-muted)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"none\",\n },\n });\n titleRow.appendChild(this.artistInlineEl);\n info.appendChild(titleRow);\n this.footerEl = el(\"p\", {\n style: {\n margin: \"8px 0 0\",\n fontSize: \"9px\",\n fontWeight: \"700\",\n color: \"var(--sw-text-muted)\",\n letterSpacing: \"0.18em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n info.appendChild(this.footerEl);\n row.appendChild(info);\n\n const controls = el(\"div\", {\n style: {\n position: \"relative\",\n zIndex: \"1\",\n flexShrink: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"14px\",\n paddingRight: \"16px\",\n },\n });\n this.playBtn = this.createPlayButton(52);\n controls.appendChild(this.playBtn);\n if (!this.isRadio) {\n this.skipBtn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Skip\" },\n style: {\n border: \"none\",\n background: \"transparent\",\n color: \"var(--sw-text-muted)\",\n display: \"flex\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontWeight: \"bold\",\n },\n onClick: () => this.handleSkipClick(),\n children: [svgIcon(ICON_SKIP, 22)],\n }) as HTMLButtonElement;\n controls.appendChild(this.skipBtn);\n }\n controls.appendChild(this.decoLines());\n row.appendChild(controls);\n this.root.appendChild(row);\n }\n\n private buildLarge(): void {\n this.root.style.width = \"min(calc(100vw - 24px), 380px)\";\n const shellShadow = `0 8px 40px var(--sw-glow), 0 0 0 1px var(--sw-border)`;\n const card = el(\"div\", {\n style: {\n borderRadius: \"24px\",\n border: \"1px solid var(--sw-border)\",\n background: \"var(--sw-bg)\",\n boxShadow: shellShadow,\n padding: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\n },\n });\n\n const head = el(\"div\", {\n style: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n minWidth: \"0\",\n },\n });\n head.appendChild(this.buildAvatar(96, true));\n const meta = el(\"div\", { style: { minWidth: \"0\", flex: \"1\" } });\n this.titleEl = el(\"h3\", {\n style: {\n margin: \"0\",\n fontSize: \"18px\",\n fontWeight: \"900\",\n color: \"var(--sw-text)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n meta.appendChild(this.titleEl);\n this.artistBlockEl = el(\"p\", {\n style: {\n margin: \"6px 0 0\",\n fontSize: \"13px\",\n fontWeight: \"700\",\n color: \"var(--sw-accent-muted)\",\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"none\",\n },\n });\n meta.appendChild(this.artistBlockEl);\n this.footerEl = el(\"p\", {\n style: {\n margin: \"6px 0 0\",\n fontSize: \"10px\",\n fontWeight: \"700\",\n color: \"var(--sw-station)\",\n letterSpacing: \"0.18em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n meta.appendChild(this.footerEl);\n head.appendChild(meta);\n card.appendChild(head);\n card.appendChild(this.buildVisualizer());\n card.appendChild(\n el(\"p\", {\n text: this.options.powerByLabel ?? \"Powered by Synxed\",\n style: {\n margin: \"0\",\n fontSize: \"9px\",\n fontWeight: \"600\",\n color: \"var(--sw-text-muted)\",\n letterSpacing: \"0.12em\",\n textTransform: \"uppercase\",\n textAlign: \"center\",\n },\n }),\n );\n\n const transport = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"18px\",\n },\n });\n if (!this.isRadio) {\n transport.appendChild(\n el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Previous\" },\n style: this.roundControlStyle(),\n onClick: () => this.engine?.previous(),\n children: [svgIcon(ICON_SKIP_BACK, 22)],\n }),\n );\n }\n this.playBtn = this.createPlayButton(56);\n transport.appendChild(this.playBtn);\n if (!this.isRadio) {\n this.skipBtn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Skip\" },\n style: {\n ...this.roundControlStyle(),\n fontSize: \"12px\",\n fontWeight: \"bold\",\n },\n onClick: () => this.handleSkipClick(),\n children: [svgIcon(ICON_SKIP, 22)],\n }) as HTMLButtonElement;\n transport.appendChild(this.skipBtn);\n }\n card.appendChild(transport);\n this.root.appendChild(card);\n }\n\n private roundControlStyle(): Partial<CSSStyleDeclaration> {\n return {\n width: \"46px\",\n height: \"46px\",\n borderRadius: \"50%\",\n border: \"1px solid var(--sw-border)\",\n background: \"rgba(255,255,255,0.04)\",\n color: \"var(--sw-text)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n };\n }\n\n private createPlayButton(size: number): HTMLButtonElement {\n const btn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Play\" },\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n border: \"none\",\n background: \"var(--sw-accent)\",\n color: \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n boxShadow: \"0 0 18px var(--sw-glow)\",\n flexShrink: \"0\",\n },\n onClick: () => this.togglePlay(),\n children: [svgIcon(ICON_PLAY, size >= 56 ? 22 : 20)],\n });\n return btn;\n }\n\n private buildVisualizer(): HTMLElement {\n const box = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: \"4px\",\n height: \"52px\",\n padding: \"8px 4px\",\n borderRadius: \"14px\",\n border: \"1px solid var(--sw-border)\",\n overflow: \"hidden\",\n },\n });\n for (let i = 0; i < 24; i++) {\n box.appendChild(\n el(\"span\", {\n style: {\n flex: \"1\",\n minWidth: \"3px\",\n height: \"100%\",\n borderRadius: \"4px\",\n background:\n \"linear-gradient(180deg, var(--sw-accent), transparent)\",\n transformOrigin: \"center bottom\",\n animation: `synxed-wp-vbar ${1 + (i % 5) * 0.12}s ease-in-out infinite`,\n animationDelay: `${i * 0.04}s`,\n opacity: \"0.85\",\n },\n }),\n );\n }\n return box;\n }\n\n private decoLines(): HTMLElement {\n const wrap = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"3px\",\n opacity: \"0.22\",\n },\n });\n wrap.appendChild(\n el(\"span\", {\n style: {\n display: \"block\",\n width: \"16px\",\n height: \"2px\",\n borderRadius: \"999px\",\n background: \"var(--sw-text)\",\n transform: \"translateX(3px)\",\n },\n }),\n );\n wrap.appendChild(\n el(\"span\", {\n style: {\n display: \"block\",\n width: \"16px\",\n height: \"2px\",\n borderRadius: \"999px\",\n background: \"var(--sw-text)\",\n },\n }),\n );\n return wrap;\n }\n\n private initEngine(): void {\n const { apiKey, serverUrl, source } = this.options;\n const p = new SynxedPlayer({ \n apiKey, \n serverUrl, \n autoConnect: true,\n debug: this.options.debug,\n voice: this.options.voice,\n });\n this.engine = p;\n\n const onState = (state: PlayerState) => {\n this.isPlaying = state.status === \"playing\";\n if (state.currentTrack) this.currentTrack = state.currentTrack;\n this.setPlayingVisual(this.isPlaying);\n this.refreshLabels();\n if (!this.currentAd && !this.engine?.isAdPlaying) {\n this.restoreTrackSkipButton();\n this.refreshAvatarImage();\n }\n };\n p.on(\"stateChange\", onState);\n p.on(\"trackChange\", (track) => {\n this.currentTrack = track;\n this.avatarImageBeforeAd = undefined;\n this.refreshLabels();\n if (!this.currentAd && !this.engine?.isAdPlaying) {\n this.restoreTrackSkipButton();\n this.refreshAvatarImage();\n }\n });\n p.on(\"adStart\", (ad) => {\n this.avatarImageBeforeAd = this.getContentAvatarUrl();\n this.voiceAvatarPreview = false;\n this.voiceHoldActivated = false;\n this.currentAd = ad;\n this.refreshLabels();\n this.updateAvatar();\n });\n p.on(\"adSkipUpdate\", (state) => this.applyAdSkipUi(state));\n p.on(\"adEnd\", () => {\n this.currentAd = null;\n this.voiceAvatarPreview = false;\n this.refreshLabels();\n this.updateAvatar();\n this.restoreTrackSkipButton();\n });\n p.on(\"voiceStateChange\", (state) => this.applyVoiceVisual(state));\n\n const start: () => Promise<void> =\n source.type === \"radio\"\n ? () => p.playRadio()\n : () => p.playPlaylist({ playlistCode: source.playlistCode });\n\n start().catch(() => undefined);\n\n if (this.voiceEnabled) {\n this.wireAvatarVoiceHold();\n }\n }\n\n /** Press-and-hold DJ avatar to stream voice; release or silence auto-ends capture. */\n private wireAvatarVoiceHold(): void {\n if (!this.avatarRing) return;\n\n const target = this.avatarRing;\n const holdMs = this.options.voiceHoldMs ?? this.defaultVoiceHoldMs;\n\n const clearHoldTimer = () => {\n if (this.voiceHoldTimer !== null) {\n clearTimeout(this.voiceHoldTimer);\n this.voiceHoldTimer = null;\n }\n };\n\n const onPointerDown = (e: PointerEvent) => {\n if (this.currentAd || !this.engine) return;\n\n if (this.isVoiceUiOpen()) {\n e.preventDefault();\n e.stopPropagation();\n this.dismissVoiceUi();\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n target.setPointerCapture(e.pointerId);\n this.avatarVoiceHolding = true;\n this.voiceHoldActivated = false;\n\n clearHoldTimer();\n this.voiceHoldTimer = setTimeout(() => {\n this.voiceHoldTimer = null;\n if (!this.avatarVoiceHolding || !this.engine) return;\n\n this.voiceHoldActivated = true;\n this.voiceUiDismissed = false;\n this.voiceAvatarPreview = true;\n this.refreshAvatarImage();\n\n void this.engine\n .beginVoiceHold({ listenerId: this.options.listenerId })\n .catch(() => {\n this.resetVoiceHoldState();\n });\n }, holdMs);\n };\n\n const blockDragBubble = (e: Event) => {\n if (!this.currentAd) e.stopPropagation();\n };\n target.addEventListener(\"mousedown\", blockDragBubble);\n target.addEventListener(\"touchstart\", blockDragBubble, { passive: false });\n\n const onPointerUp = () => {\n clearHoldTimer();\n\n if (!this.avatarVoiceHolding) return;\n this.avatarVoiceHolding = false;\n\n if (!this.voiceHoldActivated) {\n return;\n }\n\n if (this.mode === \"mini\") {\n this.suppressMiniClick = true;\n setTimeout(() => {\n this.suppressMiniClick = false;\n }, 320);\n }\n\n const state = this.engine?.voiceState;\n if (state === \"listening\") {\n void this.engine?.endVoiceHold();\n }\n };\n\n target.addEventListener(\"pointerdown\", onPointerDown);\n target.addEventListener(\"pointerup\", onPointerUp);\n target.addEventListener(\"pointerleave\", onPointerUp);\n target.addEventListener(\"pointercancel\", onPointerUp);\n }\n\n private isVoiceUiOpen(): boolean {\n if (!this.voiceEnabled || this.currentAd || this.voiceUiDismissed) {\n return false;\n }\n if (this.voiceHoldActivated || this.voiceAvatarPreview) return true;\n return Boolean(this.engine?.isVoiceUiActive);\n }\n\n private dismissVoiceUi(): void {\n this.engine?.dismissVoiceAndResume();\n this.resetVoiceHoldState();\n this.voiceUiDismissed = true;\n this.applyVoiceVisual(this.engine?.voiceState ?? \"idle\");\n this.refreshAvatarImage();\n }\n\n private resetVoiceHoldState(): void {\n if (this.voiceHoldTimer !== null) {\n clearTimeout(this.voiceHoldTimer);\n this.voiceHoldTimer = null;\n }\n this.avatarVoiceHolding = false;\n this.voiceHoldActivated = false;\n this.voiceAvatarPreview = false;\n }\n\n private applyVoiceVisual(state: VoiceState): void {\n if (!this.avatarRing) return;\n\n if (state === \"idle\" || state === \"ready\" || state === \"error\") {\n if (!this.avatarVoiceHolding) {\n this.voiceAvatarPreview = false;\n }\n if (state === \"ready\" || state === \"idle\") {\n this.voiceUiDismissed = false;\n }\n }\n\n if (\n state === \"listening\" ||\n state === \"processing\" ||\n state === \"responding\"\n ) {\n this.voiceUiDismissed = false;\n }\n\n if (state === \"listening\") {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#3b82f6\"; // Blue when talking\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(59,130,246,0.55), 0 0 40px rgba(59,130,246,0.25)\";\n } else if (state === \"processing\") {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#ef4444\"; // Red when processing/stopped\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(239,68,68,0.5), 0 0 40px rgba(239,68,68,0.2)\";\n } else if (state === \"responding\") {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#06b6d4\"; // Glowing cyan when AI is talking\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(6,182,212,0.5), 0 0 40px rgba(6,182,212,0.2)\";\n } else {\n this.avatarRing.style.borderColor = \"\";\n this.avatarRing.style.boxShadow =\n \"0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)\";\n this.setPlayingVisual(this.isPlaying);\n }\n\n this.refreshAvatarImage();\n }\n\n private isVoiceAvatarActive(): boolean {\n if (!this.voiceEnabled || this.currentAd || this.voiceUiDismissed) {\n return false;\n }\n if (this.voiceAvatarPreview) return true;\n const state = this.engine?.voiceState;\n return (\n state === \"listening\" ||\n state === \"processing\" ||\n state === \"responding\"\n );\n }\n\n private getContentAvatarUrl(): string {\n return SYNXED_DJ_AVATAR_URL;\n }\n\n private getAvatarImageUrl(): string | undefined {\n if (this.currentAd?.companionBannerUrl) {\n return this.currentAd.companionBannerUrl;\n }\n if (this.isVoiceAvatarActive()) {\n return SYNXED_VOICE_AVATAR_URL;\n }\n if (this.avatarImageBeforeAd) {\n return this.avatarImageBeforeAd;\n }\n return SYNXED_DJ_AVATAR_URL;\n }\n\n private refreshAvatarImage(): void {\n const url = this.getAvatarImageUrl();\n const voiceVisual = this.isVoiceAvatarActive();\n\n if (url && this.avatarImgEl) {\n if (this.avatarImgEl.getAttribute(\"src\") !== url) {\n this.avatarImgEl.setAttribute(\"src\", url);\n }\n this.avatarImgEl.style.display = \"block\";\n if (voiceVisual) {\n // AI Star UI GIF — fill the full circle, no padding, no crop offset.\n // The GIF is square and designed to sit edge-to-edge inside the ring.\n this.avatarImgEl.style.objectFit = \"cover\";\n this.avatarImgEl.style.objectPosition = \"center\";\n this.avatarImgEl.style.transform = \"scale(1)\";\n this.avatarImgEl.style.padding = \"\";\n this.avatarImgEl.style.background = \"var(--sw-bg-inner)\";\n } else {\n this.avatarImgEl.style.objectFit = \"cover\";\n this.avatarImgEl.style.objectPosition = \"top\";\n this.avatarImgEl.style.transform =\n this.mode === \"wide\" ? \"scale(1.15)\" : \"scale(1.12)\";\n this.avatarImgEl.style.padding = \"\";\n this.avatarImgEl.style.background = \"\";\n }\n if (this.avatarTextEl) this.avatarTextEl.style.display = \"none\";\n } else {\n if (this.avatarImgEl) this.avatarImgEl.style.display = \"none\";\n if (this.avatarTextEl) this.avatarTextEl.style.display = \"flex\";\n }\n }\n\n private startNowPlayingPoll(): void {\n const tick = async () => {\n const np = await fetchRadioNowPlaying(this.options.serverUrl);\n if (!this.destroyed && np) {\n this.nowPlaying = np;\n this.refreshLabels();\n }\n };\n void tick();\n this.pollTimer = setInterval(tick, this.options.nowPlayingPollMs ?? 12_000);\n }\n\n private stopNowPlayingPoll(): void {\n if (this.pollTimer !== null) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n private handleSkipClick(): void {\n const player = this.engine;\n if (!player) return;\n if (this.currentAd) {\n if (player.canSkipAd()) player.skipAd();\n return;\n }\n player.skip();\n }\n\n /**\n * During ads: swap skip icon for countdown text in the same control (no style changes).\n * After ads: restore skip icon for the next track.\n */\n private applyAdSkipUi(state: AdSkipState): void {\n if (!this.skipBtn) return;\n\n const { ad, canSkip, countdownSeconds } = state;\n\n if (!ad.isSkippable) {\n this.skipBtn.disabled = true;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n return;\n }\n\n if (!canSkip) {\n this.skipBtn.disabled = true;\n this.skipBtn.replaceChildren();\n this.skipBtn.textContent = `${countdownSeconds}s`;\n return;\n }\n\n this.skipBtn.disabled = false;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n }\n\n private restoreTrackSkipButton(): void {\n if (!this.skipBtn) return;\n\n this.skipBtn.disabled = false;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.setAttribute(\"aria-label\", \"Skip\");\n }\n\n private displayLine(): { title: string; artist?: string } {\n if (this.currentAd) {\n return {\n title: this.currentAd.campaignName || \"Advertisement\",\n artist: this.currentAd.creativeName,\n };\n }\n if (this.isRadio && this.nowPlaying?.title) {\n return parseDisplayTitle(this.nowPlaying.title);\n }\n if (this.currentTrack?.title) {\n return {\n title: this.currentTrack.title,\n artist: this.currentTrack.artist,\n };\n }\n return { title: \"Loading…\" };\n }\n\n private refreshLabels(): void {\n const line = this.displayLine();\n if (this.titleEl) this.titleEl.textContent = line.title;\n\n if (this.artistInlineEl) {\n const show = Boolean(line.artist);\n this.artistInlineEl.style.display = show ? \"inline\" : \"none\";\n if (show) this.artistInlineEl.textContent = line.artist!;\n }\n if (this.artistBlockEl) {\n const show = Boolean(line.artist);\n this.artistBlockEl.style.display = show ? \"block\" : \"none\";\n if (show) this.artistBlockEl.textContent = line.artist!;\n }\n\n if (this.footerEl) {\n if (this.currentAd) {\n this.footerEl.textContent = \"Advertisement · Synxed Player\";\n } else {\n const station =\n this.isRadio &&\n (this.nowPlaying?.station ??\n this.currentTrack?.title ??\n \"Synxed Radio\");\n this.footerEl.textContent =\n station && this.isRadio\n ? `${station} · Synxed Player`\n : \"Synxed Player\";\n }\n }\n }\n\n private updateAvatar(): void {\n this.refreshAvatarImage();\n\n if (this.avatarRing) {\n const inner = this.avatarRing.firstChild as HTMLElement;\n if (inner) {\n inner.style.cursor = this.currentAd\n ? \"pointer\"\n : this.voiceEnabled\n ? \"pointer\"\n : \"default\";\n }\n }\n }\n\n private setPlayingVisual(playing: boolean): void {\n if (this.avatarRing) {\n this.avatarRing.style.animation = playing\n ? \"synxed-wp-spin 4s linear infinite\"\n : \"\";\n }\n if (this.playBtn) {\n this.playBtn.replaceChildren(\n svgIcon(playing ? ICON_PAUSE : ICON_PLAY, 20),\n );\n this.playBtn.setAttribute(\"aria-label\", playing ? \"Pause\" : \"Play\");\n }\n }\n\n private togglePlay(): void {\n if (!this.engine) return;\n if (this.isPlaying) this.engine.pause();\n else this.engine.resume();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/proto/sdk-streaming.ts","../src/transport/ProtocolCodec.ts","../src/core/EventEmitter.ts","../src/core/debug.ts","../src/transport/TransportManager.ts","../src/audio/AudioEngine.ts","../src/playlist/PlaylistManager.ts","../src/core/errors.ts","../src/core/contentSummary.ts","../src/core/adPayload.ts","../src/voice/voiceAudioFormats.ts","../src/core/voicePayload.ts","../src/voice/VoiceResponsePlayer.ts","../src/voice/VoiceCaptureManager.ts","../src/core/SynxedPlayer.ts","../src/radio/nowPlaying.ts","../src/web/dom.ts","../src/web/SynxedWebPlayer.ts"],"names":["schema","root","j","SdkClientEnvelope","SdkServerEnvelope","ContentKind","SdkVoiceAction","ErrorCode","ProtocolCodec","payload","message","data","decoded","EventEmitter","event","handler","set","onceHandler","args","debugEnabled","setSynxedDebug","enabled","synxedDebug","synxedWarn","buildSdkWebSocketUrl","serverUrl","apiKey","wsBase","url","TransportManager","reason","err","resolve","reject","ws","onOpen","cleanup","onError","onClose","params","bytes","AudioEngine","isHls","generation","isSafari","Hls","hls","xhr","audioEl","isStale","onPlay","onPause","onEnded","onLoadedMeta","onElementError","_event","e","Howl","_id","ms","volume","update","PlaylistManager","tracks","currentIndex","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","error","SynxedProtocolError","readString","obj","keys","key","v","readNumber","normalizeInitAck","raw","ack","playbackUrl","normalizeTrack","item","t","id","kind","albumArt","parseContentSummary","contentSummary","contentKind","summary","s","tracksRaw","rawIndex","value","readBool","normalizeAdPayload","ad","VOICE_CAPTURE_MIME","VOICE_RESPONSE_MIME","parsePcmSampleRate","mimeType","fallback","match","rate","normalizeVoiceAck","status","normalizeVoiceAudio","audio","audioData","isFinal","finalAudioData","binaryString","len","i","VoiceResponsePlayer","sampleRate","pcmData","int16","float32","audioBuffer","source","currentTime","VAD_WEB_CDN","ONNX_CDN","VoiceCaptureManager","options","context","speaking","frame","operation","wasCapturing","reportError","MicVAD","vad","_probabilities","maxMs","SynxedPlayer","config","positionMs","requiredMs","time","chunk","sequence","extras","voiceOpts","nextTrack","prevTrack","override","eventType","extra","intervalMs","interval","pos","parsed","canSkip","countdownSeconds","state","result","voiceAck","voiceAudio","endedAd","loadPromise","failedAd","fetchRadioNowPlaying","init","res","d","el","tag","props","node","k","c","svgIcon","path","size","svg","p","ICON_PLAY","ICON_PAUSE","ICON_SKIP","ICON_SKIP_BACK","ensureGlobalStyles","style","parseDisplayTitle","seps","sep","placementStyle","placement","offsetX","offsetY","base","resolveTheme","input","applyCssVars","theme","SYNXED_DJ_AVATAR_URL","SYNXED_VOICE_AVATAR_URL","SynxedWebPlayer","_SynxedWebPlayer","position","className","isDragging","hasMoved","startX","startY","initialLeft","initialTop","onPointerDown","evt","target","rect","onPointerMove","onPointerUp","currentX","currentY","dx","dy","liveTop","wrap","inner","shell","shellShadow","row","pillInset","avatar","info","titleRow","controls","card","head","meta","transport","box","onState","holdMs","clearHoldTimer","blockDragBubble","voiceVisual","tick","np","player","line","show","station","playing"],"mappings":"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","file":"index.js","sourcesContent":["import * as protobuf from 'protobufjs';\n\n/**\n * Protobuf schema definition for the SDK.\n * Matches the backend contract in src/modules/streaming/sdk-streaming.proto\n */\nconst schema = `\nsyntax = \"proto3\";\n\nenum ContentKind {\n CONTENT_KIND_UNSPECIFIED = 0;\n CONTENT_KIND_SONG = 1;\n CONTENT_KIND_PLAYLIST = 2;\n CONTENT_KIND_CATEGORY = 3;\n CONTENT_KIND_RADIO = 4;\n CONTENT_KIND_VOICE = 5;\n}\n\nenum SdkVoiceAction {\n VOICE_UNSPECIFIED = 0;\n VOICE_START = 1;\n VOICE_CHUNK = 2;\n VOICE_END = 3;\n}\n\nenum ErrorCode {\n ERROR_CODE_UNSPECIFIED = 0;\n UNAUTHORIZED = 1;\n VALIDATION_ERROR = 2;\n NOT_FOUND = 3;\n PROCESSING = 4;\n SERVICE_UNAVAILABLE = 5;\n BAD_PROTOBUF = 6;\n}\n\nenum SdkControlAction {\n CONTROL_UNSPECIFIED = 0;\n CONTROL_PLAY = 1;\n CONTROL_PAUSE = 2;\n CONTROL_STOP = 3;\n CONTROL_SEEK = 4;\n CONTROL_SKIP_NEXT = 5;\n CONTROL_SKIP_PREVIOUS = 6;\n}\n\nmessage SdkClientInit {\n ContentKind contentKind = 1;\n string catalogTrackId = 2;\n string internalTrackId = 3;\n string playlistCode = 4;\n string categoryQuery = 5;\n string listenerId = 6;\n string deviceType = 7;\n string countryCode = 8;\n string region = 9;\n string protocolVersion = 10;\n string gameContext = 11;\n}\n\nmessage SdkClientControl {\n SdkControlAction action = 1;\n uint32 positionMs = 2;\n}\n\nmessage SdkClientAnalytics {\n string eventType = 1;\n uint32 positionMs = 2;\n string extraJson = 3;\n}\n\nmessage SdkClientVoice {\n SdkVoiceAction action = 1;\n bytes audioData = 2;\n string mimeType = 3;\n uint32 sequence = 4;\n string listenerId = 5;\n string deviceType = 6;\n string gameContext = 7;\n}\n\nmessage SdkClientEnvelope {\n oneof payload {\n SdkClientInit init = 1;\n SdkClientControl control = 2;\n SdkClientAnalytics analytics = 3;\n SdkClientVoice voice = 4;\n }\n}\n\nmessage SdkServerInitAck {\n string sessionId = 1;\n string playbackUrl = 2;\n bool isHls = 3;\n uint32 heartbeatIntervalMs = 4;\n string contentSummary = 5;\n}\n\nmessage SdkServerVoiceAck {\n string status = 1;\n string transcript = 2;\n string playlistCode = 3;\n string playlistName = 4;\n}\n\nmessage SdkServerError {\n ErrorCode code = 1;\n string message = 2;\n}\n\nmessage SdkServerAdPayload {\n string adId = 1;\n string campaignId = 2;\n string playbackUrl = 3;\n bool isHls = 4;\n uint32 durationSeconds = 5;\n bool isSkippable = 6;\n uint32 skipAfterSeconds = 7;\n string ctaType = 8;\n string ctaValue = 9;\n string brandName = 10;\n string creativeName = 11;\n string companionBannerUrl = 12;\n string campaignName = 13;\n}\n\nmessage SdkServerVoiceAudio {\n bytes audioData = 1;\n string mimeType = 2;\n bool isFinal = 3;\n}\n\nmessage SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\n SdkServerAdPayload ad = 3;\n SdkServerVoiceAck voiceAck = 4;\n SdkServerVoiceAudio voiceAudio = 5;\n }\n}\n`;\n\nconst root = protobuf.parse(schema).root;\n\nexport const SdkClientEnvelope = root.lookupType('SdkClientEnvelope');\nexport const SdkServerEnvelope = root.lookupType('SdkServerEnvelope');\n\nexport enum ContentKind {\n UNSPECIFIED = 0,\n SONG = 1,\n PLAYLIST = 2,\n CATEGORY = 3,\n RADIO = 4,\n VOICE = 5,\n}\n\nexport enum SdkVoiceAction {\n VOICE_UNSPECIFIED = 0,\n VOICE_START = 1,\n VOICE_CHUNK = 2,\n VOICE_END = 3,\n}\n\nexport enum ErrorCode {\n UNSPECIFIED = 0,\n UNAUTHORIZED = 1,\n VALIDATION_ERROR = 2,\n NOT_FOUND = 3,\n PROCESSING = 4,\n SERVICE_UNAVAILABLE = 5,\n BAD_PROTOBUF = 6,\n}\n\nexport enum SdkControlAction {\n CONTROL_UNSPECIFIED = 0,\n CONTROL_PLAY = 1,\n CONTROL_PAUSE = 2,\n CONTROL_STOP = 3,\n CONTROL_SEEK = 4,\n CONTROL_SKIP_NEXT = 5,\n CONTROL_SKIP_PREVIOUS = 6,\n}\n","import { SdkClientEnvelope, SdkServerEnvelope } from '../proto/sdk-streaming';\n\nexport class ProtocolCodec {\n /**\n * Encodes a client envelope into a binary payload.\n */\n static encodeClientEnvelope(payload: any): Uint8Array {\n const message = SdkClientEnvelope.create(payload);\n return SdkClientEnvelope.encode(message).finish();\n }\n\n /**\n * Decodes a binary payload into a server envelope.\n */\n static decodeServerEnvelope(data: Uint8Array): any {\n const decoded = SdkServerEnvelope.decode(data);\n return SdkServerEnvelope.toObject(decoded, {\n enums: String,\n longs: String,\n bytes: String,\n defaults: true,\n oneofs: true,\n });\n }\n}\n","type Handler = (...args: any[]) => void;\n\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Handler>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: Events[K]): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n }\n\n off<K extends keyof Events>(event: K, handler: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n once<K extends keyof Events>(event: K, handler: Events[K]): void {\n const onceHandler = ((...args: any[]) => {\n handler(...args);\n this.off(event, onceHandler as Events[K]);\n }) as Events[K];\n this.on(event, onceHandler);\n }\n\n protected emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (set) {\n set.forEach((handler) => handler(...args));\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","let debugEnabled = false;\n\nexport function setSynxedDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\nexport function synxedDebug(...args: unknown[]): void {\n if (debugEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Synxed]', ...args);\n }\n}\n\nexport function synxedWarn(...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn('[Synxed]', ...args);\n}\n","import { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (reason: string) => void;\n error: (error: any) => void;\n message: (payload: any) => void;\n}\n\nexport function buildSdkWebSocketUrl(serverUrl: string, apiKey: string): string {\n const normalized = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n const wsBase = normalized.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:');\n const url = new URL(`${wsBase}/sdk`);\n url.searchParams.set('apiKey', apiKey);\n return url.toString();\n}\n\nexport class TransportManager extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private connectPromise: Promise<void> | null = null;\n\n connect(apiKey: string, serverUrl: string): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n const url = buildSdkWebSocketUrl(serverUrl, apiKey);\n synxedDebug('Opening native WebSocket', url.replace(/apiKey=[^&]+/, 'apiKey=***'));\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n this.ws.onopen = () => {\n this.connectPromise = null;\n this.emit('connected');\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason || `code ${event.code}`;\n this.ws = null;\n this.connectPromise = null;\n this.emit('disconnected', reason);\n };\n\n this.ws.onerror = () => {\n this.emit('error', new Error('WebSocket connection error'));\n };\n\n this.ws.onmessage = (event) => {\n try {\n const { data } = event;\n if (!(data instanceof ArrayBuffer)) return;\n\n const payload = ProtocolCodec.decodeServerEnvelope(new Uint8Array(data));\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n };\n }\n\n async waitForConnection(): Promise<void> {\n synxedDebug('Waiting for connection…');\n if (this.ws?.readyState === WebSocket.OPEN) {\n synxedDebug('Already connected');\n return;\n }\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized. Call connect() first.');\n }\n\n if (this.connectPromise) return this.connectPromise;\n\n this.connectPromise = new Promise((resolve, reject) => {\n const ws = this.ws!;\n\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n synxedDebug('WebSocket connected');\n cleanup();\n resolve();\n };\n\n const onError = () => {\n synxedWarn('WebSocket connection error');\n cleanup();\n reject(new Error('WebSocket connection failed'));\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('WebSocket closed before connection was established'));\n };\n\n const cleanup = () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n });\n\n return this.connectPromise;\n }\n\n disconnect(): void {\n if (!this.ws) return;\n\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n this.connectPromise = null;\n }\n\n sendInit(params: any): void {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n synxedDebug('Sending init packet', params);\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ init: params }));\n }\n\n sendControl(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ control: params }));\n }\n\n sendAnalytics(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ analytics: params }));\n }\n\n sendVoice(params: {\n action: number;\n audioData?: Uint8Array;\n mimeType?: string;\n sequence?: number;\n listenerId?: string;\n deviceType?: string;\n gameContext?: string;\n }): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ voice: params }));\n }\n\n get isConnected(): boolean {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private sendBytes(bytes: Uint8Array): void {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n throw new Error('WebSocket not connected');\n }\n this.ws.send(bytes);\n }\n}\n","import { Howl } from 'howler';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface AudioEvents {\n playing: () => void;\n paused: () => void;\n stopped: () => void;\n ended: () => void;\n loading: () => void;\n loaded: () => void;\n error: (error: any) => void;\n timeupdate: (data: { currentTime: number; duration: number }) => void;\n}\n\nexport class AudioEngine extends EventEmitter<AudioEvents> {\n private howl: Howl | null = null;\n private hls: any = null;\n private audioEl: HTMLAudioElement | null = null;\n private updateTimer: number | null = null;\n private loadGeneration = 0;\n\n constructor() {\n super();\n }\n\n /**\n * Loads a track URL. Waits until HLS manifest is parsed (or Howler onload) before resolving.\n */\n async load(url: string, isHls: boolean): Promise<void> {\n const generation = ++this.loadGeneration;\n this.teardownPlayback();\n this.emit('loading');\n\n synxedDebug('AudioEngine loading', { url, isHls });\n\n const isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\n if (isHls && !isSafari) {\n try {\n const { default: Hls } = await import('hls.js');\n if (Hls.isSupported()) {\n synxedDebug('Using Hls.js for playback');\n\n const hls = new Hls({\n xhrSetup: (xhr) => {\n xhr.setRequestHeader('ngrok-skip-browser-warning', 'true');\n },\n });\n const audioEl = new Audio();\n\n return new Promise<void>((resolve, reject) => {\n const isStale = () => generation !== this.loadGeneration;\n\n const onPlay = () => {\n if (isStale()) return;\n this.emit('playing');\n this.startTimeUpdateLoop();\n };\n const onPause = () => {\n if (isStale()) return;\n this.emit('paused');\n this.stopTimeUpdateLoop();\n };\n const onEnded = () => {\n if (isStale()) return;\n this.emit('ended');\n this.stopTimeUpdateLoop();\n };\n const onLoadedMeta = () => {\n if (isStale()) return;\n this.emit('loaded');\n };\n const onElementError = () => {\n if (isStale()) return;\n synxedWarn('HLS audio element error');\n this.emit('error', new Error('HLS playback failed'));\n };\n\n audioEl.addEventListener('play', onPlay);\n audioEl.addEventListener('pause', onPause);\n audioEl.addEventListener('ended', onEnded);\n audioEl.addEventListener('loadedmetadata', onLoadedMeta);\n audioEl.addEventListener('error', onElementError);\n\n hls.on(Hls.Events.MANIFEST_PARSED, () => {\n if (isStale()) return;\n this.emit('loaded');\n resolve();\n });\n\n hls.on(Hls.Events.ERROR, (_event: unknown, data: { fatal?: boolean }) => {\n if (isStale()) return;\n if (data.fatal) {\n synxedWarn('Fatal HLS error', data);\n reject(data);\n }\n });\n\n hls.loadSource(url);\n hls.attachMedia(audioEl);\n\n this.hls = hls;\n this.audioEl = audioEl;\n });\n }\n } catch (e) {\n synxedWarn('hls.js not available, falling back to native playback', e);\n }\n }\n\n return new Promise<void>((resolve, reject) => {\n const isStale = () => generation !== this.loadGeneration;\n\n this.howl = new Howl({\n src: [url],\n html5: true,\n format: isHls ? ['m3u8'] : undefined,\n onload: () => {\n if (isStale()) return;\n synxedDebug('AudioEngine loaded');\n this.emit('loaded');\n resolve();\n },\n onloaderror: (_id, err) => {\n if (isStale()) return;\n synxedWarn('AudioEngine load error', err);\n reject(err);\n },\n onplay: () => {\n if (isStale()) return;\n this.emit('playing');\n this.startTimeUpdateLoop();\n },\n onpause: () => {\n if (isStale()) return;\n this.emit('paused');\n this.stopTimeUpdateLoop();\n },\n onstop: () => {\n if (isStale()) return;\n this.emit('stopped');\n this.stopTimeUpdateLoop();\n },\n onend: () => {\n if (isStale()) return;\n this.emit('ended');\n this.stopTimeUpdateLoop();\n },\n });\n });\n }\n\n play(): void {\n if (this.audioEl) {\n this.audioEl.play().catch((e) => synxedWarn('Play failed', e));\n } else {\n this.howl?.play();\n }\n }\n\n pause(): void {\n if (this.audioEl) {\n this.audioEl.pause();\n } else {\n this.howl?.pause();\n }\n }\n\n stop(): void {\n this.loadGeneration += 1;\n this.teardownPlayback();\n this.emit('stopped');\n }\n\n seek(ms: number): void {\n if (this.audioEl) {\n this.audioEl.currentTime = ms / 1000;\n } else {\n this.howl?.seek(ms / 1000);\n }\n }\n\n setVolume(volume: number): void {\n if (this.audioEl) {\n this.audioEl.volume = volume;\n }\n if (this.howl) {\n this.howl.volume(volume);\n }\n }\n\n get duration(): number {\n if (this.audioEl) return this.audioEl.duration * 1000;\n return (this.howl?.duration() || 0) * 1000;\n }\n\n get currentTime(): number {\n if (this.audioEl) return this.audioEl.currentTime * 1000;\n return ((this.howl?.seek() as number) || 0) * 1000;\n }\n\n private teardownPlayback(): void {\n if (this.hls) {\n try {\n this.hls.destroy();\n } catch {\n // ignore teardown races\n }\n this.hls = null;\n }\n if (this.audioEl) {\n this.audioEl.pause();\n this.audioEl.removeAttribute('src');\n this.audioEl.load();\n this.audioEl = null;\n }\n if (this.howl) {\n this.howl.stop();\n this.howl.unload();\n this.howl = null;\n }\n this.stopTimeUpdateLoop();\n }\n\n private startTimeUpdateLoop(): void {\n this.stopTimeUpdateLoop();\n const update = () => {\n const isPlaying = this.audioEl ? !this.audioEl.paused : this.howl?.playing();\n if (isPlaying) {\n this.emit('timeupdate', {\n currentTime: this.currentTime,\n duration: this.duration,\n });\n this.updateTimer = requestAnimationFrame(update);\n }\n };\n this.updateTimer = requestAnimationFrame(update);\n }\n\n private stopTimeUpdateLoop(): void {\n if (this.updateTimer !== null) {\n cancelAnimationFrame(this.updateTimer);\n this.updateTimer = null;\n }\n }\n}\n","import { EventEmitter } from '../core/EventEmitter';\nimport { TrackInfo } from '../types';\n\nexport interface PlaylistEvents {\n trackChanged: (track: TrackInfo) => void;\n queueUpdated: (tracks: TrackInfo[]) => void;\n}\n\nexport class PlaylistManager extends EventEmitter<PlaylistEvents> {\n private queue: TrackInfo[] = [];\n private currentIndex: number = -1;\n\n constructor() {\n super();\n }\n\n setQueue(tracks: TrackInfo[], currentIndex?: number): void {\n this.queue = tracks;\n this.currentIndex =\n typeof currentIndex === 'number' &&\n currentIndex >= 0 &&\n currentIndex < tracks.length\n ? currentIndex\n : tracks.length > 0\n ? 0\n : -1;\n this.emit('queueUpdated', this.queue);\n if (this.getCurrentTrack()) {\n this.emit('trackChanged', this.getCurrentTrack()!);\n }\n }\n\n getCurrentTrack(): TrackInfo | null {\n if (this.currentIndex >= 0 && this.currentIndex < this.queue.length) {\n return this.queue[this.currentIndex];\n }\n return null;\n }\n\n next(): TrackInfo | null {\n if (this.currentIndex < this.queue.length - 1) {\n this.currentIndex++;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n previous(): TrackInfo | null {\n if (this.currentIndex > 0) {\n this.currentIndex--;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n skipTo(index: number): TrackInfo | null {\n if (index >= 0 && index < this.queue.length) {\n this.currentIndex = index;\n const track = this.getCurrentTrack();\n this.emit('trackChanged', track!);\n return track;\n }\n return null;\n }\n\n reset(): void {\n this.queue = [];\n this.currentIndex = -1;\n this.emit('queueUpdated', []);\n }\n\n get hasNext(): boolean {\n return this.currentIndex < this.queue.length - 1;\n }\n\n get hasPrevious(): boolean {\n return this.currentIndex > 0;\n }\n\n get queueSnapshot(): TrackInfo[] {\n return [...this.queue];\n }\n\n get currentIndexSnapshot(): number {\n return this.currentIndex;\n }\n}\n","export class SynxedError extends Error {\n constructor(message: string, public code?: string) {\n super(message);\n this.name = 'SynxedError';\n }\n}\n\nexport class SynxedConnectionError extends SynxedError {\n constructor(message: string) {\n super(message);\n this.name = 'SynxedConnectionError';\n }\n}\n\nexport class SynxedPlaybackError extends SynxedError {\n constructor(error: any) {\n super(typeof error === 'string' ? error : 'Playback failed');\n this.name = 'SynxedPlaybackError';\n }\n}\n\nexport class SynxedProtocolError extends SynxedError {\n constructor(message: string) {\n super(message);\n this.name = 'SynxedProtocolError';\n }\n}\n","import { ContentKind } from '../proto/sdk-streaming';\nimport type { TrackInfo } from '../types';\n\nexport interface NormalizedInitAck {\n sessionId: string;\n playbackUrl: string;\n isHls: boolean;\n heartbeatIntervalMs: number;\n contentSummary?: string;\n}\n\nexport interface ParsedContentSummary {\n tracks: TrackInfo[];\n currentIndex: number;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string | undefined {\n for (const key of keys) {\n const v = obj[key];\n if (typeof v === 'string' && v.length > 0) return v;\n }\n return undefined;\n}\n\nfunction readNumber(obj: Record<string, unknown>, ...keys: string[]): number | undefined {\n for (const key of keys) {\n const v = obj[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n if (typeof v === 'string' && v !== '' && !Number.isNaN(Number(v))) return Number(v);\n }\n return undefined;\n}\n\n/** Normalizes initAck from protobuf `toObject` (camelCase or snake_case). */\nexport function normalizeInitAck(payload: Record<string, unknown>): NormalizedInitAck | null {\n const raw = payload.initAck ?? payload.init_ack;\n if (!raw || typeof raw !== 'object') return null;\n\n const ack = raw as Record<string, unknown>;\n const playbackUrl = readString(ack, 'playbackUrl', 'playback_url');\n if (!playbackUrl) return null;\n\n return {\n sessionId: readString(ack, 'sessionId', 'session_id') ?? '',\n playbackUrl,\n isHls: Boolean(ack.isHls ?? ack.is_hls),\n heartbeatIntervalMs: readNumber(ack, 'heartbeatIntervalMs', 'heartbeat_interval_ms') ?? 0,\n contentSummary: readString(ack, 'contentSummary', 'content_summary'),\n };\n}\n\nfunction normalizeTrack(item: unknown): TrackInfo | null {\n if (!item || typeof item !== 'object') return null;\n const t = item as Record<string, unknown>;\n const id = t.id;\n if (typeof id !== 'string' || !id.trim()) return null;\n\n const kind: TrackInfo['kind'] = t.kind === 'internal' ? 'internal' : 'catalog';\n const albumArt = t.albumArt ?? t.album_art;\n\n return {\n id: id.trim(),\n kind,\n title: typeof t.title === 'string' ? t.title : undefined,\n artist: typeof t.artist === 'string' ? t.artist : undefined,\n duration: typeof t.duration === 'number' ? t.duration : undefined,\n albumArt: typeof albumArt === 'string' ? albumArt : undefined,\n };\n}\n\n/**\n * Parses `contentSummary` JSON from initAck into a playlist queue.\n * Returns `null` when summary is absent or has no usable queue (playback may still continue).\n */\nexport function parseContentSummary(\n contentSummary: string | undefined,\n contentKind: ContentKind,\n): ParsedContentSummary | null {\n if (!contentSummary?.trim()) return null;\n\n let summary: unknown;\n try {\n summary = JSON.parse(contentSummary);\n } catch {\n return null;\n }\n\n if (!summary || typeof summary !== 'object') return null;\n const s = summary as Record<string, unknown>;\n\n const type = s.type;\n if (type === 'live_radio' || contentKind === ContentKind.RADIO) {\n const station =\n typeof s.station === 'string' && s.station.trim() ? s.station.trim() : 'Synxed Radio';\n return {\n tracks: [{ id: 'synxed-radio', kind: 'catalog', title: station, artist: '' }],\n currentIndex: 0,\n };\n }\n\n const tracksRaw = s.tracks;\n if (!Array.isArray(tracksRaw) || tracksRaw.length === 0) return null;\n\n const tracks: TrackInfo[] = [];\n for (const item of tracksRaw) {\n const track = normalizeTrack(item);\n if (track) tracks.push(track);\n }\n if (tracks.length === 0) return null;\n\n const rawIndex =\n typeof s.currentIndex === 'number'\n ? s.currentIndex\n : typeof s.current_index === 'number'\n ? s.current_index\n : 0;\n\n const currentIndex = Math.max(0, Math.min(Math.floor(rawIndex), tracks.length - 1));\n return { tracks, currentIndex };\n}\n","export interface NormalizedAdPayload {\n adId: string;\n campaignId: string;\n playbackUrl: string;\n isHls: boolean;\n durationSeconds: number;\n isSkippable: boolean;\n skipAfterSeconds: number;\n ctaType: string;\n ctaValue: string;\n brandName: string;\n creativeName: string;\n companionBannerUrl: string;\n campaignName: string;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'string') return value;\n }\n return '';\n}\n\nfunction readBool(obj: Record<string, unknown>, ...keys: string[]): boolean {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'boolean') return value;\n }\n return false;\n}\n\nfunction readNumber(obj: Record<string, unknown>, ...keys: string[]): number {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === 'number' && Number.isFinite(value)) return value;\n if (typeof value === 'string' && value.trim()) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n }\n }\n return 0;\n}\n\nexport function normalizeAdPayload(\n payload: Record<string, unknown>,\n): NormalizedAdPayload | null {\n const raw = payload.ad;\n if (!raw || typeof raw !== 'object') return null;\n\n const ad = raw as Record<string, unknown>;\n const playbackUrl = readString(ad, 'playbackUrl', 'playback_url');\n if (!playbackUrl) return null;\n\n return {\n adId: readString(ad, 'adId', 'ad_id'),\n campaignId: readString(ad, 'campaignId', 'campaign_id'),\n playbackUrl,\n isHls: readBool(ad, 'isHls', 'is_hls') || playbackUrl.includes('.m3u8'),\n durationSeconds: readNumber(ad, 'durationSeconds', 'duration_seconds') || 15,\n isSkippable: readBool(ad, 'isSkippable', 'is_skippable'),\n skipAfterSeconds: readNumber(ad, 'skipAfterSeconds', 'skip_after_seconds'),\n ctaType: readString(ad, 'ctaType', 'cta_type'),\n ctaValue: readString(ad, 'ctaValue', 'cta_value'),\n brandName: readString(ad, 'brandName', 'brand_name'),\n creativeName: readString(ad, 'creativeName', 'creative_name'),\n companionBannerUrl: readString(ad, 'companionBannerUrl', 'companion_banner_url'),\n campaignName: readString(ad, 'campaignName', 'campaign_name'),\n };\n}\n","export const VOICE_CAPTURE_MIME = \"audio/pcm;rate=16000\";\r\nexport const VOICE_RESPONSE_MIME = \"audio/pcm;rate=24000\";\r\n\r\nexport function parsePcmSampleRate(mimeType: string, fallback: number): number {\r\n const match = /rate=(\\d+)/i.exec(mimeType);\r\n if (!match) return fallback;\r\n const rate = Number(match[1]);\r\n return Number.isFinite(rate) && rate > 0 ? rate : fallback;\r\n}\r\n","import { VOICE_RESPONSE_MIME } from \"../voice/voiceAudioFormats\";\n\nexport interface NormalizedVoiceAck {\n status: string;\n transcript?: string;\n playlistCode?: string;\n playlistName?: string;\n}\n\nfunction readString(obj: Record<string, unknown>, ...keys: string[]): string {\n for (const key of keys) {\n const value = obj[key];\n if (typeof value === \"string\") return value;\n }\n return \"\";\n}\n\nexport function normalizeVoiceAck(\n payload: Record<string, unknown>,\n): NormalizedVoiceAck | null {\n const raw = payload.voiceAck ?? payload.voice_ack;\n if (!raw || typeof raw !== \"object\") return null;\n\n const ack = raw as Record<string, unknown>;\n const status = readString(ack, \"status\");\n if (!status) return null;\n\n return {\n status,\n transcript: readString(ack, \"transcript\") || undefined,\n playlistCode: readString(ack, \"playlistCode\", \"playlist_code\") || undefined,\n playlistName: readString(ack, \"playlistName\", \"playlist_name\") || undefined,\n };\n}\n\nexport interface NormalizedVoiceAudio {\n audioData: Uint8Array;\n mimeType: string;\n isFinal: boolean;\n}\n\nexport function normalizeVoiceAudio(\n payload: Record<string, unknown>,\n): NormalizedVoiceAudio | null {\n const raw = payload.voiceAudio ?? payload.voice_audio;\n if (!raw || typeof raw !== \"object\") return null;\n\n const audio = raw as Record<string, unknown>;\n const audioData = audio.audioData ?? audio.audio_data;\n const mimeType =\n readString(audio, \"mimeType\", \"mime_type\") || VOICE_RESPONSE_MIME;\n const isFinal = Boolean(audio.isFinal ?? audio.is_final);\n\n let finalAudioData: Uint8Array;\n\n if (typeof audioData === \"string\") {\n const binaryString = atob(audioData);\n const len = binaryString.length;\n finalAudioData = new Uint8Array(len);\n for (let i = 0; i < len; i++) {\n finalAudioData[i] = binaryString.charCodeAt(i);\n }\n } else if (audioData instanceof Uint8Array) {\n finalAudioData = audioData;\n } else {\n return null;\n }\n\n return {\n audioData: finalAudioData,\n mimeType,\n isFinal,\n };\n}\n","import { synxedWarn } from \"../core/debug\";\nimport {\n parsePcmSampleRate,\n VOICE_RESPONSE_MIME,\n} from \"./voiceAudioFormats\";\n\n/**\n * High-performance streaming PCM player for AI voice responses.\n * Buffers and schedules Int16 PCM chunks seamlessly using the Web Audio API.\n */\nexport class VoiceResponsePlayer {\n private audioContext: AudioContext | null = null;\n private nextStartTime = 0;\n private defaultSampleRate = parsePcmSampleRate(VOICE_RESPONSE_MIME, 24000);\n\n private initContext(sampleRate: number) {\n if (!this.audioContext) {\n this.audioContext = new (window.AudioContext ||\n (window as any).webkitAudioContext)({\n sampleRate,\n });\n this.nextStartTime = this.audioContext.currentTime;\n }\n }\n\n /**\n * Enqueues a chunk of raw 16-bit PCM data to be played seamlessly.\n */\n public enqueueChunk(\n pcmData: Uint8Array,\n mimeType = VOICE_RESPONSE_MIME,\n ): void {\n try {\n const sampleRate = parsePcmSampleRate(mimeType, this.defaultSampleRate);\n this.initContext(sampleRate);\n if (!this.audioContext) return;\n\n const int16 = new Int16Array(\n pcmData.buffer,\n pcmData.byteOffset,\n pcmData.byteLength / 2,\n );\n const float32 = new Float32Array(int16.length);\n for (let i = 0; i < int16.length; i++) {\n float32[i] = int16[i] / 32768.0;\n }\n\n const audioBuffer = this.audioContext.createBuffer(\n 1,\n float32.length,\n sampleRate,\n );\n audioBuffer.getChannelData(0).set(float32);\n\n const source = this.audioContext.createBufferSource();\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n\n const currentTime = this.audioContext.currentTime;\n\n if (this.nextStartTime < currentTime) {\n this.nextStartTime = currentTime + 0.05;\n }\n\n source.start(this.nextStartTime);\n this.nextStartTime += audioBuffer.duration;\n } catch (err) {\n synxedWarn(\"VoiceResponsePlayer failed to enqueue chunk\", err);\n }\n }\n\n /**\n * Instantly halts playback and resets the streaming buffer state.\n */\n public stop(): void {\n if (this.audioContext) {\n this.audioContext.close().catch(() => {});\n this.audioContext = null;\n }\n this.nextStartTime = 0;\n }\n}\n","import { EventEmitter } from \"../core/EventEmitter\";\nimport { synxedWarn } from \"../core/debug\";\nimport { VOICE_CAPTURE_MIME } from \"./voiceAudioFormats\";\n\nconst VAD_WEB_CDN =\n \"https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.29/dist/\";\nconst ONNX_CDN = \"https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/\";\n\nexport interface VoiceCaptureEvents {\n chunk: (data: Uint8Array, sequence: number) => void;\n error: (error: Error) => void;\n speechStart: () => void;\n speechEnd: () => void;\n userSpeakingChange: (speaking: boolean) => void;\n}\n\nexport interface VoiceCaptureOptions {\n maxDurationMs?: number;\n vadBaseAssetPath?: string;\n onnxWasmBasePath?: string;\n}\n\ntype MicVadHandle = {\n pause: () => void;\n start: () => void;\n};\n\n/**\n * Silero VAD capture — pre-warmed MicVAD instance, pause/reuse between holds.\n */\nexport class VoiceCaptureManager extends EventEmitter<VoiceCaptureEvents> {\n private capturing = false;\n private mimeType = VOICE_CAPTURE_MIME;\n private micVad: MicVadHandle | null = null;\n private initPromise: Promise<void> | null = null;\n private vadBaseAssetPath = VAD_WEB_CDN;\n private onnxWasmBasePath = ONNX_CDN;\n private speechEndEmitted = false;\n private userSpeaking = false;\n private maxDurationTimer: ReturnType<typeof setTimeout> | null = null;\n private chunkSequence = 0;\n\n get isCapturing(): boolean {\n return this.capturing;\n }\n\n get isUserSpeaking(): boolean {\n return this.userSpeaking;\n }\n\n public async preloadModels(options: VoiceCaptureOptions = {}): Promise<void> {\n this.applyOptions(options);\n try {\n await this.ensureMicVad();\n } catch (err) {\n const error = this.toCaptureError(\n err,\n \"Failed to preload voice capture models\",\n );\n synxedWarn(error.message, err);\n throw error;\n }\n }\n\n private applyOptions(options: VoiceCaptureOptions): void {\n if (options.vadBaseAssetPath)\n this.vadBaseAssetPath = options.vadBaseAssetPath;\n if (options.onnxWasmBasePath)\n this.onnxWasmBasePath = options.onnxWasmBasePath;\n }\n\n private toCaptureError(err: unknown, context: string): Error {\n if (err instanceof Error) {\n return new Error(`${context}: ${err.message}`);\n }\n return new Error(`${context}: ${String(err)}`);\n }\n\n private clearMaxDurationTimer(): void {\n if (this.maxDurationTimer !== null) {\n clearTimeout(this.maxDurationTimer);\n this.maxDurationTimer = null;\n }\n }\n\n private setUserSpeaking(speaking: boolean): void {\n if (this.userSpeaking === speaking) return;\n this.userSpeaking = speaking;\n this.emit(\"userSpeakingChange\", speaking);\n }\n\n private handleFrame(frame: Float32Array): void {\n if (!this.capturing || this.speechEndEmitted) return;\n\n const int16 = new Int16Array(frame.length);\n for (let i = 0; i < frame.length; i++) {\n const s = Math.max(-1, Math.min(1, frame[i]));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n this.chunkSequence += 1;\n this.emit(\"chunk\", new Uint8Array(int16.buffer), this.chunkSequence);\n }\n\n private handleSpeechStart(): void {\n if (!this.capturing) return;\n this.speechEndEmitted = false;\n this.setUserSpeaking(true);\n this.emit(\"speechStart\");\n }\n\n private handleSpeechEnd(): void {\n if (!this.capturing || this.speechEndEmitted) return;\n this.speechEndEmitted = true;\n this.setUserSpeaking(false);\n this.emit(\"speechEnd\");\n }\n\n /**\n * Pause the underlying MicVAD instance.\n * @param operation - caller context for logs and error messages\n * @param wasCapturing - whether capture was active before teardown\n * @param reportError - emit `error` to listeners when pause fails\n */\n private pauseMicVad(\n operation: \"stop\" | \"cancel\",\n wasCapturing: boolean,\n reportError: boolean,\n ): void {\n if (!this.micVad) return;\n\n try {\n this.micVad.pause();\n } catch (err) {\n const error = this.toCaptureError(\n err,\n `Microphone pause failed during ${operation}`,\n );\n synxedWarn(error.message, err);\n\n if (wasCapturing && reportError) {\n this.emit(\"error\", error);\n } else if (wasCapturing) {\n synxedWarn(\n \"Voice capture may still be active in the browser after stop; \" +\n \"release the mic hold and retry if audio issues persist.\",\n );\n }\n }\n }\n\n private async ensureMicVad(): Promise<void> {\n if (this.micVad) return;\n if (this.initPromise) {\n await this.initPromise;\n return;\n }\n\n this.initPromise = (async () => {\n try {\n const { MicVAD } = await import(\"@ricky0123/vad-web\");\n const vad = await MicVAD.new({\n baseAssetPath: this.vadBaseAssetPath,\n onnxWASMBasePath: this.onnxWasmBasePath,\n positiveSpeechThreshold: 0.5,\n negativeSpeechThreshold: 0.35,\n redemptionMs: 500,\n minSpeechMs: 250,\n onFrameProcessed: (_probabilities: unknown, frame: Float32Array) => {\n this.handleFrame(frame);\n },\n onSpeechStart: () => this.handleSpeechStart(),\n onSpeechEnd: () => this.handleSpeechEnd(),\n });\n try {\n vad.pause();\n } catch (err) {\n throw this.toCaptureError(\n err,\n \"Failed to pause MicVAD after initialization\",\n );\n }\n this.micVad = vad;\n } catch (err) {\n this.initPromise = null;\n throw err;\n }\n })();\n\n await this.initPromise;\n }\n\n async start(options: VoiceCaptureOptions = {}): Promise<string> {\n if (this.capturing) return this.mimeType;\n\n this.applyOptions(options);\n this.speechEndEmitted = false;\n this.chunkSequence = 0;\n this.setUserSpeaking(false);\n this.clearMaxDurationTimer();\n\n try {\n await this.ensureMicVad();\n if (!this.micVad) {\n throw new Error(\"VAD failed to initialize\");\n }\n\n this.capturing = true;\n try {\n this.micVad.start();\n } catch (err) {\n this.capturing = false;\n throw this.toCaptureError(err, \"Failed to start microphone capture\");\n }\n\n const maxMs = options.maxDurationMs ?? 30_000;\n if (maxMs > 0) {\n this.maxDurationTimer = setTimeout(() => {\n if (!this.capturing) return;\n this.handleSpeechEnd();\n }, maxMs);\n }\n } catch (err) {\n this.capturing = false;\n const error = this.toCaptureError(\n err,\n \"Failed to initialize voice capture\",\n );\n synxedWarn(error.message, err);\n this.emit(\"error\", error);\n }\n\n return this.mimeType;\n }\n\n async stop(): Promise<void> {\n this.clearMaxDurationTimer();\n const wasCapturing = this.capturing;\n this.capturing = false;\n this.setUserSpeaking(false);\n // Do not emit error — stop runs on the success path before the server processes audio.\n this.pauseMicVad(\"stop\", wasCapturing, false);\n }\n\n cancel(): void {\n this.clearMaxDurationTimer();\n const wasCapturing = this.capturing;\n this.capturing = false;\n this.speechEndEmitted = false;\n this.setUserSpeaking(false);\n this.pauseMicVad(\"cancel\", wasCapturing, true);\n }\n}\n","import { TransportManager } from \"../transport/TransportManager\";\nimport { AudioEngine } from \"../audio/AudioEngine\";\nimport { PlaylistManager } from \"../playlist/PlaylistManager\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { ContentKind, SdkControlAction, SdkVoiceAction } from \"../proto/sdk-streaming\";\nimport {\n SynxedConfig,\n PlayerState,\n PlaySongOptions,\n PlayPlaylistOptions,\n PlayRadioOptions,\n SynxedEvents,\n TrackInfo,\n VoiceState,\n VoiceHoldOptions,\n VoiceResult,\n AdSkipState,\n} from \"../types\";\nimport {\n SynxedError,\n SynxedPlaybackError,\n SynxedConnectionError,\n} from \"./errors\";\nimport { normalizeInitAck, parseContentSummary } from \"./contentSummary\";\nimport { normalizeAdPayload } from \"./adPayload\";\nimport { normalizeVoiceAck, normalizeVoiceAudio } from \"./voicePayload\";\nimport { VoiceResponsePlayer } from \"../voice/VoiceResponsePlayer\";\nimport { VoiceCaptureManager } from \"../voice/VoiceCaptureManager\";\nimport { VOICE_CAPTURE_MIME } from \"../voice/voiceAudioFormats\";\nimport { setSynxedDebug, synxedDebug, synxedWarn } from \"./debug\";\nimport type { AdInfo } from \"../types\";\n\nexport class SynxedPlayer extends EventEmitter<SynxedEvents> {\n private transport: TransportManager;\n private audio: AudioEngine;\n private playlist: PlaylistManager;\n private voiceCapture: VoiceCaptureManager;\n private voiceResponsePlayer: VoiceResponsePlayer;\n private config: SynxedConfig;\n private status: PlayerState[\"status\"] = \"idle\";\n private volume = 0.8;\n private activeContentKind: ContentKind = ContentKind.UNSPECIFIED;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private adPlaying = false;\n private _currentAd: AdInfo | null = null;\n private _voiceState: VoiceState = \"idle\";\n private voiceMimeType = \"audio/webm\";\n private voiceListenerId: string | undefined;\n private pendingPlaybackLoad: Promise<void> | null = null;\n private voiceAutoEndOnSilence = true;\n private pausedForVoice = false;\n private _voiceUserSpeaking = false;\n\n constructor(config: SynxedConfig) {\n super();\n this.config = config;\n setSynxedDebug(Boolean(config.debug));\n this.transport = new TransportManager();\n this.audio = new AudioEngine();\n this.playlist = new PlaylistManager();\n this.voiceCapture = new VoiceCaptureManager();\n this.voiceResponsePlayer = new VoiceResponsePlayer();\n\n this.setupListeners();\n\n // Silently prefetch the AI voice models in the background\n void this.voiceCapture.preloadModels(this.config.voice);\n\n if (config.autoConnect) {\n this.connect();\n }\n }\n\n get currentTrack(): TrackInfo | null {\n return this.playlist.getCurrentTrack();\n }\n\n /** Active playback init kind from the last `play*` call (RADIO, PLAYLIST, SONG, …). */\n get contentKind(): ContentKind {\n return this.activeContentKind;\n }\n\n get currentAd(): AdInfo | null {\n return this._currentAd;\n }\n\n get isAdPlaying(): boolean {\n return this.adPlaying;\n }\n\n /** True when a skippable ad has played for at least `skipAfterSeconds` (default 5s). */\n canSkipAd(): boolean {\n if (!this.adPlaying || !this._currentAd?.isSkippable) return false;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n return positionMs >= this._currentAd.skipAfterSeconds * 1000;\n }\n\n /** Seconds until skip unlocks; `0` when skip is available; `null` when not in a skippable ad. */\n getAdSkipCountdownSeconds(): number | null {\n if (!this.adPlaying || !this._currentAd?.isSkippable) return null;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n const requiredMs = this._currentAd.skipAfterSeconds * 1000;\n if (positionMs >= requiredMs) return 0;\n return Math.ceil((requiredMs - positionMs) / 1000);\n }\n\n get voiceState(): VoiceState {\n return this._voiceState;\n }\n\n /** True while VAD detects the user is actively speaking during a voice hold. */\n get voiceUserSpeaking(): boolean {\n return this._voiceUserSpeaking;\n }\n\n private controlPositionMs(): number {\n if (this.activeContentKind === ContentKind.RADIO) return 0;\n return this.positionMsForAnalytics();\n }\n\n private setupListeners(): void {\n this.transport.on(\"connected\", () => this.emit(\"connected\"));\n this.transport.on(\"disconnected\", (reason) =>\n this.emit(\"disconnected\", reason),\n );\n this.transport.on(\"error\", (error) =>\n this.emit(\"error\", new SynxedConnectionError(error.message)),\n );\n this.transport.on(\"message\", (payload) =>\n this.handleServerMessage(payload),\n );\n\n this.audio.on(\"playing\", () => this.updateStatus(\"playing\"));\n this.audio.on(\"paused\", () => this.updateStatus(\"paused\"));\n this.audio.on(\"stopped\", () => {\n if (!this.adPlaying && this._voiceState === \"idle\") {\n this.updateStatus(\"idle\");\n }\n });\n this.audio.on(\"loading\", () => this.updateStatus(\"loading\"));\n this.audio.on(\"error\", (error) => {\n if (this.adPlaying) {\n synxedWarn(\"Ad playback error — waiting for next track\", error);\n return;\n }\n this.emit(\"error\", new SynxedPlaybackError(error));\n });\n this.audio.on(\"timeupdate\", (time) => {\n this.emit(\"timeUpdate\", time);\n if (this.adPlaying && this._currentAd) {\n this.emitAdSkipUpdate(time.currentTime);\n }\n });\n this.audio.on(\"ended\", () => this.handleTrackEnded());\n\n this.playlist.on(\"trackChanged\", (track) =>\n this.emit(\"trackChange\", track),\n );\n this.playlist.on(\"queueUpdated\", (tracks) =>\n this.emit(\"queueUpdated\", tracks),\n );\n\n this.voiceCapture.on(\"chunk\", (chunk, sequence) => {\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CHUNK,\n audioData: chunk,\n mimeType: this.voiceMimeType,\n sequence,\n listenerId: this.voiceListenerId,\n deviceType: this.config.deviceType,\n gameContext: this.config.gameContext,\n });\n });\n this.voiceCapture.on(\"error\", (error) => {\n this.setVoiceState(\"error\");\n this.emit(\"error\", new SynxedError(error.message, \"VOICE_CAPTURE_FAILED\"));\n });\n this.voiceCapture.on(\"speechStart\", () => {\n this.emit(\"voiceSpeechStart\");\n });\n this.voiceCapture.on(\"speechEnd\", () => {\n this.emit(\"voiceSpeechEnd\");\n if (this.voiceAutoEndOnSilence && this._voiceState === \"listening\") {\n void this.endVoiceHold();\n }\n });\n this.voiceCapture.on(\"userSpeakingChange\", (speaking) => {\n this._voiceUserSpeaking = speaking;\n this.emit(\"voiceUserSpeakingChange\", speaking);\n });\n }\n\n private resolveVoiceOptions(\n options: VoiceHoldOptions = {},\n ): VoiceHoldOptions {\n return { ...this.config.voice, ...options };\n }\n\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\n }\n\n private buildInitExtras(): { gameContext?: string; deviceType?: string } {\n const extras: { gameContext?: string; deviceType?: string } = {};\n if (this.config.gameContext?.trim()) {\n extras.gameContext = this.config.gameContext.trim();\n }\n if (this.config.deviceType?.trim()) {\n extras.deviceType = this.config.deviceType.trim();\n }\n return extras;\n }\n\n async playSong(options: PlaySongOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.SONG;\n this.transport.sendInit({\n contentKind: ContentKind.SONG,\n catalogTrackId: options.catalogTrackId,\n internalTrackId: options.internalTrackId,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playPlaylist(options: PlayPlaylistOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.PLAYLIST;\n this.transport.sendInit({\n contentKind: ContentKind.PLAYLIST,\n playlistCode: options.playlistCode,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playRadio(options: PlayRadioOptions = {}): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.RADIO;\n this.transport.sendInit({\n contentKind: ContentKind.RADIO,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n /**\n * Press-and-hold the DJ avatar (or call manually): start mic capture and stream chunks.\n * Ends automatically when the user stops talking (`voiceSpeechEnd`) or call `endVoiceHold()`.\n */\n async beginVoiceHold(options: VoiceHoldOptions = {}): Promise<void> {\n if (\n this._voiceState === \"listening\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n return;\n }\n\n const voiceOpts = this.resolveVoiceOptions(options);\n this.voiceAutoEndOnSilence = voiceOpts.autoEndOnSilence !== false;\n this._voiceUserSpeaking = false;\n\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.voiceListenerId = voiceOpts.listenerId?.trim() || undefined;\n\n this.pausedForVoice = this.status === \"playing\";\n if (this.pausedForVoice) {\n this.pause();\n }\n this.voiceResponsePlayer.stop();\n\n this.setVoiceState(\"listening\");\n\n this.voiceMimeType = await this.voiceCapture.start({\n maxDurationMs: voiceOpts.maxDurationMs,\n });\n\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_START,\n mimeType: this.voiceMimeType || VOICE_CAPTURE_MIME,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n }\n\n /**\n * Release press-and-hold: flush final audio chunk and request playlist generation.\n */\n async endVoiceHold(): Promise<void> {\n if (this._voiceState !== \"listening\") return;\n\n this._voiceUserSpeaking = false;\n this.emit(\"voiceUserSpeakingChange\", false);\n this.setVoiceState(\"processing\");\n\n await this.voiceCapture.stop();\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_END,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n }\n\n /** Cancel an in-progress voice hold without sending audio to the server. */\n cancelVoiceHold(): void {\n if (this._voiceState !== \"listening\") return;\n this._voiceUserSpeaking = false;\n this.voiceCapture.cancel();\n this.setVoiceState(\"idle\");\n }\n\n /**\n * Close the voice UI: cancel recording if active and resume playback if it was\n * paused for voice.\n */\n dismissVoiceAndResume(): void {\n if (this._voiceState === \"listening\") {\n this.cancelVoiceHold();\n }\n if (this.pausedForVoice) {\n this.resume();\n this.pausedForVoice = false;\n }\n }\n\n get isVoiceUiActive(): boolean {\n return (\n this._voiceState === \"listening\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n );\n }\n\n pause(): void {\n this.audio.pause();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_PAUSE,\n positionMs: this.controlPositionMs(),\n });\n }\n\n resume(): void {\n this.audio.play();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_PLAY,\n positionMs: this.controlPositionMs(),\n });\n }\n\n stop(): void {\n this.audio.stop();\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_STOP,\n positionMs: this.controlPositionMs(),\n });\n }\n\n skip(): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n if (this.adPlaying) {\n this.skipAd();\n return;\n }\n if (this.playlist.queueSnapshot.length > 1) {\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SKIP_NEXT,\n positionMs: this.controlPositionMs(),\n });\n this.updateStatus(\"loading\");\n return;\n }\n\n const nextTrack = this.playlist.next();\n if (nextTrack) {\n this.playSong(\n nextTrack.kind === \"internal\"\n ? { internalTrackId: nextTrack.id }\n : { catalogTrackId: nextTrack.id },\n );\n }\n }\n\n previous(): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n if (this.playlist.queueSnapshot.length > 1) {\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SKIP_PREVIOUS,\n positionMs: this.controlPositionMs(),\n });\n this.updateStatus(\"loading\");\n return;\n }\n\n const prevTrack = this.playlist.previous();\n if (prevTrack) {\n this.playSong(\n prevTrack.kind === \"internal\"\n ? { internalTrackId: prevTrack.id }\n : { catalogTrackId: prevTrack.id },\n );\n }\n }\n\n skipTo(index: number): void {\n if (this.activeContentKind === ContentKind.RADIO) return;\n const track = this.playlist.skipTo(index);\n if (track) {\n this.playSong(\n track.kind === \"internal\"\n ? { internalTrackId: track.id }\n : { catalogTrackId: track.id },\n );\n }\n }\n\n seek(ms: number): void {\n if (this.activeContentKind === ContentKind.RADIO || this.adPlaying) return;\n this.audio.seek(ms);\n this.transport.sendControl({\n action: SdkControlAction.CONTROL_SEEK,\n positionMs: ms,\n });\n }\n\n setVolume(volume: number): void {\n this.volume = Math.max(0, Math.min(1, volume));\n this.audio.setVolume(this.volume);\n }\n\n private positionMsForAnalytics(override?: number): number {\n if (typeof override === \"number\") {\n return Math.max(0, Math.min(0xffffffff, Math.floor(override)));\n }\n return Math.max(\n 0,\n Math.min(0xffffffff, Math.floor(this.audio.currentTime)),\n );\n }\n\n private emitAnalytics(\n eventType: string,\n positionMs?: number,\n extra?: unknown,\n ): void {\n this.transport.sendAnalytics({\n eventType,\n positionMs: this.positionMsForAnalytics(positionMs),\n extraJson: extra ? JSON.stringify(extra) : undefined,\n });\n }\n\n private clearHeartbeat(): void {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private startHeartbeat(intervalMs: number): void {\n this.clearHeartbeat();\n const interval = Number(intervalMs);\n if (!interval || interval < 1000) return;\n\n this.heartbeatTimer = setInterval(() => {\n const pos =\n this.activeContentKind === ContentKind.RADIO\n ? 0\n : this.positionMsForAnalytics();\n this.emitAnalytics(\"heartbeat\", pos);\n }, interval);\n }\n\n private applyContentSummary(contentSummary: string | undefined): void {\n const parsed = parseContentSummary(contentSummary, this.activeContentKind);\n if (parsed) {\n this.playlist.setQueue(parsed.tracks, parsed.currentIndex);\n return;\n }\n\n if (!contentSummary?.trim()) return;\n\n synxedWarn(\"Could not parse contentSummary; queue metadata unavailable.\");\n }\n\n private emitAdSkipUpdate(positionMs: number): void {\n if (!this._currentAd) return;\n\n const requiredMs = this._currentAd.skipAfterSeconds * 1000;\n const canSkip = this._currentAd.isSkippable && positionMs >= requiredMs;\n const countdownSeconds = canSkip\n ? 0\n : Math.ceil((requiredMs - positionMs) / 1000);\n\n const state: AdSkipState = {\n ad: this._currentAd,\n canSkip,\n countdownSeconds,\n };\n this.emit(\"adSkipUpdate\", state);\n }\n\n private setVoiceState(state: VoiceState): void {\n this._voiceState = state;\n this.emit(\"voiceStateChange\", state);\n }\n\n private handleVoiceAck(ack: NonNullable<ReturnType<typeof normalizeVoiceAck>>): void {\n const status = ack.status;\n\n if (status === \"listening\") {\n if (this._voiceState === \"idle\") {\n this.setVoiceState(\"listening\");\n }\n return;\n }\n\n if (status === \"processing\") {\n if (\n this._voiceState === \"listening\" ||\n this._voiceState === \"idle\"\n ) {\n this.setVoiceState(\"processing\");\n }\n return;\n }\n\n if (status === \"ready\") {\n this.activeContentKind = ContentKind.PLAYLIST;\n const result: VoiceResult = {\n status,\n transcript: ack.transcript,\n playlistCode: ack.playlistCode,\n playlistName: ack.playlistName,\n };\n this.setVoiceState(\"ready\");\n this.emit(\"voiceResult\", result);\n return;\n }\n\n this.emit(\"voiceResult\", {\n status,\n transcript: ack.transcript,\n playlistCode: ack.playlistCode,\n playlistName: ack.playlistName,\n });\n }\n\n private async handleServerMessage(\n payload: Record<string, unknown>,\n ): Promise<void> {\n synxedDebug(\"Received server message\", payload);\n\n const voiceAck = normalizeVoiceAck(payload);\n if (voiceAck) {\n this.handleVoiceAck(voiceAck);\n return;\n }\n\n const voiceAudio = normalizeVoiceAudio(payload);\n if (voiceAudio) {\n if (this._voiceState === \"processing\") {\n this.setVoiceState(\"responding\");\n }\n if (voiceAudio.audioData.length > 0) {\n this.voiceResponsePlayer.enqueueChunk(\n voiceAudio.audioData,\n voiceAudio.mimeType,\n );\n }\n return;\n }\n\n const ad = normalizeAdPayload(payload);\n if (ad) {\n await this.handleAdPlayback(ad);\n return;\n }\n\n const ack = normalizeInitAck(payload);\n if (ack) {\n await this.startContentPlayback(ack);\n return;\n }\n\n const err = payload.error;\n if (err && typeof err === \"object\") {\n const e = err as Record<string, unknown>;\n const message =\n typeof e.message === \"string\" ? e.message : \"Unknown server error\";\n const code = typeof e.code === \"string\" ? e.code : undefined;\n if (\n this._voiceState === \"processing\" ||\n this._voiceState === \"listening\" ||\n this._voiceState === \"responding\"\n ) {\n this.setVoiceState(\"error\");\n }\n this.emit(\"error\", new SynxedError(message, code));\n }\n }\n\n private async startContentPlayback(\n ack: NonNullable<ReturnType<typeof normalizeInitAck>>,\n ): Promise<void> {\n if (this.adPlaying && this._currentAd) {\n const endedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n this.emit(\"adEnd\", endedAd);\n } else {\n this.adPlaying = false;\n this._currentAd = null;\n }\n\n if (\n this._voiceState === \"ready\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n this.setVoiceState(\"idle\");\n }\n this.pausedForVoice = false;\n this.voiceResponsePlayer.stop();\n\n synxedDebug(\"Loading playback\", {\n url: ack.playbackUrl,\n isHls: ack.isHls,\n });\n\n const loadPromise = this.audio.load(ack.playbackUrl, ack.isHls);\n this.pendingPlaybackLoad = loadPromise;\n\n try {\n await loadPromise;\n if (this.pendingPlaybackLoad !== loadPromise) return;\n\n this.audio.play();\n this.emitAnalytics(\n \"stream_start\",\n this.activeContentKind === ContentKind.RADIO ? 0 : undefined,\n );\n this.startHeartbeat(ack.heartbeatIntervalMs);\n this.applyContentSummary(ack.contentSummary);\n } catch (error) {\n if (this.pendingPlaybackLoad !== loadPromise) return;\n this.emit(\"error\", new SynxedPlaybackError(error));\n } finally {\n if (this.pendingPlaybackLoad === loadPromise) {\n this.pendingPlaybackLoad = null;\n }\n }\n }\n\n private async handleAdPlayback(\n ad: NonNullable<ReturnType<typeof normalizeAdPayload>>,\n ): Promise<void> {\n if (this.pendingPlaybackLoad) {\n await this.pendingPlaybackLoad.catch(() => undefined);\n }\n this.audio.stop();\n\n this.adPlaying = true;\n this._currentAd = {\n adId: ad.adId,\n campaignId: ad.campaignId,\n brandName: ad.brandName,\n creativeName: ad.creativeName,\n durationSeconds: ad.durationSeconds,\n isSkippable: ad.isSkippable,\n skipAfterSeconds: ad.skipAfterSeconds,\n ctaType: ad.ctaType,\n ctaValue: ad.ctaValue,\n companionBannerUrl: ad.companionBannerUrl,\n campaignName: ad.campaignName,\n };\n\n synxedDebug(\"Loading ad playback\", {\n url: ad.playbackUrl,\n isHls: ad.isHls,\n });\n\n try {\n await this.audio.load(ad.playbackUrl, ad.isHls);\n this.audio.play();\n this.emit(\"adStart\", this._currentAd);\n this.emitAdSkipUpdate(0);\n } catch (error) {\n const failedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n if (failedAd) this.emit(\"adEnd\", failedAd);\n synxedWarn(\"Ad load failed\", error);\n this.updateStatus(\"loading\");\n }\n }\n\n skipAd(): void {\n if (!this.adPlaying || !this._currentAd) return;\n if (!this._currentAd.isSkippable) return;\n\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n if (positionMs < this._currentAd.skipAfterSeconds * 1000) return;\n\n const endedAd = this._currentAd;\n this.adPlaying = false;\n this._currentAd = null;\n this.audio.stop();\n this.emit(\"adEnd\", endedAd);\n this.emitAnalytics(\"ad_skip\", positionMs);\n this.updateStatus(\"loading\");\n }\n\n clickAd(): void {\n if (!this.adPlaying || !this._currentAd) return;\n const positionMs = Math.floor(this.audio.currentTime * 1000);\n this.emitAnalytics(\"ad_cta_click\", positionMs);\n\n if (this._currentAd.ctaValue) {\n window.open(this._currentAd.ctaValue, \"_blank\");\n }\n }\n\n private handleTrackEnded(): void {\n if (this.activeContentKind === ContentKind.RADIO) {\n return;\n }\n\n if (this.adPlaying && this._currentAd) {\n const endedAd = this._currentAd;\n this.audio.stop();\n this.emitAnalytics(\n \"ad_complete\",\n Math.floor(this.audio.currentTime * 1000),\n );\n this.emit(\"adEnd\", endedAd);\n this.adPlaying = false;\n this._currentAd = null;\n this.updateStatus(\"loading\");\n return;\n }\n\n if (this.playlist.queueSnapshot.length > 1) {\n this.emitAnalytics(\n \"track_complete\",\n Math.floor(this.audio.duration * 1000),\n );\n this.updateStatus(\"loading\");\n return;\n }\n\n if (\n this.activeContentKind === ContentKind.SONG ||\n this.activeContentKind === ContentKind.PLAYLIST\n ) {\n this.emitAnalytics(\n \"track_complete\",\n Math.floor(this.audio.duration * 1000),\n );\n this.updateStatus(\"loading\");\n return;\n }\n\n this.updateStatus(\"idle\");\n }\n\n private updateStatus(status: PlayerState[\"status\"]): void {\n this.status = status;\n this.emit(\"stateChange\", {\n status,\n currentTrack: this.playlist.getCurrentTrack(),\n currentTime: this.audio.currentTime,\n duration: this.audio.duration,\n volume: this.volume,\n });\n }\n\n destroy(): void {\n this.clearHeartbeat();\n this.cancelVoiceHold();\n this.voiceResponsePlayer.stop();\n this.audio.stop();\n this.transport.disconnect();\n this.playlist.reset();\n this.removeAllListeners();\n }\n}\n","import type { RadioNowPlaying } from '../types';\n\n/**\n * Fetches live radio \"now playing\" metadata from the Synxed backend.\n * Poll every 10–15 seconds to keep UI in sync (see integration docs).\n */\nexport async function fetchRadioNowPlaying(\n serverUrl: string,\n init?: RequestInit,\n): Promise<RadioNowPlaying | null> {\n const base = serverUrl.replace(/\\/$/, '');\n const url = `${base}/radio/now-playing`;\n try {\n const res = await fetch(url, {\n ...init,\n headers: {\n Accept: 'application/json',\n ...(init?.headers as Record<string, string>),\n },\n });\n if (!res.ok) return null;\n const json = await res.json();\n const d = json?.data;\n if (!d?.title || typeof d.title !== 'string') return null;\n return {\n title: d.title,\n station: typeof d.station === 'string' ? d.station : undefined,\n isLive: typeof d.isLive === 'boolean' ? d.isLive : undefined,\n };\n } catch {\n return null;\n }\n}\n","import type { SynxedWebPlayerPlacement } from './types';\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n props?: {\n className?: string;\n attrs?: Record<string, string>;\n style?: Partial<CSSStyleDeclaration>;\n text?: string;\n html?: string;\n onClick?: (e: Event) => void;\n children?: Node[];\n },\n): HTMLElementTagNameMap[K] {\n const node = document.createElement(tag);\n if (props?.className) node.className = props.className;\n if (props?.attrs) {\n for (const [k, v] of Object.entries(props.attrs)) node.setAttribute(k, v);\n }\n if (props?.style) Object.assign(node.style, props.style);\n if (props?.text) node.textContent = props.text;\n if (props?.html) node.innerHTML = props.html;\n if (props?.onClick) node.addEventListener('click', props.onClick);\n if (props?.children) props.children.forEach((c) => node.appendChild(c));\n return node;\n}\n\nexport function svgIcon(path: string, size = 20): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('width', String(size));\n svg.setAttribute('height', String(size));\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'currentColor');\n svg.setAttribute('aria-hidden', 'true');\n const p = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n p.setAttribute('d', path);\n svg.appendChild(p);\n return svg;\n}\n\nexport const ICON_PLAY = 'M8 5v14l11-7L8 5z';\nexport const ICON_PAUSE = 'M6 5h4v14H6V5zm8 0h4v14h-4V5z';\nexport const ICON_SKIP = 'M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z';\nexport const ICON_SKIP_BACK = 'M6 6h2v12H6V6zm11.5 12L9 12l8.5-6v12z';\n\nexport function ensureGlobalStyles(): void {\n const id = 'synxed-web-player-styles';\n if (document.getElementById(id)) return;\n const style = document.createElement('style');\n style.id = id;\n style.textContent = `\n@keyframes synxed-wp-spin { from { transform: rotate(0); } to { transform: rotate(360deg); } }\n@keyframes synxed-wp-vbar {\n 0%, 100% { transform: scaleY(0.28); opacity: 0.45; }\n 50% { transform: scaleY(1); opacity: 1; }\n}\n`;\n document.head.appendChild(style);\n}\n\nexport function parseDisplayTitle(raw: string): { title: string; artist?: string } {\n const seps = [' — ', ' – ', ' - ', ' —', ' –', ' -'];\n for (const sep of seps) {\n const i = raw.indexOf(sep);\n if (i > 0) {\n return { title: raw.slice(0, i).trim(), artist: raw.slice(i + sep.length).trim() };\n }\n }\n return { title: raw.trim() };\n}\n\nexport function placementStyle(\n placement: SynxedWebPlayerPlacement = 'bottom-center',\n offsetX = 16,\n offsetY = 16,\n): Partial<CSSStyleDeclaration> {\n const base: Partial<CSSStyleDeclaration> = { position: 'fixed', zIndex: '50' };\n switch (placement) {\n case 'top-left':\n return { ...base, top: `${offsetY}px`, left: `${offsetX}px` };\n case 'top-right':\n return { ...base, top: `${offsetY}px`, right: `${offsetX}px` };\n case 'bottom-left':\n return { ...base, bottom: `${offsetY}px`, left: `${offsetX}px` };\n case 'bottom-right':\n return { ...base, bottom: `${offsetY}px`, right: `${offsetX}px` };\n case 'bottom-center':\n default:\n return { ...base, bottom: `${offsetY}px`, left: '50%', transform: 'translateX(-50%)' };\n }\n}\n\nexport function resolveTheme(input: import('./types').SynxedWebPlayerTheme = {}) {\n return {\n accent: input.accent ?? '#22c55e',\n accentMuted: input.accentMuted ?? input.accent ?? '#22c55e',\n background: input.background ?? '#051107',\n backgroundInner: input.backgroundInner ?? '#0a1f10',\n border: input.border ?? 'rgba(34, 197, 94, 0.35)',\n text: input.text ?? '#ffffff',\n textMuted: input.textMuted ?? 'rgba(255,255,255,0.35)',\n stationText: input.stationText ?? 'rgba(34, 197, 94, 0.85)',\n liveDot: input.liveDot ?? '#CCFF00',\n glow: input.glow ?? 'rgba(34, 197, 94, 0.35)',\n };\n}\n\nexport function applyCssVars(root: HTMLElement, theme: ReturnType<typeof resolveTheme>): void {\n root.style.setProperty('--sw-accent', theme.accent);\n root.style.setProperty('--sw-accent-muted', theme.accentMuted);\n root.style.setProperty('--sw-bg', theme.background);\n root.style.setProperty('--sw-bg-inner', theme.backgroundInner);\n root.style.setProperty('--sw-border', theme.border);\n root.style.setProperty('--sw-text', theme.text);\n root.style.setProperty('--sw-text-muted', theme.textMuted);\n root.style.setProperty('--sw-station', theme.stationText);\n root.style.setProperty('--sw-live', theme.liveDot);\n root.style.setProperty('--sw-glow', theme.glow);\n}\n","import { SynxedPlayer } from \"../core/SynxedPlayer\";\nimport { fetchRadioNowPlaying } from \"../radio/nowPlaying\";\nimport type {\n PlayerState,\n RadioNowPlaying,\n TrackInfo,\n AdSkipState,\n VoiceState,\n} from \"../types\";\nimport {\n ICON_PAUSE,\n ICON_PLAY,\n ICON_SKIP,\n ICON_SKIP_BACK,\n applyCssVars,\n el,\n ensureGlobalStyles,\n parseDisplayTitle,\n placementStyle,\n resolveTheme,\n svgIcon,\n} from \"./dom\";\nimport type { SynxedWebPlayerMode, SynxedWebPlayerOptions } from \"./types\";\n\nconst SYNXED_DJ_AVATAR_URL = \"https://cdn.synxed.com/avater-image/avatar.svg\";\n/** Animated AI Star UI GIF — shown during listening & processing voice states. */\nconst SYNXED_VOICE_AVATAR_URL =\n \"https://cdn.synxed.com/avater-image/AI%20Star%20UI%20animation.gif\";\n\nexport type {\n SynxedWebPlayerMode,\n SynxedWebPlayerOptions,\n SynxedWebPlayerPlacement,\n SynxedWebPlayerPosition,\n SynxedWebPlayerSource,\n SynxedWebPlayerTheme,\n} from \"./types\";\n\n/**\n * Framework-agnostic web overlay player (vanilla DOM).\n * Works in React, Vue, Angular, or plain HTML — no React dependency.\n */\nexport class SynxedWebPlayer {\n private readonly options: SynxedWebPlayerOptions;\n private readonly root: HTMLElement;\n private readonly ownsRoot: boolean;\n private readonly theme: ReturnType<typeof resolveTheme>;\n private engine: SynxedPlayer | null = null;\n private pollTimer: ReturnType<typeof setInterval> | null = null;\n private destroyed = false;\n\n private isPlaying = false;\n private currentTrack: TrackInfo | null = null;\n private nowPlaying: RadioNowPlaying | null = null;\n private currentAd: import(\"../types\").AdInfo | null = null;\n\n private skipBtn: HTMLButtonElement | null = null;\n private avatarImgEl: HTMLImageElement | null = null;\n private avatarTextEl: HTMLElement | null = null;\n\n private avatarRing: HTMLElement | null = null;\n private titleEl: HTMLElement | null = null;\n private artistInlineEl: HTMLElement | null = null;\n private artistBlockEl: HTMLElement | null = null;\n private footerEl: HTMLElement | null = null;\n private playBtn: HTMLButtonElement | null = null;\n private avatarVoiceHolding = false;\n private suppressMiniClick = false;\n private voiceAvatarPreview = false;\n private voiceHoldActivated = false;\n private voiceUiDismissed = false;\n private voiceUserSpeaking = false;\n private voiceHadSpeech = false;\n private voiceHoldTimer: ReturnType<typeof setTimeout> | null = null;\n private readonly defaultVoiceHoldMs = 450;\n /** Avatar to restore after an ad (DJ / album art — not ad or voice AI). */\n private avatarImageBeforeAd: string | undefined;\n\n constructor(options: SynxedWebPlayerOptions) {\n this.options = {\n mode: \"wide\",\n attribution: \"Synxed\",\n nowPlayingPollMs: 12_000,\n powerByLabel: \"Powered by Synxed\",\n enableVoice: true,\n ...options,\n };\n this.theme = resolveTheme(this.options.theme);\n this.ownsRoot = !options.container;\n this.root = options.container ?? document.createElement(\"div\");\n if (this.ownsRoot) document.body.appendChild(this.root);\n\n ensureGlobalStyles();\n this.mountShell();\n this.initEngine();\n if (this.options.source.type === \"radio\") this.startNowPlayingPoll();\n }\n\n /** Convenience factory — same as `new SynxedWebPlayer(options)`. */\n static mount(options: SynxedWebPlayerOptions): SynxedWebPlayer {\n return new SynxedWebPlayer(options);\n }\n\n /** Underlying streaming engine (advanced integrations). */\n get player(): SynxedPlayer | null {\n return this.engine;\n }\n\n get element(): HTMLElement {\n return this.root;\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.stopNowPlayingPoll();\n this.engine?.destroy();\n this.engine = null;\n if (this.ownsRoot) this.root.remove();\n }\n\n private get voiceEnabled(): boolean {\n return this.options.enableVoice !== false;\n }\n\n private get isRadio(): boolean {\n return this.options.source.type === \"radio\";\n }\n\n private get mode(): SynxedWebPlayerMode {\n return this.options.mode ?? \"wide\";\n }\n\n private mountShell(): void {\n const { position = {}, className, style } = this.options;\n const placement = position.placement ?? \"bottom-center\";\n const offsetX = position.offsetX ?? 16;\n const offsetY =\n position.offsetY ?? (placement === \"bottom-center\" ? 24 : 16);\n\n this.root.className = className ?? \"\";\n this.root.dataset.synxedWebPlayer = this.mode;\n applyCssVars(this.root, this.theme);\n Object.assign(this.root.style, placementStyle(placement, offsetX, offsetY));\n if (style) Object.assign(this.root.style, style);\n\n this.root.replaceChildren();\n if (this.mode === \"mini\") this.buildMini();\n else if (this.mode === \"large\") this.buildLarge();\n else this.buildWide();\n\n this.refreshLabels();\n this.setPlayingVisual(this.isPlaying);\n\n if (this.options.draggable && this.ownsRoot) {\n this.makeDraggable();\n }\n }\n\n private makeDraggable(): void {\n let isDragging = false;\n let hasMoved = false;\n let startX = 0;\n let startY = 0;\n let initialLeft = 0;\n let initialTop = 0;\n\n const onPointerDown = (e: Event) => {\n const evt = e as MouseEvent | TouchEvent;\n const target = evt.target as HTMLElement;\n\n if (target.closest(\"[data-synxed-avatar-ring]\")) return;\n if (this.avatarVoiceHolding) return;\n\n // In non-mini modes, prevent dragging if starting on buttons or inputs\n if (this.mode !== \"mini\" && target.closest(\"button, a, input\")) return;\n\n isDragging = true;\n hasMoved = false;\n const rect = this.root.getBoundingClientRect();\n initialLeft = rect.left;\n initialTop = rect.top;\n\n this.root.style.bottom = \"auto\";\n this.root.style.right = \"auto\";\n this.root.style.transform = \"none\";\n this.root.style.margin = \"0\";\n this.root.style.left = `${initialLeft}px`;\n this.root.style.top = `${initialTop}px`;\n\n if (\"touches\" in evt) {\n startX = evt.touches[0].clientX;\n startY = evt.touches[0].clientY;\n } else {\n startX = evt.clientX;\n startY = evt.clientY;\n }\n\n document.addEventListener(\"mousemove\", onPointerMove, { passive: false });\n document.addEventListener(\"mouseup\", onPointerUp);\n document.addEventListener(\"touchmove\", onPointerMove, { passive: false });\n document.addEventListener(\"touchend\", onPointerUp);\n };\n\n const onPointerMove = (e: Event) => {\n if (!isDragging) return;\n e.preventDefault();\n\n const evt = e as MouseEvent | TouchEvent;\n let currentX, currentY;\n if (\"touches\" in evt) {\n currentX = evt.touches[0].clientX;\n currentY = evt.touches[0].clientY;\n } else {\n currentX = evt.clientX;\n currentY = evt.clientY;\n }\n\n const dx = currentX - startX;\n const dy = currentY - startY;\n\n if (Math.abs(dx) > 3 || Math.abs(dy) > 3) {\n hasMoved = true;\n }\n\n this.root.style.left = `${initialLeft + dx}px`;\n this.root.style.top = `${initialTop + dy}px`;\n };\n\n const onPointerUp = () => {\n isDragging = false;\n document.removeEventListener(\"mousemove\", onPointerMove);\n document.removeEventListener(\"mouseup\", onPointerUp);\n document.removeEventListener(\"touchmove\", onPointerMove);\n document.removeEventListener(\"touchend\", onPointerUp);\n\n // Reset hasMoved after the click event has a chance to fire\n setTimeout(() => {\n hasMoved = false;\n }, 0);\n };\n\n this.root.style.cursor = \"grab\";\n this.root.addEventListener(\"mousedown\", onPointerDown);\n this.root.addEventListener(\"touchstart\", onPointerDown, { passive: false });\n\n // Prevent accidental clicks if the user was dragging\n this.root.addEventListener(\n \"click\",\n (e) => {\n if (hasMoved) {\n e.stopPropagation();\n e.preventDefault();\n }\n },\n true,\n );\n }\n\n private buildAvatar(size: number, liveTop = false): HTMLElement {\n const wrap = el(\"div\", {\n style: { position: \"relative\", flexShrink: \"0\" },\n });\n this.avatarRing = el(\"div\", {\n attrs: { \"data-synxed-avatar-ring\": \"true\" },\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n border: \"3px solid var(--sw-accent)\",\n padding: \"3px\",\n boxShadow: `0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)`,\n background: \"var(--sw-bg)\",\n boxSizing: \"border-box\",\n },\n });\n const inner = el(\"div\", {\n style: {\n width: \"100%\",\n height: \"100%\",\n borderRadius: \"50%\",\n background: \"var(--sw-bg-inner)\",\n overflow: \"hidden\",\n },\n });\n this.avatarImgEl = el(\"img\", {\n attrs: { src: SYNXED_DJ_AVATAR_URL, alt: \"Synxed DJ\" },\n style: {\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"top\",\n transform: this.mode === \"wide\" ? \"scale(1.15)\" : \"scale(1.12)\",\n display: \"block\",\n },\n });\n this.avatarTextEl = el(\"div\", {\n text: \"S\",\n style: {\n width: \"100%\",\n height: \"100%\",\n display: \"none\",\n alignItems: \"center\",\n justifyContent: \"center\",\n color: \"var(--sw-accent)\",\n fontWeight: \"900\",\n fontSize: `${Math.round(size * 0.28)}px`,\n },\n });\n inner.appendChild(this.avatarImgEl);\n inner.appendChild(this.avatarTextEl);\n\n inner.style.cursor = this.voiceEnabled ? \"pointer\" : \"default\";\n inner.addEventListener(\"click\", (e) => {\n if (this.isVoiceUiOpen()) {\n e.stopPropagation();\n this.dismissVoiceUi();\n return;\n }\n if (this.currentAd && this.engine) {\n e.stopPropagation();\n this.engine.clickAd();\n }\n });\n\n if (this.voiceEnabled) {\n this.avatarRing.style.touchAction = \"none\";\n this.avatarRing.setAttribute(\"aria-label\", \"Hold to speak to DJ\");\n }\n\n this.avatarRing.appendChild(inner);\n wrap.appendChild(this.avatarRing);\n wrap.appendChild(\n el(\"span\", {\n style: {\n position: \"absolute\",\n ...(liveTop\n ? { top: \"4px\", left: \"4px\" }\n : { bottom: \"6px\", left: \"6px\" }),\n width: liveTop ? \"10px\" : \"12px\",\n height: liveTop ? \"10px\" : \"12px\",\n borderRadius: \"50%\",\n background: \"var(--sw-live)\",\n border: \"2px solid var(--sw-bg)\",\n boxShadow: \"0 0 8px var(--sw-live)\",\n },\n }),\n );\n return wrap;\n }\n\n private buildMini(): void {\n const size = 72;\n const shell = el(\"div\", {\n attrs: {\n role: \"button\",\n tabindex: \"0\",\n \"aria-label\": \"Synxed mini player — tap to play, hold to speak\",\n \"data-synxed-mini-shell\": \"true\",\n },\n style: {\n position: \"relative\",\n padding: \"0\",\n cursor: \"pointer\",\n background: \"transparent\",\n },\n });\n shell.addEventListener(\"keydown\", (e) => {\n if (e.key !== \"Enter\" && e.key !== \" \") return;\n e.preventDefault();\n if (!this.suppressMiniClick && !this.avatarVoiceHolding) {\n this.handleMiniActivate();\n }\n });\n shell.addEventListener(\"click\", () => {\n if (this.suppressMiniClick) return;\n if (this.isVoiceUiOpen()) {\n this.dismissVoiceUi();\n return;\n }\n if (this.avatarVoiceHolding) return;\n this.handleMiniActivate();\n });\n shell.appendChild(this.buildAvatar(size));\n this.root.appendChild(shell);\n }\n\n private handleMiniActivate(): void {\n if (this.isVoiceUiOpen()) {\n this.dismissVoiceUi();\n return;\n }\n if (this.options.onMiniClick) {\n this.options.onMiniClick();\n } else {\n this.togglePlay();\n }\n }\n\n private buildWide(): void {\n const avatarSize = 90;\n const shellShadow = `0 8px 40px var(--sw-glow), 0 0 0 1px var(--sw-border)`;\n this.root.style.width = \"min(calc(100vw - 20px), 560px)\";\n\n const row = el(\"div\", {\n style: {\n position: \"relative\",\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n },\n });\n const pillInset = Math.max(avatarSize * 0.42, 40);\n row.appendChild(\n el(\"div\", {\n style: {\n position: \"absolute\",\n top: \"8px\",\n bottom: \"8px\",\n left: `${pillInset}px`,\n right: \"0\",\n background: \"var(--sw-bg)\",\n border: \"1px solid var(--sw-border)\",\n borderRadius: \"28px 20px 20px 28px\",\n boxShadow: shellShadow,\n overflow: \"hidden\",\n },\n children: [\n el(\"div\", {\n style: {\n position: \"absolute\",\n inset: \"0\",\n background:\n \"linear-gradient(90deg, color-mix(in srgb, var(--sw-accent) 12%, transparent), transparent)\",\n pointerEvents: \"none\",\n },\n }),\n ],\n }),\n );\n\n const avatar = this.buildAvatar(avatarSize);\n Object.assign(avatar.style, {\n position: \"relative\",\n zIndex: \"1\",\n marginLeft: \"-2px\",\n });\n row.appendChild(avatar);\n\n const info = el(\"div\", {\n style: {\n position: \"relative\",\n zIndex: \"1\",\n flex: \"1\",\n minWidth: \"0\",\n marginLeft: \"14px\",\n padding: \"18px 8px\",\n },\n });\n const titleRow = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"baseline\",\n gap: \"8px\",\n overflow: \"hidden\",\n },\n });\n this.titleEl = el(\"h3\", {\n style: {\n margin: \"0\",\n fontSize: \"clamp(15px, 2.8vw, 20px)\",\n fontWeight: \"900\",\n color: \"var(--sw-text)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n titleRow.appendChild(this.titleEl);\n this.artistInlineEl = el(\"span\", {\n style: {\n fontSize: \"clamp(12px, 2.4vw, 15px)\",\n fontWeight: \"300\",\n color: \"var(--sw-text-muted)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"none\",\n },\n });\n titleRow.appendChild(this.artistInlineEl);\n info.appendChild(titleRow);\n this.footerEl = el(\"p\", {\n style: {\n margin: \"8px 0 0\",\n fontSize: \"9px\",\n fontWeight: \"700\",\n color: \"var(--sw-text-muted)\",\n letterSpacing: \"0.18em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n info.appendChild(this.footerEl);\n row.appendChild(info);\n\n const controls = el(\"div\", {\n style: {\n position: \"relative\",\n zIndex: \"1\",\n flexShrink: \"0\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"14px\",\n paddingRight: \"16px\",\n },\n });\n this.playBtn = this.createPlayButton(52);\n controls.appendChild(this.playBtn);\n if (!this.isRadio) {\n this.skipBtn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Skip\" },\n style: {\n border: \"none\",\n background: \"transparent\",\n color: \"var(--sw-text-muted)\",\n display: \"flex\",\n cursor: \"pointer\",\n fontSize: \"13px\",\n fontWeight: \"bold\",\n },\n onClick: () => this.handleSkipClick(),\n children: [svgIcon(ICON_SKIP, 22)],\n }) as HTMLButtonElement;\n controls.appendChild(this.skipBtn);\n }\n controls.appendChild(this.decoLines());\n row.appendChild(controls);\n this.root.appendChild(row);\n }\n\n private buildLarge(): void {\n this.root.style.width = \"min(calc(100vw - 24px), 380px)\";\n const shellShadow = `0 8px 40px var(--sw-glow), 0 0 0 1px var(--sw-border)`;\n const card = el(\"div\", {\n style: {\n borderRadius: \"24px\",\n border: \"1px solid var(--sw-border)\",\n background: \"var(--sw-bg)\",\n boxShadow: shellShadow,\n padding: \"16px\",\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"14px\",\n fontFamily: \"system-ui, -apple-system, Segoe UI, Roboto, sans-serif\",\n },\n });\n\n const head = el(\"div\", {\n style: {\n display: \"flex\",\n gap: \"12px\",\n alignItems: \"center\",\n minWidth: \"0\",\n },\n });\n head.appendChild(this.buildAvatar(96, true));\n const meta = el(\"div\", { style: { minWidth: \"0\", flex: \"1\" } });\n this.titleEl = el(\"h3\", {\n style: {\n margin: \"0\",\n fontSize: \"18px\",\n fontWeight: \"900\",\n color: \"var(--sw-text)\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n meta.appendChild(this.titleEl);\n this.artistBlockEl = el(\"p\", {\n style: {\n margin: \"6px 0 0\",\n fontSize: \"13px\",\n fontWeight: \"700\",\n color: \"var(--sw-accent-muted)\",\n letterSpacing: \"0.08em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n display: \"none\",\n },\n });\n meta.appendChild(this.artistBlockEl);\n this.footerEl = el(\"p\", {\n style: {\n margin: \"6px 0 0\",\n fontSize: \"10px\",\n fontWeight: \"700\",\n color: \"var(--sw-station)\",\n letterSpacing: \"0.18em\",\n textTransform: \"uppercase\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n },\n });\n meta.appendChild(this.footerEl);\n head.appendChild(meta);\n card.appendChild(head);\n card.appendChild(this.buildVisualizer());\n card.appendChild(\n el(\"p\", {\n text: this.options.powerByLabel ?? \"Powered by Synxed\",\n style: {\n margin: \"0\",\n fontSize: \"9px\",\n fontWeight: \"600\",\n color: \"var(--sw-text-muted)\",\n letterSpacing: \"0.12em\",\n textTransform: \"uppercase\",\n textAlign: \"center\",\n },\n }),\n );\n\n const transport = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n gap: \"18px\",\n },\n });\n if (!this.isRadio) {\n transport.appendChild(\n el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Previous\" },\n style: this.roundControlStyle(),\n onClick: () => this.engine?.previous(),\n children: [svgIcon(ICON_SKIP_BACK, 22)],\n }),\n );\n }\n this.playBtn = this.createPlayButton(56);\n transport.appendChild(this.playBtn);\n if (!this.isRadio) {\n this.skipBtn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Skip\" },\n style: {\n ...this.roundControlStyle(),\n fontSize: \"12px\",\n fontWeight: \"bold\",\n },\n onClick: () => this.handleSkipClick(),\n children: [svgIcon(ICON_SKIP, 22)],\n }) as HTMLButtonElement;\n transport.appendChild(this.skipBtn);\n }\n card.appendChild(transport);\n this.root.appendChild(card);\n }\n\n private roundControlStyle(): Partial<CSSStyleDeclaration> {\n return {\n width: \"46px\",\n height: \"46px\",\n borderRadius: \"50%\",\n border: \"1px solid var(--sw-border)\",\n background: \"rgba(255,255,255,0.04)\",\n color: \"var(--sw-text)\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n };\n }\n\n private createPlayButton(size: number): HTMLButtonElement {\n const btn = el(\"button\", {\n attrs: { type: \"button\", \"aria-label\": \"Play\" },\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: \"50%\",\n border: \"none\",\n background: \"var(--sw-accent)\",\n color: \"#0a0a0a\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n boxShadow: \"0 0 18px var(--sw-glow)\",\n flexShrink: \"0\",\n },\n onClick: () => this.togglePlay(),\n children: [svgIcon(ICON_PLAY, size >= 56 ? 22 : 20)],\n });\n return btn;\n }\n\n private buildVisualizer(): HTMLElement {\n const box = el(\"div\", {\n style: {\n display: \"flex\",\n alignItems: \"flex-end\",\n gap: \"4px\",\n height: \"52px\",\n padding: \"8px 4px\",\n borderRadius: \"14px\",\n border: \"1px solid var(--sw-border)\",\n overflow: \"hidden\",\n },\n });\n for (let i = 0; i < 24; i++) {\n box.appendChild(\n el(\"span\", {\n style: {\n flex: \"1\",\n minWidth: \"3px\",\n height: \"100%\",\n borderRadius: \"4px\",\n background:\n \"linear-gradient(180deg, var(--sw-accent), transparent)\",\n transformOrigin: \"center bottom\",\n animation: `synxed-wp-vbar ${1 + (i % 5) * 0.12}s ease-in-out infinite`,\n animationDelay: `${i * 0.04}s`,\n opacity: \"0.85\",\n },\n }),\n );\n }\n return box;\n }\n\n private decoLines(): HTMLElement {\n const wrap = el(\"div\", {\n style: {\n display: \"flex\",\n flexDirection: \"column\",\n gap: \"3px\",\n opacity: \"0.22\",\n },\n });\n wrap.appendChild(\n el(\"span\", {\n style: {\n display: \"block\",\n width: \"16px\",\n height: \"2px\",\n borderRadius: \"999px\",\n background: \"var(--sw-text)\",\n transform: \"translateX(3px)\",\n },\n }),\n );\n wrap.appendChild(\n el(\"span\", {\n style: {\n display: \"block\",\n width: \"16px\",\n height: \"2px\",\n borderRadius: \"999px\",\n background: \"var(--sw-text)\",\n },\n }),\n );\n return wrap;\n }\n\n private initEngine(): void {\n const { apiKey, serverUrl, source } = this.options;\n const p = new SynxedPlayer({ \n apiKey, \n serverUrl, \n autoConnect: true,\n debug: this.options.debug,\n voice: this.options.voice,\n });\n this.engine = p;\n\n const onState = (state: PlayerState) => {\n this.isPlaying = state.status === \"playing\";\n if (state.currentTrack) this.currentTrack = state.currentTrack;\n this.setPlayingVisual(this.isPlaying);\n this.refreshLabels();\n if (!this.currentAd && !this.engine?.isAdPlaying) {\n this.restoreTrackSkipButton();\n this.refreshAvatarImage();\n }\n };\n p.on(\"stateChange\", onState);\n p.on(\"trackChange\", (track) => {\n this.currentTrack = track;\n this.avatarImageBeforeAd = undefined;\n this.refreshLabels();\n if (!this.currentAd && !this.engine?.isAdPlaying) {\n this.restoreTrackSkipButton();\n this.refreshAvatarImage();\n }\n });\n p.on(\"adStart\", (ad) => {\n this.avatarImageBeforeAd = this.getContentAvatarUrl();\n this.voiceAvatarPreview = false;\n this.voiceHoldActivated = false;\n this.currentAd = ad;\n this.refreshLabels();\n this.updateAvatar();\n });\n p.on(\"adSkipUpdate\", (state) => this.applyAdSkipUi(state));\n p.on(\"adEnd\", () => {\n this.currentAd = null;\n this.voiceAvatarPreview = false;\n this.refreshLabels();\n this.updateAvatar();\n this.restoreTrackSkipButton();\n });\n p.on(\"voiceStateChange\", (state) => this.applyVoiceVisual(state));\n p.on(\"voiceUserSpeakingChange\", (speaking) => {\n this.voiceUserSpeaking = speaking;\n if (speaking) this.voiceHadSpeech = true;\n this.applyVoiceRing();\n });\n\n const start: () => Promise<void> =\n source.type === \"radio\"\n ? () => p.playRadio()\n : () => p.playPlaylist({ playlistCode: source.playlistCode });\n\n start().catch(() => undefined);\n\n if (this.voiceEnabled) {\n this.wireAvatarVoiceHold();\n }\n }\n\n /** Press-and-hold DJ avatar to stream voice; release or silence auto-ends capture. */\n private wireAvatarVoiceHold(): void {\n if (!this.avatarRing) return;\n\n const target = this.avatarRing;\n const holdMs = this.options.voiceHoldMs ?? this.defaultVoiceHoldMs;\n\n const clearHoldTimer = () => {\n if (this.voiceHoldTimer !== null) {\n clearTimeout(this.voiceHoldTimer);\n this.voiceHoldTimer = null;\n }\n };\n\n const onPointerDown = (e: PointerEvent) => {\n if (this.currentAd || !this.engine) return;\n\n if (this.isVoiceUiOpen()) {\n e.preventDefault();\n e.stopPropagation();\n this.dismissVoiceUi();\n return;\n }\n\n e.preventDefault();\n e.stopPropagation();\n target.setPointerCapture(e.pointerId);\n this.avatarVoiceHolding = true;\n this.voiceHoldActivated = false;\n\n clearHoldTimer();\n this.voiceHoldTimer = setTimeout(() => {\n this.voiceHoldTimer = null;\n if (!this.avatarVoiceHolding || !this.engine) return;\n\n this.voiceHoldActivated = true;\n this.voiceUiDismissed = false;\n this.voiceAvatarPreview = true;\n this.voiceUserSpeaking = false;\n this.voiceHadSpeech = false;\n this.applyVoiceRing();\n this.refreshAvatarImage();\n\n void this.engine\n .beginVoiceHold({ listenerId: this.options.listenerId })\n .catch(() => {\n this.resetVoiceHoldState();\n });\n }, holdMs);\n };\n\n const blockDragBubble = (e: Event) => {\n if (!this.currentAd) e.stopPropagation();\n };\n target.addEventListener(\"mousedown\", blockDragBubble);\n target.addEventListener(\"touchstart\", blockDragBubble, { passive: false });\n\n const onPointerUp = () => {\n clearHoldTimer();\n\n if (!this.avatarVoiceHolding) return;\n this.avatarVoiceHolding = false;\n\n if (!this.voiceHoldActivated) {\n return;\n }\n\n if (this.mode === \"mini\") {\n this.suppressMiniClick = true;\n setTimeout(() => {\n this.suppressMiniClick = false;\n }, 320);\n }\n\n const state = this.engine?.voiceState;\n if (state === \"listening\") {\n void this.engine?.endVoiceHold();\n }\n };\n\n target.addEventListener(\"pointerdown\", onPointerDown);\n target.addEventListener(\"pointerup\", onPointerUp);\n target.addEventListener(\"pointerleave\", onPointerUp);\n target.addEventListener(\"pointercancel\", onPointerUp);\n }\n\n private isVoiceUiOpen(): boolean {\n if (!this.voiceEnabled || this.currentAd || this.voiceUiDismissed) {\n return false;\n }\n if (this.voiceHoldActivated || this.voiceAvatarPreview) return true;\n return Boolean(this.engine?.isVoiceUiActive);\n }\n\n private dismissVoiceUi(): void {\n this.engine?.dismissVoiceAndResume();\n this.resetVoiceHoldState();\n this.voiceUiDismissed = true;\n this.applyVoiceVisual(this.engine?.voiceState ?? \"idle\");\n this.refreshAvatarImage();\n }\n\n private resetVoiceHoldState(): void {\n if (this.voiceHoldTimer !== null) {\n clearTimeout(this.voiceHoldTimer);\n this.voiceHoldTimer = null;\n }\n this.avatarVoiceHolding = false;\n this.voiceHoldActivated = false;\n this.voiceAvatarPreview = false;\n this.voiceUserSpeaking = false;\n this.voiceHadSpeech = false;\n }\n\n private applyVoiceRing(): void {\n if (!this.avatarRing) return;\n\n const state = this.engine?.voiceState ?? \"idle\";\n\n if (state === \"processing\") {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#ef4444\";\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(239,68,68,0.5), 0 0 40px rgba(239,68,68,0.2)\";\n return;\n }\n\n if (state === \"responding\") {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#06b6d4\";\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(6,182,212,0.5), 0 0 40px rgba(6,182,212,0.2)\";\n return;\n }\n\n if (state === \"listening\") {\n const showProcessingRed = this.voiceHadSpeech && !this.voiceUserSpeaking;\n if (!showProcessingRed) {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#3b82f6\";\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(59,130,246,0.55), 0 0 40px rgba(59,130,246,0.25)\";\n } else {\n this.avatarRing.style.animation = \"\";\n this.avatarRing.style.borderColor = \"#ef4444\";\n this.avatarRing.style.boxShadow =\n \"0 0 20px rgba(239,68,68,0.5), 0 0 40px rgba(239,68,68,0.2)\";\n }\n return;\n }\n\n this.avatarRing.style.borderColor = \"\";\n this.avatarRing.style.boxShadow =\n \"0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)\";\n this.setPlayingVisual(this.isPlaying);\n }\n\n private applyVoiceVisual(state: VoiceState): void {\n if (!this.avatarRing) return;\n\n if (state === \"idle\" || state === \"ready\" || state === \"error\") {\n if (!this.avatarVoiceHolding) {\n this.voiceAvatarPreview = false;\n }\n if (state === \"ready\" || state === \"idle\") {\n this.voiceUiDismissed = false;\n this.voiceUserSpeaking = false;\n this.voiceHadSpeech = false;\n }\n }\n\n if (\n state === \"listening\" ||\n state === \"processing\" ||\n state === \"responding\"\n ) {\n this.voiceUiDismissed = false;\n }\n\n this.applyVoiceRing();\n this.refreshAvatarImage();\n }\n\n private isVoiceAvatarActive(): boolean {\n if (!this.voiceEnabled || this.currentAd || this.voiceUiDismissed) {\n return false;\n }\n if (this.voiceAvatarPreview) return true;\n const state = this.engine?.voiceState;\n return (\n state === \"listening\" ||\n state === \"processing\" ||\n state === \"responding\"\n );\n }\n\n private getContentAvatarUrl(): string {\n return SYNXED_DJ_AVATAR_URL;\n }\n\n private getAvatarImageUrl(): string | undefined {\n if (this.currentAd?.companionBannerUrl) {\n return this.currentAd.companionBannerUrl;\n }\n if (this.isVoiceAvatarActive()) {\n return SYNXED_VOICE_AVATAR_URL;\n }\n if (this.avatarImageBeforeAd) {\n return this.avatarImageBeforeAd;\n }\n return SYNXED_DJ_AVATAR_URL;\n }\n\n private refreshAvatarImage(): void {\n const url = this.getAvatarImageUrl();\n const voiceVisual = this.isVoiceAvatarActive();\n\n if (url && this.avatarImgEl) {\n if (this.avatarImgEl.getAttribute(\"src\") !== url) {\n this.avatarImgEl.setAttribute(\"src\", url);\n }\n this.avatarImgEl.style.display = \"block\";\n if (voiceVisual) {\n // AI Star UI GIF — fill the full circle, no padding, no crop offset.\n // The GIF is square and designed to sit edge-to-edge inside the ring.\n this.avatarImgEl.style.objectFit = \"cover\";\n this.avatarImgEl.style.objectPosition = \"center\";\n this.avatarImgEl.style.transform = \"scale(1)\";\n this.avatarImgEl.style.padding = \"\";\n this.avatarImgEl.style.background = \"var(--sw-bg-inner)\";\n } else {\n this.avatarImgEl.style.objectFit = \"cover\";\n this.avatarImgEl.style.objectPosition = \"top\";\n this.avatarImgEl.style.transform =\n this.mode === \"wide\" ? \"scale(1.15)\" : \"scale(1.12)\";\n this.avatarImgEl.style.padding = \"\";\n this.avatarImgEl.style.background = \"\";\n }\n if (this.avatarTextEl) this.avatarTextEl.style.display = \"none\";\n } else {\n if (this.avatarImgEl) this.avatarImgEl.style.display = \"none\";\n if (this.avatarTextEl) this.avatarTextEl.style.display = \"flex\";\n }\n }\n\n private startNowPlayingPoll(): void {\n const tick = async () => {\n const np = await fetchRadioNowPlaying(this.options.serverUrl);\n if (!this.destroyed && np) {\n this.nowPlaying = np;\n this.refreshLabels();\n }\n };\n void tick();\n this.pollTimer = setInterval(tick, this.options.nowPlayingPollMs ?? 12_000);\n }\n\n private stopNowPlayingPoll(): void {\n if (this.pollTimer !== null) {\n clearInterval(this.pollTimer);\n this.pollTimer = null;\n }\n }\n\n private handleSkipClick(): void {\n const player = this.engine;\n if (!player) return;\n if (this.currentAd) {\n if (player.canSkipAd()) player.skipAd();\n return;\n }\n player.skip();\n }\n\n /**\n * During ads: swap skip icon for countdown text in the same control (no style changes).\n * After ads: restore skip icon for the next track.\n */\n private applyAdSkipUi(state: AdSkipState): void {\n if (!this.skipBtn) return;\n\n const { ad, canSkip, countdownSeconds } = state;\n\n if (!ad.isSkippable) {\n this.skipBtn.disabled = true;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n return;\n }\n\n if (!canSkip) {\n this.skipBtn.disabled = true;\n this.skipBtn.replaceChildren();\n this.skipBtn.textContent = `${countdownSeconds}s`;\n return;\n }\n\n this.skipBtn.disabled = false;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n }\n\n private restoreTrackSkipButton(): void {\n if (!this.skipBtn) return;\n\n this.skipBtn.disabled = false;\n this.skipBtn.textContent = \"\";\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.setAttribute(\"aria-label\", \"Skip\");\n }\n\n private displayLine(): { title: string; artist?: string } {\n if (this.currentAd) {\n return {\n title: this.currentAd.campaignName || \"Advertisement\",\n artist: this.currentAd.creativeName,\n };\n }\n if (this.isRadio && this.nowPlaying?.title) {\n return parseDisplayTitle(this.nowPlaying.title);\n }\n if (this.currentTrack?.title) {\n return {\n title: this.currentTrack.title,\n artist: this.currentTrack.artist,\n };\n }\n return { title: \"Loading…\" };\n }\n\n private refreshLabels(): void {\n const line = this.displayLine();\n if (this.titleEl) this.titleEl.textContent = line.title;\n\n if (this.artistInlineEl) {\n const show = Boolean(line.artist);\n this.artistInlineEl.style.display = show ? \"inline\" : \"none\";\n if (show) this.artistInlineEl.textContent = line.artist!;\n }\n if (this.artistBlockEl) {\n const show = Boolean(line.artist);\n this.artistBlockEl.style.display = show ? \"block\" : \"none\";\n if (show) this.artistBlockEl.textContent = line.artist!;\n }\n\n if (this.footerEl) {\n if (this.currentAd) {\n this.footerEl.textContent = \"Advertisement · Synxed Player\";\n } else {\n const station =\n this.isRadio &&\n (this.nowPlaying?.station ??\n this.currentTrack?.title ??\n \"Synxed Radio\");\n this.footerEl.textContent =\n station && this.isRadio\n ? `${station} · Synxed Player`\n : \"Synxed Player\";\n }\n }\n }\n\n private updateAvatar(): void {\n this.refreshAvatarImage();\n\n if (this.avatarRing) {\n const inner = this.avatarRing.firstChild as HTMLElement;\n if (inner) {\n inner.style.cursor = this.currentAd\n ? \"pointer\"\n : this.voiceEnabled\n ? \"pointer\"\n : \"default\";\n }\n }\n }\n\n private setPlayingVisual(playing: boolean): void {\n if (this.avatarRing) {\n this.avatarRing.style.animation = playing\n ? \"synxed-wp-spin 4s linear infinite\"\n : \"\";\n }\n if (this.playBtn) {\n this.playBtn.replaceChildren(\n svgIcon(playing ? ICON_PAUSE : ICON_PLAY, 20),\n );\n this.playBtn.setAttribute(\"aria-label\", playing ? \"Pause\" : \"Play\");\n }\n }\n\n private togglePlay(): void {\n if (!this.engine) return;\n if (this.isPlaying) this.engine.pause();\n else this.engine.resume();\n }\n}\n"]}