synxed-sdk 0.1.1 → 0.1.3

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/transport/TransportManager.ts","../src/audio/AudioEngine.ts","../src/playlist/PlaylistManager.ts","../src/core/errors.ts","../src/core/SynxedPlayer.ts"],"names":["schema","root","SdkClientEnvelope","SdkServerEnvelope","ContentKind","ErrorCode","ProtocolCodec","payload","message","data","decoded","EventEmitter","event","handler","set","onceHandler","args","TransportManager","apiKey","serverUrl","normalizedUrl","io","reason","error","uint8Array","err","resolve","reject","onConnect","cleanup","onError","params","bytes","AudioEngine","url","isHls","isSafari","Hls","searchParams","e","Howl","id","ms","volume","update","PlaylistManager","tracks","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","SynxedProtocolError","SynxedPlayer","config","time","options","nextTrack","eventType","positionMs","extra","ack","summary","status"],"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}\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}\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}\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 SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\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}\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","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","import { io, Socket } from 'socket.io-client';\nimport { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\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 class TransportManager extends EventEmitter<TransportEvents> {\n private socket: Socket | null = null;\n private apiKey: string | null = null;\n private serverUrl: string | null = null;\n\n constructor() {\n super();\n }\n\n /**\n * Connects to the Synxed SDK namespace.\n */\n connect(apiKey: string, serverUrl: string): void {\n if (this.socket?.connected) return;\n\n this.apiKey = apiKey;\n this.serverUrl = serverUrl;\n\n const normalizedUrl = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n\n this.socket = io(`${normalizedUrl}/sdk`, {\n auth: { apiKey },\n transports: ['websocket'],\n });\n\n this.socket.on('connect', () => {\n this.emit('connected');\n });\n\n this.socket.on('disconnect', (reason) => {\n this.emit('disconnected', reason);\n });\n\n this.socket.on('connect_error', (error) => {\n this.emit('error', error);\n });\n\n this.socket.on('d', (data: ArrayBuffer | Uint8Array) => {\n try {\n const uint8Array = data instanceof Uint8Array ? data : new Uint8Array(data);\n const payload = ProtocolCodec.decodeServerEnvelope(uint8Array);\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n });\n }\n\n /**\n * Returns a promise that resolves when the socket is connected.\n */\n async waitForConnection(): Promise<void> {\n console.log('[Synxed] Waiting for connection...');\n if (this.socket?.connected) {\n console.log('[Synxed] Already connected');\n return;\n }\n \n return new Promise((resolve, reject) => {\n const onConnect = () => {\n console.log('[Synxed] Socket connected event fired');\n cleanup();\n resolve();\n };\n \n const onError = (err: any) => {\n console.error('[Synxed] Socket connection error:', err);\n cleanup();\n reject(err);\n };\n \n const cleanup = () => {\n this.socket?.off('connect', onConnect);\n this.socket?.off('connect_error', onError);\n };\n\n this.socket?.once('connect', onConnect);\n this.socket?.once('connect_error', onError);\n \n if (!this.socket) {\n console.error('[Synxed] No socket instance found');\n reject(new Error('Socket not initialized. Call connect() first.'));\n }\n });\n }\n\n /**\n * Disconnects from the server.\n */\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n }\n\n /**\n * Sends an init message to the backend.\n */\n sendInit(params: any): void {\n if (!this.socket?.connected) {\n throw new Error('Socket not connected');\n }\n\n console.log('[Synxed] Sending init packet:', params);\n const payload = { init: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Sends a control message.\n */\n sendControl(params: any): void {\n if (!this.socket?.connected) return;\n const payload = { control: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Sends an analytics message.\n */\n sendAnalytics(params: any): void {\n if (!this.socket?.connected) return;\n const payload = { analytics: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Checks if the socket is connected.\n */\n get isConnected(): boolean {\n return this.socket?.connected || false;\n }\n}\n","import { Howl } from 'howler';\nimport { EventEmitter } from '../core/EventEmitter';\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 console.log('[Synxed] AudioEngine loading URL:', url, 'isHls:', 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 console.log('[Synxed] 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 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 console.error('[Synxed] HLS Audio 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 console.error('[Synxed] Fatal HLS error:', data);\n this.emit('error', data);\n }\n });\n\n return;\n }\n } catch (e) {\n console.warn('[Synxed] hls.js not found or error loading, falling back to native');\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 console.log('[Synxed] AudioEngine loaded successfully');\n this.emit('loaded');\n },\n onloaderror: (id, err) => {\n console.error('[Synxed] AudioEngine load error:', err, 'ID:', 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 => console.error('[Synxed] 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';\n\nexport interface PlaylistEvents {\n trackChanged: (track: any) => void;\n queueUpdated: (tracks: any[]) => void;\n}\n\nexport class PlaylistManager extends EventEmitter<PlaylistEvents> {\n private queue: any[] = [];\n private currentIndex: number = -1;\n\n constructor() {\n super();\n }\n\n setQueue(tracks: any[]): void {\n this.queue = tracks;\n this.currentIndex = tracks.length > 0 ? 0 : -1;\n this.emit('queueUpdated', this.queue);\n }\n\n getCurrentTrack(): any | 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(): any | 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(): any | 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): any | 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 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","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 { TransportManager } from '../transport/TransportManager';\nimport { AudioEngine } from '../audio/AudioEngine';\nimport { PlaylistManager } from '../playlist/PlaylistManager';\nimport { EventEmitter } from './EventEmitter';\nimport { ContentKind } from '../proto/sdk-streaming';\nimport { SynxedConfig, PlayerState, PlaySongOptions, PlayPlaylistOptions, SynxedEvents } from '../types';\nimport { SynxedError, SynxedPlaybackError, SynxedConnectionError } from './errors';\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\n constructor(config: SynxedConfig) {\n super();\n this.config = config;\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 private setupListeners(): void {\n // Transport Listeners\n this.transport.on('connected', () => this.emit('connected'));\n this.transport.on('disconnected', (reason) => this.emit('disconnected', reason));\n this.transport.on('error', (error) => this.emit('error', new SynxedConnectionError(error.message)));\n this.transport.on('message', (payload) => this.handleServerMessage(payload));\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) => this.emit('error', new SynxedPlaybackError(error)));\n this.audio.on('timeupdate', (time) => this.emit('timeUpdate', time));\n this.audio.on('ended', () => this.handleTrackEnded());\n }\n\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\n }\n\n async playSong(options: PlaySongOptions): Promise<void> {\n if (!this.transport.isConnected) this.connect();\n await this.transport.waitForConnection();\n \n this.transport.sendInit({\n contentKind: ContentKind.SONG,\n catalogTrackId: options.catalogTrackId,\n internalTrackId: options.internalTrackId,\n listenerId: options.listenerId,\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.transport.sendInit({\n contentKind: ContentKind.PLAYLIST,\n playlistCode: options.playlistCode,\n listenerId: options.listenerId,\n });\n }\n\n pause(): void {\n this.audio.pause();\n this.transport.sendControl({\n action: 2, // PAUSE\n positionMs: Math.floor(this.audio.currentTime * 1000),\n });\n }\n\n resume(): void {\n this.audio.play();\n this.transport.sendControl({\n action: 1, // PLAY\n positionMs: Math.floor(this.audio.currentTime * 1000),\n });\n }\n\n stop(): void {\n this.audio.stop();\n this.transport.sendControl({\n action: 3, // STOP\n positionMs: Math.floor(this.audio.currentTime * 1000),\n });\n }\n\n skip(): void {\n const nextTrack = this.playlist.next();\n if (nextTrack) {\n // In current backend, we need to re-init for each track\n // This logic will be refined once backend handles queues\n this.playSong({ catalogTrackId: nextTrack.id }); \n }\n }\n\n seek(ms: number): void {\n this.audio.seek(ms);\n this.transport.sendControl({\n action: 4, // SEEK\n positionMs: ms,\n });\n }\n\n setVolume(volume: number): void {\n this.audio.setVolume(volume);\n }\n\n private emitAnalytics(eventType: string, positionMs?: number, extra?: any): void {\n this.transport.sendAnalytics({\n eventType,\n positionMs: positionMs ?? Math.floor(this.audio.currentTime * 1000),\n extraJson: extra ? JSON.stringify(extra) : undefined,\n });\n }\n\n private async handleServerMessage(payload: any): Promise<void> {\n console.log('[Synxed] Received server message:', payload);\n if (payload.initAck) {\n const ack = payload.initAck;\n console.log('[Synxed] Loading playback URL:', ack.playbackUrl, 'isHls:', ack.isHls);\n await this.audio.load(ack.playbackUrl, ack.isHls);\n this.audio.play();\n this.emitAnalytics('stream_start');\n \n // Parse contentSummary if it's a playlist\n if (ack.contentSummary) {\n try {\n const summary = JSON.parse(ack.contentSummary);\n if (summary.tracks) {\n this.playlist.setQueue(summary.tracks);\n }\n } catch (e) {\n // Ignore parse errors for now\n }\n }\n } else if (payload.error) {\n this.emit('error', new SynxedError(payload.error.message, payload.error.code));\n }\n }\n\n private handleTrackEnded(): void {\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 currentTime: this.audio.currentTime,\n duration: this.audio.duration,\n volume: 1, // Store volume locally if needed\n });\n }\n\n destroy(): void {\n this.audio.stop();\n this.transport.disconnect();\n this.removeAllListeners();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/proto/sdk-streaming.ts","../src/transport/ProtocolCodec.ts","../src/core/EventEmitter.ts","../src/transport/TransportManager.ts","../src/audio/AudioEngine.ts","../src/playlist/PlaylistManager.ts","../src/core/errors.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","TransportManager","apiKey","serverUrl","normalizedUrl","isLocal","io","reason","error","uint8Array","err","resolve","reject","onConnect","cleanup","onError","params","bytes","AudioEngine","url","isHls","isSafari","Hls","searchParams","xhr","e","Howl","id","ms","volume","update","PlaylistManager","tracks","currentIndex","track","index","SynxedError","code","SynxedConnectionError","SynxedPlaybackError","SynxedProtocolError","SynxedPlayer","config","time","options","nextTrack","prevTrack","override","eventType","positionMs","extra","intervalMs","interval","pos","ack","hb","summary","station","status","fetchRadioNowPlaying","init","res","d","el","tag","props","node","k","v","c","svgIcon","path","size","svg","p","ICON_PLAY","ICON_PAUSE","ICON_SKIP","ICON_SKIP_BACK","ensureGlobalStyles","style","parseDisplayTitle","raw","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","tick","np","line","show","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}\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 SdkServerEnvelope {\n oneof payload {\n SdkServerInitAck initAck = 1;\n SdkServerError error = 2;\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","import { io, Socket } from 'socket.io-client';\nimport { ProtocolCodec } from './ProtocolCodec';\nimport { EventEmitter } from '../core/EventEmitter';\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 class TransportManager extends EventEmitter<TransportEvents> {\n private socket: Socket | null = null;\n private apiKey: string | null = null;\n private serverUrl: string | null = null;\n\n constructor() {\n super();\n }\n\n /**\n * Connects to the Synxed SDK namespace.\n */\n connect(apiKey: string, serverUrl: string): void {\n if (this.socket?.connected) return;\n\n this.apiKey = apiKey;\n this.serverUrl = serverUrl;\n\n const normalizedUrl = serverUrl.endsWith('/') ? serverUrl.slice(0, -1) : serverUrl;\n\n const isLocal = normalizedUrl.includes('localhost') || normalizedUrl.includes('127.0.0.1');\n\n this.socket = io(`${normalizedUrl}/sdk`, {\n auth: { apiKey },\n // Use websocket first for production to bypass CORS pre-flight blocks\n transports: isLocal ? ['polling', 'websocket'] : ['websocket', 'polling'],\n extraHeaders: {\n \"ngrok-skip-browser-warning\": \"true\"\n }\n });\n\n this.socket.on('connect', () => {\n this.emit('connected');\n });\n\n this.socket.on('disconnect', (reason) => {\n this.emit('disconnected', reason);\n });\n\n this.socket.on('connect_error', (error) => {\n this.emit('error', error);\n });\n\n this.socket.on('d', (data: ArrayBuffer | Uint8Array) => {\n try {\n const uint8Array = data instanceof Uint8Array ? data : new Uint8Array(data);\n const payload = ProtocolCodec.decodeServerEnvelope(uint8Array);\n this.emit('message', payload);\n } catch (err) {\n this.emit('error', new Error(`Failed to decode message: ${err}`));\n }\n });\n }\n\n /**\n * Returns a promise that resolves when the socket is connected.\n */\n async waitForConnection(): Promise<void> {\n console.log('[Synxed] Waiting for connection...');\n if (this.socket?.connected) {\n console.log('[Synxed] Already connected');\n return;\n }\n \n return new Promise((resolve, reject) => {\n const onConnect = () => {\n console.log('[Synxed] Socket connected event fired');\n cleanup();\n resolve();\n };\n \n const onError = (err: any) => {\n console.error('[Synxed] Socket connection error:', err);\n cleanup();\n reject(err);\n };\n \n const cleanup = () => {\n this.socket?.off('connect', onConnect);\n this.socket?.off('connect_error', onError);\n };\n\n this.socket?.once('connect', onConnect);\n this.socket?.once('connect_error', onError);\n \n if (!this.socket) {\n console.error('[Synxed] No socket instance found');\n reject(new Error('Socket not initialized. Call connect() first.'));\n }\n });\n }\n\n /**\n * Disconnects from the server.\n */\n disconnect(): void {\n if (this.socket) {\n this.socket.disconnect();\n this.socket = null;\n }\n }\n\n /**\n * Sends an init message to the backend.\n */\n sendInit(params: any): void {\n if (!this.socket?.connected) {\n throw new Error('Socket not connected');\n }\n\n console.log('[Synxed] Sending init packet:', params);\n const payload = { init: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Sends a control message.\n */\n sendControl(params: any): void {\n if (!this.socket?.connected) return;\n const payload = { control: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Sends an analytics message.\n */\n sendAnalytics(params: any): void {\n if (!this.socket?.connected) return;\n const payload = { analytics: params };\n const bytes = ProtocolCodec.encodeClientEnvelope(payload);\n this.socket.emit('d', bytes);\n }\n\n /**\n * Checks if the socket is connected.\n */\n get isConnected(): boolean {\n return this.socket?.connected || false;\n }\n}\n","import { Howl } from 'howler';\nimport { EventEmitter } from '../core/EventEmitter';\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 console.log('[Synxed] AudioEngine loading URL:', url, 'isHls:', 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 console.log('[Synxed] 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 console.error('[Synxed] HLS Audio 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 console.error('[Synxed] Fatal HLS error:', data);\n this.emit('error', data);\n }\n });\n\n return;\n }\n } catch (e) {\n console.warn('[Synxed] hls.js not found or error loading, falling back to native');\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 console.log('[Synxed] AudioEngine loaded successfully');\n this.emit('loaded');\n },\n onloaderror: (id, err) => {\n console.error('[Synxed] AudioEngine load error:', err, 'ID:', 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 => console.error('[Synxed] 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 { 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 { SynxedError, SynxedPlaybackError, SynxedConnectionError } from './errors';\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\n constructor(config: SynxedConfig) {\n super();\n this.config = config;\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) => this.emit('disconnected', reason));\n this.transport.on('error', (error) => this.emit('error', new SynxedConnectionError(error.message)));\n this.transport.on('message', (payload) => this.handleServerMessage(payload));\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) => this.emit('error', new SynxedPlaybackError(error)));\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) => this.emit('trackChange', track));\n this.playlist.on('queueUpdated', (tracks) => this.emit('queueUpdated', tracks));\n }\n\n private connect(): void {\n this.transport.connect(this.config.apiKey, this.config.serverUrl);\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 });\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 });\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 });\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 // 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) 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(0, Math.min(0xffffffff, Math.floor(this.audio.currentTime)));\n }\n\n private emitAnalytics(eventType: string, positionMs?: number, extra?: any): 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 async handleServerMessage(payload: any): Promise<void> {\n console.log('[Synxed] Received server message:', payload);\n if (payload.initAck) {\n const ack = payload.initAck;\n console.log('[Synxed] Loading playback URL:', ack.playbackUrl, 'isHls:', ack.isHls);\n await this.audio.load(ack.playbackUrl, ack.isHls);\n this.audio.play();\n this.emitAnalytics('stream_start', this.activeContentKind === ContentKind.RADIO ? 0 : undefined);\n\n const hb = Number(ack.heartbeatIntervalMs);\n this.startHeartbeat(hb);\n\n // Parse contentSummary to populate playlist queue\n if (ack.contentSummary) {\n try {\n const summary = JSON.parse(ack.contentSummary);\n if (summary.tracks && Array.isArray(summary.tracks)) {\n const currentIndex = typeof summary.currentIndex === 'number' ? summary.currentIndex : 0;\n this.playlist.setQueue(summary.tracks as TrackInfo[], currentIndex);\n } else if (summary.type === 'live_radio') {\n const station = typeof summary.station === 'string' ? summary.station : 'Synxed Radio';\n this.playlist.setQueue([{ id: 'synxed-radio', kind: 'catalog', title: station, artist: '' }], 0);\n }\n } catch (e) {\n // Content summary parse failure is non-fatal\n }\n }\n } else if (payload.error) {\n this.emit('error', new SynxedError(payload.error.message, payload.error.code));\n }\n }\n\n private handleTrackEnded(): void {\n if (this.activeContentKind === ContentKind.RADIO) {\n return;\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\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 if (this.options.avatarUrl) {\n inner.appendChild(\n 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 },\n }),\n );\n } else {\n inner.appendChild(\n el('div', {\n text: 'S',\n style: {\n width: '100%',\n height: '100%',\n display: '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 );\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 controls.appendChild(\n 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 },\n onClick: () => this.engine?.skip(),\n children: [svgIcon(ICON_SKIP, 22)],\n }),\n );\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 transport.appendChild(\n el('button', {\n attrs: { type: 'button', 'aria-label': 'Skip' },\n style: this.roundControlStyle(),\n onClick: () => this.engine?.skip(),\n children: [svgIcon(ICON_SKIP, 22)],\n }),\n );\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\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.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 const station =\n this.isRadio && (this.nowPlaying?.station ?? this.currentTrack?.title ?? 'Synxed Radio');\n this.footerEl.textContent =\n station && this.isRadio\n ? `${station} · ${this.options.attribution}`\n : (this.options.attribution ?? 'Synxed');\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synxed-sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Synxed music SDK — integrate streaming music playback into any web app",
5
5
  "bin": {
6
6
  "synxed": "dist/cli.js"