synxed-sdk 0.1.7 → 0.1.9

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.
@@ -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/core/SynxedPlayer.ts","../src/radio/nowPlaying.ts","../src/web/dom.ts","../src/web/SynxedWebPlayer.ts"],"names":["schema","root","SdkClientEnvelope","SdkServerEnvelope","ContentKind","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","isSafari","Hls","searchParams","xhr","e","Howl","id","ms","volume","update","PlaylistManager","tracks","currentIndex","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","error","SynxedProtocolError","readString","obj","keys","key","v","readNumber","normalizeInitAck","raw","ack","playbackUrl","normalizeTrack","item","t","kind","albumArt","parseContentSummary","contentSummary","contentKind","summary","s","tracksRaw","rawIndex","value","readBool","n","normalizeAdPayload","ad","SynxedPlayer","config","time","extras","options","nextTrack","prevTrack","override","eventType","positionMs","extra","intervalMs","interval","pos","parsed","status","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","SynxedWebPlayer","_SynxedWebPlayer","position","className","liveTop","wrap","inner","btn","shellShadow","row","pillInset","avatar","info","titleRow","controls","card","head","meta","transport","box","i","source","onState","state","remaining","tick","np","line","show","station","playing"],"mappings":"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","file":"index.mjs","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}\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 SdkClientEnvelope {\n oneof payload {\n SdkClientInit init = 1;\n SdkClientControl control = 2;\n SdkClientAnalytics analytics = 3;\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 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 SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\n SdkServerAdPayload ad = 3;\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}\n\nexport enum ErrorCode {\n UNSPECIFIED = 0,\n UNAUTHORIZED = 1,\n VALIDATION_ERROR = 2,\n NOT_FOUND = 3,\n PROCESSING = 4,\n SERVICE_UNAVAILABLE = 5,\n BAD_PROTOBUF = 6,\n}\n\nexport enum SdkControlAction {\n CONTROL_UNSPECIFIED = 0,\n CONTROL_PLAY = 1,\n CONTROL_PAUSE = 2,\n CONTROL_STOP = 3,\n CONTROL_SEEK = 4,\n CONTROL_SKIP_NEXT = 5,\n CONTROL_SKIP_PREVIOUS = 6,\n}\n","import { SdkClientEnvelope, SdkServerEnvelope } from '../proto/sdk-streaming';\n\nexport class ProtocolCodec {\n /**\n * Encodes a client envelope into a binary payload.\n */\n static encodeClientEnvelope(payload: any): Uint8Array {\n const message = SdkClientEnvelope.create(payload);\n return SdkClientEnvelope.encode(message).finish();\n }\n\n /**\n * Decodes a binary payload into a server envelope.\n */\n static decodeServerEnvelope(data: Uint8Array): any {\n const decoded = SdkServerEnvelope.decode(data);\n return SdkServerEnvelope.toObject(decoded, {\n enums: String,\n longs: String,\n bytes: String,\n defaults: true,\n oneofs: true,\n });\n }\n}\n","type Handler = (...args: any[]) => void;\n\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Handler>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: Events[K]): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n }\n\n off<K extends keyof Events>(event: K, handler: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n once<K extends keyof Events>(event: K, handler: Events[K]): void {\n const onceHandler = ((...args: any[]) => {\n handler(...args);\n this.off(event, onceHandler as Events[K]);\n }) as Events[K];\n this.on(event, onceHandler);\n }\n\n protected emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (set) {\n set.forEach((handler) => handler(...args));\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","let debugEnabled = false;\n\nexport function setSynxedDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\nexport function synxedDebug(...args: unknown[]): void {\n if (debugEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Synxed]', ...args);\n }\n}\n\nexport function synxedWarn(...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn('[Synxed]', ...args);\n}\n","import { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (reason: string) => void;\n error: (error: any) => void;\n message: (payload: any) => void;\n}\n\nexport function buildSdkWebSocketUrl(serverUrl: string, apiKey: string): string {\n const normalized = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n const wsBase = normalized.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:');\n const url = new URL(`${wsBase}/sdk`);\n url.searchParams.set('apiKey', apiKey);\n return url.toString();\n}\n\nexport class TransportManager extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private connectPromise: Promise<void> | null = null;\n\n connect(apiKey: string, serverUrl: string): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n const url = buildSdkWebSocketUrl(serverUrl, apiKey);\n synxedDebug('Opening native WebSocket', url.replace(/apiKey=[^&]+/, 'apiKey=***'));\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n this.ws.onopen = () => {\n this.connectPromise = null;\n this.emit('connected');\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason || `code ${event.code}`;\n this.ws = null;\n this.connectPromise = null;\n this.emit('disconnected', reason);\n };\n\n this.ws.onerror = () => {\n this.emit('error', new Error('WebSocket connection error'));\n };\n\n this.ws.onmessage = (event) => {\n try {\n const { data } = event;\n if (!(data instanceof ArrayBuffer)) return;\n\n const payload = ProtocolCodec.decodeServerEnvelope(new Uint8Array(data));\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n };\n }\n\n async waitForConnection(): Promise<void> {\n synxedDebug('Waiting for connection…');\n if (this.ws?.readyState === WebSocket.OPEN) {\n synxedDebug('Already connected');\n return;\n }\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized. Call connect() first.');\n }\n\n if (this.connectPromise) return this.connectPromise;\n\n this.connectPromise = new Promise((resolve, reject) => {\n const ws = this.ws!;\n\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n synxedDebug('WebSocket connected');\n cleanup();\n resolve();\n };\n\n const onError = () => {\n synxedWarn('WebSocket connection error');\n cleanup();\n reject(new Error('WebSocket connection failed'));\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('WebSocket closed before connection was established'));\n };\n\n const cleanup = () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n });\n\n return this.connectPromise;\n }\n\n disconnect(): void {\n if (!this.ws) return;\n\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n this.connectPromise = null;\n }\n\n sendInit(params: any): void {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n synxedDebug('Sending init packet', params);\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ init: params }));\n }\n\n sendControl(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ control: params }));\n }\n\n sendAnalytics(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ analytics: params }));\n }\n\n 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\n constructor() {\n super();\n }\n\n\n /**\n * Loads a track URL.\n */\n async load(url: string, isHls: boolean): Promise<void> {\n this.stop();\n this.emit('loading');\n\n synxedDebug('AudioEngine loading', { url, isHls });\n\n // Safari has native HLS support. Other browsers need hls.js.\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 // Extract query parameters from the manifest URL to forward to segments\n const urlObj = new URL(url);\n const searchParams = urlObj.search;\n\n this.hls = new Hls({\n xhrSetup: (xhr) => {\n xhr.setRequestHeader(\"ngrok-skip-browser-warning\", \"true\");\n }\n });\n this.audioEl = new Audio();\n this.hls.loadSource(url);\n this.hls.attachMedia(this.audioEl);\n \n this.audioEl.onplay = () => {\n this.emit('playing');\n this.startTimeUpdateLoop();\n };\n this.audioEl.onpause = () => {\n this.emit('paused');\n this.stopTimeUpdateLoop();\n };\n this.audioEl.onended = () => {\n this.emit('ended');\n this.stopTimeUpdateLoop();\n };\n this.audioEl.onerror = (e) => {\n synxedWarn('HLS audio element error', e);\n this.emit('error', e);\n };\n this.audioEl.onloadedmetadata = () => {\n this.emit('loaded');\n };\n\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\n if (data.fatal) {\n synxedWarn('Fatal HLS error', data);\n this.emit('error', data);\n }\n });\n\n return;\n }\n } catch (e) {\n synxedWarn('hls.js not available, falling back to native playback');\n }\n }\n\n // Fallback to Howler\n this.howl = new Howl({\n src: [url],\n html5: true, \n format: isHls ? ['m3u8'] : undefined,\n onload: () => {\n synxedDebug('AudioEngine loaded');\n this.emit('loaded');\n },\n onloaderror: (id, err) => {\n synxedWarn('AudioEngine load error', err, id);\n this.emit('error', err);\n },\n onplay: () => {\n this.emit('playing');\n this.startTimeUpdateLoop();\n },\n onpause: () => {\n this.emit('paused');\n this.stopTimeUpdateLoop();\n },\n onstop: () => {\n this.emit('stopped');\n this.stopTimeUpdateLoop();\n },\n onend: () => {\n this.emit('ended');\n this.stopTimeUpdateLoop();\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 if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n if (this.audioEl) {\n this.audioEl.pause();\n this.audioEl.src = '';\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 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 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","import { TransportManager } from \"../transport/TransportManager\";\nimport { AudioEngine } from \"../audio/AudioEngine\";\nimport { PlaylistManager } from \"../playlist/PlaylistManager\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { ContentKind, SdkControlAction } from \"../proto/sdk-streaming\";\nimport {\n SynxedConfig,\n PlayerState,\n PlaySongOptions,\n PlayPlaylistOptions,\n PlayRadioOptions,\n SynxedEvents,\n TrackInfo,\n} from \"../types\";\nimport {\n SynxedError,\n SynxedPlaybackError,\n SynxedConnectionError,\n} from \"./errors\";\nimport { normalizeInitAck, parseContentSummary } from \"./contentSummary\";\nimport { normalizeAdPayload } from \"./adPayload\";\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 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\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\n this.setupListeners();\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 private controlPositionMs(): number {\n if (this.activeContentKind === ContentKind.RADIO) return 0;\n return this.positionMsForAnalytics();\n }\n\n private setupListeners(): void {\n // Transport Listeners\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 // Audio Listeners\n this.audio.on(\"playing\", () => this.updateStatus(\"playing\"));\n this.audio.on(\"paused\", () => this.updateStatus(\"paused\"));\n this.audio.on(\"stopped\", () => this.updateStatus(\"idle\"));\n this.audio.on(\"loading\", () => this.updateStatus(\"loading\"));\n this.audio.on(\"error\", (error) =>\n this.emit(\"error\", new SynxedPlaybackError(error)),\n );\n this.audio.on(\"timeupdate\", (time) => this.emit(\"timeUpdate\", time));\n this.audio.on(\"ended\", () => this.handleTrackEnded());\n\n // Playlist Listeners\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\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\n }\n\n private buildInitExtras(): { gameContext?: string; deviceType?: string } {\n const extras: { gameContext?: string; deviceType?: string } = {};\n if (this.config.gameContext?.trim()) {\n extras.gameContext = this.config.gameContext.trim();\n }\n if (this.config.deviceType?.trim()) {\n extras.deviceType = this.config.deviceType.trim();\n }\n return extras;\n }\n\n async playSong(options: PlaySongOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.SONG;\n this.transport.sendInit({\n contentKind: ContentKind.SONG,\n catalogTrackId: options.catalogTrackId,\n internalTrackId: options.internalTrackId,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playPlaylist(options: PlayPlaylistOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.PLAYLIST;\n this.transport.sendInit({\n contentKind: ContentKind.PLAYLIST,\n playlistCode: options.playlistCode,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playRadio(options: PlayRadioOptions = {}): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.RADIO;\n this.transport.sendInit({\n contentKind: ContentKind.RADIO,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n 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 // For multi-track playlists, delegate to server-side skip\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 // Fallback: client-side skip for single-track sessions\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?: any,\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 async handleServerMessage(\n payload: Record<string, unknown>,\n ): Promise<void> {\n synxedDebug(\"Received server message\", payload);\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.currentAd) {\n this.emit('adEnd', this.currentAd);\n }\n this.adPlaying = false;\n this.currentAd = null;\n synxedDebug(\"Loading playback\", {\n url: ack.playbackUrl,\n isHls: ack.isHls,\n });\n await this.audio.load(ack.playbackUrl, ack.isHls);\n this.audio.play();\n this.emitAnalytics(\n \"stream_start\",\n this.activeContentKind === ContentKind.RADIO ? 0 : undefined,\n );\n\n this.startHeartbeat(ack.heartbeatIntervalMs);\n this.applyContentSummary(ack.contentSummary);\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 this.emit(\"error\", new SynxedError(message, code));\n }\n }\n\n private async handleAdPlayback(\n ad: NonNullable<ReturnType<typeof normalizeAdPayload>>,\n ): Promise<void> {\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 await this.audio.load(ad.playbackUrl, ad.isHls);\n this.audio.play();\n this.emit(\"adStart\", this.currentAd);\n }\n\n skipAd(): void {\n if (!this.adPlaying || !this.currentAd) return;\n if (!this.currentAd.isSkippable) return;\n const positionMs = Math.floor(this.audio.currentTime);\n if (positionMs < this.currentAd.skipAfterSeconds * 1000) return;\n\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);\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 this.emitAnalytics(\"ad_complete\", Math.floor(this.audio.currentTime));\n if (this.currentAd) this.emit(\"adEnd\", this.currentAd);\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(\"track_complete\", Math.floor(this.audio.duration));\n this.updateStatus(\"loading\");\n return;\n }\n\n if (this.playlist.hasNext) {\n this.skip();\n } else {\n this.updateStatus(\"idle\");\n }\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.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 { PlayerState, RadioNowPlaying, TrackInfo } 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\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\n constructor(options: SynxedWebPlayerOptions) {\n this.options = {\n mode: 'wide',\n attribution: 'Synxed',\n nowPlayingPollMs: 12_000,\n powerByLabel: 'Powered by Synxed',\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 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 = 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\n private buildAvatar(size: number, liveTop = false): HTMLElement {\n const wrap = el('div', { style: { position: 'relative', flexShrink: '0' } });\n this.avatarRing = el('div', {\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: '50%',\n border: '3px solid var(--sw-accent)',\n padding: '3px',\n boxShadow: `0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)`,\n background: 'var(--sw-bg)',\n boxSizing: 'border-box',\n },\n });\n const inner = el('div', {\n style: {\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n background: 'var(--sw-bg-inner)',\n overflow: 'hidden',\n },\n });\n this.avatarImgEl = el('img', {\n attrs: { src: this.options.avatarUrl || '', alt: '' },\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: this.options.avatarUrl ? 'block' : 'none',\n },\n });\n this.avatarTextEl = el('div', {\n text: 'S',\n style: {\n width: '100%',\n height: '100%',\n display: this.options.avatarUrl ? 'none' : 'flex',\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 = 'pointer';\n inner.addEventListener('click', (e) => {\n if (this.currentAd && this.engine) {\n e.stopPropagation();\n this.engine.clickAd();\n }\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 ? { top: '4px', left: '4px' } : { 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 btn = el('button', {\n attrs: { type: 'button', 'aria-label': this.options.onMiniClick ? 'Expand player' : 'Live DJ' },\n style: {\n position: 'relative',\n padding: '0',\n border: 'none',\n background: 'transparent',\n cursor: this.options.onMiniClick ? 'pointer' : 'default',\n },\n onClick: () => this.options.onMiniClick?.(),\n });\n btn.appendChild(this.buildAvatar(size));\n this.root.appendChild(btn);\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: { position: 'relative', display: 'flex', alignItems: 'center', width: '100%' },\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, { position: 'relative', zIndex: '1', marginLeft: '-2px' });\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: { display: 'flex', alignItems: 'baseline', gap: '8px', overflow: 'hidden' },\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.engine?.skip(),\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', { style: { display: 'flex', gap: '12px', alignItems: 'center', minWidth: '0' } });\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: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '18px' },\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: { ...this.roundControlStyle(), fontSize: '12px', fontWeight: 'bold' },\n onClick: () => this.engine?.skip(),\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: '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', { style: { display: 'flex', flexDirection: 'column', gap: '3px', opacity: '0.22' } });\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({ apiKey, serverUrl, autoConnect: true });\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 };\n p.on('stateChange', onState);\n p.on('trackChange', (track) => {\n this.currentTrack = track;\n this.refreshLabels();\n });\n p.on('adStart', (ad) => {\n this.currentAd = ad;\n this.refreshLabels();\n this.updateAvatar();\n });\n p.on('adEnd', () => {\n this.currentAd = null;\n this.refreshLabels();\n this.updateAvatar();\n if (this.skipBtn) {\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '1';\n this.skipBtn.style.cursor = 'pointer';\n }\n });\n p.on('timeUpdate', (time) => {\n if (this.currentAd && this.skipBtn) {\n if (this.currentAd.isSkippable) {\n // time.currentTime is already in milliseconds\n const remaining = Math.ceil((this.currentAd.skipAfterSeconds * 1000 - time.currentTime) / 1000);\n if (remaining > 0) {\n this.skipBtn.textContent = `${remaining}s`;\n this.skipBtn.style.opacity = '0.5';\n this.skipBtn.style.cursor = 'not-allowed';\n } else if (this.skipBtn.textContent !== '') {\n this.skipBtn.textContent = '';\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '1';\n this.skipBtn.style.cursor = 'pointer';\n }\n } else {\n // Ad is unskippable, keep skip button dimmed\n if (this.skipBtn.style.opacity !== '0.2') {\n this.skipBtn.textContent = '';\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '0.2';\n this.skipBtn.style.cursor = 'not-allowed';\n }\n }\n }\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\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 displayLine(): { title: string; artist?: string } {\n if (this.currentAd) {\n return { title: this.currentAd.campaignName || 'Advertisement', artist: this.currentAd.creativeName };\n }\n if (this.isRadio && this.nowPlaying?.title) {\n return parseDisplayTitle(this.nowPlaying.title);\n }\n if (this.currentTrack?.title) {\n return { title: this.currentTrack.title, artist: this.currentTrack.artist };\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 = this.isRadio && (this.nowPlaying?.station ?? this.currentTrack?.title ?? 'Synxed Radio');\n this.footerEl.textContent = station && this.isRadio\n ? `${station} · Synxed Player`\n : 'Synxed Player';\n }\n }\n }\n\n private updateAvatar(): void {\n const url = this.currentAd?.companionBannerUrl || this.options.avatarUrl;\n if (url) {\n if (this.avatarImgEl) {\n this.avatarImgEl.src = url;\n this.avatarImgEl.style.display = 'block';\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 setPlayingVisual(playing: boolean): void {\n if (this.avatarRing) {\n this.avatarRing.style.animation = playing ? 'synxed-wp-spin 4s linear infinite' : '';\n }\n if (this.playBtn) {\n this.playBtn.replaceChildren(svgIcon(playing ? ICON_PAUSE : ICON_PLAY, 20));\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/core/SynxedPlayer.ts","../src/radio/nowPlaying.ts","../src/web/dom.ts","../src/web/SynxedWebPlayer.ts"],"names":["schema","root","SdkClientEnvelope","SdkServerEnvelope","ContentKind","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","isSafari","Hls","searchParams","xhr","e","Howl","id","ms","volume","update","PlaylistManager","tracks","currentIndex","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","error","SynxedProtocolError","readString","obj","keys","key","v","readNumber","normalizeInitAck","raw","ack","playbackUrl","normalizeTrack","item","t","kind","albumArt","parseContentSummary","contentSummary","contentKind","summary","s","tracksRaw","rawIndex","value","readBool","n","normalizeAdPayload","ad","SynxedPlayer","config","time","extras","options","nextTrack","prevTrack","override","eventType","positionMs","extra","intervalMs","interval","pos","parsed","status","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","SynxedWebPlayer","_SynxedWebPlayer","position","className","liveTop","wrap","inner","btn","shellShadow","row","pillInset","avatar","info","titleRow","controls","card","head","meta","transport","box","i","source","onState","state","remaining","tick","np","line","show","station","playing"],"mappings":"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","file":"index.mjs","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}\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 SdkClientEnvelope {\n oneof payload {\n SdkClientInit init = 1;\n SdkClientControl control = 2;\n SdkClientAnalytics analytics = 3;\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 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 SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\n SdkServerAdPayload ad = 3;\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}\n\nexport enum ErrorCode {\n UNSPECIFIED = 0,\n UNAUTHORIZED = 1,\n VALIDATION_ERROR = 2,\n NOT_FOUND = 3,\n PROCESSING = 4,\n SERVICE_UNAVAILABLE = 5,\n BAD_PROTOBUF = 6,\n}\n\nexport enum SdkControlAction {\n CONTROL_UNSPECIFIED = 0,\n CONTROL_PLAY = 1,\n CONTROL_PAUSE = 2,\n CONTROL_STOP = 3,\n CONTROL_SEEK = 4,\n CONTROL_SKIP_NEXT = 5,\n CONTROL_SKIP_PREVIOUS = 6,\n}\n","import { SdkClientEnvelope, SdkServerEnvelope } from '../proto/sdk-streaming';\n\nexport class ProtocolCodec {\n /**\n * Encodes a client envelope into a binary payload.\n */\n static encodeClientEnvelope(payload: any): Uint8Array {\n const message = SdkClientEnvelope.create(payload);\n return SdkClientEnvelope.encode(message).finish();\n }\n\n /**\n * Decodes a binary payload into a server envelope.\n */\n static decodeServerEnvelope(data: Uint8Array): any {\n const decoded = SdkServerEnvelope.decode(data);\n return SdkServerEnvelope.toObject(decoded, {\n enums: String,\n longs: String,\n bytes: String,\n defaults: true,\n oneofs: true,\n });\n }\n}\n","type Handler = (...args: any[]) => void;\n\nexport class EventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Handler>> = new Map();\n\n on<K extends keyof Events>(event: K, handler: Events[K]): void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n }\n\n off<K extends keyof Events>(event: K, handler: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(handler);\n }\n }\n\n once<K extends keyof Events>(event: K, handler: Events[K]): void {\n const onceHandler = ((...args: any[]) => {\n handler(...args);\n this.off(event, onceHandler as Events[K]);\n }) as Events[K];\n this.on(event, onceHandler);\n }\n\n protected emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (set) {\n set.forEach((handler) => handler(...args));\n }\n }\n\n removeAllListeners(): void {\n this.listeners.clear();\n }\n}\n","let debugEnabled = false;\n\nexport function setSynxedDebug(enabled: boolean): void {\n debugEnabled = enabled;\n}\n\nexport function synxedDebug(...args: unknown[]): void {\n if (debugEnabled) {\n // eslint-disable-next-line no-console\n console.debug('[Synxed]', ...args);\n }\n}\n\nexport function synxedWarn(...args: unknown[]): void {\n // eslint-disable-next-line no-console\n console.warn('[Synxed]', ...args);\n}\n","import { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\nimport { synxedDebug, synxedWarn } from '../core/debug';\n\nexport interface TransportEvents {\n connected: () => void;\n disconnected: (reason: string) => void;\n error: (error: any) => void;\n message: (payload: any) => void;\n}\n\nexport function buildSdkWebSocketUrl(serverUrl: string, apiKey: string): string {\n const normalized = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n const wsBase = normalized.replace(/^http:/, 'ws:').replace(/^https:/, 'wss:');\n const url = new URL(`${wsBase}/sdk`);\n url.searchParams.set('apiKey', apiKey);\n return url.toString();\n}\n\nexport class TransportManager extends EventEmitter<TransportEvents> {\n private ws: WebSocket | null = null;\n private connectPromise: Promise<void> | null = null;\n\n connect(apiKey: string, serverUrl: string): void {\n if (\n this.ws &&\n (this.ws.readyState === WebSocket.OPEN ||\n this.ws.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n\n const url = buildSdkWebSocketUrl(serverUrl, apiKey);\n synxedDebug('Opening native WebSocket', url.replace(/apiKey=[^&]+/, 'apiKey=***'));\n\n this.ws = new WebSocket(url);\n this.ws.binaryType = 'arraybuffer';\n\n this.ws.onopen = () => {\n this.connectPromise = null;\n this.emit('connected');\n };\n\n this.ws.onclose = (event) => {\n const reason = event.reason || `code ${event.code}`;\n this.ws = null;\n this.connectPromise = null;\n this.emit('disconnected', reason);\n };\n\n this.ws.onerror = () => {\n this.emit('error', new Error('WebSocket connection error'));\n };\n\n this.ws.onmessage = (event) => {\n try {\n const { data } = event;\n if (!(data instanceof ArrayBuffer)) return;\n\n const payload = ProtocolCodec.decodeServerEnvelope(new Uint8Array(data));\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n };\n }\n\n async waitForConnection(): Promise<void> {\n synxedDebug('Waiting for connection…');\n if (this.ws?.readyState === WebSocket.OPEN) {\n synxedDebug('Already connected');\n return;\n }\n\n if (!this.ws) {\n throw new Error('WebSocket not initialized. Call connect() first.');\n }\n\n if (this.connectPromise) return this.connectPromise;\n\n this.connectPromise = new Promise((resolve, reject) => {\n const ws = this.ws!;\n\n if (ws.readyState === WebSocket.OPEN) {\n resolve();\n return;\n }\n\n const onOpen = () => {\n synxedDebug('WebSocket connected');\n cleanup();\n resolve();\n };\n\n const onError = () => {\n synxedWarn('WebSocket connection error');\n cleanup();\n reject(new Error('WebSocket connection failed'));\n };\n\n const onClose = () => {\n cleanup();\n reject(new Error('WebSocket closed before connection was established'));\n };\n\n const cleanup = () => {\n ws.removeEventListener('open', onOpen);\n ws.removeEventListener('error', onError);\n ws.removeEventListener('close', onClose);\n };\n\n ws.addEventListener('open', onOpen);\n ws.addEventListener('error', onError);\n ws.addEventListener('close', onClose);\n });\n\n return this.connectPromise;\n }\n\n disconnect(): void {\n if (!this.ws) return;\n\n this.ws.onclose = null;\n this.ws.close();\n this.ws = null;\n this.connectPromise = null;\n }\n\n sendInit(params: any): void {\n if (!this.isConnected) {\n throw new Error('WebSocket not connected');\n }\n\n synxedDebug('Sending init packet', params);\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ init: params }));\n }\n\n sendControl(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ control: params }));\n }\n\n sendAnalytics(params: any): void {\n if (!this.isConnected) return;\n this.sendBytes(ProtocolCodec.encodeClientEnvelope({ analytics: params }));\n }\n\n 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\n constructor() {\n super();\n }\n\n\n /**\n * Loads a track URL.\n */\n async load(url: string, isHls: boolean): Promise<void> {\n this.stop();\n this.emit('loading');\n\n synxedDebug('AudioEngine loading', { url, isHls });\n\n // Safari has native HLS support. Other browsers need hls.js.\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 // Extract query parameters from the manifest URL to forward to segments\n const urlObj = new URL(url);\n const searchParams = urlObj.search;\n\n this.hls = new Hls({\n xhrSetup: (xhr) => {\n xhr.setRequestHeader(\"ngrok-skip-browser-warning\", \"true\");\n }\n });\n this.audioEl = new Audio();\n this.hls.loadSource(url);\n this.hls.attachMedia(this.audioEl);\n \n this.audioEl.onplay = () => {\n this.emit('playing');\n this.startTimeUpdateLoop();\n };\n this.audioEl.onpause = () => {\n this.emit('paused');\n this.stopTimeUpdateLoop();\n };\n this.audioEl.onended = () => {\n this.emit('ended');\n this.stopTimeUpdateLoop();\n };\n this.audioEl.onerror = (e) => {\n synxedWarn('HLS audio element error', e);\n this.emit('error', e);\n };\n this.audioEl.onloadedmetadata = () => {\n this.emit('loaded');\n };\n\n this.hls.on(Hls.Events.ERROR, (event: any, data: any) => {\n if (data.fatal) {\n synxedWarn('Fatal HLS error', data);\n this.emit('error', data);\n }\n });\n\n return;\n }\n } catch (e) {\n synxedWarn('hls.js not available, falling back to native playback');\n }\n }\n\n // Fallback to Howler\n this.howl = new Howl({\n src: [url],\n html5: true, \n format: isHls ? ['m3u8'] : undefined,\n onload: () => {\n synxedDebug('AudioEngine loaded');\n this.emit('loaded');\n },\n onloaderror: (id, err) => {\n synxedWarn('AudioEngine load error', err, id);\n this.emit('error', err);\n },\n onplay: () => {\n this.emit('playing');\n this.startTimeUpdateLoop();\n },\n onpause: () => {\n this.emit('paused');\n this.stopTimeUpdateLoop();\n },\n onstop: () => {\n this.emit('stopped');\n this.stopTimeUpdateLoop();\n },\n onend: () => {\n this.emit('ended');\n this.stopTimeUpdateLoop();\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 if (this.hls) {\n this.hls.destroy();\n this.hls = null;\n }\n if (this.audioEl) {\n this.audioEl.pause();\n this.audioEl.src = '';\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 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 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","import { TransportManager } from \"../transport/TransportManager\";\nimport { AudioEngine } from \"../audio/AudioEngine\";\nimport { PlaylistManager } from \"../playlist/PlaylistManager\";\nimport { EventEmitter } from \"./EventEmitter\";\nimport { ContentKind, SdkControlAction } from \"../proto/sdk-streaming\";\nimport {\n SynxedConfig,\n PlayerState,\n PlaySongOptions,\n PlayPlaylistOptions,\n PlayRadioOptions,\n SynxedEvents,\n TrackInfo,\n} from \"../types\";\nimport {\n SynxedError,\n SynxedPlaybackError,\n SynxedConnectionError,\n} from \"./errors\";\nimport { normalizeInitAck, parseContentSummary } from \"./contentSummary\";\nimport { normalizeAdPayload } from \"./adPayload\";\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 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\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\n this.setupListeners();\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 private controlPositionMs(): number {\n if (this.activeContentKind === ContentKind.RADIO) return 0;\n return this.positionMsForAnalytics();\n }\n\n private setupListeners(): void {\n // Transport Listeners\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 // Audio Listeners\n this.audio.on(\"playing\", () => this.updateStatus(\"playing\"));\n this.audio.on(\"paused\", () => this.updateStatus(\"paused\"));\n this.audio.on(\"stopped\", () => this.updateStatus(\"idle\"));\n this.audio.on(\"loading\", () => this.updateStatus(\"loading\"));\n this.audio.on(\"error\", (error) =>\n this.emit(\"error\", new SynxedPlaybackError(error)),\n );\n this.audio.on(\"timeupdate\", (time) => this.emit(\"timeUpdate\", time));\n this.audio.on(\"ended\", () => this.handleTrackEnded());\n\n // Playlist Listeners\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\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\n }\n\n private buildInitExtras(): { gameContext?: string; deviceType?: string } {\n const extras: { gameContext?: string; deviceType?: string } = {};\n if (this.config.gameContext?.trim()) {\n extras.gameContext = this.config.gameContext.trim();\n }\n if (this.config.deviceType?.trim()) {\n extras.deviceType = this.config.deviceType.trim();\n }\n return extras;\n }\n\n async playSong(options: PlaySongOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.SONG;\n this.transport.sendInit({\n contentKind: ContentKind.SONG,\n catalogTrackId: options.catalogTrackId,\n internalTrackId: options.internalTrackId,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playPlaylist(options: PlayPlaylistOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.PLAYLIST;\n this.transport.sendInit({\n contentKind: ContentKind.PLAYLIST,\n playlistCode: options.playlistCode,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n async playRadio(options: PlayRadioOptions = {}): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n\n this.activeContentKind = ContentKind.RADIO;\n this.transport.sendInit({\n contentKind: ContentKind.RADIO,\n listenerId: options.listenerId,\n ...this.buildInitExtras(),\n });\n }\n\n 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 // For multi-track playlists, delegate to server-side skip\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 // Fallback: client-side skip for single-track sessions\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?: any,\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 async handleServerMessage(\n payload: Record<string, unknown>,\n ): Promise<void> {\n synxedDebug(\"Received server message\", payload);\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.currentAd) {\n this.emit('adEnd', this.currentAd);\n }\n this.adPlaying = false;\n this.currentAd = null;\n synxedDebug(\"Loading playback\", {\n url: ack.playbackUrl,\n isHls: ack.isHls,\n });\n await this.audio.load(ack.playbackUrl, ack.isHls);\n this.audio.play();\n this.emitAnalytics(\n \"stream_start\",\n this.activeContentKind === ContentKind.RADIO ? 0 : undefined,\n );\n\n this.startHeartbeat(ack.heartbeatIntervalMs);\n this.applyContentSummary(ack.contentSummary);\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 this.emit(\"error\", new SynxedError(message, code));\n }\n }\n\n private async handleAdPlayback(\n ad: NonNullable<ReturnType<typeof normalizeAdPayload>>,\n ): Promise<void> {\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 await this.audio.load(ad.playbackUrl, ad.isHls);\n this.audio.play();\n this.emit(\"adStart\", this.currentAd);\n }\n\n skipAd(): void {\n if (!this.adPlaying || !this.currentAd) return;\n if (!this.currentAd.isSkippable) return;\n const positionMs = Math.floor(this.audio.currentTime);\n if (positionMs < this.currentAd.skipAfterSeconds * 1000) return;\n\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);\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 this.emitAnalytics(\"ad_complete\", Math.floor(this.audio.currentTime));\n if (this.currentAd) this.emit(\"adEnd\", this.currentAd);\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(\"track_complete\", Math.floor(this.audio.duration));\n this.updateStatus(\"loading\");\n return;\n }\n\n if (this.playlist.hasNext) {\n this.skip();\n } else {\n this.updateStatus(\"idle\");\n }\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.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 { PlayerState, RadioNowPlaying, TrackInfo } 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\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\n constructor(options: SynxedWebPlayerOptions) {\n this.options = {\n mode: 'wide',\n attribution: 'Synxed',\n nowPlayingPollMs: 12_000,\n powerByLabel: 'Powered by Synxed',\n avatarUrl: 'https://cdn.synxed.com/avater-image/avatar.webp',\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 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 = 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\n private buildAvatar(size: number, liveTop = false): HTMLElement {\n const wrap = el('div', { style: { position: 'relative', flexShrink: '0' } });\n this.avatarRing = el('div', {\n style: {\n width: `${size}px`,\n height: `${size}px`,\n borderRadius: '50%',\n border: '3px solid var(--sw-accent)',\n padding: '3px',\n boxShadow: `0 0 24px var(--sw-glow), 0 0 48px rgba(0,0,0,0.25)`,\n background: 'var(--sw-bg)',\n boxSizing: 'border-box',\n },\n });\n const inner = el('div', {\n style: {\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n background: 'var(--sw-bg-inner)',\n overflow: 'hidden',\n },\n });\n this.avatarImgEl = el('img', {\n attrs: { src: this.options.avatarUrl || '', alt: '' },\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: this.options.avatarUrl ? 'block' : 'none',\n },\n });\n this.avatarTextEl = el('div', {\n text: 'S',\n style: {\n width: '100%',\n height: '100%',\n display: this.options.avatarUrl ? 'none' : 'flex',\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 = 'default';\n inner.addEventListener('click', (e) => {\n if (this.currentAd && this.engine) {\n e.stopPropagation();\n this.engine.clickAd();\n }\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 ? { top: '4px', left: '4px' } : { 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 btn = el('button', {\n attrs: { type: 'button', 'aria-label': this.options.onMiniClick ? 'Expand player' : 'Live DJ' },\n style: {\n position: 'relative',\n padding: '0',\n border: 'none',\n background: 'transparent',\n cursor: this.options.onMiniClick ? 'pointer' : 'default',\n },\n onClick: () => this.options.onMiniClick?.(),\n });\n btn.appendChild(this.buildAvatar(size));\n this.root.appendChild(btn);\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: { position: 'relative', display: 'flex', alignItems: 'center', width: '100%' },\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, { position: 'relative', zIndex: '1', marginLeft: '-2px' });\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: { display: 'flex', alignItems: 'baseline', gap: '8px', overflow: 'hidden' },\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.engine?.skip(),\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', { style: { display: 'flex', gap: '12px', alignItems: 'center', minWidth: '0' } });\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: { display: 'flex', alignItems: 'center', justifyContent: 'center', gap: '18px' },\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: { ...this.roundControlStyle(), fontSize: '12px', fontWeight: 'bold' },\n onClick: () => this.engine?.skip(),\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: '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', { style: { display: 'flex', flexDirection: 'column', gap: '3px', opacity: '0.22' } });\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({ apiKey, serverUrl, autoConnect: true });\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 };\n p.on('stateChange', onState);\n p.on('trackChange', (track) => {\n this.currentTrack = track;\n this.refreshLabels();\n });\n p.on('adStart', (ad) => {\n this.currentAd = ad;\n this.refreshLabels();\n this.updateAvatar();\n });\n p.on('adEnd', () => {\n this.currentAd = null;\n this.refreshLabels();\n this.updateAvatar();\n if (this.skipBtn) {\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '1';\n this.skipBtn.style.cursor = 'pointer';\n }\n });\n p.on('timeUpdate', (time) => {\n if (this.currentAd && this.skipBtn) {\n if (this.currentAd.isSkippable) {\n // time.currentTime is already in milliseconds\n const remaining = Math.ceil((this.currentAd.skipAfterSeconds * 1000 - time.currentTime) / 1000);\n if (remaining > 0) {\n this.skipBtn.textContent = `${remaining}s`;\n this.skipBtn.style.opacity = '0.5';\n this.skipBtn.style.cursor = 'not-allowed';\n } else if (this.skipBtn.textContent !== '') {\n this.skipBtn.textContent = '';\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '1';\n this.skipBtn.style.cursor = 'pointer';\n }\n } else {\n // Ad is unskippable, keep skip button dimmed\n if (this.skipBtn.style.opacity !== '0.2') {\n this.skipBtn.textContent = '';\n this.skipBtn.replaceChildren(svgIcon(ICON_SKIP, 22));\n this.skipBtn.style.opacity = '0.2';\n this.skipBtn.style.cursor = 'not-allowed';\n }\n }\n }\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\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 displayLine(): { title: string; artist?: string } {\n if (this.currentAd) {\n return { title: this.currentAd.campaignName || 'Advertisement', artist: this.currentAd.creativeName };\n }\n if (this.isRadio && this.nowPlaying?.title) {\n return parseDisplayTitle(this.nowPlaying.title);\n }\n if (this.currentTrack?.title) {\n return { title: this.currentTrack.title, artist: this.currentTrack.artist };\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 = this.isRadio && (this.nowPlaying?.station ?? this.currentTrack?.title ?? 'Synxed Radio');\n this.footerEl.textContent = station && this.isRadio\n ? `${station} · Synxed Player`\n : 'Synxed Player';\n }\n }\n }\n\n private updateAvatar(): void {\n const url = this.currentAd?.companionBannerUrl || this.options.avatarUrl;\n if (url) {\n if (this.avatarImgEl) {\n this.avatarImgEl.src = url;\n this.avatarImgEl.style.display = 'block';\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 if (this.avatarRing) {\n const inner = this.avatarRing.firstChild as HTMLElement;\n if (inner) {\n inner.style.cursor = this.currentAd ? 'pointer' : 'default';\n }\n }\n }\n\n private setPlayingVisual(playing: boolean): void {\n if (this.avatarRing) {\n this.avatarRing.style.animation = playing ? 'synxed-wp-spin 4s linear infinite' : '';\n }\n if (this.playBtn) {\n this.playBtn.replaceChildren(svgIcon(playing ? ICON_PAUSE : ICON_PLAY, 20));\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"]}