@gentomiyano/optimized-web-audio-player 0.1.0

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.
Files changed (53) hide show
  1. package/README.md +159 -0
  2. package/dist/config/index.d.ts +37 -0
  3. package/dist/config/index.js +280 -0
  4. package/dist/config/index.js.map +1 -0
  5. package/dist/consumer/index.d.ts +27 -0
  6. package/dist/consumer/index.js +38 -0
  7. package/dist/consumer/index.js.map +1 -0
  8. package/dist/consumer-smoke/node_modules/.modules.yaml +30 -0
  9. package/dist/consumer-smoke/node_modules/.package-map.json +1 -0
  10. package/dist/consumer-smoke/node_modules/.pnpm/lock.yaml +57 -0
  11. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/LICENSE +21 -0
  12. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/README.md +9 -0
  13. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_mock.development.js +414 -0
  14. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_mock.production.js +406 -0
  15. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_post_task.development.js +150 -0
  16. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler-unstable_post_task.production.js +140 -0
  17. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.development.js +364 -0
  18. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.native.development.js +350 -0
  19. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.native.production.js +330 -0
  20. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/cjs/scheduler.production.js +340 -0
  21. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/index.js +7 -0
  22. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/index.native.js +7 -0
  23. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/package.json +27 -0
  24. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/unstable_mock.js +7 -0
  25. package/dist/consumer-smoke/node_modules/.pnpm/scheduler@0.27.0/node_modules/scheduler/unstable_post_task.js +7 -0
  26. package/dist/consumer-smoke/node_modules/.pnpm-workspace-state-v1.json +29 -0
  27. package/dist/contracts/index.d.ts +15 -0
  28. package/dist/contracts/index.js +3 -0
  29. package/dist/contracts/index.js.map +1 -0
  30. package/dist/index.d.ts +6 -0
  31. package/dist/index.js +368 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/media-delivery/index.d.ts +185 -0
  34. package/dist/media-delivery/index.js +91 -0
  35. package/dist/media-delivery/index.js.map +1 -0
  36. package/dist/media-element-C9dis4aG.d.ts +40 -0
  37. package/dist/player-DE9Vqztu.d.ts +212 -0
  38. package/dist/ports/index.d.ts +32 -0
  39. package/dist/ports/index.js +3 -0
  40. package/dist/ports/index.js.map +1 -0
  41. package/dist/react/index.d.ts +86 -0
  42. package/dist/react/index.js +2393 -0
  43. package/dist/react/index.js.map +1 -0
  44. package/dist/testing/index.d.ts +36 -0
  45. package/dist/testing/index.js +365 -0
  46. package/dist/testing/index.js.map +1 -0
  47. package/dist/ui/index.d.ts +143 -0
  48. package/dist/ui/index.js +1344 -0
  49. package/dist/ui/index.js.map +1 -0
  50. package/dist/ui/player-tokens.css +572 -0
  51. package/dist/ui/player-views.css +654 -0
  52. package/dist/ui/styles.css +2 -0
  53. package/package.json +97 -0
