@gentomiyano/optimized-web-audio-player 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/config/index.d.ts +1 -1
- package/dist/consumer/index.d.ts +1 -1
- package/dist/contracts/index.d.ts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/media-delivery/index.d.ts +1 -1
- package/dist/{media-element-DyMO-PhK.d.ts → media-element-vFtmw4mQ.d.ts} +1 -1
- package/dist/{player-BxNFzRq4.d.ts → player-CE714iU_.d.ts} +2 -1
- package/dist/ports/index.d.ts +2 -2
- package/dist/react/index.d.ts +6 -3
- package/dist/react/index.js +179 -24
- package/dist/react/index.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/ui/index.d.ts +3 -2
- package/dist/ui/index.js +2 -0
- package/dist/ui/index.js.map +1 -1
- package/package.json +1 -1
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/browser/browser-media-element-port.ts","../../src/adapters/browser/audio-playback-mode.ts","../../src/adapters/browser/lazy-web-audio-gain-port.ts","../../src/adapters/browser/media-session-controller.ts","../../src/config/defaults.ts","../../src/config/validation.ts","../../src/config/initial-state.ts","../../src/core/fade.ts","../../src/core/media-events.ts","../../src/core/persistence.ts","../../src/core/queue.ts","../../src/core/player-reducer.ts","../../src/core/shuffle.ts","../../src/core/create-player-store.ts","../../src/react/runtime-commands.ts","../../src/react/player-provider.tsx","../../src/react/mini-player-host.tsx","../../src/react/use-player.ts","../../src/react/use-bound-player.ts","../../src/icons/player-icons.tsx","../../src/ui/player-utils.ts","../../src/ui/player-primitives.tsx","../../src/ui/seek-bar.tsx","../../src/ui/waveform.tsx","../../src/ui/bound-compact-player-view.tsx","../../src/react/bound-compact-player.tsx"],"names":["clampVolume","version","contextValue","useRef","useEffect","jsx","jsxs","useState","useId","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import type {\r\n PlayerError,\r\n PlayerMediaSource,\r\n} from \"../../contracts/player\";\r\nimport type {\r\n MediaElementStateSnapshot,\r\n MediaElementPort,\r\n PlayerMediaEventListener,\r\n PlayerMediaEventType,\r\n} from \"../../ports/media-element\";\r\n\r\nfunction clampVolume(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction classifyMediaError(\r\n mediaError: MediaError | null,\r\n): PlayerError | null {\r\n if (mediaError === null) {\r\n return null;\r\n }\r\n\r\n switch (mediaError.code) {\r\n case MediaError.MEDIA_ERR_NETWORK:\r\n return {\r\n code: \"network\",\r\n recoverable: true,\r\n messageKey: \"player.error.network\",\r\n };\r\n case MediaError.MEDIA_ERR_DECODE:\r\n return {\r\n code: \"decode\",\r\n recoverable: false,\r\n messageKey: \"player.error.decode\",\r\n };\r\n case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\r\n return {\r\n code: \"unsupported\",\r\n recoverable: false,\r\n messageKey: \"player.error.unsupported\",\r\n };\r\n default:\r\n return {\r\n code: \"unknown\",\r\n recoverable: true,\r\n messageKey: \"player.error.unknown\",\r\n };\r\n }\r\n}\r\n\r\nexport class BrowserMediaElementPort implements MediaElementPort {\r\n readonly #element: HTMLAudioElement;\r\n readonly #listeners = new Map<\r\n PlayerMediaEventType,\r\n Map<PlayerMediaEventListener, EventListener>\r\n >();\r\n #assignedSourceUrl: string | null = null;\r\n\r\n constructor(element: HTMLAudioElement) {\r\n this.#element = element;\r\n }\r\n\r\n getCurrentTimeSec(): number {\r\n return Number.isFinite(this.#element.currentTime)\r\n ? Math.max(this.#element.currentTime, 0)\r\n : 0;\r\n }\r\n\r\n getDurationSec(): number | null {\r\n return Number.isFinite(this.#element.duration) && this.#element.duration > 0\r\n ? this.#element.duration\r\n : null;\r\n }\r\n\r\n getVolume(): number {\r\n return clampVolume(this.#element.volume);\r\n }\r\n\r\n isMuted(): boolean {\r\n return this.#element.muted;\r\n }\r\n\r\n isPaused(): boolean {\r\n return this.#element.paused;\r\n }\r\n\r\n getStateSnapshot(): MediaElementStateSnapshot {\r\n const currentSource =\r\n this.#element.currentSrc || this.#element.getAttribute(\"src\") || \"\";\r\n const baseUrl = this.#element.baseURI;\r\n let normalizedCurrentSource = currentSource;\r\n if (currentSource.length > 0) {\r\n try {\r\n normalizedCurrentSource = new URL(\r\n currentSource,\r\n baseUrl,\r\n ).href;\r\n } catch {\r\n // Invalid source remains unequal to the assigned source.\r\n }\r\n }\r\n\r\n return Object.freeze({\r\n currentTimeSec: this.getCurrentTimeSec(),\r\n durationSec: this.getDurationSec(),\r\n volume: this.getVolume(),\r\n muted: this.isMuted(),\r\n paused: this.isPaused(),\r\n ended: this.#element.ended,\r\n hasCurrentSource: currentSource.length > 0,\r\n currentSourceMatchesAssigned:\r\n this.#assignedSourceUrl !== null &&\r\n normalizedCurrentSource === this.#assignedSourceUrl,\r\n });\r\n }\r\n\r\n getError(): PlayerError | null {\r\n return classifyMediaError(this.#element.error);\r\n }\r\n\r\n setSource(source: PlayerMediaSource): void {\r\n this.#element.pause();\r\n this.#element.crossOrigin = source.crossOrigin;\r\n this.#element.src = source.url;\r\n this.#assignedSourceUrl = this.#element.src;\r\n }\r\n\r\n clearSource(): void {\r\n this.#element.pause();\r\n this.#assignedSourceUrl = null;\r\n this.#element.removeAttribute(\"src\");\r\n this.#element.load();\r\n }\r\n\r\n load(): void {\r\n this.#element.load();\r\n }\r\n\r\n async play(): Promise<void> {\r\n await this.#element.play();\r\n }\r\n\r\n pause(): void {\r\n this.#element.pause();\r\n }\r\n\r\n seekTo(seconds: number): void {\r\n if (!Number.isFinite(seconds)) {\r\n return;\r\n }\r\n this.#element.currentTime = Math.max(seconds, 0);\r\n }\r\n\r\n setVolume(volume: number): void {\r\n this.#element.volume = clampVolume(volume);\r\n }\r\n\r\n setMuted(muted: boolean): void {\r\n this.#element.muted = muted;\r\n }\r\n\r\n addEventListener(\r\n type: PlayerMediaEventType,\r\n listener: PlayerMediaEventListener,\r\n ): void {\r\n const typeListeners =\r\n this.#listeners.get(type) ??\r\n new Map<PlayerMediaEventListener, EventListener>();\r\n if (typeListeners.has(listener)) {\r\n return;\r\n }\r\n\r\n const nativeListener: EventListener = () => {\r\n listener({ type });\r\n };\r\n typeListeners.set(listener, nativeListener);\r\n this.#listeners.set(type, typeListeners);\r\n this.#element.addEventListener(type, nativeListener);\r\n }\r\n\r\n removeEventListener(\r\n type: PlayerMediaEventType,\r\n listener: PlayerMediaEventListener,\r\n ): void {\r\n const typeListeners = this.#listeners.get(type);\r\n const nativeListener = typeListeners?.get(listener);\r\n if (nativeListener === undefined) {\r\n return;\r\n }\r\n\r\n this.#element.removeEventListener(type, nativeListener);\r\n typeListeners?.delete(listener);\r\n if (typeListeners?.size === 0) {\r\n this.#listeners.delete(type);\r\n }\r\n }\r\n}\r\n","import type { GainPort } from \"../../ports/gain\";\r\n\r\nexport type PlayerAudioMode = \"auto\" | \"web-audio\" | \"html-media\";\r\nexport type ResolvedPlayerAudioMode = \"web-audio\" | \"html-media\";\r\n\r\nexport interface BrowserAudioPlatform {\r\n readonly userAgent: string;\r\n readonly platform?: string;\r\n readonly maxTouchPoints?: number;\r\n}\r\n\r\nexport function isIOSWebPlatform(\r\n platform: BrowserAudioPlatform,\r\n): boolean {\r\n if (/\\b(iPhone|iPad|iPod)\\b/i.test(platform.userAgent)) {\r\n return true;\r\n }\r\n\r\n return (\r\n platform.platform === \"MacIntel\" &&\r\n (platform.maxTouchPoints ?? 0) > 1\r\n );\r\n}\r\n\r\nexport function resolvePlayerAudioMode(\r\n requested: PlayerAudioMode,\r\n platform: BrowserAudioPlatform,\r\n): ResolvedPlayerAudioMode {\r\n if (requested !== \"auto\") {\r\n return requested;\r\n }\r\n\r\n // iOS/iPadOS background continuity takes priority over fades. Creating a\r\n // MediaElementAudioSourceNode can make output depend on a suspended\r\n // AudioContext, so auto mode keeps native HTML audio on these platforms.\r\n return isIOSWebPlatform(platform) ? \"html-media\" : \"web-audio\";\r\n}\r\n\r\n/**\r\n * Native HTMLAudioElement fallback. Core volume remains on the media element;\r\n * gain transitions resolve immediately, intentionally disabling fades.\r\n */\r\nexport class HtmlMediaElementGainPort implements GainPort {\r\n activateFromUserGesture(): Promise<void> {\r\n // The media element itself is activated by PlayerCommands.play().\r\n return Promise.resolve();\r\n }\r\n\r\n resumeIfSuspended(): Promise<boolean> {\r\n return Promise.resolve(false);\r\n }\r\n\r\n getValue(): number {\r\n return 1;\r\n }\r\n\r\n setValue(): void {\r\n // No separate gain stage in fallback mode.\r\n }\r\n\r\n cancelTransition(): void {\r\n // No scheduled gain work in fallback mode.\r\n }\r\n\r\n transitionTo(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n destroy(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n}\r\n","import type { FadeCurve } from \"../../contracts/player\";\r\nimport type {\r\n GainPort,\r\n GainTransition,\r\n} from \"../../ports/gain\";\r\n\r\nexport interface LazyWebAudioGainPortOptions {\r\n readonly createAudioContext?: () => AudioContext;\r\n readonly onContextStateChange?: (state: AudioContextState | \"uninitialized\") => void;\r\n}\r\n\r\ninterface PendingTransition {\r\n readonly timerId: ReturnType<typeof setTimeout>;\r\n readonly resolve: () => void;\r\n}\r\n\r\nconst MIN_TRANSITION_SETTLE_MS = 32;\r\n\r\nfunction clampGain(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction easingProgress(\r\n curve: FadeCurve,\r\n progress: number,\r\n isFadeIn: boolean,\r\n): number {\r\n switch (curve) {\r\n case \"ease-in\":\r\n return progress * progress;\r\n case \"ease-out\":\r\n return 1 - (1 - progress) ** 2;\r\n case \"equal-power\":\r\n return isFadeIn\r\n ? Math.sin((progress * Math.PI) / 2)\r\n : 1 - Math.cos((progress * Math.PI) / 2);\r\n case \"linear\":\r\n return progress;\r\n }\r\n}\r\n\r\nfunction createCurve(\r\n start: number,\r\n target: number,\r\n curve: FadeCurve,\r\n): Float32Array<ArrayBuffer> {\r\n const values = new Float32Array(64);\r\n const isFadeIn = target >= start;\r\n for (let index = 0; index < values.length; index += 1) {\r\n const progress = index / (values.length - 1);\r\n const eased = easingProgress(curve, progress, isFadeIn);\r\n values[index] = start + (target - start) * eased;\r\n }\r\n return values;\r\n}\r\n\r\nfunction transitionSettleMs(context: AudioContext): number {\r\n const contextWithLatency = context as AudioContext & {\r\n readonly baseLatency?: number;\r\n readonly outputLatency?: number;\r\n };\r\n const baseLatency = Number.isFinite(contextWithLatency.baseLatency)\r\n ? Math.max(0, contextWithLatency.baseLatency)\r\n : 0;\r\n const outputLatency = Number.isFinite(contextWithLatency.outputLatency)\r\n ? Math.max(0, contextWithLatency.outputLatency)\r\n : 0;\r\n\r\n return Math.max(\r\n MIN_TRANSITION_SETTLE_MS,\r\n Math.ceil((baseLatency + outputLatency) * 1_000) + 8,\r\n );\r\n}\r\n\r\nexport class LazyWebAudioGainPort implements GainPort {\r\n readonly #element: HTMLAudioElement;\r\n readonly #createAudioContext: () => AudioContext;\r\n readonly #onContextStateChange:\r\n | ((state: AudioContextState | \"uninitialized\") => void)\r\n | undefined;\r\n readonly #pendingTransitions = new Set<PendingTransition>();\r\n\r\n #context: AudioContext | null = null;\r\n #source: MediaElementAudioSourceNode | null = null;\r\n #gain: GainNode | null = null;\r\n #value = 1;\r\n\r\n constructor(\r\n element: HTMLAudioElement,\r\n options: LazyWebAudioGainPortOptions = {},\r\n ) {\r\n this.#element = element;\r\n this.#createAudioContext =\r\n options.createAudioContext ??\r\n (() => {\r\n const audioWindow = window as unknown as {\r\n readonly AudioContext?: typeof AudioContext;\r\n readonly webkitAudioContext?: typeof AudioContext;\r\n };\r\n const AudioContextConstructor =\r\n audioWindow.AudioContext ?? audioWindow.webkitAudioContext;\r\n if (AudioContextConstructor === undefined) {\r\n throw new Error(\"Web Audio is not supported.\");\r\n }\r\n return new AudioContextConstructor();\r\n });\r\n this.#onContextStateChange = options.onContextStateChange;\r\n this.#notifyState();\r\n }\r\n\r\n activateFromUserGesture(): Promise<void> {\r\n if (this.#context === null) {\r\n const context = this.#createAudioContext();\r\n const gain = context.createGain();\r\n const source = context.createMediaElementSource(this.#element);\r\n gain.gain.value = this.#value;\r\n source.connect(gain);\r\n gain.connect(context.destination);\r\n this.#context = context;\r\n this.#source = source;\r\n this.#gain = gain;\r\n context.addEventListener(\"statechange\", this.#notifyState);\r\n this.#notifyState();\r\n }\r\n\r\n if (this.#context.state === \"suspended\") {\r\n return this.#context.resume().then(() => {\r\n this.#notifyState();\r\n });\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n async resumeIfSuspended(): Promise<boolean> {\r\n if (this.#context === null || this.#context.state !== \"suspended\") {\r\n return false;\r\n }\r\n await this.#context.resume();\r\n this.#notifyState();\r\n return true;\r\n }\r\n\r\n getValue(): number {\r\n return this.#gain?.gain.value ?? this.#value;\r\n }\r\n\r\n getContextState(): AudioContextState | \"uninitialized\" {\r\n return this.#context?.state ?? \"uninitialized\";\r\n }\r\n\r\n setValue(value: number): void {\r\n this.cancelTransition();\r\n this.#value = clampGain(value);\r\n if (this.#context !== null && this.#gain !== null) {\r\n const now = this.#context.currentTime;\r\n this.#gain.gain.setValueAtTime(this.#value, now);\r\n }\r\n }\r\n\r\n cancelTransition(): void {\r\n if (this.#context !== null && this.#gain !== null) {\r\n const now = this.#context.currentTime;\r\n const heldValue = this.#gain.gain.value;\r\n this.#gain.gain.cancelScheduledValues(0);\r\n this.#gain.gain.setValueAtTime(heldValue, now);\r\n }\r\n\r\n for (const pending of this.#pendingTransitions) {\r\n clearTimeout(pending.timerId);\r\n pending.resolve();\r\n }\r\n this.#pendingTransitions.clear();\r\n }\r\n\r\n transitionTo(\r\n value: number,\r\n transition: GainTransition,\r\n ): Promise<void> {\r\n const target = clampGain(value);\r\n const durationMs = Math.max(0, transition.durationMs);\r\n\r\n if (this.#context === null || this.#gain === null || durationMs === 0) {\r\n this.setValue(target);\r\n return Promise.resolve();\r\n }\r\n\r\n this.cancelTransition();\r\n const start = this.#gain.gain.value;\r\n const durationSec = durationMs / 1_000;\r\n this.#gain.gain.setValueCurveAtTime(\r\n createCurve(start, target, transition.curve),\r\n this.#context.currentTime,\r\n durationSec,\r\n );\r\n this.#value = target;\r\n\r\n return new Promise((resolve) => {\r\n const pending: PendingTransition = {\r\n timerId: setTimeout(() => {\r\n this.#pendingTransitions.delete(pending);\r\n resolve();\r\n }, durationMs + transitionSettleMs(this.#context as AudioContext)),\r\n resolve,\r\n };\r\n this.#pendingTransitions.add(pending);\r\n });\r\n }\r\n\r\n async destroy(): Promise<void> {\r\n this.cancelTransition();\r\n const context = this.#context;\r\n if (context === null) {\r\n return;\r\n }\r\n\r\n context.removeEventListener(\"statechange\", this.#notifyState);\r\n this.#source?.disconnect();\r\n this.#gain?.disconnect();\r\n this.#source = null;\r\n this.#gain = null;\r\n this.#context = null;\r\n await context.close();\r\n this.#notifyState();\r\n }\r\n\r\n readonly #notifyState = (): void => {\r\n this.#onContextStateChange?.(\r\n this.#context?.state ?? \"uninitialized\",\r\n );\r\n };\r\n}\r\n","import type {\r\n PlayerCommands,\r\n PlayerState,\r\n} from \"../../contracts/player\";\r\n\r\nexport const PLAYER_MEDIA_SESSION_ACTIONS = [\r\n \"play\",\r\n \"pause\",\r\n \"stop\",\r\n \"previoustrack\",\r\n \"nexttrack\",\r\n \"seekto\",\r\n \"seekbackward\",\r\n \"seekforward\",\r\n] as const satisfies readonly MediaSessionAction[];\r\n\r\nconst MUSIC_MEDIA_SESSION_ACTIONS = [\r\n \"play\",\r\n \"pause\",\r\n \"stop\",\r\n \"previoustrack\",\r\n \"nexttrack\",\r\n \"seekto\",\r\n] as const satisfies readonly MediaSessionAction[];\r\n\r\ntype SupportedMediaSessionAction =\r\n (typeof PLAYER_MEDIA_SESSION_ACTIONS)[number];\r\n\r\nexport interface MediaSessionPort {\r\n metadata: MediaMetadata | null;\r\n playbackState: MediaSessionPlaybackState;\r\n setActionHandler(\r\n action: MediaSessionAction,\r\n handler: MediaSessionActionHandler | null,\r\n ): void;\r\n setPositionState(state?: MediaPositionState): void;\r\n}\r\n\r\nexport interface BrowserMediaSessionControllerOptions {\r\n readonly commands: PlayerCommands;\r\n readonly getState: () => Readonly<PlayerState>;\r\n readonly mediaSession?: MediaSessionPort;\r\n readonly createMetadata?: (init: MediaMetadataInit) => MediaMetadata;\r\n readonly onAction?: (action: SupportedMediaSessionAction) => void;\r\n readonly onActionError?: (action: SupportedMediaSessionAction) => void;\r\n}\r\n\r\nfunction observeCommand(\r\n command: Promise<unknown>,\r\n action: SupportedMediaSessionAction,\r\n onError: ((action: SupportedMediaSessionAction) => void) | undefined,\r\n): void {\r\n void command.catch(() => {\r\n onError?.(action);\r\n });\r\n}\r\n\r\nfunction defaultSeekOffset(\r\n state: Readonly<PlayerState>,\r\n direction: \"backward\" | \"forward\",\r\n): number {\r\n if (state.mediaKind !== \"podcastEpisode\") {\r\n return 10;\r\n }\r\n return direction === \"backward\"\r\n ? state.experienceConfig.podcastBackSec\r\n : state.experienceConfig.podcastForwardSec;\r\n}\r\n\r\nfunction playbackStateFor(\r\n state: Readonly<PlayerState>,\r\n): MediaSessionPlaybackState {\r\n if (state.currentItem === null) {\r\n return \"none\";\r\n }\r\n return state.status === \"playing\" ? \"playing\" : \"paused\";\r\n}\r\n\r\nexport class BrowserMediaSessionController {\r\n readonly #commands: PlayerCommands;\r\n readonly #getState: () => Readonly<PlayerState>;\r\n readonly #session: MediaSessionPort | undefined;\r\n readonly #createMetadata:\r\n | ((init: MediaMetadataInit) => MediaMetadata)\r\n | undefined;\r\n readonly #registeredActions = new Set<SupportedMediaSessionAction>();\r\n readonly #onAction:\r\n | ((action: SupportedMediaSessionAction) => void)\r\n | undefined;\r\n readonly #onActionError:\r\n | ((action: SupportedMediaSessionAction) => void)\r\n | undefined;\r\n\r\n #metadataIdentity: string | null = null;\r\n #actionsEnabled = false;\r\n\r\n constructor(options: BrowserMediaSessionControllerOptions) {\r\n this.#commands = options.commands;\r\n this.#getState = options.getState;\r\n this.#session = options.mediaSession;\r\n this.#createMetadata = options.createMetadata;\r\n this.#onAction = options.onAction;\r\n this.#onActionError = options.onActionError;\r\n }\r\n\r\n get supported(): boolean {\r\n return this.#session !== undefined;\r\n }\r\n\r\n get actionsEnabled(): boolean {\r\n return this.#actionsEnabled;\r\n }\r\n\r\n enableActionHandlers(): void {\r\n if (this.#actionsEnabled || this.#session === undefined) {\r\n return;\r\n }\r\n\r\n this.#actionsEnabled = true;\r\n this.#synchronizeActionHandlers(this.#getState());\r\n }\r\n\r\n update(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n try {\r\n session.playbackState = playbackStateFor(state);\r\n } catch {\r\n // Media Session is progressive enhancement.\r\n }\r\n\r\n this.#updateMetadata(state);\r\n this.#updatePosition(state);\r\n if (this.#actionsEnabled) {\r\n this.#synchronizeActionHandlers(state);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n for (const action of this.#registeredActions) {\r\n try {\r\n session.setActionHandler(action, null);\r\n } catch {\r\n // Cleanup continues across partially supported implementations.\r\n }\r\n }\r\n this.#registeredActions.clear();\r\n this.#actionsEnabled = false;\r\n\r\n try {\r\n session.metadata = null;\r\n session.playbackState = \"none\";\r\n session.setPositionState();\r\n } catch {\r\n // Document teardown must not fail on Media Session cleanup.\r\n }\r\n }\r\n\r\n #createHandler(\r\n action: SupportedMediaSessionAction,\r\n ): MediaSessionActionHandler {\r\n const reportAction = (): void => {\r\n this.#onAction?.(action);\r\n };\r\n switch (action) {\r\n case \"play\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.play(), action, this.#onActionError);\r\n };\r\n case \"pause\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.pause(), action, this.#onActionError);\r\n };\r\n case \"stop\":\r\n return () => {\r\n reportAction();\r\n observeCommand(\r\n this.#commands.stop({ resetPosition: true }),\r\n action,\r\n this.#onActionError,\r\n );\r\n };\r\n case \"previoustrack\":\r\n return () => {\r\n reportAction();\r\n observeCommand(\r\n this.#commands.previous(),\r\n action,\r\n this.#onActionError,\r\n );\r\n };\r\n case \"nexttrack\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.next(), action, this.#onActionError);\r\n };\r\n case \"seekto\":\r\n return (details) => {\r\n reportAction();\r\n if (\r\n details.seekTime !== undefined &&\r\n Number.isFinite(details.seekTime)\r\n ) {\r\n this.#commands.seekTo(details.seekTime);\r\n }\r\n };\r\n case \"seekbackward\":\r\n return (details) => {\r\n reportAction();\r\n const fallback = defaultSeekOffset(\r\n this.#getState(),\r\n \"backward\",\r\n );\r\n const offset =\r\n details.seekOffset !== undefined &&\r\n Number.isFinite(details.seekOffset)\r\n ? Math.max(details.seekOffset, 0)\r\n : fallback;\r\n this.#commands.seekBy(-offset);\r\n };\r\n case \"seekforward\":\r\n return (details) => {\r\n reportAction();\r\n const fallback = defaultSeekOffset(\r\n this.#getState(),\r\n \"forward\",\r\n );\r\n const offset =\r\n details.seekOffset !== undefined &&\r\n Number.isFinite(details.seekOffset)\r\n ? Math.max(details.seekOffset, 0)\r\n : fallback;\r\n this.#commands.seekBy(offset);\r\n };\r\n }\r\n }\r\n\r\n #synchronizeActionHandlers(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n const desiredActions = new Set<SupportedMediaSessionAction>(\r\n state.mediaKind === \"podcastEpisode\"\r\n ? PLAYER_MEDIA_SESSION_ACTIONS\r\n : MUSIC_MEDIA_SESSION_ACTIONS,\r\n );\r\n\r\n for (const action of PLAYER_MEDIA_SESSION_ACTIONS) {\r\n const shouldRegister = desiredActions.has(action);\r\n const isRegistered = this.#registeredActions.has(action);\r\n if (shouldRegister === isRegistered) {\r\n continue;\r\n }\r\n try {\r\n session.setActionHandler(\r\n action,\r\n shouldRegister ? this.#createHandler(action) : null,\r\n );\r\n if (shouldRegister) {\r\n this.#registeredActions.add(action);\r\n } else {\r\n this.#registeredActions.delete(action);\r\n }\r\n } catch {\r\n // Unsupported action handlers must not affect ordinary playback.\r\n }\r\n }\r\n }\r\n\r\n #updateMetadata(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n const item = state.currentItem;\r\n if (session === undefined) {\r\n return;\r\n }\r\n if (item === null) {\r\n if (this.#metadataIdentity !== null) {\r\n try {\r\n session.metadata = null;\r\n } catch {\r\n // Progressive enhancement only.\r\n }\r\n this.#metadataIdentity = null;\r\n }\r\n return;\r\n }\r\n\r\n const identity = [\r\n item.id,\r\n item.title,\r\n item.creatorName ?? \"\",\r\n item.collectionTitle ?? \"\",\r\n item.artwork?.url ?? \"\",\r\n ].join(\"\\u0000\");\r\n if (\r\n identity === this.#metadataIdentity ||\r\n this.#createMetadata === undefined\r\n ) {\r\n return;\r\n }\r\n\r\n try {\r\n session.metadata = this.#createMetadata({\r\n title: item.title,\r\n artist: item.creatorName ?? \"\",\r\n album: item.collectionTitle ?? \"\",\r\n artwork:\r\n item.artwork === undefined\r\n ? []\r\n : [{ src: item.artwork.url }],\r\n });\r\n this.#metadataIdentity = identity;\r\n } catch {\r\n // Metadata failure must not stop audio or action handlers.\r\n }\r\n }\r\n\r\n #updatePosition(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n const duration = state.durationSec;\r\n if (\r\n duration === null ||\r\n !Number.isFinite(duration) ||\r\n duration <= 0\r\n ) {\r\n try {\r\n session.setPositionState();\r\n } catch {\r\n // Progressive enhancement only.\r\n }\r\n return;\r\n }\r\n\r\n const position = Math.min(\r\n Math.max(\r\n Number.isFinite(state.currentTimeSec)\r\n ? state.currentTimeSec\r\n : 0,\r\n 0,\r\n ),\r\n duration,\r\n );\r\n\r\n try {\r\n session.setPositionState({\r\n duration,\r\n playbackRate: 1,\r\n position,\r\n });\r\n } catch {\r\n // Invalid or unsupported position state must not affect playback.\r\n }\r\n }\r\n}\r\n\r\nexport function createBrowserMediaSessionController(\r\n options: Omit<\r\n BrowserMediaSessionControllerOptions,\r\n \"mediaSession\" | \"createMetadata\"\r\n >,\r\n): BrowserMediaSessionController {\r\n const mediaSession =\r\n typeof navigator !== \"undefined\" && \"mediaSession\" in navigator\r\n ? navigator.mediaSession\r\n : undefined;\r\n const createMetadata =\r\n typeof MediaMetadata === \"function\"\r\n ? (init: MediaMetadataInit) => new MediaMetadata(init)\r\n : undefined;\r\n\r\n return new BrowserMediaSessionController({\r\n ...options,\r\n ...(mediaSession === undefined ? {} : { mediaSession }),\r\n ...(createMetadata === undefined ? {} : { createMetadata }),\r\n });\r\n}\r\n","import type { PlayerExperienceConfig } from \"../contracts/player\";\r\n\r\nexport const PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION = 2 as const;\r\n\r\nexport const PLAYER_EXPERIENCE_CONFIG_LIMITS = Object.freeze({\r\n fadeMs: Object.freeze({ min: 0, max: 10_000 }),\r\n previousRestartThresholdSec: Object.freeze({ min: 0, max: 60 }),\r\n waveformOpacity: Object.freeze({ min: 0, max: 1 }),\r\n initialVolume: Object.freeze({ min: 0, max: 1 }),\r\n podcastSkipSec: Object.freeze({ minExclusive: 0, max: 3_600 }),\r\n});\r\n\r\nexport const PREVIEW_PLAYER_EXPERIENCE_CONFIG: Readonly<PlayerExperienceConfig> =\r\n Object.freeze({\r\n playFadeInMs: 300,\r\n pauseFadeOutMs: 600,\r\n trackChangeFadeOutMs: 300,\r\n trackChangeFadeInMs: 300,\r\n seekFadeMs: 120,\r\n fadeCurve: \"ease-out\",\r\n previousRestartThresholdSec: 3,\r\n seekCommitMode: \"on-release\",\r\n waveformPlayedStateEnabled: true,\r\n waveformOpacity: 0.72,\r\n initialShuffleEnabled: false,\r\n initialRepeatMode: \"off\",\r\n initialVolume: 0.8,\r\n persistMode: \"none\",\r\n podcastBackSec: 15,\r\n podcastForwardSec: 30,\r\n podcastPreviousMode: \"previous-episode\",\r\n });\r\n","import type {\r\n FadeCurve,\r\n PersistMode,\r\n PlayerExperienceConfig,\r\n PodcastPreviousMode,\r\n RepeatMode,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport type { PlayerExperienceConfigValidationResult } from \"../contracts/config\";\r\nimport {\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS,\r\n PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n} from \"./defaults\";\r\n\r\nconst CONFIG_KEYS = [\r\n \"playFadeInMs\",\r\n \"pauseFadeOutMs\",\r\n \"trackChangeFadeOutMs\",\r\n \"trackChangeFadeInMs\",\r\n \"seekFadeMs\",\r\n \"fadeCurve\",\r\n \"previousRestartThresholdSec\",\r\n \"seekCommitMode\",\r\n \"waveformPlayedStateEnabled\",\r\n \"waveformOpacity\",\r\n \"initialShuffleEnabled\",\r\n \"initialRepeatMode\",\r\n \"initialVolume\",\r\n \"persistMode\",\r\n \"podcastBackSec\",\r\n \"podcastForwardSec\",\r\n \"podcastPreviousMode\",\r\n] as const satisfies readonly (keyof PlayerExperienceConfig)[];\r\n\r\nconst FADE_CURVES = new Set<FadeCurve>([\r\n \"linear\",\r\n \"ease-in\",\r\n \"ease-out\",\r\n \"equal-power\",\r\n]);\r\nconst SEEK_COMMIT_MODES = new Set<SeekCommitMode>([\"live\", \"on-release\"]);\r\nconst REPEAT_MODES = new Set<RepeatMode>([\"off\", \"all\", \"one\"]);\r\nconst PERSIST_MODES = new Set<PersistMode>([\"none\", \"session\", \"local\"]);\r\nconst PODCAST_PREVIOUS_MODES = new Set<PodcastPreviousMode>([\r\n \"previous-episode\",\r\n \"restart-episode\",\r\n]);\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction validateFiniteRange(\r\n value: unknown,\r\n path: string,\r\n min: number,\r\n max: number,\r\n errors: string[],\r\n): value is number {\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < min ||\r\n value > max\r\n ) {\r\n errors.push(\r\n `${path} must be a finite number between ${String(min)} and ${String(max)}.`,\r\n );\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateBoolean(\r\n value: unknown,\r\n path: string,\r\n errors: string[],\r\n): value is boolean {\r\n if (typeof value !== \"boolean\") {\r\n errors.push(`${path} must be a boolean.`);\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateConfigRecord(\r\n value: unknown,\r\n options: { readonly partial: boolean },\r\n): PlayerExperienceConfigValidationResult {\r\n if (!isRecord(value)) {\r\n return { ok: false, errors: [\"config must be an object.\"] };\r\n }\r\n\r\n const errors: string[] = [];\r\n const allowedKeys = new Set<string>(CONFIG_KEYS);\r\n\r\n for (const key of Object.keys(value)) {\r\n if (!allowedKeys.has(key)) {\r\n errors.push(`config.${key} is not supported.`);\r\n }\r\n }\r\n\r\n if (!options.partial) {\r\n for (const key of CONFIG_KEYS) {\r\n if (!Object.hasOwn(value, key)) {\r\n errors.push(`config.${key} is required.`);\r\n }\r\n }\r\n }\r\n\r\n const has = (key: keyof PlayerExperienceConfig): boolean =>\r\n Object.hasOwn(value, key);\r\n const fadeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.fadeMs;\r\n\r\n for (const key of [\r\n \"playFadeInMs\",\r\n \"pauseFadeOutMs\",\r\n \"trackChangeFadeOutMs\",\r\n \"trackChangeFadeInMs\",\r\n \"seekFadeMs\",\r\n ] as const) {\r\n if (has(key)) {\r\n validateFiniteRange(value[key], `config.${key}`, fadeLimits.min, fadeLimits.max, errors);\r\n }\r\n }\r\n\r\n const thresholdLimits =\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS.previousRestartThresholdSec;\r\n if (has(\"previousRestartThresholdSec\")) {\r\n validateFiniteRange(\r\n value.previousRestartThresholdSec,\r\n \"config.previousRestartThresholdSec\",\r\n thresholdLimits.min,\r\n thresholdLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n const volumeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.initialVolume;\r\n if (has(\"initialVolume\")) {\r\n validateFiniteRange(\r\n value.initialVolume,\r\n \"config.initialVolume\",\r\n volumeLimits.min,\r\n volumeLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n const waveformOpacityLimits =\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS.waveformOpacity;\r\n if (has(\"waveformOpacity\")) {\r\n validateFiniteRange(\r\n value.waveformOpacity,\r\n \"config.waveformOpacity\",\r\n waveformOpacityLimits.min,\r\n waveformOpacityLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n for (const key of [\r\n \"waveformPlayedStateEnabled\",\r\n \"initialShuffleEnabled\",\r\n ] as const) {\r\n if (has(key)) {\r\n validateBoolean(value[key], `config.${key}`, errors);\r\n }\r\n }\r\n\r\n const skipLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.podcastSkipSec;\r\n for (const key of [\"podcastBackSec\", \"podcastForwardSec\"] as const) {\r\n if (has(key)) {\r\n const candidate = value[key];\r\n const valid = validateFiniteRange(\r\n candidate,\r\n `config.${key}`,\r\n skipLimits.minExclusive,\r\n skipLimits.max,\r\n errors,\r\n );\r\n if (valid && candidate <= skipLimits.minExclusive) {\r\n errors.push(`config.${key} must be greater than 0.`);\r\n }\r\n }\r\n }\r\n\r\n if (has(\"fadeCurve\") && !FADE_CURVES.has(value.fadeCurve as FadeCurve)) {\r\n errors.push(\"config.fadeCurve is not supported.\");\r\n }\r\n if (\r\n has(\"seekCommitMode\") &&\r\n !SEEK_COMMIT_MODES.has(value.seekCommitMode as SeekCommitMode)\r\n ) {\r\n errors.push(\"config.seekCommitMode is not supported.\");\r\n }\r\n if (\r\n has(\"initialRepeatMode\") &&\r\n !REPEAT_MODES.has(value.initialRepeatMode as RepeatMode)\r\n ) {\r\n errors.push(\"config.initialRepeatMode is not supported.\");\r\n }\r\n if (has(\"persistMode\") && !PERSIST_MODES.has(value.persistMode as PersistMode)) {\r\n errors.push(\"config.persistMode is not supported.\");\r\n }\r\n if (\r\n has(\"podcastPreviousMode\") &&\r\n !PODCAST_PREVIOUS_MODES.has(\r\n value.podcastPreviousMode as PodcastPreviousMode,\r\n )\r\n ) {\r\n errors.push(\"config.podcastPreviousMode is not supported.\");\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, errors: Object.freeze(errors) };\r\n }\r\n\r\n const merged = options.partial\r\n ? { ...PREVIEW_PLAYER_EXPERIENCE_CONFIG, ...value }\r\n : value;\r\n\r\n return {\r\n ok: true,\r\n errors: [],\r\n value: Object.freeze({ ...merged }) as Readonly<PlayerExperienceConfig>,\r\n };\r\n}\r\n\r\nexport function validatePlayerExperienceConfig(\r\n value: unknown,\r\n): PlayerExperienceConfigValidationResult {\r\n return validateConfigRecord(value, { partial: false });\r\n}\r\n\r\nexport function validatePlayerExperienceConfigOverride(\r\n value: unknown,\r\n): PlayerExperienceConfigValidationResult {\r\n return validateConfigRecord(value, { partial: true });\r\n}\r\n\r\nexport function resolvePlayerExperienceConfig(\r\n override?: Partial<PlayerExperienceConfig>,\r\n): PlayerExperienceConfigValidationResult {\r\n return validatePlayerExperienceConfigOverride(override ?? {});\r\n}\r\n\r\nexport function parsePlayerExperienceConfigJson(\r\n json: string,\r\n): PlayerExperienceConfigValidationResult {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(json) as unknown;\r\n } catch {\r\n return { ok: false, errors: [\"Config JSON is not valid JSON.\"] };\r\n }\r\n\r\n if (!isRecord(parsed)) {\r\n return { ok: false, errors: [\"Config JSON envelope must be an object.\"] };\r\n }\r\n\r\n const envelopeKeys = Object.keys(parsed);\r\n const errors: string[] = [];\r\n\r\n for (const key of envelopeKeys) {\r\n if (key !== \"schemaVersion\" && key !== \"config\") {\r\n errors.push(`envelope.${key} is not supported.`);\r\n }\r\n }\r\n if (!Object.hasOwn(parsed, \"schemaVersion\")) {\r\n errors.push(\"envelope.schemaVersion is required.\");\r\n } else if (\r\n parsed.schemaVersion !== PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION\r\n ) {\r\n errors.push(\"envelope.schemaVersion is not supported.\");\r\n }\r\n if (!Object.hasOwn(parsed, \"config\")) {\r\n errors.push(\"envelope.config is required.\");\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, errors: Object.freeze(errors) };\r\n }\r\n\r\n return validatePlayerExperienceConfig(parsed.config);\r\n}\r\n\r\nexport function serializePlayerExperienceConfig(\r\n config: PlayerExperienceConfig,\r\n): string {\r\n const result = validatePlayerExperienceConfig(config);\r\n\r\n if (!result.ok) {\r\n throw new TypeError(result.errors.join(\" \"));\r\n }\r\n\r\n return JSON.stringify(\r\n {\r\n schemaVersion: PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\r\n config: result.value,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import type {\r\n PlayerExperienceConfig,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport { resolvePlayerExperienceConfig } from \"./validation\";\r\n\r\nexport function createInitialPlayerState(\r\n experienceConfig?: Partial<PlayerExperienceConfig>,\r\n): Readonly<PlayerState> {\r\n const resolved = resolvePlayerExperienceConfig(experienceConfig);\r\n\r\n if (!resolved.ok) {\r\n throw new TypeError(resolved.errors.join(\" \"));\r\n }\r\n\r\n return Object.freeze({\r\n currentItem: null,\r\n currentItemId: null,\r\n currentQueueItemId: null,\r\n mediaKind: null,\r\n status: \"idle\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n volume: resolved.value.initialVolume,\r\n muted: false,\r\n shuffleEnabled: resolved.value.initialShuffleEnabled,\r\n repeatMode: resolved.value.initialRepeatMode,\r\n queue: Object.freeze([]),\r\n activeContext: null,\r\n currentQueueIndex: null,\r\n canSeek: false,\r\n canGoPrevious: false,\r\n canGoNext: false,\r\n needsUserGesture: false,\r\n lastTransitionCause: null,\r\n error: null,\r\n experienceConfig: resolved.value,\r\n });\r\n}\r\n","import type { FadeCurve, PlayerError } from \"../contracts/player\";\r\nimport type { GainPort } from \"../ports/gain\";\r\n\r\nexport interface FadeRequest {\r\n readonly target: number;\r\n readonly durationMs: number;\r\n readonly curve: FadeCurve;\r\n}\r\n\r\nexport interface FadeResult {\r\n readonly completed: boolean;\r\n readonly error: PlayerError | null;\r\n}\r\n\r\nconst AUDIO_CONTEXT_ERROR: PlayerError = Object.freeze({\r\n code: \"audio-context\",\r\n recoverable: true,\r\n messageKey: \"player.error.audio-context\",\r\n});\r\n\r\nexport async function runFade(\r\n gain: GainPort | undefined,\r\n request: FadeRequest,\r\n): Promise<FadeResult> {\r\n if (gain === undefined) {\r\n return { completed: true, error: null };\r\n }\r\n\r\n try {\r\n if (request.durationMs <= 0) {\r\n gain.setValue(request.target);\r\n } else {\r\n await gain.transitionTo(request.target, {\r\n durationMs: request.durationMs,\r\n curve: request.curve,\r\n });\r\n }\r\n\r\n return { completed: true, error: null };\r\n } catch {\r\n return { completed: false, error: AUDIO_CONTEXT_ERROR };\r\n }\r\n}\r\n","import type {\r\n PlayerError,\r\n PlayerErrorCode,\r\n} from \"../contracts/player\";\r\nimport type {\r\n MediaElementPort,\r\n PlayerMediaEventType,\r\n} from \"../ports/media-element\";\r\n\r\nexport const PLAYER_MEDIA_EVENT_TYPES: readonly PlayerMediaEventType[] =\r\n Object.freeze([\r\n \"loadstart\",\r\n \"loadedmetadata\",\r\n \"canplay\",\r\n \"play\",\r\n \"playing\",\r\n \"pause\",\r\n \"waiting\",\r\n \"stalled\",\r\n \"seeking\",\r\n \"seeked\",\r\n \"timeupdate\",\r\n \"ended\",\r\n \"error\",\r\n \"durationchange\",\r\n \"volumechange\",\r\n ]);\r\n\r\nconst PLAY_ERROR_DETAILS: Readonly<\r\n Record<string, { code: PlayerErrorCode; recoverable: boolean }>\r\n> = Object.freeze({\r\n NotAllowedError: Object.freeze({\r\n code: \"autoplay-blocked\",\r\n recoverable: true,\r\n }),\r\n NotSupportedError: Object.freeze({\r\n code: \"unsupported\",\r\n recoverable: false,\r\n }),\r\n AbortError: Object.freeze({\r\n code: \"unknown\",\r\n recoverable: true,\r\n }),\r\n});\r\n\r\nexport function createPlayerError(\r\n code: PlayerErrorCode,\r\n recoverable: boolean,\r\n): PlayerError {\r\n return Object.freeze({\r\n code,\r\n recoverable,\r\n messageKey: `player.error.${code}`,\r\n });\r\n}\r\n\r\nexport function classifyPlayError(\r\n error: unknown,\r\n media: MediaElementPort,\r\n): PlayerError {\r\n const mediaError = media.getError();\r\n if (mediaError !== null) {\r\n return mediaError;\r\n }\r\n\r\n const name =\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"name\" in error &&\r\n typeof error.name === \"string\"\r\n ? error.name\r\n : \"\";\r\n const detail = PLAY_ERROR_DETAILS[name];\r\n\r\n return detail === undefined\r\n ? createPlayerError(\"unknown\", true)\r\n : createPlayerError(detail.code, detail.recoverable);\r\n}\r\n\r\nexport function readFiniteCurrentTime(media: MediaElementPort): number {\r\n const value = media.getCurrentTimeSec();\r\n return Number.isFinite(value) && value >= 0 ? value : 0;\r\n}\r\n\r\nexport function readFiniteDuration(\r\n media: MediaElementPort,\r\n): number | null {\r\n const value = media.getDurationSec();\r\n return value !== null && Number.isFinite(value) && value >= 0 ? value : null;\r\n}\r\n","import type { PlayerMediaItem } from \"../contracts/player\";\r\nimport type {\r\n PodcastProgress,\r\n PodcastProgressPort,\r\n} from \"../ports/persistence\";\r\n\r\nexport const DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC = 5;\r\n\r\nexport function isUsablePodcastProgress(\r\n progress: PodcastProgress | null,\r\n item: PlayerMediaItem,\r\n): progress is PodcastProgress {\r\n return (\r\n progress !== null &&\r\n progress.itemId === item.id &&\r\n Number.isFinite(progress.positionSec) &&\r\n progress.positionSec >= 0\r\n );\r\n}\r\n\r\nexport function createPodcastProgress(\r\n item: PlayerMediaItem,\r\n positionSec: number,\r\n now: () => Date,\r\n): PodcastProgress {\r\n return Object.freeze({\r\n itemId: item.id,\r\n positionSec,\r\n updatedAt: now().toISOString(),\r\n });\r\n}\r\n\r\nexport function canUsePodcastProgress(\r\n item: PlayerMediaItem | null,\r\n port: PodcastProgressPort | undefined,\r\n persistMode: \"none\" | \"session\" | \"local\",\r\n): item is PlayerMediaItem {\r\n return (\r\n item !== null &&\r\n item.kind === \"podcastEpisode\" &&\r\n port !== undefined &&\r\n persistMode !== \"none\"\r\n );\r\n}\r\n","import type {\r\n PlayerMediaItem,\r\n QueueItem,\r\n RepeatMode,\r\n} from \"../contracts/player\";\r\n\r\nexport function createLoadedQueueItem(item: PlayerMediaItem): QueueItem {\r\n return Object.freeze({\r\n queueItemId: `loaded:${item.id}`,\r\n item,\r\n });\r\n}\r\n\r\nexport function freezeQueue(\r\n queue: readonly QueueItem[],\r\n): readonly QueueItem[] {\r\n return Object.freeze([...queue]);\r\n}\r\n\r\nexport function findQueueIndex(\r\n queue: readonly QueueItem[],\r\n queueItemId: string,\r\n): number | null {\r\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\r\n return index < 0 ? null : index;\r\n}\r\n\r\nexport function hasUniqueQueueItemIds(queue: readonly QueueItem[]): boolean {\r\n return new Set(queue.map((entry) => entry.queueItemId)).size === queue.length;\r\n}\r\n\r\nexport function getNextQueueIndex(\r\n queue: readonly unknown[],\r\n currentIndex: number,\r\n repeatMode: RepeatMode,\r\n): number | null {\r\n if (queue.length === 0 || currentIndex < 0) {\r\n return null;\r\n }\r\n\r\n if (currentIndex < queue.length - 1) {\r\n return currentIndex + 1;\r\n }\r\n\r\n return repeatMode === \"all\" ? 0 : null;\r\n}\r\n\r\nexport function getPreviousQueueIndex(\r\n queue: readonly unknown[],\r\n currentIndex: number,\r\n): number | null {\r\n if (queue.length === 0 || currentIndex <= 0) {\r\n return null;\r\n }\r\n\r\n return currentIndex - 1;\r\n}\r\n","import type {\r\n PlaybackContextState,\r\n PlayerState,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { freezeQueue } from \"./queue\";\r\n\r\nexport type PlayerStatePatch = Partial<PlayerState>;\r\n\r\nfunction deriveCurrentIndex(\r\n queue: readonly QueueItem[],\r\n queueItemId: string | null,\r\n): number | null {\r\n if (queueItemId === null) {\r\n return null;\r\n }\r\n\r\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\r\n return index < 0 ? null : index;\r\n}\r\n\r\nfunction synchronizeActiveContext(\r\n context: PlaybackContextState | null,\r\n queue: readonly QueueItem[],\r\n currentQueueItemId: string | null,\r\n): PlaybackContextState | null {\r\n if (context === null) {\r\n return null;\r\n }\r\n\r\n return Object.freeze({\r\n ...context,\r\n queue,\r\n currentQueueItemId,\r\n });\r\n}\r\n\r\nexport function createPlayerSnapshot(\r\n previous: Readonly<PlayerState>,\r\n patch: PlayerStatePatch,\r\n): Readonly<PlayerState> {\r\n const queue =\r\n patch.queue === undefined ? previous.queue : freezeQueue(patch.queue);\r\n const currentQueueItemId =\r\n patch.currentQueueItemId === undefined\r\n ? previous.currentQueueItemId\r\n : patch.currentQueueItemId;\r\n const currentQueueIndex = deriveCurrentIndex(queue, currentQueueItemId);\r\n const repeatMode = patch.repeatMode ?? previous.repeatMode;\r\n const currentItem =\r\n patch.currentItem === undefined ? previous.currentItem : patch.currentItem;\r\n const activeContext = synchronizeActiveContext(\r\n patch.activeContext === undefined\r\n ? previous.activeContext\r\n : patch.activeContext,\r\n queue,\r\n currentQueueItemId,\r\n );\r\n\r\n return Object.freeze({\r\n ...previous,\r\n ...patch,\r\n queue,\r\n activeContext,\r\n currentQueueItemId,\r\n currentQueueIndex,\r\n canGoPrevious: patch.canGoPrevious ?? currentItem !== null,\r\n canGoNext:\r\n patch.canGoNext ??\r\n (currentQueueIndex !== null &&\r\n (currentQueueIndex < queue.length - 1 ||\r\n (queue.length > 0 && repeatMode === \"all\"))),\r\n });\r\n}\r\n","import type { QueueItem } from \"../contracts/player\";\r\n\r\nexport type PlayerRandomSource = () => number;\r\n\r\nfunction normalizeRandom(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.min(Math.max(value, 0), 0.999_999_999_999);\r\n}\r\n\r\nexport function shuffleQueueAroundCurrent(\r\n queue: readonly QueueItem[],\r\n currentQueueItemId: string,\r\n random: PlayerRandomSource,\r\n): readonly QueueItem[] {\r\n const current = queue.find(\r\n (entry) => entry.queueItemId === currentQueueItemId,\r\n );\r\n\r\n if (current === undefined) {\r\n return Object.freeze([...queue]);\r\n }\r\n\r\n const remaining = queue.filter(\r\n (entry) => entry.queueItemId !== currentQueueItemId,\r\n );\r\n\r\n for (let index = remaining.length - 1; index > 0; index -= 1) {\r\n const swapIndex = Math.floor(normalizeRandom(random()) * (index + 1));\r\n const candidate = remaining[index];\r\n const replacement = remaining[swapIndex];\r\n\r\n if (candidate !== undefined && replacement !== undefined) {\r\n remaining[index] = replacement;\r\n remaining[swapIndex] = candidate;\r\n }\r\n }\r\n\r\n return Object.freeze([current, ...remaining]);\r\n}\r\n","import {\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n createInitialPlayerState,\r\n validatePlayerExperienceConfig,\r\n} from \"../config\";\r\nimport type {\r\n ActivatePlaybackContextOptions,\r\n PauseOptions,\r\n PlaybackContextState,\r\n PlayerCommandResult,\r\n PlayerCommands,\r\n PlayerError,\r\n PlayerExperienceConfig,\r\n PlayerExperienceConfigStore,\r\n PlayerMediaItem,\r\n PlayerMediaSyncReason,\r\n PlayerState,\r\n PlayerStore,\r\n QueueItem,\r\n RepeatMode,\r\n SetQueueOptions,\r\n StopOptions,\r\n} from \"../contracts/player\";\r\nimport type { GainPort } from \"../ports/gain\";\r\nimport type {\r\n MediaElementPort,\r\n PlayerMediaEvent,\r\n} from \"../ports/media-element\";\r\nimport type { PodcastProgressPort } from \"../ports/persistence\";\r\nimport { runFade } from \"./fade\";\r\nimport {\r\n PLAYER_MEDIA_EVENT_TYPES,\r\n classifyPlayError,\r\n createPlayerError,\r\n readFiniteCurrentTime,\r\n readFiniteDuration,\r\n} from \"./media-events\";\r\nimport {\r\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC,\r\n canUsePodcastProgress,\r\n createPodcastProgress,\r\n isUsablePodcastProgress,\r\n} from \"./persistence\";\r\nimport { createPlayerSnapshot } from \"./player-reducer\";\r\nimport {\r\n createLoadedQueueItem,\r\n findQueueIndex,\r\n freezeQueue,\r\n getNextQueueIndex,\r\n getPreviousQueueIndex,\r\n hasUniqueQueueItemIds,\r\n} from \"./queue\";\r\nimport {\r\n shuffleQueueAroundCurrent,\r\n type PlayerRandomSource,\r\n} from \"./shuffle\";\r\n\r\nexport interface CreatePlayerStoreOptions {\r\n readonly media: MediaElementPort;\r\n readonly gain?: GainPort;\r\n readonly podcastProgress?: PodcastProgressPort;\r\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\r\n readonly random?: PlayerRandomSource;\r\n readonly now?: () => Date;\r\n readonly podcastProgressSaveIntervalSec?: number;\r\n}\r\n\r\ntype Listener = () => void;\r\ntype DesiredPlayback = \"playing\" | \"paused\";\r\n\r\nconst OK_RESULT: PlayerCommandResult = Object.freeze({ ok: true });\r\nconst NO_ITEM_ERROR = createPlayerError(\"unknown\", false);\r\nconst INVALID_QUEUE_ERROR: PlayerError = Object.freeze({\r\n code: \"unknown\",\r\n recoverable: false,\r\n messageKey: \"player.error.invalid-queue\",\r\n});\r\nconst DESTROYED_ERROR: PlayerError = Object.freeze({\r\n code: \"unknown\",\r\n recoverable: false,\r\n messageKey: \"player.error.destroyed\",\r\n});\r\nconst MAX_SHUFFLE_HISTORY_ITEMS = 512;\r\nconst RETAINED_SHUFFLE_HISTORY_ITEMS = 128;\r\n\r\nfunction failed(error: PlayerError): PlayerCommandResult {\r\n return Object.freeze({ ok: false, error });\r\n}\r\n\r\nfunction clampVolume(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction sourcesMatch(\r\n left: PlayerMediaItem[\"source\"],\r\n right: PlayerMediaItem[\"source\"],\r\n): boolean {\r\n return (\r\n left.url === right.url &&\r\n left.mimeType === right.mimeType\r\n );\r\n}\r\n\r\nclass CorePlayerStore implements PlayerStore {\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n\r\n readonly #media: MediaElementPort;\r\n readonly #gain: GainPort | undefined;\r\n readonly #podcastProgress: PodcastProgressPort | undefined;\r\n readonly #random: PlayerRandomSource;\r\n readonly #now: () => Date;\r\n readonly #podcastProgressSaveIntervalSec: number;\r\n readonly #listeners = new Set<Listener>();\r\n readonly #experienceListeners = new Set<Listener>();\r\n readonly #mediaListener = (event: PlayerMediaEvent): void => {\r\n this.#handleMediaEvent(event);\r\n };\r\n\r\n #state: Readonly<PlayerState>;\r\n #playbackOrderQueueItemIds: readonly string[] = Object.freeze([]);\r\n #playbackOrderCursor = -1;\r\n #commandVersion = 0;\r\n #desiredPlayback: DesiredPlayback = \"paused\";\r\n #ignoreNextPauseEvent = false;\r\n #handlingEnded = false;\r\n #destroyed = false;\r\n #lastSavedPodcastPositions = new Map<string, number>();\r\n #progressSaveChain: Promise<void> = Promise.resolve();\r\n\r\n constructor(options: CreatePlayerStoreOptions) {\r\n this.#media = options.media;\r\n this.#gain = options.gain;\r\n this.#podcastProgress = options.podcastProgress;\r\n this.#random = options.random ?? Math.random;\r\n this.#now = options.now ?? (() => new Date());\r\n this.#podcastProgressSaveIntervalSec =\r\n options.podcastProgressSaveIntervalSec ??\r\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC;\r\n\r\n if (\r\n !Number.isFinite(this.#podcastProgressSaveIntervalSec) ||\r\n this.#podcastProgressSaveIntervalSec <= 0\r\n ) {\r\n throw new RangeError(\r\n \"podcastProgressSaveIntervalSec must be a positive finite number.\",\r\n );\r\n }\r\n\r\n this.#state = createInitialPlayerState(options.experienceConfig);\r\n this.#media.setVolume(this.#state.volume);\r\n this.#media.setMuted(this.#state.muted);\r\n try {\r\n this.#gain?.setValue(1);\r\n } catch {\r\n this.#state = createPlayerSnapshot(this.#state, {\r\n error: createPlayerError(\"audio-context\", true),\r\n });\r\n }\r\n\r\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\r\n this.#media.addEventListener(eventType, this.#mediaListener);\r\n }\r\n\r\n const commands: PlayerCommands = {\r\n load: (item) => this.#load(item),\r\n setQueue: (queue, commandOptions) =>\r\n this.#setQueue(queue, commandOptions),\r\n activateContext: (commandOptions) =>\r\n this.#activateContext(commandOptions),\r\n appendToManualHistory: (contextId, item) => {\r\n this.#appendToManualHistory(contextId, item);\r\n },\r\n play: () => this.#play(),\r\n pause: (commandOptions) => this.#pause(commandOptions),\r\n stop: (commandOptions) => this.#stop(commandOptions),\r\n togglePlayback: () => this.#togglePlayback(),\r\n seekTo: (seconds) => {\r\n this.#seekTo(seconds);\r\n },\r\n seekBy: (deltaSeconds) => {\r\n this.#seekBy(deltaSeconds);\r\n },\r\n setVolume: (volume) => {\r\n this.#setVolume(volume);\r\n },\r\n toggleMute: () => {\r\n this.#toggleMute();\r\n },\r\n setShuffle: (enabled) => {\r\n this.#setShuffle(enabled);\r\n },\r\n setRepeatMode: (mode) => {\r\n this.#setRepeatMode(mode);\r\n },\r\n next: () => this.#next(),\r\n previous: () => this.#previous(),\r\n retry: () => this.#retry(),\r\n clear: () => this.#clear(),\r\n };\r\n this.commands = Object.freeze(commands);\r\n\r\n const experience: PlayerExperienceConfigStore = {\r\n getConfig: () => this.#state.experienceConfig,\r\n updateConfig: (patch) => {\r\n this.#updateExperienceConfig(patch);\r\n },\r\n resetConfig: () => {\r\n this.#replaceExperienceConfig(PREVIEW_PLAYER_EXPERIENCE_CONFIG);\r\n },\r\n subscribe: (listener) =>\r\n this.#subscribeTo(this.#experienceListeners, listener),\r\n };\r\n this.experience = Object.freeze(experience);\r\n }\r\n\r\n getState(): PlayerState {\r\n return this.#state;\r\n }\r\n\r\n subscribe(listener: Listener): () => void {\r\n return this.#subscribeTo(this.#listeners, listener);\r\n }\r\n\r\n async synchronizeFromMedia(\r\n reason: PlayerMediaSyncReason,\r\n ): Promise<void> {\r\n if (this.#destroyed || this.#state.currentItem === null) {\r\n return;\r\n }\r\n\r\n const snapshot = this.#media.getStateSnapshot();\r\n if (\r\n !snapshot.hasCurrentSource ||\r\n !snapshot.currentSourceMatchesAssigned\r\n ) {\r\n const error = createPlayerError(\"unknown\", true);\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error,\r\n });\r\n return;\r\n }\r\n\r\n if (snapshot.ended) {\r\n await this.#handleEnded();\r\n return;\r\n }\r\n\r\n const wasPlaying = this.#state.status === \"playing\";\r\n const externallyPaused = wasPlaying && snapshot.paused;\r\n this.#desiredPlayback = snapshot.paused ? \"paused\" : \"playing\";\r\n this.#setState({\r\n status: snapshot.paused ? \"paused\" : \"playing\",\r\n currentTimeSec: snapshot.currentTimeSec,\r\n durationSec: snapshot.durationSec,\r\n volume: clampVolume(snapshot.volume),\r\n muted: snapshot.muted,\r\n canSeek: snapshot.durationSec !== null,\r\n ...(externallyPaused\r\n ? {\r\n lastTransitionCause:\r\n reason === \"visibilitychange\" ||\r\n reason === \"pageshow\" ||\r\n reason === \"focus\" ||\r\n reason === \"audio-context-statechange\"\r\n ? (\"background-suspension\" as const)\r\n : (\"os-interruption\" as const),\r\n }\r\n : {}),\r\n });\r\n }\r\n\r\n async destroy(): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n await this.#clear();\r\n this.#destroyed = true;\r\n this.#commandVersion += 1;\r\n try {\r\n this.#gain?.cancelTransition();\r\n } catch {\r\n // Listener and resource cleanup must continue after gain failure.\r\n }\r\n\r\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\r\n this.#media.removeEventListener(eventType, this.#mediaListener);\r\n }\r\n\r\n await this.#progressSaveChain;\r\n await this.#gain?.destroy();\r\n this.#listeners.clear();\r\n this.#experienceListeners.clear();\r\n }\r\n\r\n #subscribeTo(collection: Set<Listener>, listener: Listener): () => void {\r\n if (this.#destroyed) {\r\n return () => undefined;\r\n }\r\n\r\n collection.add(listener);\r\n return () => {\r\n collection.delete(listener);\r\n };\r\n }\r\n\r\n #setState(patch: Partial<PlayerState>): void {\r\n const queue = patch.queue ?? this.#state.queue;\r\n const currentItem =\r\n patch.currentItem === undefined\r\n ? this.#state.currentItem\r\n : patch.currentItem;\r\n const currentQueueItemId =\r\n patch.currentQueueItemId === undefined\r\n ? this.#state.currentQueueItemId\r\n : patch.currentQueueItemId;\r\n const repeatMode = patch.repeatMode ?? this.#state.repeatMode;\r\n const playbackIndex =\r\n currentQueueItemId === null ? -1 : this.#playbackOrderCursor;\r\n this.#state = createPlayerSnapshot(this.#state, {\r\n ...patch,\r\n canGoPrevious: currentItem !== null,\r\n canGoNext:\r\n playbackIndex >= 0 &&\r\n (playbackIndex < this.#playbackOrderQueueItemIds.length - 1 ||\r\n (this.#playbackOrderQueueItemIds.length > 0 &&\r\n repeatMode === \"all\")),\r\n queue,\r\n });\r\n for (const listener of this.#listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n #beginCommand(desiredPlayback = this.#desiredPlayback): number {\r\n this.#commandVersion += 1;\r\n this.#desiredPlayback = desiredPlayback;\r\n\r\n try {\r\n this.#gain?.cancelTransition();\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n\r\n return this.#commandVersion;\r\n }\r\n\r\n #isCurrentCommand(version: number): boolean {\r\n return !this.#destroyed && version === this.#commandVersion;\r\n }\r\n\r\n #pauseMediaElement(): void {\r\n if (!this.#media.isPaused()) {\r\n this.#ignoreNextPauseEvent = true;\r\n }\r\n this.#media.pause();\r\n }\r\n\r\n #replaceExperienceConfig(\r\n config: Readonly<PlayerExperienceConfig>,\r\n ): void {\r\n const result = validatePlayerExperienceConfig(config);\r\n if (!result.ok) {\r\n throw new TypeError(result.errors.join(\" \"));\r\n }\r\n\r\n this.#setState({ experienceConfig: result.value });\r\n for (const listener of this.#experienceListeners) {\r\n listener();\r\n }\r\n }\r\n\r\n #updateExperienceConfig(\r\n patch: Partial<PlayerExperienceConfig>,\r\n ): void {\r\n this.#replaceExperienceConfig({\r\n ...this.#state.experienceConfig,\r\n ...patch,\r\n });\r\n }\r\n\r\n async #load(item: PlayerMediaItem): Promise<PlayerCommandResult> {\r\n return this.#setQueue([createLoadedQueueItem(item)]);\r\n }\r\n\r\n async #setQueue(\r\n queue: readonly QueueItem[],\r\n options: SetQueueOptions = {},\r\n activeContext?: PlaybackContextState,\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n if (!hasUniqueQueueItemIds(queue)) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n if (queue.length === 0) {\r\n await this.#clear();\r\n return OK_RESULT;\r\n }\r\n\r\n const normalizedQueue = freezeQueue(queue);\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n const currentStillExists =\r\n currentQueueItemId !== null &&\r\n findQueueIndex(normalizedQueue, currentQueueItemId) !== null;\r\n const startQueueItemId =\r\n options.startQueueItemId ??\r\n (currentStillExists\r\n ? currentQueueItemId\r\n : normalizedQueue[0]?.queueItemId);\r\n const startIndex =\r\n startQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(normalizedQueue, startQueueItemId);\r\n\r\n if (startIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const selected = normalizedQueue[startIndex];\r\n if (selected === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const preservePlayback =\r\n options.reload !== true &&\r\n currentQueueItemId === selected.queueItemId &&\r\n this.#state.currentItem !== null &&\r\n sourcesMatch(this.#state.currentItem.source, selected.item.source);\r\n const targetContext = activeContext ?? this.#state.activeContext;\r\n const manualHistory = targetContext?.mode === \"manual-history\";\r\n const shuffleEnabled = manualHistory\r\n ? false\r\n : this.#state.shuffleEnabled;\r\n const repeatMode =\r\n manualHistory && this.#state.repeatMode === \"all\"\r\n ? \"off\"\r\n : this.#state.repeatMode;\r\n const playbackQueue =\r\n shuffleEnabled && startQueueItemId !== undefined\r\n ? shuffleQueueAroundCurrent(\r\n normalizedQueue,\r\n startQueueItemId,\r\n this.#random,\r\n )\r\n : normalizedQueue;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n playbackQueue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor = shuffleEnabled\r\n ? 0\r\n : startIndex;\r\n\r\n this.#setState({\r\n queue: normalizedQueue,\r\n ...(activeContext === undefined ? {} : { activeContext }),\r\n currentItem: preservePlayback ? selected.item : this.#state.currentItem,\r\n currentItemId: preservePlayback\r\n ? selected.item.id\r\n : this.#state.currentItemId,\r\n shuffleEnabled,\r\n repeatMode,\r\n error: null,\r\n });\r\n\r\n if (preservePlayback) {\r\n if (options.autoplay === true && this.#state.status !== \"playing\") {\r\n return this.#play();\r\n }\r\n return OK_RESULT;\r\n }\r\n\r\n const version = this.#beginCommand(\r\n options.autoplay === true ? \"playing\" : \"paused\",\r\n );\r\n\r\n return this.#selectQueueIndex(\r\n version,\r\n startIndex,\r\n options.autoplay === true,\r\n );\r\n }\r\n\r\n async #activateContext(\r\n options: ActivatePlaybackContextOptions,\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n if (options.contextId.trim().length === 0) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const suppliedQueue = options.queue ??\r\n (this.#state.activeContext?.id === options.contextId\r\n ? this.#state.queue\r\n : undefined);\r\n if (\r\n suppliedQueue === undefined ||\r\n !hasUniqueQueueItemIds(suppliedQueue)\r\n ) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const startIndex = findQueueIndex(\r\n suppliedQueue,\r\n options.startQueueItemId,\r\n );\r\n if (startIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const startItem = suppliedQueue[startIndex];\r\n if (startItem === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n let queue: readonly QueueItem[];\r\n if (options.mode === \"manual-history\") {\r\n const sameManualContext =\r\n this.#state.activeContext?.id === options.contextId &&\r\n this.#state.activeContext.mode === \"manual-history\";\r\n const history = sameManualContext ? [...this.#state.queue] : [];\r\n const existingIndex = findQueueIndex(history, startItem.queueItemId);\r\n if (existingIndex === null) {\r\n history.push(startItem);\r\n } else {\r\n history[existingIndex] = startItem;\r\n }\r\n queue = freezeQueue(history);\r\n } else {\r\n queue = freezeQueue(suppliedQueue);\r\n }\r\n\r\n const previousContext = this.#state.activeContext;\r\n const context = Object.freeze({\r\n id: options.contextId,\r\n mode: options.mode,\r\n ...(options.label === undefined && previousContext?.id === options.contextId\r\n ? previousContext.label === undefined\r\n ? {}\r\n : { label: previousContext.label }\r\n : options.label === undefined\r\n ? {}\r\n : { label: options.label }),\r\n queue,\r\n currentQueueItemId: options.startQueueItemId,\r\n }) satisfies PlaybackContextState;\r\n\r\n return this.#setQueue(\r\n queue,\r\n {\r\n startQueueItemId: options.startQueueItemId,\r\n ...(options.autoplay === undefined\r\n ? {}\r\n : { autoplay: options.autoplay }),\r\n ...(options.reload === undefined ? {} : { reload: options.reload }),\r\n },\r\n context,\r\n );\r\n }\r\n\r\n #appendToManualHistory(contextId: string, item: QueueItem): void {\r\n const context = this.#state.activeContext;\r\n if (\r\n this.#destroyed ||\r\n context?.id !== contextId ||\r\n context.mode !== \"manual-history\" ||\r\n findQueueIndex(this.#state.queue, item.queueItemId) !== null\r\n ) {\r\n return;\r\n }\r\n\r\n const queue = freezeQueue([...this.#state.queue, item]);\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n queue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor =\r\n this.#state.currentQueueItemId === null\r\n ? -1\r\n : findQueueIndex(queue, this.#state.currentQueueItemId) ?? -1;\r\n this.#setState({ queue });\r\n }\r\n\r\n async #selectQueueIndex(\r\n version: number,\r\n index: number,\r\n autoplay: boolean,\r\n ): Promise<PlayerCommandResult> {\r\n const selected = this.#state.queue[index];\r\n if (selected === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const config = this.#state.experienceConfig;\r\n const replacingCurrent = this.#state.currentItem !== null;\r\n let transitionError: PlayerError | null = null;\r\n\r\n if (replacingCurrent) {\r\n void this.#savePodcastProgress(true);\r\n\r\n if (this.#state.status === \"playing\") {\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: config.trackChangeFadeOutMs,\r\n curve: config.fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n if (fadeResult.error !== null) {\r\n transitionError = fadeResult.error;\r\n }\r\n }\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n this.#pauseMediaElement();\r\n }\r\n\r\n this.#setState({\r\n currentItem: selected.item,\r\n currentItemId: selected.item.id,\r\n currentQueueItemId: selected.queueItemId,\r\n mediaKind: selected.item.kind,\r\n status: \"loading\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n canSeek: false,\r\n needsUserGesture: false,\r\n error: transitionError,\r\n });\r\n\r\n try {\r\n this.#media.setSource(selected.item.source);\r\n this.#media.load();\r\n } catch {\r\n const error = createPlayerError(\"unknown\", true);\r\n this.#setState({ status: \"error\", error });\r\n return failed(error);\r\n }\r\n\r\n await this.#restorePodcastProgress(version, selected.item);\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n return autoplay\r\n ? this.#playWithCommand(\r\n version,\r\n config.trackChangeFadeInMs,\r\n config.fadeCurve,\r\n )\r\n : OK_RESULT;\r\n }\r\n\r\n async #restorePodcastProgress(\r\n version: number,\r\n item: PlayerMediaItem,\r\n ): Promise<void> {\r\n const port = this.#podcastProgress;\r\n if (\r\n port === undefined ||\r\n !canUsePodcastProgress(\r\n item,\r\n port,\r\n this.#state.experienceConfig.persistMode,\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n try {\r\n const progress = await port.load(item.id);\r\n if (\r\n !this.#isCurrentCommand(version) ||\r\n this.#state.currentItemId !== item.id ||\r\n !isUsablePodcastProgress(progress, item)\r\n ) {\r\n return;\r\n }\r\n\r\n const duration = readFiniteDuration(this.#media);\r\n const target =\r\n duration === null\r\n ? progress.positionSec\r\n : Math.min(progress.positionSec, duration);\r\n this.#media.seekTo(target);\r\n this.#lastSavedPodcastPositions.set(item.id, target);\r\n this.#setState({ currentTimeSec: target });\r\n } catch {\r\n // Persistence failure must not prevent basic playback.\r\n }\r\n }\r\n\r\n async #play(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n const config = this.#state.experienceConfig;\r\n const result = await this.#playWithCommand(\r\n version,\r\n config.playFadeInMs,\r\n config.fadeCurve,\r\n );\r\n if (result.ok && this.#isCurrentCommand(version)) {\r\n this.#setState({ lastTransitionCause: \"user-play\" });\r\n }\r\n return result;\r\n }\r\n\r\n async #playWithCommand(\r\n version: number,\r\n fadeDurationMs: number,\r\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#state.currentItem === null) {\r\n this.#desiredPlayback = \"paused\";\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n if (this.#gain !== undefined) {\r\n try {\r\n this.#gain.setValue(fadeDurationMs > 0 ? 0 : 1);\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n }\r\n\r\n try {\r\n await this.#media.play();\r\n } catch (error) {\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n const playerError = classifyPlayError(error, this.#media);\r\n this.#desiredPlayback = \"paused\";\r\n this.#restoreGain();\r\n this.#setState({\r\n status: \"error\",\r\n needsUserGesture: playerError.code === \"autoplay-blocked\",\r\n ...(playerError.code === \"autoplay-blocked\"\r\n ? { lastTransitionCause: \"autoplay-blocked\" as const }\r\n : {}),\r\n error: playerError,\r\n });\r\n return failed(playerError);\r\n }\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n if (this.#desiredPlayback === \"paused\") {\r\n this.#pauseMediaElement();\r\n }\r\n return OK_RESULT;\r\n }\r\n\r\n this.#setState({\r\n status: \"playing\",\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 1,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (\r\n this.#isCurrentCommand(version) &&\r\n fadeResult.error !== null\r\n ) {\r\n this.#setState({ error: fadeResult.error });\r\n }\r\n\r\n return OK_RESULT;\r\n }\r\n\r\n async #pause(options: PauseOptions = {}): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n await this.#halt(version, {\r\n fadeDurationMs:\r\n options.fade === false ? 0 : config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: false,\r\n transitionCause: \"user-pause\",\r\n });\r\n }\r\n\r\n async #stop(options: StopOptions = {}): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n await this.#halt(version, {\r\n fadeDurationMs:\r\n options.fade === false ? 0 : config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: options.resetPosition ?? true,\r\n transitionCause: \"user-stop\",\r\n });\r\n }\r\n\r\n async #halt(\r\n version: number,\r\n options: {\r\n readonly fadeDurationMs: number;\r\n readonly fadeCurve: PlayerExperienceConfig[\"fadeCurve\"];\r\n readonly resetPosition: boolean;\r\n readonly transitionCause?: \"user-pause\" | \"user-stop\";\r\n },\r\n ): Promise<boolean> {\r\n void this.#savePodcastProgress(true);\r\n\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: options.fadeDurationMs,\r\n curve: options.fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return false;\r\n }\r\n if (fadeResult.error !== null) {\r\n this.#setState({ error: fadeResult.error });\r\n }\r\n\r\n this.#pauseMediaElement();\r\n if (options.resetPosition && this.#state.currentItem !== null) {\r\n this.#media.seekTo(0);\r\n }\r\n\r\n this.#setState({\r\n status: this.#state.currentItem === null ? \"idle\" : \"paused\",\r\n currentTimeSec: options.resetPosition\r\n ? 0\r\n : readFiniteCurrentTime(this.#media),\r\n ...(options.transitionCause === undefined\r\n ? {}\r\n : { lastTransitionCause: options.transitionCause }),\r\n });\r\n return true;\r\n }\r\n\r\n async #togglePlayback(): Promise<PlayerCommandResult> {\r\n if (this.#state.status === \"playing\") {\r\n await this.#pause();\r\n return OK_RESULT;\r\n }\r\n\r\n return this.#play();\r\n }\r\n\r\n #seekTo(seconds: number): void {\r\n if (\r\n this.#destroyed ||\r\n this.#state.currentItem === null ||\r\n !Number.isFinite(seconds)\r\n ) {\r\n return;\r\n }\r\n\r\n const duration = readFiniteDuration(this.#media);\r\n const lowerBounded = Math.max(seconds, 0);\r\n const target =\r\n duration === null\r\n ? lowerBounded\r\n : Math.min(lowerBounded, duration);\r\n const version = this.#beginCommand(this.#desiredPlayback);\r\n const config = this.#state.experienceConfig;\r\n void this.#performSeek(\r\n version,\r\n target,\r\n config.seekFadeMs,\r\n config.fadeCurve,\r\n );\r\n }\r\n\r\n #seekBy(deltaSeconds: number): void {\r\n if (!Number.isFinite(deltaSeconds)) {\r\n return;\r\n }\r\n\r\n this.#seekTo(readFiniteCurrentTime(this.#media) + deltaSeconds);\r\n }\r\n\r\n async #performSeek(\r\n version: number,\r\n target: number,\r\n fadeDurationMs: number,\r\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\r\n ): Promise<void> {\r\n const fadeOut = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n if (fadeOut.error !== null) {\r\n this.#setState({ error: fadeOut.error });\r\n }\r\n\r\n this.#setState({ status: \"seeking\" });\r\n this.#media.seekTo(target);\r\n this.#setState({ currentTimeSec: target });\r\n\r\n const fadeIn = await runFade(this.#gain, {\r\n target: 1,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n if (fadeIn.error !== null) {\r\n this.#setState({ error: fadeIn.error });\r\n }\r\n\r\n this.#setState({\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n }\r\n\r\n #setVolume(volume: number): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const normalized = clampVolume(volume);\r\n this.#media.setVolume(normalized);\r\n this.#setState({ volume: normalized });\r\n }\r\n\r\n #toggleMute(): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const muted = !this.#state.muted;\r\n this.#media.setMuted(muted);\r\n this.#setState({ muted });\r\n }\r\n\r\n #setShuffle(enabled: boolean): void {\r\n if (\r\n this.#destroyed ||\r\n (enabled &&\r\n this.#state.activeContext?.mode === \"manual-history\") ||\r\n enabled === this.#state.shuffleEnabled\r\n ) {\r\n return;\r\n }\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n this.#setState({ shuffleEnabled: enabled });\r\n return;\r\n }\r\n\r\n const playbackQueue = enabled\r\n ? shuffleQueueAroundCurrent(\r\n this.#state.queue,\r\n currentQueueItemId,\r\n this.#random,\r\n )\r\n : this.#state.queue;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n playbackQueue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor = enabled\r\n ? 0\r\n : findQueueIndex(this.#state.queue, currentQueueItemId) ?? -1;\r\n this.#setState({\r\n shuffleEnabled: enabled,\r\n });\r\n }\r\n\r\n #setRepeatMode(mode: RepeatMode): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n this.#setState({\r\n repeatMode:\r\n this.#state.activeContext?.mode === \"manual-history\" &&\r\n mode === \"all\"\r\n ? \"off\"\r\n : mode,\r\n });\r\n }\r\n\r\n async #next(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\r\n currentQueueItemId,\r\n );\r\n if (nextPlaybackIndex === null) {\r\n return OK_RESULT;\r\n }\r\n const nextQueueItemId =\r\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\r\n const nextIndex =\r\n nextQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, nextQueueItemId);\r\n if (nextIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n this.#playbackOrderCursor = nextPlaybackIndex;\r\n\r\n const autoplay = this.#state.status === \"playing\";\r\n const version = this.#beginCommand(\r\n autoplay ? \"playing\" : \"paused\",\r\n );\r\n return this.#selectQueueIndex(version, nextIndex, autoplay);\r\n }\r\n\r\n async #previous(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const currentIndex = this.#state.currentQueueIndex;\r\n const currentItem = this.#state.currentItem;\r\n if (currentIndex === null || currentItem === null) {\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n const config = this.#state.experienceConfig;\r\n const currentTime = readFiniteCurrentTime(this.#media);\r\n const shouldRestartTrack =\r\n currentItem.kind === \"track\" &&\r\n config.previousRestartThresholdSec > 0 &&\r\n currentTime >= config.previousRestartThresholdSec;\r\n const shouldRestartPodcast =\r\n currentItem.kind === \"podcastEpisode\" &&\r\n config.podcastPreviousMode === \"restart-episode\";\r\n const previousPlaybackIndex = getPreviousQueueIndex(\r\n this.#playbackOrderQueueItemIds,\r\n this.#playbackOrderCursor,\r\n );\r\n const previousQueueItemId =\r\n previousPlaybackIndex === null\r\n ? undefined\r\n : this.#playbackOrderQueueItemIds[previousPlaybackIndex];\r\n const previousIndex =\r\n previousQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, previousQueueItemId);\r\n\r\n if (\r\n shouldRestartTrack ||\r\n shouldRestartPodcast ||\r\n previousPlaybackIndex === null ||\r\n previousIndex === null\r\n ) {\r\n this.#seekTo(0);\r\n return OK_RESULT;\r\n }\r\n this.#playbackOrderCursor = previousPlaybackIndex;\r\n\r\n const autoplay = this.#state.status === \"playing\";\r\n const version = this.#beginCommand(\r\n autoplay ? \"playing\" : \"paused\",\r\n );\r\n return this.#selectQueueIndex(version, previousIndex, autoplay);\r\n }\r\n\r\n async #retry(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n if (\r\n this.#state.currentQueueIndex === null ||\r\n this.#state.error === null ||\r\n !this.#state.error.recoverable\r\n ) {\r\n return failed(this.#state.error ?? NO_ITEM_ERROR);\r\n }\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n this.#setState({ error: null, needsUserGesture: false });\r\n return this.#selectQueueIndex(\r\n version,\r\n this.#state.currentQueueIndex,\r\n true,\r\n );\r\n }\r\n\r\n async #clear(): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n const halted = await this.#halt(version, {\r\n fadeDurationMs: config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: true,\r\n });\r\n\r\n if (!halted || !this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n\r\n this.#media.clearSource();\r\n this.#playbackOrderQueueItemIds = Object.freeze([]);\r\n this.#playbackOrderCursor = -1;\r\n this.#setState({\r\n currentItem: null,\r\n currentItemId: null,\r\n currentQueueItemId: null,\r\n mediaKind: null,\r\n status: \"idle\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n queue: Object.freeze([]),\r\n activeContext: null,\r\n canSeek: false,\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n }\r\n\r\n #restoreGain(): void {\r\n try {\r\n this.#gain?.setValue(1);\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n }\r\n\r\n async #savePodcastProgress(force: boolean): Promise<void> {\r\n const item = this.#state.currentItem;\r\n const port = this.#podcastProgress;\r\n if (\r\n port === undefined ||\r\n !canUsePodcastProgress(\r\n item,\r\n port,\r\n this.#state.experienceConfig.persistMode,\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n const position = readFiniteCurrentTime(this.#media);\r\n const lastPosition = this.#lastSavedPodcastPositions.get(item.id);\r\n if (\r\n !force &&\r\n lastPosition !== undefined &&\r\n Math.abs(position - lastPosition) <\r\n this.#podcastProgressSaveIntervalSec\r\n ) {\r\n return;\r\n }\r\n\r\n const progress = createPodcastProgress(item, position, this.#now);\r\n this.#lastSavedPodcastPositions.set(item.id, position);\r\n this.#progressSaveChain = this.#progressSaveChain\r\n .then(() => port.save(progress))\r\n .catch(() => undefined);\r\n await this.#progressSaveChain;\r\n }\r\n\r\n #handleMediaEvent(event: PlayerMediaEvent): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const snapshot = this.#media.getStateSnapshot();\r\n if (\r\n this.#state.currentItem !== null &&\r\n (!snapshot.hasCurrentSource ||\r\n !snapshot.currentSourceMatchesAssigned)\r\n ) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error: createPlayerError(\"unknown\", true),\r\n });\r\n return;\r\n }\r\n this.#setState({\r\n currentTimeSec: snapshot.currentTimeSec,\r\n durationSec: snapshot.durationSec,\r\n volume: clampVolume(snapshot.volume),\r\n muted: snapshot.muted,\r\n canSeek: snapshot.durationSec !== null,\r\n });\r\n\r\n switch (event.type) {\r\n case \"loadstart\":\r\n this.#setState({ status: \"loading\" });\r\n break;\r\n case \"loadedmetadata\":\r\n case \"durationchange\": {\r\n const duration = readFiniteDuration(this.#media);\r\n this.#setState({\r\n durationSec: duration,\r\n canSeek: duration !== null,\r\n });\r\n break;\r\n }\r\n case \"canplay\":\r\n this.#setState({\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n break;\r\n case \"play\":\r\n case \"playing\":\r\n if (this.#desiredPlayback === \"paused\") {\r\n this.#pauseMediaElement();\r\n break;\r\n }\r\n this.#setState({\r\n status: \"playing\",\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n break;\r\n case \"pause\":\r\n if (this.#ignoreNextPauseEvent) {\r\n this.#ignoreNextPauseEvent = false;\r\n break;\r\n }\r\n if (this.#desiredPlayback === \"playing\") {\r\n this.#desiredPlayback = \"paused\";\r\n }\r\n if (this.#state.status !== \"ended\") {\r\n this.#setState({\r\n status:\r\n this.#state.currentItem === null ? \"idle\" : \"paused\",\r\n ...(this.#state.status === \"playing\"\r\n ? { lastTransitionCause: \"os-interruption\" as const }\r\n : {}),\r\n });\r\n }\r\n break;\r\n case \"waiting\":\r\n case \"stalled\":\r\n this.#setState({ status: \"loading\" });\r\n break;\r\n case \"seeking\":\r\n this.#setState({ status: \"seeking\" });\r\n break;\r\n case \"seeked\":\r\n this.#setState({\r\n currentTimeSec: readFiniteCurrentTime(this.#media),\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n break;\r\n case \"timeupdate\":\r\n this.#setState({\r\n currentTimeSec: readFiniteCurrentTime(this.#media),\r\n ...(this.#state.status === \"loading\" && !snapshot.paused\r\n ? { status: \"playing\" as const }\r\n : {}),\r\n });\r\n void this.#savePodcastProgress(false);\r\n break;\r\n case \"ended\":\r\n void this.#handleEnded();\r\n break;\r\n case \"error\": {\r\n const error =\r\n this.#media.getError() ?? createPlayerError(\"unknown\", true);\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error,\r\n });\r\n break;\r\n }\r\n case \"volumechange\":\r\n this.#setState({\r\n volume: clampVolume(this.#media.getVolume()),\r\n muted: this.#media.isMuted(),\r\n });\r\n break;\r\n }\r\n }\r\n\r\n async #handleEnded(): Promise<void> {\r\n if (this.#handlingEnded) {\r\n return;\r\n }\r\n this.#handlingEnded = true;\r\n try {\r\n await this.#advanceAfterEnded();\r\n } finally {\r\n this.#handlingEnded = false;\r\n }\r\n }\r\n\r\n async #advanceAfterEnded(): Promise<void> {\r\n this.#setState({ lastTransitionCause: \"natural-end\" });\r\n void this.#savePodcastProgress(true);\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n return;\r\n }\r\n\r\n if (this.#state.repeatMode === \"one\") {\r\n const version = this.#beginCommand(\"playing\");\r\n const config = this.#state.experienceConfig;\r\n this.#media.seekTo(0);\r\n this.#setState({ currentTimeSec: 0, status: \"loading\" });\r\n await this.#playWithCommand(\r\n version,\r\n config.trackChangeFadeInMs,\r\n config.fadeCurve,\r\n );\r\n return;\r\n }\r\n\r\n if (this.#state.activeContext?.mode === \"manual-history\") {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"ended\",\r\n currentTimeSec:\r\n readFiniteDuration(this.#media) ??\r\n readFiniteCurrentTime(this.#media),\r\n });\r\n return;\r\n }\r\n\r\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\r\n currentQueueItemId,\r\n );\r\n if (nextPlaybackIndex === null) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"ended\",\r\n currentTimeSec:\r\n readFiniteDuration(this.#media) ??\r\n readFiniteCurrentTime(this.#media),\r\n });\r\n return;\r\n }\r\n const nextQueueItemId =\r\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\r\n const nextIndex =\r\n nextQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, nextQueueItemId);\r\n if (nextIndex === null) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n error: INVALID_QUEUE_ERROR,\r\n });\r\n return;\r\n }\r\n this.#playbackOrderCursor = nextPlaybackIndex;\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n await this.#selectQueueIndex(version, nextIndex, true);\r\n }\r\n\r\n #getNextPlaybackIndex(currentQueueItemId: string): number | null {\r\n if (\r\n this.#playbackOrderCursor >= 0 &&\r\n this.#playbackOrderCursor <\r\n this.#playbackOrderQueueItemIds.length - 1\r\n ) {\r\n return this.#playbackOrderCursor + 1;\r\n }\r\n if (!this.#state.shuffleEnabled) {\r\n return getNextQueueIndex(\r\n this.#playbackOrderQueueItemIds,\r\n this.#playbackOrderCursor,\r\n this.#state.repeatMode,\r\n );\r\n }\r\n if (this.#state.repeatMode !== \"all\") {\r\n return null;\r\n }\r\n\r\n const shuffled = shuffleQueueAroundCurrent(\r\n this.#state.queue,\r\n currentQueueItemId,\r\n this.#random,\r\n );\r\n const continuation = shuffled\r\n .slice(1)\r\n .map((entry) => entry.queueItemId);\r\n if (continuation.length === 0) {\r\n if (this.#state.queue.length !== 1) {\r\n return null;\r\n }\r\n continuation.push(currentQueueItemId);\r\n }\r\n\r\n this.#playbackOrderQueueItemIds = Object.freeze([\r\n ...this.#playbackOrderQueueItemIds,\r\n ...continuation,\r\n ]);\r\n let appendedIndex = this.#playbackOrderCursor + 1;\r\n if (\r\n this.#playbackOrderQueueItemIds.length >\r\n MAX_SHUFFLE_HISTORY_ITEMS &&\r\n this.#playbackOrderCursor > RETAINED_SHUFFLE_HISTORY_ITEMS\r\n ) {\r\n const removeCount =\r\n this.#playbackOrderCursor - RETAINED_SHUFFLE_HISTORY_ITEMS;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n this.#playbackOrderQueueItemIds.slice(removeCount),\r\n );\r\n this.#playbackOrderCursor -= removeCount;\r\n appendedIndex -= removeCount;\r\n }\r\n\r\n return appendedIndex;\r\n }\r\n}\r\n\r\nexport function createPlayerStore(\r\n options: CreatePlayerStoreOptions,\r\n): PlayerStore {\r\n return new CorePlayerStore(options);\r\n}\r\n","import type {\r\n ActivatePlaybackContextOptions,\r\n PauseOptions,\r\n PlayerCommands,\r\n PlayerMediaItem,\r\n QueueItem,\r\n RepeatMode,\r\n SetQueueOptions,\r\n StopOptions,\r\n} from \"../contracts/player\";\r\n\r\nexport interface UserGestureGainActivator {\r\n activateFromUserGesture(): void | Promise<void>;\r\n}\r\n\r\nexport type PlayerRuntimeCommandName = keyof PlayerCommands;\r\n\r\nexport interface GestureAwareCommandsOptions {\r\n readonly onUserActivation?: () => void;\r\n readonly onCommand?: (command: PlayerRuntimeCommandName) => void;\r\n readonly onActivationError?: () => void;\r\n}\r\n\r\nfunction activate(\r\n gain: UserGestureGainActivator,\r\n options: GestureAwareCommandsOptions,\r\n): void {\r\n options.onUserActivation?.();\r\n try {\r\n const activation = gain.activateFromUserGesture();\r\n if (activation !== undefined) {\r\n void activation.catch(() => {\r\n options.onActivationError?.();\r\n });\r\n }\r\n } catch {\r\n options.onActivationError?.();\r\n }\r\n}\r\n\r\nfunction reportCommand(\r\n options: GestureAwareCommandsOptions,\r\n command: PlayerRuntimeCommandName,\r\n): void {\r\n options.onCommand?.(command);\r\n}\r\n\r\nexport function createGestureAwareCommands(\r\n commands: PlayerCommands,\r\n gain: UserGestureGainActivator,\r\n activationOptions: GestureAwareCommandsOptions = {},\r\n): PlayerCommands {\r\n return Object.freeze({\r\n load(item: PlayerMediaItem) {\r\n reportCommand(activationOptions, \"load\");\r\n return commands.load(item);\r\n },\r\n setQueue(\r\n queue: readonly QueueItem[],\r\n commandOptions?: SetQueueOptions,\r\n ) {\r\n reportCommand(activationOptions, \"setQueue\");\r\n if (commandOptions?.autoplay === true) {\r\n activate(gain, activationOptions);\r\n }\r\n return commands.setQueue(queue, commandOptions);\r\n },\r\n activateContext(commandOptions: ActivatePlaybackContextOptions) {\r\n reportCommand(activationOptions, \"activateContext\");\r\n if (commandOptions.autoplay === true) {\r\n activate(gain, activationOptions);\r\n }\r\n return commands.activateContext(commandOptions);\r\n },\r\n appendToManualHistory(contextId: string, item: QueueItem) {\r\n reportCommand(activationOptions, \"appendToManualHistory\");\r\n commands.appendToManualHistory(contextId, item);\r\n },\r\n play() {\r\n reportCommand(activationOptions, \"play\");\r\n activate(gain, activationOptions);\r\n return commands.play();\r\n },\r\n pause(options?: PauseOptions) {\r\n reportCommand(activationOptions, \"pause\");\r\n return commands.pause(options);\r\n },\r\n stop(options?: StopOptions) {\r\n reportCommand(activationOptions, \"stop\");\r\n return commands.stop(options);\r\n },\r\n togglePlayback() {\r\n reportCommand(activationOptions, \"togglePlayback\");\r\n activate(gain, activationOptions);\r\n return commands.togglePlayback();\r\n },\r\n seekTo(seconds: number) {\r\n reportCommand(activationOptions, \"seekTo\");\r\n activate(gain, activationOptions);\r\n commands.seekTo(seconds);\r\n },\r\n seekBy(deltaSeconds: number) {\r\n reportCommand(activationOptions, \"seekBy\");\r\n activate(gain, activationOptions);\r\n commands.seekBy(deltaSeconds);\r\n },\r\n setVolume(volume: number) {\r\n reportCommand(activationOptions, \"setVolume\");\r\n commands.setVolume(volume);\r\n },\r\n toggleMute() {\r\n reportCommand(activationOptions, \"toggleMute\");\r\n commands.toggleMute();\r\n },\r\n setShuffle(enabled: boolean) {\r\n reportCommand(activationOptions, \"setShuffle\");\r\n commands.setShuffle(enabled);\r\n },\r\n setRepeatMode(mode: RepeatMode) {\r\n reportCommand(activationOptions, \"setRepeatMode\");\r\n commands.setRepeatMode(mode);\r\n },\r\n next() {\r\n reportCommand(activationOptions, \"next\");\r\n activate(gain, activationOptions);\r\n return commands.next();\r\n },\r\n previous() {\r\n reportCommand(activationOptions, \"previous\");\r\n activate(gain, activationOptions);\r\n return commands.previous();\r\n },\r\n retry() {\r\n reportCommand(activationOptions, \"retry\");\r\n activate(gain, activationOptions);\r\n return commands.retry();\r\n },\r\n clear() {\r\n reportCommand(activationOptions, \"clear\");\r\n return commands.clear();\r\n },\r\n });\r\n}\r\n","import {\r\n createContext,\r\n useEffect,\r\n useRef,\r\n useState,\r\n type ReactNode,\r\n} from \"react\";\r\nimport {\r\n BrowserMediaElementPort,\r\n HtmlMediaElementGainPort,\r\n LazyWebAudioGainPort,\r\n createBrowserMediaSessionController,\r\n resolvePlayerAudioMode,\r\n type PlayerAudioMode,\r\n type ResolvedPlayerAudioMode,\r\n} from \"../adapters/browser\";\r\nimport type {\r\n PlayerCommands,\r\n PlayerExperienceConfig,\r\n PlayerExperienceConfigStore,\r\n PlayerMediaSyncReason,\r\n PlayerStore,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport type {\r\n PlayerMediaEventType,\r\n} from \"../ports/media-element\";\r\nimport { createPlayerStore } from \"../core\";\r\nimport { createGestureAwareCommands } from \"./runtime-commands\";\r\nimport type {\r\n PlayerRuntimeDiagnosticListener,\r\n PlayerRuntimeDiagnosticPayload,\r\n} from \"./runtime-diagnostics\";\r\n\r\nconst DIAGNOSTIC_MEDIA_EVENTS = [\r\n \"loadstart\",\r\n \"loadedmetadata\",\r\n \"canplay\",\r\n \"play\",\r\n \"playing\",\r\n \"pause\",\r\n \"waiting\",\r\n \"stalled\",\r\n \"seeking\",\r\n \"seeked\",\r\n \"timeupdate\",\r\n \"ended\",\r\n \"error\",\r\n \"durationchange\",\r\n \"volumechange\",\r\n] as const satisfies readonly PlayerMediaEventType[];\r\n\r\nconst EMPTY_INITIAL_QUEUE: readonly QueueItem[] = Object.freeze([]);\r\n\r\nexport interface PlayerProviderProps {\r\n readonly children: ReactNode;\r\n /** Read once when the Runtime is created. Later queue changes use commands. */\r\n readonly initialQueue?: readonly QueueItem[];\r\n readonly initialQueueItemId?: string;\r\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\r\n readonly loadingFallback?: ReactNode;\r\n /**\r\n * auto uses native HTML audio on iOS/iPadOS and Web Audio elsewhere.\r\n * Explicit modes exist for real-device comparison and host policy.\r\n */\r\n readonly audioMode?: PlayerAudioMode;\r\n /** Optional host observer. The runtime does not retain diagnostic history. */\r\n readonly onDiagnosticEvent?: PlayerRuntimeDiagnosticListener;\r\n}\r\n\r\nexport interface PlayerRuntimeContextValue {\r\n readonly store: PlayerStore;\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n readonly audioContextState: AudioContextState | \"uninitialized\";\r\n readonly audioMode: ResolvedPlayerAudioMode;\r\n readonly mediaSessionSupported: boolean;\r\n readonly mediaSessionActionsEnabled: boolean;\r\n}\r\n\r\nexport const PlayerRuntimeContext =\r\n createContext<PlayerRuntimeContextValue | null>(null);\r\n\r\nexport function PlayerProvider({\r\n audioMode = \"auto\",\r\n children,\r\n experienceConfig,\r\n initialQueue = EMPTY_INITIAL_QUEUE,\r\n initialQueueItemId,\r\n loadingFallback = null,\r\n onDiagnosticEvent,\r\n}: PlayerProviderProps) {\r\n const audioRef = useRef<HTMLAudioElement>(null);\r\n const initialQueueRef = useRef(initialQueue);\r\n const initialQueueItemIdRef = useRef(initialQueueItemId);\r\n const initialExperienceConfigRef = useRef(experienceConfig);\r\n const diagnosticListenerRef = useRef(onDiagnosticEvent);\r\n const [runtime, setRuntime] =\r\n useState<PlayerRuntimeContextValue | null>(null);\r\n const [audioContextState, setAudioContextState] =\r\n useState<AudioContextState | \"uninitialized\">(\"uninitialized\");\r\n const [resolvedAudioMode, setResolvedAudioMode] =\r\n useState<ResolvedPlayerAudioMode>(\"web-audio\");\r\n const [mediaSessionSupported, setMediaSessionSupported] =\r\n useState(false);\r\n const [\r\n mediaSessionActionsEnabled,\r\n setMediaSessionActionsEnabled,\r\n ] = useState(false);\r\n\r\n useEffect(() => {\r\n diagnosticListenerRef.current = onDiagnosticEvent;\r\n }, [onDiagnosticEvent]);\r\n\r\n useEffect(() => {\r\n const audioElement = audioRef.current;\r\n if (audioElement === null) {\r\n return;\r\n }\r\n\r\n let active = true;\r\n let synchronizeFromLifecycle:\r\n | ((reason: PlayerMediaSyncReason) => void)\r\n | null = null;\r\n const emitDiagnostic = (\r\n event: PlayerRuntimeDiagnosticPayload,\r\n ): void => {\r\n diagnosticListenerRef.current?.({\r\n ...event,\r\n occurredAt: new Date().toISOString(),\r\n });\r\n };\r\n const media = new BrowserMediaElementPort(audioElement);\r\n const navigatorPlatform: unknown = Reflect.get(\r\n navigator,\r\n \"platform\",\r\n );\r\n const nextAudioMode = resolvePlayerAudioMode(audioMode, {\r\n userAgent: navigator.userAgent,\r\n ...(typeof navigatorPlatform === \"string\"\r\n ? { platform: navigatorPlatform }\r\n : {}),\r\n maxTouchPoints: navigator.maxTouchPoints,\r\n });\r\n const gain =\r\n nextAudioMode === \"web-audio\"\r\n ? new LazyWebAudioGainPort(audioElement, {\r\n onContextStateChange: (state) => {\r\n if (active) {\r\n setAudioContextState(state);\r\n emitDiagnostic({\r\n type: \"audio-context-statechange\",\r\n state,\r\n });\r\n synchronizeFromLifecycle?.(\r\n \"audio-context-statechange\",\r\n );\r\n }\r\n },\r\n })\r\n : new HtmlMediaElementGainPort();\r\n setResolvedAudioMode(nextAudioMode);\r\n setAudioContextState(\r\n gain instanceof LazyWebAudioGainPort\r\n ? gain.getContextState()\r\n : \"uninitialized\",\r\n );\r\n const store = createPlayerStore({\r\n gain,\r\n media,\r\n ...(initialExperienceConfigRef.current === undefined\r\n ? {}\r\n : { experienceConfig: initialExperienceConfigRef.current }),\r\n });\r\n let mediaSessionController:\r\n | ReturnType<typeof createBrowserMediaSessionController>\r\n | null = null;\r\n const commands = createGestureAwareCommands(store.commands, gain, {\r\n onUserActivation: () => {\r\n mediaSessionController?.enableActionHandlers();\r\n if (active) {\r\n setMediaSessionActionsEnabled(\r\n mediaSessionController?.actionsEnabled ?? false,\r\n );\r\n }\r\n },\r\n onCommand: (command) => {\r\n emitDiagnostic({ type: \"command\", command });\r\n },\r\n onActivationError: () => {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"failed\",\r\n state:\r\n gain instanceof LazyWebAudioGainPort\r\n ? gain.getContextState()\r\n : \"uninitialized\",\r\n errorCode: \"audio-context\",\r\n });\r\n },\r\n });\r\n mediaSessionController = createBrowserMediaSessionController({\r\n commands,\r\n getState: () => store.getState(),\r\n onAction: (action) => {\r\n emitDiagnostic({\r\n type: \"media-session-action\",\r\n action,\r\n failed: false,\r\n });\r\n },\r\n onActionError: (action) => {\r\n emitDiagnostic({\r\n type: \"media-session-action\",\r\n action,\r\n failed: true,\r\n });\r\n },\r\n });\r\n const activeMediaSessionController = mediaSessionController;\r\n setMediaSessionSupported(activeMediaSessionController.supported);\r\n setMediaSessionActionsEnabled(false);\r\n const unsubscribeMediaSession = store.subscribe(() => {\r\n activeMediaSessionController.update(store.getState());\r\n });\r\n activeMediaSessionController.update(store.getState());\r\n\r\n const synchronize = (reason: PlayerMediaSyncReason): void => {\r\n const resumeAudioContext = async (): Promise<void> => {\r\n if (\r\n !(gain instanceof LazyWebAudioGainPort) ||\r\n gain.getContextState() !== \"suspended\"\r\n ) {\r\n return;\r\n }\r\n try {\r\n const resumed = await gain.resumeIfSuspended();\r\n if (resumed) {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"resumed\",\r\n state: gain.getContextState(),\r\n errorCode: null,\r\n });\r\n }\r\n } catch {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"failed\",\r\n state: gain.getContextState(),\r\n errorCode: \"audio-context\",\r\n });\r\n }\r\n };\r\n\r\n void resumeAudioContext()\r\n .then(() => store.synchronizeFromMedia(reason))\r\n .finally(() => {\r\n if (!active) {\r\n return;\r\n }\r\n if (gain instanceof LazyWebAudioGainPort) {\r\n setAudioContextState(gain.getContextState());\r\n }\r\n activeMediaSessionController.update(store.getState());\r\n emitDiagnostic({\r\n type: \"lifecycle-sync\",\r\n reason,\r\n visibility: document.visibilityState,\r\n media: media.getStateSnapshot(),\r\n });\r\n });\r\n };\r\n synchronizeFromLifecycle = synchronize;\r\n const handleVisibilityChange = (): void => {\r\n if (document.visibilityState === \"visible\") {\r\n synchronize(\"visibilitychange\");\r\n }\r\n };\r\n const handlePageShow = (): void => {\r\n synchronize(\"pageshow\");\r\n };\r\n const handleFocus = (): void => {\r\n synchronize(\"focus\");\r\n };\r\n const mediaEventListeners = new Map<\r\n PlayerMediaEventType,\r\n () => void\r\n >();\r\n for (const eventType of DIAGNOSTIC_MEDIA_EVENTS) {\r\n const listener = (): void => {\r\n emitDiagnostic({\r\n type: \"media-event\",\r\n event: eventType,\r\n media: media.getStateSnapshot(),\r\n });\r\n activeMediaSessionController.update(store.getState());\r\n };\r\n mediaEventListeners.set(eventType, listener);\r\n media.addEventListener(eventType, listener);\r\n }\r\n document.addEventListener(\r\n \"visibilitychange\",\r\n handleVisibilityChange,\r\n );\r\n window.addEventListener(\"pageshow\", handlePageShow);\r\n window.addEventListener(\"focus\", handleFocus);\r\n\r\n const contextValue: PlayerRuntimeContextValue = {\r\n store,\r\n commands,\r\n experience: store.experience,\r\n audioContextState: \"uninitialized\",\r\n audioMode: nextAudioMode,\r\n mediaSessionSupported: activeMediaSessionController.supported,\r\n mediaSessionActionsEnabled: false,\r\n };\r\n\r\n setRuntime(contextValue);\r\n void store.commands.setQueue(initialQueueRef.current, {\r\n ...(initialQueueItemIdRef.current === undefined\r\n ? {}\r\n : { startQueueItemId: initialQueueItemIdRef.current }),\r\n autoplay: false,\r\n });\r\n\r\n return () => {\r\n active = false;\r\n synchronizeFromLifecycle = null;\r\n document.removeEventListener(\r\n \"visibilitychange\",\r\n handleVisibilityChange,\r\n );\r\n window.removeEventListener(\"pageshow\", handlePageShow);\r\n window.removeEventListener(\"focus\", handleFocus);\r\n for (const [eventType, listener] of mediaEventListeners) {\r\n media.removeEventListener(eventType, listener);\r\n }\r\n unsubscribeMediaSession();\r\n activeMediaSessionController.destroy();\r\n setRuntime((current) =>\r\n current?.store === store ? null : current,\r\n );\r\n void store.destroy();\r\n };\r\n }, [\r\n audioMode,\r\n ]);\r\n\r\n const contextValue =\r\n runtime === null\r\n ? null\r\n : {\r\n ...runtime,\r\n audioContextState,\r\n audioMode: resolvedAudioMode,\r\n mediaSessionSupported,\r\n mediaSessionActionsEnabled,\r\n };\r\n\r\n return (\r\n <>\r\n <audio\r\n aria-hidden=\"true\"\r\n data-audio-context-state={audioContextState}\r\n data-audio-mode={resolvedAudioMode}\r\n data-media-session-actions={\r\n mediaSessionActionsEnabled ? \"enabled\" : \"inactive\"\r\n }\r\n data-media-session-supported={\r\n mediaSessionSupported ? \"true\" : \"false\"\r\n }\r\n data-player-audio=\"true\"\r\n preload=\"metadata\"\r\n ref={audioRef}\r\n />\r\n {contextValue === null ? (\r\n loadingFallback\r\n ) : (\r\n <PlayerRuntimeContext.Provider value={contextValue}>\r\n {children}\r\n </PlayerRuntimeContext.Provider>\r\n )}\r\n </>\r\n );\r\n}\r\n","import {\r\n useEffect,\r\n useRef,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nexport interface MiniPlayerHostProps {\r\n readonly children: ReactNode;\r\n readonly visible: boolean;\r\n readonly onInsetChange?: (bottomInsetPx: number) => void;\r\n readonly className?: string;\r\n}\r\n\r\nexport function MiniPlayerHost({\r\n children,\r\n className,\r\n onInsetChange,\r\n visible,\r\n}: MiniPlayerHostProps) {\r\n const hostRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!visible) {\r\n onInsetChange?.(0);\r\n return;\r\n }\r\n\r\n const host = hostRef.current;\r\n if (host === null) {\r\n return;\r\n }\r\n\r\n const publishInset = () => {\r\n onInsetChange?.(Math.ceil(host.getBoundingClientRect().height));\r\n };\r\n publishInset();\r\n\r\n if (typeof ResizeObserver === \"undefined\") {\r\n return () => {\r\n onInsetChange?.(0);\r\n };\r\n }\r\n\r\n const observer = new ResizeObserver(publishInset);\r\n observer.observe(host);\r\n return () => {\r\n observer.disconnect();\r\n onInsetChange?.(0);\r\n };\r\n }, [onInsetChange, visible]);\r\n\r\n if (!visible) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n className={className}\r\n data-player-mini-host=\"true\"\r\n ref={hostRef}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import {\r\n useContext,\r\n useSyncExternalStore,\r\n} from \"react\";\r\nimport type {\r\n PlayerCommands,\r\n PlayerExperienceConfigStore,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport {\r\n PlayerRuntimeContext,\r\n type PlayerRuntimeContextValue,\r\n} from \"./player-provider\";\r\nimport type { ResolvedPlayerAudioMode } from \"../adapters/browser\";\r\n\r\nexport interface UsePlayerResult {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n readonly audioContextState: AudioContextState | \"uninitialized\";\r\n readonly audioMode: ResolvedPlayerAudioMode;\r\n readonly mediaSessionSupported: boolean;\r\n readonly mediaSessionActionsEnabled: boolean;\r\n}\r\n\r\nfunction usePlayerRuntimeContext(): PlayerRuntimeContextValue {\r\n const context = useContext(PlayerRuntimeContext);\r\n if (context === null) {\r\n throw new Error(\"usePlayer must be used inside PlayerProvider.\");\r\n }\r\n return context;\r\n}\r\n\r\nexport function usePlayer(): UsePlayerResult {\r\n const context = usePlayerRuntimeContext();\r\n const state = useSyncExternalStore(\r\n (listener) => context.store.subscribe(listener),\r\n () => context.store.getState(),\r\n () => context.store.getState(),\r\n );\r\n\r\n return {\r\n state,\r\n commands: context.commands,\r\n experience: context.experience,\r\n audioContextState: context.audioContextState,\r\n audioMode: context.audioMode,\r\n mediaSessionSupported: context.mediaSessionSupported,\r\n mediaSessionActionsEnabled:\r\n context.mediaSessionActionsEnabled,\r\n };\r\n}\r\n","import { useMemo } from \"react\";\r\nimport type {\r\n BoundPlayerCommands,\r\n BoundPlayerViewState,\r\n PlaybackContextInput,\r\n PlayerCommandResult,\r\n PlayerState,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { usePlayer } from \"./use-player\";\r\n\r\nexport interface UseBoundPlayerOptions {\r\n readonly context: PlaybackContextInput;\r\n readonly queueItem: QueueItem;\r\n}\r\n\r\nexport interface UseBoundPlayerResult {\r\n readonly state: Readonly<BoundPlayerViewState>;\r\n readonly commands: BoundPlayerCommands;\r\n}\r\n\r\nexport function deriveBoundPlayerViewState(\r\n playerState: Readonly<PlayerState>,\r\n contextId: string,\r\n queueItem: QueueItem,\r\n): Readonly<BoundPlayerViewState> {\r\n const isActive =\r\n playerState.activeContext?.id === contextId &&\r\n playerState.currentQueueItemId === queueItem.queueItemId;\r\n\r\n return Object.freeze({\r\n queueItemId: queueItem.queueItemId,\r\n item: isActive ? playerState.currentItem ?? queueItem.item : queueItem.item,\r\n isActive,\r\n status: isActive ? playerState.status : \"paused\",\r\n currentTimeSec: isActive ? playerState.currentTimeSec : 0,\r\n durationSec: isActive\r\n ? playerState.durationSec\r\n : queueItem.item.durationHintSec ?? null,\r\n canSeek: isActive && playerState.canSeek,\r\n isPlaying: isActive && playerState.status === \"playing\",\r\n });\r\n}\r\n\r\nexport function useBoundPlayer({\r\n context,\r\n queueItem,\r\n}: UseBoundPlayerOptions): UseBoundPlayerResult {\r\n const player = usePlayer();\r\n const state = useMemo(\r\n () => deriveBoundPlayerViewState(player.state, context.id, queueItem),\r\n [context.id, player.state, queueItem],\r\n );\r\n\r\n const commands = useMemo<BoundPlayerCommands>(() => {\r\n const play = (): Promise<PlayerCommandResult> =>\r\n player.commands.activateContext({\r\n contextId: context.id,\r\n mode: context.mode,\r\n ...(context.label === undefined ? {} : { label: context.label }),\r\n queue:\r\n context.mode === \"manual-history\"\r\n ? [queueItem]\r\n : context.queue,\r\n startQueueItemId: queueItem.queueItemId,\r\n autoplay: true,\r\n });\r\n\r\n return Object.freeze({\r\n play,\r\n togglePlayback(): Promise<PlayerCommandResult> {\r\n if (\r\n player.state.activeContext?.id === context.id &&\r\n player.state.currentQueueItemId === queueItem.queueItemId\r\n ) {\r\n return player.commands.togglePlayback();\r\n }\r\n return play();\r\n },\r\n seekTo(seconds: number): void {\r\n if (\r\n player.state.activeContext?.id === context.id &&\r\n player.state.currentQueueItemId === queueItem.queueItemId &&\r\n player.state.canSeek\r\n ) {\r\n player.commands.seekTo(seconds);\r\n }\r\n },\r\n });\r\n }, [context, player.commands, player.state, queueItem]);\r\n\r\n return { state, commands };\r\n}\r\n","import type { ReactNode, SVGProps } from \"react\";\r\n\r\nexport interface PlayerIconProps\r\n extends Omit<SVGProps<SVGSVGElement>, \"children\"> {\r\n readonly size?: number;\r\n}\r\n\r\ninterface IconFrameProps extends PlayerIconProps {\r\n readonly children: ReactNode;\r\n}\r\n\r\nfunction IconFrame({\r\n children,\r\n size = 20,\r\n ...props\r\n}: IconFrameProps) {\r\n return (\r\n <svg\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n viewBox=\"0 0 24 24\"\r\n width={size}\r\n height={size}\r\n fill=\"currentColor\"\r\n {...props}\r\n >\r\n {children}\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PlayIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7 4.8c0-1.05 1.16-1.68 2.04-1.1l11 7.2a1.3 1.3 0 0 1 0 2.2l-11 7.2A1.31 1.31 0 0 1 7 19.2V4.8Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PauseIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"5\" y=\"4\" width=\"5\" height=\"16\" rx=\"0.8\" />\r\n <rect x=\"14\" y=\"4\" width=\"5\" height=\"16\" rx=\"0.8\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PreviousIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"4\" y=\"5\" width=\"3\" height=\"14\" rx=\"0.6\" />\r\n <path d=\"M19 5.3v13.4c0 .93-1.02 1.5-1.82 1.02l-9.7-6.7a1.2 1.2 0 0 1 0-2.04l9.7-6.7A1.19 1.19 0 0 1 19 5.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function NextIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"17\" y=\"5\" width=\"3\" height=\"14\" rx=\"0.6\" />\r\n <path d=\"M5 5.3v13.4c0 .93 1.02 1.5 1.82 1.02l9.7-6.7a1.2 1.2 0 0 0 0-2.04l-9.7-6.7A1.19 1.19 0 0 0 5 5.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function ShuffleIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M17.2 3.7 22 7.5l-4.8 3.8V8.8h-1.9c-1.5 0-2.4.5-3.2 1.6l-3.3 4.5c-1.35 1.84-3.1 2.8-5.8 2.8H2v-3h1c1.7 0 2.55-.43 3.36-1.53l3.32-4.52C11.02 6.82 12.8 5.8 15.3 5.8h1.9V3.7ZM2 6.3h1c2.7 0 4.43.94 5.8 2.8l1.05 1.43-1.87 2.55-1.62-2.25C5.55 9.73 4.7 9.3 3 9.3H2v-3Zm12.08 5.17c.35-.13.75-.2 1.22-.2h1.9V8.7l4.8 3.8-4.8 3.8v-2.03h-1.9c-1.24 0-2.05.34-2.73 1.04l1.51-3.84Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RepeatIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7.3 4h9.2A4.5 4.5 0 0 1 21 8.5V10h-3V8.5A1.5 1.5 0 0 0 16.5 7H7.3v3.1L2 5.55 7.3 1v3Zm9.4 16H7.5A4.5 4.5 0 0 1 3 15.5V14h3v1.5A1.5 1.5 0 0 0 7.5 17h9.2v-3.1l5.3 4.55L16.7 23v-3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RepeatOneIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7.3 3h9.2A4.5 4.5 0 0 1 21 7.5V9h-3V7.5A1.5 1.5 0 0 0 16.5 6H7.3v2.6L2 4.55 7.3.5V3Zm9.4 18H7.5A4.5 4.5 0 0 1 3 16.5V15h3v1.5A1.5 1.5 0 0 0 7.5 18h9.2v-2.6l5.3 4.05-5.3 4.05V21Z\" />\r\n <path d=\"M10.25 9h3.35v7h-2.35v-4.8h-1V9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function QueueIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <circle cx=\"4\" cy=\"6\" r=\"2\" />\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" />\r\n <circle cx=\"4\" cy=\"18\" r=\"2\" />\r\n <rect x=\"8\" y=\"4.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n <rect x=\"8\" y=\"10.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n <rect x=\"8\" y=\"16.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function VolumeIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M3 9h4l5-4.4c.78-.68 2-.13 2 .9v13c0 1.03-1.22 1.58-2 .9L7 15H3V9Zm14.3-1.8a1.5 1.5 0 0 1 2.1.25A7.4 7.4 0 0 1 21 12a7.4 7.4 0 0 1-1.6 4.55 1.5 1.5 0 1 1-2.35-1.86A4.4 4.4 0 0 0 18 12c0-1-.33-1.93-.95-2.69a1.5 1.5 0 0 1 .25-2.11Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function MuteIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M2 9h4l5-4.4c.78-.68 2-.13 2 .9v13c0 1.03-1.22 1.58-2 .9L6 15H2V9Zm13.9-.9L18 10.2l2.1-2.1L22 10l-2.1 2.1L22 14l-1.9 1.9-2.1-2.1-2.1 2.1L14 14l2.1-1.9L14 10l1.9-1.9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PodcastSkipBackIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M8.2 3.2 3 7.4l5.2 4.2V9a7 7 0 1 1-1.55 8.5l-2.73 1.25A10 10 0 1 0 8.2 6V3.2Z\" />\r\n <rect x=\"8.5\" y=\"10\" width=\"2.2\" height=\"6\" rx=\"0.4\" />\r\n <rect x=\"12.2\" y=\"10\" width=\"3.3\" height=\"2\" rx=\"0.4\" />\r\n <rect x=\"13.3\" y=\"11\" width=\"2.2\" height=\"5\" rx=\"0.4\" />\r\n <rect x=\"12.2\" y=\"14\" width=\"3.3\" height=\"2\" rx=\"0.4\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PodcastSkipForwardIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m15.8 3.2 5.2 4.2-5.2 4.2V9a7 7 0 1 0 1.55 8.5l2.73 1.25A10 10 0 1 1 15.8 6V3.2Z\" />\r\n <path d=\"M7.5 10h3.2v2H9.5v1h1.2v3H7.5v-2h1.2v-2H7.5v-2Zm4.3 0H15v6h-3.2v-6Zm2 2h-.8v2h.8v-2Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function CloseIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m5.05 3 6.95 6.95L18.95 3 21 5.05 14.05 12 21 18.95 18.95 21 12 14.05 5.05 21 3 18.95 9.95 12 3 5.05 5.05 3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function DragHandleIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n {[5, 12, 19].flatMap((cx) =>\r\n [7, 17].map((cy) => (\r\n <circle\r\n key={`${String(cx)}-${String(cy)}`}\r\n cx={cx}\r\n cy={cy}\r\n r=\"2\"\r\n />\r\n )),\r\n )}\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RemoveIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20ZM6 10.5h12v3H6v-3Z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RetryIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M19.7 4.3V1L15.5 5.2 19.7 9V7.3A8 8 0 1 1 12 4a1.5 1.5 0 0 0 0-3 11 11 0 1 0 10.7 8.5l-2.88.84A8 8 0 0 1 19.7 4.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function ChevronIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m4 9 8 8 8-8-2.2-2.2L12 12.6 6.2 6.8 4 9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n","import type {\r\n PlayerError,\r\n PlayerState,\r\n RepeatMode,\r\n} from \"../contracts/player\";\r\n\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport function formatTime(seconds: number | null): string {\r\n if (seconds === null || !Number.isFinite(seconds) || seconds < 0) {\r\n return \"--:--\";\r\n }\r\n\r\n const wholeSeconds = Math.floor(seconds);\r\n const hours = Math.floor(wholeSeconds / 3600);\r\n const minutes = Math.floor((wholeSeconds % 3600) / 60);\r\n const remainder = wholeSeconds % 60;\r\n\r\n if (hours > 0) {\r\n return `${String(hours)}:${String(minutes).padStart(2, \"0\")}:${String(remainder).padStart(2, \"0\")}`;\r\n }\r\n\r\n return `${String(minutes).padStart(2, \"0\")}:${String(remainder).padStart(2, \"0\")}`;\r\n}\r\n\r\nexport function formatTimeAria(seconds: number): string {\r\n const safeSeconds = Math.max(0, Math.floor(seconds));\r\n const hours = Math.floor(safeSeconds / 3600);\r\n const minutes = Math.floor((safeSeconds % 3600) / 60);\r\n const remainder = safeSeconds % 60;\r\n const parts = [\r\n hours > 0 ? `${String(hours)} hour${hours === 1 ? \"\" : \"s\"}` : \"\",\r\n minutes > 0 ? `${String(minutes)} minute${minutes === 1 ? \"\" : \"s\"}` : \"\",\r\n `${String(remainder)} second${remainder === 1 ? \"\" : \"s\"}`,\r\n ].filter(Boolean);\r\n return parts.join(\" \");\r\n}\r\n\r\nexport function getRepeatLabel(mode: RepeatMode): string {\r\n switch (mode) {\r\n case \"off\":\r\n return \"Repeat off\";\r\n case \"all\":\r\n return \"Repeat all\";\r\n case \"one\":\r\n return \"Repeat one\";\r\n }\r\n}\r\n\r\nexport function getNextRepeatMode(mode: RepeatMode): RepeatMode {\r\n switch (mode) {\r\n case \"off\":\r\n return \"all\";\r\n case \"all\":\r\n return \"one\";\r\n case \"one\":\r\n return \"off\";\r\n }\r\n}\r\n\r\nexport function getStatusLabel(state: Readonly<PlayerState>): string {\r\n if (state.needsUserGesture) {\r\n return \"Ready to play\";\r\n }\r\n\r\n switch (state.status) {\r\n case \"idle\":\r\n return \"Idle\";\r\n case \"loading\":\r\n return \"Loading\";\r\n case \"playing\":\r\n return \"Playing\";\r\n case \"paused\":\r\n return \"Paused\";\r\n case \"seeking\":\r\n return \"Seeking\";\r\n case \"ended\":\r\n return \"Ended\";\r\n case \"error\":\r\n return \"Playback unavailable\";\r\n }\r\n}\r\n\r\nexport function getErrorMessage(error: PlayerError): string {\r\n switch (error.code) {\r\n case \"autoplay-blocked\":\r\n return \"Playback needs a direct action.\";\r\n case \"network\":\r\n return \"The media could not be reached.\";\r\n case \"cors\":\r\n return \"The media source is not available.\";\r\n case \"decode\":\r\n return \"This media could not be decoded.\";\r\n case \"unsupported\":\r\n return \"This media format is not supported.\";\r\n case \"audio-context\":\r\n return \"Audio output is not available.\";\r\n case \"unknown\":\r\n return \"Playback is currently unavailable.\";\r\n }\r\n}\r\n","import {\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type FocusEvent,\r\n type ReactNode,\r\n} from \"react\";\r\nimport type {\r\n PlayerAppearance,\r\n PlayerCommands,\r\n PlayerMediaItem,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport {\r\n MuteIcon,\r\n NextIcon,\r\n PauseIcon,\r\n PlayIcon,\r\n PreviousIcon,\r\n QueueIcon,\r\n RepeatIcon,\r\n RepeatOneIcon,\r\n RetryIcon,\r\n ShuffleIcon,\r\n VolumeIcon,\r\n} from \"../icons\";\r\nimport {\r\n formatTime,\r\n getErrorMessage,\r\n getNextRepeatMode,\r\n getRepeatLabel,\r\n getStatusLabel,\r\n} from \"./player-utils\";\r\n\r\nexport interface PlayerSurfaceProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly children: ReactNode;\r\n readonly className?: string;\r\n readonly label: string;\r\n}\r\n\r\nexport function PlayerSurface({\r\n appearance,\r\n children,\r\n className,\r\n label,\r\n}: PlayerSurfaceProps) {\r\n return (\r\n <section\r\n aria-label={label}\r\n className={[\"player-surface\", className].filter(Boolean).join(\" \")}\r\n data-appearance={appearance}\r\n >\r\n {children}\r\n </section>\r\n );\r\n}\r\n\r\nexport interface ArtworkProps {\r\n readonly item: PlayerMediaItem | null;\r\n readonly className?: string;\r\n}\r\n\r\nexport function Artwork({ className, item }: ArtworkProps) {\r\n const classes = [\"player-artwork\", className].filter(Boolean).join(\" \");\r\n\r\n if (item?.artwork !== undefined) {\r\n return (\r\n <span className={`${classes} player-artwork--image`}>\r\n <img\r\n alt={item.artwork.alt}\r\n className=\"player-artwork__image\"\r\n decoding=\"async\"\r\n src={item.artwork.url}\r\n />\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n aria-label=\"Artwork unavailable\"\r\n className={`${classes} player-artwork--fallback`}\r\n role=\"img\"\r\n >\r\n <span aria-hidden=\"true\" />\r\n </div>\r\n );\r\n}\r\n\r\nexport interface TrackMetadataProps {\r\n readonly item: PlayerMediaItem | null;\r\n readonly status?: string;\r\n readonly className?: string;\r\n readonly scrollTitle?: boolean;\r\n}\r\n\r\nfunction ScrollingTitle({\r\n enabled,\r\n title,\r\n}: {\r\n readonly enabled: boolean;\r\n readonly title: string;\r\n}) {\r\n const containsJapanese = /[\\u3040-\\u30ff\\u3400-\\u9fff]/u.test(title);\r\n const viewportRef = useRef<HTMLElement>(null);\r\n const contentRef = useRef<HTMLSpanElement>(null);\r\n const [marquee, setMarquee] = useState({\r\n distance: 0,\r\n duration: 10,\r\n overflow: false,\r\n });\r\n\r\n useEffect(() => {\r\n const viewport = viewportRef.current;\r\n const content = contentRef.current;\r\n\r\n if (viewport === null || content === null) {\r\n return;\r\n }\r\n const viewportElement = viewport;\r\n const contentElement = content;\r\n\r\n function measure() {\r\n const viewportWidth = Math.max(\r\n viewportElement.getBoundingClientRect().width,\r\n viewportElement.clientWidth,\r\n );\r\n const contentWidth = Math.max(\r\n contentElement.getBoundingClientRect().width,\r\n contentElement.scrollWidth,\r\n );\r\n const overflow = contentWidth - viewportWidth > 1;\r\n const distance = enabled ? contentWidth + 12 : 0;\r\n setMarquee({\r\n distance,\r\n duration: Math.max(10, distance / 22 + 4),\r\n overflow,\r\n });\r\n }\r\n\r\n measure();\r\n\r\n if (typeof ResizeObserver === \"undefined\") {\r\n window.addEventListener(\"resize\", measure);\r\n return () => {\r\n window.removeEventListener(\"resize\", measure);\r\n };\r\n }\r\n\r\n const observer = new ResizeObserver(measure);\r\n observer.observe(viewportElement);\r\n observer.observe(contentElement);\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [enabled, title]);\r\n\r\n const style = {\r\n \"--player-title-scroll-offset\": `${String(-marquee.distance)}px`,\r\n \"--player-title-scroll-duration\": `${String(marquee.duration)}s`,\r\n } as CSSProperties;\r\n\r\n return (\r\n <strong\r\n className=\"player-title\"\r\n data-overflow={marquee.overflow ? \"true\" : \"false\"}\r\n data-scroll={enabled ? \"true\" : \"false\"}\r\n data-script={containsJapanese ? \"japanese\" : \"latin\"}\r\n ref={viewportRef}\r\n style={style}\r\n >\r\n <span className=\"player-title__text\" ref={contentRef}>\r\n {title}\r\n </span>\r\n </strong>\r\n );\r\n}\r\n\r\nexport function TrackMetadata({\r\n className,\r\n item,\r\n scrollTitle = false,\r\n status,\r\n}: TrackMetadataProps) {\r\n return (\r\n <div\r\n className={[\"player-metadata\", className].filter(Boolean).join(\" \")}\r\n >\r\n {status === undefined ? null : (\r\n <span className=\"player-kicker\">{status}</span>\r\n )}\r\n <ScrollingTitle\r\n enabled={item !== null && scrollTitle}\r\n key={item?.title ?? \"No media selected\"}\r\n title={item?.title ?? \"No media selected\"}\r\n />\r\n <span className=\"player-creator\">\r\n {item === null\r\n ? \"Select media to begin\"\r\n : item.creatorName ?? \"Artist unavailable\"}\r\n </span>\r\n {item?.collectionTitle === undefined ? null : (\r\n <span className=\"player-collection\">{item.collectionTitle}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface TimeReadoutProps {\r\n readonly currentTimeSec: number;\r\n readonly durationSec: number | null;\r\n readonly className?: string;\r\n}\r\n\r\nexport function TimeReadout({\r\n className,\r\n currentTimeSec,\r\n durationSec,\r\n}: TimeReadoutProps) {\r\n return (\r\n <div\r\n aria-label={`${formatTime(currentTimeSec)} of ${formatTime(durationSec)}`}\r\n className={[\"player-time\", className].filter(Boolean).join(\" \")}\r\n >\r\n <time>{formatTime(currentTimeSec)}</time>\r\n <span aria-hidden=\"true\">/</span>\r\n <time>{formatTime(durationSec)}</time>\r\n </div>\r\n );\r\n}\r\n\r\nexport interface IconButtonProps {\r\n readonly label: string;\r\n readonly children: ReactNode;\r\n readonly onClick: () => void;\r\n readonly disabled?: boolean;\r\n readonly pressed?: boolean;\r\n readonly className?: string;\r\n}\r\n\r\nexport function IconButton({\r\n children,\r\n className,\r\n disabled = false,\r\n label,\r\n onClick,\r\n pressed,\r\n}: IconButtonProps) {\r\n return (\r\n <button\r\n aria-label={label}\r\n {...(pressed === undefined ? {} : { \"aria-pressed\": pressed })}\r\n className={[\"player-icon-button\", className].filter(Boolean).join(\" \")}\r\n disabled={disabled}\r\n onClick={onClick}\r\n title={label}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nexport interface PrimaryPlaybackButtonProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly className?: string;\r\n}\r\n\r\nexport function PrimaryPlaybackButton({\r\n className,\r\n commands,\r\n state,\r\n}: PrimaryPlaybackButtonProps) {\r\n const isPlaying = state.status === \"playing\";\r\n const label = isPlaying ? \"Pause\" : \"Play\";\r\n\r\n return (\r\n <IconButton\r\n className={[\r\n \"player-play-button\",\r\n isPlaying ? \"player-play-button--active\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n disabled={state.currentItem === null || state.status === \"loading\"}\r\n label={label}\r\n onClick={() => {\r\n void commands.togglePlayback();\r\n }}\r\n >\r\n {isPlaying ? <PauseIcon size={22} /> : <PlayIcon size={22} />}\r\n </IconButton>\r\n );\r\n}\r\n\r\nexport interface TransportControlsProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly compact?: boolean;\r\n readonly showModes?: boolean;\r\n readonly className?: string;\r\n}\r\n\r\nexport function TransportControls({\r\n className,\r\n commands,\r\n compact = false,\r\n showModes = true,\r\n state,\r\n}: TransportControlsProps) {\r\n const RepeatModeIcon =\r\n state.repeatMode === \"one\" ? RepeatOneIcon : RepeatIcon;\r\n\r\n return (\r\n <div\r\n aria-label=\"Playback controls\"\r\n className={[\r\n \"player-transport\",\r\n compact ? \"player-transport--compact\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n role=\"group\"\r\n >\r\n {showModes ? (\r\n <IconButton\r\n disabled={state.activeContext?.mode === \"manual-history\"}\r\n label={state.shuffleEnabled ? \"Shuffle on\" : \"Shuffle off\"}\r\n onClick={() => {\r\n commands.setShuffle(!state.shuffleEnabled);\r\n }}\r\n pressed={state.shuffleEnabled}\r\n >\r\n <ShuffleIcon />\r\n </IconButton>\r\n ) : null}\r\n <IconButton\r\n disabled={!state.canGoPrevious}\r\n label=\"Previous\"\r\n onClick={() => {\r\n void commands.previous();\r\n }}\r\n >\r\n <PreviousIcon />\r\n </IconButton>\r\n <PrimaryPlaybackButton commands={commands} state={state} />\r\n <IconButton\r\n disabled={!state.canGoNext}\r\n label=\"Next\"\r\n onClick={() => {\r\n void commands.next();\r\n }}\r\n >\r\n <NextIcon />\r\n </IconButton>\r\n {showModes ? (\r\n <IconButton\r\n label={getRepeatLabel(state.repeatMode)}\r\n onClick={() => {\r\n commands.setRepeatMode(\r\n state.activeContext?.mode === \"manual-history\"\r\n ? state.repeatMode === \"one\"\r\n ? \"off\"\r\n : \"one\"\r\n : getNextRepeatMode(state.repeatMode),\r\n );\r\n }}\r\n pressed={state.repeatMode !== \"off\"}\r\n >\r\n <RepeatModeIcon />\r\n </IconButton>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface VolumeControlProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly className?: string;\r\n}\r\n\r\nexport function VolumeControl({\r\n className,\r\n commands,\r\n state,\r\n}: VolumeControlProps) {\r\n const isMuted = state.muted || state.volume === 0;\r\n return (\r\n <div\r\n className={[\"player-volume\", className].filter(Boolean).join(\" \")}\r\n >\r\n <IconButton\r\n label={isMuted ? \"Unmute\" : \"Mute\"}\r\n onClick={() => {\r\n commands.toggleMute();\r\n }}\r\n pressed={state.muted}\r\n >\r\n {isMuted ? <MuteIcon /> : <VolumeIcon />}\r\n </IconButton>\r\n <label>\r\n <span className=\"player-visually-hidden\">Volume</span>\r\n <input\r\n aria-label=\"Volume\"\r\n max={1}\r\n min={0}\r\n onChange={(event) => {\r\n commands.setVolume(Number(event.currentTarget.value));\r\n }}\r\n step={0.01}\r\n type=\"range\"\r\n value={state.volume}\r\n />\r\n </label>\r\n </div>\r\n );\r\n}\r\n\r\nexport interface PopoverVolumeControlProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly label: string;\r\n readonly className?: string;\r\n}\r\n\r\nexport function PopoverVolumeControl({\r\n className,\r\n commands,\r\n label,\r\n state,\r\n}: PopoverVolumeControlProps) {\r\n const [open, setOpen] = useState(false);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const sliderRef = useRef<HTMLInputElement>(null);\r\n const panelId = useId();\r\n const isMuted = state.muted || state.volume === 0;\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n return;\r\n }\r\n\r\n sliderRef.current?.focus();\r\n const closeOnOutsidePointer = (event: PointerEvent) => {\r\n if (\r\n event.target instanceof Node &&\r\n !rootRef.current?.contains(event.target)\r\n ) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener(\"pointerdown\", closeOnOutsidePointer);\r\n return () => {\r\n document.removeEventListener(\"pointerdown\", closeOnOutsidePointer);\r\n };\r\n }, [open]);\r\n\r\n function closeWhenFocusLeaves(event: FocusEvent<HTMLDivElement>) {\r\n if (\r\n event.relatedTarget instanceof Node &&\r\n rootRef.current?.contains(event.relatedTarget)\r\n ) {\r\n return;\r\n }\r\n setOpen(false);\r\n }\r\n\r\n return (\r\n <div\r\n className={[\"player-volume-popover\", className]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n onBlur={closeWhenFocusLeaves}\r\n onKeyDown={(event) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n buttonRef.current?.focus();\r\n }\r\n }}\r\n ref={rootRef}\r\n >\r\n <button\r\n aria-controls={panelId}\r\n aria-expanded={open}\r\n aria-label={`${open ? \"Close\" : \"Open\"} ${label}`}\r\n className=\"player-icon-button\"\r\n onClick={() => {\r\n setOpen((current) => !current);\r\n }}\r\n ref={buttonRef}\r\n title={`${open ? \"Close\" : \"Open\"} ${label}`}\r\n type=\"button\"\r\n >\r\n {isMuted ? <MuteIcon /> : <VolumeIcon />}\r\n </button>\r\n {open ? (\r\n <div\r\n aria-label={label}\r\n className=\"player-volume-popover__panel\"\r\n id={panelId}\r\n role=\"group\"\r\n >\r\n <label>\r\n <span className=\"player-visually-hidden\">{label}</span>\r\n <input\r\n aria-label={label}\r\n max={1}\r\n min={0}\r\n onChange={(event) => {\r\n commands.setVolume(Number(event.currentTarget.value));\r\n }}\r\n ref={sliderRef}\r\n step={0.01}\r\n type=\"range\"\r\n value={state.volume}\r\n />\r\n </label>\r\n <output>{Math.round(state.volume * 100)}</output>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface QueueToggleProps {\r\n readonly onClick: () => void;\r\n readonly expanded?: boolean;\r\n}\r\n\r\nexport function QueueToggle({\r\n expanded = false,\r\n onClick,\r\n}: QueueToggleProps) {\r\n return (\r\n <IconButton\r\n label={expanded ? \"Close queue\" : \"Open queue\"}\r\n onClick={onClick}\r\n pressed={expanded}\r\n >\r\n <QueueIcon />\r\n </IconButton>\r\n );\r\n}\r\n\r\nexport interface PlayerStatusProps {\r\n readonly state: Readonly<PlayerState>;\r\n}\r\n\r\nexport function PlayerStatus({ state }: PlayerStatusProps) {\r\n return (\r\n <span className=\"player-status\" data-status={state.status}>\r\n {getStatusLabel(state)}\r\n </span>\r\n );\r\n}\r\n\r\nexport interface PlayerErrorNoticeProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n}\r\n\r\nexport function PlayerErrorNotice({\r\n commands,\r\n state,\r\n}: PlayerErrorNoticeProps) {\r\n if (state.error === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"player-error\" role=\"alert\">\r\n <span>{getErrorMessage(state.error)}</span>\r\n {state.error.recoverable ? (\r\n <button\r\n onClick={() => {\r\n void commands.retry();\r\n }}\r\n type=\"button\"\r\n >\r\n <RetryIcon size={16} />\r\n Retry\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type {\r\n PlaybackStatus,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport { clamp, formatTimeAria } from \"./player-utils\";\r\n\r\nexport interface SeekBarProps {\r\n readonly currentTimeSec: number;\r\n readonly durationSec: number | null;\r\n readonly canSeek: boolean;\r\n readonly status: PlaybackStatus;\r\n readonly commitMode: SeekCommitMode;\r\n readonly onSeek: (seconds: number) => void;\r\n readonly label?: string;\r\n readonly className?: string;\r\n}\r\n\r\nexport function SeekBar({\r\n canSeek,\r\n className,\r\n commitMode,\r\n currentTimeSec,\r\n durationSec,\r\n label = \"Seek\",\r\n onSeek,\r\n status,\r\n}: SeekBarProps) {\r\n const duration =\r\n durationSec !== null && Number.isFinite(durationSec) && durationSec > 0\r\n ? durationSec\r\n : 0;\r\n const disabled = !canSeek || duration === 0 || status === \"loading\";\r\n const safeCurrentTime = clamp(currentTimeSec, 0, duration);\r\n const [previewTime, setPreviewTime] = useState(safeCurrentTime);\r\n const previewProgress =\r\n duration === 0 ? 0 : clamp(previewTime / duration, 0, 1) * 100;\r\n const isAdjusting = useRef(false);\r\n const lastCommitted = useRef<number | null>(null);\r\n\r\n useEffect(() => {\r\n if (!isAdjusting.current) {\r\n setPreviewTime(safeCurrentTime);\r\n }\r\n }, [safeCurrentTime]);\r\n\r\n function updatePreview(value: number) {\r\n const nextValue = clamp(value, 0, duration);\r\n isAdjusting.current = true;\r\n setPreviewTime(nextValue);\r\n\r\n if (commitMode === \"live\") {\r\n onSeek(nextValue);\r\n lastCommitted.current = nextValue;\r\n }\r\n }\r\n\r\n function commitPreview(value = previewTime) {\r\n const nextValue = clamp(value, 0, duration);\r\n\r\n if (\r\n disabled ||\r\n !isAdjusting.current ||\r\n (commitMode === \"live\" && lastCommitted.current === nextValue)\r\n ) {\r\n isAdjusting.current = false;\r\n return;\r\n }\r\n\r\n onSeek(nextValue);\r\n lastCommitted.current = nextValue;\r\n isAdjusting.current = false;\r\n }\r\n\r\n function cancelPreview() {\r\n isAdjusting.current = false;\r\n lastCommitted.current = null;\r\n setPreviewTime(safeCurrentTime);\r\n }\r\n\r\n return (\r\n <label\r\n className={[\"player-seek\", className].filter(Boolean).join(\" \")}\r\n data-disabled={disabled ? \"true\" : \"false\"}\r\n >\r\n <span className=\"player-visually-hidden\">{label}</span>\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"player-seek__progress\"\r\n style={{ width: `${String(disabled ? 0 : previewProgress)}%` }}\r\n />\r\n <input\r\n aria-label={label}\r\n aria-valuetext={formatTimeAria(previewTime)}\r\n disabled={disabled}\r\n max={duration || 1}\r\n min={0}\r\n onBlur={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n onChange={(event) => {\r\n updatePreview(Number(event.currentTarget.value));\r\n }}\r\n onKeyUp={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n onPointerDown={() => {\r\n isAdjusting.current = true;\r\n }}\r\n onPointerCancel={cancelPreview}\r\n onPointerUp={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n step={0.1}\r\n type=\"range\"\r\n value={disabled ? 0 : previewTime}\r\n />\r\n </label>\r\n );\r\n}\r\n","import { useId } from \"react\";\r\nimport type { PlayerWaveform } from \"../contracts/player\";\r\nimport { clamp } from \"./player-utils\";\r\n\r\nconst FALLBACK_PEAKS = [\r\n 0.16, 0.24, 0.42, 0.3, 0.58, 0.76, 0.48, 0.34, 0.66, 0.88, 0.62, 0.4,\r\n 0.52, 0.72, 0.44, 0.28, 0.56, 0.82, 0.68, 0.38, 0.24, 0.46, 0.32, 0.18,\r\n] as const;\r\nconst BAR_COUNT = 512;\r\nconst VIEWBOX_WIDTH = BAR_COUNT;\r\n\r\nexport interface WaveformProps {\r\n readonly waveform?: PlayerWaveform | undefined;\r\n readonly progress?: number;\r\n readonly playedStateEnabled?: boolean;\r\n readonly opacity?: number;\r\n readonly className?: string;\r\n}\r\n\r\nfunction createWaveformBars(peaks: readonly number[]): readonly number[] {\r\n const source = peaks.length > 1 ? peaks : FALLBACK_PEAKS;\r\n return Array.from({ length: BAR_COUNT }, (_, index) => {\r\n const sourcePosition =\r\n (index / Math.max(BAR_COUNT - 1, 1)) * (source.length - 1);\r\n const leftIndex = Math.floor(sourcePosition);\r\n const rightIndex = Math.min(leftIndex + 1, source.length - 1);\r\n const mix = sourcePosition - leftIndex;\r\n const leftPeak = Math.abs(source[leftIndex] ?? 0);\r\n const rightPeak = Math.abs(source[rightIndex] ?? leftPeak);\r\n const interpolated = leftPeak + (rightPeak - leftPeak) * mix;\r\n\r\n if (source.length >= BAR_COUNT) {\r\n return clamp(Math.pow(interpolated, 1.18), 0.04, 1);\r\n }\r\n\r\n const noiseSeed =\r\n Math.sin((index + 1) * 12.9898 + source.length * 78.233) *\r\n 43_758.5453;\r\n const noise = noiseSeed - Math.floor(noiseSeed);\r\n const fineDetail = 0.76 + noise * 0.34;\r\n const transient = noise > 0.975 ? 3.2 : noise > 0.91 ? 1.75 : 1;\r\n\r\n return clamp(\r\n Math.pow(interpolated, 1.22) * fineDetail * transient,\r\n 0.04,\r\n 1,\r\n );\r\n });\r\n}\r\n\r\nexport function Waveform({\r\n className,\r\n opacity = 1,\r\n playedStateEnabled = true,\r\n progress = 0,\r\n waveform,\r\n}: WaveformProps) {\r\n const clipId = useId().replaceAll(\":\", \"\");\r\n const bars = createWaveformBars(waveform?.peaks ?? FALLBACK_PEAKS);\r\n const progressWidth = clamp(progress, 0, 1) * VIEWBOX_WIDTH;\r\n const classes = [\"player-waveform\", className].filter(Boolean).join(\" \");\r\n const barPath = bars\r\n .map((peak, index) => {\r\n const halfHeight = peak * 47;\r\n const x = index + 0.5;\r\n return `M ${String(x)} ${String(50 - halfHeight)} V ${String(\r\n 50 + halfHeight,\r\n )}`;\r\n })\r\n .join(\" \");\r\n\r\n return (\r\n <svg\r\n aria-hidden=\"true\"\r\n className={classes}\r\n focusable=\"false\"\r\n preserveAspectRatio=\"none\"\r\n style={{ opacity: clamp(opacity, 0, 1), pointerEvents: \"none\" }}\r\n viewBox={`0 0 ${String(VIEWBOX_WIDTH)} 100`}\r\n >\r\n <path className=\"player-waveform__base\" d={barPath} />\r\n {playedStateEnabled ? (\r\n <>\r\n <clipPath id={clipId}>\r\n <rect width={progressWidth} height=\"100\" />\r\n </clipPath>\r\n <path\r\n className=\"player-waveform__played\"\r\n clipPath={`url(#${clipId})`}\r\n d={barPath}\r\n />\r\n </>\r\n ) : null}\r\n </svg>\r\n );\r\n}\r\n","import type {\r\n BoundPlayerCommands,\r\n BoundPlayerViewState,\r\n PlaybackContextMode,\r\n PlayerAppearance,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport { PauseIcon, PlayIcon } from \"../icons\";\r\nimport {\r\n Artwork,\r\n IconButton,\r\n PlayerSurface,\r\n TimeReadout,\r\n TrackMetadata,\r\n} from \"./player-primitives\";\r\nimport { SeekBar } from \"./seek-bar\";\r\nimport { Waveform } from \"./waveform\";\r\n\r\nexport interface BoundCompactPlayerViewOptions {\r\n readonly seekCommitMode: SeekCommitMode;\r\n readonly waveformOpacity: number;\r\n readonly waveformPlayedStateEnabled: boolean;\r\n}\r\n\r\nexport interface BoundCompactPlayerViewProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly commands: BoundPlayerCommands;\r\n readonly state: Readonly<BoundPlayerViewState>;\r\n readonly options: Readonly<BoundCompactPlayerViewOptions>;\r\n readonly className?: string;\r\n readonly contextId?: string;\r\n readonly contextMode?: PlaybackContextMode;\r\n}\r\n\r\nexport function BoundCompactPlayerView({\r\n appearance,\r\n className,\r\n commands,\r\n contextId,\r\n contextMode,\r\n options,\r\n state,\r\n}: BoundCompactPlayerViewProps) {\r\n const progress =\r\n state.durationSec === null || state.durationSec <= 0\r\n ? 0\r\n : state.currentTimeSec / state.durationSec;\r\n\r\n return (\r\n <PlayerSurface\r\n appearance={appearance}\r\n className={[\"player-bound-compact\", className]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n label={`Inline player: ${state.item.title}`}\r\n >\r\n <div\r\n className=\"player-bound-compact__main\"\r\n data-active={state.isActive ? \"true\" : \"false\"}\r\n data-playback-context-id={contextId}\r\n data-playback-context-mode={contextMode}\r\n data-queue-item-id={state.queueItemId}\r\n >\r\n <IconButton\r\n className=\"player-play-button\"\r\n label={state.isPlaying ? \"Pause\" : \"Play\"}\r\n onClick={() => {\r\n void commands.togglePlayback();\r\n }}\r\n >\r\n {state.isPlaying ? (\r\n <PauseIcon size={22} />\r\n ) : (\r\n <PlayIcon size={22} />\r\n )}\r\n </IconButton>\r\n <Artwork\r\n className=\"player-bound-compact__artwork\"\r\n item={state.item}\r\n />\r\n <TrackMetadata item={state.item} scrollTitle={state.isPlaying} />\r\n <div className=\"player-bound-compact__signal\">\r\n <Waveform\r\n opacity={options.waveformOpacity}\r\n playedStateEnabled={options.waveformPlayedStateEnabled}\r\n progress={progress}\r\n waveform={state.item.waveform}\r\n />\r\n <TimeReadout\r\n currentTimeSec={state.currentTimeSec}\r\n durationSec={state.durationSec}\r\n />\r\n </div>\r\n <SeekBar\r\n canSeek={state.canSeek}\r\n commitMode={options.seekCommitMode}\r\n currentTimeSec={state.currentTimeSec}\r\n durationSec={state.durationSec}\r\n label={`Seek in ${state.item.title}`}\r\n onSeek={(seconds) => {\r\n commands.seekTo(seconds);\r\n }}\r\n status={state.status}\r\n />\r\n </div>\r\n </PlayerSurface>\r\n );\r\n}\r\n","import type {\r\n PlaybackContextInput,\r\n PlayerAppearance,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { BoundCompactPlayerView } from \"../ui/bound-compact-player-view\";\r\nimport { useBoundPlayer } from \"./use-bound-player\";\r\nimport { usePlayer } from \"./use-player\";\r\n\r\nexport interface BoundCompactPlayerProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly context: PlaybackContextInput;\r\n readonly queueItem: QueueItem;\r\n readonly className?: string;\r\n}\r\n\r\nexport function BoundCompactPlayer({\r\n appearance,\r\n className,\r\n context,\r\n queueItem,\r\n}: BoundCompactPlayerProps) {\r\n const bound = useBoundPlayer({ context, queueItem });\r\n const player = usePlayer();\r\n\r\n return (\r\n <BoundCompactPlayerView\r\n appearance={appearance}\r\n {...(className === undefined ? {} : { className })}\r\n commands={bound.commands}\r\n contextId={context.id}\r\n contextMode={context.mode}\r\n options={{\r\n seekCommitMode: player.state.experienceConfig.seekCommitMode,\r\n waveformOpacity: player.state.experienceConfig.waveformOpacity,\r\n waveformPlayedStateEnabled:\r\n player.state.experienceConfig.waveformPlayedStateEnabled,\r\n }}\r\n state={bound.state}\r\n />\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/adapters/browser/browser-media-element-port.ts","../../src/adapters/browser/audio-playback-mode.ts","../../src/adapters/browser/lazy-web-audio-gain-port.ts","../../src/adapters/browser/media-session-controller.ts","../../src/config/defaults.ts","../../src/config/validation.ts","../../src/config/initial-state.ts","../../src/core/fade.ts","../../src/core/media-events.ts","../../src/core/persistence.ts","../../src/core/queue.ts","../../src/core/player-reducer.ts","../../src/core/shuffle.ts","../../src/core/create-player-store.ts","../../src/react/player-runtime-bridge.ts","../../src/react/runtime-commands.ts","../../src/react/player-provider.tsx","../../src/react/mini-player-host.tsx","../../src/react/use-player.ts","../../src/react/use-bound-player.ts","../../src/icons/player-icons.tsx","../../src/ui/player-utils.ts","../../src/ui/player-primitives.tsx","../../src/ui/seek-bar.tsx","../../src/ui/waveform.tsx","../../src/ui/bound-compact-player-view.tsx","../../src/react/bound-compact-player.tsx"],"names":["clampVolume","version","useRef","useEffect","jsx","useMemo","jsxs","useState","useId","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["import type {\r\n PlayerError,\r\n PlayerMediaSource,\r\n} from \"../../contracts/player\";\r\nimport type {\r\n MediaElementStateSnapshot,\r\n MediaElementPort,\r\n PlayerMediaEventListener,\r\n PlayerMediaEventType,\r\n} from \"../../ports/media-element\";\r\n\r\nfunction clampVolume(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction classifyMediaError(\r\n mediaError: MediaError | null,\r\n): PlayerError | null {\r\n if (mediaError === null) {\r\n return null;\r\n }\r\n\r\n switch (mediaError.code) {\r\n case MediaError.MEDIA_ERR_NETWORK:\r\n return {\r\n code: \"network\",\r\n recoverable: true,\r\n messageKey: \"player.error.network\",\r\n };\r\n case MediaError.MEDIA_ERR_DECODE:\r\n return {\r\n code: \"decode\",\r\n recoverable: false,\r\n messageKey: \"player.error.decode\",\r\n };\r\n case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\r\n return {\r\n code: \"unsupported\",\r\n recoverable: false,\r\n messageKey: \"player.error.unsupported\",\r\n };\r\n default:\r\n return {\r\n code: \"unknown\",\r\n recoverable: true,\r\n messageKey: \"player.error.unknown\",\r\n };\r\n }\r\n}\r\n\r\nexport class BrowserMediaElementPort implements MediaElementPort {\r\n readonly #element: HTMLAudioElement;\r\n readonly #listeners = new Map<\r\n PlayerMediaEventType,\r\n Map<PlayerMediaEventListener, EventListener>\r\n >();\r\n #assignedSourceUrl: string | null = null;\r\n\r\n constructor(element: HTMLAudioElement) {\r\n this.#element = element;\r\n }\r\n\r\n getCurrentTimeSec(): number {\r\n return Number.isFinite(this.#element.currentTime)\r\n ? Math.max(this.#element.currentTime, 0)\r\n : 0;\r\n }\r\n\r\n getDurationSec(): number | null {\r\n return Number.isFinite(this.#element.duration) && this.#element.duration > 0\r\n ? this.#element.duration\r\n : null;\r\n }\r\n\r\n getVolume(): number {\r\n return clampVolume(this.#element.volume);\r\n }\r\n\r\n isMuted(): boolean {\r\n return this.#element.muted;\r\n }\r\n\r\n isPaused(): boolean {\r\n return this.#element.paused;\r\n }\r\n\r\n getStateSnapshot(): MediaElementStateSnapshot {\r\n const currentSource =\r\n this.#element.currentSrc || this.#element.getAttribute(\"src\") || \"\";\r\n const baseUrl = this.#element.baseURI;\r\n let normalizedCurrentSource = currentSource;\r\n if (currentSource.length > 0) {\r\n try {\r\n normalizedCurrentSource = new URL(\r\n currentSource,\r\n baseUrl,\r\n ).href;\r\n } catch {\r\n // Invalid source remains unequal to the assigned source.\r\n }\r\n }\r\n\r\n return Object.freeze({\r\n currentTimeSec: this.getCurrentTimeSec(),\r\n durationSec: this.getDurationSec(),\r\n volume: this.getVolume(),\r\n muted: this.isMuted(),\r\n paused: this.isPaused(),\r\n ended: this.#element.ended,\r\n hasCurrentSource: currentSource.length > 0,\r\n currentSourceMatchesAssigned:\r\n this.#assignedSourceUrl !== null &&\r\n normalizedCurrentSource === this.#assignedSourceUrl,\r\n });\r\n }\r\n\r\n getError(): PlayerError | null {\r\n return classifyMediaError(this.#element.error);\r\n }\r\n\r\n setSource(source: PlayerMediaSource): void {\r\n this.#element.pause();\r\n this.#element.crossOrigin = source.crossOrigin;\r\n this.#element.src = source.url;\r\n this.#assignedSourceUrl = this.#element.src;\r\n }\r\n\r\n clearSource(): void {\r\n this.#element.pause();\r\n this.#assignedSourceUrl = null;\r\n this.#element.removeAttribute(\"src\");\r\n this.#element.load();\r\n }\r\n\r\n load(): void {\r\n this.#element.load();\r\n }\r\n\r\n async play(): Promise<void> {\r\n await this.#element.play();\r\n }\r\n\r\n pause(): void {\r\n this.#element.pause();\r\n }\r\n\r\n seekTo(seconds: number): void {\r\n if (!Number.isFinite(seconds)) {\r\n return;\r\n }\r\n this.#element.currentTime = Math.max(seconds, 0);\r\n }\r\n\r\n setVolume(volume: number): void {\r\n this.#element.volume = clampVolume(volume);\r\n }\r\n\r\n setMuted(muted: boolean): void {\r\n this.#element.muted = muted;\r\n }\r\n\r\n addEventListener(\r\n type: PlayerMediaEventType,\r\n listener: PlayerMediaEventListener,\r\n ): void {\r\n const typeListeners =\r\n this.#listeners.get(type) ??\r\n new Map<PlayerMediaEventListener, EventListener>();\r\n if (typeListeners.has(listener)) {\r\n return;\r\n }\r\n\r\n const nativeListener: EventListener = () => {\r\n listener({ type });\r\n };\r\n typeListeners.set(listener, nativeListener);\r\n this.#listeners.set(type, typeListeners);\r\n this.#element.addEventListener(type, nativeListener);\r\n }\r\n\r\n removeEventListener(\r\n type: PlayerMediaEventType,\r\n listener: PlayerMediaEventListener,\r\n ): void {\r\n const typeListeners = this.#listeners.get(type);\r\n const nativeListener = typeListeners?.get(listener);\r\n if (nativeListener === undefined) {\r\n return;\r\n }\r\n\r\n this.#element.removeEventListener(type, nativeListener);\r\n typeListeners?.delete(listener);\r\n if (typeListeners?.size === 0) {\r\n this.#listeners.delete(type);\r\n }\r\n }\r\n}\r\n","import type { GainPort } from \"../../ports/gain\";\r\n\r\nexport type PlayerAudioMode = \"auto\" | \"web-audio\" | \"html-media\";\r\nexport type ResolvedPlayerAudioMode = \"web-audio\" | \"html-media\";\r\n\r\nexport interface BrowserAudioPlatform {\r\n readonly userAgent: string;\r\n readonly platform?: string;\r\n readonly maxTouchPoints?: number;\r\n}\r\n\r\nexport function isIOSWebPlatform(\r\n platform: BrowserAudioPlatform,\r\n): boolean {\r\n if (/\\b(iPhone|iPad|iPod)\\b/i.test(platform.userAgent)) {\r\n return true;\r\n }\r\n\r\n return (\r\n platform.platform === \"MacIntel\" &&\r\n (platform.maxTouchPoints ?? 0) > 1\r\n );\r\n}\r\n\r\nexport function resolvePlayerAudioMode(\r\n requested: PlayerAudioMode,\r\n platform: BrowserAudioPlatform,\r\n): ResolvedPlayerAudioMode {\r\n if (requested !== \"auto\") {\r\n return requested;\r\n }\r\n\r\n // iOS/iPadOS background continuity takes priority over fades. Creating a\r\n // MediaElementAudioSourceNode can make output depend on a suspended\r\n // AudioContext, so auto mode keeps native HTML audio on these platforms.\r\n return isIOSWebPlatform(platform) ? \"html-media\" : \"web-audio\";\r\n}\r\n\r\n/**\r\n * Native HTMLAudioElement fallback. Core volume remains on the media element;\r\n * gain transitions resolve immediately, intentionally disabling fades.\r\n */\r\nexport class HtmlMediaElementGainPort implements GainPort {\r\n activateFromUserGesture(): Promise<void> {\r\n // The media element itself is activated by PlayerCommands.play().\r\n return Promise.resolve();\r\n }\r\n\r\n resumeIfSuspended(): Promise<boolean> {\r\n return Promise.resolve(false);\r\n }\r\n\r\n getValue(): number {\r\n return 1;\r\n }\r\n\r\n setValue(): void {\r\n // No separate gain stage in fallback mode.\r\n }\r\n\r\n cancelTransition(): void {\r\n // No scheduled gain work in fallback mode.\r\n }\r\n\r\n transitionTo(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n\r\n destroy(): Promise<void> {\r\n return Promise.resolve();\r\n }\r\n}\r\n","import type { FadeCurve } from \"../../contracts/player\";\r\nimport type {\r\n GainPort,\r\n GainTransition,\r\n} from \"../../ports/gain\";\r\n\r\nexport interface LazyWebAudioGainPortOptions {\r\n readonly createAudioContext?: () => AudioContext;\r\n readonly onContextStateChange?: (state: AudioContextState | \"uninitialized\") => void;\r\n}\r\n\r\ninterface PendingTransition {\r\n readonly timerId: ReturnType<typeof setTimeout>;\r\n readonly resolve: () => void;\r\n}\r\n\r\nconst MIN_TRANSITION_SETTLE_MS = 32;\r\n\r\nfunction clampGain(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction easingProgress(\r\n curve: FadeCurve,\r\n progress: number,\r\n isFadeIn: boolean,\r\n): number {\r\n switch (curve) {\r\n case \"ease-in\":\r\n return progress * progress;\r\n case \"ease-out\":\r\n return 1 - (1 - progress) ** 2;\r\n case \"equal-power\":\r\n return isFadeIn\r\n ? Math.sin((progress * Math.PI) / 2)\r\n : 1 - Math.cos((progress * Math.PI) / 2);\r\n case \"linear\":\r\n return progress;\r\n }\r\n}\r\n\r\nfunction createCurve(\r\n start: number,\r\n target: number,\r\n curve: FadeCurve,\r\n): Float32Array<ArrayBuffer> {\r\n const values = new Float32Array(64);\r\n const isFadeIn = target >= start;\r\n for (let index = 0; index < values.length; index += 1) {\r\n const progress = index / (values.length - 1);\r\n const eased = easingProgress(curve, progress, isFadeIn);\r\n values[index] = start + (target - start) * eased;\r\n }\r\n return values;\r\n}\r\n\r\nfunction transitionSettleMs(context: AudioContext): number {\r\n const contextWithLatency = context as AudioContext & {\r\n readonly baseLatency?: number;\r\n readonly outputLatency?: number;\r\n };\r\n const baseLatency = Number.isFinite(contextWithLatency.baseLatency)\r\n ? Math.max(0, contextWithLatency.baseLatency)\r\n : 0;\r\n const outputLatency = Number.isFinite(contextWithLatency.outputLatency)\r\n ? Math.max(0, contextWithLatency.outputLatency)\r\n : 0;\r\n\r\n return Math.max(\r\n MIN_TRANSITION_SETTLE_MS,\r\n Math.ceil((baseLatency + outputLatency) * 1_000) + 8,\r\n );\r\n}\r\n\r\nexport class LazyWebAudioGainPort implements GainPort {\r\n readonly #element: HTMLAudioElement;\r\n readonly #createAudioContext: () => AudioContext;\r\n readonly #onContextStateChange:\r\n | ((state: AudioContextState | \"uninitialized\") => void)\r\n | undefined;\r\n readonly #pendingTransitions = new Set<PendingTransition>();\r\n\r\n #context: AudioContext | null = null;\r\n #source: MediaElementAudioSourceNode | null = null;\r\n #gain: GainNode | null = null;\r\n #value = 1;\r\n\r\n constructor(\r\n element: HTMLAudioElement,\r\n options: LazyWebAudioGainPortOptions = {},\r\n ) {\r\n this.#element = element;\r\n this.#createAudioContext =\r\n options.createAudioContext ??\r\n (() => {\r\n const audioWindow = window as unknown as {\r\n readonly AudioContext?: typeof AudioContext;\r\n readonly webkitAudioContext?: typeof AudioContext;\r\n };\r\n const AudioContextConstructor =\r\n audioWindow.AudioContext ?? audioWindow.webkitAudioContext;\r\n if (AudioContextConstructor === undefined) {\r\n throw new Error(\"Web Audio is not supported.\");\r\n }\r\n return new AudioContextConstructor();\r\n });\r\n this.#onContextStateChange = options.onContextStateChange;\r\n this.#notifyState();\r\n }\r\n\r\n activateFromUserGesture(): Promise<void> {\r\n if (this.#context === null) {\r\n const context = this.#createAudioContext();\r\n const gain = context.createGain();\r\n const source = context.createMediaElementSource(this.#element);\r\n gain.gain.value = this.#value;\r\n source.connect(gain);\r\n gain.connect(context.destination);\r\n this.#context = context;\r\n this.#source = source;\r\n this.#gain = gain;\r\n context.addEventListener(\"statechange\", this.#notifyState);\r\n this.#notifyState();\r\n }\r\n\r\n if (this.#context.state === \"suspended\") {\r\n return this.#context.resume().then(() => {\r\n this.#notifyState();\r\n });\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n async resumeIfSuspended(): Promise<boolean> {\r\n if (this.#context === null || this.#context.state !== \"suspended\") {\r\n return false;\r\n }\r\n await this.#context.resume();\r\n this.#notifyState();\r\n return true;\r\n }\r\n\r\n getValue(): number {\r\n return this.#gain?.gain.value ?? this.#value;\r\n }\r\n\r\n getContextState(): AudioContextState | \"uninitialized\" {\r\n return this.#context?.state ?? \"uninitialized\";\r\n }\r\n\r\n setValue(value: number): void {\r\n this.cancelTransition();\r\n this.#value = clampGain(value);\r\n if (this.#context !== null && this.#gain !== null) {\r\n const now = this.#context.currentTime;\r\n this.#gain.gain.setValueAtTime(this.#value, now);\r\n }\r\n }\r\n\r\n cancelTransition(): void {\r\n if (this.#context !== null && this.#gain !== null) {\r\n const now = this.#context.currentTime;\r\n const heldValue = this.#gain.gain.value;\r\n this.#gain.gain.cancelScheduledValues(0);\r\n this.#gain.gain.setValueAtTime(heldValue, now);\r\n }\r\n\r\n for (const pending of this.#pendingTransitions) {\r\n clearTimeout(pending.timerId);\r\n pending.resolve();\r\n }\r\n this.#pendingTransitions.clear();\r\n }\r\n\r\n transitionTo(\r\n value: number,\r\n transition: GainTransition,\r\n ): Promise<void> {\r\n const target = clampGain(value);\r\n const durationMs = Math.max(0, transition.durationMs);\r\n\r\n if (this.#context === null || this.#gain === null || durationMs === 0) {\r\n this.setValue(target);\r\n return Promise.resolve();\r\n }\r\n\r\n this.cancelTransition();\r\n const start = this.#gain.gain.value;\r\n const durationSec = durationMs / 1_000;\r\n this.#gain.gain.setValueCurveAtTime(\r\n createCurve(start, target, transition.curve),\r\n this.#context.currentTime,\r\n durationSec,\r\n );\r\n this.#value = target;\r\n\r\n return new Promise((resolve) => {\r\n const pending: PendingTransition = {\r\n timerId: setTimeout(() => {\r\n this.#pendingTransitions.delete(pending);\r\n resolve();\r\n }, durationMs + transitionSettleMs(this.#context as AudioContext)),\r\n resolve,\r\n };\r\n this.#pendingTransitions.add(pending);\r\n });\r\n }\r\n\r\n async destroy(): Promise<void> {\r\n this.cancelTransition();\r\n const context = this.#context;\r\n if (context === null) {\r\n return;\r\n }\r\n\r\n context.removeEventListener(\"statechange\", this.#notifyState);\r\n this.#source?.disconnect();\r\n this.#gain?.disconnect();\r\n this.#source = null;\r\n this.#gain = null;\r\n this.#context = null;\r\n await context.close();\r\n this.#notifyState();\r\n }\r\n\r\n readonly #notifyState = (): void => {\r\n this.#onContextStateChange?.(\r\n this.#context?.state ?? \"uninitialized\",\r\n );\r\n };\r\n}\r\n","import type {\r\n PlayerCommands,\r\n PlayerState,\r\n} from \"../../contracts/player\";\r\n\r\nexport const PLAYER_MEDIA_SESSION_ACTIONS = [\r\n \"play\",\r\n \"pause\",\r\n \"stop\",\r\n \"previoustrack\",\r\n \"nexttrack\",\r\n \"seekto\",\r\n \"seekbackward\",\r\n \"seekforward\",\r\n] as const satisfies readonly MediaSessionAction[];\r\n\r\nconst MUSIC_MEDIA_SESSION_ACTIONS = [\r\n \"play\",\r\n \"pause\",\r\n \"stop\",\r\n \"previoustrack\",\r\n \"nexttrack\",\r\n \"seekto\",\r\n] as const satisfies readonly MediaSessionAction[];\r\n\r\ntype SupportedMediaSessionAction =\r\n (typeof PLAYER_MEDIA_SESSION_ACTIONS)[number];\r\n\r\nexport interface MediaSessionPort {\r\n metadata: MediaMetadata | null;\r\n playbackState: MediaSessionPlaybackState;\r\n setActionHandler(\r\n action: MediaSessionAction,\r\n handler: MediaSessionActionHandler | null,\r\n ): void;\r\n setPositionState(state?: MediaPositionState): void;\r\n}\r\n\r\nexport interface BrowserMediaSessionControllerOptions {\r\n readonly commands: PlayerCommands;\r\n readonly getState: () => Readonly<PlayerState>;\r\n readonly mediaSession?: MediaSessionPort;\r\n readonly createMetadata?: (init: MediaMetadataInit) => MediaMetadata;\r\n readonly onAction?: (action: SupportedMediaSessionAction) => void;\r\n readonly onActionError?: (action: SupportedMediaSessionAction) => void;\r\n}\r\n\r\nfunction observeCommand(\r\n command: Promise<unknown>,\r\n action: SupportedMediaSessionAction,\r\n onError: ((action: SupportedMediaSessionAction) => void) | undefined,\r\n): void {\r\n void command.catch(() => {\r\n onError?.(action);\r\n });\r\n}\r\n\r\nfunction defaultSeekOffset(\r\n state: Readonly<PlayerState>,\r\n direction: \"backward\" | \"forward\",\r\n): number {\r\n if (state.mediaKind !== \"podcastEpisode\") {\r\n return 10;\r\n }\r\n return direction === \"backward\"\r\n ? state.experienceConfig.podcastBackSec\r\n : state.experienceConfig.podcastForwardSec;\r\n}\r\n\r\nfunction playbackStateFor(\r\n state: Readonly<PlayerState>,\r\n): MediaSessionPlaybackState {\r\n if (state.currentItem === null) {\r\n return \"none\";\r\n }\r\n return state.status === \"playing\" ? \"playing\" : \"paused\";\r\n}\r\n\r\nexport class BrowserMediaSessionController {\r\n readonly #commands: PlayerCommands;\r\n readonly #getState: () => Readonly<PlayerState>;\r\n readonly #session: MediaSessionPort | undefined;\r\n readonly #createMetadata:\r\n | ((init: MediaMetadataInit) => MediaMetadata)\r\n | undefined;\r\n readonly #registeredActions = new Set<SupportedMediaSessionAction>();\r\n readonly #onAction:\r\n | ((action: SupportedMediaSessionAction) => void)\r\n | undefined;\r\n readonly #onActionError:\r\n | ((action: SupportedMediaSessionAction) => void)\r\n | undefined;\r\n\r\n #metadataIdentity: string | null = null;\r\n #actionsEnabled = false;\r\n\r\n constructor(options: BrowserMediaSessionControllerOptions) {\r\n this.#commands = options.commands;\r\n this.#getState = options.getState;\r\n this.#session = options.mediaSession;\r\n this.#createMetadata = options.createMetadata;\r\n this.#onAction = options.onAction;\r\n this.#onActionError = options.onActionError;\r\n }\r\n\r\n get supported(): boolean {\r\n return this.#session !== undefined;\r\n }\r\n\r\n get actionsEnabled(): boolean {\r\n return this.#actionsEnabled;\r\n }\r\n\r\n enableActionHandlers(): void {\r\n if (this.#actionsEnabled || this.#session === undefined) {\r\n return;\r\n }\r\n\r\n this.#actionsEnabled = true;\r\n this.#synchronizeActionHandlers(this.#getState());\r\n }\r\n\r\n update(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n try {\r\n session.playbackState = playbackStateFor(state);\r\n } catch {\r\n // Media Session is progressive enhancement.\r\n }\r\n\r\n this.#updateMetadata(state);\r\n this.#updatePosition(state);\r\n if (this.#actionsEnabled) {\r\n this.#synchronizeActionHandlers(state);\r\n }\r\n }\r\n\r\n destroy(): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n for (const action of this.#registeredActions) {\r\n try {\r\n session.setActionHandler(action, null);\r\n } catch {\r\n // Cleanup continues across partially supported implementations.\r\n }\r\n }\r\n this.#registeredActions.clear();\r\n this.#actionsEnabled = false;\r\n\r\n try {\r\n session.metadata = null;\r\n session.playbackState = \"none\";\r\n session.setPositionState();\r\n } catch {\r\n // Document teardown must not fail on Media Session cleanup.\r\n }\r\n }\r\n\r\n #createHandler(\r\n action: SupportedMediaSessionAction,\r\n ): MediaSessionActionHandler {\r\n const reportAction = (): void => {\r\n this.#onAction?.(action);\r\n };\r\n switch (action) {\r\n case \"play\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.play(), action, this.#onActionError);\r\n };\r\n case \"pause\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.pause(), action, this.#onActionError);\r\n };\r\n case \"stop\":\r\n return () => {\r\n reportAction();\r\n observeCommand(\r\n this.#commands.stop({ resetPosition: true }),\r\n action,\r\n this.#onActionError,\r\n );\r\n };\r\n case \"previoustrack\":\r\n return () => {\r\n reportAction();\r\n observeCommand(\r\n this.#commands.previous(),\r\n action,\r\n this.#onActionError,\r\n );\r\n };\r\n case \"nexttrack\":\r\n return () => {\r\n reportAction();\r\n observeCommand(this.#commands.next(), action, this.#onActionError);\r\n };\r\n case \"seekto\":\r\n return (details) => {\r\n reportAction();\r\n if (\r\n details.seekTime !== undefined &&\r\n Number.isFinite(details.seekTime)\r\n ) {\r\n this.#commands.seekTo(details.seekTime);\r\n }\r\n };\r\n case \"seekbackward\":\r\n return (details) => {\r\n reportAction();\r\n const fallback = defaultSeekOffset(\r\n this.#getState(),\r\n \"backward\",\r\n );\r\n const offset =\r\n details.seekOffset !== undefined &&\r\n Number.isFinite(details.seekOffset)\r\n ? Math.max(details.seekOffset, 0)\r\n : fallback;\r\n this.#commands.seekBy(-offset);\r\n };\r\n case \"seekforward\":\r\n return (details) => {\r\n reportAction();\r\n const fallback = defaultSeekOffset(\r\n this.#getState(),\r\n \"forward\",\r\n );\r\n const offset =\r\n details.seekOffset !== undefined &&\r\n Number.isFinite(details.seekOffset)\r\n ? Math.max(details.seekOffset, 0)\r\n : fallback;\r\n this.#commands.seekBy(offset);\r\n };\r\n }\r\n }\r\n\r\n #synchronizeActionHandlers(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n const desiredActions = new Set<SupportedMediaSessionAction>(\r\n state.mediaKind === \"podcastEpisode\"\r\n ? PLAYER_MEDIA_SESSION_ACTIONS\r\n : MUSIC_MEDIA_SESSION_ACTIONS,\r\n );\r\n\r\n for (const action of PLAYER_MEDIA_SESSION_ACTIONS) {\r\n const shouldRegister = desiredActions.has(action);\r\n const isRegistered = this.#registeredActions.has(action);\r\n if (shouldRegister === isRegistered) {\r\n continue;\r\n }\r\n try {\r\n session.setActionHandler(\r\n action,\r\n shouldRegister ? this.#createHandler(action) : null,\r\n );\r\n if (shouldRegister) {\r\n this.#registeredActions.add(action);\r\n } else {\r\n this.#registeredActions.delete(action);\r\n }\r\n } catch {\r\n // Unsupported action handlers must not affect ordinary playback.\r\n }\r\n }\r\n }\r\n\r\n #updateMetadata(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n const item = state.currentItem;\r\n if (session === undefined) {\r\n return;\r\n }\r\n if (item === null) {\r\n if (this.#metadataIdentity !== null) {\r\n try {\r\n session.metadata = null;\r\n } catch {\r\n // Progressive enhancement only.\r\n }\r\n this.#metadataIdentity = null;\r\n }\r\n return;\r\n }\r\n\r\n const identity = [\r\n item.id,\r\n item.title,\r\n item.creatorName ?? \"\",\r\n item.collectionTitle ?? \"\",\r\n item.artwork?.url ?? \"\",\r\n ].join(\"\\u0000\");\r\n if (\r\n identity === this.#metadataIdentity ||\r\n this.#createMetadata === undefined\r\n ) {\r\n return;\r\n }\r\n\r\n try {\r\n session.metadata = this.#createMetadata({\r\n title: item.title,\r\n artist: item.creatorName ?? \"\",\r\n album: item.collectionTitle ?? \"\",\r\n artwork:\r\n item.artwork === undefined\r\n ? []\r\n : [{ src: item.artwork.url }],\r\n });\r\n this.#metadataIdentity = identity;\r\n } catch {\r\n // Metadata failure must not stop audio or action handlers.\r\n }\r\n }\r\n\r\n #updatePosition(state: Readonly<PlayerState>): void {\r\n const session = this.#session;\r\n if (session === undefined) {\r\n return;\r\n }\r\n\r\n const duration = state.durationSec;\r\n if (\r\n duration === null ||\r\n !Number.isFinite(duration) ||\r\n duration <= 0\r\n ) {\r\n try {\r\n session.setPositionState();\r\n } catch {\r\n // Progressive enhancement only.\r\n }\r\n return;\r\n }\r\n\r\n const position = Math.min(\r\n Math.max(\r\n Number.isFinite(state.currentTimeSec)\r\n ? state.currentTimeSec\r\n : 0,\r\n 0,\r\n ),\r\n duration,\r\n );\r\n\r\n try {\r\n session.setPositionState({\r\n duration,\r\n playbackRate: 1,\r\n position,\r\n });\r\n } catch {\r\n // Invalid or unsupported position state must not affect playback.\r\n }\r\n }\r\n}\r\n\r\nexport function createBrowserMediaSessionController(\r\n options: Omit<\r\n BrowserMediaSessionControllerOptions,\r\n \"mediaSession\" | \"createMetadata\"\r\n >,\r\n): BrowserMediaSessionController {\r\n const mediaSession =\r\n typeof navigator !== \"undefined\" && \"mediaSession\" in navigator\r\n ? navigator.mediaSession\r\n : undefined;\r\n const createMetadata =\r\n typeof MediaMetadata === \"function\"\r\n ? (init: MediaMetadataInit) => new MediaMetadata(init)\r\n : undefined;\r\n\r\n return new BrowserMediaSessionController({\r\n ...options,\r\n ...(mediaSession === undefined ? {} : { mediaSession }),\r\n ...(createMetadata === undefined ? {} : { createMetadata }),\r\n });\r\n}\r\n","import type { PlayerExperienceConfig } from \"../contracts/player\";\r\n\r\nexport const PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION = 2 as const;\r\n\r\nexport const PLAYER_EXPERIENCE_CONFIG_LIMITS = Object.freeze({\r\n fadeMs: Object.freeze({ min: 0, max: 10_000 }),\r\n previousRestartThresholdSec: Object.freeze({ min: 0, max: 60 }),\r\n waveformOpacity: Object.freeze({ min: 0, max: 1 }),\r\n initialVolume: Object.freeze({ min: 0, max: 1 }),\r\n podcastSkipSec: Object.freeze({ minExclusive: 0, max: 3_600 }),\r\n});\r\n\r\nexport const PREVIEW_PLAYER_EXPERIENCE_CONFIG: Readonly<PlayerExperienceConfig> =\r\n Object.freeze({\r\n playFadeInMs: 300,\r\n pauseFadeOutMs: 600,\r\n trackChangeFadeOutMs: 300,\r\n trackChangeFadeInMs: 300,\r\n seekFadeMs: 120,\r\n fadeCurve: \"ease-out\",\r\n previousRestartThresholdSec: 3,\r\n seekCommitMode: \"on-release\",\r\n waveformPlayedStateEnabled: true,\r\n waveformOpacity: 0.72,\r\n initialShuffleEnabled: false,\r\n initialRepeatMode: \"off\",\r\n initialVolume: 0.8,\r\n persistMode: \"none\",\r\n podcastBackSec: 15,\r\n podcastForwardSec: 30,\r\n podcastPreviousMode: \"previous-episode\",\r\n });\r\n","import type {\r\n FadeCurve,\r\n PersistMode,\r\n PlayerExperienceConfig,\r\n PodcastPreviousMode,\r\n RepeatMode,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport type { PlayerExperienceConfigValidationResult } from \"../contracts/config\";\r\nimport {\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS,\r\n PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n} from \"./defaults\";\r\n\r\nconst CONFIG_KEYS = [\r\n \"playFadeInMs\",\r\n \"pauseFadeOutMs\",\r\n \"trackChangeFadeOutMs\",\r\n \"trackChangeFadeInMs\",\r\n \"seekFadeMs\",\r\n \"fadeCurve\",\r\n \"previousRestartThresholdSec\",\r\n \"seekCommitMode\",\r\n \"waveformPlayedStateEnabled\",\r\n \"waveformOpacity\",\r\n \"initialShuffleEnabled\",\r\n \"initialRepeatMode\",\r\n \"initialVolume\",\r\n \"persistMode\",\r\n \"podcastBackSec\",\r\n \"podcastForwardSec\",\r\n \"podcastPreviousMode\",\r\n] as const satisfies readonly (keyof PlayerExperienceConfig)[];\r\n\r\nconst FADE_CURVES = new Set<FadeCurve>([\r\n \"linear\",\r\n \"ease-in\",\r\n \"ease-out\",\r\n \"equal-power\",\r\n]);\r\nconst SEEK_COMMIT_MODES = new Set<SeekCommitMode>([\"live\", \"on-release\"]);\r\nconst REPEAT_MODES = new Set<RepeatMode>([\"off\", \"all\", \"one\"]);\r\nconst PERSIST_MODES = new Set<PersistMode>([\"none\", \"session\", \"local\"]);\r\nconst PODCAST_PREVIOUS_MODES = new Set<PodcastPreviousMode>([\r\n \"previous-episode\",\r\n \"restart-episode\",\r\n]);\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction validateFiniteRange(\r\n value: unknown,\r\n path: string,\r\n min: number,\r\n max: number,\r\n errors: string[],\r\n): value is number {\r\n if (\r\n typeof value !== \"number\" ||\r\n !Number.isFinite(value) ||\r\n value < min ||\r\n value > max\r\n ) {\r\n errors.push(\r\n `${path} must be a finite number between ${String(min)} and ${String(max)}.`,\r\n );\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateBoolean(\r\n value: unknown,\r\n path: string,\r\n errors: string[],\r\n): value is boolean {\r\n if (typeof value !== \"boolean\") {\r\n errors.push(`${path} must be a boolean.`);\r\n return false;\r\n }\r\n return true;\r\n}\r\n\r\nfunction validateConfigRecord(\r\n value: unknown,\r\n options: { readonly partial: boolean },\r\n): PlayerExperienceConfigValidationResult {\r\n if (!isRecord(value)) {\r\n return { ok: false, errors: [\"config must be an object.\"] };\r\n }\r\n\r\n const errors: string[] = [];\r\n const allowedKeys = new Set<string>(CONFIG_KEYS);\r\n\r\n for (const key of Object.keys(value)) {\r\n if (!allowedKeys.has(key)) {\r\n errors.push(`config.${key} is not supported.`);\r\n }\r\n }\r\n\r\n if (!options.partial) {\r\n for (const key of CONFIG_KEYS) {\r\n if (!Object.hasOwn(value, key)) {\r\n errors.push(`config.${key} is required.`);\r\n }\r\n }\r\n }\r\n\r\n const has = (key: keyof PlayerExperienceConfig): boolean =>\r\n Object.hasOwn(value, key);\r\n const fadeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.fadeMs;\r\n\r\n for (const key of [\r\n \"playFadeInMs\",\r\n \"pauseFadeOutMs\",\r\n \"trackChangeFadeOutMs\",\r\n \"trackChangeFadeInMs\",\r\n \"seekFadeMs\",\r\n ] as const) {\r\n if (has(key)) {\r\n validateFiniteRange(value[key], `config.${key}`, fadeLimits.min, fadeLimits.max, errors);\r\n }\r\n }\r\n\r\n const thresholdLimits =\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS.previousRestartThresholdSec;\r\n if (has(\"previousRestartThresholdSec\")) {\r\n validateFiniteRange(\r\n value.previousRestartThresholdSec,\r\n \"config.previousRestartThresholdSec\",\r\n thresholdLimits.min,\r\n thresholdLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n const volumeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.initialVolume;\r\n if (has(\"initialVolume\")) {\r\n validateFiniteRange(\r\n value.initialVolume,\r\n \"config.initialVolume\",\r\n volumeLimits.min,\r\n volumeLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n const waveformOpacityLimits =\r\n PLAYER_EXPERIENCE_CONFIG_LIMITS.waveformOpacity;\r\n if (has(\"waveformOpacity\")) {\r\n validateFiniteRange(\r\n value.waveformOpacity,\r\n \"config.waveformOpacity\",\r\n waveformOpacityLimits.min,\r\n waveformOpacityLimits.max,\r\n errors,\r\n );\r\n }\r\n\r\n for (const key of [\r\n \"waveformPlayedStateEnabled\",\r\n \"initialShuffleEnabled\",\r\n ] as const) {\r\n if (has(key)) {\r\n validateBoolean(value[key], `config.${key}`, errors);\r\n }\r\n }\r\n\r\n const skipLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.podcastSkipSec;\r\n for (const key of [\"podcastBackSec\", \"podcastForwardSec\"] as const) {\r\n if (has(key)) {\r\n const candidate = value[key];\r\n const valid = validateFiniteRange(\r\n candidate,\r\n `config.${key}`,\r\n skipLimits.minExclusive,\r\n skipLimits.max,\r\n errors,\r\n );\r\n if (valid && candidate <= skipLimits.minExclusive) {\r\n errors.push(`config.${key} must be greater than 0.`);\r\n }\r\n }\r\n }\r\n\r\n if (has(\"fadeCurve\") && !FADE_CURVES.has(value.fadeCurve as FadeCurve)) {\r\n errors.push(\"config.fadeCurve is not supported.\");\r\n }\r\n if (\r\n has(\"seekCommitMode\") &&\r\n !SEEK_COMMIT_MODES.has(value.seekCommitMode as SeekCommitMode)\r\n ) {\r\n errors.push(\"config.seekCommitMode is not supported.\");\r\n }\r\n if (\r\n has(\"initialRepeatMode\") &&\r\n !REPEAT_MODES.has(value.initialRepeatMode as RepeatMode)\r\n ) {\r\n errors.push(\"config.initialRepeatMode is not supported.\");\r\n }\r\n if (has(\"persistMode\") && !PERSIST_MODES.has(value.persistMode as PersistMode)) {\r\n errors.push(\"config.persistMode is not supported.\");\r\n }\r\n if (\r\n has(\"podcastPreviousMode\") &&\r\n !PODCAST_PREVIOUS_MODES.has(\r\n value.podcastPreviousMode as PodcastPreviousMode,\r\n )\r\n ) {\r\n errors.push(\"config.podcastPreviousMode is not supported.\");\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, errors: Object.freeze(errors) };\r\n }\r\n\r\n const merged = options.partial\r\n ? { ...PREVIEW_PLAYER_EXPERIENCE_CONFIG, ...value }\r\n : value;\r\n\r\n return {\r\n ok: true,\r\n errors: [],\r\n value: Object.freeze({ ...merged }) as Readonly<PlayerExperienceConfig>,\r\n };\r\n}\r\n\r\nexport function validatePlayerExperienceConfig(\r\n value: unknown,\r\n): PlayerExperienceConfigValidationResult {\r\n return validateConfigRecord(value, { partial: false });\r\n}\r\n\r\nexport function validatePlayerExperienceConfigOverride(\r\n value: unknown,\r\n): PlayerExperienceConfigValidationResult {\r\n return validateConfigRecord(value, { partial: true });\r\n}\r\n\r\nexport function resolvePlayerExperienceConfig(\r\n override?: Partial<PlayerExperienceConfig>,\r\n): PlayerExperienceConfigValidationResult {\r\n return validatePlayerExperienceConfigOverride(override ?? {});\r\n}\r\n\r\nexport function parsePlayerExperienceConfigJson(\r\n json: string,\r\n): PlayerExperienceConfigValidationResult {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(json) as unknown;\r\n } catch {\r\n return { ok: false, errors: [\"Config JSON is not valid JSON.\"] };\r\n }\r\n\r\n if (!isRecord(parsed)) {\r\n return { ok: false, errors: [\"Config JSON envelope must be an object.\"] };\r\n }\r\n\r\n const envelopeKeys = Object.keys(parsed);\r\n const errors: string[] = [];\r\n\r\n for (const key of envelopeKeys) {\r\n if (key !== \"schemaVersion\" && key !== \"config\") {\r\n errors.push(`envelope.${key} is not supported.`);\r\n }\r\n }\r\n if (!Object.hasOwn(parsed, \"schemaVersion\")) {\r\n errors.push(\"envelope.schemaVersion is required.\");\r\n } else if (\r\n parsed.schemaVersion !== PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION\r\n ) {\r\n errors.push(\"envelope.schemaVersion is not supported.\");\r\n }\r\n if (!Object.hasOwn(parsed, \"config\")) {\r\n errors.push(\"envelope.config is required.\");\r\n }\r\n\r\n if (errors.length > 0) {\r\n return { ok: false, errors: Object.freeze(errors) };\r\n }\r\n\r\n return validatePlayerExperienceConfig(parsed.config);\r\n}\r\n\r\nexport function serializePlayerExperienceConfig(\r\n config: PlayerExperienceConfig,\r\n): string {\r\n const result = validatePlayerExperienceConfig(config);\r\n\r\n if (!result.ok) {\r\n throw new TypeError(result.errors.join(\" \"));\r\n }\r\n\r\n return JSON.stringify(\r\n {\r\n schemaVersion: PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\r\n config: result.value,\r\n },\r\n null,\r\n 2,\r\n );\r\n}\r\n","import type {\r\n PlayerExperienceConfig,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport { resolvePlayerExperienceConfig } from \"./validation\";\r\n\r\nexport function createInitialPlayerState(\r\n experienceConfig?: Partial<PlayerExperienceConfig>,\r\n): Readonly<PlayerState> {\r\n const resolved = resolvePlayerExperienceConfig(experienceConfig);\r\n\r\n if (!resolved.ok) {\r\n throw new TypeError(resolved.errors.join(\" \"));\r\n }\r\n\r\n return Object.freeze({\r\n currentItem: null,\r\n currentItemId: null,\r\n currentQueueItemId: null,\r\n mediaKind: null,\r\n status: \"idle\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n volume: resolved.value.initialVolume,\r\n muted: false,\r\n shuffleEnabled: resolved.value.initialShuffleEnabled,\r\n repeatMode: resolved.value.initialRepeatMode,\r\n queue: Object.freeze([]),\r\n activeContext: null,\r\n currentQueueIndex: null,\r\n canSeek: false,\r\n canGoPrevious: false,\r\n canGoNext: false,\r\n needsUserGesture: false,\r\n lastTransitionCause: null,\r\n error: null,\r\n experienceConfig: resolved.value,\r\n });\r\n}\r\n","import type { FadeCurve, PlayerError } from \"../contracts/player\";\r\nimport type { GainPort } from \"../ports/gain\";\r\n\r\nexport interface FadeRequest {\r\n readonly target: number;\r\n readonly durationMs: number;\r\n readonly curve: FadeCurve;\r\n}\r\n\r\nexport interface FadeResult {\r\n readonly completed: boolean;\r\n readonly error: PlayerError | null;\r\n}\r\n\r\nconst AUDIO_CONTEXT_ERROR: PlayerError = Object.freeze({\r\n code: \"audio-context\",\r\n recoverable: true,\r\n messageKey: \"player.error.audio-context\",\r\n});\r\n\r\nexport async function runFade(\r\n gain: GainPort | undefined,\r\n request: FadeRequest,\r\n): Promise<FadeResult> {\r\n if (gain === undefined) {\r\n return { completed: true, error: null };\r\n }\r\n\r\n try {\r\n if (request.durationMs <= 0) {\r\n gain.setValue(request.target);\r\n } else {\r\n await gain.transitionTo(request.target, {\r\n durationMs: request.durationMs,\r\n curve: request.curve,\r\n });\r\n }\r\n\r\n return { completed: true, error: null };\r\n } catch {\r\n return { completed: false, error: AUDIO_CONTEXT_ERROR };\r\n }\r\n}\r\n","import type {\r\n PlayerError,\r\n PlayerErrorCode,\r\n} from \"../contracts/player\";\r\nimport type {\r\n MediaElementPort,\r\n PlayerMediaEventType,\r\n} from \"../ports/media-element\";\r\n\r\nexport const PLAYER_MEDIA_EVENT_TYPES: readonly PlayerMediaEventType[] =\r\n Object.freeze([\r\n \"loadstart\",\r\n \"loadedmetadata\",\r\n \"canplay\",\r\n \"play\",\r\n \"playing\",\r\n \"pause\",\r\n \"waiting\",\r\n \"stalled\",\r\n \"seeking\",\r\n \"seeked\",\r\n \"timeupdate\",\r\n \"ended\",\r\n \"error\",\r\n \"durationchange\",\r\n \"volumechange\",\r\n ]);\r\n\r\nconst PLAY_ERROR_DETAILS: Readonly<\r\n Record<string, { code: PlayerErrorCode; recoverable: boolean }>\r\n> = Object.freeze({\r\n NotAllowedError: Object.freeze({\r\n code: \"autoplay-blocked\",\r\n recoverable: true,\r\n }),\r\n NotSupportedError: Object.freeze({\r\n code: \"unsupported\",\r\n recoverable: false,\r\n }),\r\n AbortError: Object.freeze({\r\n code: \"unknown\",\r\n recoverable: true,\r\n }),\r\n});\r\n\r\nexport function createPlayerError(\r\n code: PlayerErrorCode,\r\n recoverable: boolean,\r\n): PlayerError {\r\n return Object.freeze({\r\n code,\r\n recoverable,\r\n messageKey: `player.error.${code}`,\r\n });\r\n}\r\n\r\nexport function classifyPlayError(\r\n error: unknown,\r\n media: MediaElementPort,\r\n): PlayerError {\r\n const mediaError = media.getError();\r\n if (mediaError !== null) {\r\n return mediaError;\r\n }\r\n\r\n const name =\r\n typeof error === \"object\" &&\r\n error !== null &&\r\n \"name\" in error &&\r\n typeof error.name === \"string\"\r\n ? error.name\r\n : \"\";\r\n const detail = PLAY_ERROR_DETAILS[name];\r\n\r\n return detail === undefined\r\n ? createPlayerError(\"unknown\", true)\r\n : createPlayerError(detail.code, detail.recoverable);\r\n}\r\n\r\nexport function readFiniteCurrentTime(media: MediaElementPort): number {\r\n const value = media.getCurrentTimeSec();\r\n return Number.isFinite(value) && value >= 0 ? value : 0;\r\n}\r\n\r\nexport function readFiniteDuration(\r\n media: MediaElementPort,\r\n): number | null {\r\n const value = media.getDurationSec();\r\n return value !== null && Number.isFinite(value) && value >= 0 ? value : null;\r\n}\r\n","import type { PlayerMediaItem } from \"../contracts/player\";\r\nimport type {\r\n PodcastProgress,\r\n PodcastProgressPort,\r\n} from \"../ports/persistence\";\r\n\r\nexport const DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC = 5;\r\n\r\nexport function isUsablePodcastProgress(\r\n progress: PodcastProgress | null,\r\n item: PlayerMediaItem,\r\n): progress is PodcastProgress {\r\n return (\r\n progress !== null &&\r\n progress.itemId === item.id &&\r\n Number.isFinite(progress.positionSec) &&\r\n progress.positionSec >= 0\r\n );\r\n}\r\n\r\nexport function createPodcastProgress(\r\n item: PlayerMediaItem,\r\n positionSec: number,\r\n now: () => Date,\r\n): PodcastProgress {\r\n return Object.freeze({\r\n itemId: item.id,\r\n positionSec,\r\n updatedAt: now().toISOString(),\r\n });\r\n}\r\n\r\nexport function canUsePodcastProgress(\r\n item: PlayerMediaItem | null,\r\n port: PodcastProgressPort | undefined,\r\n persistMode: \"none\" | \"session\" | \"local\",\r\n): item is PlayerMediaItem {\r\n return (\r\n item !== null &&\r\n item.kind === \"podcastEpisode\" &&\r\n port !== undefined &&\r\n persistMode !== \"none\"\r\n );\r\n}\r\n","import type {\r\n PlayerMediaItem,\r\n QueueItem,\r\n RepeatMode,\r\n} from \"../contracts/player\";\r\n\r\nexport function createLoadedQueueItem(item: PlayerMediaItem): QueueItem {\r\n return Object.freeze({\r\n queueItemId: `loaded:${item.id}`,\r\n item,\r\n });\r\n}\r\n\r\nexport function freezeQueue(\r\n queue: readonly QueueItem[],\r\n): readonly QueueItem[] {\r\n return Object.freeze([...queue]);\r\n}\r\n\r\nexport function findQueueIndex(\r\n queue: readonly QueueItem[],\r\n queueItemId: string,\r\n): number | null {\r\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\r\n return index < 0 ? null : index;\r\n}\r\n\r\nexport function hasUniqueQueueItemIds(queue: readonly QueueItem[]): boolean {\r\n return new Set(queue.map((entry) => entry.queueItemId)).size === queue.length;\r\n}\r\n\r\nexport function getNextQueueIndex(\r\n queue: readonly unknown[],\r\n currentIndex: number,\r\n repeatMode: RepeatMode,\r\n): number | null {\r\n if (queue.length === 0 || currentIndex < 0) {\r\n return null;\r\n }\r\n\r\n if (currentIndex < queue.length - 1) {\r\n return currentIndex + 1;\r\n }\r\n\r\n return repeatMode === \"all\" ? 0 : null;\r\n}\r\n\r\nexport function getPreviousQueueIndex(\r\n queue: readonly unknown[],\r\n currentIndex: number,\r\n): number | null {\r\n if (queue.length === 0 || currentIndex <= 0) {\r\n return null;\r\n }\r\n\r\n return currentIndex - 1;\r\n}\r\n","import type {\r\n PlaybackContextState,\r\n PlayerState,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { freezeQueue } from \"./queue\";\r\n\r\nexport type PlayerStatePatch = Partial<PlayerState>;\r\n\r\nfunction deriveCurrentIndex(\r\n queue: readonly QueueItem[],\r\n queueItemId: string | null,\r\n): number | null {\r\n if (queueItemId === null) {\r\n return null;\r\n }\r\n\r\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\r\n return index < 0 ? null : index;\r\n}\r\n\r\nfunction synchronizeActiveContext(\r\n context: PlaybackContextState | null,\r\n queue: readonly QueueItem[],\r\n currentQueueItemId: string | null,\r\n): PlaybackContextState | null {\r\n if (context === null) {\r\n return null;\r\n }\r\n\r\n return Object.freeze({\r\n ...context,\r\n queue,\r\n currentQueueItemId,\r\n });\r\n}\r\n\r\nexport function createPlayerSnapshot(\r\n previous: Readonly<PlayerState>,\r\n patch: PlayerStatePatch,\r\n): Readonly<PlayerState> {\r\n const queue =\r\n patch.queue === undefined ? previous.queue : freezeQueue(patch.queue);\r\n const currentQueueItemId =\r\n patch.currentQueueItemId === undefined\r\n ? previous.currentQueueItemId\r\n : patch.currentQueueItemId;\r\n const currentQueueIndex = deriveCurrentIndex(queue, currentQueueItemId);\r\n const repeatMode = patch.repeatMode ?? previous.repeatMode;\r\n const currentItem =\r\n patch.currentItem === undefined ? previous.currentItem : patch.currentItem;\r\n const activeContext = synchronizeActiveContext(\r\n patch.activeContext === undefined\r\n ? previous.activeContext\r\n : patch.activeContext,\r\n queue,\r\n currentQueueItemId,\r\n );\r\n\r\n return Object.freeze({\r\n ...previous,\r\n ...patch,\r\n queue,\r\n activeContext,\r\n currentQueueItemId,\r\n currentQueueIndex,\r\n canGoPrevious: patch.canGoPrevious ?? currentItem !== null,\r\n canGoNext:\r\n patch.canGoNext ??\r\n (currentQueueIndex !== null &&\r\n (currentQueueIndex < queue.length - 1 ||\r\n (queue.length > 0 && repeatMode === \"all\"))),\r\n });\r\n}\r\n","import type { QueueItem } from \"../contracts/player\";\r\n\r\nexport type PlayerRandomSource = () => number;\r\n\r\nfunction normalizeRandom(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.min(Math.max(value, 0), 0.999_999_999_999);\r\n}\r\n\r\nexport function shuffleQueueAroundCurrent(\r\n queue: readonly QueueItem[],\r\n currentQueueItemId: string,\r\n random: PlayerRandomSource,\r\n): readonly QueueItem[] {\r\n const current = queue.find(\r\n (entry) => entry.queueItemId === currentQueueItemId,\r\n );\r\n\r\n if (current === undefined) {\r\n return Object.freeze([...queue]);\r\n }\r\n\r\n const remaining = queue.filter(\r\n (entry) => entry.queueItemId !== currentQueueItemId,\r\n );\r\n\r\n for (let index = remaining.length - 1; index > 0; index -= 1) {\r\n const swapIndex = Math.floor(normalizeRandom(random()) * (index + 1));\r\n const candidate = remaining[index];\r\n const replacement = remaining[swapIndex];\r\n\r\n if (candidate !== undefined && replacement !== undefined) {\r\n remaining[index] = replacement;\r\n remaining[swapIndex] = candidate;\r\n }\r\n }\r\n\r\n return Object.freeze([current, ...remaining]);\r\n}\r\n","import {\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n createInitialPlayerState,\r\n validatePlayerExperienceConfig,\r\n} from \"../config\";\r\nimport type {\r\n ActivatePlaybackContextOptions,\r\n PauseOptions,\r\n PlaybackContextState,\r\n PlayerCommandResult,\r\n PlayerCommands,\r\n PlayerError,\r\n PlayerExperienceConfig,\r\n PlayerExperienceConfigStore,\r\n PlayerMediaItem,\r\n PlayerMediaSyncReason,\r\n PlayerState,\r\n PlayerStore,\r\n QueueItem,\r\n RepeatMode,\r\n SetQueueOptions,\r\n StopOptions,\r\n} from \"../contracts/player\";\r\nimport type { GainPort } from \"../ports/gain\";\r\nimport type {\r\n MediaElementPort,\r\n PlayerMediaEvent,\r\n} from \"../ports/media-element\";\r\nimport type { PodcastProgressPort } from \"../ports/persistence\";\r\nimport { runFade } from \"./fade\";\r\nimport {\r\n PLAYER_MEDIA_EVENT_TYPES,\r\n classifyPlayError,\r\n createPlayerError,\r\n readFiniteCurrentTime,\r\n readFiniteDuration,\r\n} from \"./media-events\";\r\nimport {\r\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC,\r\n canUsePodcastProgress,\r\n createPodcastProgress,\r\n isUsablePodcastProgress,\r\n} from \"./persistence\";\r\nimport { createPlayerSnapshot } from \"./player-reducer\";\r\nimport {\r\n createLoadedQueueItem,\r\n findQueueIndex,\r\n freezeQueue,\r\n getNextQueueIndex,\r\n getPreviousQueueIndex,\r\n hasUniqueQueueItemIds,\r\n} from \"./queue\";\r\nimport {\r\n shuffleQueueAroundCurrent,\r\n type PlayerRandomSource,\r\n} from \"./shuffle\";\r\n\r\nexport interface CreatePlayerStoreOptions {\r\n readonly media: MediaElementPort;\r\n readonly gain?: GainPort;\r\n readonly podcastProgress?: PodcastProgressPort;\r\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\r\n readonly random?: PlayerRandomSource;\r\n readonly now?: () => Date;\r\n readonly podcastProgressSaveIntervalSec?: number;\r\n}\r\n\r\ntype Listener = () => void;\r\ntype DesiredPlayback = \"playing\" | \"paused\";\r\n\r\nconst OK_RESULT: PlayerCommandResult = Object.freeze({ ok: true });\r\nconst NO_ITEM_ERROR = createPlayerError(\"unknown\", false);\r\nconst INVALID_QUEUE_ERROR: PlayerError = Object.freeze({\r\n code: \"unknown\",\r\n recoverable: false,\r\n messageKey: \"player.error.invalid-queue\",\r\n});\r\nconst DESTROYED_ERROR: PlayerError = Object.freeze({\r\n code: \"unknown\",\r\n recoverable: false,\r\n messageKey: \"player.error.destroyed\",\r\n});\r\nconst MAX_SHUFFLE_HISTORY_ITEMS = 512;\r\nconst RETAINED_SHUFFLE_HISTORY_ITEMS = 128;\r\n\r\nfunction failed(error: PlayerError): PlayerCommandResult {\r\n return Object.freeze({ ok: false, error });\r\n}\r\n\r\nfunction clampVolume(value: number): number {\r\n if (!Number.isFinite(value)) {\r\n return 0;\r\n }\r\n\r\n return Math.min(Math.max(value, 0), 1);\r\n}\r\n\r\nfunction sourcesMatch(\r\n left: PlayerMediaItem[\"source\"],\r\n right: PlayerMediaItem[\"source\"],\r\n): boolean {\r\n return (\r\n left.url === right.url &&\r\n left.mimeType === right.mimeType\r\n );\r\n}\r\n\r\nclass CorePlayerStore implements PlayerStore {\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n\r\n readonly #media: MediaElementPort;\r\n readonly #gain: GainPort | undefined;\r\n readonly #podcastProgress: PodcastProgressPort | undefined;\r\n readonly #random: PlayerRandomSource;\r\n readonly #now: () => Date;\r\n readonly #podcastProgressSaveIntervalSec: number;\r\n readonly #listeners = new Set<Listener>();\r\n readonly #experienceListeners = new Set<Listener>();\r\n readonly #mediaListener = (event: PlayerMediaEvent): void => {\r\n this.#handleMediaEvent(event);\r\n };\r\n\r\n #state: Readonly<PlayerState>;\r\n #playbackOrderQueueItemIds: readonly string[] = Object.freeze([]);\r\n #playbackOrderCursor = -1;\r\n #commandVersion = 0;\r\n #desiredPlayback: DesiredPlayback = \"paused\";\r\n #ignoreNextPauseEvent = false;\r\n #handlingEnded = false;\r\n #destroyed = false;\r\n #lastSavedPodcastPositions = new Map<string, number>();\r\n #progressSaveChain: Promise<void> = Promise.resolve();\r\n\r\n constructor(options: CreatePlayerStoreOptions) {\r\n this.#media = options.media;\r\n this.#gain = options.gain;\r\n this.#podcastProgress = options.podcastProgress;\r\n this.#random = options.random ?? Math.random;\r\n this.#now = options.now ?? (() => new Date());\r\n this.#podcastProgressSaveIntervalSec =\r\n options.podcastProgressSaveIntervalSec ??\r\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC;\r\n\r\n if (\r\n !Number.isFinite(this.#podcastProgressSaveIntervalSec) ||\r\n this.#podcastProgressSaveIntervalSec <= 0\r\n ) {\r\n throw new RangeError(\r\n \"podcastProgressSaveIntervalSec must be a positive finite number.\",\r\n );\r\n }\r\n\r\n this.#state = createInitialPlayerState(options.experienceConfig);\r\n this.#media.setVolume(this.#state.volume);\r\n this.#media.setMuted(this.#state.muted);\r\n try {\r\n this.#gain?.setValue(1);\r\n } catch {\r\n this.#state = createPlayerSnapshot(this.#state, {\r\n error: createPlayerError(\"audio-context\", true),\r\n });\r\n }\r\n\r\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\r\n this.#media.addEventListener(eventType, this.#mediaListener);\r\n }\r\n\r\n const commands: PlayerCommands = {\r\n load: (item) => this.#load(item),\r\n setQueue: (queue, commandOptions) =>\r\n this.#setQueue(queue, commandOptions),\r\n activateContext: (commandOptions) =>\r\n this.#activateContext(commandOptions),\r\n appendToManualHistory: (contextId, item) => {\r\n this.#appendToManualHistory(contextId, item);\r\n },\r\n play: () => this.#play(),\r\n pause: (commandOptions) => this.#pause(commandOptions),\r\n stop: (commandOptions) => this.#stop(commandOptions),\r\n togglePlayback: () => this.#togglePlayback(),\r\n seekTo: (seconds) => {\r\n this.#seekTo(seconds);\r\n },\r\n seekBy: (deltaSeconds) => {\r\n this.#seekBy(deltaSeconds);\r\n },\r\n setVolume: (volume) => {\r\n this.#setVolume(volume);\r\n },\r\n toggleMute: () => {\r\n this.#toggleMute();\r\n },\r\n setShuffle: (enabled) => {\r\n this.#setShuffle(enabled);\r\n },\r\n setRepeatMode: (mode) => {\r\n this.#setRepeatMode(mode);\r\n },\r\n next: () => this.#next(),\r\n previous: () => this.#previous(),\r\n retry: () => this.#retry(),\r\n clear: () => this.#clear(),\r\n };\r\n this.commands = Object.freeze(commands);\r\n\r\n const experience: PlayerExperienceConfigStore = {\r\n getConfig: () => this.#state.experienceConfig,\r\n updateConfig: (patch) => {\r\n this.#updateExperienceConfig(patch);\r\n },\r\n resetConfig: () => {\r\n this.#replaceExperienceConfig(PREVIEW_PLAYER_EXPERIENCE_CONFIG);\r\n },\r\n subscribe: (listener) =>\r\n this.#subscribeTo(this.#experienceListeners, listener),\r\n };\r\n this.experience = Object.freeze(experience);\r\n }\r\n\r\n getState(): PlayerState {\r\n return this.#state;\r\n }\r\n\r\n subscribe(listener: Listener): () => void {\r\n return this.#subscribeTo(this.#listeners, listener);\r\n }\r\n\r\n async synchronizeFromMedia(\r\n reason: PlayerMediaSyncReason,\r\n ): Promise<void> {\r\n if (this.#destroyed || this.#state.currentItem === null) {\r\n return;\r\n }\r\n\r\n const snapshot = this.#media.getStateSnapshot();\r\n if (\r\n !snapshot.hasCurrentSource ||\r\n !snapshot.currentSourceMatchesAssigned\r\n ) {\r\n const error = createPlayerError(\"unknown\", true);\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error,\r\n });\r\n return;\r\n }\r\n\r\n if (snapshot.ended) {\r\n await this.#handleEnded();\r\n return;\r\n }\r\n\r\n const wasPlaying = this.#state.status === \"playing\";\r\n const externallyPaused = wasPlaying && snapshot.paused;\r\n this.#desiredPlayback = snapshot.paused ? \"paused\" : \"playing\";\r\n this.#setState({\r\n status: snapshot.paused ? \"paused\" : \"playing\",\r\n currentTimeSec: snapshot.currentTimeSec,\r\n durationSec: snapshot.durationSec,\r\n volume: clampVolume(snapshot.volume),\r\n muted: snapshot.muted,\r\n canSeek: snapshot.durationSec !== null,\r\n ...(externallyPaused\r\n ? {\r\n lastTransitionCause:\r\n reason === \"visibilitychange\" ||\r\n reason === \"pageshow\" ||\r\n reason === \"focus\" ||\r\n reason === \"audio-context-statechange\"\r\n ? (\"background-suspension\" as const)\r\n : (\"os-interruption\" as const),\r\n }\r\n : {}),\r\n });\r\n }\r\n\r\n async destroy(): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n await this.#clear();\r\n this.#destroyed = true;\r\n this.#commandVersion += 1;\r\n try {\r\n this.#gain?.cancelTransition();\r\n } catch {\r\n // Listener and resource cleanup must continue after gain failure.\r\n }\r\n\r\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\r\n this.#media.removeEventListener(eventType, this.#mediaListener);\r\n }\r\n\r\n await this.#progressSaveChain;\r\n await this.#gain?.destroy();\r\n this.#listeners.clear();\r\n this.#experienceListeners.clear();\r\n }\r\n\r\n #subscribeTo(collection: Set<Listener>, listener: Listener): () => void {\r\n if (this.#destroyed) {\r\n return () => undefined;\r\n }\r\n\r\n collection.add(listener);\r\n return () => {\r\n collection.delete(listener);\r\n };\r\n }\r\n\r\n #setState(patch: Partial<PlayerState>): void {\r\n const queue = patch.queue ?? this.#state.queue;\r\n const currentItem =\r\n patch.currentItem === undefined\r\n ? this.#state.currentItem\r\n : patch.currentItem;\r\n const currentQueueItemId =\r\n patch.currentQueueItemId === undefined\r\n ? this.#state.currentQueueItemId\r\n : patch.currentQueueItemId;\r\n const repeatMode = patch.repeatMode ?? this.#state.repeatMode;\r\n const playbackIndex =\r\n currentQueueItemId === null ? -1 : this.#playbackOrderCursor;\r\n this.#state = createPlayerSnapshot(this.#state, {\r\n ...patch,\r\n canGoPrevious: currentItem !== null,\r\n canGoNext:\r\n playbackIndex >= 0 &&\r\n (playbackIndex < this.#playbackOrderQueueItemIds.length - 1 ||\r\n (this.#playbackOrderQueueItemIds.length > 0 &&\r\n repeatMode === \"all\")),\r\n queue,\r\n });\r\n for (const listener of this.#listeners) {\r\n listener();\r\n }\r\n }\r\n\r\n #beginCommand(desiredPlayback = this.#desiredPlayback): number {\r\n this.#commandVersion += 1;\r\n this.#desiredPlayback = desiredPlayback;\r\n\r\n try {\r\n this.#gain?.cancelTransition();\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n\r\n return this.#commandVersion;\r\n }\r\n\r\n #isCurrentCommand(version: number): boolean {\r\n return !this.#destroyed && version === this.#commandVersion;\r\n }\r\n\r\n #pauseMediaElement(): void {\r\n if (!this.#media.isPaused()) {\r\n this.#ignoreNextPauseEvent = true;\r\n }\r\n this.#media.pause();\r\n }\r\n\r\n #replaceExperienceConfig(\r\n config: Readonly<PlayerExperienceConfig>,\r\n ): void {\r\n const result = validatePlayerExperienceConfig(config);\r\n if (!result.ok) {\r\n throw new TypeError(result.errors.join(\" \"));\r\n }\r\n\r\n this.#setState({ experienceConfig: result.value });\r\n for (const listener of this.#experienceListeners) {\r\n listener();\r\n }\r\n }\r\n\r\n #updateExperienceConfig(\r\n patch: Partial<PlayerExperienceConfig>,\r\n ): void {\r\n this.#replaceExperienceConfig({\r\n ...this.#state.experienceConfig,\r\n ...patch,\r\n });\r\n }\r\n\r\n async #load(item: PlayerMediaItem): Promise<PlayerCommandResult> {\r\n return this.#setQueue([createLoadedQueueItem(item)]);\r\n }\r\n\r\n async #setQueue(\r\n queue: readonly QueueItem[],\r\n options: SetQueueOptions = {},\r\n activeContext?: PlaybackContextState,\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n if (!hasUniqueQueueItemIds(queue)) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n if (queue.length === 0) {\r\n await this.#clear();\r\n return OK_RESULT;\r\n }\r\n\r\n const normalizedQueue = freezeQueue(queue);\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n const currentStillExists =\r\n currentQueueItemId !== null &&\r\n findQueueIndex(normalizedQueue, currentQueueItemId) !== null;\r\n const startQueueItemId =\r\n options.startQueueItemId ??\r\n (currentStillExists\r\n ? currentQueueItemId\r\n : normalizedQueue[0]?.queueItemId);\r\n const startIndex =\r\n startQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(normalizedQueue, startQueueItemId);\r\n\r\n if (startIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const selected = normalizedQueue[startIndex];\r\n if (selected === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const preservePlayback =\r\n options.reload !== true &&\r\n currentQueueItemId === selected.queueItemId &&\r\n this.#state.currentItem !== null &&\r\n sourcesMatch(this.#state.currentItem.source, selected.item.source);\r\n const targetContext = activeContext ?? this.#state.activeContext;\r\n const manualHistory = targetContext?.mode === \"manual-history\";\r\n const shuffleEnabled = manualHistory\r\n ? false\r\n : this.#state.shuffleEnabled;\r\n const repeatMode =\r\n manualHistory && this.#state.repeatMode === \"all\"\r\n ? \"off\"\r\n : this.#state.repeatMode;\r\n const playbackQueue =\r\n shuffleEnabled && startQueueItemId !== undefined\r\n ? shuffleQueueAroundCurrent(\r\n normalizedQueue,\r\n startQueueItemId,\r\n this.#random,\r\n )\r\n : normalizedQueue;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n playbackQueue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor = shuffleEnabled\r\n ? 0\r\n : startIndex;\r\n\r\n this.#setState({\r\n queue: normalizedQueue,\r\n ...(activeContext === undefined ? {} : { activeContext }),\r\n currentItem: preservePlayback ? selected.item : this.#state.currentItem,\r\n currentItemId: preservePlayback\r\n ? selected.item.id\r\n : this.#state.currentItemId,\r\n shuffleEnabled,\r\n repeatMode,\r\n error: null,\r\n });\r\n\r\n if (preservePlayback) {\r\n if (options.autoplay === true && this.#state.status !== \"playing\") {\r\n return this.#play();\r\n }\r\n return OK_RESULT;\r\n }\r\n\r\n const version = this.#beginCommand(\r\n options.autoplay === true ? \"playing\" : \"paused\",\r\n );\r\n\r\n return this.#selectQueueIndex(\r\n version,\r\n startIndex,\r\n options.autoplay === true,\r\n );\r\n }\r\n\r\n async #activateContext(\r\n options: ActivatePlaybackContextOptions,\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n if (options.contextId.trim().length === 0) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const suppliedQueue = options.queue ??\r\n (this.#state.activeContext?.id === options.contextId\r\n ? this.#state.queue\r\n : undefined);\r\n if (\r\n suppliedQueue === undefined ||\r\n !hasUniqueQueueItemIds(suppliedQueue)\r\n ) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const startIndex = findQueueIndex(\r\n suppliedQueue,\r\n options.startQueueItemId,\r\n );\r\n if (startIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n const startItem = suppliedQueue[startIndex];\r\n if (startItem === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n let queue: readonly QueueItem[];\r\n if (options.mode === \"manual-history\") {\r\n const sameManualContext =\r\n this.#state.activeContext?.id === options.contextId &&\r\n this.#state.activeContext.mode === \"manual-history\";\r\n const history = sameManualContext ? [...this.#state.queue] : [];\r\n const existingIndex = findQueueIndex(history, startItem.queueItemId);\r\n if (existingIndex === null) {\r\n history.push(startItem);\r\n } else {\r\n history[existingIndex] = startItem;\r\n }\r\n queue = freezeQueue(history);\r\n } else {\r\n queue = freezeQueue(suppliedQueue);\r\n }\r\n\r\n const previousContext = this.#state.activeContext;\r\n const context = Object.freeze({\r\n id: options.contextId,\r\n mode: options.mode,\r\n ...(options.label === undefined && previousContext?.id === options.contextId\r\n ? previousContext.label === undefined\r\n ? {}\r\n : { label: previousContext.label }\r\n : options.label === undefined\r\n ? {}\r\n : { label: options.label }),\r\n queue,\r\n currentQueueItemId: options.startQueueItemId,\r\n }) satisfies PlaybackContextState;\r\n\r\n return this.#setQueue(\r\n queue,\r\n {\r\n startQueueItemId: options.startQueueItemId,\r\n ...(options.autoplay === undefined\r\n ? {}\r\n : { autoplay: options.autoplay }),\r\n ...(options.reload === undefined ? {} : { reload: options.reload }),\r\n },\r\n context,\r\n );\r\n }\r\n\r\n #appendToManualHistory(contextId: string, item: QueueItem): void {\r\n const context = this.#state.activeContext;\r\n if (\r\n this.#destroyed ||\r\n context?.id !== contextId ||\r\n context.mode !== \"manual-history\" ||\r\n findQueueIndex(this.#state.queue, item.queueItemId) !== null\r\n ) {\r\n return;\r\n }\r\n\r\n const queue = freezeQueue([...this.#state.queue, item]);\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n queue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor =\r\n this.#state.currentQueueItemId === null\r\n ? -1\r\n : findQueueIndex(queue, this.#state.currentQueueItemId) ?? -1;\r\n this.#setState({ queue });\r\n }\r\n\r\n async #selectQueueIndex(\r\n version: number,\r\n index: number,\r\n autoplay: boolean,\r\n ): Promise<PlayerCommandResult> {\r\n const selected = this.#state.queue[index];\r\n if (selected === undefined) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n\r\n const config = this.#state.experienceConfig;\r\n const replacingCurrent = this.#state.currentItem !== null;\r\n let transitionError: PlayerError | null = null;\r\n\r\n if (replacingCurrent) {\r\n void this.#savePodcastProgress(true);\r\n\r\n if (this.#state.status === \"playing\") {\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: config.trackChangeFadeOutMs,\r\n curve: config.fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n if (fadeResult.error !== null) {\r\n transitionError = fadeResult.error;\r\n }\r\n }\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n this.#pauseMediaElement();\r\n }\r\n\r\n this.#setState({\r\n currentItem: selected.item,\r\n currentItemId: selected.item.id,\r\n currentQueueItemId: selected.queueItemId,\r\n mediaKind: selected.item.kind,\r\n status: \"loading\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n canSeek: false,\r\n needsUserGesture: false,\r\n error: transitionError,\r\n });\r\n\r\n try {\r\n this.#media.setSource(selected.item.source);\r\n this.#media.load();\r\n } catch {\r\n const error = createPlayerError(\"unknown\", true);\r\n this.#setState({ status: \"error\", error });\r\n return failed(error);\r\n }\r\n\r\n await this.#restorePodcastProgress(version, selected.item);\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n return autoplay\r\n ? this.#playWithCommand(\r\n version,\r\n config.trackChangeFadeInMs,\r\n config.fadeCurve,\r\n )\r\n : OK_RESULT;\r\n }\r\n\r\n async #restorePodcastProgress(\r\n version: number,\r\n item: PlayerMediaItem,\r\n ): Promise<void> {\r\n const port = this.#podcastProgress;\r\n if (\r\n port === undefined ||\r\n !canUsePodcastProgress(\r\n item,\r\n port,\r\n this.#state.experienceConfig.persistMode,\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n try {\r\n const progress = await port.load(item.id);\r\n if (\r\n !this.#isCurrentCommand(version) ||\r\n this.#state.currentItemId !== item.id ||\r\n !isUsablePodcastProgress(progress, item)\r\n ) {\r\n return;\r\n }\r\n\r\n const duration = readFiniteDuration(this.#media);\r\n const target =\r\n duration === null\r\n ? progress.positionSec\r\n : Math.min(progress.positionSec, duration);\r\n this.#media.seekTo(target);\r\n this.#lastSavedPodcastPositions.set(item.id, target);\r\n this.#setState({ currentTimeSec: target });\r\n } catch {\r\n // Persistence failure must not prevent basic playback.\r\n }\r\n }\r\n\r\n async #play(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n const config = this.#state.experienceConfig;\r\n const result = await this.#playWithCommand(\r\n version,\r\n config.playFadeInMs,\r\n config.fadeCurve,\r\n );\r\n if (result.ok && this.#isCurrentCommand(version)) {\r\n this.#setState({ lastTransitionCause: \"user-play\" });\r\n }\r\n return result;\r\n }\r\n\r\n async #playWithCommand(\r\n version: number,\r\n fadeDurationMs: number,\r\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\r\n ): Promise<PlayerCommandResult> {\r\n if (this.#state.currentItem === null) {\r\n this.#desiredPlayback = \"paused\";\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n if (this.#gain !== undefined) {\r\n try {\r\n this.#gain.setValue(fadeDurationMs > 0 ? 0 : 1);\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n }\r\n\r\n try {\r\n await this.#media.play();\r\n } catch (error) {\r\n if (!this.#isCurrentCommand(version)) {\r\n return OK_RESULT;\r\n }\r\n\r\n const playerError = classifyPlayError(error, this.#media);\r\n this.#desiredPlayback = \"paused\";\r\n this.#restoreGain();\r\n this.#setState({\r\n status: \"error\",\r\n needsUserGesture: playerError.code === \"autoplay-blocked\",\r\n ...(playerError.code === \"autoplay-blocked\"\r\n ? { lastTransitionCause: \"autoplay-blocked\" as const }\r\n : {}),\r\n error: playerError,\r\n });\r\n return failed(playerError);\r\n }\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n if (this.#desiredPlayback === \"paused\") {\r\n this.#pauseMediaElement();\r\n }\r\n return OK_RESULT;\r\n }\r\n\r\n this.#setState({\r\n status: \"playing\",\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 1,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (\r\n this.#isCurrentCommand(version) &&\r\n fadeResult.error !== null\r\n ) {\r\n this.#setState({ error: fadeResult.error });\r\n }\r\n\r\n return OK_RESULT;\r\n }\r\n\r\n async #pause(options: PauseOptions = {}): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n await this.#halt(version, {\r\n fadeDurationMs:\r\n options.fade === false ? 0 : config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: false,\r\n transitionCause: \"user-pause\",\r\n });\r\n }\r\n\r\n async #stop(options: StopOptions = {}): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n await this.#halt(version, {\r\n fadeDurationMs:\r\n options.fade === false ? 0 : config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: options.resetPosition ?? true,\r\n transitionCause: \"user-stop\",\r\n });\r\n }\r\n\r\n async #halt(\r\n version: number,\r\n options: {\r\n readonly fadeDurationMs: number;\r\n readonly fadeCurve: PlayerExperienceConfig[\"fadeCurve\"];\r\n readonly resetPosition: boolean;\r\n readonly transitionCause?: \"user-pause\" | \"user-stop\";\r\n },\r\n ): Promise<boolean> {\r\n void this.#savePodcastProgress(true);\r\n\r\n const fadeResult = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: options.fadeDurationMs,\r\n curve: options.fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return false;\r\n }\r\n if (fadeResult.error !== null) {\r\n this.#setState({ error: fadeResult.error });\r\n }\r\n\r\n this.#pauseMediaElement();\r\n if (options.resetPosition && this.#state.currentItem !== null) {\r\n this.#media.seekTo(0);\r\n }\r\n\r\n this.#setState({\r\n status: this.#state.currentItem === null ? \"idle\" : \"paused\",\r\n currentTimeSec: options.resetPosition\r\n ? 0\r\n : readFiniteCurrentTime(this.#media),\r\n ...(options.transitionCause === undefined\r\n ? {}\r\n : { lastTransitionCause: options.transitionCause }),\r\n });\r\n return true;\r\n }\r\n\r\n async #togglePlayback(): Promise<PlayerCommandResult> {\r\n if (this.#state.status === \"playing\") {\r\n await this.#pause();\r\n return OK_RESULT;\r\n }\r\n\r\n return this.#play();\r\n }\r\n\r\n #seekTo(seconds: number): void {\r\n if (\r\n this.#destroyed ||\r\n this.#state.currentItem === null ||\r\n !Number.isFinite(seconds)\r\n ) {\r\n return;\r\n }\r\n\r\n const duration = readFiniteDuration(this.#media);\r\n const lowerBounded = Math.max(seconds, 0);\r\n const target =\r\n duration === null\r\n ? lowerBounded\r\n : Math.min(lowerBounded, duration);\r\n const version = this.#beginCommand(this.#desiredPlayback);\r\n const config = this.#state.experienceConfig;\r\n void this.#performSeek(\r\n version,\r\n target,\r\n config.seekFadeMs,\r\n config.fadeCurve,\r\n );\r\n }\r\n\r\n #seekBy(deltaSeconds: number): void {\r\n if (!Number.isFinite(deltaSeconds)) {\r\n return;\r\n }\r\n\r\n this.#seekTo(readFiniteCurrentTime(this.#media) + deltaSeconds);\r\n }\r\n\r\n async #performSeek(\r\n version: number,\r\n target: number,\r\n fadeDurationMs: number,\r\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\r\n ): Promise<void> {\r\n const fadeOut = await runFade(this.#gain, {\r\n target: 0,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n if (fadeOut.error !== null) {\r\n this.#setState({ error: fadeOut.error });\r\n }\r\n\r\n this.#setState({ status: \"seeking\" });\r\n this.#media.seekTo(target);\r\n this.#setState({ currentTimeSec: target });\r\n\r\n const fadeIn = await runFade(this.#gain, {\r\n target: 1,\r\n durationMs: fadeDurationMs,\r\n curve: fadeCurve,\r\n });\r\n\r\n if (!this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n if (fadeIn.error !== null) {\r\n this.#setState({ error: fadeIn.error });\r\n }\r\n\r\n this.#setState({\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n }\r\n\r\n #setVolume(volume: number): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const normalized = clampVolume(volume);\r\n this.#media.setVolume(normalized);\r\n this.#setState({ volume: normalized });\r\n }\r\n\r\n #toggleMute(): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const muted = !this.#state.muted;\r\n this.#media.setMuted(muted);\r\n this.#setState({ muted });\r\n }\r\n\r\n #setShuffle(enabled: boolean): void {\r\n if (\r\n this.#destroyed ||\r\n (enabled &&\r\n this.#state.activeContext?.mode === \"manual-history\") ||\r\n enabled === this.#state.shuffleEnabled\r\n ) {\r\n return;\r\n }\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n this.#setState({ shuffleEnabled: enabled });\r\n return;\r\n }\r\n\r\n const playbackQueue = enabled\r\n ? shuffleQueueAroundCurrent(\r\n this.#state.queue,\r\n currentQueueItemId,\r\n this.#random,\r\n )\r\n : this.#state.queue;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n playbackQueue.map((entry) => entry.queueItemId),\r\n );\r\n this.#playbackOrderCursor = enabled\r\n ? 0\r\n : findQueueIndex(this.#state.queue, currentQueueItemId) ?? -1;\r\n this.#setState({\r\n shuffleEnabled: enabled,\r\n });\r\n }\r\n\r\n #setRepeatMode(mode: RepeatMode): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n this.#setState({\r\n repeatMode:\r\n this.#state.activeContext?.mode === \"manual-history\" &&\r\n mode === \"all\"\r\n ? \"off\"\r\n : mode,\r\n });\r\n }\r\n\r\n async #next(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\r\n currentQueueItemId,\r\n );\r\n if (nextPlaybackIndex === null) {\r\n return OK_RESULT;\r\n }\r\n const nextQueueItemId =\r\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\r\n const nextIndex =\r\n nextQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, nextQueueItemId);\r\n if (nextIndex === null) {\r\n return failed(INVALID_QUEUE_ERROR);\r\n }\r\n this.#playbackOrderCursor = nextPlaybackIndex;\r\n\r\n const autoplay = this.#state.status === \"playing\";\r\n const version = this.#beginCommand(\r\n autoplay ? \"playing\" : \"paused\",\r\n );\r\n return this.#selectQueueIndex(version, nextIndex, autoplay);\r\n }\r\n\r\n async #previous(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n const currentIndex = this.#state.currentQueueIndex;\r\n const currentItem = this.#state.currentItem;\r\n if (currentIndex === null || currentItem === null) {\r\n return failed(NO_ITEM_ERROR);\r\n }\r\n\r\n const config = this.#state.experienceConfig;\r\n const currentTime = readFiniteCurrentTime(this.#media);\r\n const shouldRestartTrack =\r\n currentItem.kind === \"track\" &&\r\n config.previousRestartThresholdSec > 0 &&\r\n currentTime >= config.previousRestartThresholdSec;\r\n const shouldRestartPodcast =\r\n currentItem.kind === \"podcastEpisode\" &&\r\n config.podcastPreviousMode === \"restart-episode\";\r\n const previousPlaybackIndex = getPreviousQueueIndex(\r\n this.#playbackOrderQueueItemIds,\r\n this.#playbackOrderCursor,\r\n );\r\n const previousQueueItemId =\r\n previousPlaybackIndex === null\r\n ? undefined\r\n : this.#playbackOrderQueueItemIds[previousPlaybackIndex];\r\n const previousIndex =\r\n previousQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, previousQueueItemId);\r\n\r\n if (\r\n shouldRestartTrack ||\r\n shouldRestartPodcast ||\r\n previousPlaybackIndex === null ||\r\n previousIndex === null\r\n ) {\r\n this.#seekTo(0);\r\n return OK_RESULT;\r\n }\r\n this.#playbackOrderCursor = previousPlaybackIndex;\r\n\r\n const autoplay = this.#state.status === \"playing\";\r\n const version = this.#beginCommand(\r\n autoplay ? \"playing\" : \"paused\",\r\n );\r\n return this.#selectQueueIndex(version, previousIndex, autoplay);\r\n }\r\n\r\n async #retry(): Promise<PlayerCommandResult> {\r\n if (this.#destroyed) {\r\n return failed(DESTROYED_ERROR);\r\n }\r\n\r\n if (\r\n this.#state.currentQueueIndex === null ||\r\n this.#state.error === null ||\r\n !this.#state.error.recoverable\r\n ) {\r\n return failed(this.#state.error ?? NO_ITEM_ERROR);\r\n }\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n this.#setState({ error: null, needsUserGesture: false });\r\n return this.#selectQueueIndex(\r\n version,\r\n this.#state.currentQueueIndex,\r\n true,\r\n );\r\n }\r\n\r\n async #clear(): Promise<void> {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const version = this.#beginCommand(\"paused\");\r\n const config = this.#state.experienceConfig;\r\n const halted = await this.#halt(version, {\r\n fadeDurationMs: config.pauseFadeOutMs,\r\n fadeCurve: config.fadeCurve,\r\n resetPosition: true,\r\n });\r\n\r\n if (!halted || !this.#isCurrentCommand(version)) {\r\n return;\r\n }\r\n\r\n this.#media.clearSource();\r\n this.#playbackOrderQueueItemIds = Object.freeze([]);\r\n this.#playbackOrderCursor = -1;\r\n this.#setState({\r\n currentItem: null,\r\n currentItemId: null,\r\n currentQueueItemId: null,\r\n mediaKind: null,\r\n status: \"idle\",\r\n currentTimeSec: 0,\r\n durationSec: null,\r\n queue: Object.freeze([]),\r\n activeContext: null,\r\n canSeek: false,\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n }\r\n\r\n #restoreGain(): void {\r\n try {\r\n this.#gain?.setValue(1);\r\n } catch {\r\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\r\n }\r\n }\r\n\r\n async #savePodcastProgress(force: boolean): Promise<void> {\r\n const item = this.#state.currentItem;\r\n const port = this.#podcastProgress;\r\n if (\r\n port === undefined ||\r\n !canUsePodcastProgress(\r\n item,\r\n port,\r\n this.#state.experienceConfig.persistMode,\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n const position = readFiniteCurrentTime(this.#media);\r\n const lastPosition = this.#lastSavedPodcastPositions.get(item.id);\r\n if (\r\n !force &&\r\n lastPosition !== undefined &&\r\n Math.abs(position - lastPosition) <\r\n this.#podcastProgressSaveIntervalSec\r\n ) {\r\n return;\r\n }\r\n\r\n const progress = createPodcastProgress(item, position, this.#now);\r\n this.#lastSavedPodcastPositions.set(item.id, position);\r\n this.#progressSaveChain = this.#progressSaveChain\r\n .then(() => port.save(progress))\r\n .catch(() => undefined);\r\n await this.#progressSaveChain;\r\n }\r\n\r\n #handleMediaEvent(event: PlayerMediaEvent): void {\r\n if (this.#destroyed) {\r\n return;\r\n }\r\n\r\n const snapshot = this.#media.getStateSnapshot();\r\n if (\r\n this.#state.currentItem !== null &&\r\n (!snapshot.hasCurrentSource ||\r\n !snapshot.currentSourceMatchesAssigned)\r\n ) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error: createPlayerError(\"unknown\", true),\r\n });\r\n return;\r\n }\r\n this.#setState({\r\n currentTimeSec: snapshot.currentTimeSec,\r\n durationSec: snapshot.durationSec,\r\n volume: clampVolume(snapshot.volume),\r\n muted: snapshot.muted,\r\n canSeek: snapshot.durationSec !== null,\r\n });\r\n\r\n switch (event.type) {\r\n case \"loadstart\":\r\n this.#setState({ status: \"loading\" });\r\n break;\r\n case \"loadedmetadata\":\r\n case \"durationchange\": {\r\n const duration = readFiniteDuration(this.#media);\r\n this.#setState({\r\n durationSec: duration,\r\n canSeek: duration !== null,\r\n });\r\n break;\r\n }\r\n case \"canplay\":\r\n this.#setState({\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n break;\r\n case \"play\":\r\n case \"playing\":\r\n if (this.#desiredPlayback === \"paused\") {\r\n this.#pauseMediaElement();\r\n break;\r\n }\r\n this.#setState({\r\n status: \"playing\",\r\n needsUserGesture: false,\r\n error: null,\r\n });\r\n break;\r\n case \"pause\":\r\n if (this.#ignoreNextPauseEvent) {\r\n this.#ignoreNextPauseEvent = false;\r\n break;\r\n }\r\n if (this.#desiredPlayback === \"playing\") {\r\n this.#desiredPlayback = \"paused\";\r\n }\r\n if (this.#state.status !== \"ended\") {\r\n this.#setState({\r\n status:\r\n this.#state.currentItem === null ? \"idle\" : \"paused\",\r\n ...(this.#state.status === \"playing\"\r\n ? { lastTransitionCause: \"os-interruption\" as const }\r\n : {}),\r\n });\r\n }\r\n break;\r\n case \"waiting\":\r\n case \"stalled\":\r\n this.#setState({ status: \"loading\" });\r\n break;\r\n case \"seeking\":\r\n this.#setState({ status: \"seeking\" });\r\n break;\r\n case \"seeked\":\r\n this.#setState({\r\n currentTimeSec: readFiniteCurrentTime(this.#media),\r\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\r\n });\r\n break;\r\n case \"timeupdate\":\r\n this.#setState({\r\n currentTimeSec: readFiniteCurrentTime(this.#media),\r\n ...(this.#state.status === \"loading\" && !snapshot.paused\r\n ? { status: \"playing\" as const }\r\n : {}),\r\n });\r\n void this.#savePodcastProgress(false);\r\n break;\r\n case \"ended\":\r\n void this.#handleEnded();\r\n break;\r\n case \"error\": {\r\n const error =\r\n this.#media.getError() ?? createPlayerError(\"unknown\", true);\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n lastTransitionCause: \"source-error\",\r\n error,\r\n });\r\n break;\r\n }\r\n case \"volumechange\":\r\n this.#setState({\r\n volume: clampVolume(this.#media.getVolume()),\r\n muted: this.#media.isMuted(),\r\n });\r\n break;\r\n }\r\n }\r\n\r\n async #handleEnded(): Promise<void> {\r\n if (this.#handlingEnded) {\r\n return;\r\n }\r\n this.#handlingEnded = true;\r\n try {\r\n await this.#advanceAfterEnded();\r\n } finally {\r\n this.#handlingEnded = false;\r\n }\r\n }\r\n\r\n async #advanceAfterEnded(): Promise<void> {\r\n this.#setState({ lastTransitionCause: \"natural-end\" });\r\n void this.#savePodcastProgress(true);\r\n\r\n const currentQueueItemId = this.#state.currentQueueItemId;\r\n if (currentQueueItemId === null) {\r\n return;\r\n }\r\n\r\n if (this.#state.repeatMode === \"one\") {\r\n const version = this.#beginCommand(\"playing\");\r\n const config = this.#state.experienceConfig;\r\n this.#media.seekTo(0);\r\n this.#setState({ currentTimeSec: 0, status: \"loading\" });\r\n await this.#playWithCommand(\r\n version,\r\n config.trackChangeFadeInMs,\r\n config.fadeCurve,\r\n );\r\n return;\r\n }\r\n\r\n if (this.#state.activeContext?.mode === \"manual-history\") {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"ended\",\r\n currentTimeSec:\r\n readFiniteDuration(this.#media) ??\r\n readFiniteCurrentTime(this.#media),\r\n });\r\n return;\r\n }\r\n\r\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\r\n currentQueueItemId,\r\n );\r\n if (nextPlaybackIndex === null) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"ended\",\r\n currentTimeSec:\r\n readFiniteDuration(this.#media) ??\r\n readFiniteCurrentTime(this.#media),\r\n });\r\n return;\r\n }\r\n const nextQueueItemId =\r\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\r\n const nextIndex =\r\n nextQueueItemId === undefined\r\n ? null\r\n : findQueueIndex(this.#state.queue, nextQueueItemId);\r\n if (nextIndex === null) {\r\n this.#desiredPlayback = \"paused\";\r\n this.#setState({\r\n status: \"error\",\r\n error: INVALID_QUEUE_ERROR,\r\n });\r\n return;\r\n }\r\n this.#playbackOrderCursor = nextPlaybackIndex;\r\n\r\n const version = this.#beginCommand(\"playing\");\r\n await this.#selectQueueIndex(version, nextIndex, true);\r\n }\r\n\r\n #getNextPlaybackIndex(currentQueueItemId: string): number | null {\r\n if (\r\n this.#playbackOrderCursor >= 0 &&\r\n this.#playbackOrderCursor <\r\n this.#playbackOrderQueueItemIds.length - 1\r\n ) {\r\n return this.#playbackOrderCursor + 1;\r\n }\r\n if (!this.#state.shuffleEnabled) {\r\n return getNextQueueIndex(\r\n this.#playbackOrderQueueItemIds,\r\n this.#playbackOrderCursor,\r\n this.#state.repeatMode,\r\n );\r\n }\r\n if (this.#state.repeatMode !== \"all\") {\r\n return null;\r\n }\r\n\r\n const shuffled = shuffleQueueAroundCurrent(\r\n this.#state.queue,\r\n currentQueueItemId,\r\n this.#random,\r\n );\r\n const continuation = shuffled\r\n .slice(1)\r\n .map((entry) => entry.queueItemId);\r\n if (continuation.length === 0) {\r\n if (this.#state.queue.length !== 1) {\r\n return null;\r\n }\r\n continuation.push(currentQueueItemId);\r\n }\r\n\r\n this.#playbackOrderQueueItemIds = Object.freeze([\r\n ...this.#playbackOrderQueueItemIds,\r\n ...continuation,\r\n ]);\r\n let appendedIndex = this.#playbackOrderCursor + 1;\r\n if (\r\n this.#playbackOrderQueueItemIds.length >\r\n MAX_SHUFFLE_HISTORY_ITEMS &&\r\n this.#playbackOrderCursor > RETAINED_SHUFFLE_HISTORY_ITEMS\r\n ) {\r\n const removeCount =\r\n this.#playbackOrderCursor - RETAINED_SHUFFLE_HISTORY_ITEMS;\r\n this.#playbackOrderQueueItemIds = Object.freeze(\r\n this.#playbackOrderQueueItemIds.slice(removeCount),\r\n );\r\n this.#playbackOrderCursor -= removeCount;\r\n appendedIndex -= removeCount;\r\n }\r\n\r\n return appendedIndex;\r\n }\r\n}\r\n\r\nexport function createPlayerStore(\r\n options: CreatePlayerStoreOptions,\r\n): PlayerStore {\r\n return new CorePlayerStore(options);\r\n}\r\n","import {\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n createInitialPlayerState,\r\n} from \"../config\";\r\nimport type {\r\n PlayerCommandResult,\r\n PlayerCommands,\r\n PlayerError,\r\n PlayerExperienceConfig,\r\n PlayerExperienceConfigStore,\r\n PlayerStore,\r\n} from \"../contracts/player\";\r\n\r\ntype Listener = () => void;\r\n\r\nconst RUNTIME_PENDING_ERROR: PlayerError = Object.freeze({\r\n code: \"unknown\",\r\n recoverable: true,\r\n messageKey: \"player.error.runtime-pending\",\r\n});\r\n\r\nconst RUNTIME_PENDING_RESULT: PlayerCommandResult = Object.freeze({\r\n ok: false,\r\n error: RUNTIME_PENDING_ERROR,\r\n});\r\n\r\nexport interface PlayerRuntimeBridge {\r\n readonly store: PlayerStore;\r\n attach(store: PlayerStore, commands: PlayerCommands): () => void;\r\n}\r\n\r\nfunction notify(listeners: ReadonlySet<Listener>): void {\r\n for (const listener of listeners) {\r\n listener();\r\n }\r\n}\r\n\r\nexport function createPlayerRuntimeBridge(\r\n experienceConfig?: Partial<PlayerExperienceConfig>,\r\n): PlayerRuntimeBridge {\r\n let pendingState = createInitialPlayerState(experienceConfig);\r\n let activeStore: PlayerStore | null = null;\r\n let activeCommands: PlayerCommands | null = null;\r\n let unsubscribeStore: (() => void) | null = null;\r\n let unsubscribeExperience: (() => void) | null = null;\r\n const listeners = new Set<Listener>();\r\n const experienceListeners = new Set<Listener>();\r\n\r\n const pendingResult = (): Promise<PlayerCommandResult> =>\r\n Promise.resolve(RUNTIME_PENDING_RESULT);\r\n\r\n const commandsImplementation: PlayerCommands = {\r\n load: (item) => activeCommands?.load(item) ?? pendingResult(),\r\n setQueue: (queue, options) =>\r\n activeCommands?.setQueue(queue, options) ?? pendingResult(),\r\n activateContext: (options) =>\r\n activeCommands?.activateContext(options) ?? pendingResult(),\r\n appendToManualHistory: (contextId, item) => {\r\n activeCommands?.appendToManualHistory(contextId, item);\r\n },\r\n play: () => activeCommands?.play() ?? pendingResult(),\r\n pause: (options) =>\r\n activeCommands?.pause(options) ?? Promise.resolve(),\r\n stop: (options) =>\r\n activeCommands?.stop(options) ?? Promise.resolve(),\r\n togglePlayback: () =>\r\n activeCommands?.togglePlayback() ?? pendingResult(),\r\n seekTo: (seconds) => {\r\n activeCommands?.seekTo(seconds);\r\n },\r\n seekBy: (deltaSeconds) => {\r\n activeCommands?.seekBy(deltaSeconds);\r\n },\r\n setVolume: (volume) => {\r\n activeCommands?.setVolume(volume);\r\n },\r\n toggleMute: () => {\r\n activeCommands?.toggleMute();\r\n },\r\n setShuffle: (enabled) => {\r\n activeCommands?.setShuffle(enabled);\r\n },\r\n setRepeatMode: (mode) => {\r\n activeCommands?.setRepeatMode(mode);\r\n },\r\n next: () => activeCommands?.next() ?? pendingResult(),\r\n previous: () => activeCommands?.previous() ?? pendingResult(),\r\n retry: () => activeCommands?.retry() ?? pendingResult(),\r\n clear: () => activeCommands?.clear() ?? Promise.resolve(),\r\n };\r\n const commands = Object.freeze(commandsImplementation);\r\n\r\n const experienceImplementation: PlayerExperienceConfigStore = {\r\n getConfig: () =>\r\n activeStore?.experience.getConfig() ?? pendingState.experienceConfig,\r\n updateConfig: (patch) => {\r\n if (activeStore !== null) {\r\n activeStore.experience.updateConfig(patch);\r\n return;\r\n }\r\n pendingState = createInitialPlayerState({\r\n ...pendingState.experienceConfig,\r\n ...patch,\r\n });\r\n notify(listeners);\r\n notify(experienceListeners);\r\n },\r\n resetConfig: () => {\r\n if (activeStore !== null) {\r\n activeStore.experience.resetConfig();\r\n return;\r\n }\r\n pendingState = createInitialPlayerState(\r\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\r\n );\r\n notify(listeners);\r\n notify(experienceListeners);\r\n },\r\n subscribe: (listener) => {\r\n experienceListeners.add(listener);\r\n return () => {\r\n experienceListeners.delete(listener);\r\n };\r\n },\r\n };\r\n const experience = Object.freeze(experienceImplementation);\r\n\r\n const storeImplementation: PlayerStore = {\r\n getState: () => activeStore?.getState() ?? pendingState,\r\n subscribe: (listener) => {\r\n listeners.add(listener);\r\n return () => {\r\n listeners.delete(listener);\r\n };\r\n },\r\n commands,\r\n experience,\r\n synchronizeFromMedia: (reason) =>\r\n activeStore?.synchronizeFromMedia(reason) ?? Promise.resolve(),\r\n destroy: () => activeStore?.destroy() ?? Promise.resolve(),\r\n };\r\n const store = Object.freeze(storeImplementation);\r\n\r\n const detachActiveStore = (): void => {\r\n unsubscribeStore?.();\r\n unsubscribeExperience?.();\r\n unsubscribeStore = null;\r\n unsubscribeExperience = null;\r\n activeStore = null;\r\n activeCommands = null;\r\n };\r\n\r\n const bridge: PlayerRuntimeBridge = {\r\n store,\r\n attach(nextStore, nextCommands) {\r\n detachActiveStore();\r\n activeStore = nextStore;\r\n activeCommands = nextCommands;\r\n unsubscribeStore = nextStore.subscribe(() => {\r\n notify(listeners);\r\n });\r\n unsubscribeExperience = nextStore.experience.subscribe(() => {\r\n notify(experienceListeners);\r\n });\r\n notify(listeners);\r\n notify(experienceListeners);\r\n\r\n return () => {\r\n if (activeStore !== nextStore) {\r\n return;\r\n }\r\n detachActiveStore();\r\n notify(listeners);\r\n notify(experienceListeners);\r\n };\r\n },\r\n };\r\n return Object.freeze(bridge);\r\n}\r\n","import type {\r\n ActivatePlaybackContextOptions,\r\n PauseOptions,\r\n PlayerCommands,\r\n PlayerMediaItem,\r\n QueueItem,\r\n RepeatMode,\r\n SetQueueOptions,\r\n StopOptions,\r\n} from \"../contracts/player\";\r\n\r\nexport interface UserGestureGainActivator {\r\n activateFromUserGesture(): void | Promise<void>;\r\n}\r\n\r\nexport type PlayerRuntimeCommandName = keyof PlayerCommands;\r\n\r\nexport interface GestureAwareCommandsOptions {\r\n readonly onUserActivation?: () => void;\r\n readonly onCommand?: (command: PlayerRuntimeCommandName) => void;\r\n readonly onActivationError?: () => void;\r\n}\r\n\r\nfunction activate(\r\n gain: UserGestureGainActivator,\r\n options: GestureAwareCommandsOptions,\r\n): void {\r\n options.onUserActivation?.();\r\n try {\r\n const activation = gain.activateFromUserGesture();\r\n if (activation !== undefined) {\r\n void activation.catch(() => {\r\n options.onActivationError?.();\r\n });\r\n }\r\n } catch {\r\n options.onActivationError?.();\r\n }\r\n}\r\n\r\nfunction reportCommand(\r\n options: GestureAwareCommandsOptions,\r\n command: PlayerRuntimeCommandName,\r\n): void {\r\n options.onCommand?.(command);\r\n}\r\n\r\nexport function createGestureAwareCommands(\r\n commands: PlayerCommands,\r\n gain: UserGestureGainActivator,\r\n activationOptions: GestureAwareCommandsOptions = {},\r\n): PlayerCommands {\r\n return Object.freeze({\r\n load(item: PlayerMediaItem) {\r\n reportCommand(activationOptions, \"load\");\r\n return commands.load(item);\r\n },\r\n setQueue(\r\n queue: readonly QueueItem[],\r\n commandOptions?: SetQueueOptions,\r\n ) {\r\n reportCommand(activationOptions, \"setQueue\");\r\n if (commandOptions?.autoplay === true) {\r\n activate(gain, activationOptions);\r\n }\r\n return commands.setQueue(queue, commandOptions);\r\n },\r\n activateContext(commandOptions: ActivatePlaybackContextOptions) {\r\n reportCommand(activationOptions, \"activateContext\");\r\n if (commandOptions.autoplay === true) {\r\n activate(gain, activationOptions);\r\n }\r\n return commands.activateContext(commandOptions);\r\n },\r\n appendToManualHistory(contextId: string, item: QueueItem) {\r\n reportCommand(activationOptions, \"appendToManualHistory\");\r\n commands.appendToManualHistory(contextId, item);\r\n },\r\n play() {\r\n reportCommand(activationOptions, \"play\");\r\n activate(gain, activationOptions);\r\n return commands.play();\r\n },\r\n pause(options?: PauseOptions) {\r\n reportCommand(activationOptions, \"pause\");\r\n return commands.pause(options);\r\n },\r\n stop(options?: StopOptions) {\r\n reportCommand(activationOptions, \"stop\");\r\n return commands.stop(options);\r\n },\r\n togglePlayback() {\r\n reportCommand(activationOptions, \"togglePlayback\");\r\n activate(gain, activationOptions);\r\n return commands.togglePlayback();\r\n },\r\n seekTo(seconds: number) {\r\n reportCommand(activationOptions, \"seekTo\");\r\n activate(gain, activationOptions);\r\n commands.seekTo(seconds);\r\n },\r\n seekBy(deltaSeconds: number) {\r\n reportCommand(activationOptions, \"seekBy\");\r\n activate(gain, activationOptions);\r\n commands.seekBy(deltaSeconds);\r\n },\r\n setVolume(volume: number) {\r\n reportCommand(activationOptions, \"setVolume\");\r\n commands.setVolume(volume);\r\n },\r\n toggleMute() {\r\n reportCommand(activationOptions, \"toggleMute\");\r\n commands.toggleMute();\r\n },\r\n setShuffle(enabled: boolean) {\r\n reportCommand(activationOptions, \"setShuffle\");\r\n commands.setShuffle(enabled);\r\n },\r\n setRepeatMode(mode: RepeatMode) {\r\n reportCommand(activationOptions, \"setRepeatMode\");\r\n commands.setRepeatMode(mode);\r\n },\r\n next() {\r\n reportCommand(activationOptions, \"next\");\r\n activate(gain, activationOptions);\r\n return commands.next();\r\n },\r\n previous() {\r\n reportCommand(activationOptions, \"previous\");\r\n activate(gain, activationOptions);\r\n return commands.previous();\r\n },\r\n retry() {\r\n reportCommand(activationOptions, \"retry\");\r\n activate(gain, activationOptions);\r\n return commands.retry();\r\n },\r\n clear() {\r\n reportCommand(activationOptions, \"clear\");\r\n return commands.clear();\r\n },\r\n });\r\n}\r\n","import {\r\n createContext,\r\n useEffect,\r\n useMemo,\r\n useRef,\r\n useState,\r\n type ReactNode,\r\n} from \"react\";\r\nimport {\r\n BrowserMediaElementPort,\r\n HtmlMediaElementGainPort,\r\n LazyWebAudioGainPort,\r\n createBrowserMediaSessionController,\r\n resolvePlayerAudioMode,\r\n type PlayerAudioMode,\r\n type ResolvedPlayerAudioMode,\r\n} from \"../adapters/browser\";\r\nimport type {\r\n PlayerCommands,\r\n PlayerExperienceConfig,\r\n PlayerExperienceConfigStore,\r\n PlayerMediaSyncReason,\r\n PlayerRuntimeStatus,\r\n PlayerStore,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport type {\r\n PlayerMediaEventType,\r\n} from \"../ports/media-element\";\r\nimport { createPlayerStore } from \"../core\";\r\nimport { createPlayerRuntimeBridge } from \"./player-runtime-bridge\";\r\nimport { createGestureAwareCommands } from \"./runtime-commands\";\r\nimport type {\r\n PlayerRuntimeDiagnosticListener,\r\n PlayerRuntimeDiagnosticPayload,\r\n} from \"./runtime-diagnostics\";\r\n\r\nconst DIAGNOSTIC_MEDIA_EVENTS = [\r\n \"loadstart\",\r\n \"loadedmetadata\",\r\n \"canplay\",\r\n \"play\",\r\n \"playing\",\r\n \"pause\",\r\n \"waiting\",\r\n \"stalled\",\r\n \"seeking\",\r\n \"seeked\",\r\n \"timeupdate\",\r\n \"ended\",\r\n \"error\",\r\n \"durationchange\",\r\n \"volumechange\",\r\n] as const satisfies readonly PlayerMediaEventType[];\r\n\r\nconst EMPTY_INITIAL_QUEUE: readonly QueueItem[] = Object.freeze([]);\r\n\r\nexport interface PlayerProviderProps {\r\n readonly children: ReactNode;\r\n /** Read once when the Runtime is created. Later queue changes use commands. */\r\n readonly initialQueue?: readonly QueueItem[];\r\n readonly initialQueueItemId?: string;\r\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\r\n /** Used only when children is null or undefined while Runtime is pending. */\r\n readonly loadingFallback?: ReactNode;\r\n /**\r\n * auto uses native HTML audio on iOS/iPadOS and Web Audio elsewhere.\r\n * Explicit modes exist for real-device comparison and host policy.\r\n */\r\n readonly audioMode?: PlayerAudioMode;\r\n /** Optional host observer. The runtime does not retain diagnostic history. */\r\n readonly onDiagnosticEvent?: PlayerRuntimeDiagnosticListener;\r\n}\r\n\r\nexport interface PlayerRuntimeContextValue {\r\n readonly runtimeStatus: PlayerRuntimeStatus;\r\n readonly store: PlayerStore;\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n readonly audioContextState: AudioContextState | \"uninitialized\";\r\n readonly audioMode: ResolvedPlayerAudioMode;\r\n readonly mediaSessionSupported: boolean;\r\n readonly mediaSessionActionsEnabled: boolean;\r\n}\r\n\r\nexport const PlayerRuntimeContext =\r\n createContext<PlayerRuntimeContextValue | null>(null);\r\n\r\nexport function PlayerProvider({\r\n audioMode = \"auto\",\r\n children,\r\n experienceConfig,\r\n initialQueue = EMPTY_INITIAL_QUEUE,\r\n initialQueueItemId,\r\n loadingFallback = null,\r\n onDiagnosticEvent,\r\n}: PlayerProviderProps) {\r\n const audioRef = useRef<HTMLAudioElement>(null);\r\n const initialQueueRef = useRef(initialQueue);\r\n const initialQueueItemIdRef = useRef(initialQueueItemId);\r\n const initialExperienceConfigRef = useRef(experienceConfig);\r\n const diagnosticListenerRef = useRef(onDiagnosticEvent);\r\n const [runtimeBridge] = useState(() =>\r\n createPlayerRuntimeBridge(experienceConfig),\r\n );\r\n const [runtimeStatus, setRuntimeStatus] =\r\n useState<PlayerRuntimeStatus>(\"pending\");\r\n const [audioContextState, setAudioContextState] =\r\n useState<AudioContextState | \"uninitialized\">(\"uninitialized\");\r\n const [resolvedAudioMode, setResolvedAudioMode] =\r\n useState<ResolvedPlayerAudioMode>(\"web-audio\");\r\n const [mediaSessionSupported, setMediaSessionSupported] =\r\n useState(false);\r\n const [\r\n mediaSessionActionsEnabled,\r\n setMediaSessionActionsEnabled,\r\n ] = useState(false);\r\n\r\n useEffect(() => {\r\n diagnosticListenerRef.current = onDiagnosticEvent;\r\n }, [onDiagnosticEvent]);\r\n\r\n useEffect(() => {\r\n const audioElement = audioRef.current;\r\n if (audioElement === null) {\r\n return;\r\n }\r\n\r\n let active = true;\r\n let synchronizeFromLifecycle:\r\n | ((reason: PlayerMediaSyncReason) => void)\r\n | null = null;\r\n const emitDiagnostic = (\r\n event: PlayerRuntimeDiagnosticPayload,\r\n ): void => {\r\n diagnosticListenerRef.current?.({\r\n ...event,\r\n occurredAt: new Date().toISOString(),\r\n });\r\n };\r\n const media = new BrowserMediaElementPort(audioElement);\r\n const navigatorPlatform: unknown = Reflect.get(\r\n navigator,\r\n \"platform\",\r\n );\r\n const nextAudioMode = resolvePlayerAudioMode(audioMode, {\r\n userAgent: navigator.userAgent,\r\n ...(typeof navigatorPlatform === \"string\"\r\n ? { platform: navigatorPlatform }\r\n : {}),\r\n maxTouchPoints: navigator.maxTouchPoints,\r\n });\r\n const gain =\r\n nextAudioMode === \"web-audio\"\r\n ? new LazyWebAudioGainPort(audioElement, {\r\n onContextStateChange: (state) => {\r\n if (active) {\r\n setAudioContextState(state);\r\n emitDiagnostic({\r\n type: \"audio-context-statechange\",\r\n state,\r\n });\r\n synchronizeFromLifecycle?.(\r\n \"audio-context-statechange\",\r\n );\r\n }\r\n },\r\n })\r\n : new HtmlMediaElementGainPort();\r\n setResolvedAudioMode(nextAudioMode);\r\n setAudioContextState(\r\n gain instanceof LazyWebAudioGainPort\r\n ? gain.getContextState()\r\n : \"uninitialized\",\r\n );\r\n const store = createPlayerStore({\r\n gain,\r\n media,\r\n ...(initialExperienceConfigRef.current === undefined\r\n ? {}\r\n : { experienceConfig: initialExperienceConfigRef.current }),\r\n });\r\n let mediaSessionController:\r\n | ReturnType<typeof createBrowserMediaSessionController>\r\n | null = null;\r\n const commands = createGestureAwareCommands(store.commands, gain, {\r\n onUserActivation: () => {\r\n mediaSessionController?.enableActionHandlers();\r\n if (active) {\r\n setMediaSessionActionsEnabled(\r\n mediaSessionController?.actionsEnabled ?? false,\r\n );\r\n }\r\n },\r\n onCommand: (command) => {\r\n emitDiagnostic({ type: \"command\", command });\r\n },\r\n onActivationError: () => {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"failed\",\r\n state:\r\n gain instanceof LazyWebAudioGainPort\r\n ? gain.getContextState()\r\n : \"uninitialized\",\r\n errorCode: \"audio-context\",\r\n });\r\n },\r\n });\r\n const detachRuntime = runtimeBridge.attach(store, commands);\r\n mediaSessionController = createBrowserMediaSessionController({\r\n commands,\r\n getState: () => store.getState(),\r\n onAction: (action) => {\r\n emitDiagnostic({\r\n type: \"media-session-action\",\r\n action,\r\n failed: false,\r\n });\r\n },\r\n onActionError: (action) => {\r\n emitDiagnostic({\r\n type: \"media-session-action\",\r\n action,\r\n failed: true,\r\n });\r\n },\r\n });\r\n const activeMediaSessionController = mediaSessionController;\r\n setMediaSessionSupported(activeMediaSessionController.supported);\r\n setMediaSessionActionsEnabled(false);\r\n const unsubscribeMediaSession = store.subscribe(() => {\r\n activeMediaSessionController.update(store.getState());\r\n });\r\n activeMediaSessionController.update(store.getState());\r\n\r\n const synchronize = (reason: PlayerMediaSyncReason): void => {\r\n const resumeAudioContext = async (): Promise<void> => {\r\n if (\r\n !(gain instanceof LazyWebAudioGainPort) ||\r\n gain.getContextState() !== \"suspended\"\r\n ) {\r\n return;\r\n }\r\n try {\r\n const resumed = await gain.resumeIfSuspended();\r\n if (resumed) {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"resumed\",\r\n state: gain.getContextState(),\r\n errorCode: null,\r\n });\r\n }\r\n } catch {\r\n emitDiagnostic({\r\n type: \"audio-context-resume\",\r\n outcome: \"failed\",\r\n state: gain.getContextState(),\r\n errorCode: \"audio-context\",\r\n });\r\n }\r\n };\r\n\r\n void resumeAudioContext()\r\n .then(() => store.synchronizeFromMedia(reason))\r\n .finally(() => {\r\n if (!active) {\r\n return;\r\n }\r\n if (gain instanceof LazyWebAudioGainPort) {\r\n setAudioContextState(gain.getContextState());\r\n }\r\n activeMediaSessionController.update(store.getState());\r\n emitDiagnostic({\r\n type: \"lifecycle-sync\",\r\n reason,\r\n visibility: document.visibilityState,\r\n media: media.getStateSnapshot(),\r\n });\r\n });\r\n };\r\n synchronizeFromLifecycle = synchronize;\r\n const handleVisibilityChange = (): void => {\r\n if (document.visibilityState === \"visible\") {\r\n synchronize(\"visibilitychange\");\r\n }\r\n };\r\n const handlePageShow = (): void => {\r\n synchronize(\"pageshow\");\r\n };\r\n const handleFocus = (): void => {\r\n synchronize(\"focus\");\r\n };\r\n const mediaEventListeners = new Map<\r\n PlayerMediaEventType,\r\n () => void\r\n >();\r\n for (const eventType of DIAGNOSTIC_MEDIA_EVENTS) {\r\n const listener = (): void => {\r\n emitDiagnostic({\r\n type: \"media-event\",\r\n event: eventType,\r\n media: media.getStateSnapshot(),\r\n });\r\n activeMediaSessionController.update(store.getState());\r\n };\r\n mediaEventListeners.set(eventType, listener);\r\n media.addEventListener(eventType, listener);\r\n }\r\n document.addEventListener(\r\n \"visibilitychange\",\r\n handleVisibilityChange,\r\n );\r\n window.addEventListener(\"pageshow\", handlePageShow);\r\n window.addEventListener(\"focus\", handleFocus);\r\n\r\n setRuntimeStatus(\"ready\");\r\n void store.commands.setQueue(initialQueueRef.current, {\r\n ...(initialQueueItemIdRef.current === undefined\r\n ? {}\r\n : { startQueueItemId: initialQueueItemIdRef.current }),\r\n autoplay: false,\r\n });\r\n\r\n return () => {\r\n active = false;\r\n synchronizeFromLifecycle = null;\r\n document.removeEventListener(\r\n \"visibilitychange\",\r\n handleVisibilityChange,\r\n );\r\n window.removeEventListener(\"pageshow\", handlePageShow);\r\n window.removeEventListener(\"focus\", handleFocus);\r\n for (const [eventType, listener] of mediaEventListeners) {\r\n media.removeEventListener(eventType, listener);\r\n }\r\n unsubscribeMediaSession();\r\n activeMediaSessionController.destroy();\r\n setRuntimeStatus(\"pending\");\r\n detachRuntime();\r\n void store.destroy();\r\n };\r\n }, [\r\n audioMode,\r\n runtimeBridge,\r\n ]);\r\n\r\n const contextValue = useMemo<PlayerRuntimeContextValue>(\r\n () => ({\r\n runtimeStatus,\r\n store: runtimeBridge.store,\r\n commands: runtimeBridge.store.commands,\r\n experience: runtimeBridge.store.experience,\r\n audioContextState,\r\n audioMode: resolvedAudioMode,\r\n mediaSessionSupported,\r\n mediaSessionActionsEnabled,\r\n }),\r\n [\r\n audioContextState,\r\n mediaSessionActionsEnabled,\r\n mediaSessionSupported,\r\n resolvedAudioMode,\r\n runtimeBridge,\r\n runtimeStatus,\r\n ],\r\n );\r\n\r\n const consumerTree = children ??\r\n (runtimeStatus === \"pending\" ? loadingFallback : null);\r\n\r\n return (\r\n <>\r\n <audio\r\n aria-hidden=\"true\"\r\n data-audio-context-state={audioContextState}\r\n data-audio-mode={resolvedAudioMode}\r\n data-media-session-actions={\r\n mediaSessionActionsEnabled ? \"enabled\" : \"inactive\"\r\n }\r\n data-media-session-supported={\r\n mediaSessionSupported ? \"true\" : \"false\"\r\n }\r\n data-player-audio=\"true\"\r\n data-player-runtime-status={runtimeStatus}\r\n preload=\"metadata\"\r\n ref={audioRef}\r\n />\r\n <PlayerRuntimeContext.Provider value={contextValue}>\r\n {consumerTree}\r\n </PlayerRuntimeContext.Provider>\r\n </>\r\n );\r\n}\r\n","import {\r\n useEffect,\r\n useRef,\r\n type ReactNode,\r\n} from \"react\";\r\n\r\nexport interface MiniPlayerHostProps {\r\n readonly children: ReactNode;\r\n readonly visible: boolean;\r\n readonly onInsetChange?: (bottomInsetPx: number) => void;\r\n readonly className?: string;\r\n}\r\n\r\nexport function MiniPlayerHost({\r\n children,\r\n className,\r\n onInsetChange,\r\n visible,\r\n}: MiniPlayerHostProps) {\r\n const hostRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!visible) {\r\n onInsetChange?.(0);\r\n return;\r\n }\r\n\r\n const host = hostRef.current;\r\n if (host === null) {\r\n return;\r\n }\r\n\r\n const publishInset = () => {\r\n onInsetChange?.(Math.ceil(host.getBoundingClientRect().height));\r\n };\r\n publishInset();\r\n\r\n if (typeof ResizeObserver === \"undefined\") {\r\n return () => {\r\n onInsetChange?.(0);\r\n };\r\n }\r\n\r\n const observer = new ResizeObserver(publishInset);\r\n observer.observe(host);\r\n return () => {\r\n observer.disconnect();\r\n onInsetChange?.(0);\r\n };\r\n }, [onInsetChange, visible]);\r\n\r\n if (!visible) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n className={className}\r\n data-player-mini-host=\"true\"\r\n ref={hostRef}\r\n >\r\n {children}\r\n </div>\r\n );\r\n}\r\n","import {\r\n useContext,\r\n useSyncExternalStore,\r\n} from \"react\";\r\nimport type {\r\n PlayerCommands,\r\n PlayerExperienceConfigStore,\r\n PlayerRuntimeStatus,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport {\r\n PlayerRuntimeContext,\r\n type PlayerRuntimeContextValue,\r\n} from \"./player-provider\";\r\nimport type { ResolvedPlayerAudioMode } from \"../adapters/browser\";\r\n\r\nexport interface UsePlayerResult {\r\n readonly runtimeStatus: PlayerRuntimeStatus;\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly experience: PlayerExperienceConfigStore;\r\n readonly audioContextState: AudioContextState | \"uninitialized\";\r\n readonly audioMode: ResolvedPlayerAudioMode;\r\n readonly mediaSessionSupported: boolean;\r\n readonly mediaSessionActionsEnabled: boolean;\r\n}\r\n\r\nfunction usePlayerRuntimeContext(): PlayerRuntimeContextValue {\r\n const context = useContext(PlayerRuntimeContext);\r\n if (context === null) {\r\n throw new Error(\"usePlayer must be used inside PlayerProvider.\");\r\n }\r\n return context;\r\n}\r\n\r\nexport function usePlayer(): UsePlayerResult {\r\n const context = usePlayerRuntimeContext();\r\n const state = useSyncExternalStore(\r\n (listener) => context.store.subscribe(listener),\r\n () => context.store.getState(),\r\n () => context.store.getState(),\r\n );\r\n\r\n return {\r\n runtimeStatus: context.runtimeStatus,\r\n state,\r\n commands: context.commands,\r\n experience: context.experience,\r\n audioContextState: context.audioContextState,\r\n audioMode: context.audioMode,\r\n mediaSessionSupported: context.mediaSessionSupported,\r\n mediaSessionActionsEnabled:\r\n context.mediaSessionActionsEnabled,\r\n };\r\n}\r\n","import { useMemo } from \"react\";\r\nimport type {\r\n BoundPlayerCommands,\r\n BoundPlayerViewState,\r\n PlaybackContextInput,\r\n PlayerCommandResult,\r\n PlayerState,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { usePlayer } from \"./use-player\";\r\n\r\nexport interface UseBoundPlayerOptions {\r\n readonly context: PlaybackContextInput;\r\n readonly queueItem: QueueItem;\r\n}\r\n\r\nexport interface UseBoundPlayerResult {\r\n readonly state: Readonly<BoundPlayerViewState>;\r\n readonly commands: BoundPlayerCommands;\r\n}\r\n\r\nexport function deriveBoundPlayerViewState(\r\n playerState: Readonly<PlayerState>,\r\n contextId: string,\r\n queueItem: QueueItem,\r\n): Readonly<BoundPlayerViewState> {\r\n const isActive =\r\n playerState.activeContext?.id === contextId &&\r\n playerState.currentQueueItemId === queueItem.queueItemId;\r\n\r\n return Object.freeze({\r\n queueItemId: queueItem.queueItemId,\r\n item: isActive ? playerState.currentItem ?? queueItem.item : queueItem.item,\r\n isActive,\r\n status: isActive ? playerState.status : \"paused\",\r\n currentTimeSec: isActive ? playerState.currentTimeSec : 0,\r\n durationSec: isActive\r\n ? playerState.durationSec\r\n : queueItem.item.durationHintSec ?? null,\r\n canSeek: isActive && playerState.canSeek,\r\n isPlaying: isActive && playerState.status === \"playing\",\r\n });\r\n}\r\n\r\nexport function useBoundPlayer({\r\n context,\r\n queueItem,\r\n}: UseBoundPlayerOptions): UseBoundPlayerResult {\r\n const player = usePlayer();\r\n const state = useMemo(\r\n () => deriveBoundPlayerViewState(player.state, context.id, queueItem),\r\n [context.id, player.state, queueItem],\r\n );\r\n\r\n const commands = useMemo<BoundPlayerCommands>(() => {\r\n const play = (): Promise<PlayerCommandResult> =>\r\n player.commands.activateContext({\r\n contextId: context.id,\r\n mode: context.mode,\r\n ...(context.label === undefined ? {} : { label: context.label }),\r\n queue:\r\n context.mode === \"manual-history\"\r\n ? [queueItem]\r\n : context.queue,\r\n startQueueItemId: queueItem.queueItemId,\r\n autoplay: true,\r\n });\r\n\r\n return Object.freeze({\r\n play,\r\n togglePlayback(): Promise<PlayerCommandResult> {\r\n if (\r\n player.state.activeContext?.id === context.id &&\r\n player.state.currentQueueItemId === queueItem.queueItemId\r\n ) {\r\n return player.commands.togglePlayback();\r\n }\r\n return play();\r\n },\r\n seekTo(seconds: number): void {\r\n if (\r\n player.state.activeContext?.id === context.id &&\r\n player.state.currentQueueItemId === queueItem.queueItemId &&\r\n player.state.canSeek\r\n ) {\r\n player.commands.seekTo(seconds);\r\n }\r\n },\r\n });\r\n }, [context, player.commands, player.state, queueItem]);\r\n\r\n return { state, commands };\r\n}\r\n","import type { ReactNode, SVGProps } from \"react\";\r\n\r\nexport interface PlayerIconProps\r\n extends Omit<SVGProps<SVGSVGElement>, \"children\"> {\r\n readonly size?: number;\r\n}\r\n\r\ninterface IconFrameProps extends PlayerIconProps {\r\n readonly children: ReactNode;\r\n}\r\n\r\nfunction IconFrame({\r\n children,\r\n size = 20,\r\n ...props\r\n}: IconFrameProps) {\r\n return (\r\n <svg\r\n aria-hidden=\"true\"\r\n focusable=\"false\"\r\n viewBox=\"0 0 24 24\"\r\n width={size}\r\n height={size}\r\n fill=\"currentColor\"\r\n {...props}\r\n >\r\n {children}\r\n </svg>\r\n );\r\n}\r\n\r\nexport function PlayIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7 4.8c0-1.05 1.16-1.68 2.04-1.1l11 7.2a1.3 1.3 0 0 1 0 2.2l-11 7.2A1.31 1.31 0 0 1 7 19.2V4.8Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PauseIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"5\" y=\"4\" width=\"5\" height=\"16\" rx=\"0.8\" />\r\n <rect x=\"14\" y=\"4\" width=\"5\" height=\"16\" rx=\"0.8\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PreviousIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"4\" y=\"5\" width=\"3\" height=\"14\" rx=\"0.6\" />\r\n <path d=\"M19 5.3v13.4c0 .93-1.02 1.5-1.82 1.02l-9.7-6.7a1.2 1.2 0 0 1 0-2.04l9.7-6.7A1.19 1.19 0 0 1 19 5.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function NextIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <rect x=\"17\" y=\"5\" width=\"3\" height=\"14\" rx=\"0.6\" />\r\n <path d=\"M5 5.3v13.4c0 .93 1.02 1.5 1.82 1.02l9.7-6.7a1.2 1.2 0 0 0 0-2.04l-9.7-6.7A1.19 1.19 0 0 0 5 5.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function ShuffleIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M17.2 3.7 22 7.5l-4.8 3.8V8.8h-1.9c-1.5 0-2.4.5-3.2 1.6l-3.3 4.5c-1.35 1.84-3.1 2.8-5.8 2.8H2v-3h1c1.7 0 2.55-.43 3.36-1.53l3.32-4.52C11.02 6.82 12.8 5.8 15.3 5.8h1.9V3.7ZM2 6.3h1c2.7 0 4.43.94 5.8 2.8l1.05 1.43-1.87 2.55-1.62-2.25C5.55 9.73 4.7 9.3 3 9.3H2v-3Zm12.08 5.17c.35-.13.75-.2 1.22-.2h1.9V8.7l4.8 3.8-4.8 3.8v-2.03h-1.9c-1.24 0-2.05.34-2.73 1.04l1.51-3.84Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RepeatIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7.3 4h9.2A4.5 4.5 0 0 1 21 8.5V10h-3V8.5A1.5 1.5 0 0 0 16.5 7H7.3v3.1L2 5.55 7.3 1v3Zm9.4 16H7.5A4.5 4.5 0 0 1 3 15.5V14h3v1.5A1.5 1.5 0 0 0 7.5 17h9.2v-3.1l5.3 4.55L16.7 23v-3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RepeatOneIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M7.3 3h9.2A4.5 4.5 0 0 1 21 7.5V9h-3V7.5A1.5 1.5 0 0 0 16.5 6H7.3v2.6L2 4.55 7.3.5V3Zm9.4 18H7.5A4.5 4.5 0 0 1 3 16.5V15h3v1.5A1.5 1.5 0 0 0 7.5 18h9.2v-2.6l5.3 4.05-5.3 4.05V21Z\" />\r\n <path d=\"M10.25 9h3.35v7h-2.35v-4.8h-1V9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function QueueIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <circle cx=\"4\" cy=\"6\" r=\"2\" />\r\n <circle cx=\"4\" cy=\"12\" r=\"2\" />\r\n <circle cx=\"4\" cy=\"18\" r=\"2\" />\r\n <rect x=\"8\" y=\"4.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n <rect x=\"8\" y=\"10.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n <rect x=\"8\" y=\"16.5\" width=\"14\" height=\"3\" rx=\"0.7\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function VolumeIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M3 9h4l5-4.4c.78-.68 2-.13 2 .9v13c0 1.03-1.22 1.58-2 .9L7 15H3V9Zm14.3-1.8a1.5 1.5 0 0 1 2.1.25A7.4 7.4 0 0 1 21 12a7.4 7.4 0 0 1-1.6 4.55 1.5 1.5 0 1 1-2.35-1.86A4.4 4.4 0 0 0 18 12c0-1-.33-1.93-.95-2.69a1.5 1.5 0 0 1 .25-2.11Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function MuteIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M2 9h4l5-4.4c.78-.68 2-.13 2 .9v13c0 1.03-1.22 1.58-2 .9L6 15H2V9Zm13.9-.9L18 10.2l2.1-2.1L22 10l-2.1 2.1L22 14l-1.9 1.9-2.1-2.1-2.1 2.1L14 14l2.1-1.9L14 10l1.9-1.9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PodcastSkipBackIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M8.2 3.2 3 7.4l5.2 4.2V9a7 7 0 1 1-1.55 8.5l-2.73 1.25A10 10 0 1 0 8.2 6V3.2Z\" />\r\n <rect x=\"8.5\" y=\"10\" width=\"2.2\" height=\"6\" rx=\"0.4\" />\r\n <rect x=\"12.2\" y=\"10\" width=\"3.3\" height=\"2\" rx=\"0.4\" />\r\n <rect x=\"13.3\" y=\"11\" width=\"2.2\" height=\"5\" rx=\"0.4\" />\r\n <rect x=\"12.2\" y=\"14\" width=\"3.3\" height=\"2\" rx=\"0.4\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function PodcastSkipForwardIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m15.8 3.2 5.2 4.2-5.2 4.2V9a7 7 0 1 0 1.55 8.5l2.73 1.25A10 10 0 1 1 15.8 6V3.2Z\" />\r\n <path d=\"M7.5 10h3.2v2H9.5v1h1.2v3H7.5v-2h1.2v-2H7.5v-2Zm4.3 0H15v6h-3.2v-6Zm2 2h-.8v2h.8v-2Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function CloseIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m5.05 3 6.95 6.95L18.95 3 21 5.05 14.05 12 21 18.95 18.95 21 12 14.05 5.05 21 3 18.95 9.95 12 3 5.05 5.05 3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function DragHandleIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n {[5, 12, 19].flatMap((cx) =>\r\n [7, 17].map((cy) => (\r\n <circle\r\n key={`${String(cx)}-${String(cy)}`}\r\n cx={cx}\r\n cy={cy}\r\n r=\"2\"\r\n />\r\n )),\r\n )}\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RemoveIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path\r\n fillRule=\"evenodd\"\r\n d=\"M12 2a10 10 0 1 0 0 20 10 10 0 0 0 0-20ZM6 10.5h12v3H6v-3Z\"\r\n clipRule=\"evenodd\"\r\n />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function RetryIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"M19.7 4.3V1L15.5 5.2 19.7 9V7.3A8 8 0 1 1 12 4a1.5 1.5 0 0 0 0-3 11 11 0 1 0 10.7 8.5l-2.88.84A8 8 0 0 1 19.7 4.3Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n\r\nexport function ChevronIcon(props: PlayerIconProps) {\r\n return (\r\n <IconFrame {...props}>\r\n <path d=\"m4 9 8 8 8-8-2.2-2.2L12 12.6 6.2 6.8 4 9Z\" />\r\n </IconFrame>\r\n );\r\n}\r\n","import type {\r\n PlayerError,\r\n PlayerState,\r\n RepeatMode,\r\n} from \"../contracts/player\";\r\n\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\nexport function formatTime(seconds: number | null): string {\r\n if (seconds === null || !Number.isFinite(seconds) || seconds < 0) {\r\n return \"--:--\";\r\n }\r\n\r\n const wholeSeconds = Math.floor(seconds);\r\n const hours = Math.floor(wholeSeconds / 3600);\r\n const minutes = Math.floor((wholeSeconds % 3600) / 60);\r\n const remainder = wholeSeconds % 60;\r\n\r\n if (hours > 0) {\r\n return `${String(hours)}:${String(minutes).padStart(2, \"0\")}:${String(remainder).padStart(2, \"0\")}`;\r\n }\r\n\r\n return `${String(minutes).padStart(2, \"0\")}:${String(remainder).padStart(2, \"0\")}`;\r\n}\r\n\r\nexport function formatTimeAria(seconds: number): string {\r\n const safeSeconds = Math.max(0, Math.floor(seconds));\r\n const hours = Math.floor(safeSeconds / 3600);\r\n const minutes = Math.floor((safeSeconds % 3600) / 60);\r\n const remainder = safeSeconds % 60;\r\n const parts = [\r\n hours > 0 ? `${String(hours)} hour${hours === 1 ? \"\" : \"s\"}` : \"\",\r\n minutes > 0 ? `${String(minutes)} minute${minutes === 1 ? \"\" : \"s\"}` : \"\",\r\n `${String(remainder)} second${remainder === 1 ? \"\" : \"s\"}`,\r\n ].filter(Boolean);\r\n return parts.join(\" \");\r\n}\r\n\r\nexport function getRepeatLabel(mode: RepeatMode): string {\r\n switch (mode) {\r\n case \"off\":\r\n return \"Repeat off\";\r\n case \"all\":\r\n return \"Repeat all\";\r\n case \"one\":\r\n return \"Repeat one\";\r\n }\r\n}\r\n\r\nexport function getNextRepeatMode(mode: RepeatMode): RepeatMode {\r\n switch (mode) {\r\n case \"off\":\r\n return \"all\";\r\n case \"all\":\r\n return \"one\";\r\n case \"one\":\r\n return \"off\";\r\n }\r\n}\r\n\r\nexport function getStatusLabel(state: Readonly<PlayerState>): string {\r\n if (state.needsUserGesture) {\r\n return \"Ready to play\";\r\n }\r\n\r\n switch (state.status) {\r\n case \"idle\":\r\n return \"Idle\";\r\n case \"loading\":\r\n return \"Loading\";\r\n case \"playing\":\r\n return \"Playing\";\r\n case \"paused\":\r\n return \"Paused\";\r\n case \"seeking\":\r\n return \"Seeking\";\r\n case \"ended\":\r\n return \"Ended\";\r\n case \"error\":\r\n return \"Playback unavailable\";\r\n }\r\n}\r\n\r\nexport function getErrorMessage(error: PlayerError): string {\r\n switch (error.code) {\r\n case \"autoplay-blocked\":\r\n return \"Playback needs a direct action.\";\r\n case \"network\":\r\n return \"The media could not be reached.\";\r\n case \"cors\":\r\n return \"The media source is not available.\";\r\n case \"decode\":\r\n return \"This media could not be decoded.\";\r\n case \"unsupported\":\r\n return \"This media format is not supported.\";\r\n case \"audio-context\":\r\n return \"Audio output is not available.\";\r\n case \"unknown\":\r\n return \"Playback is currently unavailable.\";\r\n }\r\n}\r\n","import {\r\n useEffect,\r\n useId,\r\n useRef,\r\n useState,\r\n type CSSProperties,\r\n type FocusEvent,\r\n type ReactNode,\r\n} from \"react\";\r\nimport type {\r\n PlayerAppearance,\r\n PlayerCommands,\r\n PlayerMediaItem,\r\n PlayerState,\r\n} from \"../contracts/player\";\r\nimport {\r\n MuteIcon,\r\n NextIcon,\r\n PauseIcon,\r\n PlayIcon,\r\n PreviousIcon,\r\n QueueIcon,\r\n RepeatIcon,\r\n RepeatOneIcon,\r\n RetryIcon,\r\n ShuffleIcon,\r\n VolumeIcon,\r\n} from \"../icons\";\r\nimport {\r\n formatTime,\r\n getErrorMessage,\r\n getNextRepeatMode,\r\n getRepeatLabel,\r\n getStatusLabel,\r\n} from \"./player-utils\";\r\n\r\nexport interface PlayerSurfaceProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly children: ReactNode;\r\n readonly className?: string;\r\n readonly label: string;\r\n}\r\n\r\nexport function PlayerSurface({\r\n appearance,\r\n children,\r\n className,\r\n label,\r\n}: PlayerSurfaceProps) {\r\n return (\r\n <section\r\n aria-label={label}\r\n className={[\"player-surface\", className].filter(Boolean).join(\" \")}\r\n data-appearance={appearance}\r\n >\r\n {children}\r\n </section>\r\n );\r\n}\r\n\r\nexport interface ArtworkProps {\r\n readonly item: PlayerMediaItem | null;\r\n readonly className?: string;\r\n}\r\n\r\nexport function Artwork({ className, item }: ArtworkProps) {\r\n const classes = [\"player-artwork\", className].filter(Boolean).join(\" \");\r\n\r\n if (item?.artwork !== undefined) {\r\n return (\r\n <span className={`${classes} player-artwork--image`}>\r\n <img\r\n alt={item.artwork.alt}\r\n className=\"player-artwork__image\"\r\n decoding=\"async\"\r\n src={item.artwork.url}\r\n />\r\n </span>\r\n );\r\n }\r\n\r\n return (\r\n <div\r\n aria-label=\"Artwork unavailable\"\r\n className={`${classes} player-artwork--fallback`}\r\n role=\"img\"\r\n >\r\n <span aria-hidden=\"true\" />\r\n </div>\r\n );\r\n}\r\n\r\nexport interface TrackMetadataProps {\r\n readonly item: PlayerMediaItem | null;\r\n readonly status?: string;\r\n readonly className?: string;\r\n readonly scrollTitle?: boolean;\r\n}\r\n\r\nfunction ScrollingTitle({\r\n enabled,\r\n title,\r\n}: {\r\n readonly enabled: boolean;\r\n readonly title: string;\r\n}) {\r\n const containsJapanese = /[\\u3040-\\u30ff\\u3400-\\u9fff]/u.test(title);\r\n const viewportRef = useRef<HTMLElement>(null);\r\n const contentRef = useRef<HTMLSpanElement>(null);\r\n const [marquee, setMarquee] = useState({\r\n distance: 0,\r\n duration: 10,\r\n overflow: false,\r\n });\r\n\r\n useEffect(() => {\r\n const viewport = viewportRef.current;\r\n const content = contentRef.current;\r\n\r\n if (viewport === null || content === null) {\r\n return;\r\n }\r\n const viewportElement = viewport;\r\n const contentElement = content;\r\n\r\n function measure() {\r\n const viewportWidth = Math.max(\r\n viewportElement.getBoundingClientRect().width,\r\n viewportElement.clientWidth,\r\n );\r\n const contentWidth = Math.max(\r\n contentElement.getBoundingClientRect().width,\r\n contentElement.scrollWidth,\r\n );\r\n const overflow = contentWidth - viewportWidth > 1;\r\n const distance = enabled ? contentWidth + 12 : 0;\r\n setMarquee({\r\n distance,\r\n duration: Math.max(10, distance / 22 + 4),\r\n overflow,\r\n });\r\n }\r\n\r\n measure();\r\n\r\n if (typeof ResizeObserver === \"undefined\") {\r\n window.addEventListener(\"resize\", measure);\r\n return () => {\r\n window.removeEventListener(\"resize\", measure);\r\n };\r\n }\r\n\r\n const observer = new ResizeObserver(measure);\r\n observer.observe(viewportElement);\r\n observer.observe(contentElement);\r\n return () => {\r\n observer.disconnect();\r\n };\r\n }, [enabled, title]);\r\n\r\n const style = {\r\n \"--player-title-scroll-offset\": `${String(-marquee.distance)}px`,\r\n \"--player-title-scroll-duration\": `${String(marquee.duration)}s`,\r\n } as CSSProperties;\r\n\r\n return (\r\n <strong\r\n className=\"player-title\"\r\n data-overflow={marquee.overflow ? \"true\" : \"false\"}\r\n data-scroll={enabled ? \"true\" : \"false\"}\r\n data-script={containsJapanese ? \"japanese\" : \"latin\"}\r\n ref={viewportRef}\r\n style={style}\r\n >\r\n <span className=\"player-title__text\" ref={contentRef}>\r\n {title}\r\n </span>\r\n </strong>\r\n );\r\n}\r\n\r\nexport function TrackMetadata({\r\n className,\r\n item,\r\n scrollTitle = false,\r\n status,\r\n}: TrackMetadataProps) {\r\n return (\r\n <div\r\n className={[\"player-metadata\", className].filter(Boolean).join(\" \")}\r\n >\r\n {status === undefined ? null : (\r\n <span className=\"player-kicker\">{status}</span>\r\n )}\r\n <ScrollingTitle\r\n enabled={item !== null && scrollTitle}\r\n key={item?.title ?? \"No media selected\"}\r\n title={item?.title ?? \"No media selected\"}\r\n />\r\n <span className=\"player-creator\">\r\n {item === null\r\n ? \"Select media to begin\"\r\n : item.creatorName ?? \"Artist unavailable\"}\r\n </span>\r\n {item?.collectionTitle === undefined ? null : (\r\n <span className=\"player-collection\">{item.collectionTitle}</span>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface TimeReadoutProps {\r\n readonly currentTimeSec: number;\r\n readonly durationSec: number | null;\r\n readonly className?: string;\r\n}\r\n\r\nexport function TimeReadout({\r\n className,\r\n currentTimeSec,\r\n durationSec,\r\n}: TimeReadoutProps) {\r\n return (\r\n <div\r\n aria-label={`${formatTime(currentTimeSec)} of ${formatTime(durationSec)}`}\r\n className={[\"player-time\", className].filter(Boolean).join(\" \")}\r\n >\r\n <time>{formatTime(currentTimeSec)}</time>\r\n <span aria-hidden=\"true\">/</span>\r\n <time>{formatTime(durationSec)}</time>\r\n </div>\r\n );\r\n}\r\n\r\nexport interface IconButtonProps {\r\n readonly label: string;\r\n readonly children: ReactNode;\r\n readonly onClick: () => void;\r\n readonly disabled?: boolean;\r\n readonly pressed?: boolean;\r\n readonly className?: string;\r\n}\r\n\r\nexport function IconButton({\r\n children,\r\n className,\r\n disabled = false,\r\n label,\r\n onClick,\r\n pressed,\r\n}: IconButtonProps) {\r\n return (\r\n <button\r\n aria-label={label}\r\n {...(pressed === undefined ? {} : { \"aria-pressed\": pressed })}\r\n className={[\"player-icon-button\", className].filter(Boolean).join(\" \")}\r\n disabled={disabled}\r\n onClick={onClick}\r\n title={label}\r\n type=\"button\"\r\n >\r\n {children}\r\n </button>\r\n );\r\n}\r\n\r\nexport interface PrimaryPlaybackButtonProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly className?: string;\r\n}\r\n\r\nexport function PrimaryPlaybackButton({\r\n className,\r\n commands,\r\n state,\r\n}: PrimaryPlaybackButtonProps) {\r\n const isPlaying = state.status === \"playing\";\r\n const label = isPlaying ? \"Pause\" : \"Play\";\r\n\r\n return (\r\n <IconButton\r\n className={[\r\n \"player-play-button\",\r\n isPlaying ? \"player-play-button--active\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n disabled={state.currentItem === null || state.status === \"loading\"}\r\n label={label}\r\n onClick={() => {\r\n void commands.togglePlayback();\r\n }}\r\n >\r\n {isPlaying ? <PauseIcon size={22} /> : <PlayIcon size={22} />}\r\n </IconButton>\r\n );\r\n}\r\n\r\nexport interface TransportControlsProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly compact?: boolean;\r\n readonly showModes?: boolean;\r\n readonly className?: string;\r\n}\r\n\r\nexport function TransportControls({\r\n className,\r\n commands,\r\n compact = false,\r\n showModes = true,\r\n state,\r\n}: TransportControlsProps) {\r\n const RepeatModeIcon =\r\n state.repeatMode === \"one\" ? RepeatOneIcon : RepeatIcon;\r\n\r\n return (\r\n <div\r\n aria-label=\"Playback controls\"\r\n className={[\r\n \"player-transport\",\r\n compact ? \"player-transport--compact\" : \"\",\r\n className,\r\n ]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n role=\"group\"\r\n >\r\n {showModes ? (\r\n <IconButton\r\n disabled={state.activeContext?.mode === \"manual-history\"}\r\n label={state.shuffleEnabled ? \"Shuffle on\" : \"Shuffle off\"}\r\n onClick={() => {\r\n commands.setShuffle(!state.shuffleEnabled);\r\n }}\r\n pressed={state.shuffleEnabled}\r\n >\r\n <ShuffleIcon />\r\n </IconButton>\r\n ) : null}\r\n <IconButton\r\n disabled={!state.canGoPrevious}\r\n label=\"Previous\"\r\n onClick={() => {\r\n void commands.previous();\r\n }}\r\n >\r\n <PreviousIcon />\r\n </IconButton>\r\n <PrimaryPlaybackButton commands={commands} state={state} />\r\n <IconButton\r\n disabled={!state.canGoNext}\r\n label=\"Next\"\r\n onClick={() => {\r\n void commands.next();\r\n }}\r\n >\r\n <NextIcon />\r\n </IconButton>\r\n {showModes ? (\r\n <IconButton\r\n label={getRepeatLabel(state.repeatMode)}\r\n onClick={() => {\r\n commands.setRepeatMode(\r\n state.activeContext?.mode === \"manual-history\"\r\n ? state.repeatMode === \"one\"\r\n ? \"off\"\r\n : \"one\"\r\n : getNextRepeatMode(state.repeatMode),\r\n );\r\n }}\r\n pressed={state.repeatMode !== \"off\"}\r\n >\r\n <RepeatModeIcon />\r\n </IconButton>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface VolumeControlProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly className?: string;\r\n}\r\n\r\nexport function VolumeControl({\r\n className,\r\n commands,\r\n state,\r\n}: VolumeControlProps) {\r\n const isMuted = state.muted || state.volume === 0;\r\n return (\r\n <div\r\n className={[\"player-volume\", className].filter(Boolean).join(\" \")}\r\n >\r\n <IconButton\r\n label={isMuted ? \"Unmute\" : \"Mute\"}\r\n onClick={() => {\r\n commands.toggleMute();\r\n }}\r\n pressed={state.muted}\r\n >\r\n {isMuted ? <MuteIcon /> : <VolumeIcon />}\r\n </IconButton>\r\n <label>\r\n <span className=\"player-visually-hidden\">Volume</span>\r\n <input\r\n aria-label=\"Volume\"\r\n max={1}\r\n min={0}\r\n onChange={(event) => {\r\n commands.setVolume(Number(event.currentTarget.value));\r\n }}\r\n step={0.01}\r\n type=\"range\"\r\n value={state.volume}\r\n />\r\n </label>\r\n </div>\r\n );\r\n}\r\n\r\nexport interface PopoverVolumeControlProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n readonly label: string;\r\n readonly className?: string;\r\n}\r\n\r\nexport function PopoverVolumeControl({\r\n className,\r\n commands,\r\n label,\r\n state,\r\n}: PopoverVolumeControlProps) {\r\n const [open, setOpen] = useState(false);\r\n const buttonRef = useRef<HTMLButtonElement>(null);\r\n const rootRef = useRef<HTMLDivElement>(null);\r\n const sliderRef = useRef<HTMLInputElement>(null);\r\n const panelId = useId();\r\n const isMuted = state.muted || state.volume === 0;\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n return;\r\n }\r\n\r\n sliderRef.current?.focus();\r\n const closeOnOutsidePointer = (event: PointerEvent) => {\r\n if (\r\n event.target instanceof Node &&\r\n !rootRef.current?.contains(event.target)\r\n ) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener(\"pointerdown\", closeOnOutsidePointer);\r\n return () => {\r\n document.removeEventListener(\"pointerdown\", closeOnOutsidePointer);\r\n };\r\n }, [open]);\r\n\r\n function closeWhenFocusLeaves(event: FocusEvent<HTMLDivElement>) {\r\n if (\r\n event.relatedTarget instanceof Node &&\r\n rootRef.current?.contains(event.relatedTarget)\r\n ) {\r\n return;\r\n }\r\n setOpen(false);\r\n }\r\n\r\n return (\r\n <div\r\n className={[\"player-volume-popover\", className]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n onBlur={closeWhenFocusLeaves}\r\n onKeyDown={(event) => {\r\n if (event.key === \"Escape\") {\r\n setOpen(false);\r\n buttonRef.current?.focus();\r\n }\r\n }}\r\n ref={rootRef}\r\n >\r\n <button\r\n aria-controls={panelId}\r\n aria-expanded={open}\r\n aria-label={`${open ? \"Close\" : \"Open\"} ${label}`}\r\n className=\"player-icon-button\"\r\n onClick={() => {\r\n setOpen((current) => !current);\r\n }}\r\n ref={buttonRef}\r\n title={`${open ? \"Close\" : \"Open\"} ${label}`}\r\n type=\"button\"\r\n >\r\n {isMuted ? <MuteIcon /> : <VolumeIcon />}\r\n </button>\r\n {open ? (\r\n <div\r\n aria-label={label}\r\n className=\"player-volume-popover__panel\"\r\n id={panelId}\r\n role=\"group\"\r\n >\r\n <label>\r\n <span className=\"player-visually-hidden\">{label}</span>\r\n <input\r\n aria-label={label}\r\n max={1}\r\n min={0}\r\n onChange={(event) => {\r\n commands.setVolume(Number(event.currentTarget.value));\r\n }}\r\n ref={sliderRef}\r\n step={0.01}\r\n type=\"range\"\r\n value={state.volume}\r\n />\r\n </label>\r\n <output>{Math.round(state.volume * 100)}</output>\r\n </div>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n\r\nexport interface QueueToggleProps {\r\n readonly onClick: () => void;\r\n readonly expanded?: boolean;\r\n}\r\n\r\nexport function QueueToggle({\r\n expanded = false,\r\n onClick,\r\n}: QueueToggleProps) {\r\n return (\r\n <IconButton\r\n label={expanded ? \"Close queue\" : \"Open queue\"}\r\n onClick={onClick}\r\n pressed={expanded}\r\n >\r\n <QueueIcon />\r\n </IconButton>\r\n );\r\n}\r\n\r\nexport interface PlayerStatusProps {\r\n readonly state: Readonly<PlayerState>;\r\n}\r\n\r\nexport function PlayerStatus({ state }: PlayerStatusProps) {\r\n return (\r\n <span className=\"player-status\" data-status={state.status}>\r\n {getStatusLabel(state)}\r\n </span>\r\n );\r\n}\r\n\r\nexport interface PlayerErrorNoticeProps {\r\n readonly state: Readonly<PlayerState>;\r\n readonly commands: PlayerCommands;\r\n}\r\n\r\nexport function PlayerErrorNotice({\r\n commands,\r\n state,\r\n}: PlayerErrorNoticeProps) {\r\n if (state.error === null) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"player-error\" role=\"alert\">\r\n <span>{getErrorMessage(state.error)}</span>\r\n {state.error.recoverable ? (\r\n <button\r\n onClick={() => {\r\n void commands.retry();\r\n }}\r\n type=\"button\"\r\n >\r\n <RetryIcon size={16} />\r\n Retry\r\n </button>\r\n ) : null}\r\n </div>\r\n );\r\n}\r\n","import { useEffect, useRef, useState } from \"react\";\r\nimport type {\r\n PlaybackStatus,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport { clamp, formatTimeAria } from \"./player-utils\";\r\n\r\nexport interface SeekBarProps {\r\n readonly currentTimeSec: number;\r\n readonly durationSec: number | null;\r\n readonly canSeek: boolean;\r\n readonly status: PlaybackStatus;\r\n readonly commitMode: SeekCommitMode;\r\n readonly onSeek: (seconds: number) => void;\r\n readonly label?: string;\r\n readonly className?: string;\r\n}\r\n\r\nexport function SeekBar({\r\n canSeek,\r\n className,\r\n commitMode,\r\n currentTimeSec,\r\n durationSec,\r\n label = \"Seek\",\r\n onSeek,\r\n status,\r\n}: SeekBarProps) {\r\n const duration =\r\n durationSec !== null && Number.isFinite(durationSec) && durationSec > 0\r\n ? durationSec\r\n : 0;\r\n const disabled = !canSeek || duration === 0 || status === \"loading\";\r\n const safeCurrentTime = clamp(currentTimeSec, 0, duration);\r\n const [previewTime, setPreviewTime] = useState(safeCurrentTime);\r\n const previewProgress =\r\n duration === 0 ? 0 : clamp(previewTime / duration, 0, 1) * 100;\r\n const isAdjusting = useRef(false);\r\n const lastCommitted = useRef<number | null>(null);\r\n\r\n useEffect(() => {\r\n if (!isAdjusting.current) {\r\n setPreviewTime(safeCurrentTime);\r\n }\r\n }, [safeCurrentTime]);\r\n\r\n function updatePreview(value: number) {\r\n const nextValue = clamp(value, 0, duration);\r\n isAdjusting.current = true;\r\n setPreviewTime(nextValue);\r\n\r\n if (commitMode === \"live\") {\r\n onSeek(nextValue);\r\n lastCommitted.current = nextValue;\r\n }\r\n }\r\n\r\n function commitPreview(value = previewTime) {\r\n const nextValue = clamp(value, 0, duration);\r\n\r\n if (\r\n disabled ||\r\n !isAdjusting.current ||\r\n (commitMode === \"live\" && lastCommitted.current === nextValue)\r\n ) {\r\n isAdjusting.current = false;\r\n return;\r\n }\r\n\r\n onSeek(nextValue);\r\n lastCommitted.current = nextValue;\r\n isAdjusting.current = false;\r\n }\r\n\r\n function cancelPreview() {\r\n isAdjusting.current = false;\r\n lastCommitted.current = null;\r\n setPreviewTime(safeCurrentTime);\r\n }\r\n\r\n return (\r\n <label\r\n className={[\"player-seek\", className].filter(Boolean).join(\" \")}\r\n data-disabled={disabled ? \"true\" : \"false\"}\r\n >\r\n <span className=\"player-visually-hidden\">{label}</span>\r\n <span\r\n aria-hidden=\"true\"\r\n className=\"player-seek__progress\"\r\n style={{ width: `${String(disabled ? 0 : previewProgress)}%` }}\r\n />\r\n <input\r\n aria-label={label}\r\n aria-valuetext={formatTimeAria(previewTime)}\r\n disabled={disabled}\r\n max={duration || 1}\r\n min={0}\r\n onBlur={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n onChange={(event) => {\r\n updatePreview(Number(event.currentTarget.value));\r\n }}\r\n onKeyUp={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n onPointerDown={() => {\r\n isAdjusting.current = true;\r\n }}\r\n onPointerCancel={cancelPreview}\r\n onPointerUp={(event) => {\r\n commitPreview(Number(event.currentTarget.value));\r\n }}\r\n step={0.1}\r\n type=\"range\"\r\n value={disabled ? 0 : previewTime}\r\n />\r\n </label>\r\n );\r\n}\r\n","import { useId } from \"react\";\r\nimport type { PlayerWaveform } from \"../contracts/player\";\r\nimport { clamp } from \"./player-utils\";\r\n\r\nconst FALLBACK_PEAKS = [\r\n 0.16, 0.24, 0.42, 0.3, 0.58, 0.76, 0.48, 0.34, 0.66, 0.88, 0.62, 0.4,\r\n 0.52, 0.72, 0.44, 0.28, 0.56, 0.82, 0.68, 0.38, 0.24, 0.46, 0.32, 0.18,\r\n] as const;\r\nconst BAR_COUNT = 512;\r\nconst VIEWBOX_WIDTH = BAR_COUNT;\r\n\r\nexport interface WaveformProps {\r\n readonly waveform?: PlayerWaveform | undefined;\r\n readonly progress?: number;\r\n readonly playedStateEnabled?: boolean;\r\n readonly opacity?: number;\r\n readonly className?: string;\r\n}\r\n\r\nfunction createWaveformBars(peaks: readonly number[]): readonly number[] {\r\n const source = peaks.length > 1 ? peaks : FALLBACK_PEAKS;\r\n return Array.from({ length: BAR_COUNT }, (_, index) => {\r\n const sourcePosition =\r\n (index / Math.max(BAR_COUNT - 1, 1)) * (source.length - 1);\r\n const leftIndex = Math.floor(sourcePosition);\r\n const rightIndex = Math.min(leftIndex + 1, source.length - 1);\r\n const mix = sourcePosition - leftIndex;\r\n const leftPeak = Math.abs(source[leftIndex] ?? 0);\r\n const rightPeak = Math.abs(source[rightIndex] ?? leftPeak);\r\n const interpolated = leftPeak + (rightPeak - leftPeak) * mix;\r\n\r\n if (source.length >= BAR_COUNT) {\r\n return clamp(Math.pow(interpolated, 1.18), 0.04, 1);\r\n }\r\n\r\n const noiseSeed =\r\n Math.sin((index + 1) * 12.9898 + source.length * 78.233) *\r\n 43_758.5453;\r\n const noise = noiseSeed - Math.floor(noiseSeed);\r\n const fineDetail = 0.76 + noise * 0.34;\r\n const transient = noise > 0.975 ? 3.2 : noise > 0.91 ? 1.75 : 1;\r\n\r\n return clamp(\r\n Math.pow(interpolated, 1.22) * fineDetail * transient,\r\n 0.04,\r\n 1,\r\n );\r\n });\r\n}\r\n\r\nexport function Waveform({\r\n className,\r\n opacity = 1,\r\n playedStateEnabled = true,\r\n progress = 0,\r\n waveform,\r\n}: WaveformProps) {\r\n const clipId = useId().replaceAll(\":\", \"\");\r\n const bars = createWaveformBars(waveform?.peaks ?? FALLBACK_PEAKS);\r\n const progressWidth = clamp(progress, 0, 1) * VIEWBOX_WIDTH;\r\n const classes = [\"player-waveform\", className].filter(Boolean).join(\" \");\r\n const barPath = bars\r\n .map((peak, index) => {\r\n const halfHeight = peak * 47;\r\n const x = index + 0.5;\r\n return `M ${String(x)} ${String(50 - halfHeight)} V ${String(\r\n 50 + halfHeight,\r\n )}`;\r\n })\r\n .join(\" \");\r\n\r\n return (\r\n <svg\r\n aria-hidden=\"true\"\r\n className={classes}\r\n focusable=\"false\"\r\n preserveAspectRatio=\"none\"\r\n style={{ opacity: clamp(opacity, 0, 1), pointerEvents: \"none\" }}\r\n viewBox={`0 0 ${String(VIEWBOX_WIDTH)} 100`}\r\n >\r\n <path className=\"player-waveform__base\" d={barPath} />\r\n {playedStateEnabled ? (\r\n <>\r\n <clipPath id={clipId}>\r\n <rect width={progressWidth} height=\"100\" />\r\n </clipPath>\r\n <path\r\n className=\"player-waveform__played\"\r\n clipPath={`url(#${clipId})`}\r\n d={barPath}\r\n />\r\n </>\r\n ) : null}\r\n </svg>\r\n );\r\n}\r\n","import type {\r\n BoundPlayerCommands,\r\n BoundPlayerViewState,\r\n PlaybackContextMode,\r\n PlayerAppearance,\r\n PlayerRuntimeStatus,\r\n SeekCommitMode,\r\n} from \"../contracts/player\";\r\nimport { PauseIcon, PlayIcon } from \"../icons\";\r\nimport {\r\n Artwork,\r\n IconButton,\r\n PlayerSurface,\r\n TimeReadout,\r\n TrackMetadata,\r\n} from \"./player-primitives\";\r\nimport { SeekBar } from \"./seek-bar\";\r\nimport { Waveform } from \"./waveform\";\r\n\r\nexport interface BoundCompactPlayerViewOptions {\r\n readonly seekCommitMode: SeekCommitMode;\r\n readonly waveformOpacity: number;\r\n readonly waveformPlayedStateEnabled: boolean;\r\n}\r\n\r\nexport interface BoundCompactPlayerViewProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly commands: BoundPlayerCommands;\r\n readonly state: Readonly<BoundPlayerViewState>;\r\n readonly options: Readonly<BoundCompactPlayerViewOptions>;\r\n readonly className?: string;\r\n readonly contextId?: string;\r\n readonly contextMode?: PlaybackContextMode;\r\n readonly runtimeStatus?: PlayerRuntimeStatus;\r\n}\r\n\r\nexport function BoundCompactPlayerView({\r\n appearance,\r\n className,\r\n commands,\r\n contextId,\r\n contextMode,\r\n options,\r\n runtimeStatus,\r\n state,\r\n}: BoundCompactPlayerViewProps) {\r\n const progress =\r\n state.durationSec === null || state.durationSec <= 0\r\n ? 0\r\n : state.currentTimeSec / state.durationSec;\r\n\r\n return (\r\n <PlayerSurface\r\n appearance={appearance}\r\n className={[\"player-bound-compact\", className]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n label={`Inline player: ${state.item.title}`}\r\n >\r\n <div\r\n className=\"player-bound-compact__main\"\r\n data-active={state.isActive ? \"true\" : \"false\"}\r\n data-playback-context-id={contextId}\r\n data-playback-context-mode={contextMode}\r\n data-player-runtime-status={runtimeStatus}\r\n data-queue-item-id={state.queueItemId}\r\n >\r\n <IconButton\r\n className=\"player-play-button\"\r\n label={state.isPlaying ? \"Pause\" : \"Play\"}\r\n onClick={() => {\r\n void commands.togglePlayback();\r\n }}\r\n >\r\n {state.isPlaying ? (\r\n <PauseIcon size={22} />\r\n ) : (\r\n <PlayIcon size={22} />\r\n )}\r\n </IconButton>\r\n <Artwork\r\n className=\"player-bound-compact__artwork\"\r\n item={state.item}\r\n />\r\n <TrackMetadata item={state.item} scrollTitle={state.isPlaying} />\r\n <div className=\"player-bound-compact__signal\">\r\n <Waveform\r\n opacity={options.waveformOpacity}\r\n playedStateEnabled={options.waveformPlayedStateEnabled}\r\n progress={progress}\r\n waveform={state.item.waveform}\r\n />\r\n <TimeReadout\r\n currentTimeSec={state.currentTimeSec}\r\n durationSec={state.durationSec}\r\n />\r\n </div>\r\n <SeekBar\r\n canSeek={state.canSeek}\r\n commitMode={options.seekCommitMode}\r\n currentTimeSec={state.currentTimeSec}\r\n durationSec={state.durationSec}\r\n label={`Seek in ${state.item.title}`}\r\n onSeek={(seconds) => {\r\n commands.seekTo(seconds);\r\n }}\r\n status={state.status}\r\n />\r\n </div>\r\n </PlayerSurface>\r\n );\r\n}\r\n","import type {\r\n PlaybackContextInput,\r\n PlayerAppearance,\r\n QueueItem,\r\n} from \"../contracts/player\";\r\nimport { BoundCompactPlayerView } from \"../ui/bound-compact-player-view\";\r\nimport { useBoundPlayer } from \"./use-bound-player\";\r\nimport { usePlayer } from \"./use-player\";\r\n\r\nexport interface BoundCompactPlayerProps {\r\n readonly appearance: PlayerAppearance;\r\n readonly context: PlaybackContextInput;\r\n readonly queueItem: QueueItem;\r\n readonly className?: string;\r\n}\r\n\r\nexport function BoundCompactPlayer({\r\n appearance,\r\n className,\r\n context,\r\n queueItem,\r\n}: BoundCompactPlayerProps) {\r\n const bound = useBoundPlayer({ context, queueItem });\r\n const player = usePlayer();\r\n\r\n return (\r\n <BoundCompactPlayerView\r\n appearance={appearance}\r\n {...(className === undefined ? {} : { className })}\r\n commands={bound.commands}\r\n contextId={context.id}\r\n contextMode={context.mode}\r\n runtimeStatus={player.runtimeStatus}\r\n options={{\r\n seekCommitMode: player.state.experienceConfig.seekCommitMode,\r\n waveformOpacity: player.state.experienceConfig.waveformOpacity,\r\n waveformPlayedStateEnabled:\r\n player.state.experienceConfig.waveformPlayedStateEnabled,\r\n }}\r\n state={bound.state}\r\n />\r\n );\r\n}\r\n"]}
|