synxed-sdk 0.3.19 → 0.3.20

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","$","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","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","chunks","blobParts","chunk","copy","blob","VAD_WEB_CDN","ONNX_CDN","loadMicVAD","mod","MicVAD","VoiceCaptureManager","options","speaking","vad","_probabilities","frame","SynxedPlayer","config","positionMs","requiredMs","time","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 VOICE_CANCEL = 4;\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 VOICE_CANCEL = 4,\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 private keepaliveTimer: ReturnType<typeof setInterval> | null = null;\n\n private startKeepalive(): void {\n this.stopKeepalive();\n this.keepaliveTimer = setInterval(() => {\n this.sendAnalytics({ eventType: 'sdk_keepalive', positionMs: 0 });\n }, 25_000);\n }\n\n private stopKeepalive(): void {\n if (this.keepaliveTimer !== null) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n }\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.startKeepalive();\n this.emit('connected');\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason\n ? `${event.reason} (code ${event.code}, clean ${event.wasClean})`\n : `code ${event.code}, clean ${event.wasClean}`;\n this.stopKeepalive();\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 this.stopKeepalive();\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/mpeg\";\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 { parsePcmSampleRate, VOICE_RESPONSE_MIME } from \"./voiceAudioFormats\";\n\n/**\n * Voice player for AI responses.\n * Supports legacy PCM chunks and encoded Cloudflare Aura responses.\n */\nexport class VoiceResponsePlayer {\n private audioContext: AudioContext | null = null;\n private nextStartTime = 0;\n private defaultSampleRate = 24000;\n private encodedChunks: Uint8Array[] = [];\n private encodedMimeType = VOICE_RESPONSE_MIME;\n private activeSource: AudioBufferSourceNode | null = null;\n private playbackPromise: Promise<void> | null = null;\n\n private initContext(sampleRate: number) {\n if (!this.audioContext) {\n this.audioContext = new (\n window.AudioContext || (window as any).webkitAudioContext\n )({\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 if (!mimeType.startsWith(\"audio/pcm\")) {\n this.encodedMimeType = mimeType;\n this.encodedChunks.push(new Uint8Array(pcmData));\n return;\n }\n\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 this.activeSource = source;\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 public finish(mimeType = this.encodedMimeType): Promise<void> {\n if (!this.encodedChunks.length) {\n return this.playbackPromise ?? Promise.resolve();\n }\n\n const chunks = this.encodedChunks.splice(0);\n this.encodedMimeType = mimeType || VOICE_RESPONSE_MIME;\n\n this.playbackPromise = this.playEncoded(chunks, this.encodedMimeType).finally(\n () => {\n this.playbackPromise = null;\n },\n );\n\n return this.playbackPromise;\n }\n\n private async playEncoded(\n chunks: Uint8Array[],\n mimeType: string,\n ): Promise<void> {\n this.initContext(this.defaultSampleRate);\n if (!this.audioContext) return;\n\n if (this.audioContext.state === \"suspended\") {\n await this.audioContext.resume().catch(() => undefined);\n }\n\n const blobParts = chunks.map((chunk) => {\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy.buffer;\n });\n const blob = new Blob(blobParts, { type: mimeType });\n const audioBuffer = await this.audioContext.decodeAudioData(\n await blob.arrayBuffer(),\n );\n\n await new Promise<void>((resolve, reject) => {\n if (!this.audioContext) {\n resolve();\n return;\n }\n\n const source = this.audioContext.createBufferSource();\n this.activeSource = source;\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n source.onended = () => {\n if (this.activeSource === source) this.activeSource = null;\n resolve();\n };\n\n try {\n source.start();\n } catch (err) {\n if (this.activeSource === source) this.activeSource = null;\n reject(err);\n }\n });\n }\n\n /**\n * Instantly halts playback and resets the streaming buffer state.\n */\n public stop(): void {\n if (this.activeSource) {\n try {\n this.activeSource.stop();\n } catch {\n // source may already have ended\n }\n this.activeSource = null;\n }\n this.encodedChunks = [];\n this.playbackPromise = null;\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 =\n \"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\ntype VadModule = {\n MicVAD?: {\n new: (options: Record<string, unknown>) => Promise<MicVadHandle>;\n };\n default?: VadModule;\n};\n\nasync function loadMicVAD(): Promise<NonNullable<VadModule[\"MicVAD\"]>> {\n const mod = (await import(\"@ricky0123/vad-web\")) as VadModule;\n const MicVAD = mod.MicVAD ?? mod.default?.MicVAD;\n if (!MicVAD) {\n throw new Error(\n \"MicVAD export missing from @ricky0123/vad-web — check bundler resolves the package\",\n );\n }\n return MicVAD;\n}\n\n/**\n * Mic capture via @ricky0123/vad-web — same callbacks as the official demo:\n * onSpeechStart / onSpeechEnd + streaming frames while the user talks.\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 vadBaseAssetPath = VAD_WEB_CDN;\n private onnxWasmBasePath = ONNX_CDN;\n private userSpeaking = false;\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 async preloadModels(options: VoiceCaptureOptions = {}): Promise<void> {\n this.applyOptions(options);\n await this.ensureMicVad();\n }\n\n private applyOptions(options: VoiceCaptureOptions): void {\n if (options.vadBaseAssetPath) this.vadBaseAssetPath = options.vadBaseAssetPath;\n if (options.onnxWasmBasePath) this.onnxWasmBasePath = options.onnxWasmBasePath;\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 async ensureMicVad(): Promise<void> {\n if (this.micVad) return;\n\n const MicVAD = await loadMicVAD();\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 if (!this.capturing) return;\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 this.chunkSequence += 1;\n this.emit(\"chunk\", new Uint8Array(int16.buffer), this.chunkSequence);\n },\n onSpeechStart: () => {\n if (!this.capturing) return;\n this.setUserSpeaking(true);\n this.emit(\"speechStart\");\n },\n onSpeechEnd: () => {\n if (!this.capturing) return;\n this.setUserSpeaking(false);\n this.emit(\"speechEnd\");\n },\n });\n\n vad.pause();\n this.micVad = vad;\n }\n\n async start(options: VoiceCaptureOptions = {}): Promise<string> {\n if (this.capturing) return this.mimeType;\n\n this.applyOptions(options);\n this.chunkSequence = 0;\n this.setUserSpeaking(false);\n\n try {\n await this.ensureMicVad();\n this.capturing = true;\n this.micVad!.start();\n } catch (err) {\n this.capturing = false;\n const error =\n err instanceof Error ? err : new Error(String(err));\n synxedWarn(\"Voice capture failed to start\", error);\n this.emit(\"error\", error);\n throw error;\n }\n\n return this.mimeType;\n }\n\n async stop(): Promise<void> {\n this.capturing = false;\n this.setUserSpeaking(false);\n if (this.micVad) this.micVad.pause();\n }\n\n cancel(): void {\n this.capturing = false;\n this.setUserSpeaking(false);\n if (this.micVad) this.micVad.pause();\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 private voiceResponseDismissed = false;\n private voicePlaybackPromise: Promise<void> | null = null;\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 if (\n this._voiceState === \"listening\" ||\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n this.voiceCapture.cancel();\n this.voiceResponsePlayer.stop();\n this._voiceUserSpeaking = false;\n this.emit(\"voiceUserSpeakingChange\", false);\n this.setVoiceState(\"idle\");\n this.pausedForVoice = false;\n }\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.voiceResponseDismissed = false;\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.voiceResponseDismissed = false;\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.voiceResponseDismissed = false;\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 this.voiceResponseDismissed = 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 try {\n this.voiceMimeType = await this.voiceCapture.start({\n maxDurationMs: voiceOpts.maxDurationMs,\n });\n } catch {\n if (this.pausedForVoice) {\n this.pausedForVoice = false;\n this.resume();\n }\n return;\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.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CANCEL,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\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 this.voiceResponseDismissed = true;\n this.voiceResponsePlayer.stop();\n if (this._voiceState === \"listening\") {\n this.cancelVoiceHold();\n } else if (\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CANCEL,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n this.setVoiceState(\"idle\");\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 === \"cancelled\") {\n if (this._voiceState !== \"idle\") {\n this.setVoiceState(\"idle\");\n }\n return;\n }\n\n if (this.voiceResponseDismissed) {\n return;\n }\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.voiceResponseDismissed) {\n return;\n }\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 if (voiceAudio.isFinal) {\n this.voicePlaybackPromise = this.voiceResponsePlayer\n .finish(voiceAudio.mimeType)\n .catch((err) => {\n synxedWarn(\"Voice response playback failed\", err);\n })\n .finally(() => {\n this.voicePlaybackPromise = null;\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 if (this.voiceResponseDismissed) {\n return;\n }\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 (this.voicePlaybackPromise && !this.voiceResponseDismissed) {\n await this.voicePlaybackPromise;\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 userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n this.avatarRing.style.setProperty(\"-webkit-touch-callout\", \"none\");\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 userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n inner.style.setProperty(\"-webkit-touch-callout\", \"none\");\n this.avatarImgEl = el(\"img\", {\n attrs: {\n src: SYNXED_DJ_AVATAR_URL,\n alt: \"Synxed DJ\",\n draggable: \"false\",\n },\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 pointerEvents: \"none\",\n userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n this.avatarImgEl.style.setProperty(\"-webkit-touch-callout\", \"none\");\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 inner.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n inner.addEventListener(\"dragstart\", (e) => e.preventDefault());\n inner.addEventListener(\"selectstart\", (e) => e.preventDefault());\n\n if (this.voiceEnabled) {\n this.avatarRing.style.touchAction = \"none\";\n this.avatarRing.addEventListener(\"contextmenu\", (e) =>\n e.preventDefault(),\n );\n this.avatarRing.addEventListener(\"dragstart\", (e) => e.preventDefault());\n this.avatarRing.addEventListener(\"selectstart\", (e) =>\n e.preventDefault(),\n );\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 /** Hold DJ avatar to arm voice; VAD silence decides when the command is done. */\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\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.applyVoiceRing();\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 if (this.voiceUiDismissed) {\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 return;\n }\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 (state === \"listening\") {\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\" || state === \"processing\" || 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","sendKeepalive","err","reason","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","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","chunks","blobParts","chunk","copy","blob","VAD_WEB_CDN","ONNX_CDN","loadMicVAD","mod","MicVAD","VoiceCaptureManager","options","speaking","vad","_probabilities","frame","SynxedPlayer","config","positionMs","requiredMs","time","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 VOICE_CANCEL = 4;\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 VOICE_CANCEL = 4,\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(\n serverUrl: string,\n apiKey: string,\n): string {\n const normalized = serverUrl.endsWith(\"/\")\n ? serverUrl.slice(0, -1)\n : 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 private keepaliveTimer: ReturnType<typeof setInterval> | null = null;\n\n private startKeepalive(): void {\n this.stopKeepalive();\n const sendKeepalive = () => {\n try {\n this.sendAnalytics({ eventType: \"sdk_keepalive\", positionMs: 0 });\n } catch (err) {\n synxedWarn(\"SDK WebSocket keepalive failed\", err);\n }\n };\n\n sendKeepalive();\n this.keepaliveTimer = setInterval(sendKeepalive, 15_000);\n }\n\n private stopKeepalive(): void {\n if (this.keepaliveTimer !== null) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n }\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(\n \"Opening native WebSocket\",\n url.replace(/apiKey=[^&]+/, \"apiKey=***\"),\n );\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = \"arraybuffer\";\n\n this.ws.onopen = () => {\n this.connectPromise = null;\n this.startKeepalive();\n this.emit(\"connected\");\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason || `code ${event.code}`;\n this.stopKeepalive();\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(\n new Uint8Array(data),\n );\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 this.stopKeepalive();\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/mpeg\";\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 { parsePcmSampleRate, VOICE_RESPONSE_MIME } from \"./voiceAudioFormats\";\n\n/**\n * Voice player for AI responses.\n * Supports legacy PCM chunks and encoded Cloudflare Aura responses.\n */\nexport class VoiceResponsePlayer {\n private audioContext: AudioContext | null = null;\n private nextStartTime = 0;\n private defaultSampleRate = 24000;\n private encodedChunks: Uint8Array[] = [];\n private encodedMimeType = VOICE_RESPONSE_MIME;\n private activeSource: AudioBufferSourceNode | null = null;\n private playbackPromise: Promise<void> | null = null;\n\n private initContext(sampleRate: number) {\n if (!this.audioContext) {\n this.audioContext = new (\n window.AudioContext || (window as any).webkitAudioContext\n )({\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 if (!mimeType.startsWith(\"audio/pcm\")) {\n this.encodedMimeType = mimeType;\n this.encodedChunks.push(new Uint8Array(pcmData));\n return;\n }\n\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 this.activeSource = source;\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 public finish(mimeType = this.encodedMimeType): Promise<void> {\n if (!this.encodedChunks.length) {\n return this.playbackPromise ?? Promise.resolve();\n }\n\n const chunks = this.encodedChunks.splice(0);\n this.encodedMimeType = mimeType || VOICE_RESPONSE_MIME;\n\n this.playbackPromise = this.playEncoded(chunks, this.encodedMimeType).finally(\n () => {\n this.playbackPromise = null;\n },\n );\n\n return this.playbackPromise;\n }\n\n private async playEncoded(\n chunks: Uint8Array[],\n mimeType: string,\n ): Promise<void> {\n this.initContext(this.defaultSampleRate);\n if (!this.audioContext) return;\n\n if (this.audioContext.state === \"suspended\") {\n await this.audioContext.resume().catch(() => undefined);\n }\n\n const blobParts = chunks.map((chunk) => {\n const copy = new Uint8Array(chunk.byteLength);\n copy.set(chunk);\n return copy.buffer;\n });\n const blob = new Blob(blobParts, { type: mimeType });\n const audioBuffer = await this.audioContext.decodeAudioData(\n await blob.arrayBuffer(),\n );\n\n await new Promise<void>((resolve, reject) => {\n if (!this.audioContext) {\n resolve();\n return;\n }\n\n const source = this.audioContext.createBufferSource();\n this.activeSource = source;\n source.buffer = audioBuffer;\n source.connect(this.audioContext.destination);\n source.onended = () => {\n if (this.activeSource === source) this.activeSource = null;\n resolve();\n };\n\n try {\n source.start();\n } catch (err) {\n if (this.activeSource === source) this.activeSource = null;\n reject(err);\n }\n });\n }\n\n /**\n * Instantly halts playback and resets the streaming buffer state.\n */\n public stop(): void {\n if (this.activeSource) {\n try {\n this.activeSource.stop();\n } catch {\n // source may already have ended\n }\n this.activeSource = null;\n }\n this.encodedChunks = [];\n this.playbackPromise = null;\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\ntype VadModule = {\n MicVAD?: {\n new: (options: Record<string, unknown>) => Promise<MicVadHandle>;\n };\n default?: VadModule;\n};\n\nasync function loadMicVAD(): Promise<NonNullable<VadModule[\"MicVAD\"]>> {\n const mod = (await import(\"@ricky0123/vad-web\")) as VadModule;\n const MicVAD = mod.MicVAD ?? mod.default?.MicVAD;\n if (!MicVAD) {\n throw new Error(\n \"MicVAD export missing from @ricky0123/vad-web — check bundler resolves the package\",\n );\n }\n return MicVAD;\n}\n\n/**\n * Mic capture via @ricky0123/vad-web — same callbacks as the official demo:\n * onSpeechStart / onSpeechEnd + streaming frames while the user talks.\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 vadBaseAssetPath = VAD_WEB_CDN;\n private onnxWasmBasePath = ONNX_CDN;\n private userSpeaking = false;\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 async preloadModels(options: VoiceCaptureOptions = {}): Promise<void> {\n this.applyOptions(options);\n await this.ensureMicVad();\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 setUserSpeaking(speaking: boolean): void {\n if (this.userSpeaking === speaking) return;\n this.userSpeaking = speaking;\n this.emit(\"userSpeakingChange\", speaking);\n }\n\n private async ensureMicVad(): Promise<void> {\n if (this.micVad) return;\n\n const MicVAD = await loadMicVAD();\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 if (!this.capturing) return;\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 this.chunkSequence += 1;\n this.emit(\"chunk\", new Uint8Array(int16.buffer), this.chunkSequence);\n },\n onSpeechStart: () => {\n if (!this.capturing) return;\n this.setUserSpeaking(true);\n this.emit(\"speechStart\");\n },\n onSpeechEnd: () => {\n if (!this.capturing) return;\n this.setUserSpeaking(false);\n this.emit(\"speechEnd\");\n },\n });\n\n vad.pause();\n this.micVad = vad;\n }\n\n async start(options: VoiceCaptureOptions = {}): Promise<string> {\n if (this.capturing) return this.mimeType;\n\n this.applyOptions(options);\n this.chunkSequence = 0;\n this.setUserSpeaking(false);\n\n try {\n await this.ensureMicVad();\n this.capturing = true;\n this.micVad!.start();\n } catch (err) {\n this.capturing = false;\n const error = err instanceof Error ? err : new Error(String(err));\n synxedWarn(\"Voice capture failed to start\", error);\n this.emit(\"error\", error);\n }\n\n return this.mimeType;\n }\n\n async stop(): Promise<void> {\n this.capturing = false;\n this.setUserSpeaking(false);\n if (this.micVad) this.micVad.pause();\n }\n\n cancel(): void {\n this.capturing = false;\n this.setUserSpeaking(false);\n if (this.micVad) this.micVad.pause();\n }\n}\n","import { TransportManager } from \"../transport/TransportManager\";\nimport { AudioEngine } from \"../audio/AudioEngine\";\nimport { PlaylistManager } from \"../playlist/PlaylistManager\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport {\n ContentKind,\n SdkControlAction,\n SdkVoiceAction,\n} 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 private voiceResponseDismissed = false;\n private voicePlaybackPromise: Promise<void> | null = null;\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(\n \"error\",\n new SynxedError(error.message, \"VOICE_CAPTURE_FAILED\"),\n );\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.voiceResponseDismissed = false;\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.voiceResponseDismissed = false;\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.voiceResponseDismissed = false;\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 this.voiceResponseDismissed = 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.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CANCEL,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\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 this.voiceResponseDismissed = true;\n this.voiceResponsePlayer.stop();\n if (this._voiceState === \"listening\") {\n this.cancelVoiceHold();\n } else if (\n this._voiceState === \"processing\" ||\n this._voiceState === \"responding\"\n ) {\n this.transport.sendVoice({\n action: SdkVoiceAction.VOICE_CANCEL,\n mimeType: this.voiceMimeType,\n listenerId: this.voiceListenerId,\n ...this.buildInitExtras(),\n });\n this.setVoiceState(\"idle\");\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(\n ack: NonNullable<ReturnType<typeof normalizeVoiceAck>>,\n ): void {\n const status = ack.status;\n\n if (status === \"cancelled\") {\n if (this._voiceState !== \"idle\") {\n this.setVoiceState(\"idle\");\n }\n return;\n }\n\n if (this.voiceResponseDismissed) {\n return;\n }\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 (this._voiceState === \"listening\" || this._voiceState === \"idle\") {\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.voiceResponseDismissed) {\n return;\n }\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 if (voiceAudio.isFinal) {\n this.voicePlaybackPromise = this.voiceResponsePlayer\n .finish(voiceAudio.mimeType)\n .catch((err) => {\n synxedWarn(\"Voice response playback failed\", err);\n })\n .finally(() => {\n this.voicePlaybackPromise = null;\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 if (this.voiceResponseDismissed) {\n return;\n }\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 (this.voicePlaybackPromise && !this.voiceResponseDismissed) {\n await this.voicePlaybackPromise;\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 userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n this.avatarRing.style.setProperty(\"-webkit-touch-callout\", \"none\");\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 userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n inner.style.setProperty(\"-webkit-touch-callout\", \"none\");\n this.avatarImgEl = el(\"img\", {\n attrs: {\n src: SYNXED_DJ_AVATAR_URL,\n alt: \"Synxed DJ\",\n draggable: \"false\",\n },\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 pointerEvents: \"none\",\n userSelect: \"none\",\n webkitUserSelect: \"none\",\n },\n });\n this.avatarImgEl.style.setProperty(\"-webkit-touch-callout\", \"none\");\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 inner.addEventListener(\"contextmenu\", (e) => e.preventDefault());\n inner.addEventListener(\"dragstart\", (e) => e.preventDefault());\n inner.addEventListener(\"selectstart\", (e) => e.preventDefault());\n\n if (this.voiceEnabled) {\n this.avatarRing.style.touchAction = \"none\";\n this.avatarRing.addEventListener(\"contextmenu\", (e) =>\n e.preventDefault(),\n );\n this.avatarRing.addEventListener(\"dragstart\", (e) => e.preventDefault());\n this.avatarRing.addEventListener(\"selectstart\", (e) =>\n e.preventDefault(),\n );\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 /** Hold DJ avatar to arm voice; VAD silence decides when the command is done. */\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\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.applyVoiceRing();\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 if (this.voiceUiDismissed) {\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 return;\n }\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 (state === \"listening\") {\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\" || state === \"processing\" || 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"]}