@@ -0,0 +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"],"names":["clampVolume","version","contextValue","useRef","useEffect","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n PlayerError,\n PlayerMediaSource,\n} from \"../../contracts/player\";\nimport type {\n MediaElementStateSnapshot,\n MediaElementPort,\n PlayerMediaEventListener,\n PlayerMediaEventType,\n} from \"../../ports/media-element\";\n\nfunction clampVolume(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.min(Math.max(value, 0), 1);\n}\n\nfunction classifyMediaError(\n mediaError: MediaError | null,\n): PlayerError | null {\n if (mediaError === null) {\n return null;\n }\n\n switch (mediaError.code) {\n case MediaError.MEDIA_ERR_NETWORK:\n return {\n code: \"network\",\n recoverable: true,\n messageKey: \"player.error.network\",\n };\n case MediaError.MEDIA_ERR_DECODE:\n return {\n code: \"decode\",\n recoverable: false,\n messageKey: \"player.error.decode\",\n };\n case MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED:\n return {\n code: \"unsupported\",\n recoverable: false,\n messageKey: \"player.error.unsupported\",\n };\n default:\n return {\n code: \"unknown\",\n recoverable: true,\n messageKey: \"player.error.unknown\",\n };\n }\n}\n\nexport class BrowserMediaElementPort implements MediaElementPort {\n readonly #element: HTMLAudioElement;\n readonly #listeners = new Map<\n PlayerMediaEventType,\n Map<PlayerMediaEventListener, EventListener>\n >();\n #assignedSourceUrl: string | null = null;\n\n constructor(element: HTMLAudioElement) {\n this.#element = element;\n }\n\n getCurrentTimeSec(): number {\n return Number.isFinite(this.#element.currentTime)\n ? Math.max(this.#element.currentTime, 0)\n : 0;\n }\n\n getDurationSec(): number | null {\n return Number.isFinite(this.#element.duration) && this.#element.duration > 0\n ? this.#element.duration\n : null;\n }\n\n getVolume(): number {\n return clampVolume(this.#element.volume);\n }\n\n isMuted(): boolean {\n return this.#element.muted;\n }\n\n isPaused(): boolean {\n return this.#element.paused;\n }\n\n getStateSnapshot(): MediaElementStateSnapshot {\n const currentSource =\n this.#element.currentSrc || this.#element.getAttribute(\"src\") || \"\";\n const baseUrl = this.#element.baseURI;\n let normalizedCurrentSource = currentSource;\n if (currentSource.length > 0) {\n try {\n normalizedCurrentSource = new URL(\n currentSource,\n baseUrl,\n ).href;\n } catch {\n // Invalid source remains unequal to the assigned source.\n }\n }\n\n return Object.freeze({\n currentTimeSec: this.getCurrentTimeSec(),\n durationSec: this.getDurationSec(),\n volume: this.getVolume(),\n muted: this.isMuted(),\n paused: this.isPaused(),\n ended: this.#element.ended,\n hasCurrentSource: currentSource.length > 0,\n currentSourceMatchesAssigned:\n this.#assignedSourceUrl !== null &&\n normalizedCurrentSource === this.#assignedSourceUrl,\n });\n }\n\n getError(): PlayerError | null {\n return classifyMediaError(this.#element.error);\n }\n\n setSource(source: PlayerMediaSource): void {\n this.#element.pause();\n this.#element.crossOrigin = source.crossOrigin;\n this.#element.src = source.url;\n this.#assignedSourceUrl = this.#element.src;\n }\n\n clearSource(): void {\n this.#element.pause();\n this.#assignedSourceUrl = null;\n this.#element.removeAttribute(\"src\");\n this.#element.load();\n }\n\n load(): void {\n this.#element.load();\n }\n\n async play(): Promise<void> {\n await this.#element.play();\n }\n\n pause(): void {\n this.#element.pause();\n }\n\n seekTo(seconds: number): void {\n if (!Number.isFinite(seconds)) {\n return;\n }\n this.#element.currentTime = Math.max(seconds, 0);\n }\n\n setVolume(volume: number): void {\n this.#element.volume = clampVolume(volume);\n }\n\n setMuted(muted: boolean): void {\n this.#element.muted = muted;\n }\n\n addEventListener(\n type: PlayerMediaEventType,\n listener: PlayerMediaEventListener,\n ): void {\n const typeListeners =\n this.#listeners.get(type) ??\n new Map<PlayerMediaEventListener, EventListener>();\n if (typeListeners.has(listener)) {\n return;\n }\n\n const nativeListener: EventListener = () => {\n listener({ type });\n };\n typeListeners.set(listener, nativeListener);\n this.#listeners.set(type, typeListeners);\n this.#element.addEventListener(type, nativeListener);\n }\n\n removeEventListener(\n type: PlayerMediaEventType,\n listener: PlayerMediaEventListener,\n ): void {\n const typeListeners = this.#listeners.get(type);\n const nativeListener = typeListeners?.get(listener);\n if (nativeListener === undefined) {\n return;\n }\n\n this.#element.removeEventListener(type, nativeListener);\n typeListeners?.delete(listener);\n if (typeListeners?.size === 0) {\n this.#listeners.delete(type);\n }\n }\n}\n","import type { GainPort } from \"../../ports/gain\";\n\nexport type PlayerAudioMode = \"auto\" | \"web-audio\" | \"html-media\";\nexport type ResolvedPlayerAudioMode = \"web-audio\" | \"html-media\";\n\nexport interface BrowserAudioPlatform {\n readonly userAgent: string;\n readonly platform?: string;\n readonly maxTouchPoints?: number;\n}\n\nexport function isIOSWebPlatform(\n platform: BrowserAudioPlatform,\n): boolean {\n if (/\\b(iPhone|iPad|iPod)\\b/i.test(platform.userAgent)) {\n return true;\n }\n\n return (\n platform.platform === \"MacIntel\" &&\n (platform.maxTouchPoints ?? 0) > 1\n );\n}\n\nexport function resolvePlayerAudioMode(\n requested: PlayerAudioMode,\n platform: BrowserAudioPlatform,\n): ResolvedPlayerAudioMode {\n if (requested !== \"auto\") {\n return requested;\n }\n\n // iOS/iPadOS background continuity takes priority over fades. Creating a\n // MediaElementAudioSourceNode can make output depend on a suspended\n // AudioContext, so auto mode keeps native HTML audio on these platforms.\n return isIOSWebPlatform(platform) ? \"html-media\" : \"web-audio\";\n}\n\n/**\n * Native HTMLAudioElement fallback. Core volume remains on the media element;\n * gain transitions resolve immediately, intentionally disabling fades.\n */\nexport class HtmlMediaElementGainPort implements GainPort {\n activateFromUserGesture(): Promise<void> {\n // The media element itself is activated by PlayerCommands.play().\n return Promise.resolve();\n }\n\n resumeIfSuspended(): Promise<boolean> {\n return Promise.resolve(false);\n }\n\n getValue(): number {\n return 1;\n }\n\n setValue(): void {\n // No separate gain stage in fallback mode.\n }\n\n cancelTransition(): void {\n // No scheduled gain work in fallback mode.\n }\n\n transitionTo(): Promise<void> {\n return Promise.resolve();\n }\n\n destroy(): Promise<void> {\n return Promise.resolve();\n }\n}\n","import type { FadeCurve } from \"../../contracts/player\";\nimport type {\n GainPort,\n GainTransition,\n} from \"../../ports/gain\";\n\nexport interface LazyWebAudioGainPortOptions {\n readonly createAudioContext?: () => AudioContext;\n readonly onContextStateChange?: (state: AudioContextState | \"uninitialized\") => void;\n}\n\ninterface PendingTransition {\n readonly timerId: ReturnType<typeof setTimeout>;\n readonly resolve: () => void;\n}\n\nconst MIN_TRANSITION_SETTLE_MS = 32;\n\nfunction clampGain(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n return Math.min(Math.max(value, 0), 1);\n}\n\nfunction easingProgress(\n curve: FadeCurve,\n progress: number,\n isFadeIn: boolean,\n): number {\n switch (curve) {\n case \"ease-in\":\n return progress * progress;\n case \"ease-out\":\n return 1 - (1 - progress) ** 2;\n case \"equal-power\":\n return isFadeIn\n ? Math.sin((progress * Math.PI) / 2)\n : 1 - Math.cos((progress * Math.PI) / 2);\n case \"linear\":\n return progress;\n }\n}\n\nfunction createCurve(\n start: number,\n target: number,\n curve: FadeCurve,\n): Float32Array<ArrayBuffer> {\n const values = new Float32Array(64);\n const isFadeIn = target >= start;\n for (let index = 0; index < values.length; index += 1) {\n const progress = index / (values.length - 1);\n const eased = easingProgress(curve, progress, isFadeIn);\n values[index] = start + (target - start) * eased;\n }\n return values;\n}\n\nfunction transitionSettleMs(context: AudioContext): number {\n const contextWithLatency = context as AudioContext & {\n readonly baseLatency?: number;\n readonly outputLatency?: number;\n };\n const baseLatency = Number.isFinite(contextWithLatency.baseLatency)\n ? Math.max(0, contextWithLatency.baseLatency)\n : 0;\n const outputLatency = Number.isFinite(contextWithLatency.outputLatency)\n ? Math.max(0, contextWithLatency.outputLatency)\n : 0;\n\n return Math.max(\n MIN_TRANSITION_SETTLE_MS,\n Math.ceil((baseLatency + outputLatency) * 1_000) + 8,\n );\n}\n\nexport class LazyWebAudioGainPort implements GainPort {\n readonly #element: HTMLAudioElement;\n readonly #createAudioContext: () => AudioContext;\n readonly #onContextStateChange:\n | ((state: AudioContextState | \"uninitialized\") => void)\n | undefined;\n readonly #pendingTransitions = new Set<PendingTransition>();\n\n #context: AudioContext | null = null;\n #source: MediaElementAudioSourceNode | null = null;\n #gain: GainNode | null = null;\n #value = 1;\n\n constructor(\n element: HTMLAudioElement,\n options: LazyWebAudioGainPortOptions = {},\n ) {\n this.#element = element;\n this.#createAudioContext =\n options.createAudioContext ??\n (() => {\n const audioWindow = window as unknown as {\n readonly AudioContext?: typeof AudioContext;\n readonly webkitAudioContext?: typeof AudioContext;\n };\n const AudioContextConstructor =\n audioWindow.AudioContext ?? audioWindow.webkitAudioContext;\n if (AudioContextConstructor === undefined) {\n throw new Error(\"Web Audio is not supported.\");\n }\n return new AudioContextConstructor();\n });\n this.#onContextStateChange = options.onContextStateChange;\n this.#notifyState();\n }\n\n activateFromUserGesture(): Promise<void> {\n if (this.#context === null) {\n const context = this.#createAudioContext();\n const gain = context.createGain();\n const source = context.createMediaElementSource(this.#element);\n gain.gain.value = this.#value;\n source.connect(gain);\n gain.connect(context.destination);\n this.#context = context;\n this.#source = source;\n this.#gain = gain;\n context.addEventListener(\"statechange\", this.#notifyState);\n this.#notifyState();\n }\n\n if (this.#context.state === \"suspended\") {\n return this.#context.resume().then(() => {\n this.#notifyState();\n });\n }\n return Promise.resolve();\n }\n\n async resumeIfSuspended(): Promise<boolean> {\n if (this.#context === null || this.#context.state !== \"suspended\") {\n return false;\n }\n await this.#context.resume();\n this.#notifyState();\n return true;\n }\n\n getValue(): number {\n return this.#gain?.gain.value ?? this.#value;\n }\n\n getContextState(): AudioContextState | \"uninitialized\" {\n return this.#context?.state ?? \"uninitialized\";\n }\n\n setValue(value: number): void {\n this.cancelTransition();\n this.#value = clampGain(value);\n if (this.#context !== null && this.#gain !== null) {\n const now = this.#context.currentTime;\n this.#gain.gain.setValueAtTime(this.#value, now);\n }\n }\n\n cancelTransition(): void {\n if (this.#context !== null && this.#gain !== null) {\n const now = this.#context.currentTime;\n const heldValue = this.#gain.gain.value;\n this.#gain.gain.cancelScheduledValues(0);\n this.#gain.gain.setValueAtTime(heldValue, now);\n }\n\n for (const pending of this.#pendingTransitions) {\n clearTimeout(pending.timerId);\n pending.resolve();\n }\n this.#pendingTransitions.clear();\n }\n\n transitionTo(\n value: number,\n transition: GainTransition,\n ): Promise<void> {\n const target = clampGain(value);\n const durationMs = Math.max(0, transition.durationMs);\n\n if (this.#context === null || this.#gain === null || durationMs === 0) {\n this.setValue(target);\n return Promise.resolve();\n }\n\n this.cancelTransition();\n const start = this.#gain.gain.value;\n const durationSec = durationMs / 1_000;\n this.#gain.gain.setValueCurveAtTime(\n createCurve(start, target, transition.curve),\n this.#context.currentTime,\n durationSec,\n );\n this.#value = target;\n\n return new Promise((resolve) => {\n const pending: PendingTransition = {\n timerId: setTimeout(() => {\n this.#pendingTransitions.delete(pending);\n resolve();\n }, durationMs + transitionSettleMs(this.#context as AudioContext)),\n resolve,\n };\n this.#pendingTransitions.add(pending);\n });\n }\n\n async destroy(): Promise<void> {\n this.cancelTransition();\n const context = this.#context;\n if (context === null) {\n return;\n }\n\n context.removeEventListener(\"statechange\", this.#notifyState);\n this.#source?.disconnect();\n this.#gain?.disconnect();\n this.#source = null;\n this.#gain = null;\n this.#context = null;\n await context.close();\n this.#notifyState();\n }\n\n readonly #notifyState = (): void => {\n this.#onContextStateChange?.(\n this.#context?.state ?? \"uninitialized\",\n );\n };\n}\n","import type {\n PlayerCommands,\n PlayerState,\n} from \"../../contracts/player\";\n\nexport const PLAYER_MEDIA_SESSION_ACTIONS = [\n \"play\",\n \"pause\",\n \"stop\",\n \"previoustrack\",\n \"nexttrack\",\n \"seekto\",\n \"seekbackward\",\n \"seekforward\",\n] as const satisfies readonly MediaSessionAction[];\n\nconst MUSIC_MEDIA_SESSION_ACTIONS = [\n \"play\",\n \"pause\",\n \"stop\",\n \"previoustrack\",\n \"nexttrack\",\n \"seekto\",\n] as const satisfies readonly MediaSessionAction[];\n\ntype SupportedMediaSessionAction =\n (typeof PLAYER_MEDIA_SESSION_ACTIONS)[number];\n\nexport interface MediaSessionPort {\n metadata: MediaMetadata | null;\n playbackState: MediaSessionPlaybackState;\n setActionHandler(\n action: MediaSessionAction,\n handler: MediaSessionActionHandler | null,\n ): void;\n setPositionState(state?: MediaPositionState): void;\n}\n\nexport interface BrowserMediaSessionControllerOptions {\n readonly commands: PlayerCommands;\n readonly getState: () => Readonly<PlayerState>;\n readonly mediaSession?: MediaSessionPort;\n readonly createMetadata?: (init: MediaMetadataInit) => MediaMetadata;\n readonly onAction?: (action: SupportedMediaSessionAction) => void;\n readonly onActionError?: (action: SupportedMediaSessionAction) => void;\n}\n\nfunction observeCommand(\n command: Promise<unknown>,\n action: SupportedMediaSessionAction,\n onError: ((action: SupportedMediaSessionAction) => void) | undefined,\n): void {\n void command.catch(() => {\n onError?.(action);\n });\n}\n\nfunction defaultSeekOffset(\n state: Readonly<PlayerState>,\n direction: \"backward\" | \"forward\",\n): number {\n if (state.mediaKind !== \"podcastEpisode\") {\n return 10;\n }\n return direction === \"backward\"\n ? state.experienceConfig.podcastBackSec\n : state.experienceConfig.podcastForwardSec;\n}\n\nfunction playbackStateFor(\n state: Readonly<PlayerState>,\n): MediaSessionPlaybackState {\n if (state.currentItem === null) {\n return \"none\";\n }\n return state.status === \"playing\" ? \"playing\" : \"paused\";\n}\n\nexport class BrowserMediaSessionController {\n readonly #commands: PlayerCommands;\n readonly #getState: () => Readonly<PlayerState>;\n readonly #session: MediaSessionPort | undefined;\n readonly #createMetadata:\n | ((init: MediaMetadataInit) => MediaMetadata)\n | undefined;\n readonly #registeredActions = new Set<SupportedMediaSessionAction>();\n readonly #onAction:\n | ((action: SupportedMediaSessionAction) => void)\n | undefined;\n readonly #onActionError:\n | ((action: SupportedMediaSessionAction) => void)\n | undefined;\n\n #metadataIdentity: string | null = null;\n #actionsEnabled = false;\n\n constructor(options: BrowserMediaSessionControllerOptions) {\n this.#commands = options.commands;\n this.#getState = options.getState;\n this.#session = options.mediaSession;\n this.#createMetadata = options.createMetadata;\n this.#onAction = options.onAction;\n this.#onActionError = options.onActionError;\n }\n\n get supported(): boolean {\n return this.#session !== undefined;\n }\n\n get actionsEnabled(): boolean {\n return this.#actionsEnabled;\n }\n\n enableActionHandlers(): void {\n if (this.#actionsEnabled || this.#session === undefined) {\n return;\n }\n\n this.#actionsEnabled = true;\n this.#synchronizeActionHandlers(this.#getState());\n }\n\n update(state: Readonly<PlayerState>): void {\n const session = this.#session;\n if (session === undefined) {\n return;\n }\n\n try {\n session.playbackState = playbackStateFor(state);\n } catch {\n // Media Session is progressive enhancement.\n }\n\n this.#updateMetadata(state);\n this.#updatePosition(state);\n if (this.#actionsEnabled) {\n this.#synchronizeActionHandlers(state);\n }\n }\n\n destroy(): void {\n const session = this.#session;\n if (session === undefined) {\n return;\n }\n\n for (const action of this.#registeredActions) {\n try {\n session.setActionHandler(action, null);\n } catch {\n // Cleanup continues across partially supported implementations.\n }\n }\n this.#registeredActions.clear();\n this.#actionsEnabled = false;\n\n try {\n session.metadata = null;\n session.playbackState = \"none\";\n session.setPositionState();\n } catch {\n // Document teardown must not fail on Media Session cleanup.\n }\n }\n\n #createHandler(\n action: SupportedMediaSessionAction,\n ): MediaSessionActionHandler {\n const reportAction = (): void => {\n this.#onAction?.(action);\n };\n switch (action) {\n case \"play\":\n return () => {\n reportAction();\n observeCommand(this.#commands.play(), action, this.#onActionError);\n };\n case \"pause\":\n return () => {\n reportAction();\n observeCommand(this.#commands.pause(), action, this.#onActionError);\n };\n case \"stop\":\n return () => {\n reportAction();\n observeCommand(\n this.#commands.stop({ resetPosition: true }),\n action,\n this.#onActionError,\n );\n };\n case \"previoustrack\":\n return () => {\n reportAction();\n observeCommand(\n this.#commands.previous(),\n action,\n this.#onActionError,\n );\n };\n case \"nexttrack\":\n return () => {\n reportAction();\n observeCommand(this.#commands.next(), action, this.#onActionError);\n };\n case \"seekto\":\n return (details) => {\n reportAction();\n if (\n details.seekTime !== undefined &&\n Number.isFinite(details.seekTime)\n ) {\n this.#commands.seekTo(details.seekTime);\n }\n };\n case \"seekbackward\":\n return (details) => {\n reportAction();\n const fallback = defaultSeekOffset(\n this.#getState(),\n \"backward\",\n );\n const offset =\n details.seekOffset !== undefined &&\n Number.isFinite(details.seekOffset)\n ? Math.max(details.seekOffset, 0)\n : fallback;\n this.#commands.seekBy(-offset);\n };\n case \"seekforward\":\n return (details) => {\n reportAction();\n const fallback = defaultSeekOffset(\n this.#getState(),\n \"forward\",\n );\n const offset =\n details.seekOffset !== undefined &&\n Number.isFinite(details.seekOffset)\n ? Math.max(details.seekOffset, 0)\n : fallback;\n this.#commands.seekBy(offset);\n };\n }\n }\n\n #synchronizeActionHandlers(state: Readonly<PlayerState>): void {\n const session = this.#session;\n if (session === undefined) {\n return;\n }\n const desiredActions = new Set<SupportedMediaSessionAction>(\n state.mediaKind === \"podcastEpisode\"\n ? PLAYER_MEDIA_SESSION_ACTIONS\n : MUSIC_MEDIA_SESSION_ACTIONS,\n );\n\n for (const action of PLAYER_MEDIA_SESSION_ACTIONS) {\n const shouldRegister = desiredActions.has(action);\n const isRegistered = this.#registeredActions.has(action);\n if (shouldRegister === isRegistered) {\n continue;\n }\n try {\n session.setActionHandler(\n action,\n shouldRegister ? this.#createHandler(action) : null,\n );\n if (shouldRegister) {\n this.#registeredActions.add(action);\n } else {\n this.#registeredActions.delete(action);\n }\n } catch {\n // Unsupported action handlers must not affect ordinary playback.\n }\n }\n }\n\n #updateMetadata(state: Readonly<PlayerState>): void {\n const session = this.#session;\n const item = state.currentItem;\n if (session === undefined) {\n return;\n }\n if (item === null) {\n if (this.#metadataIdentity !== null) {\n try {\n session.metadata = null;\n } catch {\n // Progressive enhancement only.\n }\n this.#metadataIdentity = null;\n }\n return;\n }\n\n const identity = [\n item.id,\n item.title,\n item.creatorName ?? \"\",\n item.collectionTitle ?? \"\",\n item.artwork?.url ?? \"\",\n ].join(\"\\u0000\");\n if (\n identity === this.#metadataIdentity ||\n this.#createMetadata === undefined\n ) {\n return;\n }\n\n try {\n session.metadata = this.#createMetadata({\n title: item.title,\n artist: item.creatorName ?? \"\",\n album: item.collectionTitle ?? \"\",\n artwork:\n item.artwork === undefined\n ? []\n : [{ src: item.artwork.url }],\n });\n this.#metadataIdentity = identity;\n } catch {\n // Metadata failure must not stop audio or action handlers.\n }\n }\n\n #updatePosition(state: Readonly<PlayerState>): void {\n const session = this.#session;\n if (session === undefined) {\n return;\n }\n\n const duration = state.durationSec;\n if (\n duration === null ||\n !Number.isFinite(duration) ||\n duration <= 0\n ) {\n try {\n session.setPositionState();\n } catch {\n // Progressive enhancement only.\n }\n return;\n }\n\n const position = Math.min(\n Math.max(\n Number.isFinite(state.currentTimeSec)\n ? state.currentTimeSec\n : 0,\n 0,\n ),\n duration,\n );\n\n try {\n session.setPositionState({\n duration,\n playbackRate: 1,\n position,\n });\n } catch {\n // Invalid or unsupported position state must not affect playback.\n }\n }\n}\n\nexport function createBrowserMediaSessionController(\n options: Omit<\n BrowserMediaSessionControllerOptions,\n \"mediaSession\" | \"createMetadata\"\n >,\n): BrowserMediaSessionController {\n const mediaSession =\n typeof navigator !== \"undefined\" && \"mediaSession\" in navigator\n ? navigator.mediaSession\n : undefined;\n const createMetadata =\n typeof MediaMetadata === \"function\"\n ? (init: MediaMetadataInit) => new MediaMetadata(init)\n : undefined;\n\n return new BrowserMediaSessionController({\n ...options,\n ...(mediaSession === undefined ? {} : { mediaSession }),\n ...(createMetadata === undefined ? {} : { createMetadata }),\n });\n}\n","import type { PlayerExperienceConfig } from \"../contracts/player\";\n\nexport const PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION = 2 as const;\n\nexport const PLAYER_EXPERIENCE_CONFIG_LIMITS = Object.freeze({\n fadeMs: Object.freeze({ min: 0, max: 10_000 }),\n previousRestartThresholdSec: Object.freeze({ min: 0, max: 60 }),\n waveformOpacity: Object.freeze({ min: 0, max: 1 }),\n initialVolume: Object.freeze({ min: 0, max: 1 }),\n podcastSkipSec: Object.freeze({ minExclusive: 0, max: 3_600 }),\n});\n\nexport const PREVIEW_PLAYER_EXPERIENCE_CONFIG: Readonly<PlayerExperienceConfig> =\n Object.freeze({\n playFadeInMs: 300,\n pauseFadeOutMs: 600,\n trackChangeFadeOutMs: 300,\n trackChangeFadeInMs: 300,\n seekFadeMs: 120,\n fadeCurve: \"ease-out\",\n previousRestartThresholdSec: 3,\n seekCommitMode: \"on-release\",\n waveformPlayedStateEnabled: true,\n waveformOpacity: 0.72,\n initialShuffleEnabled: false,\n initialRepeatMode: \"off\",\n initialVolume: 0.8,\n persistMode: \"none\",\n podcastBackSec: 15,\n podcastForwardSec: 30,\n podcastPreviousMode: \"previous-episode\",\n });\n","import type {\n FadeCurve,\n PersistMode,\n PlayerExperienceConfig,\n PodcastPreviousMode,\n RepeatMode,\n SeekCommitMode,\n} from \"../contracts/player\";\nimport type { PlayerExperienceConfigValidationResult } from \"../contracts/config\";\nimport {\n PLAYER_EXPERIENCE_CONFIG_LIMITS,\n PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\n} from \"./defaults\";\n\nconst CONFIG_KEYS = [\n \"playFadeInMs\",\n \"pauseFadeOutMs\",\n \"trackChangeFadeOutMs\",\n \"trackChangeFadeInMs\",\n \"seekFadeMs\",\n \"fadeCurve\",\n \"previousRestartThresholdSec\",\n \"seekCommitMode\",\n \"waveformPlayedStateEnabled\",\n \"waveformOpacity\",\n \"initialShuffleEnabled\",\n \"initialRepeatMode\",\n \"initialVolume\",\n \"persistMode\",\n \"podcastBackSec\",\n \"podcastForwardSec\",\n \"podcastPreviousMode\",\n] as const satisfies readonly (keyof PlayerExperienceConfig)[];\n\nconst FADE_CURVES = new Set<FadeCurve>([\n \"linear\",\n \"ease-in\",\n \"ease-out\",\n \"equal-power\",\n]);\nconst SEEK_COMMIT_MODES = new Set<SeekCommitMode>([\"live\", \"on-release\"]);\nconst REPEAT_MODES = new Set<RepeatMode>([\"off\", \"all\", \"one\"]);\nconst PERSIST_MODES = new Set<PersistMode>([\"none\", \"session\", \"local\"]);\nconst PODCAST_PREVIOUS_MODES = new Set<PodcastPreviousMode>([\n \"previous-episode\",\n \"restart-episode\",\n]);\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction validateFiniteRange(\n value: unknown,\n path: string,\n min: number,\n max: number,\n errors: string[],\n): value is number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value < min ||\n value > max\n ) {\n errors.push(\n `${path} must be a finite number between ${String(min)} and ${String(max)}.`,\n );\n return false;\n }\n return true;\n}\n\nfunction validateBoolean(\n value: unknown,\n path: string,\n errors: string[],\n): value is boolean {\n if (typeof value !== \"boolean\") {\n errors.push(`${path} must be a boolean.`);\n return false;\n }\n return true;\n}\n\nfunction validateConfigRecord(\n value: unknown,\n options: { readonly partial: boolean },\n): PlayerExperienceConfigValidationResult {\n if (!isRecord(value)) {\n return { ok: false, errors: [\"config must be an object.\"] };\n }\n\n const errors: string[] = [];\n const allowedKeys = new Set<string>(CONFIG_KEYS);\n\n for (const key of Object.keys(value)) {\n if (!allowedKeys.has(key)) {\n errors.push(`config.${key} is not supported.`);\n }\n }\n\n if (!options.partial) {\n for (const key of CONFIG_KEYS) {\n if (!Object.hasOwn(value, key)) {\n errors.push(`config.${key} is required.`);\n }\n }\n }\n\n const has = (key: keyof PlayerExperienceConfig): boolean =>\n Object.hasOwn(value, key);\n const fadeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.fadeMs;\n\n for (const key of [\n \"playFadeInMs\",\n \"pauseFadeOutMs\",\n \"trackChangeFadeOutMs\",\n \"trackChangeFadeInMs\",\n \"seekFadeMs\",\n ] as const) {\n if (has(key)) {\n validateFiniteRange(value[key], `config.${key}`, fadeLimits.min, fadeLimits.max, errors);\n }\n }\n\n const thresholdLimits =\n PLAYER_EXPERIENCE_CONFIG_LIMITS.previousRestartThresholdSec;\n if (has(\"previousRestartThresholdSec\")) {\n validateFiniteRange(\n value.previousRestartThresholdSec,\n \"config.previousRestartThresholdSec\",\n thresholdLimits.min,\n thresholdLimits.max,\n errors,\n );\n }\n\n const volumeLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.initialVolume;\n if (has(\"initialVolume\")) {\n validateFiniteRange(\n value.initialVolume,\n \"config.initialVolume\",\n volumeLimits.min,\n volumeLimits.max,\n errors,\n );\n }\n\n const waveformOpacityLimits =\n PLAYER_EXPERIENCE_CONFIG_LIMITS.waveformOpacity;\n if (has(\"waveformOpacity\")) {\n validateFiniteRange(\n value.waveformOpacity,\n \"config.waveformOpacity\",\n waveformOpacityLimits.min,\n waveformOpacityLimits.max,\n errors,\n );\n }\n\n for (const key of [\n \"waveformPlayedStateEnabled\",\n \"initialShuffleEnabled\",\n ] as const) {\n if (has(key)) {\n validateBoolean(value[key], `config.${key}`, errors);\n }\n }\n\n const skipLimits = PLAYER_EXPERIENCE_CONFIG_LIMITS.podcastSkipSec;\n for (const key of [\"podcastBackSec\", \"podcastForwardSec\"] as const) {\n if (has(key)) {\n const candidate = value[key];\n const valid = validateFiniteRange(\n candidate,\n `config.${key}`,\n skipLimits.minExclusive,\n skipLimits.max,\n errors,\n );\n if (valid && candidate <= skipLimits.minExclusive) {\n errors.push(`config.${key} must be greater than 0.`);\n }\n }\n }\n\n if (has(\"fadeCurve\") && !FADE_CURVES.has(value.fadeCurve as FadeCurve)) {\n errors.push(\"config.fadeCurve is not supported.\");\n }\n if (\n has(\"seekCommitMode\") &&\n !SEEK_COMMIT_MODES.has(value.seekCommitMode as SeekCommitMode)\n ) {\n errors.push(\"config.seekCommitMode is not supported.\");\n }\n if (\n has(\"initialRepeatMode\") &&\n !REPEAT_MODES.has(value.initialRepeatMode as RepeatMode)\n ) {\n errors.push(\"config.initialRepeatMode is not supported.\");\n }\n if (has(\"persistMode\") && !PERSIST_MODES.has(value.persistMode as PersistMode)) {\n errors.push(\"config.persistMode is not supported.\");\n }\n if (\n has(\"podcastPreviousMode\") &&\n !PODCAST_PREVIOUS_MODES.has(\n value.podcastPreviousMode as PodcastPreviousMode,\n )\n ) {\n errors.push(\"config.podcastPreviousMode is not supported.\");\n }\n\n if (errors.length > 0) {\n return { ok: false, errors: Object.freeze(errors) };\n }\n\n const merged = options.partial\n ? { ...PREVIEW_PLAYER_EXPERIENCE_CONFIG, ...value }\n : value;\n\n return {\n ok: true,\n errors: [],\n value: Object.freeze({ ...merged }) as Readonly<PlayerExperienceConfig>,\n };\n}\n\nexport function validatePlayerExperienceConfig(\n value: unknown,\n): PlayerExperienceConfigValidationResult {\n return validateConfigRecord(value, { partial: false });\n}\n\nexport function validatePlayerExperienceConfigOverride(\n value: unknown,\n): PlayerExperienceConfigValidationResult {\n return validateConfigRecord(value, { partial: true });\n}\n\nexport function resolvePlayerExperienceConfig(\n override?: Partial<PlayerExperienceConfig>,\n): PlayerExperienceConfigValidationResult {\n return validatePlayerExperienceConfigOverride(override ?? {});\n}\n\nexport function parsePlayerExperienceConfigJson(\n json: string,\n): PlayerExperienceConfigValidationResult {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(json) as unknown;\n } catch {\n return { ok: false, errors: [\"Config JSON is not valid JSON.\"] };\n }\n\n if (!isRecord(parsed)) {\n return { ok: false, errors: [\"Config JSON envelope must be an object.\"] };\n }\n\n const envelopeKeys = Object.keys(parsed);\n const errors: string[] = [];\n\n for (const key of envelopeKeys) {\n if (key !== \"schemaVersion\" && key !== \"config\") {\n errors.push(`envelope.${key} is not supported.`);\n }\n }\n if (!Object.hasOwn(parsed, \"schemaVersion\")) {\n errors.push(\"envelope.schemaVersion is required.\");\n } else if (\n parsed.schemaVersion !== PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION\n ) {\n errors.push(\"envelope.schemaVersion is not supported.\");\n }\n if (!Object.hasOwn(parsed, \"config\")) {\n errors.push(\"envelope.config is required.\");\n }\n\n if (errors.length > 0) {\n return { ok: false, errors: Object.freeze(errors) };\n }\n\n return validatePlayerExperienceConfig(parsed.config);\n}\n\nexport function serializePlayerExperienceConfig(\n config: PlayerExperienceConfig,\n): string {\n const result = validatePlayerExperienceConfig(config);\n\n if (!result.ok) {\n throw new TypeError(result.errors.join(\" \"));\n }\n\n return JSON.stringify(\n {\n schemaVersion: PLAYER_EXPERIENCE_CONFIG_SCHEMA_VERSION,\n config: result.value,\n },\n null,\n 2,\n );\n}\n","import type {\n PlayerExperienceConfig,\n PlayerState,\n} from \"../contracts/player\";\nimport { resolvePlayerExperienceConfig } from \"./validation\";\n\nexport function createInitialPlayerState(\n experienceConfig?: Partial<PlayerExperienceConfig>,\n): Readonly<PlayerState> {\n const resolved = resolvePlayerExperienceConfig(experienceConfig);\n\n if (!resolved.ok) {\n throw new TypeError(resolved.errors.join(\" \"));\n }\n\n return Object.freeze({\n currentItem: null,\n currentItemId: null,\n currentQueueItemId: null,\n mediaKind: null,\n status: \"idle\",\n currentTimeSec: 0,\n durationSec: null,\n volume: resolved.value.initialVolume,\n muted: false,\n shuffleEnabled: resolved.value.initialShuffleEnabled,\n repeatMode: resolved.value.initialRepeatMode,\n queue: Object.freeze([]),\n currentQueueIndex: null,\n canSeek: false,\n canGoPrevious: false,\n canGoNext: false,\n needsUserGesture: false,\n lastTransitionCause: null,\n error: null,\n experienceConfig: resolved.value,\n });\n}\n","import type { FadeCurve, PlayerError } from \"../contracts/player\";\nimport type { GainPort } from \"../ports/gain\";\n\nexport interface FadeRequest {\n readonly target: number;\n readonly durationMs: number;\n readonly curve: FadeCurve;\n}\n\nexport interface FadeResult {\n readonly completed: boolean;\n readonly error: PlayerError | null;\n}\n\nconst AUDIO_CONTEXT_ERROR: PlayerError = Object.freeze({\n code: \"audio-context\",\n recoverable: true,\n messageKey: \"player.error.audio-context\",\n});\n\nexport async function runFade(\n gain: GainPort | undefined,\n request: FadeRequest,\n): Promise<FadeResult> {\n if (gain === undefined) {\n return { completed: true, error: null };\n }\n\n try {\n if (request.durationMs <= 0) {\n gain.setValue(request.target);\n } else {\n await gain.transitionTo(request.target, {\n durationMs: request.durationMs,\n curve: request.curve,\n });\n }\n\n return { completed: true, error: null };\n } catch {\n return { completed: false, error: AUDIO_CONTEXT_ERROR };\n }\n}\n","import type {\n PlayerError,\n PlayerErrorCode,\n} from \"../contracts/player\";\nimport type {\n MediaElementPort,\n PlayerMediaEventType,\n} from \"../ports/media-element\";\n\nexport const PLAYER_MEDIA_EVENT_TYPES: readonly PlayerMediaEventType[] =\n Object.freeze([\n \"loadstart\",\n \"loadedmetadata\",\n \"canplay\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"seeking\",\n \"seeked\",\n \"timeupdate\",\n \"ended\",\n \"error\",\n \"durationchange\",\n \"volumechange\",\n ]);\n\nconst PLAY_ERROR_DETAILS: Readonly<\n Record<string, { code: PlayerErrorCode; recoverable: boolean }>\n> = Object.freeze({\n NotAllowedError: Object.freeze({\n code: \"autoplay-blocked\",\n recoverable: true,\n }),\n NotSupportedError: Object.freeze({\n code: \"unsupported\",\n recoverable: false,\n }),\n AbortError: Object.freeze({\n code: \"unknown\",\n recoverable: true,\n }),\n});\n\nexport function createPlayerError(\n code: PlayerErrorCode,\n recoverable: boolean,\n): PlayerError {\n return Object.freeze({\n code,\n recoverable,\n messageKey: `player.error.${code}`,\n });\n}\n\nexport function classifyPlayError(\n error: unknown,\n media: MediaElementPort,\n): PlayerError {\n const mediaError = media.getError();\n if (mediaError !== null) {\n return mediaError;\n }\n\n const name =\n typeof error === \"object\" &&\n error !== null &&\n \"name\" in error &&\n typeof error.name === \"string\"\n ? error.name\n : \"\";\n const detail = PLAY_ERROR_DETAILS[name];\n\n return detail === undefined\n ? createPlayerError(\"unknown\", true)\n : createPlayerError(detail.code, detail.recoverable);\n}\n\nexport function readFiniteCurrentTime(media: MediaElementPort): number {\n const value = media.getCurrentTimeSec();\n return Number.isFinite(value) && value >= 0 ? value : 0;\n}\n\nexport function readFiniteDuration(\n media: MediaElementPort,\n): number | null {\n const value = media.getDurationSec();\n return value !== null && Number.isFinite(value) && value >= 0 ? value : null;\n}\n","import type { PlayerMediaItem } from \"../contracts/player\";\nimport type {\n PodcastProgress,\n PodcastProgressPort,\n} from \"../ports/persistence\";\n\nexport const DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC = 5;\n\nexport function isUsablePodcastProgress(\n progress: PodcastProgress | null,\n item: PlayerMediaItem,\n): progress is PodcastProgress {\n return (\n progress !== null &&\n progress.itemId === item.id &&\n Number.isFinite(progress.positionSec) &&\n progress.positionSec >= 0\n );\n}\n\nexport function createPodcastProgress(\n item: PlayerMediaItem,\n positionSec: number,\n now: () => Date,\n): PodcastProgress {\n return Object.freeze({\n itemId: item.id,\n positionSec,\n updatedAt: now().toISOString(),\n });\n}\n\nexport function canUsePodcastProgress(\n item: PlayerMediaItem | null,\n port: PodcastProgressPort | undefined,\n persistMode: \"none\" | \"session\" | \"local\",\n): item is PlayerMediaItem {\n return (\n item !== null &&\n item.kind === \"podcastEpisode\" &&\n port !== undefined &&\n persistMode !== \"none\"\n );\n}\n","import type {\n PlayerMediaItem,\n QueueItem,\n RepeatMode,\n} from \"../contracts/player\";\n\nexport function createLoadedQueueItem(item: PlayerMediaItem): QueueItem {\n return Object.freeze({\n queueItemId: `loaded:${item.id}`,\n item,\n });\n}\n\nexport function freezeQueue(\n queue: readonly QueueItem[],\n): readonly QueueItem[] {\n return Object.freeze([...queue]);\n}\n\nexport function findQueueIndex(\n queue: readonly QueueItem[],\n queueItemId: string,\n): number | null {\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\n return index < 0 ? null : index;\n}\n\nexport function hasUniqueQueueItemIds(queue: readonly QueueItem[]): boolean {\n return new Set(queue.map((entry) => entry.queueItemId)).size === queue.length;\n}\n\nexport function getNextQueueIndex(\n queue: readonly unknown[],\n currentIndex: number,\n repeatMode: RepeatMode,\n): number | null {\n if (queue.length === 0 || currentIndex < 0) {\n return null;\n }\n\n if (currentIndex < queue.length - 1) {\n return currentIndex + 1;\n }\n\n return repeatMode === \"all\" ? 0 : null;\n}\n\nexport function getPreviousQueueIndex(\n queue: readonly unknown[],\n currentIndex: number,\n): number | null {\n if (queue.length === 0 || currentIndex <= 0) {\n return null;\n }\n\n return currentIndex - 1;\n}\n","import type {\n PlayerState,\n QueueItem,\n} from \"../contracts/player\";\nimport { freezeQueue } from \"./queue\";\n\nexport type PlayerStatePatch = Partial<PlayerState>;\n\nfunction deriveCurrentIndex(\n queue: readonly QueueItem[],\n queueItemId: string | null,\n): number | null {\n if (queueItemId === null) {\n return null;\n }\n\n const index = queue.findIndex((entry) => entry.queueItemId === queueItemId);\n return index < 0 ? null : index;\n}\n\nexport function createPlayerSnapshot(\n previous: Readonly<PlayerState>,\n patch: PlayerStatePatch,\n): Readonly<PlayerState> {\n const queue =\n patch.queue === undefined ? previous.queue : freezeQueue(patch.queue);\n const currentQueueItemId =\n patch.currentQueueItemId === undefined\n ? previous.currentQueueItemId\n : patch.currentQueueItemId;\n const currentQueueIndex = deriveCurrentIndex(queue, currentQueueItemId);\n const repeatMode = patch.repeatMode ?? previous.repeatMode;\n const currentItem =\n patch.currentItem === undefined ? previous.currentItem : patch.currentItem;\n\n return Object.freeze({\n ...previous,\n ...patch,\n queue,\n currentQueueItemId,\n currentQueueIndex,\n canGoPrevious: patch.canGoPrevious ?? currentItem !== null,\n canGoNext:\n patch.canGoNext ??\n (currentQueueIndex !== null &&\n (currentQueueIndex < queue.length - 1 ||\n (queue.length > 0 && repeatMode === \"all\"))),\n });\n}\n","import type { QueueItem } from \"../contracts/player\";\n\nexport type PlayerRandomSource = () => number;\n\nfunction normalizeRandom(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.min(Math.max(value, 0), 0.999_999_999_999);\n}\n\nexport function shuffleQueueAroundCurrent(\n queue: readonly QueueItem[],\n currentQueueItemId: string,\n random: PlayerRandomSource,\n): readonly QueueItem[] {\n const current = queue.find(\n (entry) => entry.queueItemId === currentQueueItemId,\n );\n\n if (current === undefined) {\n return Object.freeze([...queue]);\n }\n\n const remaining = queue.filter(\n (entry) => entry.queueItemId !== currentQueueItemId,\n );\n\n for (let index = remaining.length - 1; index > 0; index -= 1) {\n const swapIndex = Math.floor(normalizeRandom(random()) * (index + 1));\n const candidate = remaining[index];\n const replacement = remaining[swapIndex];\n\n if (candidate !== undefined && replacement !== undefined) {\n remaining[index] = replacement;\n remaining[swapIndex] = candidate;\n }\n }\n\n return Object.freeze([current, ...remaining]);\n}\n","import {\n PREVIEW_PLAYER_EXPERIENCE_CONFIG,\n createInitialPlayerState,\n validatePlayerExperienceConfig,\n} from \"../config\";\nimport type {\n PauseOptions,\n PlayerCommandResult,\n PlayerCommands,\n PlayerError,\n PlayerExperienceConfig,\n PlayerExperienceConfigStore,\n PlayerMediaItem,\n PlayerMediaSyncReason,\n PlayerState,\n PlayerStore,\n QueueItem,\n RepeatMode,\n SetQueueOptions,\n StopOptions,\n} from \"../contracts/player\";\nimport type { GainPort } from \"../ports/gain\";\nimport type {\n MediaElementPort,\n PlayerMediaEvent,\n} from \"../ports/media-element\";\nimport type { PodcastProgressPort } from \"../ports/persistence\";\nimport { runFade } from \"./fade\";\nimport {\n PLAYER_MEDIA_EVENT_TYPES,\n classifyPlayError,\n createPlayerError,\n readFiniteCurrentTime,\n readFiniteDuration,\n} from \"./media-events\";\nimport {\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC,\n canUsePodcastProgress,\n createPodcastProgress,\n isUsablePodcastProgress,\n} from \"./persistence\";\nimport { createPlayerSnapshot } from \"./player-reducer\";\nimport {\n createLoadedQueueItem,\n findQueueIndex,\n freezeQueue,\n getNextQueueIndex,\n getPreviousQueueIndex,\n hasUniqueQueueItemIds,\n} from \"./queue\";\nimport {\n shuffleQueueAroundCurrent,\n type PlayerRandomSource,\n} from \"./shuffle\";\n\nexport interface CreatePlayerStoreOptions {\n readonly media: MediaElementPort;\n readonly gain?: GainPort;\n readonly podcastProgress?: PodcastProgressPort;\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\n readonly random?: PlayerRandomSource;\n readonly now?: () => Date;\n readonly podcastProgressSaveIntervalSec?: number;\n}\n\ntype Listener = () => void;\ntype DesiredPlayback = \"playing\" | \"paused\";\n\nconst OK_RESULT: PlayerCommandResult = Object.freeze({ ok: true });\nconst NO_ITEM_ERROR = createPlayerError(\"unknown\", false);\nconst INVALID_QUEUE_ERROR: PlayerError = Object.freeze({\n code: \"unknown\",\n recoverable: false,\n messageKey: \"player.error.invalid-queue\",\n});\nconst DESTROYED_ERROR: PlayerError = Object.freeze({\n code: \"unknown\",\n recoverable: false,\n messageKey: \"player.error.destroyed\",\n});\nconst MAX_SHUFFLE_HISTORY_ITEMS = 512;\nconst RETAINED_SHUFFLE_HISTORY_ITEMS = 128;\n\nfunction failed(error: PlayerError): PlayerCommandResult {\n return Object.freeze({ ok: false, error });\n}\n\nfunction clampVolume(value: number): number {\n if (!Number.isFinite(value)) {\n return 0;\n }\n\n return Math.min(Math.max(value, 0), 1);\n}\n\nclass CorePlayerStore implements PlayerStore {\n readonly commands: PlayerCommands;\n readonly experience: PlayerExperienceConfigStore;\n\n readonly #media: MediaElementPort;\n readonly #gain: GainPort | undefined;\n readonly #podcastProgress: PodcastProgressPort | undefined;\n readonly #random: PlayerRandomSource;\n readonly #now: () => Date;\n readonly #podcastProgressSaveIntervalSec: number;\n readonly #listeners = new Set<Listener>();\n readonly #experienceListeners = new Set<Listener>();\n readonly #mediaListener = (event: PlayerMediaEvent): void => {\n this.#handleMediaEvent(event);\n };\n\n #state: Readonly<PlayerState>;\n #playbackOrderQueueItemIds: readonly string[] = Object.freeze([]);\n #playbackOrderCursor = -1;\n #commandVersion = 0;\n #desiredPlayback: DesiredPlayback = \"paused\";\n #ignoreNextPauseEvent = false;\n #handlingEnded = false;\n #destroyed = false;\n #lastSavedPodcastPositions = new Map<string, number>();\n #progressSaveChain: Promise<void> = Promise.resolve();\n\n constructor(options: CreatePlayerStoreOptions) {\n this.#media = options.media;\n this.#gain = options.gain;\n this.#podcastProgress = options.podcastProgress;\n this.#random = options.random ?? Math.random;\n this.#now = options.now ?? (() => new Date());\n this.#podcastProgressSaveIntervalSec =\n options.podcastProgressSaveIntervalSec ??\n DEFAULT_PODCAST_PROGRESS_SAVE_INTERVAL_SEC;\n\n if (\n !Number.isFinite(this.#podcastProgressSaveIntervalSec) ||\n this.#podcastProgressSaveIntervalSec <= 0\n ) {\n throw new RangeError(\n \"podcastProgressSaveIntervalSec must be a positive finite number.\",\n );\n }\n\n this.#state = createInitialPlayerState(options.experienceConfig);\n this.#media.setVolume(this.#state.volume);\n this.#media.setMuted(this.#state.muted);\n try {\n this.#gain?.setValue(1);\n } catch {\n this.#state = createPlayerSnapshot(this.#state, {\n error: createPlayerError(\"audio-context\", true),\n });\n }\n\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\n this.#media.addEventListener(eventType, this.#mediaListener);\n }\n\n const commands: PlayerCommands = {\n load: (item) => this.#load(item),\n setQueue: (queue, commandOptions) =>\n this.#setQueue(queue, commandOptions),\n play: () => this.#play(),\n pause: (commandOptions) => this.#pause(commandOptions),\n stop: (commandOptions) => this.#stop(commandOptions),\n togglePlayback: () => this.#togglePlayback(),\n seekTo: (seconds) => {\n this.#seekTo(seconds);\n },\n seekBy: (deltaSeconds) => {\n this.#seekBy(deltaSeconds);\n },\n setVolume: (volume) => {\n this.#setVolume(volume);\n },\n toggleMute: () => {\n this.#toggleMute();\n },\n setShuffle: (enabled) => {\n this.#setShuffle(enabled);\n },\n setRepeatMode: (mode) => {\n this.#setRepeatMode(mode);\n },\n next: () => this.#next(),\n previous: () => this.#previous(),\n retry: () => this.#retry(),\n clear: () => this.#clear(),\n };\n this.commands = Object.freeze(commands);\n\n const experience: PlayerExperienceConfigStore = {\n getConfig: () => this.#state.experienceConfig,\n updateConfig: (patch) => {\n this.#updateExperienceConfig(patch);\n },\n resetConfig: () => {\n this.#replaceExperienceConfig(PREVIEW_PLAYER_EXPERIENCE_CONFIG);\n },\n subscribe: (listener) =>\n this.#subscribeTo(this.#experienceListeners, listener),\n };\n this.experience = Object.freeze(experience);\n }\n\n getState(): PlayerState {\n return this.#state;\n }\n\n subscribe(listener: Listener): () => void {\n return this.#subscribeTo(this.#listeners, listener);\n }\n\n async synchronizeFromMedia(\n reason: PlayerMediaSyncReason,\n ): Promise<void> {\n if (this.#destroyed || this.#state.currentItem === null) {\n return;\n }\n\n const snapshot = this.#media.getStateSnapshot();\n if (\n !snapshot.hasCurrentSource ||\n !snapshot.currentSourceMatchesAssigned\n ) {\n const error = createPlayerError(\"unknown\", true);\n this.#desiredPlayback = \"paused\";\n this.#setState({\n status: \"error\",\n lastTransitionCause: \"source-error\",\n error,\n });\n return;\n }\n\n if (snapshot.ended) {\n await this.#handleEnded();\n return;\n }\n\n const wasPlaying = this.#state.status === \"playing\";\n const externallyPaused = wasPlaying && snapshot.paused;\n this.#desiredPlayback = snapshot.paused ? \"paused\" : \"playing\";\n this.#setState({\n status: snapshot.paused ? \"paused\" : \"playing\",\n currentTimeSec: snapshot.currentTimeSec,\n durationSec: snapshot.durationSec,\n volume: clampVolume(snapshot.volume),\n muted: snapshot.muted,\n canSeek: snapshot.durationSec !== null,\n ...(externallyPaused\n ? {\n lastTransitionCause:\n reason === \"visibilitychange\" ||\n reason === \"pageshow\" ||\n reason === \"focus\" ||\n reason === \"audio-context-statechange\"\n ? (\"background-suspension\" as const)\n : (\"os-interruption\" as const),\n }\n : {}),\n });\n }\n\n async destroy(): Promise<void> {\n if (this.#destroyed) {\n return;\n }\n\n await this.#clear();\n this.#destroyed = true;\n this.#commandVersion += 1;\n try {\n this.#gain?.cancelTransition();\n } catch {\n // Listener and resource cleanup must continue after gain failure.\n }\n\n for (const eventType of PLAYER_MEDIA_EVENT_TYPES) {\n this.#media.removeEventListener(eventType, this.#mediaListener);\n }\n\n await this.#progressSaveChain;\n await this.#gain?.destroy();\n this.#listeners.clear();\n this.#experienceListeners.clear();\n }\n\n #subscribeTo(collection: Set<Listener>, listener: Listener): () => void {\n if (this.#destroyed) {\n return () => undefined;\n }\n\n collection.add(listener);\n return () => {\n collection.delete(listener);\n };\n }\n\n #setState(patch: Partial<PlayerState>): void {\n const queue = patch.queue ?? this.#state.queue;\n const currentItem =\n patch.currentItem === undefined\n ? this.#state.currentItem\n : patch.currentItem;\n const currentQueueItemId =\n patch.currentQueueItemId === undefined\n ? this.#state.currentQueueItemId\n : patch.currentQueueItemId;\n const repeatMode = patch.repeatMode ?? this.#state.repeatMode;\n const playbackIndex =\n currentQueueItemId === null ? -1 : this.#playbackOrderCursor;\n this.#state = createPlayerSnapshot(this.#state, {\n ...patch,\n canGoPrevious: currentItem !== null,\n canGoNext:\n playbackIndex >= 0 &&\n (playbackIndex < this.#playbackOrderQueueItemIds.length - 1 ||\n (this.#playbackOrderQueueItemIds.length > 0 &&\n repeatMode === \"all\")),\n queue,\n });\n for (const listener of this.#listeners) {\n listener();\n }\n }\n\n #beginCommand(desiredPlayback = this.#desiredPlayback): number {\n this.#commandVersion += 1;\n this.#desiredPlayback = desiredPlayback;\n\n try {\n this.#gain?.cancelTransition();\n } catch {\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\n }\n\n return this.#commandVersion;\n }\n\n #isCurrentCommand(version: number): boolean {\n return !this.#destroyed && version === this.#commandVersion;\n }\n\n #pauseMediaElement(): void {\n if (!this.#media.isPaused()) {\n this.#ignoreNextPauseEvent = true;\n }\n this.#media.pause();\n }\n\n #replaceExperienceConfig(\n config: Readonly<PlayerExperienceConfig>,\n ): void {\n const result = validatePlayerExperienceConfig(config);\n if (!result.ok) {\n throw new TypeError(result.errors.join(\" \"));\n }\n\n this.#setState({ experienceConfig: result.value });\n for (const listener of this.#experienceListeners) {\n listener();\n }\n }\n\n #updateExperienceConfig(\n patch: Partial<PlayerExperienceConfig>,\n ): void {\n this.#replaceExperienceConfig({\n ...this.#state.experienceConfig,\n ...patch,\n });\n }\n\n async #load(item: PlayerMediaItem): Promise<PlayerCommandResult> {\n return this.#setQueue([createLoadedQueueItem(item)]);\n }\n\n async #setQueue(\n queue: readonly QueueItem[],\n options: SetQueueOptions = {},\n ): Promise<PlayerCommandResult> {\n if (this.#destroyed) {\n return failed(DESTROYED_ERROR);\n }\n\n if (!hasUniqueQueueItemIds(queue)) {\n return failed(INVALID_QUEUE_ERROR);\n }\n\n if (queue.length === 0) {\n await this.#clear();\n return OK_RESULT;\n }\n\n const normalizedQueue = freezeQueue(queue);\n const startQueueItemId =\n options.startQueueItemId ?? normalizedQueue[0]?.queueItemId;\n const startIndex =\n startQueueItemId === undefined\n ? null\n : findQueueIndex(normalizedQueue, startQueueItemId);\n\n if (startIndex === null) {\n return failed(INVALID_QUEUE_ERROR);\n }\n\n const version = this.#beginCommand(\n options.autoplay === true ? \"playing\" : \"paused\",\n );\n const playbackQueue =\n this.#state.shuffleEnabled && startQueueItemId !== undefined\n ? shuffleQueueAroundCurrent(\n normalizedQueue,\n startQueueItemId,\n this.#random,\n )\n : normalizedQueue;\n this.#playbackOrderQueueItemIds = Object.freeze(\n playbackQueue.map((entry) => entry.queueItemId),\n );\n this.#playbackOrderCursor = this.#state.shuffleEnabled\n ? 0\n : startIndex;\n\n this.#setState({\n queue: normalizedQueue,\n repeatMode: this.#state.repeatMode,\n error: null,\n });\n\n return this.#selectQueueIndex(\n version,\n startIndex,\n options.autoplay === true,\n );\n }\n\n async #selectQueueIndex(\n version: number,\n index: number,\n autoplay: boolean,\n ): Promise<PlayerCommandResult> {\n const selected = this.#state.queue[index];\n if (selected === undefined) {\n return failed(INVALID_QUEUE_ERROR);\n }\n\n const config = this.#state.experienceConfig;\n const replacingCurrent = this.#state.currentItem !== null;\n let transitionError: PlayerError | null = null;\n\n if (replacingCurrent) {\n void this.#savePodcastProgress(true);\n\n if (this.#state.status === \"playing\") {\n const fadeResult = await runFade(this.#gain, {\n target: 0,\n durationMs: config.trackChangeFadeOutMs,\n curve: config.fadeCurve,\n });\n\n if (!this.#isCurrentCommand(version)) {\n return OK_RESULT;\n }\n if (fadeResult.error !== null) {\n transitionError = fadeResult.error;\n }\n }\n\n if (!this.#isCurrentCommand(version)) {\n return OK_RESULT;\n }\n\n this.#pauseMediaElement();\n }\n\n this.#setState({\n currentItem: selected.item,\n currentItemId: selected.item.id,\n currentQueueItemId: selected.queueItemId,\n mediaKind: selected.item.kind,\n status: \"loading\",\n currentTimeSec: 0,\n durationSec: null,\n canSeek: false,\n needsUserGesture: false,\n error: transitionError,\n });\n\n try {\n this.#media.setSource(selected.item.source);\n this.#media.load();\n } catch {\n const error = createPlayerError(\"unknown\", true);\n this.#setState({ status: \"error\", error });\n return failed(error);\n }\n\n await this.#restorePodcastProgress(version, selected.item);\n if (!this.#isCurrentCommand(version)) {\n return OK_RESULT;\n }\n\n return autoplay\n ? this.#playWithCommand(\n version,\n config.trackChangeFadeInMs,\n config.fadeCurve,\n )\n : OK_RESULT;\n }\n\n async #restorePodcastProgress(\n version: number,\n item: PlayerMediaItem,\n ): Promise<void> {\n const port = this.#podcastProgress;\n if (\n port === undefined ||\n !canUsePodcastProgress(\n item,\n port,\n this.#state.experienceConfig.persistMode,\n )\n ) {\n return;\n }\n\n try {\n const progress = await port.load(item.id);\n if (\n !this.#isCurrentCommand(version) ||\n this.#state.currentItemId !== item.id ||\n !isUsablePodcastProgress(progress, item)\n ) {\n return;\n }\n\n const duration = readFiniteDuration(this.#media);\n const target =\n duration === null\n ? progress.positionSec\n : Math.min(progress.positionSec, duration);\n this.#media.seekTo(target);\n this.#lastSavedPodcastPositions.set(item.id, target);\n this.#setState({ currentTimeSec: target });\n } catch {\n // Persistence failure must not prevent basic playback.\n }\n }\n\n async #play(): Promise<PlayerCommandResult> {\n if (this.#destroyed) {\n return failed(DESTROYED_ERROR);\n }\n\n const version = this.#beginCommand(\"playing\");\n const config = this.#state.experienceConfig;\n const result = await this.#playWithCommand(\n version,\n config.playFadeInMs,\n config.fadeCurve,\n );\n if (result.ok && this.#isCurrentCommand(version)) {\n this.#setState({ lastTransitionCause: \"user-play\" });\n }\n return result;\n }\n\n async #playWithCommand(\n version: number,\n fadeDurationMs: number,\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\n ): Promise<PlayerCommandResult> {\n if (this.#state.currentItem === null) {\n this.#desiredPlayback = \"paused\";\n return failed(NO_ITEM_ERROR);\n }\n\n if (this.#gain !== undefined) {\n try {\n this.#gain.setValue(fadeDurationMs > 0 ? 0 : 1);\n } catch {\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\n }\n }\n\n try {\n await this.#media.play();\n } catch (error) {\n if (!this.#isCurrentCommand(version)) {\n return OK_RESULT;\n }\n\n const playerError = classifyPlayError(error, this.#media);\n this.#desiredPlayback = \"paused\";\n this.#restoreGain();\n this.#setState({\n status: \"error\",\n needsUserGesture: playerError.code === \"autoplay-blocked\",\n ...(playerError.code === \"autoplay-blocked\"\n ? { lastTransitionCause: \"autoplay-blocked\" as const }\n : {}),\n error: playerError,\n });\n return failed(playerError);\n }\n\n if (!this.#isCurrentCommand(version)) {\n if (this.#desiredPlayback === \"paused\") {\n this.#pauseMediaElement();\n }\n return OK_RESULT;\n }\n\n this.#setState({\n status: \"playing\",\n needsUserGesture: false,\n error: null,\n });\n\n const fadeResult = await runFade(this.#gain, {\n target: 1,\n durationMs: fadeDurationMs,\n curve: fadeCurve,\n });\n\n if (\n this.#isCurrentCommand(version) &&\n fadeResult.error !== null\n ) {\n this.#setState({ error: fadeResult.error });\n }\n\n return OK_RESULT;\n }\n\n async #pause(options: PauseOptions = {}): Promise<void> {\n if (this.#destroyed) {\n return;\n }\n\n const version = this.#beginCommand(\"paused\");\n const config = this.#state.experienceConfig;\n await this.#halt(version, {\n fadeDurationMs:\n options.fade === false ? 0 : config.pauseFadeOutMs,\n fadeCurve: config.fadeCurve,\n resetPosition: false,\n transitionCause: \"user-pause\",\n });\n }\n\n async #stop(options: StopOptions = {}): Promise<void> {\n if (this.#destroyed) {\n return;\n }\n\n const version = this.#beginCommand(\"paused\");\n const config = this.#state.experienceConfig;\n await this.#halt(version, {\n fadeDurationMs:\n options.fade === false ? 0 : config.pauseFadeOutMs,\n fadeCurve: config.fadeCurve,\n resetPosition: options.resetPosition ?? true,\n transitionCause: \"user-stop\",\n });\n }\n\n async #halt(\n version: number,\n options: {\n readonly fadeDurationMs: number;\n readonly fadeCurve: PlayerExperienceConfig[\"fadeCurve\"];\n readonly resetPosition: boolean;\n readonly transitionCause?: \"user-pause\" | \"user-stop\";\n },\n ): Promise<boolean> {\n void this.#savePodcastProgress(true);\n\n const fadeResult = await runFade(this.#gain, {\n target: 0,\n durationMs: options.fadeDurationMs,\n curve: options.fadeCurve,\n });\n\n if (!this.#isCurrentCommand(version)) {\n return false;\n }\n if (fadeResult.error !== null) {\n this.#setState({ error: fadeResult.error });\n }\n\n this.#pauseMediaElement();\n if (options.resetPosition && this.#state.currentItem !== null) {\n this.#media.seekTo(0);\n }\n\n this.#setState({\n status: this.#state.currentItem === null ? \"idle\" : \"paused\",\n currentTimeSec: options.resetPosition\n ? 0\n : readFiniteCurrentTime(this.#media),\n ...(options.transitionCause === undefined\n ? {}\n : { lastTransitionCause: options.transitionCause }),\n });\n return true;\n }\n\n async #togglePlayback(): Promise<PlayerCommandResult> {\n if (this.#state.status === \"playing\") {\n await this.#pause();\n return OK_RESULT;\n }\n\n return this.#play();\n }\n\n #seekTo(seconds: number): void {\n if (\n this.#destroyed ||\n this.#state.currentItem === null ||\n !Number.isFinite(seconds)\n ) {\n return;\n }\n\n const duration = readFiniteDuration(this.#media);\n const lowerBounded = Math.max(seconds, 0);\n const target =\n duration === null\n ? lowerBounded\n : Math.min(lowerBounded, duration);\n const version = this.#beginCommand(this.#desiredPlayback);\n const config = this.#state.experienceConfig;\n void this.#performSeek(\n version,\n target,\n config.seekFadeMs,\n config.fadeCurve,\n );\n }\n\n #seekBy(deltaSeconds: number): void {\n if (!Number.isFinite(deltaSeconds)) {\n return;\n }\n\n this.#seekTo(readFiniteCurrentTime(this.#media) + deltaSeconds);\n }\n\n async #performSeek(\n version: number,\n target: number,\n fadeDurationMs: number,\n fadeCurve: PlayerExperienceConfig[\"fadeCurve\"],\n ): Promise<void> {\n const fadeOut = await runFade(this.#gain, {\n target: 0,\n durationMs: fadeDurationMs,\n curve: fadeCurve,\n });\n\n if (!this.#isCurrentCommand(version)) {\n return;\n }\n if (fadeOut.error !== null) {\n this.#setState({ error: fadeOut.error });\n }\n\n this.#setState({ status: \"seeking\" });\n this.#media.seekTo(target);\n this.#setState({ currentTimeSec: target });\n\n const fadeIn = await runFade(this.#gain, {\n target: 1,\n durationMs: fadeDurationMs,\n curve: fadeCurve,\n });\n\n if (!this.#isCurrentCommand(version)) {\n return;\n }\n if (fadeIn.error !== null) {\n this.#setState({ error: fadeIn.error });\n }\n\n this.#setState({\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\n });\n }\n\n #setVolume(volume: number): void {\n if (this.#destroyed) {\n return;\n }\n\n const normalized = clampVolume(volume);\n this.#media.setVolume(normalized);\n this.#setState({ volume: normalized });\n }\n\n #toggleMute(): void {\n if (this.#destroyed) {\n return;\n }\n\n const muted = !this.#state.muted;\n this.#media.setMuted(muted);\n this.#setState({ muted });\n }\n\n #setShuffle(enabled: boolean): void {\n if (\n this.#destroyed ||\n enabled === this.#state.shuffleEnabled\n ) {\n return;\n }\n\n const currentQueueItemId = this.#state.currentQueueItemId;\n if (currentQueueItemId === null) {\n this.#setState({ shuffleEnabled: enabled });\n return;\n }\n\n const playbackQueue = enabled\n ? shuffleQueueAroundCurrent(\n this.#state.queue,\n currentQueueItemId,\n this.#random,\n )\n : this.#state.queue;\n this.#playbackOrderQueueItemIds = Object.freeze(\n playbackQueue.map((entry) => entry.queueItemId),\n );\n this.#playbackOrderCursor = enabled\n ? 0\n : findQueueIndex(this.#state.queue, currentQueueItemId) ?? -1;\n this.#setState({\n shuffleEnabled: enabled,\n });\n }\n\n #setRepeatMode(mode: RepeatMode): void {\n if (this.#destroyed) {\n return;\n }\n\n this.#setState({ repeatMode: mode });\n }\n\n async #next(): Promise<PlayerCommandResult> {\n if (this.#destroyed) {\n return failed(DESTROYED_ERROR);\n }\n\n const currentQueueItemId = this.#state.currentQueueItemId;\n if (currentQueueItemId === null) {\n return failed(NO_ITEM_ERROR);\n }\n\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\n currentQueueItemId,\n );\n if (nextPlaybackIndex === null) {\n return OK_RESULT;\n }\n const nextQueueItemId =\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\n const nextIndex =\n nextQueueItemId === undefined\n ? null\n : findQueueIndex(this.#state.queue, nextQueueItemId);\n if (nextIndex === null) {\n return failed(INVALID_QUEUE_ERROR);\n }\n this.#playbackOrderCursor = nextPlaybackIndex;\n\n const autoplay = this.#state.status === \"playing\";\n const version = this.#beginCommand(\n autoplay ? \"playing\" : \"paused\",\n );\n return this.#selectQueueIndex(version, nextIndex, autoplay);\n }\n\n async #previous(): Promise<PlayerCommandResult> {\n if (this.#destroyed) {\n return failed(DESTROYED_ERROR);\n }\n\n const currentIndex = this.#state.currentQueueIndex;\n const currentItem = this.#state.currentItem;\n if (currentIndex === null || currentItem === null) {\n return failed(NO_ITEM_ERROR);\n }\n\n const config = this.#state.experienceConfig;\n const currentTime = readFiniteCurrentTime(this.#media);\n const shouldRestartTrack =\n currentItem.kind === \"track\" &&\n config.previousRestartThresholdSec > 0 &&\n currentTime >= config.previousRestartThresholdSec;\n const shouldRestartPodcast =\n currentItem.kind === \"podcastEpisode\" &&\n config.podcastPreviousMode === \"restart-episode\";\n const previousPlaybackIndex = getPreviousQueueIndex(\n this.#playbackOrderQueueItemIds,\n this.#playbackOrderCursor,\n );\n const previousQueueItemId =\n previousPlaybackIndex === null\n ? undefined\n : this.#playbackOrderQueueItemIds[previousPlaybackIndex];\n const previousIndex =\n previousQueueItemId === undefined\n ? null\n : findQueueIndex(this.#state.queue, previousQueueItemId);\n\n if (\n shouldRestartTrack ||\n shouldRestartPodcast ||\n previousPlaybackIndex === null ||\n previousIndex === null\n ) {\n this.#seekTo(0);\n return OK_RESULT;\n }\n this.#playbackOrderCursor = previousPlaybackIndex;\n\n const autoplay = this.#state.status === \"playing\";\n const version = this.#beginCommand(\n autoplay ? \"playing\" : \"paused\",\n );\n return this.#selectQueueIndex(version, previousIndex, autoplay);\n }\n\n async #retry(): Promise<PlayerCommandResult> {\n if (this.#destroyed) {\n return failed(DESTROYED_ERROR);\n }\n\n if (\n this.#state.currentQueueIndex === null ||\n this.#state.error === null ||\n !this.#state.error.recoverable\n ) {\n return failed(this.#state.error ?? NO_ITEM_ERROR);\n }\n\n const version = this.#beginCommand(\"playing\");\n this.#setState({ error: null, needsUserGesture: false });\n return this.#selectQueueIndex(\n version,\n this.#state.currentQueueIndex,\n true,\n );\n }\n\n async #clear(): Promise<void> {\n if (this.#destroyed) {\n return;\n }\n\n const version = this.#beginCommand(\"paused\");\n const config = this.#state.experienceConfig;\n const halted = await this.#halt(version, {\n fadeDurationMs: config.pauseFadeOutMs,\n fadeCurve: config.fadeCurve,\n resetPosition: true,\n });\n\n if (!halted || !this.#isCurrentCommand(version)) {\n return;\n }\n\n this.#media.clearSource();\n this.#playbackOrderQueueItemIds = Object.freeze([]);\n this.#playbackOrderCursor = -1;\n this.#setState({\n currentItem: null,\n currentItemId: null,\n currentQueueItemId: null,\n mediaKind: null,\n status: \"idle\",\n currentTimeSec: 0,\n durationSec: null,\n queue: Object.freeze([]),\n canSeek: false,\n needsUserGesture: false,\n error: null,\n });\n }\n\n #restoreGain(): void {\n try {\n this.#gain?.setValue(1);\n } catch {\n this.#setState({ error: createPlayerError(\"audio-context\", true) });\n }\n }\n\n async #savePodcastProgress(force: boolean): Promise<void> {\n const item = this.#state.currentItem;\n const port = this.#podcastProgress;\n if (\n port === undefined ||\n !canUsePodcastProgress(\n item,\n port,\n this.#state.experienceConfig.persistMode,\n )\n ) {\n return;\n }\n\n const position = readFiniteCurrentTime(this.#media);\n const lastPosition = this.#lastSavedPodcastPositions.get(item.id);\n if (\n !force &&\n lastPosition !== undefined &&\n Math.abs(position - lastPosition) <\n this.#podcastProgressSaveIntervalSec\n ) {\n return;\n }\n\n const progress = createPodcastProgress(item, position, this.#now);\n this.#lastSavedPodcastPositions.set(item.id, position);\n this.#progressSaveChain = this.#progressSaveChain\n .then(() => port.save(progress))\n .catch(() => undefined);\n await this.#progressSaveChain;\n }\n\n #handleMediaEvent(event: PlayerMediaEvent): void {\n if (this.#destroyed) {\n return;\n }\n\n const snapshot = this.#media.getStateSnapshot();\n if (\n this.#state.currentItem !== null &&\n (!snapshot.hasCurrentSource ||\n !snapshot.currentSourceMatchesAssigned)\n ) {\n this.#desiredPlayback = \"paused\";\n this.#setState({\n status: \"error\",\n lastTransitionCause: \"source-error\",\n error: createPlayerError(\"unknown\", true),\n });\n return;\n }\n this.#setState({\n currentTimeSec: snapshot.currentTimeSec,\n durationSec: snapshot.durationSec,\n volume: clampVolume(snapshot.volume),\n muted: snapshot.muted,\n canSeek: snapshot.durationSec !== null,\n });\n\n switch (event.type) {\n case \"loadstart\":\n this.#setState({ status: \"loading\" });\n break;\n case \"loadedmetadata\":\n case \"durationchange\": {\n const duration = readFiniteDuration(this.#media);\n this.#setState({\n durationSec: duration,\n canSeek: duration !== null,\n });\n break;\n }\n case \"canplay\":\n this.#setState({\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\n });\n break;\n case \"play\":\n case \"playing\":\n if (this.#desiredPlayback === \"paused\") {\n this.#pauseMediaElement();\n break;\n }\n this.#setState({\n status: \"playing\",\n needsUserGesture: false,\n error: null,\n });\n break;\n case \"pause\":\n if (this.#ignoreNextPauseEvent) {\n this.#ignoreNextPauseEvent = false;\n break;\n }\n if (this.#desiredPlayback === \"playing\") {\n this.#desiredPlayback = \"paused\";\n }\n if (this.#state.status !== \"ended\") {\n this.#setState({\n status:\n this.#state.currentItem === null ? \"idle\" : \"paused\",\n ...(this.#state.status === \"playing\"\n ? { lastTransitionCause: \"os-interruption\" as const }\n : {}),\n });\n }\n break;\n case \"waiting\":\n case \"stalled\":\n this.#setState({ status: \"loading\" });\n break;\n case \"seeking\":\n this.#setState({ status: \"seeking\" });\n break;\n case \"seeked\":\n this.#setState({\n currentTimeSec: readFiniteCurrentTime(this.#media),\n status: this.#media.isPaused() ? \"paused\" : \"playing\",\n });\n break;\n case \"timeupdate\":\n this.#setState({\n currentTimeSec: readFiniteCurrentTime(this.#media),\n ...(this.#state.status === \"loading\" && !snapshot.paused\n ? { status: \"playing\" as const }\n : {}),\n });\n void this.#savePodcastProgress(false);\n break;\n case \"ended\":\n void this.#handleEnded();\n break;\n case \"error\": {\n const error =\n this.#media.getError() ?? createPlayerError(\"unknown\", true);\n this.#desiredPlayback = \"paused\";\n this.#setState({\n status: \"error\",\n lastTransitionCause: \"source-error\",\n error,\n });\n break;\n }\n case \"volumechange\":\n this.#setState({\n volume: clampVolume(this.#media.getVolume()),\n muted: this.#media.isMuted(),\n });\n break;\n }\n }\n\n async #handleEnded(): Promise<void> {\n if (this.#handlingEnded) {\n return;\n }\n this.#handlingEnded = true;\n try {\n await this.#advanceAfterEnded();\n } finally {\n this.#handlingEnded = false;\n }\n }\n\n async #advanceAfterEnded(): Promise<void> {\n this.#setState({ lastTransitionCause: \"natural-end\" });\n void this.#savePodcastProgress(true);\n\n const currentQueueItemId = this.#state.currentQueueItemId;\n if (currentQueueItemId === null) {\n return;\n }\n\n if (this.#state.repeatMode === \"one\") {\n const version = this.#beginCommand(\"playing\");\n const config = this.#state.experienceConfig;\n this.#media.seekTo(0);\n this.#setState({ currentTimeSec: 0, status: \"loading\" });\n await this.#playWithCommand(\n version,\n config.trackChangeFadeInMs,\n config.fadeCurve,\n );\n return;\n }\n\n const nextPlaybackIndex = this.#getNextPlaybackIndex(\n currentQueueItemId,\n );\n if (nextPlaybackIndex === null) {\n this.#desiredPlayback = \"paused\";\n this.#setState({\n status: \"ended\",\n currentTimeSec:\n readFiniteDuration(this.#media) ??\n readFiniteCurrentTime(this.#media),\n });\n return;\n }\n const nextQueueItemId =\n this.#playbackOrderQueueItemIds[nextPlaybackIndex];\n const nextIndex =\n nextQueueItemId === undefined\n ? null\n : findQueueIndex(this.#state.queue, nextQueueItemId);\n if (nextIndex === null) {\n this.#desiredPlayback = \"paused\";\n this.#setState({\n status: \"error\",\n error: INVALID_QUEUE_ERROR,\n });\n return;\n }\n this.#playbackOrderCursor = nextPlaybackIndex;\n\n const version = this.#beginCommand(\"playing\");\n await this.#selectQueueIndex(version, nextIndex, true);\n }\n\n #getNextPlaybackIndex(currentQueueItemId: string): number | null {\n if (\n this.#playbackOrderCursor >= 0 &&\n this.#playbackOrderCursor <\n this.#playbackOrderQueueItemIds.length - 1\n ) {\n return this.#playbackOrderCursor + 1;\n }\n if (!this.#state.shuffleEnabled) {\n return getNextQueueIndex(\n this.#playbackOrderQueueItemIds,\n this.#playbackOrderCursor,\n this.#state.repeatMode,\n );\n }\n if (this.#state.repeatMode !== \"all\") {\n return null;\n }\n\n const shuffled = shuffleQueueAroundCurrent(\n this.#state.queue,\n currentQueueItemId,\n this.#random,\n );\n const continuation = shuffled\n .slice(1)\n .map((entry) => entry.queueItemId);\n if (continuation.length === 0) {\n if (this.#state.queue.length !== 1) {\n return null;\n }\n continuation.push(currentQueueItemId);\n }\n\n this.#playbackOrderQueueItemIds = Object.freeze([\n ...this.#playbackOrderQueueItemIds,\n ...continuation,\n ]);\n let appendedIndex = this.#playbackOrderCursor + 1;\n if (\n this.#playbackOrderQueueItemIds.length >\n MAX_SHUFFLE_HISTORY_ITEMS &&\n this.#playbackOrderCursor > RETAINED_SHUFFLE_HISTORY_ITEMS\n ) {\n const removeCount =\n this.#playbackOrderCursor - RETAINED_SHUFFLE_HISTORY_ITEMS;\n this.#playbackOrderQueueItemIds = Object.freeze(\n this.#playbackOrderQueueItemIds.slice(removeCount),\n );\n this.#playbackOrderCursor -= removeCount;\n appendedIndex -= removeCount;\n }\n\n return appendedIndex;\n }\n}\n\nexport function createPlayerStore(\n options: CreatePlayerStoreOptions,\n): PlayerStore {\n return new CorePlayerStore(options);\n}\n","import type {\n PauseOptions,\n PlayerCommands,\n PlayerMediaItem,\n QueueItem,\n RepeatMode,\n SetQueueOptions,\n StopOptions,\n} from \"../contracts/player\";\n\nexport interface UserGestureGainActivator {\n activateFromUserGesture(): void | Promise<void>;\n}\n\nexport type PlayerRuntimeCommandName = keyof PlayerCommands;\n\nexport interface GestureAwareCommandsOptions {\n readonly onUserActivation?: () => void;\n readonly onCommand?: (command: PlayerRuntimeCommandName) => void;\n readonly onActivationError?: () => void;\n}\n\nfunction activate(\n gain: UserGestureGainActivator,\n options: GestureAwareCommandsOptions,\n): void {\n options.onUserActivation?.();\n try {\n const activation = gain.activateFromUserGesture();\n if (activation !== undefined) {\n void activation.catch(() => {\n options.onActivationError?.();\n });\n }\n } catch {\n options.onActivationError?.();\n }\n}\n\nfunction reportCommand(\n options: GestureAwareCommandsOptions,\n command: PlayerRuntimeCommandName,\n): void {\n options.onCommand?.(command);\n}\n\nexport function createGestureAwareCommands(\n commands: PlayerCommands,\n gain: UserGestureGainActivator,\n activationOptions: GestureAwareCommandsOptions = {},\n): PlayerCommands {\n return Object.freeze({\n load(item: PlayerMediaItem) {\n reportCommand(activationOptions, \"load\");\n return commands.load(item);\n },\n setQueue(\n queue: readonly QueueItem[],\n commandOptions?: SetQueueOptions,\n ) {\n reportCommand(activationOptions, \"setQueue\");\n if (commandOptions?.autoplay === true) {\n activate(gain, activationOptions);\n }\n return commands.setQueue(queue, commandOptions);\n },\n play() {\n reportCommand(activationOptions, \"play\");\n activate(gain, activationOptions);\n return commands.play();\n },\n pause(options?: PauseOptions) {\n reportCommand(activationOptions, \"pause\");\n return commands.pause(options);\n },\n stop(options?: StopOptions) {\n reportCommand(activationOptions, \"stop\");\n return commands.stop(options);\n },\n togglePlayback() {\n reportCommand(activationOptions, \"togglePlayback\");\n activate(gain, activationOptions);\n return commands.togglePlayback();\n },\n seekTo(seconds: number) {\n reportCommand(activationOptions, \"seekTo\");\n activate(gain, activationOptions);\n commands.seekTo(seconds);\n },\n seekBy(deltaSeconds: number) {\n reportCommand(activationOptions, \"seekBy\");\n activate(gain, activationOptions);\n commands.seekBy(deltaSeconds);\n },\n setVolume(volume: number) {\n reportCommand(activationOptions, \"setVolume\");\n commands.setVolume(volume);\n },\n toggleMute() {\n reportCommand(activationOptions, \"toggleMute\");\n commands.toggleMute();\n },\n setShuffle(enabled: boolean) {\n reportCommand(activationOptions, \"setShuffle\");\n commands.setShuffle(enabled);\n },\n setRepeatMode(mode: RepeatMode) {\n reportCommand(activationOptions, \"setRepeatMode\");\n commands.setRepeatMode(mode);\n },\n next() {\n reportCommand(activationOptions, \"next\");\n activate(gain, activationOptions);\n return commands.next();\n },\n previous() {\n reportCommand(activationOptions, \"previous\");\n activate(gain, activationOptions);\n return commands.previous();\n },\n retry() {\n reportCommand(activationOptions, \"retry\");\n activate(gain, activationOptions);\n return commands.retry();\n },\n clear() {\n reportCommand(activationOptions, \"clear\");\n return commands.clear();\n },\n });\n}\n","import {\n createContext,\n useEffect,\n useRef,\n useState,\n type ReactNode,\n} from \"react\";\nimport {\n BrowserMediaElementPort,\n HtmlMediaElementGainPort,\n LazyWebAudioGainPort,\n createBrowserMediaSessionController,\n resolvePlayerAudioMode,\n type PlayerAudioMode,\n type ResolvedPlayerAudioMode,\n} from \"../adapters/browser\";\nimport type {\n PlayerCommands,\n PlayerExperienceConfig,\n PlayerExperienceConfigStore,\n PlayerMediaSyncReason,\n PlayerStore,\n QueueItem,\n} from \"../contracts/player\";\nimport type {\n PlayerMediaEventType,\n} from \"../ports/media-element\";\nimport { createPlayerStore } from \"../core\";\nimport { createGestureAwareCommands } from \"./runtime-commands\";\nimport type {\n PlayerRuntimeDiagnosticListener,\n PlayerRuntimeDiagnosticPayload,\n} from \"./runtime-diagnostics\";\n\nconst DIAGNOSTIC_MEDIA_EVENTS = [\n \"loadstart\",\n \"loadedmetadata\",\n \"canplay\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"seeking\",\n \"seeked\",\n \"timeupdate\",\n \"ended\",\n \"error\",\n \"durationchange\",\n \"volumechange\",\n] as const satisfies readonly PlayerMediaEventType[];\n\nconst EMPTY_INITIAL_QUEUE: readonly QueueItem[] = Object.freeze([]);\n\nexport interface PlayerProviderProps {\n readonly children: ReactNode;\n /** Read once when the Runtime is created. Later queue changes use commands. */\n readonly initialQueue?: readonly QueueItem[];\n readonly initialQueueItemId?: string;\n readonly experienceConfig?: Partial<PlayerExperienceConfig>;\n readonly loadingFallback?: ReactNode;\n /**\n * auto uses native HTML audio on iOS/iPadOS and Web Audio elsewhere.\n * Explicit modes exist for real-device comparison and host policy.\n */\n readonly audioMode?: PlayerAudioMode;\n /** Optional host observer. The runtime does not retain diagnostic history. */\n readonly onDiagnosticEvent?: PlayerRuntimeDiagnosticListener;\n}\n\nexport interface PlayerRuntimeContextValue {\n readonly store: PlayerStore;\n readonly commands: PlayerCommands;\n readonly experience: PlayerExperienceConfigStore;\n readonly audioContextState: AudioContextState | \"uninitialized\";\n readonly audioMode: ResolvedPlayerAudioMode;\n readonly mediaSessionSupported: boolean;\n readonly mediaSessionActionsEnabled: boolean;\n}\n\nexport const PlayerRuntimeContext =\n createContext<PlayerRuntimeContextValue | null>(null);\n\nexport function PlayerProvider({\n audioMode = \"auto\",\n children,\n experienceConfig,\n initialQueue = EMPTY_INITIAL_QUEUE,\n initialQueueItemId,\n loadingFallback = null,\n onDiagnosticEvent,\n}: PlayerProviderProps) {\n const audioRef = useRef<HTMLAudioElement>(null);\n const initialQueueRef = useRef(initialQueue);\n const initialQueueItemIdRef = useRef(initialQueueItemId);\n const initialExperienceConfigRef = useRef(experienceConfig);\n const diagnosticListenerRef = useRef(onDiagnosticEvent);\n const [runtime, setRuntime] =\n useState<PlayerRuntimeContextValue | null>(null);\n const [audioContextState, setAudioContextState] =\n useState<AudioContextState | \"uninitialized\">(\"uninitialized\");\n const [resolvedAudioMode, setResolvedAudioMode] =\n useState<ResolvedPlayerAudioMode>(\"web-audio\");\n const [mediaSessionSupported, setMediaSessionSupported] =\n useState(false);\n const [\n mediaSessionActionsEnabled,\n setMediaSessionActionsEnabled,\n ] = useState(false);\n\n useEffect(() => {\n diagnosticListenerRef.current = onDiagnosticEvent;\n }, [onDiagnosticEvent]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n if (audioElement === null) {\n return;\n }\n\n let active = true;\n let synchronizeFromLifecycle:\n | ((reason: PlayerMediaSyncReason) => void)\n | null = null;\n const emitDiagnostic = (\n event: PlayerRuntimeDiagnosticPayload,\n ): void => {\n diagnosticListenerRef.current?.({\n ...event,\n occurredAt: new Date().toISOString(),\n });\n };\n const media = new BrowserMediaElementPort(audioElement);\n const navigatorPlatform: unknown = Reflect.get(\n navigator,\n \"platform\",\n );\n const nextAudioMode = resolvePlayerAudioMode(audioMode, {\n userAgent: navigator.userAgent,\n ...(typeof navigatorPlatform === \"string\"\n ? { platform: navigatorPlatform }\n : {}),\n maxTouchPoints: navigator.maxTouchPoints,\n });\n const gain =\n nextAudioMode === \"web-audio\"\n ? new LazyWebAudioGainPort(audioElement, {\n onContextStateChange: (state) => {\n if (active) {\n setAudioContextState(state);\n emitDiagnostic({\n type: \"audio-context-statechange\",\n state,\n });\n synchronizeFromLifecycle?.(\n \"audio-context-statechange\",\n );\n }\n },\n })\n : new HtmlMediaElementGainPort();\n setResolvedAudioMode(nextAudioMode);\n setAudioContextState(\n gain instanceof LazyWebAudioGainPort\n ? gain.getContextState()\n : \"uninitialized\",\n );\n const store = createPlayerStore({\n gain,\n media,\n ...(initialExperienceConfigRef.current === undefined\n ? {}\n : { experienceConfig: initialExperienceConfigRef.current }),\n });\n let mediaSessionController:\n | ReturnType<typeof createBrowserMediaSessionController>\n | null = null;\n const commands = createGestureAwareCommands(store.commands, gain, {\n onUserActivation: () => {\n mediaSessionController?.enableActionHandlers();\n if (active) {\n setMediaSessionActionsEnabled(\n mediaSessionController?.actionsEnabled ?? false,\n );\n }\n },\n onCommand: (command) => {\n emitDiagnostic({ type: \"command\", command });\n },\n onActivationError: () => {\n emitDiagnostic({\n type: \"audio-context-resume\",\n outcome: \"failed\",\n state:\n gain instanceof LazyWebAudioGainPort\n ? gain.getContextState()\n : \"uninitialized\",\n errorCode: \"audio-context\",\n });\n },\n });\n mediaSessionController = createBrowserMediaSessionController({\n commands,\n getState: () => store.getState(),\n onAction: (action) => {\n emitDiagnostic({\n type: \"media-session-action\",\n action,\n failed: false,\n });\n },\n onActionError: (action) => {\n emitDiagnostic({\n type: \"media-session-action\",\n action,\n failed: true,\n });\n },\n });\n const activeMediaSessionController = mediaSessionController;\n setMediaSessionSupported(activeMediaSessionController.supported);\n setMediaSessionActionsEnabled(false);\n const unsubscribeMediaSession = store.subscribe(() => {\n activeMediaSessionController.update(store.getState());\n });\n activeMediaSessionController.update(store.getState());\n\n const synchronize = (reason: PlayerMediaSyncReason): void => {\n const resumeAudioContext = async (): Promise<void> => {\n if (\n !(gain instanceof LazyWebAudioGainPort) ||\n gain.getContextState() !== \"suspended\"\n ) {\n return;\n }\n try {\n const resumed = await gain.resumeIfSuspended();\n if (resumed) {\n emitDiagnostic({\n type: \"audio-context-resume\",\n outcome: \"resumed\",\n state: gain.getContextState(),\n errorCode: null,\n });\n }\n } catch {\n emitDiagnostic({\n type: \"audio-context-resume\",\n outcome: \"failed\",\n state: gain.getContextState(),\n errorCode: \"audio-context\",\n });\n }\n };\n\n void resumeAudioContext()\n .then(() => store.synchronizeFromMedia(reason))\n .finally(() => {\n if (!active) {\n return;\n }\n if (gain instanceof LazyWebAudioGainPort) {\n setAudioContextState(gain.getContextState());\n }\n activeMediaSessionController.update(store.getState());\n emitDiagnostic({\n type: \"lifecycle-sync\",\n reason,\n visibility: document.visibilityState,\n media: media.getStateSnapshot(),\n });\n });\n };\n synchronizeFromLifecycle = synchronize;\n const handleVisibilityChange = (): void => {\n if (document.visibilityState === \"visible\") {\n synchronize(\"visibilitychange\");\n }\n };\n const handlePageShow = (): void => {\n synchronize(\"pageshow\");\n };\n const handleFocus = (): void => {\n synchronize(\"focus\");\n };\n const mediaEventListeners = new Map<\n PlayerMediaEventType,\n () => void\n >();\n for (const eventType of DIAGNOSTIC_MEDIA_EVENTS) {\n const listener = (): void => {\n emitDiagnostic({\n type: \"media-event\",\n event: eventType,\n media: media.getStateSnapshot(),\n });\n activeMediaSessionController.update(store.getState());\n };\n mediaEventListeners.set(eventType, listener);\n media.addEventListener(eventType, listener);\n }\n document.addEventListener(\n \"visibilitychange\",\n handleVisibilityChange,\n );\n window.addEventListener(\"pageshow\", handlePageShow);\n window.addEventListener(\"focus\", handleFocus);\n\n const contextValue: PlayerRuntimeContextValue = {\n store,\n commands,\n experience: store.experience,\n audioContextState: \"uninitialized\",\n audioMode: nextAudioMode,\n mediaSessionSupported: activeMediaSessionController.supported,\n mediaSessionActionsEnabled: false,\n };\n\n setRuntime(contextValue);\n void store.commands.setQueue(initialQueueRef.current, {\n ...(initialQueueItemIdRef.current === undefined\n ? {}\n : { startQueueItemId: initialQueueItemIdRef.current }),\n autoplay: false,\n });\n\n return () => {\n active = false;\n synchronizeFromLifecycle = null;\n document.removeEventListener(\n \"visibilitychange\",\n handleVisibilityChange,\n );\n window.removeEventListener(\"pageshow\", handlePageShow);\n window.removeEventListener(\"focus\", handleFocus);\n for (const [eventType, listener] of mediaEventListeners) {\n media.removeEventListener(eventType, listener);\n }\n unsubscribeMediaSession();\n activeMediaSessionController.destroy();\n setRuntime((current) =>\n current?.store === store ? null : current,\n );\n void store.destroy();\n };\n }, [\n audioMode,\n ]);\n\n const contextValue =\n runtime === null\n ? null\n : {\n ...runtime,\n audioContextState,\n audioMode: resolvedAudioMode,\n mediaSessionSupported,\n mediaSessionActionsEnabled,\n };\n\n return (\n <>\n <audio\n aria-hidden=\"true\"\n data-audio-context-state={audioContextState}\n data-audio-mode={resolvedAudioMode}\n data-media-session-actions={\n mediaSessionActionsEnabled ? \"enabled\" : \"inactive\"\n }\n data-media-session-supported={\n mediaSessionSupported ? \"true\" : \"false\"\n }\n data-player-audio=\"true\"\n preload=\"metadata\"\n ref={audioRef}\n />\n {contextValue === null ? (\n loadingFallback\n ) : (\n <PlayerRuntimeContext.Provider value={contextValue}>\n {children}\n </PlayerRuntimeContext.Provider>\n )}\n </>\n );\n}\n","import {\n useEffect,\n useRef,\n type ReactNode,\n} from \"react\";\n\nexport interface MiniPlayerHostProps {\n readonly children: ReactNode;\n readonly visible: boolean;\n readonly onInsetChange?: (bottomInsetPx: number) => void;\n readonly className?: string;\n}\n\nexport function MiniPlayerHost({\n children,\n className,\n onInsetChange,\n visible,\n}: MiniPlayerHostProps) {\n const hostRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!visible) {\n onInsetChange?.(0);\n return;\n }\n\n const host = hostRef.current;\n if (host === null) {\n return;\n }\n\n const publishInset = () => {\n onInsetChange?.(Math.ceil(host.getBoundingClientRect().height));\n };\n publishInset();\n\n if (typeof ResizeObserver === \"undefined\") {\n return () => {\n onInsetChange?.(0);\n };\n }\n\n const observer = new ResizeObserver(publishInset);\n observer.observe(host);\n return () => {\n observer.disconnect();\n onInsetChange?.(0);\n };\n }, [onInsetChange, visible]);\n\n if (!visible) {\n return null;\n }\n\n return (\n <div\n className={className}\n data-player-mini-host=\"true\"\n ref={hostRef}\n >\n {children}\n </div>\n );\n}\n","import {\n useContext,\n useSyncExternalStore,\n} from \"react\";\nimport type {\n PlayerCommands,\n PlayerExperienceConfigStore,\n PlayerState,\n} from \"../contracts/player\";\nimport {\n PlayerRuntimeContext,\n type PlayerRuntimeContextValue,\n} from \"./player-provider\";\nimport type { ResolvedPlayerAudioMode } from \"../adapters/browser\";\n\nexport interface UsePlayerResult {\n readonly state: Readonly<PlayerState>;\n readonly commands: PlayerCommands;\n readonly experience: PlayerExperienceConfigStore;\n readonly audioContextState: AudioContextState | \"uninitialized\";\n readonly audioMode: ResolvedPlayerAudioMode;\n readonly mediaSessionSupported: boolean;\n readonly mediaSessionActionsEnabled: boolean;\n}\n\nfunction usePlayerRuntimeContext(): PlayerRuntimeContextValue {\n const context = useContext(PlayerRuntimeContext);\n if (context === null) {\n throw new Error(\"usePlayer must be used inside PlayerProvider.\");\n }\n return context;\n}\n\nexport function usePlayer(): UsePlayerResult {\n const context = usePlayerRuntimeContext();\n const state = useSyncExternalStore(\n (listener) => context.store.subscribe(listener),\n () => context.store.getState(),\n () => context.store.getState(),\n );\n\n return {\n state,\n commands: context.commands,\n experience: context.experience,\n audioContextState: context.audioContextState,\n audioMode: context.audioMode,\n mediaSessionSupported: context.mediaSessionSupported,\n mediaSessionActionsEnabled:\n context.mediaSessionActionsEnabled,\n };\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import { q as PlayerMediaAdapter, r as PlayerMediaItem, Q as QueueItem, j as PlayerError, u as PlayerState, l as PlayerExperienceConfig } from '../player-DE9Vqztu.js';
2
+
3
+ type MockPlayerScenario = "success" | "loading" | "duration-unknown" | "missing-waveform" | "recoverable-error" | "fatal-error";
4
+ interface MockMediaRecord {
5
+ readonly id: string;
6
+ readonly playable: boolean;
7
+ readonly title: string;
8
+ readonly creatorName?: string;
9
+ readonly collectionTitle?: string;
10
+ readonly sourceUrl?: string;
11
+ readonly durationHintSec?: number;
12
+ readonly waveformPeaks?: readonly number[];
13
+ }
14
+ interface MockPlayerAdapterOptions {
15
+ readonly scenario?: MockPlayerScenario;
16
+ readonly delayMs?: number;
17
+ }
18
+ interface MockPlayerScenarioResult {
19
+ readonly scenario: MockPlayerScenario;
20
+ readonly queue: readonly QueueItem[];
21
+ readonly initialError: PlayerError | null;
22
+ readonly remainsLoading: boolean;
23
+ }
24
+ declare class MockPlayerAdapter implements PlayerMediaAdapter<MockMediaRecord> {
25
+ #private;
26
+ constructor(options?: MockPlayerAdapterOptions);
27
+ toPlayerMediaItem(source: MockMediaRecord): PlayerMediaItem | null;
28
+ loadScenario(): Promise<MockPlayerScenarioResult>;
29
+ }
30
+ declare const mockMediaRecords: readonly MockMediaRecord[];
31
+
32
+ declare function createPlayerMediaItemFixture(overrides?: Partial<PlayerMediaItem>): PlayerMediaItem;
33
+ declare function createQueueItemFixture(overrides?: Partial<QueueItem>): QueueItem;
34
+ declare function createPlayerStateFixture(overrides?: Partial<PlayerState>, experienceConfig?: Partial<PlayerExperienceConfig>): Readonly<PlayerState>;
35
+
36
+ export { type MockMediaRecord, MockPlayerAdapter, type MockPlayerAdapterOptions, type MockPlayerScenario, type MockPlayerScenarioResult, createPlayerMediaItemFixture, createPlayerStateFixture, createQueueItemFixture, mockMediaRecords };