@f8team/reel-core 1.1.2 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors/registry.ts","../src/errors/classify.ts","../src/events/bus.ts","../src/plugins/bus.ts","../src/plugins/commands.ts","../src/plugins/host.ts","../src/util/url.ts","../src/sources/hls.ts","../src/sources/native.ts","../src/sources/registry.ts","../src/sources/youtube.ts","../src/state/machine.ts","../src/state/store.ts","../src/createPlayer.ts","../src/plugins/definePlugin.ts","../src/theme/tokens.ts","../src/theme/apply.ts","../src/a11y/announce.ts","../src/a11y/focusTrap.ts","../src/a11y/controlsFocus.ts","../src/util/time.ts"],"names":["type","details","defaultLoad","on","off"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `PlayerError` factory + (optional) `Error` subclass for stack traces.\n *\n * The state machine and the source providers emit plain `PlayerError`\n * objects so the bus payload stays serializable. `createPlayerError`\n * provides one place to normalize the shape.\n */\n\nimport { type PlayerError, type PlayerErrorCode } from \"../types/error.js\";\n\nexport interface CreatePlayerErrorInput {\n code: PlayerErrorCode;\n message: string;\n cause?: unknown;\n status?: number;\n url?: string;\n retryable?: boolean;\n}\n\nconst RETRYABLE_BY_DEFAULT: Record<PlayerErrorCode, boolean> = {\n source: false,\n network: true,\n decode: false,\n unauthorized: false,\n unsupported: false,\n \"hls-fragment-loop\": true,\n internal: false,\n};\n\n/**\n * Build a `PlayerError`. `retryable` defaults to a conservative per-code\n * value; callers can always override.\n */\nexport function createPlayerError(input: CreatePlayerErrorInput): PlayerError {\n const error: PlayerError = {\n code: input.code,\n message: input.message,\n retryable: input.retryable ?? RETRYABLE_BY_DEFAULT[input.code],\n };\n if (input.cause !== undefined) error.cause = input.cause;\n if (input.status !== undefined) error.status = input.status;\n if (input.url !== undefined) error.url = input.url;\n return error;\n}\n","/**\n * Map low-level failures (`MediaError`, HTTP `XMLHttpRequest.status`, raw\n * `Error`) to a stable `PlayerError`.\n */\n\nimport { type PlayerError } from \"../types/error.js\";\n\nimport { createPlayerError } from \"./registry.js\";\n\n/**\n * `MediaError.code` constants (stable across browsers).\n *\n * - 1: MEDIA_ERR_ABORTED\n * - 2: MEDIA_ERR_NETWORK\n * - 3: MEDIA_ERR_DECODE\n * - 4: MEDIA_ERR_SRC_NOT_SUPPORTED\n */\nexport function classifyMediaError(err: MediaError | null | undefined, url?: string): PlayerError {\n const code = err?.code ?? 0;\n const message = err?.message || \"Media error\";\n switch (code) {\n case 1:\n return createPlayerError({ code: \"internal\", message: \"Media playback aborted\", url });\n case 2:\n return createPlayerError({ code: \"network\", message, url, retryable: true });\n case 3:\n return createPlayerError({ code: \"decode\", message, url });\n case 4:\n return createPlayerError({ code: \"unsupported\", message, url });\n default:\n return createPlayerError({ code: \"internal\", message, url, cause: err });\n }\n}\n\n/**\n * Map an HTTP status to a `PlayerError`. Used by the HLS provider when\n * `xhrSetup` sees a 4xx/5xx.\n */\nexport function classifyHttpStatus(status: number, url: string): PlayerError {\n if (status === 401 || status === 403) {\n return createPlayerError({\n code: \"unauthorized\",\n message: status === 401 ? \"Unauthorized\" : \"Forbidden\",\n status,\n url,\n });\n }\n if (status >= 500 && status < 600) {\n return createPlayerError({\n code: \"network\",\n message: `Server error ${status}`,\n status,\n url,\n retryable: true,\n });\n }\n if (status >= 400 && status < 500) {\n return createPlayerError({\n code: \"network\",\n message: `Client error ${status}`,\n status,\n url,\n retryable: false,\n });\n }\n return createPlayerError({\n code: \"network\",\n message: `HTTP ${status}`,\n status,\n url,\n });\n}\n\n/**\n * Catch-all classifier for arbitrary `Error` objects. Defaults to the\n * `internal` code with the original error attached as `cause`.\n */\nexport function classifyUnknown(err: unknown, url?: string): PlayerError {\n if (err instanceof Error) {\n return createPlayerError({\n code: \"internal\",\n message: err.message || \"Unknown error\",\n cause: err,\n url,\n });\n }\n return createPlayerError({\n code: \"internal\",\n message: typeof err === \"string\" ? err : \"Unknown error\",\n cause: err,\n url,\n });\n}\n","/**\n * Typed event bus.\n *\n * - Built-in events use the `PlayerEvents` map for full type safety.\n * - Plugin events use the `${string}:${string}` form (e.g. `subtitles:change`).\n * They bypass the type map because plugins are loaded dynamically; the\n * compromise is intentional and documented in the API contract.\n *\n * Invariants the tests guard:\n * - Listener removal during emit does not skip remaining listeners (snapshot).\n * - A throwing listener does not abort the rest (errors logged via `console.error`).\n * - Multiple `on()` of the same listener for the same event are deduped (Set).\n */\n\nimport { type PlayerEvents } from \"../types/events.js\";\n\ntype EventName = keyof PlayerEvents | (string & { __namespace?: never });\n\ntype Listener = (payload: unknown) => void;\n\nexport interface EventBus<TMap = PlayerEvents> {\n on<K extends keyof TMap>(event: K, listener: (payload: TMap[K]) => void): () => void;\n on(event: string, listener: (payload: unknown) => void): () => void;\n off<K extends keyof TMap>(event: K, listener: (payload: TMap[K]) => void): void;\n off(event: string, listener: (payload: unknown) => void): void;\n emit<K extends keyof TMap>(\n event: K,\n ...args: TMap[K] extends void ? [] : [payload: TMap[K]]\n ): void;\n emit(event: string, payload?: unknown): void;\n /** Drop every listener. Used by `player.dispose`. */\n clear(): void;\n /** Number of listeners for an event. Useful for tests. */\n listenerCount(event: string): number;\n}\n\n/**\n * Construct a typed event bus.\n *\n * Built-in `PlayerEvents` are fully type-checked; plugin events use the\n * `${namespace}:${verb}` form and pass through untyped (plugins can\n * augment via declaration-merging if they want stricter typing).\n */\nexport function createEventBus<TMap = PlayerEvents>(): EventBus<TMap> {\n const buckets = new Map<string, Set<Listener>>();\n\n function on(event: EventName, listener: Listener): () => void {\n const key = String(event);\n let set = buckets.get(key);\n if (!set) {\n set = new Set();\n buckets.set(key, set);\n }\n set.add(listener);\n return () => off(event, listener);\n }\n\n function off(event: EventName, listener: Listener): void {\n const key = String(event);\n const set = buckets.get(key);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) buckets.delete(key);\n }\n\n function emit(event: EventName, payload?: unknown): void {\n const key = String(event);\n const set = buckets.get(key);\n if (!set || set.size === 0) return;\n // Snapshot so listeners removing themselves (or other listeners) during\n // emit don't shift the iteration order.\n const snapshot = Array.from(set);\n for (const listener of snapshot) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[@f8team/reel-core] listener for \"${key}\" threw:`, err);\n }\n }\n }\n\n function clear(): void {\n buckets.clear();\n }\n\n function listenerCount(event: string): number {\n return buckets.get(event)?.size ?? 0;\n }\n\n return {\n on: on as EventBus<TMap>[\"on\"],\n off: off as EventBus<TMap>[\"off\"],\n emit: emit as EventBus<TMap>[\"emit\"],\n clear,\n listenerCount,\n };\n}\n","/**\n * Plugin lifecycle bus. Tracks registered plugins, calls each `setup`, stores\n * the optional teardown, and runs all teardowns on `disposeAll`.\n *\n * Re-registering a plugin with the same name throws — names are the public\n * identity surface and double-register usually means a build/import bug.\n */\n\nimport { type Player } from \"../types/player.js\";\nimport { type PluginHost, type PluginInstance } from \"../types/plugin.js\";\n\ninterface Entry {\n plugin: PluginInstance;\n teardown: (() => void) | null;\n}\n\nexport interface PluginBus {\n /** Register a plugin. Throws if `plugin.name` is already registered. */\n register(plugin: PluginInstance): void;\n /** Remove a plugin by name and run its teardown (idempotent). */\n unregister(name: string): void;\n /** Whether a plugin is registered. */\n has(name: string): boolean;\n /** Snapshot of currently registered plugin names. */\n list(): string[];\n /** Tear down every plugin in reverse-registration order. */\n disposeAll(): void;\n}\n\nexport interface CreatePluginBusArgs {\n player: Player;\n host: PluginHost;\n}\n\nexport function createPluginBus({ player, host }: CreatePluginBusArgs): PluginBus {\n const entries: Entry[] = [];\n\n function findIndex(name: string): number {\n return entries.findIndex((e) => e.plugin.name === name);\n }\n\n function register(plugin: PluginInstance): void {\n if (findIndex(plugin.name) >= 0) {\n throw new Error(`[@f8team/reel-core] plugin \"${plugin.name}\" is already registered`);\n }\n let setupResult: void | (() => void);\n try {\n setupResult = plugin.setup(player, host);\n } catch (err) {\n throw new Error(\n `[@f8team/reel-core] plugin \"${plugin.name}\" setup threw: ${(err as Error).message}`,\n { cause: err },\n );\n }\n const teardown = typeof setupResult === \"function\" ? setupResult : null;\n entries.push({ plugin, teardown });\n }\n\n function unregister(name: string): void {\n const idx = findIndex(name);\n if (idx < 0) return;\n const entry = entries.splice(idx, 1)[0];\n if (!entry) return;\n if (entry.teardown) {\n try {\n entry.teardown();\n } catch (err) {\n console.error(`[@f8team/reel-core] plugin \"${name}\" teardown threw:`, err);\n }\n }\n }\n\n function has(name: string): boolean {\n return findIndex(name) >= 0;\n }\n\n function list(): string[] {\n return entries.map((e) => e.plugin.name);\n }\n\n function disposeAll(): void {\n // Reverse order so teardowns mirror the registration sequence.\n while (entries.length) {\n const entry = entries.pop();\n if (entry?.teardown) {\n try {\n entry.teardown();\n } catch (err) {\n console.error(\n `[@f8team/reel-core] plugin \"${entry.plugin.name}\" teardown threw on dispose:`,\n err,\n );\n }\n }\n }\n }\n\n return { register, unregister, has, list, disposeAll };\n}\n","/**\n * Shared command registry. Plugins and adapters publish/run commands through\n * this single instance.\n */\n\nimport { type CommandRegistry } from \"../types/plugin.js\";\n\nexport function createCommandRegistry(): CommandRegistry {\n type Handler = (payload: unknown) => void;\n const handlers = new Map<string, Handler>();\n\n function add<P>(name: string, handler: (payload: P) => void): () => void {\n if (handlers.has(name)) {\n throw new Error(`[@f8team/reel-core] command \"${name}\" is already registered`);\n }\n handlers.set(name, handler as Handler);\n return () => {\n const current = handlers.get(name);\n if (current === handler) handlers.delete(name);\n };\n }\n\n function run<P>(name: string, payload?: P): void {\n const handler = handlers.get(name);\n if (!handler) return;\n try {\n handler(payload);\n } catch (err) {\n console.error(`[@f8team/reel-core] command \"${name}\" threw:`, err);\n }\n }\n\n function has(name: string): boolean {\n return handlers.has(name);\n }\n\n return { add, run, has };\n}\n","/**\n * Shared `PluginHost` factory. Each plugin gets a host bound to:\n * - the shared command registry (one per player)\n * - the typed event bus (for `emit`)\n * - a read-only view of the store\n * - the contribution slots for the active adapter\n */\n\nimport { type EventBus } from \"../events/bus.js\";\nimport {\n type CommandRegistry,\n type PluginMediaAttachment,\n type PluginHost,\n type SourceTransform,\n} from \"../types/plugin.js\";\nimport { type SourceDescriptor } from \"../types/source.js\";\nimport { type PlayerState } from \"../types/state.js\";\nimport { type ReadableStore } from \"../types/store.js\";\n\n/** The contribution registry the adapter reads from. */\nexport interface ControlsRegistry {\n contribute(slot: string, render: () => Element): () => void;\n /** Snapshot of the renders for a slot (adapter-only). */\n snapshot(slot: string): readonly (() => Element)[];\n /** Drop every contribution. */\n clear(): void;\n}\n\nexport function createControlsRegistry(): ControlsRegistry {\n const slots = new Map<string, Set<() => Element>>();\n\n function contribute(slot: string, render: () => Element): () => void {\n let set = slots.get(slot);\n if (!set) {\n set = new Set();\n slots.set(slot, set);\n }\n set.add(render);\n return () => {\n slots.get(slot)?.delete(render);\n };\n }\n\n function snapshot(slot: string): readonly (() => Element)[] {\n const set = slots.get(slot);\n return set ? Array.from(set) : [];\n }\n\n function clear(): void {\n slots.clear();\n }\n\n return { contribute, snapshot, clear };\n}\n\n/** Internal registry used to normalize descriptors before provider attach. */\nexport interface SourceTransformRegistry {\n register(transform: SourceTransform): () => void;\n apply(source: SourceDescriptor): SourceDescriptor;\n}\n\nexport function createSourceTransformRegistry(): SourceTransformRegistry {\n const transforms = new Set<SourceTransform>();\n\n function register(transform: SourceTransform): () => void {\n transforms.add(transform);\n return () => transforms.delete(transform);\n }\n\n function apply(source: SourceDescriptor): SourceDescriptor {\n let current = source;\n for (const transform of transforms) {\n current = transform(current);\n }\n return current;\n }\n\n return { register, apply };\n}\n\n/** Internal registry for the media element owned by this player instance. */\nexport interface MediaAttachmentRegistry {\n get(): PluginMediaAttachment | null;\n set(attachment: PluginMediaAttachment | null): void;\n subscribe(listener: (attachment: PluginMediaAttachment | null) => void): () => void;\n}\n\nexport function createMediaAttachmentRegistry(): MediaAttachmentRegistry {\n let current: PluginMediaAttachment | null = null;\n const listeners = new Set<(attachment: PluginMediaAttachment | null) => void>();\n\n function get(): PluginMediaAttachment | null {\n return current;\n }\n\n function set(attachment: PluginMediaAttachment | null): void {\n current = attachment;\n for (const listener of listeners) listener(current);\n }\n\n function subscribe(listener: (attachment: PluginMediaAttachment | null) => void): () => void {\n listeners.add(listener);\n if (current) listener(current);\n return () => listeners.delete(listener);\n }\n\n return { get, set, subscribe };\n}\n\nexport interface CreateHostArgs {\n commands: CommandRegistry;\n controls: ControlsRegistry;\n store: ReadableStore<PlayerState>;\n bus: EventBus;\n sourceTransforms?: SourceTransformRegistry;\n mediaAttachments?: MediaAttachmentRegistry;\n}\n\nexport function createPluginHost({\n commands,\n controls,\n store,\n bus,\n sourceTransforms = createSourceTransformRegistry(),\n mediaAttachments = createMediaAttachmentRegistry(),\n}: CreateHostArgs): PluginHost {\n return {\n controls: {\n contribute: controls.contribute,\n },\n commands,\n sources: {\n transform: sourceTransforms.register,\n },\n media: {\n get: mediaAttachments.get,\n subscribe: mediaAttachments.subscribe,\n },\n store,\n emit: (event, payload) => {\n bus.emit(event as string, payload);\n },\n };\n}\n","/**\n * URL helpers used by the source registry to dispatch a source descriptor to\n * the right provider. Pure string predicates - no DOM, no I/O.\n */\n\nimport { type SourceDescriptor, type SourceType } from \"../types/source.js\";\n\n/** Compare the descriptor fields that affect provider loading or media UI. */\nexport function areSourceDescriptorsEquivalent(\n previous: SourceDescriptor | null,\n next: SourceDescriptor | null,\n): boolean {\n if (previous === next) return true;\n if (!previous || !next) return false;\n\n const previousThumbnails = previous.thumbnails;\n const nextThumbnails = next.thumbnails;\n\n return (\n previous.src === next.src &&\n (previous.type || \"auto\") === (next.type || \"auto\") &&\n previous.withCredentials === next.withCredentials &&\n previous.tracks === next.tracks &&\n (previousThumbnails === nextThumbnails ||\n (previousThumbnails?.src === nextThumbnails?.src &&\n previousThumbnails?.withCredentials === nextThumbnails?.withCredentials))\n );\n}\n\n/** Whether a media/resource URL is safe to hand to browser media APIs. */\nexport function isSafeMediaUrl(input: string | undefined | null): boolean {\n if (!input?.trim()) return false;\n try {\n return /^(https?|blob|data):$/.test(new URL(input, \"https://reel.invalid\").protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Heuristic for HLS m3u8 URLs.\n *\n * Accepts:\n * - `*.m3u8` (case-insensitive) at any path/query position\n * - `application/vnd.apple.mpegurl` MIME hints inside `?type=`\n *\n * Rejects:\n * - YouTube-hosted m3u8 (handled by the YouTube provider).\n * - Empty / non-string inputs.\n */\nexport function looksLikeHls(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n if (lower.includes(\"youtube.com\") || lower.includes(\"youtu.be\")) return false;\n if (lower.includes(\".m3u8\")) return true;\n if (lower.includes(\"application/vnd.apple.mpegurl\")) return true;\n return false;\n}\n\n/**\n * YouTube URL recognition. Matches `youtube.com/watch?v=`, `youtu.be/<id>`,\n * `youtube.com/embed/<id>`, and `youtube.com/shorts/<id>`.\n */\nexport function looksLikeYouTube(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n return lower.includes(\"youtube.com\") || lower.includes(\"youtu.be\");\n}\n\n/**\n * MP4 / WebM / Ogg recognition by extension or `blob:` / `data:` schemes.\n */\nexport function looksLikeProgressive(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n if (lower.startsWith(\"blob:\") || lower.startsWith(\"data:\")) return true;\n return /\\.(mp4|m4v|webm|ogv)(\\?|#|$)/.test(lower);\n}\n\n/**\n * Resolve the effective `SourceType` for a descriptor.\n *\n * Honors an explicit non-`auto` type. For `auto`, dispatch by URL: HLS first,\n * then YouTube, then progressive, falling back to `native` (which dispatches\n * to the always-on native loader).\n */\nexport function detectSourceType(source: SourceDescriptor): SourceType {\n if (source.type && source.type !== \"auto\") return source.type;\n if (looksLikeHls(source.src)) return \"hls\";\n if (looksLikeYouTube(source.src)) return \"youtube\";\n if (looksLikeProgressive(source.src)) return \"mp4\";\n return \"native\";\n}\n\n/**\n * Resolve a `withCredentials` policy against a concrete URL. `boolean` wins\n * outright; functions are called once per URL and SHOULD NOT throw.\n */\nexport function resolveWithCredentials(\n policy: SourceDescriptor[\"withCredentials\"],\n url: string,\n): boolean {\n if (typeof policy === \"boolean\") return policy;\n if (typeof policy === \"function\") {\n try {\n return policy(url);\n } catch {\n return false;\n }\n }\n return false;\n}\n","/**\n * HLS source provider. Lazy-loads `hls.js` on first attach.\n *\n * Golden cases:\n * - G1 / G2: HLS playback with `playsInline` on iOS WebKit.\n * - G7: HLS quality menu (variant levels).\n * - G13: 401/403 surfacing via `xhrSetup` + readystatechange hook.\n * - G14: forces hls.js even on Safari iOS so the manifest goes through xhrSetup.\n */\n\nimport { type PlayerErrorCode } from \"../types/error.js\";\nimport {\n type QualityLevel,\n type SourceDescriptor,\n type SourceLoader,\n type SourceProvider,\n} from \"../types/source.js\";\nimport { detectSourceType, looksLikeHls, resolveWithCredentials } from \"../util/url.js\";\n\n/**\n * Subset of the `hls.js` runtime surface we touch. Defining it here lets\n * tests inject a mock without depending on the actual `hls.js` package\n * being installed.\n */\nexport interface HlsRuntime {\n isSupported: () => boolean;\n Events: {\n MANIFEST_PARSED: string;\n LEVEL_SWITCHED: string;\n FRAG_LOADING: string;\n FRAG_BUFFERED: string;\n ERROR: string;\n };\n ErrorTypes: { NETWORK_ERROR: string; MEDIA_ERROR: string };\n /** Constructor signature is on the default export when imported as a module. */\n new (config?: HlsConfig): HlsInstance;\n}\n\n/** Minimal config shape we set on the HLS instance. */\nexport interface HlsConfig {\n xhrSetup?: (xhr: XMLHttpRequest, url: string) => void;\n enableWorker?: boolean;\n startPosition?: number;\n fragLoadPolicy?: HlsLoadPolicy;\n keyLoadPolicy?: HlsLoadPolicy;\n manifestLoadPolicy?: HlsLoadPolicy;\n playlistLoadPolicy?: HlsLoadPolicy;\n}\n\n/** Minimal instance shape we touch. */\nexport interface HlsInstance {\n loadSource(url: string): void;\n attachMedia(video: HTMLVideoElement): void;\n detachMedia(): void;\n destroy(): void;\n recoverMediaError?(): void;\n stopLoad?(): void;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n levels: HlsLevel[];\n currentLevel: number;\n}\n\ninterface HlsLevel {\n height?: number;\n bitrate?: number;\n name?: string;\n}\n\ninterface HlsLoadPolicy {\n default: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryPolicy;\n errorRetry: HlsRetryPolicy;\n };\n}\n\ninterface HlsRetryPolicy {\n maxNumRetry: number;\n retryDelayMs: number;\n maxRetryDelayMs: number;\n backoff: \"linear\" | \"exponential\";\n}\n\ninterface HlsFragment {\n url?: string;\n relurl?: string;\n sn?: number | string;\n level?: number;\n type?: string;\n cc?: number;\n start?: number;\n startPTS?: number;\n}\n\ninterface HlsErrorData {\n type?: string;\n details?: string;\n fatal?: boolean;\n response?: { code?: number; url?: string };\n url?: string;\n frag?: HlsFragment;\n reason?: string;\n}\n\nconst REPEATED_FRAGMENT_LOAD_LIMIT = 4;\nconst MEDIA_RECOVERY_LIMIT = 1;\n\nfunction makeLoadPolicy(options: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryPolicy;\n errorRetry: HlsRetryPolicy;\n}): HlsLoadPolicy {\n return {\n default: {\n maxTimeToFirstByteMs: options.maxTimeToFirstByteMs,\n maxLoadTimeMs: options.maxLoadTimeMs,\n timeoutRetry: options.timeoutRetry,\n errorRetry: options.errorRetry,\n },\n };\n}\n\nfunction makeLinearRetry(\n maxNumRetry: number,\n retryDelayMs: number,\n maxRetryDelayMs: number,\n): HlsRetryPolicy {\n return {\n maxNumRetry,\n retryDelayMs,\n maxRetryDelayMs,\n backoff: \"linear\",\n };\n}\n\nfunction makeHlsLoadPolicies(): Pick<\n HlsConfig,\n \"fragLoadPolicy\" | \"keyLoadPolicy\" | \"manifestLoadPolicy\" | \"playlistLoadPolicy\"\n> {\n return {\n manifestLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(1, 1_000, 8_000),\n }),\n playlistLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(2, 1_000, 8_000),\n }),\n keyLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 8_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 1_000, 8_000),\n errorRetry: makeLinearRetry(2, 1_000, 8_000),\n }),\n fragLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 30_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(2, 1_000, 4_000),\n }),\n };\n}\n\n/** Options handed to `createHlsProvider`. */\nexport interface HlsProviderOptions {\n /**\n * Override the dynamic loader. Default: `() => import(\"hls.js\").then(m => m.default)`.\n * Tests inject a mock; consumers can swap to a self-hosted SDK.\n */\n loadRuntime?: () => Promise<HlsRuntime>;\n /** Surface 401/403 to the core. */\n onUnauthorized?: (event: { url: string; status: 401 | 403; source: SourceDescriptor }) => void;\n /** Notify the core when the level list changes. */\n onQualities?: (qualities: QualityLevel[]) => void;\n /** Notify the core when the active level changes. */\n onActiveQuality?: (quality: QualityLevel | null, auto: boolean) => void;\n /** Surface a load error to the core. */\n onError?: (error: {\n code?: PlayerErrorCode;\n message: string;\n cause?: unknown;\n status?: number;\n url?: string;\n retryable?: boolean;\n }) => void;\n /** Spinner / overlay: `true` when a user-driven rendition change is in-flight. */\n onQualitySwitch?: (active: boolean) => void;\n /**\n * Reject the manifest-load Promise if `MANIFEST_PARSED` does not fire within\n * this many milliseconds. Defaults to 30000 (30s). Set to `0` to disable.\n *\n * Without a timeout, a stalled or non-fatal HLS error can leave the player\n * stuck in `loading` forever (A2 in the 2026-05-12 review).\n */\n manifestTimeoutMs?: number;\n}\n\n// Dynamic import of hls.js. Using a regular import() (not `new Function`) so\n// that webpack/CRA can discover and bundle hls.js as a lazy chunk at compile\n// time. The `new Function` trick intentionally escapes static-analysis passes\n// (Vite, esbuild, Rollup) but breaks webpack because webpack cannot see the\n// specifier inside the function string and therefore never emits a chunk -\n// the browser's native import(\"hls.js\") fails with \"Failed to resolve module\n// specifier\". Tests still inject a mock via `loadRuntime`.\n\n/* c8 ignore start - only exercised in real browsers; tests inject `loadRuntime`. */\nconst defaultLoad = (): Promise<HlsRuntime> => {\n return import(\"hls.js\").then((m) => (m as unknown as { default: HlsRuntime }).default);\n};\n/* c8 ignore stop */\n\n/**\n * Construct an AbortError-shaped Error so callers can branch on `name` like\n * the standard Fetch API. We don't depend on DOMException because Node.js\n * unit tests run without it.\n */\nfunction makeAbortError(): Error {\n const err = new Error(\"HLS loader aborted\");\n err.name = \"AbortError\";\n return err;\n}\n\nclass HlsLoader implements SourceLoader {\n private hls: HlsInstance | null = null;\n private video: HTMLVideoElement | null = null;\n private detachListeners: Array<() => void> = [];\n private qualities: QualityLevel[] = [];\n private currentSource: SourceDescriptor | null = null;\n private unauthorizedFired = false;\n // Track every XHR that hls.js spawns so we can abort and remove their\n // readystatechange watcher on `abort()` / `detach()`. Without this set the\n // watcher closure leaks for every media segment (A1 in the review).\n private liveXhrs: Set<XMLHttpRequest> = new Set();\n private rejectAttach: ((err: Error) => void) | null = null;\n private manifestTimeout: ReturnType<typeof setTimeout> | null = null;\n private aborted = false;\n /**\n * Bumped by every abort/detach. `detach()` clears `aborted` so the loader can be reused, so a\n * source switch (abort, then detach) used to let an attach that was still awaiting the runtime\n * carry on and bind a stale hls.js instance to the <video>. Each attach keeps its own value.\n */\n private generation = 0;\n private lastLoadingFragmentKey: string | null = null;\n private repeatedFragmentLoadCount = 0;\n private repeatedFragmentErrorFired = false;\n private mediaRecoveryCount = 0;\n\n /** `false` idle; `'auto'` → first `LEVEL_SWITCHED` clears; otherwise await this level index. */\n private qualityAwait: false | \"auto\" | number = false;\n private qualitySwitchTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Tracks consecutive menu selections so redundant \"Auto → Auto\" skips the spinner. */\n private lastChosenQualityWasAuto = false;\n\n /**\n * `null` - user chose ABR auto (menu shows \"Auto\"). Real hls.js still exposes\n * `currentLevel >= 0` for the playing rendition; we must not mirror that into UI state.\n */\n private manualLevelIndex: number | null = null;\n\n constructor(private readonly options: HlsProviderOptions) {}\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.aborted = false;\n const generation = this.generation;\n this.video = video;\n this.currentSource = source;\n this.unauthorizedFired = false;\n\n const Hls = await (this.options.loadRuntime ?? defaultLoad)();\n if (this.aborted || generation !== this.generation) {\n throw makeAbortError();\n }\n\n if (!Hls.isSupported()) {\n return this.attachNative(video, source);\n }\n\n return this.attachWithHlsJs(Hls, video, source);\n }\n\n /**\n * Native-HLS branch (Safari iOS / desktop without MSE). Listeners are\n * pushed into `detachListeners` so that an early `detach()` / `abort()`\n * cleans them up instead of leaking (C3 in the review).\n */\n private attachNative(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n run();\n };\n const onMeta = (): void => settle(() => resolve());\n const onError = (): void => settle(() => reject(new Error(\"Native HLS playback failed\")));\n video.addEventListener(\"loadedmetadata\", onMeta);\n video.addEventListener(\"error\", onError);\n this.detachListeners.push(\n () => video.removeEventListener(\"loadedmetadata\", onMeta),\n () => video.removeEventListener(\"error\", onError),\n () =>\n settle(() => {\n // If `detach()` runs before either event fires, reject so callers\n // (createPlayer) can stop waiting on the stale Promise.\n reject(makeAbortError());\n }),\n );\n try {\n video.src = source.src;\n video.load();\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n private attachWithHlsJs(\n Hls: HlsRuntime,\n video: HTMLVideoElement,\n source: SourceDescriptor,\n ): Promise<void> {\n const hls = new Hls({\n enableWorker: true,\n ...makeHlsLoadPolicies(),\n xhrSetup: (xhr, url) => this.installXhrWatcher(xhr, url, source),\n });\n this.hls = hls;\n\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n this.clearManifestTimeout();\n run();\n };\n\n const onParsed = (): void => {\n this.refreshQualities();\n settle(() => resolve());\n };\n const onSwitched = (...args: unknown[]): void => {\n this.onLevelEventuallyStabilized(...args);\n this.refreshActiveQuality();\n };\n const onFragmentLoading = (...args: unknown[]): void => {\n this.onFragmentLoading(...args);\n };\n const onFragmentBuffered = (...args: unknown[]): void => {\n this.resetFragmentLoopGuardFromEvent(...args);\n };\n const onError = (..._args: unknown[]): void => {\n const data = this.getHlsEventData(_args);\n const status = data.response?.code;\n if (this.tryRecoverMediaError(Hls, data)) {\n return;\n }\n // 4xx/5xx surface as an error even if hls.js classifies them as\n // non-fatal - the player would otherwise sit in `loading` waiting\n // for a manifest that will never parse (A2).\n const isHttpError = typeof status === \"number\" && status >= 400;\n const isTerminalHlsError = this.isTerminalHlsError(data);\n if (data.fatal || isHttpError || isTerminalHlsError) {\n const message = this.formatHlsErrorMessage(data, status);\n this.stopHlsLoading();\n this.options.onError?.({\n code: this.getHlsErrorCode(data, status),\n message,\n cause: data,\n status,\n url: this.getErrorUrl(data),\n retryable: this.isRetryableHlsError(data, status),\n });\n settle(() => reject(new Error(message)));\n }\n };\n\n hls.on(Hls.Events.MANIFEST_PARSED, onParsed);\n hls.on(Hls.Events.LEVEL_SWITCHED, onSwitched);\n hls.on(Hls.Events.FRAG_LOADING, onFragmentLoading);\n hls.on(Hls.Events.FRAG_BUFFERED, onFragmentBuffered);\n hls.on(Hls.Events.ERROR, onError);\n\n this.detachListeners.push(\n () => hls.off(Hls.Events.MANIFEST_PARSED, onParsed),\n () => hls.off(Hls.Events.LEVEL_SWITCHED, onSwitched),\n () => hls.off(Hls.Events.FRAG_LOADING, onFragmentLoading),\n () => hls.off(Hls.Events.FRAG_BUFFERED, onFragmentBuffered),\n () => hls.off(Hls.Events.ERROR, onError),\n () => settle(() => reject(makeAbortError())),\n );\n\n const timeoutMs = this.options.manifestTimeoutMs ?? 30_000;\n if (timeoutMs > 0) {\n this.manifestTimeout = setTimeout(() => {\n const message = `HLS manifest timeout after ${timeoutMs}ms`;\n this.stopHlsLoading();\n this.options.onError?.({ message, cause: { type: \"timeout\" }, url: source.src });\n settle(() => reject(new Error(message)));\n }, timeoutMs);\n }\n\n try {\n hls.loadSource(source.src);\n hls.attachMedia(video);\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n /**\n * Wire the readystatechange watcher and remove it as soon as the XHR\n * completes - without this cleanup hls.js (which spawns one XHR per segment)\n * leaks a closure per request (A1).\n */\n private installXhrWatcher(xhr: XMLHttpRequest, url: string, source: SourceDescriptor): void {\n if (resolveWithCredentials(source.withCredentials, url)) {\n xhr.withCredentials = true;\n }\n this.liveXhrs.add(xhr);\n const watcher = (): void => {\n if (xhr.readyState !== 4) return;\n try {\n if ((xhr.status === 401 || xhr.status === 403) && !this.unauthorizedFired) {\n this.unauthorizedFired = true;\n this.options.onUnauthorized?.({\n url,\n status: xhr.status as 401 | 403,\n source,\n });\n }\n } finally {\n xhr.removeEventListener(\"readystatechange\", watcher);\n this.liveXhrs.delete(xhr);\n }\n };\n xhr.addEventListener(\"readystatechange\", watcher);\n }\n\n private getHlsEventData(args: unknown[]): HlsErrorData {\n const data = args[1] ?? args[0];\n return data !== null && typeof data === \"object\" ? (data as HlsErrorData) : {};\n }\n\n private getFragmentUrl(data: HlsErrorData): string | undefined {\n return data.frag?.url ?? data.frag?.relurl ?? data.response?.url ?? data.url;\n }\n\n private getErrorUrl(data: HlsErrorData): string | undefined {\n return this.getFragmentUrl(data) ?? this.currentSource?.src;\n }\n\n private getFragmentKey(data: HlsErrorData): string | null {\n const url = this.getFragmentUrl(data);\n const frag = data.frag;\n if (!frag) return url ?? null;\n const type = frag.type ?? \"main\";\n const level = frag.level ?? \"unknown-level\";\n const sn = frag.sn ?? \"unknown-sn\";\n const cc = frag.cc ?? \"unknown-cc\";\n const start = frag.start ?? frag.startPTS ?? \"unknown-start\";\n return `${url ?? \"unknown-url\"}:${type}:${level}:${sn}:${cc}:${start}`;\n }\n\n private isTerminalHlsError(data: HlsErrorData): boolean {\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelEmptyError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n case \"keyLoadError\":\n case \"keyLoadTimeOut\":\n case \"bufferFullError\":\n return true;\n default:\n return false;\n }\n }\n\n private formatHlsErrorMessage(data: HlsErrorData, status: number | undefined): string {\n if (data.fatal) {\n const type = data.type ?? \"unknown\";\n const details = data.details ? ` (${data.details})` : \"\";\n return `HLS fatal error: ${type}${details}`;\n }\n if (typeof status === \"number\" && status >= 400) {\n return `HLS load error: HTTP ${status}${data.details ? ` (${data.details})` : \"\"}`;\n }\n const type = data.type ?? \"unknown\";\n const details = data.details ? ` (${data.details})` : \"\";\n return `HLS error: ${type}${details}`;\n }\n\n private getHlsErrorCode(data: HlsErrorData, status: number | undefined): PlayerErrorCode {\n if (status === 401 || status === 403) return \"unauthorized\";\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n return \"decode\";\n default:\n return \"network\";\n }\n }\n\n private isRetryableHlsError(data: HlsErrorData, status: number | undefined): boolean {\n if (status === 401 || status === 403) return false;\n if (typeof status === \"number\" && status >= 400 && status < 500) return false;\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n return false;\n default:\n return true;\n }\n }\n\n private isRecoverableMediaError(Hls: HlsRuntime, data: HlsErrorData): boolean {\n if (data.type !== Hls.ErrorTypes.MEDIA_ERROR && data.type !== \"mediaError\") {\n return false;\n }\n if (!data.fatal) return false;\n if (this.mediaRecoveryCount >= MEDIA_RECOVERY_LIMIT) return false;\n if (typeof this.hls?.recoverMediaError !== \"function\") return false;\n\n switch (data.details) {\n case undefined:\n case \"bufferAppendError\":\n case \"bufferAppendingError\":\n case \"bufferStalledError\":\n case \"bufferSeekOverHole\":\n case \"bufferNudgeOnStall\":\n case \"bufferFullError\":\n return true;\n default:\n return false;\n }\n }\n\n private tryRecoverMediaError(Hls: HlsRuntime, data: HlsErrorData): boolean {\n if (!this.isRecoverableMediaError(Hls, data)) return false;\n this.mediaRecoveryCount += 1;\n this.resetFragmentLoopGuard();\n this.completeQualityAwaitIfBusy();\n try {\n this.hls?.recoverMediaError?.();\n return true;\n } catch {\n return false;\n }\n }\n\n private onFragmentLoading(...args: unknown[]): void {\n if (this.repeatedFragmentErrorFired) return;\n const data = this.getHlsEventData(args);\n const key = this.getFragmentKey(data);\n if (!key) return;\n\n if (key === this.lastLoadingFragmentKey) {\n this.repeatedFragmentLoadCount += 1;\n } else {\n this.lastLoadingFragmentKey = key;\n this.repeatedFragmentLoadCount = 1;\n }\n\n if (this.repeatedFragmentLoadCount < REPEATED_FRAGMENT_LOAD_LIMIT) return;\n\n this.repeatedFragmentErrorFired = true;\n this.stopHlsLoading();\n const url = this.getFragmentUrl(data);\n this.options.onError?.({\n code: \"hls-fragment-loop\",\n message: `HLS fragment repeatedly loading: ${url ?? key}`,\n cause: data,\n url,\n });\n }\n\n private resetFragmentLoopGuardFromEvent(...args: unknown[]): void {\n const data = this.getHlsEventData(args);\n if (this.getFragmentKey(data)) {\n this.resetFragmentLoopGuard();\n }\n }\n\n private resetFragmentLoopGuard(): void {\n this.lastLoadingFragmentKey = null;\n this.repeatedFragmentLoadCount = 0;\n this.repeatedFragmentErrorFired = false;\n }\n\n private abortLiveXhrs(): void {\n for (const xhr of [...this.liveXhrs]) {\n try {\n xhr.abort();\n } catch {\n // ignore\n }\n }\n this.liveXhrs.clear();\n }\n\n private stopHlsLoading(): void {\n this.completeQualityAwaitIfBusy();\n try {\n this.hls?.stopLoad?.();\n } catch {\n // ignore\n }\n this.abortLiveXhrs();\n }\n\n abort(): void {\n this.generation += 1;\n if (this.aborted) return;\n this.aborted = true;\n this.clearManifestTimeout();\n // Cancel every in-flight XHR. The watcher's `readystatechange` fires\n // synchronously on `abort()` with `readyState === 4`, which removes it\n // from `liveXhrs` for us; but be defensive.\n this.abortLiveXhrs();\n // Reject the pending attach Promise (if any) so callers stop waiting.\n const reject = this.rejectAttach;\n this.rejectAttach = null;\n reject?.(makeAbortError());\n }\n\n detach(): void {\n this.completeQualityAwaitIfBusy();\n // `abort()` first so the in-flight Promise is rejected before we tear\n // down the underlying engine.\n this.abort();\n while (this.detachListeners.length) {\n try {\n this.detachListeners.pop()?.();\n } catch {\n // ignore\n }\n }\n if (this.hls) {\n try {\n this.hls.detachMedia();\n this.hls.destroy();\n } catch {\n // ignore\n }\n this.hls = null;\n }\n if (this.video) {\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch {\n // ignore\n }\n this.video = null;\n }\n this.qualities = [];\n this.currentSource = null;\n this.unauthorizedFired = false;\n this.aborted = false; // reset so the loader can be reused\n this.lastChosenQualityWasAuto = false;\n this.manualLevelIndex = null;\n this.mediaRecoveryCount = 0;\n this.resetFragmentLoopGuard();\n }\n\n private clearQualitySwitchTimerOnly(): void {\n if (this.qualitySwitchTimer !== null) {\n clearTimeout(this.qualitySwitchTimer);\n this.qualitySwitchTimer = null;\n }\n }\n\n private armQualitySwitchTimeout(): void {\n this.clearQualitySwitchTimerOnly();\n this.qualitySwitchTimer = setTimeout(() => {\n this.qualitySwitchTimer = null;\n if (this.qualityAwait !== false) {\n this.completeQualityAwaitIfBusy();\n }\n }, 12_000);\n }\n\n /** Start or refresh awaited UI for a rendition change (rapid toggles reuse one spinner). */\n private armQualityAwait(kind: Exclude<typeof this.qualityAwait, false>): void {\n const wasIdle = this.qualityAwait === false;\n this.qualityAwait = kind;\n if (wasIdle) this.options.onQualitySwitch?.(true);\n this.armQualitySwitchTimeout();\n }\n\n private resolveQualityAwaitIfDone(levelIdxHint: number): void {\n const awaiting = this.qualityAwait;\n if (awaiting === false) return;\n\n // Prefer the engine's authoritative index: real hls.js payloads / listener arity\n // can differ from mocks, and strict `event.level === awaiting` left the spinner\n // armed until the 12s watchdog even when `currentLevel` had already settled.\n const engineLevel =\n this.hls !== null && typeof this.hls.currentLevel === \"number\"\n ? this.hls.currentLevel\n : levelIdxHint;\n\n const done = awaiting === \"auto\" || (typeof awaiting === \"number\" && awaiting === engineLevel);\n\n if (done) this.completeQualityAwaitIfBusy();\n }\n\n private onLevelEventuallyStabilized(...args: unknown[]): void {\n let levelIdx: number | undefined;\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i];\n if (\n a !== null &&\n typeof a === \"object\" &&\n typeof (a as { level?: unknown }).level === \"number\"\n ) {\n levelIdx = (a as { level: number }).level;\n break;\n }\n }\n if (levelIdx === undefined) levelIdx = this.hls?.currentLevel;\n if (typeof levelIdx === \"number\") this.resolveQualityAwaitIfDone(levelIdx);\n }\n\n private completeQualityAwaitIfBusy(): void {\n if (this.qualityAwait === false) return;\n this.qualityAwait = false;\n this.clearQualitySwitchTimerOnly();\n this.options.onQualitySwitch?.(false);\n }\n\n private clearManifestTimeout(): void {\n if (this.manifestTimeout !== null) {\n clearTimeout(this.manifestTimeout);\n this.manifestTimeout = null;\n }\n }\n\n getQualities(): QualityLevel[] {\n return this.qualities.slice();\n }\n\n setQuality(level: QualityLevel | \"auto\"): void {\n if (!this.hls) return;\n if (level === \"auto\") {\n this.manualLevelIndex = null;\n this.hls.currentLevel = -1;\n this.options.onActiveQuality?.(null, true);\n if (!this.lastChosenQualityWasAuto) {\n this.armQualityAwait(\"auto\");\n }\n this.lastChosenQualityWasAuto = true;\n queueMicrotask(() => {\n this.completeQualityAwaitIfBusy();\n });\n return;\n }\n let idx = this.qualities.findIndex((q) => q.id === level.id);\n if (idx < 0 && typeof level.height === \"number\" && level.height > 0) {\n const byHeight = this.qualities.findIndex((q) => q.height === level.height);\n if (byHeight >= 0) {\n idx = byHeight;\n }\n }\n if (idx < 0) {\n return;\n }\n const resolved = this.qualities[idx];\n if (!resolved) return;\n this.manualLevelIndex = idx;\n this.lastChosenQualityWasAuto = false;\n if (this.hls.currentLevel === idx) {\n this.options.onActiveQuality?.(resolved, false);\n return;\n }\n // Initial preference/application runs while HLS is still on auto (-1). Arming the overlay\n // spinner here duplicates “startup buffering”; LEVEL_SWITCHED will sync visuals anyway.\n if (this.hls.currentLevel !== -1) {\n this.armQualityAwait(idx);\n }\n this.hls.currentLevel = idx;\n this.options.onActiveQuality?.(resolved, false);\n queueMicrotask(() => {\n if (!this.hls) return;\n this.resolveQualityAwaitIfDone(this.hls.currentLevel);\n });\n }\n\n private refreshQualities(): void {\n if (!this.hls) return;\n const next: QualityLevel[] = this.hls.levels.map((lvl, i) => ({\n id: String(i),\n height: lvl.height ?? 0,\n bitrate: lvl.bitrate ?? 0,\n label: lvl.name ?? (lvl.height ? `${lvl.height}p` : `Level ${i + 1}`),\n }));\n this.qualities = next;\n this.options.onQualities?.(next);\n this.refreshActiveQuality();\n }\n\n private refreshActiveQuality(): void {\n if (!this.hls) return;\n if (this.manualLevelIndex === null) {\n this.options.onActiveQuality?.(null, true);\n return;\n }\n const locked = this.qualities[this.manualLevelIndex] ?? null;\n this.options.onActiveQuality?.(locked, false);\n }\n\n /** @internal - for tests. */\n _getInternalState(): { source: SourceDescriptor | null; qualities: QualityLevel[] } {\n return { source: this.currentSource, qualities: this.qualities };\n }\n}\n\n/**\n * Build the HLS source provider with bound core callbacks.\n */\nexport function createHlsProvider(options: HlsProviderOptions = {}): SourceProvider {\n return {\n name: \"hls\",\n canHandle: (source) => {\n if (source.type === \"hls\") return true;\n const type = detectSourceType(source);\n return type === \"hls\" || (type === \"auto\" && looksLikeHls(source.src));\n },\n createLoader: () => new HlsLoader(options),\n };\n}\n","/**\n * Always-on native loader. Handles MP4, WebM, blob, data URLs, and acts as a\n * `\"maybe\"` fallback for unknown URLs.\n *\n * Golden cases: G3 (public video, native MP4), G5 (story composer blob),\n * G6 (landing hero), G10 (media manager modal).\n */\n\nimport { type SourceDescriptor, type SourceLoader, type SourceProvider } from \"../types/source.js\";\nimport { detectSourceType } from \"../util/url.js\";\n\nclass NativeLoader implements SourceLoader {\n private video: HTMLVideoElement | null = null;\n private cleanups: Array<() => void> = [];\n private rejectPending: ((reason: unknown) => void) | null = null;\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.video = video;\n return new Promise<void>((resolve, reject) => {\n const onMeta = (): void => {\n cleanupListeners();\n this.rejectPending = null;\n resolve();\n };\n const onError = (): void => {\n cleanupListeners();\n const err = video.error;\n const message = err\n ? `MediaError code=${err.code} message=${err.message}`\n : \"Native loader failed\";\n this.rejectPending = null;\n reject(new Error(message));\n };\n const cleanupListeners = (): void => {\n video.removeEventListener(\"loadedmetadata\", onMeta);\n video.removeEventListener(\"error\", onError);\n };\n\n video.addEventListener(\"loadedmetadata\", onMeta);\n video.addEventListener(\"error\", onError);\n this.cleanups.push(cleanupListeners);\n this.rejectPending = reject;\n\n video.src = source.src;\n // `load()` forces the browser to start fetching even if the src didn't\n // visibly change (helps with `blob:` reuse and same-URL retries).\n video.load();\n });\n }\n\n abort(): void {\n const reject = this.rejectPending;\n this.rejectPending = null;\n while (this.cleanups.length) {\n try {\n this.cleanups.pop()?.();\n } catch {\n // ignore\n }\n }\n if (reject) {\n const error = new Error(\"Native source load aborted\");\n error.name = \"AbortError\";\n reject(error);\n }\n }\n\n detach(): void {\n this.abort();\n if (this.video) {\n // Removing the src lets the browser free the underlying resource.\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch {\n // ignore\n }\n this.video = null;\n }\n }\n}\n\n/** Native source provider. Always available, registered by `createPlayer`. */\nexport const nativeProvider: SourceProvider = {\n name: \"native\",\n canHandle: (source) => {\n if (source.type === \"native\") return true;\n if (source.type === \"mp4\") return true;\n // Explicit non-native types (`dash`, `hls`, `youtube`, ...) must be\n // handled by their dedicated provider; surfacing as a loadFailed when\n // no provider matches is more useful than silently degrading.\n if (source.type && source.type !== \"auto\") return false;\n const type = detectSourceType(source);\n if (type === \"mp4\") return true;\n if (type === \"hls\" || type === \"youtube\") return false;\n // Unknown URL with auto/no type - let dedicated providers win first;\n // if none match, the registry falls back to this `\"maybe\"`.\n return \"maybe\";\n },\n createLoader: () => new NativeLoader(),\n};\n","/**\n * Source registry.\n *\n * Providers register themselves once. On `resolve(source)`, the registry\n * picks the first provider whose `canHandle` returns `true`, falling back to\n * the first `\"maybe\"` (the native loader uses `\"maybe\"` so it can absorb any\n * source without claiming it).\n */\n\nimport { type SourceDescriptor, type SourceProvider } from \"../types/source.js\";\n\nexport interface SourceRegistry {\n register(provider: SourceProvider): () => void;\n unregister(name: string): void;\n resolve(source: SourceDescriptor): SourceProvider | null;\n /** Snapshot list of registered providers. Useful for tests. */\n list(): readonly SourceProvider[];\n clear(): void;\n}\n\nexport function createSourceRegistry(): SourceRegistry {\n const providers: SourceProvider[] = [];\n\n function register(provider: SourceProvider): () => void {\n if (providers.some((p) => p.name === provider.name)) {\n throw new Error(\n `[@f8team/reel-core] source provider \"${provider.name}\" is already registered`,\n );\n }\n providers.push(provider);\n return () => unregister(provider.name);\n }\n\n function unregister(name: string): void {\n const idx = providers.findIndex((p) => p.name === name);\n if (idx >= 0) providers.splice(idx, 1);\n }\n\n function resolve(source: SourceDescriptor): SourceProvider | null {\n let fallback: SourceProvider | null = null;\n for (const p of providers) {\n const verdict = p.canHandle(source);\n if (verdict === true) return p;\n if (verdict === \"maybe\" && !fallback) fallback = p;\n }\n return fallback;\n }\n\n function list(): readonly SourceProvider[] {\n return providers.slice();\n }\n\n function clear(): void {\n providers.length = 0;\n }\n\n return { register, unregister, resolve, list, clear };\n}\n","/**\n * YouTube source provider. Lazy-loads the IFrame Player API and bridges the\n * core `play / pause / seekTo / time` to a YT.Player instance hosted in an\n * off-DOM iframe parented to the player container.\n *\n * Golden case: G11 (admin upload preview).\n */\n\nimport { type SourceDescriptor, type SourceLoader, type SourceProvider } from \"../types/source.js\";\nimport { detectSourceType, looksLikeYouTube } from \"../util/url.js\";\n\n/** Minimal subset of the YT.Player API we touch. */\nexport interface YouTubePlayerInstance {\n playVideo(): void;\n pauseVideo(): void;\n seekTo(seconds: number, allowSeekAhead?: boolean): void;\n getCurrentTime(): number;\n getDuration(): number;\n getPlayerState(): number;\n destroy(): void;\n}\n\n/** Subset of YT.Player constructor we touch. */\nexport type YouTubePlayerCtor = new (\n el: HTMLElement,\n options: {\n videoId?: string;\n width?: string | number;\n height?: string | number;\n playerVars?: Record<string, unknown>;\n events?: {\n onReady?: (event: { target: YouTubePlayerInstance }) => void;\n onStateChange?: (event: { data: number; target: YouTubePlayerInstance }) => void;\n onError?: (event: { data: number; target: YouTubePlayerInstance }) => void;\n };\n },\n) => YouTubePlayerInstance;\n\nexport interface YouTubeRuntime {\n Player: YouTubePlayerCtor;\n PlayerState: { ENDED: number; PLAYING: number; PAUSED: number; BUFFERING: number };\n}\n\nexport interface YouTubeProviderOptions {\n /** Override the runtime loader. Default: inject the YT IFrame API `<script>`. */\n loadRuntime?: () => Promise<YouTubeRuntime>;\n /** Surface state changes to the core. */\n onStateChange?: (state: \"playing\" | \"paused\" | \"ended\" | \"buffering\" | \"ready\") => void;\n /** Surface load errors to the core. */\n onError?: (error: { message: string; cause?: unknown }) => void;\n /**\n * Bridge YouTube's polled `getCurrentTime()` value back into the core\n * store / event bus. Without this callback, seek bars and time-aware\n * plugins (markers, resume-position, analytics) would never tick on\n * YouTube sources (A3 in the 2026-05-12 review).\n */\n onTimeUpdate?: (currentTime: number) => void;\n /**\n * Bridge YouTube's `getDuration()` once the player is ready. Fires once\n * per attach.\n */\n onDuration?: (duration: number) => void;\n /**\n * Polling interval for the time bridge in milliseconds. Defaults to 250.\n */\n timeBridgeIntervalMs?: number;\n}\n\nconst YT_SCRIPT_SRC = \"https://www.youtube.com/iframe_api\";\n\n/* c8 ignore start - only exercised in real browsers; tests inject `loadRuntime`. */\nconst defaultLoad = (): Promise<YouTubeRuntime> => {\n if (typeof window === \"undefined\") {\n return Promise.reject(new Error(\"YouTube source provider requires a browser environment\"));\n }\n type YT = { Player: YouTubePlayerCtor; PlayerState: YouTubeRuntime[\"PlayerState\"] };\n type Win = Window & {\n YT?: YT;\n onYouTubeIframeAPIReady?: () => void;\n };\n const w = window as Win;\n if (w.YT && typeof w.YT.Player === \"function\") return Promise.resolve(w.YT);\n return new Promise<YouTubeRuntime>((resolve, reject) => {\n const existing = document.querySelector<HTMLScriptElement>(`script[src=\"${YT_SCRIPT_SRC}\"]`);\n const onReady = (): void => {\n if (w.YT && typeof w.YT.Player === \"function\") resolve(w.YT);\n else reject(new Error(\"YouTube IFrame API loaded without YT.Player\"));\n };\n const previousReady = w.onYouTubeIframeAPIReady;\n w.onYouTubeIframeAPIReady = () => {\n previousReady?.();\n onReady();\n };\n if (!existing) {\n const script = document.createElement(\"script\");\n script.src = YT_SCRIPT_SRC;\n script.async = true;\n script.onerror = () => reject(new Error(\"Failed to load YouTube IFrame API\"));\n document.head.appendChild(script);\n }\n });\n};\n/* c8 ignore stop */\n\n/** Extract the `videoId` from any YouTube URL form. */\nexport function extractYouTubeId(url: string): string | null {\n const m =\n url.match(/[?&]v=([^&]+)/) ??\n url.match(/youtu\\.be\\/([^?&/]+)/) ??\n url.match(/youtube\\.com\\/embed\\/([^?&/]+)/) ??\n url.match(/youtube\\.com\\/shorts\\/([^?&/]+)/);\n return m?.[1] ?? null;\n}\n\n/**\n * Marker attribute applied to the underlying `<video>` element while the\n * YouTube iframe owns playback. CSS theme contracts hide the native element\n * via `[data-reel-yt-hidden] { visibility: hidden; }` (B6 - replaces\n * the inline-style mutation that fought host CSS).\n */\nconst YT_HIDDEN_ATTR = \"data-reel-yt-hidden\";\n\nlet staticParentWarned = false;\n\nclass YouTubeLoader implements SourceLoader {\n private yt: YouTubePlayerInstance | null = null;\n private video: HTMLVideoElement | null = null;\n private host: HTMLElement | null = null;\n private timeIntervalId: ReturnType<typeof setInterval> | null = null;\n private duration = 0;\n private rejectAttach: ((err: Error) => void) | null = null;\n private aborted = false;\n /**\n * Bumped by every abort/detach. `detach()` clears `aborted` so the loader can be reused, so a\n * source switch (abort, then detach) used to let an attach that was still awaiting the runtime\n * carry on and mount a second iframe. Each attach keeps the value it started with instead.\n */\n private generation = 0;\n\n constructor(private readonly options: YouTubeProviderOptions) {}\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.aborted = false;\n const generation = this.generation;\n const id = extractYouTubeId(source.src);\n if (!id) {\n throw new Error(`Cannot extract YouTube videoId from \"${source.src}\"`);\n }\n this.video = video;\n\n const YT = await (this.options.loadRuntime ?? defaultLoad)();\n if (this.aborted || generation !== this.generation) {\n throw makeYtAbortError();\n }\n\n const parent = video.parentElement;\n if (!parent) {\n throw new Error(\"YouTube source provider requires <video> to be attached to the DOM\");\n }\n\n // The YouTube iframe relies on `position: absolute; inset: 0` on the\n // host, which only works when an ancestor is a positioned offsetParent.\n // Warn (once per page) so consumers know to set `position: relative` on\n // the player container (B6 part 2).\n /* c8 ignore start - getComputedStyle is a no-op in jsdom for parents that aren't styled */\n if (typeof window !== \"undefined\" && !staticParentWarned) {\n try {\n const computed = window.getComputedStyle(parent).position;\n if (computed === \"static\") {\n staticParentWarned = true;\n console.warn(\n \"[@f8team/reel-core] YouTube source: <video>'s parent has `position: static`. \" +\n \"Set the player container to `position: relative` (or absolute/fixed) so \" +\n \"the YouTube iframe can fill the stage.\",\n );\n }\n } catch {\n // ignore - happens in non-browser test environments\n }\n }\n /* c8 ignore stop */\n\n const host = document.createElement(\"div\");\n host.setAttribute(\"data-reel-yt-host\", \"\");\n // The host must fill the stage absolutely so the YT iframe stretches to 100%.\n host.style.cssText = \"position:absolute;inset:0;overflow:hidden;background:#000\";\n const mount = document.createElement(\"div\");\n host.appendChild(mount);\n parent.appendChild(host);\n this.host = host;\n\n // Hide the underlying <video> via a data attribute instead of inline\n // style - host CSS owns the actual `visibility` rule. This avoids\n // fighting the host's CSS transitions / dark-mode overrides (B6).\n video.setAttribute(YT_HIDDEN_ATTR, \"\");\n\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n run();\n };\n\n try {\n // The IFrame API replaces its mount node. Keep `host` as a stable\n // wrapper so sizing, ownership selectors, and cleanup remain valid.\n this.yt = new YT.Player(mount, {\n videoId: id,\n // 100% so the iframe fills the host div rather than using default px dimensions.\n width: \"100%\",\n height: \"100%\",\n playerVars: {\n playsinline: 1,\n modestbranding: 1,\n rel: 0,\n // enablejsapi is implicitly set by the IFrame API; explicit = good practice.\n enablejsapi: 1,\n },\n events: {\n onReady: () => {\n // Force the generated <iframe> to fill its parent regardless of\n // what YT.Player chose as its initial dimensions.\n const iframe = host.querySelector(\"iframe\");\n if (iframe) {\n iframe.style.cssText = \"width:100%;height:100%;border:none;display:block\";\n }\n try {\n this.duration = this.yt?.getDuration() ?? 0;\n if (this.duration > 0) {\n this.options.onDuration?.(this.duration);\n }\n } catch {\n // ignore\n }\n this.startTimeBridge();\n this.options.onStateChange?.(\"ready\");\n settle(() => resolve());\n },\n onStateChange: ({ data }) => {\n switch (data) {\n case YT.PlayerState.PLAYING:\n this.options.onStateChange?.(\"playing\");\n break;\n case YT.PlayerState.PAUSED:\n this.options.onStateChange?.(\"paused\");\n break;\n case YT.PlayerState.ENDED:\n this.options.onStateChange?.(\"ended\");\n break;\n case YT.PlayerState.BUFFERING:\n this.options.onStateChange?.(\"buffering\");\n break;\n default:\n break;\n }\n },\n onError: ({ data }) => {\n const err = { message: `YouTube error code=${data}`, cause: { code: data } };\n this.options.onError?.(err);\n settle(() => reject(new Error(err.message)));\n },\n },\n });\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n abort(): void {\n this.generation += 1;\n if (this.aborted) return;\n this.aborted = true;\n const reject = this.rejectAttach;\n this.rejectAttach = null;\n reject?.(makeYtAbortError());\n }\n\n detach(): void {\n this.abort();\n if (this.timeIntervalId !== null) {\n clearInterval(this.timeIntervalId);\n this.timeIntervalId = null;\n }\n if (this.yt) {\n try {\n this.yt.destroy();\n } catch {\n // ignore\n }\n this.yt = null;\n }\n if (this.host && this.host.parentElement) {\n try {\n this.host.parentElement.removeChild(this.host);\n } catch {\n // ignore\n }\n }\n this.host = null;\n if (this.video) {\n this.video.removeAttribute(YT_HIDDEN_ATTR);\n this.video = null;\n }\n this.duration = 0;\n this.aborted = false;\n }\n\n private startTimeBridge(): void {\n if (this.timeIntervalId !== null) return;\n const interval = this.options.timeBridgeIntervalMs ?? 250;\n this.timeIntervalId = setInterval(() => {\n if (!this.yt) return;\n try {\n const currentTime = this.yt.getCurrentTime();\n this.options.onTimeUpdate?.(currentTime);\n // Cache duration in case it became known after onReady (rare but\n // possible for live YouTube streams).\n const duration = this.yt.getDuration();\n if (duration > 0 && duration !== this.duration) {\n this.duration = duration;\n this.options.onDuration?.(duration);\n }\n } catch {\n // ignore\n }\n }, interval);\n }\n\n /** @internal */\n _instance(): YouTubePlayerInstance | null {\n return this.yt;\n }\n}\n\nfunction makeYtAbortError(): Error {\n const err = new Error(\"YouTube loader aborted\");\n err.name = \"AbortError\";\n return err;\n}\n\n/**\n * Build the YouTube source provider with bound core callbacks.\n */\nexport function createYouTubeProvider(options: YouTubeProviderOptions = {}): SourceProvider {\n return {\n name: \"youtube\",\n canHandle: (source) => {\n if (source.type === \"youtube\") return true;\n const type = detectSourceType(source);\n return type === \"youtube\" || (type === \"auto\" && looksLikeYouTube(source.src));\n },\n createLoader: () => new YouTubeLoader(options),\n };\n}\n","/**\n * Pure player state machine. Inputs are `(status, event)` and the output is\n * `(next, effects)`. The orchestrator (`createPlayer`) applies the effects\n * against the underlying `<video>` and the typed event bus; the reducer\n * itself never touches the DOM.\n *\n * Transition diagram lives in `docs/spec/architecture.md`.\n */\n\nimport { type PlayerError } from \"../types/error.js\";\nimport { type SourceDescriptor } from \"../types/source.js\";\nimport { type PlayerStatus } from \"../types/state.js\";\n\n/** Inputs accepted by the reducer. */\nexport type MachineEvent =\n /** Caller asked to (re)load a source. `null` clears back to idle. */\n | { type: \"setSource\"; source: SourceDescriptor | null }\n /** The source loader signalled `loadedmetadata`. */\n | { type: \"loaded\" }\n /** Load failed (manifest 4xx/5xx, decode, unsupported). */\n | { type: \"loadFailed\"; error: PlayerError }\n /** Caller asked to play (or the native engine fired `play`). */\n | { type: \"play\" }\n /** Caller asked to pause (or the native engine fired `pause`). */\n | { type: \"pause\" }\n /** Native `ended`. */\n | { type: \"ended\" }\n /** Runtime failure during playback (network drop, decoder crash). */\n | { type: \"runtimeError\"; error: PlayerError }\n /** Caller asked to retry after `error`. */\n | { type: \"retry\" }\n /** Caller invoked `dispose`. Always wins. */\n | { type: \"dispose\" };\n\n/** Side-effects produced by transitions, applied by the orchestrator. */\nexport type MachineEffect =\n | { type: \"attachSource\"; source: SourceDescriptor }\n | { type: \"detachSource\" }\n | { type: \"mediaPlay\" }\n | { type: \"mediaPause\" }\n | { type: \"mediaSeek\"; seconds: number }\n | { type: \"clearError\" }\n | { type: \"setError\"; error: PlayerError };\n\n/** Reducer return shape. `effects` is always frozen for safety. */\nexport interface MachineResult {\n next: PlayerStatus;\n effects: readonly MachineEffect[];\n}\n\n/** Result with no transition and no effects. */\nconst STAY: Pick<MachineResult, \"effects\"> = { effects: Object.freeze([]) };\n\nconst noop = (status: PlayerStatus): MachineResult => ({ next: status, ...STAY });\n\n/**\n * Run one step of the state machine.\n *\n * Invalid transitions return the current state with no effects (the reducer\n * is a total function — never throws). The orchestrator can decide whether\n * to surface a warning.\n */\nexport function reduce(status: PlayerStatus, event: MachineEvent): MachineResult {\n // `dispose` always wins from any state and is idempotent on `idle`.\n if (event.type === \"dispose\") {\n if (status === \"idle\") return noop(\"idle\");\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n\n switch (status) {\n case \"idle\":\n if (event.type === \"setSource\") {\n if (event.source === null) return noop(\"idle\");\n return {\n next: \"loading\",\n effects: [{ type: \"clearError\" }, { type: \"attachSource\", source: event.source }],\n };\n }\n return noop(\"idle\");\n\n case \"loading\":\n switch (event.type) {\n case \"loaded\":\n return noop(\"ready\");\n case \"loadFailed\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"loading\");\n }\n\n case \"ready\":\n switch (event.type) {\n case \"play\":\n return { next: \"playing\", effects: [{ type: \"mediaPlay\" }] };\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"ready\");\n }\n\n case \"playing\":\n switch (event.type) {\n case \"pause\":\n return { next: \"paused\", effects: [{ type: \"mediaPause\" }] };\n case \"ended\":\n return noop(\"ended\");\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"playing\");\n }\n\n case \"paused\":\n switch (event.type) {\n case \"play\":\n return { next: \"playing\", effects: [{ type: \"mediaPlay\" }] };\n case \"ended\":\n return noop(\"ended\");\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"paused\");\n }\n\n case \"ended\":\n switch (event.type) {\n case \"play\":\n // Replay: seek to 0 then play.\n return {\n next: \"playing\",\n effects: [{ type: \"mediaSeek\", seconds: 0 }, { type: \"mediaPlay\" }],\n };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"ended\");\n }\n\n case \"error\":\n switch (event.type) {\n case \"retry\": {\n // Retry only makes sense if we have a previously-attached source,\n // but the reducer is source-agnostic; the orchestrator passes a\n // fresh `setSource` after `retry`. We move to `loading` optimistically.\n return { next: \"loading\", effects: [{ type: \"clearError\" }] };\n }\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"error\");\n }\n\n default: {\n // Exhaustive guard — TS will complain if we add a status without\n // handling it here.\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n","/**\n * Reactive store with microtask-batched updates and selector subscriptions.\n *\n * Design goals:\n * - **Tiny**: ~30 lines of logic, no external runtime.\n * - **Predictable**: subscribers fire synchronously after the microtask flush.\n * Multiple `setState` calls in the same tick fire one round of subscribers.\n * - **Selector-aware**: a subscriber registered with a selector only re-runs\n * when its selected slice changes (`Object.is` equality by default).\n */\n\nimport { type MutableStore } from \"../types/store.js\";\n\ninterface Subscriber<U = unknown> {\n selector: (state: never) => U;\n listener: (value: U) => void;\n /** Cached selected value from the last fired tick. */\n last: U;\n /** Custom equality, defaulted to `Object.is`. */\n isEqual: (a: U, b: U) => boolean;\n}\n\nconst defaultEquals = <U>(a: U, b: U): boolean => Object.is(a, b);\n\n/**\n * Optional knobs handed to `createStore`.\n *\n * The generic `T` is unused at the type level today, but it locks the option\n * shape to a specific store so future per-state hooks (e.g. `selectorOf`)\n * stay backwards-compatible.\n */\nexport interface CreateStoreOptions<_T> {\n /**\n * Override the global microtask scheduler (used by tests so the store\n * can flush synchronously). Default: `queueMicrotask`.\n */\n scheduleFlush?: (run: () => void) => void;\n /** Custom equality at the store level, used by `subscribe` if none is passed. */\n isEqual?: <U>(a: U, b: U) => boolean;\n}\n\n/**\n * Build a reactive store seeded with `initial`.\n */\nexport function createStore<T extends object>(\n initial: T,\n options: CreateStoreOptions<T> = {},\n): MutableStore<T> {\n const schedule = options.scheduleFlush ?? queueMicrotask;\n const defaultIsEqual =\n (options.isEqual as (<U>(a: U, b: U) => boolean) | undefined) ?? defaultEquals;\n\n let state: T = initial;\n /**\n * `subscribers` is a Set so removal during emit doesn't shift indices.\n * We snapshot to an array on flush.\n */\n const subscribers = new Set<Subscriber<unknown>>();\n let dirty = false;\n let disposed = false;\n\n function flush(): void {\n dirty = false;\n if (disposed) return;\n const snapshot = Array.from(subscribers);\n for (const sub of snapshot) {\n const next = (sub.selector as (s: T) => unknown)(state);\n if (sub.isEqual(next, sub.last)) continue;\n sub.last = next;\n try {\n sub.listener(next);\n } catch (err) {\n // One bad listener does not abort the rest. Surface for diagnosis.\n\n console.error(\"[@f8team/reel-core] store subscriber threw:\", err);\n }\n }\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(patch: Partial<T> | ((current: T) => Partial<T>)): void {\n if (disposed) return;\n const next = typeof patch === \"function\" ? patch(state) : patch;\n state = { ...state, ...next };\n if (!dirty) {\n dirty = true;\n schedule(flush);\n }\n }\n\n function subscribe<U>(selector: (state: T) => U, listener: (value: U) => void): () => void {\n if (disposed) {\n return () => {\n /* no-op: store is dead */\n };\n }\n const sub: Subscriber<U> = {\n selector: selector as (state: never) => U,\n listener,\n last: selector(state),\n isEqual: defaultIsEqual,\n };\n subscribers.add(sub as Subscriber<unknown>);\n return () => {\n subscribers.delete(sub as Subscriber<unknown>);\n };\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n subscribers.clear();\n }\n\n return { getState, setState, subscribe, dispose };\n}\n","/**\n * `createPlayer(options)` - wires every piece of `@f8team/reel-core` into a\n * single `Player`. The factory is the one and only public entry point.\n *\n * Responsibilities:\n * 1. Build the reactive store seeded with the initial PlayerOptions.\n * 2. Build the event bus, command registry, controls registry, plugin bus.\n * 3. Register the always-on native source provider (and HLS / YouTube\n * providers with callbacks bound to this player's store and bus).\n * 4. Bridge `<video>` events ⇄ the state-machine reducer.\n * 5. Apply machine effects (attach/detach source, mediaPlay/Pause/Seek,\n * clearError/setError) against the live `<video>` element.\n * 6. Expose the `Player` interface defined in\n * `docs/spec/api-contract.md`.\n *\n * Tests live next to this file and validate the external behavior; lower-level\n * pieces (store, machine, sources, plugins, etc.) are covered by their own\n * unit tests.\n */\n\nimport { classifyMediaError, classifyUnknown } from \"./errors/classify.js\";\nimport { createPlayerError } from \"./errors/registry.js\";\nimport { createEventBus, type EventBus } from \"./events/bus.js\";\nimport { createPluginBus, type PluginBus } from \"./plugins/bus.js\";\nimport { createCommandRegistry } from \"./plugins/commands.js\";\nimport {\n createControlsRegistry,\n createMediaAttachmentRegistry,\n createPluginHost,\n createSourceTransformRegistry,\n} from \"./plugins/host.js\";\nimport { createHlsProvider } from \"./sources/hls.js\";\nimport { nativeProvider } from \"./sources/native.js\";\nimport { createSourceRegistry, type SourceRegistry } from \"./sources/registry.js\";\nimport { createYouTubeProvider, type YouTubePlayerInstance } from \"./sources/youtube.js\";\nimport { reduce, type MachineEffect, type MachineEvent } from \"./state/machine.js\";\nimport { createStore, type CreateStoreOptions } from \"./state/store.js\";\nimport { type PlayerError } from \"./types/error.js\";\nimport { type PlayerEvents, type UnauthorizedEvent } from \"./types/events.js\";\nimport { type PlayerOptions } from \"./types/options.js\";\nimport { type Disposer, type Player } from \"./types/player.js\";\nimport { type PluginInstance } from \"./types/plugin.js\";\nimport {\n type QualityLevel,\n type SourceDescriptor,\n type SourceLoader,\n type SourceProvider,\n} from \"./types/source.js\";\nimport { type BufferedRange, type PlayerState, type PlayerStatus } from \"./types/state.js\";\nimport { isSafeMediaUrl } from \"./util/url.js\";\n\n/** @internal - extra knobs surfaced for tests and adapters. */\nexport interface CreatePlayerInternalOptions {\n /** Override the microtask scheduler for the store. Tests use this. */\n storeOptions?: CreateStoreOptions<PlayerState>;\n /** Inject extra source providers (e.g. dash, in-house DRM). */\n extraProviders?: SourceProvider[];\n}\n\nfunction makeInitialState(options: PlayerOptions): PlayerState {\n return {\n status: \"idle\",\n source: options.source ?? null,\n currentTime: 0,\n duration: 0,\n buffered: [],\n playbackRate: options.playbackRate ?? 1,\n volume: options.volume ?? 1,\n muted: options.muted ?? options.autoplay === \"muted\",\n videoWidth: 0,\n videoHeight: 0,\n pip: false,\n fullscreen: false,\n qualities: [],\n activeQuality: null,\n error: null,\n };\n}\n\nfunction bufferedToRanges(buffered: TimeRanges | null | undefined): BufferedRange[] {\n if (!buffered) return [];\n const out: BufferedRange[] = [];\n for (let i = 0; i < buffered.length; i++) {\n out.push({ start: buffered.start(i), end: buffered.end(i) });\n }\n return out;\n}\n\n/**\n * Build a fresh `Player`. Safe to construct in the browser, jsdom, or\n * server-rendering tests (only `attach()` touches the DOM).\n */\nexport function createPlayer(\n options: PlayerOptions = {},\n internal: CreatePlayerInternalOptions = {},\n): Player {\n /* ---------------------------------------------------------------- */\n /* State */\n /* ---------------------------------------------------------------- */\n\n const store = createStore<PlayerState>(makeInitialState(options), internal.storeOptions);\n const bus: EventBus = createEventBus();\n const commands = createCommandRegistry();\n const controls = createControlsRegistry();\n const sourceTransforms = createSourceTransformRegistry();\n const mediaAttachments = createMediaAttachmentRegistry();\n\n let status: PlayerStatus = \"idle\";\n let video: HTMLVideoElement | null = null;\n let activeLoader: SourceLoader | null = null;\n let pendingAttachAbort: (() => void) | null = null;\n let pendingSourceLoad: {\n promise: Promise<void>;\n resolve: () => void;\n reject: (reason: unknown) => void;\n } | null = null;\n let latestSourceLoadPromise: Promise<void> | null = null;\n let disposed = false;\n // Tracks a `play()` call that arrived while the engine is still in the\n // `loading` state (HLS manifest, native metadata). The state machine\n // intentionally treats `play` as a noop in `loading`, so we queue the\n // intent here and re-dispatch on the next `ready` transition. Without\n // this, the very first user click on the play button is silently\n // swallowed and the user has to click twice for HLS sources.\n let pendingPlay = false;\n\n function createPendingSourceLoad(): NonNullable<typeof pendingSourceLoad> {\n let resolve!: () => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<void>((onResolve, onReject) => {\n resolve = onResolve;\n reject = onReject;\n });\n // A source can be set imperatively without anyone awaiting `attach()`.\n // Mark the rejection as observed while preserving the original promise\n // for callers that do await the attachment lifecycle.\n void promise.catch(() => undefined);\n latestSourceLoadPromise = promise;\n return { promise, resolve, reject };\n }\n\n function resolvePendingSourceLoad(): void {\n const load = pendingSourceLoad;\n if (!load) return;\n pendingSourceLoad = null;\n load.resolve();\n }\n\n function rejectPendingSourceLoad(reason: unknown): void {\n const load = pendingSourceLoad;\n if (!load) return;\n pendingSourceLoad = null;\n load.reject(reason);\n }\n\n function createAbortError(): Error {\n return Object.assign(new Error(\"Aborted\"), { name: \"AbortError\" });\n }\n\n const YT_PLAYER_STATE_PLAYING = 1;\n\n type LoaderWithYouTubeInstance = SourceLoader & {\n _instance?: () => YouTubePlayerInstance | null;\n };\n\n function getYouTubePlayer(): YouTubePlayerInstance | null {\n return (activeLoader as LoaderWithYouTubeInstance | null)?._instance?.() ?? null;\n }\n\n /* ---------------------------------------------------------------- */\n /* Source registry */\n /* ---------------------------------------------------------------- */\n\n const registry: SourceRegistry = createSourceRegistry();\n\n function emitUnauthorized(payload: UnauthorizedEvent): void {\n bus.emit(\"unauthorized\", payload);\n options.hooks?.onUnauthorized?.(payload);\n }\n\n function applyError(err: PlayerError): void {\n store.setState({ error: err });\n bus.emit(\"error\", err);\n options.hooks?.onError?.(err);\n }\n\n function setQualities(qualities: QualityLevel[]): void {\n store.setState({ qualities });\n }\n\n function setActiveQuality(quality: QualityLevel | null, auto: boolean): void {\n store.setState({ activeQuality: quality });\n bus.emit(\"qualitychange\", { quality, auto });\n }\n\n // Built-in command: hls-quality plugin delegates to this via\n // player.commands.run(\"hls:setQuality\", level).\n commands.add(\"hls:setQuality\", (level: unknown) => {\n if (\n level !== null &&\n (typeof level !== \"object\" || typeof (level as QualityLevel).height !== \"number\")\n ) {\n return;\n }\n bus.emit(\"qualitypreference\", {\n qualityHeight: level === null ? null : (level as QualityLevel).height,\n });\n\n const loader = activeLoader as { setQuality?: (l: QualityLevel | \"auto\") => void } | null;\n if (typeof loader?.setQuality === \"function\") {\n loader.setQuality(level === null ? \"auto\" : (level as QualityLevel));\n }\n });\n\n // Order matters: extra providers win first so consumers (and tests) can\n // override the built-ins without unregistering them.\n for (const provider of internal.extraProviders ?? []) registry.register(provider);\n registry.register(\n createHlsProvider({\n onUnauthorized: (e) => emitUnauthorized(e),\n onQualities: (q) => setQualities(q),\n onActiveQuality: (q, auto) => setActiveQuality(q, auto),\n onError: (err) => {\n const playerError = createPlayerError({ ...err, code: err.code ?? \"network\" });\n if (status === \"loading\") {\n dispatch({ type: \"loadFailed\", error: playerError });\n return;\n }\n dispatch({ type: \"runtimeError\", error: playerError });\n },\n onQualitySwitch: (active) => bus.emit(\"qualityswitch\", { active }),\n }),\n );\n registry.register(\n createYouTubeProvider({\n onError: (err) => applyError(createPlayerError({ ...err, code: \"source\" })),\n // Bridge YouTube's polled time/duration into the same store fields and\n // bus events that hls.js / native engines populate. Without this, the\n // seek bar, transcripts, resume-position and analytics plugins would\n // never tick on YouTube sources (A3).\n onTimeUpdate: (currentTime) => {\n const duration = store.getState().duration;\n store.setState({ currentTime });\n bus.emit(\"timeupdate\", { currentTime, playedSeconds: currentTime, duration });\n },\n onDuration: (duration) => {\n store.setState({ duration });\n bus.emit(\"durationchange\", { duration });\n },\n onStateChange: (ytState) => {\n if (ytState === \"playing\") {\n bus.emit(\"play\");\n if (status !== \"playing\" && status !== \"loading\") dispatch({ type: \"play\" });\n } else if (ytState === \"paused\") {\n bus.emit(\"pause\");\n if (status === \"playing\") dispatch({ type: \"pause\" });\n } else if (ytState === \"ended\") {\n bus.emit(\"ended\");\n if (status !== \"ended\") dispatch({ type: \"ended\" });\n } else if (ytState === \"buffering\") {\n bus.emit(\"buffering\", { isBuffering: true });\n }\n },\n }),\n );\n registry.register(nativeProvider);\n\n /* ---------------------------------------------------------------- */\n /* Player object (forward declaration so plugins can capture a ref) */\n /* ---------------------------------------------------------------- */\n\n const playerRef = {} as Player;\n const host = createPluginHost({\n commands,\n controls,\n store: { getState: store.getState, subscribe: store.subscribe },\n bus,\n sourceTransforms,\n mediaAttachments,\n });\n const plugins: PluginBus = createPluginBus({ player: playerRef, host });\n\n /* ---------------------------------------------------------------- */\n /* Reducer wiring */\n /* ---------------------------------------------------------------- */\n\n function dispatch(event: MachineEvent): void {\n if (disposed) return;\n const prev = status;\n const result = reduce(status, event);\n status = result.next;\n store.setState({ status });\n for (const effect of result.effects) applyEffect(effect);\n if (prev !== \"ready\" && status === \"ready\") {\n bus.emit(\"ready\", { duration: store.getState().duration });\n resolvePendingSourceLoad();\n }\n if (event.type === \"loadFailed\") {\n rejectPendingSourceLoad(event.error);\n }\n }\n\n function applyEffect(effect: MachineEffect): void {\n switch (effect.type) {\n case \"attachSource\":\n runAttachSource(effect.source);\n return;\n case \"detachSource\":\n runDetachSource();\n return;\n case \"mediaPlay\":\n runMediaPlay();\n return;\n case \"mediaPause\":\n runMediaPause();\n return;\n case \"mediaSeek\":\n runMediaSeek(effect.seconds);\n return;\n case \"clearError\":\n if (store.getState().error) store.setState({ error: null });\n return;\n case \"setError\":\n applyError(effect.error);\n return;\n default: {\n const _exhaustive: never = effect;\n return _exhaustive;\n }\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Effect runners */\n /* ---------------------------------------------------------------- */\n\n function runAttachSource(source: SourceDescriptor): void {\n // Cancel any prior in-flight loader BEFORE we replace activeLoader so a\n // rapid setSource(A) → setSource(B) sequence cannot let A's resolved\n // metadata leak into B's state. detach() will be invoked by the next\n // detachSource effect (state machine emits detachSource before\n // attachSource on every source switch).\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n\n store.setState({\n source,\n currentTime: 0,\n duration: 0,\n buffered: [],\n qualities: [],\n activeQuality: null,\n });\n bus.emit(\"qualitychange\", { quality: null, auto: true });\n if (\n !isSafeMediaUrl(source.src) ||\n source.tracks?.some((track) => !isSafeMediaUrl(track.src)) ||\n (source.thumbnails && !isSafeMediaUrl(source.thumbnails.src))\n ) {\n if (video) {\n pendingSourceLoad = createPendingSourceLoad();\n }\n const error = createPlayerError({\n code: \"unsupported\",\n message: \"Invalid URL\",\n });\n dispatch({ type: \"loadFailed\", error });\n return;\n }\n if (!video) return; // attach happens once a <video> is provided\n const sourceLoad = createPendingSourceLoad();\n pendingSourceLoad = sourceLoad;\n const provider = registry.resolve(source);\n if (!provider) {\n const error = createPlayerError({\n code: \"unsupported\",\n message: `No source provider for ${source.src}`,\n });\n dispatch({\n type: \"loadFailed\",\n error,\n });\n return;\n }\n const loader = provider.createLoader();\n activeLoader = loader;\n\n let aborted = false;\n pendingAttachAbort = () => {\n aborted = true;\n // Tell the loader to cancel its in-flight network work. The loader\n // implementation is responsible for being idempotent and safe across\n // detach() ordering (see SourceLoader.abort docstring).\n try {\n loader.abort?.();\n } catch (error) {\n console.error(error);\n }\n if (pendingSourceLoad === sourceLoad) {\n rejectPendingSourceLoad(createAbortError());\n } else {\n sourceLoad.reject(createAbortError());\n }\n };\n\n loader\n .attach(video, source)\n .then(() => {\n if (aborted) return;\n if (!video) return;\n // Capture metadata into the store; the native `loadedmetadata`\n // event listener will also have fired, but plugins-with-mock-engines\n // (HLS native fallback, YouTube) can resolve `attach` later.\n store.setState({\n duration: Number.isFinite(video.duration) ? video.duration : 0,\n videoWidth: video.videoWidth,\n videoHeight: video.videoHeight,\n buffered: bufferedToRanges(video.buffered),\n });\n dispatch({ type: \"loaded\" });\n })\n .catch((err) => {\n if (aborted) return;\n const playerError = classifyUnknown(err, source.src);\n dispatch({ type: \"loadFailed\", error: playerError });\n });\n }\n\n function runDetachSource(): void {\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n if (activeLoader) {\n try {\n activeLoader.detach();\n } catch (err) {\n console.error(\"[@f8team/reel-core] active loader detach threw:\", err);\n }\n activeLoader = null;\n }\n store.setState({\n source: null,\n duration: 0,\n currentTime: 0,\n buffered: [],\n qualities: [],\n activeQuality: null,\n });\n }\n\n function runMediaPlay(): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.playVideo();\n } catch {\n // ignore\n }\n return;\n }\n const result = video.play();\n if (result && typeof (result as Promise<void>).then === \"function\") {\n (result as Promise<void>).catch((err: unknown) => {\n dispatch({\n type: \"runtimeError\",\n error: classifyUnknown(err),\n });\n });\n }\n }\n\n function runMediaPause(): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.pauseVideo();\n } catch {\n // ignore\n }\n return;\n }\n try {\n video.pause();\n } catch {\n // ignore\n }\n }\n\n function runMediaSeek(seconds: number): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.seekTo(seconds, true);\n store.setState({ currentTime: seconds });\n bus.emit(\"timeupdate\", {\n currentTime: seconds,\n playedSeconds: seconds,\n duration: store.getState().duration,\n });\n } catch {\n // ignore\n }\n return;\n }\n try {\n video.currentTime = seconds;\n } catch {\n // ignore\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Native <video> event bridge */\n /* ---------------------------------------------------------------- */\n\n const nativeListeners: Array<() => void> = [];\n\n function bindNativeEvents(target: HTMLVideoElement): void {\n function on<T extends Event>(name: string, fn: (e: T) => void): void {\n const handler = (e: Event): void => fn(e as T);\n target.addEventListener(name, handler);\n nativeListeners.push(() => target.removeEventListener(name, handler));\n }\n on(\"loadedmetadata\", () => {\n store.setState({\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n videoWidth: target.videoWidth,\n videoHeight: target.videoHeight,\n buffered: bufferedToRanges(target.buffered),\n });\n // The state machine will also receive `loaded` from the loader;\n // calling dispatch here is safe because invalid transitions are no-ops.\n if (status === \"loading\") dispatch({ type: \"loaded\" });\n });\n on(\"durationchange\", () => {\n const duration = Number.isFinite(target.duration) ? target.duration : 0;\n store.setState({ duration });\n bus.emit(\"durationchange\", { duration });\n });\n on(\"timeupdate\", () => {\n // YouTube owns time via the polled bridge; the hidden <video> still fires\n // native timeupdate at currentTime=0 and would clobber the store / onProgress.\n if (getYouTubePlayer()) return;\n const currentTime = target.currentTime;\n store.setState({ currentTime, buffered: bufferedToRanges(target.buffered) });\n bus.emit(\"timeupdate\", {\n currentTime,\n playedSeconds: currentTime,\n duration: target.duration,\n });\n });\n on(\"play\", () => {\n bus.emit(\"play\");\n dispatch({ type: \"play\" });\n });\n on(\"pause\", () => {\n bus.emit(\"pause\");\n dispatch({ type: \"pause\" });\n });\n on(\"ended\", () => {\n bus.emit(\"ended\");\n dispatch({ type: \"ended\" });\n });\n on(\"error\", () => {\n const err = classifyMediaError(target.error, target.currentSrc);\n if (status === \"loading\") dispatch({ type: \"loadFailed\", error: err });\n else dispatch({ type: \"runtimeError\", error: err });\n });\n on(\"volumechange\", () => {\n store.setState({ volume: target.volume, muted: target.muted });\n bus.emit(\"volumechange\", { volume: target.volume, muted: target.muted });\n });\n on(\"ratechange\", () => {\n store.setState({ playbackRate: target.playbackRate });\n bus.emit(\"ratechange\", { playbackRate: target.playbackRate });\n });\n on(\"seeking\", () => {\n bus.emit(\"seeking\", { time: target.currentTime });\n // Seeking flushes the decode pipeline; show the same center spinner as\n // `waiting` until `seeked` / `playing` settles (avoids a \"frozen\" feel).\n bus.emit(\"buffering\", { isBuffering: true });\n });\n on(\"seeked\", () => {\n bus.emit(\"seeked\", { time: target.currentTime });\n // Paused scrubs: nothing will fire `playing` to clear the seek spinner.\n if (target.paused) {\n bus.emit(\"buffering\", { isBuffering: false });\n return;\n }\n // Playing: if the browser already has enough decoded data, clear early;\n // otherwise keep showing until `waiting` → `playing` (or `playing` alone).\n if (target.readyState >= 3 /* HAVE_FUTURE_DATA */) {\n bus.emit(\"buffering\", { isBuffering: false });\n }\n });\n on(\"waiting\", () => {\n // Initial decode/load commonly emits `waiting` while HAVE_NOTHING/HAVE_METADATA, which\n // stacks awkwardly with the poster/boot UI (persistent spinner right after F5).\n // Treat stalls as buffering once we already reached CURRENT_DATA for this playback session.\n if (target.readyState < 2 /* HAVE_CURRENT_DATA */) return;\n bus.emit(\"buffering\", { isBuffering: true });\n });\n on(\"playing\", () => {\n bus.emit(\"buffering\", { isBuffering: false });\n });\n on(\"enterpictureinpicture\", () => {\n store.setState({ pip: true });\n bus.emit(\"pipchange\", { pip: true });\n });\n on(\"leavepictureinpicture\", () => {\n store.setState({ pip: false });\n bus.emit(\"pipchange\", { pip: false });\n });\n\n // `fullscreenchange` fires on `document`, not on the <video> element.\n // We track it here so `state.fullscreen` stays accurate without requiring\n // consumers to install the fullscreen plugin.\n const ownerDocument = target.ownerDocument;\n const onFullscreenChange = (): void => {\n const isFullscreen = !!ownerDocument.fullscreenElement?.contains(target);\n store.setState({ fullscreen: isFullscreen });\n bus.emit(\"fullscreenchange\", { fullscreen: isFullscreen });\n };\n ownerDocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n nativeListeners.push(() =>\n ownerDocument.removeEventListener(\"fullscreenchange\", onFullscreenChange),\n );\n }\n\n function unbindNativeEvents(): void {\n while (nativeListeners.length) {\n try {\n nativeListeners.pop()?.();\n } catch {\n // ignore\n }\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Public Player */\n /* ---------------------------------------------------------------- */\n\n function applyAttachOptions(): void {\n if (!video) return;\n const state = store.getState();\n video.volume = state.volume;\n video.muted = state.muted;\n video.playbackRate = state.playbackRate;\n if (options.poster) video.poster = options.poster;\n if (options.preload) video.preload = options.preload;\n video.playsInline = options.playsInline ?? true;\n video.toggleAttribute(\"webkit-playsinline\", video.playsInline);\n // T3.5: default `crossOrigin: \"anonymous\"`. Required for WebVTT subtitle\n // tracks (G15) and HLS segment fetch with `withCredentials`. Consumers can\n // override with an explicit `\"use-credentials\"` or `null`. Note the\n // `in options` guard - `options.crossOrigin === null` is treated as\n // \"no attribute on the element\" (matches the JSDoc semantics), and\n // `undefined` falls through to the default.\n video.crossOrigin = \"crossOrigin\" in options ? (options.crossOrigin ?? null) : \"anonymous\";\n video.loop = !!options.loop;\n }\n\n // Per-attach disposers (autoplay / startTime listeners + post-ready\n // immediate work) so that re-attach after detach doesn't leak listeners\n // and does fire autoplay/startTime even when the player is already in\n // the `ready` state on the second attach (A5).\n const attachDisposers: Array<() => void> = [];\n\n function flushAttachDisposers(): void {\n while (attachDisposers.length) {\n try {\n attachDisposers.pop()?.();\n } catch {\n // ignore\n }\n }\n }\n\n function applyStartTimeNow(): void {\n if (video && typeof options.startTime === \"number\" && options.startTime > 0) {\n video.currentTime = options.startTime;\n }\n }\n\n function applyAutoplayNow(): void {\n if (!options.autoplay || options.autoplay === \"off\") return;\n if (options.autoplay === \"muted\" && video) video.muted = true;\n playerRef.play().catch(() => {\n /* swallow - surfaced via runtimeError */\n });\n }\n\n async function attach(el: HTMLVideoElement): Promise<void> {\n if (disposed) throw new Error(\"[@f8team/reel-core] cannot attach: player disposed\");\n if (video === el) {\n await latestSourceLoadPromise;\n return;\n }\n if (video) detach();\n video = el;\n mediaAttachments.set({\n video: el,\n container: el.closest(\"[data-reel]\") ?? el.parentElement ?? el,\n });\n bindNativeEvents(el);\n applyAttachOptions();\n const currentSource = store.getState().source;\n if (currentSource) setSource(currentSource);\n const sourceLoadPromise = latestSourceLoadPromise;\n\n const wantStartTime = typeof options.startTime === \"number\" && options.startTime > 0;\n const wantAutoplay = !!options.autoplay && options.autoplay !== \"off\" && !!options.source;\n\n // If the engine has already reached ready (e.g. second attach to the\n // same already-loaded source), apply autoplay/startTime synchronously\n // so the second mount behaves identically to the first.\n if (status === \"ready\") {\n if (wantStartTime) applyStartTimeNow();\n if (wantAutoplay) applyAutoplayNow();\n } else {\n if (wantStartTime) {\n const off = bus.on(\"ready\", () => {\n applyStartTimeNow();\n off();\n });\n attachDisposers.push(off);\n }\n if (wantAutoplay) {\n const off = bus.on(\"ready\", () => {\n applyAutoplayNow();\n off();\n });\n attachDisposers.push(off);\n }\n }\n\n await sourceLoadPromise;\n }\n\n function detach(): void {\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n flushAttachDisposers();\n unbindNativeEvents();\n if (activeLoader) {\n try {\n activeLoader.detach();\n } catch {\n // ignore\n }\n activeLoader = null;\n }\n mediaAttachments.set(null);\n video = null;\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n plugins.disposeAll();\n dispatch({ type: \"dispose\" });\n detach();\n bus.clear();\n controls.clear();\n store.dispose();\n }\n\n function setSource(source: SourceDescriptor | null): void {\n // Cancel any queued play intent so a play() issued during the previous\n // load doesn't auto-fire on the new source's `ready` event.\n pendingPlay = false;\n latestSourceLoadPromise = null;\n dispatch({ type: \"setSource\", source: source ? sourceTransforms.apply(source) : null });\n }\n\n function getSource(): SourceDescriptor | null {\n return store.getState().source;\n }\n\n // Retry replays the most recent source through the state machine. We do\n // this at the orchestrator layer (rather than inside the reducer) because\n // the reducer is pure and the source is owned by the store. Calling\n // `setSource(currentSource)` re-emits detachSource → clearError →\n // attachSource which gives us the same cycle as a fresh load (C1).\n function retry(): boolean {\n const current = store.getState().source;\n if (!current) return false;\n setSource(current);\n return true;\n }\n\n async function play(): Promise<void> {\n if (disposed) throw new Error(\"[@f8team/reel-core] cannot play: player disposed\");\n if (!video) throw new Error(\"[@f8team/reel-core] cannot play: no <video> attached\");\n if (!store.getState().source) throw new Error(\"[@f8team/reel-core] cannot play: no source set\");\n\n // In `error`, `dispatch({ type: \"play\" })` is intentionally a reducer noop - user\n // Space/Play would appear dead. Replay the descriptor through the machine like `retry()`\n // so we return to loading and defer until `ready`.\n if (status === \"error\") {\n pendingPlay = false;\n if (!retry()) {\n throw new Error(\"[@f8team/reel-core] cannot play: error state without replayable source\");\n }\n // retry() transitioned to loading synchronously via dispatch.\n }\n\n // Defer-play during loading: the state machine treats `play` as a noop\n // in `loading`, so a single user click would otherwise be lost while\n // HLS.js is still fetching the m3u8 manifest. Queue the intent and\n // re-dispatch on the next `ready` transition. Tied to attach lifecycle\n // via `attachDisposers` so detach/dispose cancels the queued play.\n if (status === \"loading\") {\n if (pendingPlay) {\n return;\n }\n pendingPlay = true;\n const off = bus.on(\"ready\", () => {\n off();\n if (!pendingPlay) return;\n pendingPlay = false;\n if (disposed || !video || !store.getState().source) return;\n dispatch({ type: \"play\" });\n });\n attachDisposers.push(() => {\n pendingPlay = false;\n off();\n });\n return;\n }\n\n dispatch({ type: \"play\" });\n // If the underlying engine returned a play() promise, the runner already\n // surfaced its rejection through dispatch(runtimeError).\n }\n\n function pause(): void {\n // Cancel any queued play intent so explicitly pausing during loading\n // doesn't autoplay once `ready` fires.\n pendingPlay = false;\n dispatch({ type: \"pause\" });\n }\n\n function paused(): boolean {\n if (!video) return true;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n return yt.getPlayerState() !== YT_PLAYER_STATE_PLAYING;\n } catch {\n return true;\n }\n }\n return video.paused;\n }\n\n function seekTo(seconds: number): void {\n if (!Number.isFinite(seconds)) return;\n if (!video) return;\n const duration = Number.isFinite(video.duration) ? video.duration : Number.POSITIVE_INFINITY;\n const clamped = Math.max(0, Math.min(seconds, duration));\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.seekTo(clamped, true);\n store.setState({ currentTime: clamped });\n bus.emit(\"timeupdate\", {\n currentTime: clamped,\n playedSeconds: clamped,\n duration: store.getState().duration,\n });\n } catch {\n // ignore\n }\n return;\n }\n video.currentTime = clamped;\n }\n\n function syncVolumeMutedStoreFromVideo(): void {\n if (!video) return;\n store.setState({ volume: video.volume, muted: video.muted });\n }\n\n function syncPlaybackRateStoreFromVideo(): void {\n if (!video) return;\n store.setState({ playbackRate: video.playbackRate });\n }\n\n function setPlaybackRate(rate: number): void {\n if (!Number.isFinite(rate) || rate <= 0) return;\n if (!video) return;\n video.playbackRate = rate;\n syncPlaybackRateStoreFromVideo();\n }\n\n function setVolume(volume: number): void {\n if (!Number.isFinite(volume)) return;\n if (!video) return;\n video.volume = Math.max(0, Math.min(1, volume));\n syncVolumeMutedStoreFromVideo();\n }\n\n function setMuted(muted: boolean): void {\n if (!video) return;\n video.muted = muted;\n syncVolumeMutedStoreFromVideo();\n }\n\n function getState(): PlayerState {\n return store.getState();\n }\n\n function getCurrentTime(): number {\n return store.getState().currentTime;\n }\n\n function getDuration(): number {\n return store.getState().duration;\n }\n\n function getBuffered(): BufferedRange[] {\n return store.getState().buffered.slice();\n }\n\n function on<K extends keyof PlayerEvents>(\n event: K,\n handler: (payload: PlayerEvents[K]) => void,\n ): Disposer {\n return bus.on(event, handler as never);\n }\n\n function off<K extends keyof PlayerEvents>(\n event: K,\n handler: (payload: PlayerEvents[K]) => void,\n ): void {\n bus.off(event, handler as never);\n }\n\n function subscribe<T>(\n selector: (state: PlayerState) => T,\n listener: (value: T) => void,\n ): Disposer {\n return store.subscribe(selector, listener);\n }\n\n function use(plugin: PluginInstance): void {\n plugins.register(plugin);\n }\n\n function removePlugin(name: string): void {\n plugins.unregister(name);\n }\n\n // Materialize the public surface on the existing reference so plugins\n // captured a stable identity at construction time.\n Object.assign(playerRef, {\n setSource,\n getSource,\n retry,\n play,\n pause,\n paused,\n seekTo,\n setPlaybackRate,\n setVolume,\n setMuted,\n getState,\n getCurrentTime,\n getDuration,\n getBuffered,\n on,\n off,\n subscribe,\n use,\n removePlugin,\n commands,\n attach,\n detach,\n dispose,\n } satisfies Player);\n\n // Pre-register plugins from PlayerOptions.\n for (const plugin of options.plugins ?? []) plugins.register(plugin);\n\n return playerRef;\n}\n","/**\n * Identity helper used by plugin authors so editors get type narrowing\n * on `setup` arguments without typing `as PluginInstance` at every call site.\n *\n * @example\n * const subtitles = definePlugin({\n * name: \"subtitles\",\n * setup: (player, host) => { ... },\n * });\n */\nimport { type PluginInstance } from \"../types/plugin.js\";\n\nexport function definePlugin(spec: PluginInstance): PluginInstance {\n return spec;\n}\n","/**\n * Default token values. Phase 3 ships theme CSS files (`classroom.css`,\n * `story.css`, `admin.css`, `minimal.css`) that override these via class\n * selectors. The defaults below are intentionally neutral so an unstyled\n * player still looks reasonable.\n */\n\nimport { type ThemeName, type ThemeTokens } from \"../types/theme.js\";\n\n/**\n * Token name → CSS custom property name. Adapters write to the variable\n * directly so consumers can also use plain CSS to override.\n */\nexport const TOKEN_TO_CSS_VAR: Record<keyof ThemeTokens, string> = {\n \"color-bg\": \"--reel-color-bg\",\n \"color-fg\": \"--reel-color-fg\",\n \"color-accent\": \"--reel-color-accent\",\n \"color-overlay\": \"--reel-color-overlay\",\n \"control-size\": \"--reel-control-size\",\n \"control-radius\": \"--reel-control-radius\",\n \"control-gap\": \"--reel-control-gap\",\n \"control-padding\": \"--reel-control-padding\",\n \"focus-ring-color\": \"--reel-focus-ring-color\",\n \"focus-ring-width\": \"--reel-focus-ring-width\",\n \"seekbar-height\": \"--reel-seekbar-height\",\n \"seekbar-buffered\": \"--reel-seekbar-buffered\",\n \"seekbar-played\": \"--reel-seekbar-played\",\n \"seekbar-knob-size\": \"--reel-seekbar-knob-size\",\n \"font-family\": \"--reel-font-family\",\n \"font-size-sm\": \"--reel-font-size-sm\",\n \"font-size-md\": \"--reel-font-size-md\",\n \"motion-fast\": \"--reel-motion-fast\",\n \"motion-base\": \"--reel-motion-base\",\n};\n\n/**\n * Neutral default tokens. Adapters apply these on the player root before any\n * theme class wins. Values use `1rem = 10px` (F8 frontends use the 62.5%\n * font-size convention).\n */\nexport const DEFAULT_TOKENS: Required<ThemeTokens> = {\n \"color-bg\": \"#0d0d0d\",\n \"color-fg\": \"#ffffff\",\n \"color-accent\": \"#ff5722\",\n \"color-overlay\": \"rgba(0, 0, 0, 0.55)\",\n\n \"control-size\": \"3.6rem\",\n \"control-radius\": \"0.8rem\",\n \"control-gap\": \"0.8rem\",\n \"control-padding\": \"0.8rem\",\n\n \"focus-ring-color\": \"#3ea6ff\",\n \"focus-ring-width\": \"0.2rem\",\n\n \"seekbar-height\": \"0.4rem\",\n \"seekbar-buffered\": \"rgba(255, 255, 255, 0.35)\",\n \"seekbar-played\": \"var(--reel-color-accent)\",\n \"seekbar-knob-size\": \"1.2rem\",\n\n \"font-family\": \"system-ui, -apple-system, 'Segoe UI', sans-serif\",\n \"font-size-sm\": \"1.2rem\",\n \"font-size-md\": \"1.4rem\",\n\n \"motion-fast\": \"120ms\",\n \"motion-base\": \"200ms\",\n};\n\n/** Built-in theme presets. Phase 3 packages the CSS counterpart. */\nexport const THEME_PRESETS: Record<ThemeName, ThemeTokens> = {\n classroom: {\n \"color-bg\": \"#0e1117\",\n \"color-accent\": \"#ff6b00\",\n \"control-size\": \"4.0rem\",\n \"seekbar-height\": \"0.4rem\",\n },\n story: {\n \"color-bg\": \"transparent\",\n \"color-overlay\": \"rgba(0, 0, 0, 0.45)\",\n \"control-size\": \"4.4rem\",\n \"seekbar-height\": \"0.3rem\",\n },\n admin: {\n \"color-bg\": \"#1a1d23\",\n \"color-accent\": \"#3ea6ff\",\n \"control-size\": \"3.2rem\",\n \"seekbar-height\": \"0.5rem\",\n },\n minimal: {\n \"color-bg\": \"transparent\",\n \"control-size\": \"3.0rem\",\n \"seekbar-height\": \"0.3rem\",\n },\n};\n","/**\n * Apply theme tokens to an element's `style`.\n *\n * Adapters call this once per mount and again whenever the theme prop changes.\n * Plugins can overlay extra tokens through the same helper.\n */\n\nimport { type ThemeName, type ThemeTokens } from \"../types/theme.js\";\n\nimport { DEFAULT_TOKENS, THEME_PRESETS, TOKEN_TO_CSS_VAR } from \"./tokens.js\";\n\nexport interface ApplyThemeArgs {\n /** Theme preset name. `undefined` skips preset application. */\n preset?: ThemeName;\n /** Extra token overrides. Wins over the preset. */\n overrides?: ThemeTokens;\n /** Whether to apply the neutral defaults first. Default: `true`. */\n applyDefaults?: boolean;\n}\n\n/**\n * Resolve a final token map by layering defaults → preset → overrides.\n */\nexport function resolveTokens(args: ApplyThemeArgs = {}): Partial<ThemeTokens> {\n const out: ThemeTokens = {};\n if (args.applyDefaults !== false) Object.assign(out, DEFAULT_TOKENS);\n if (args.preset) Object.assign(out, THEME_PRESETS[args.preset]);\n if (args.overrides) Object.assign(out, args.overrides);\n return out;\n}\n\n/**\n * Apply tokens to `element.style`. Returns a disposer that resets the\n * variables to their previous values (useful for adapters that need to\n * roll back on theme change).\n */\nexport function applyTheme(element: HTMLElement, args: ApplyThemeArgs = {}): () => void {\n const tokens = resolveTokens(args);\n const previous: Partial<Record<keyof ThemeTokens, string>> = {};\n for (const [key, value] of Object.entries(tokens)) {\n if (typeof value !== \"string\") continue;\n const cssVar = TOKEN_TO_CSS_VAR[key as keyof ThemeTokens];\n if (!cssVar) continue;\n previous[key as keyof ThemeTokens] = element.style.getPropertyValue(cssVar);\n element.style.setProperty(cssVar, value);\n }\n return () => {\n for (const [key, prev] of Object.entries(previous)) {\n const cssVar = TOKEN_TO_CSS_VAR[key as keyof ThemeTokens];\n if (!cssVar) continue;\n if (prev) element.style.setProperty(cssVar, prev);\n else element.style.removeProperty(cssVar);\n }\n };\n}\n","/**\n * Single shared off-screen `aria-live` region. Adapters / plugins call\n * `announce(\"Subtitles on\")` to push messages to assistive tech without\n * jumping focus.\n *\n * The region is created lazily (so SSR-only consumers pay nothing) and\n * polite by default. Screen readers respect rate-limit conventions, so\n * announcements queue up and read sequentially.\n */\n\nconst REGION_ID = \"reel-live-region\";\n\nlet region: HTMLElement | null = null;\n\nfunction ensureRegion(): HTMLElement | null {\n if (typeof document === \"undefined\") return null;\n if (region && region.isConnected) return region;\n const existing = document.getElementById(REGION_ID);\n if (existing) {\n region = existing;\n return region;\n }\n const node = document.createElement(\"div\");\n node.id = REGION_ID;\n node.setAttribute(\"aria-live\", \"polite\");\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"role\", \"status\");\n // Visually hidden, but exposed to screen readers.\n Object.assign(node.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0,0,0,0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n } satisfies Partial<CSSStyleDeclaration>);\n document.body.appendChild(node);\n region = node;\n return region;\n}\n\n/**\n * Announce a message to assistive tech. No-op outside the browser.\n *\n * Subsequent calls with the same string force a fresh DOM mutation (we\n * blank the region for one frame) so screen readers re-read identical\n * messages — useful for repeated state toggles like Mute on/off.\n */\nexport function announce(message: string): void {\n if (!message) return;\n const node = ensureRegion();\n if (!node) return;\n if (node.textContent === message) {\n node.textContent = \"\";\n }\n // Microtask delay — gives the screen reader a chance to notice the empty\n // mutation when re-announcing the same string.\n queueMicrotask(() => {\n if (node.isConnected) node.textContent = message;\n });\n}\n\n/** @internal — drop the live region. Used by the test cleanup hooks. */\nexport function _disposeAnnounce(): void {\n if (region && region.parentElement) region.parentElement.removeChild(region);\n region = null;\n}\n","/**\n * Minimal focus trap helper.\n *\n * Used by adapters in fullscreen so Tab / Shift+Tab stays inside the player.\n * Not a replacement for full focus-management libraries (focus-trap-react)\n * — but enough for the player's small, well-known interactive surface.\n */\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable]\",\n].join(\",\");\n\nfunction isFocusable(el: Element): el is HTMLElement {\n if (!(el instanceof HTMLElement)) return false;\n if (el.hidden) return false;\n if (el.tabIndex === -1) return false;\n // Production DOM gives us a layout-aware visibility check. We can't trust\n // it in jsdom (where offsetParent often stays null until layout flushes).\n // The selector already excludes `disabled` and `tabindex=\"-1\"`; that's\n // enough to keep the API honest.\n return true;\n}\n\nfunction focusables(container: HTMLElement): HTMLElement[] {\n const all = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n return all.filter(isFocusable);\n}\n\nexport interface FocusTrap {\n /** Activate the trap. Optionally focuses the first focusable. */\n activate(opts?: { focusFirst?: boolean }): void;\n /** Deactivate. Optionally restores focus to the previously focused element. */\n deactivate(opts?: { restoreFocus?: boolean }): void;\n}\n\n/**\n * Build a focus trap rooted at `container`.\n *\n * The trap installs a `keydown` listener and rotates focus among the\n * descendants matching `FOCUSABLE_SELECTOR` when Tab/Shift+Tab fires near\n * the boundary.\n */\nexport function createFocusTrap(container: HTMLElement): FocusTrap {\n let active = false;\n let previouslyFocused: Element | null = null;\n\n function onKeyDown(event: KeyboardEvent): void {\n if (!active) return;\n if (event.key !== \"Tab\") return;\n const items = focusables(container);\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n if (!first || !last) return;\n const current = document.activeElement;\n if (event.shiftKey) {\n if (current === first || !container.contains(current)) {\n event.preventDefault();\n last.focus();\n }\n } else if (current === last || !container.contains(current)) {\n event.preventDefault();\n first.focus();\n }\n }\n\n function activate(opts: { focusFirst?: boolean } = {}): void {\n if (active) return;\n active = true;\n previouslyFocused = document.activeElement;\n container.addEventListener(\"keydown\", onKeyDown, true);\n if (opts.focusFirst) {\n const items = focusables(container);\n items[0]?.focus();\n }\n }\n\n function deactivate(opts: { restoreFocus?: boolean } = {}): void {\n if (!active) return;\n active = false;\n container.removeEventListener(\"keydown\", onKeyDown, true);\n if (opts.restoreFocus && previouslyFocused instanceof HTMLElement) {\n try {\n previouslyFocused.focus();\n } catch {\n // ignore\n }\n }\n previouslyFocused = null;\n }\n\n return { activate, deactivate };\n}\n","/**\n * Focus helpers for the auto-hiding controls chrome.\n *\n * The themes keep the controls bar visible while the player matches\n * `:focus-within`, so keyboard users never lose the control they are on.\n * A pointer click focuses that control too, which used to latch the chrome\n * open forever - most visibly after tapping the fullscreen button, the only\n * way into fullscreen. `shouldKeepControlsVisible` tells the auto-hide timer\n * which of the two it is looking at, and `blurFocusInside` releases the\n * pointer-induced focus so `:focus-within` stops matching.\n */\n\n/** Marks an open control menu (settings, quality, captions...). */\nconst OPEN_MENU_SELECTOR = \"[data-reel-menu-open]\";\n\nfunction activeElementInside(container: Element): HTMLElement | null {\n const active = (container.ownerDocument ?? document).activeElement;\n if (!(active instanceof HTMLElement)) return null;\n return container.contains(active) ? active : null;\n}\n\n/**\n * Clears focus from any focused descendant of `container`.\n *\n * Used on pointer leave of the `[data-reel]` wrapper and when the auto-hide\n * timer fires, so `:focus-within` does not keep the controls bar visible\n * after a mouse click or tap on a control.\n */\nexport function blurFocusInside(container: Element): void {\n activeElementInside(container)?.blur();\n}\n\n/**\n * `true` when the controls must stay on screen even though the idle timer\n * expired: an open menu, or a control the user reached with the keyboard.\n *\n * Pointer focus deliberately returns `false` - a tap must not pin the chrome.\n */\nexport function shouldKeepControlsVisible(container: Element): boolean {\n if (container.querySelector(OPEN_MENU_SELECTOR) !== null) return true;\n const active = activeElementInside(container);\n if (!active) return false;\n try {\n return active.matches(\":focus-visible\");\n } catch {\n // Engines without `:focus-visible` (or jsdom) must not latch the chrome.\n return false;\n }\n}\n","/**\n * Time helpers shared by the seek bar, transcript markers (G8), and the\n * keyboard / commands layer.\n */\n\nconst TIME_RE = /^(?:(\\d+):)?(\\d{1,2}):(\\d{1,2})(?:\\.(\\d+))?$/;\n\n/**\n * Parse a time string like `\"00:01:23\"`, `\"1:23\"`, `\"00:01:23.456\"` to seconds.\n * Returns `NaN` for invalid input — callers should guard.\n *\n * Accepted forms:\n * - `\"H:MM:SS\"` / `\"H:MM:SS.fff\"`\n * - `\"M:SS\"` / `\"MM:SS\"` / `\"MM:SS.fff\"`\n *\n * Anything else (including bare numbers, negative values, NaN strings) is\n * `NaN`. Callers that want to accept numbers SHOULD test `typeof === \"number\"`\n * first.\n */\nexport function parseTime(input: string): number {\n if (typeof input !== \"string\") return Number.NaN;\n const trimmed = input.trim();\n const match = TIME_RE.exec(trimmed);\n if (!match) return Number.NaN;\n const [, hStr, mStr, sStr, fracStr] = match;\n const h = hStr ? Number.parseInt(hStr, 10) : 0;\n const m = Number.parseInt(mStr ?? \"0\", 10);\n const s = Number.parseInt(sStr ?? \"0\", 10);\n const frac = fracStr ? Number.parseFloat(`0.${fracStr}`) : 0;\n if (m > 59 || s > 59) return Number.NaN;\n return h * 3600 + m * 60 + s + frac;\n}\n\n/**\n * Format seconds to `H:MM:SS` (when ≥ 1h) or `MM:SS` (otherwise). NaN /\n * negative inputs are coerced to `0:00`.\n *\n * The ARIA-friendly verbose form (`\"1 hour 2 minutes\"`) is the adapter's job.\n */\nexport function formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"0:00\";\n const total = Math.floor(seconds);\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n const pad = (n: number, len = 2): string => n.toString().padStart(len, \"0\");\n if (h > 0) return `${h}:${pad(m)}:${pad(s)}`;\n return `${m}:${pad(s)}`;\n}\n\n/**\n * Coerce a time-like input to seconds. Accepts numbers, formatted strings,\n * and clamps negatives to 0.\n *\n * Returns `NaN` if the input cannot be coerced (so callers can refuse to\n * call `seekTo` rather than seeking to 0 silently).\n */\nexport function toSeconds(input: number | string): number {\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) return Number.NaN;\n return input < 0 ? 0 : input;\n }\n return parseTime(input);\n}\n"]}
1
+ {"version":3,"sources":["../src/errors/registry.ts","../src/errors/classify.ts","../src/events/bus.ts","../src/plugins/bus.ts","../src/plugins/commands.ts","../src/plugins/host.ts","../src/util/url.ts","../src/sources/hls.ts","../src/sources/native.ts","../src/sources/registry.ts","../src/sources/youtube.ts","../src/state/machine.ts","../src/state/store.ts","../src/createPlayer.ts","../src/plugins/definePlugin.ts","../src/theme/tokens.ts","../src/theme/apply.ts","../src/a11y/announce.ts","../src/a11y/focusTrap.ts","../src/a11y/controlsFocus.ts","../src/util/time.ts"],"names":["type","details","defaultLoad","on","off"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `PlayerError` factory + (optional) `Error` subclass for stack traces.\n *\n * The state machine and the source providers emit plain `PlayerError`\n * objects so the bus payload stays serializable. `createPlayerError`\n * provides one place to normalize the shape.\n */\n\nimport { type PlayerError, type PlayerErrorCode } from \"../types/error.js\";\n\nexport interface CreatePlayerErrorInput {\n code: PlayerErrorCode;\n message: string;\n cause?: unknown;\n status?: number;\n url?: string;\n retryable?: boolean;\n}\n\nconst RETRYABLE_BY_DEFAULT: Record<PlayerErrorCode, boolean> = {\n source: false,\n network: true,\n decode: false,\n unauthorized: false,\n unsupported: false,\n \"hls-fragment-loop\": true,\n internal: false,\n};\n\n/**\n * Build a `PlayerError`. `retryable` defaults to a conservative per-code\n * value; callers can always override.\n */\nexport function createPlayerError(input: CreatePlayerErrorInput): PlayerError {\n const error: PlayerError = {\n code: input.code,\n message: input.message,\n retryable: input.retryable ?? RETRYABLE_BY_DEFAULT[input.code],\n };\n if (input.cause !== undefined) error.cause = input.cause;\n if (input.status !== undefined) error.status = input.status;\n if (input.url !== undefined) error.url = input.url;\n return error;\n}\n","/**\n * Map low-level failures (`MediaError`, HTTP `XMLHttpRequest.status`, raw\n * `Error`) to a stable `PlayerError`.\n */\n\nimport { type PlayerError } from \"../types/error.js\";\n\nimport { createPlayerError } from \"./registry.js\";\n\n/**\n * `MediaError.code` constants (stable across browsers).\n *\n * - 1: MEDIA_ERR_ABORTED\n * - 2: MEDIA_ERR_NETWORK\n * - 3: MEDIA_ERR_DECODE\n * - 4: MEDIA_ERR_SRC_NOT_SUPPORTED\n */\nexport function classifyMediaError(err: MediaError | null | undefined, url?: string): PlayerError {\n const code = err?.code ?? 0;\n const message = err?.message || \"Media error\";\n switch (code) {\n case 1:\n return createPlayerError({ code: \"internal\", message: \"Media playback aborted\", url });\n case 2:\n return createPlayerError({ code: \"network\", message, url, retryable: true });\n case 3:\n return createPlayerError({ code: \"decode\", message, url });\n case 4:\n return createPlayerError({ code: \"unsupported\", message, url });\n default:\n return createPlayerError({ code: \"internal\", message, url, cause: err });\n }\n}\n\n/**\n * Map an HTTP status to a `PlayerError`. Used by the HLS provider when\n * `xhrSetup` sees a 4xx/5xx.\n */\nexport function classifyHttpStatus(status: number, url: string): PlayerError {\n if (status === 401 || status === 403) {\n return createPlayerError({\n code: \"unauthorized\",\n message: status === 401 ? \"Unauthorized\" : \"Forbidden\",\n status,\n url,\n });\n }\n if (status >= 500 && status < 600) {\n return createPlayerError({\n code: \"network\",\n message: `Server error ${status}`,\n status,\n url,\n retryable: true,\n });\n }\n if (status >= 400 && status < 500) {\n return createPlayerError({\n code: \"network\",\n message: `Client error ${status}`,\n status,\n url,\n retryable: false,\n });\n }\n return createPlayerError({\n code: \"network\",\n message: `HTTP ${status}`,\n status,\n url,\n });\n}\n\n/**\n * Catch-all classifier for arbitrary `Error` objects. Defaults to the\n * `internal` code with the original error attached as `cause`.\n */\nexport function classifyUnknown(err: unknown, url?: string): PlayerError {\n if (err instanceof Error) {\n return createPlayerError({\n code: \"internal\",\n message: err.message || \"Unknown error\",\n cause: err,\n url,\n });\n }\n return createPlayerError({\n code: \"internal\",\n message: typeof err === \"string\" ? err : \"Unknown error\",\n cause: err,\n url,\n });\n}\n","/**\n * Typed event bus.\n *\n * - Built-in events use the `PlayerEvents` map for full type safety.\n * - Plugin events use the `${string}:${string}` form (e.g. `subtitles:change`).\n * They bypass the type map because plugins are loaded dynamically; the\n * compromise is intentional and documented in the API contract.\n *\n * Invariants the tests guard:\n * - Listener removal during emit does not skip remaining listeners (snapshot).\n * - A throwing listener does not abort the rest (errors logged via `console.error`).\n * - Multiple `on()` of the same listener for the same event are deduped (Set).\n */\n\nimport { type PlayerEvents } from \"../types/events.js\";\n\ntype EventName = keyof PlayerEvents | (string & { __namespace?: never });\n\ntype Listener = (payload: unknown) => void;\n\nexport interface EventBus<TMap = PlayerEvents> {\n on<K extends keyof TMap>(event: K, listener: (payload: TMap[K]) => void): () => void;\n on(event: string, listener: (payload: unknown) => void): () => void;\n off<K extends keyof TMap>(event: K, listener: (payload: TMap[K]) => void): void;\n off(event: string, listener: (payload: unknown) => void): void;\n emit<K extends keyof TMap>(\n event: K,\n ...args: TMap[K] extends void ? [] : [payload: TMap[K]]\n ): void;\n emit(event: string, payload?: unknown): void;\n /** Drop every listener. Used by `player.dispose`. */\n clear(): void;\n /** Number of listeners for an event. Useful for tests. */\n listenerCount(event: string): number;\n}\n\n/**\n * Construct a typed event bus.\n *\n * Built-in `PlayerEvents` are fully type-checked; plugin events use the\n * `${namespace}:${verb}` form and pass through untyped (plugins can\n * augment via declaration-merging if they want stricter typing).\n */\nexport function createEventBus<TMap = PlayerEvents>(): EventBus<TMap> {\n const buckets = new Map<string, Set<Listener>>();\n\n function on(event: EventName, listener: Listener): () => void {\n const key = String(event);\n let set = buckets.get(key);\n if (!set) {\n set = new Set();\n buckets.set(key, set);\n }\n set.add(listener);\n return () => off(event, listener);\n }\n\n function off(event: EventName, listener: Listener): void {\n const key = String(event);\n const set = buckets.get(key);\n if (!set) return;\n set.delete(listener);\n if (set.size === 0) buckets.delete(key);\n }\n\n function emit(event: EventName, payload?: unknown): void {\n const key = String(event);\n const set = buckets.get(key);\n if (!set || set.size === 0) return;\n // Snapshot so listeners removing themselves (or other listeners) during\n // emit don't shift the iteration order.\n const snapshot = Array.from(set);\n for (const listener of snapshot) {\n try {\n listener(payload);\n } catch (err) {\n console.error(`[@f8team/reel-core] listener for \"${key}\" threw:`, err);\n }\n }\n }\n\n function clear(): void {\n buckets.clear();\n }\n\n function listenerCount(event: string): number {\n return buckets.get(event)?.size ?? 0;\n }\n\n return {\n on: on as EventBus<TMap>[\"on\"],\n off: off as EventBus<TMap>[\"off\"],\n emit: emit as EventBus<TMap>[\"emit\"],\n clear,\n listenerCount,\n };\n}\n","/**\n * Plugin lifecycle bus. Tracks registered plugins, calls each `setup`, stores\n * the optional teardown, and runs all teardowns on `disposeAll`.\n *\n * Re-registering a plugin with the same name throws — names are the public\n * identity surface and double-register usually means a build/import bug.\n */\n\nimport { type Player } from \"../types/player.js\";\nimport { type PluginHost, type PluginInstance } from \"../types/plugin.js\";\n\ninterface Entry {\n plugin: PluginInstance;\n teardown: (() => void) | null;\n}\n\nexport interface PluginBus {\n /** Register a plugin. Throws if `plugin.name` is already registered. */\n register(plugin: PluginInstance): void;\n /** Remove a plugin by name and run its teardown (idempotent). */\n unregister(name: string): void;\n /** Whether a plugin is registered. */\n has(name: string): boolean;\n /** Snapshot of currently registered plugin names. */\n list(): string[];\n /** Tear down every plugin in reverse-registration order. */\n disposeAll(): void;\n}\n\nexport interface CreatePluginBusArgs {\n player: Player;\n host: PluginHost;\n}\n\nexport function createPluginBus({ player, host }: CreatePluginBusArgs): PluginBus {\n const entries: Entry[] = [];\n\n function findIndex(name: string): number {\n return entries.findIndex((e) => e.plugin.name === name);\n }\n\n function register(plugin: PluginInstance): void {\n if (findIndex(plugin.name) >= 0) {\n throw new Error(`[@f8team/reel-core] plugin \"${plugin.name}\" is already registered`);\n }\n let setupResult: void | (() => void);\n try {\n setupResult = plugin.setup(player, host);\n } catch (err) {\n throw new Error(\n `[@f8team/reel-core] plugin \"${plugin.name}\" setup threw: ${(err as Error).message}`,\n { cause: err },\n );\n }\n const teardown = typeof setupResult === \"function\" ? setupResult : null;\n entries.push({ plugin, teardown });\n }\n\n function unregister(name: string): void {\n const idx = findIndex(name);\n if (idx < 0) return;\n const entry = entries.splice(idx, 1)[0];\n if (!entry) return;\n if (entry.teardown) {\n try {\n entry.teardown();\n } catch (err) {\n console.error(`[@f8team/reel-core] plugin \"${name}\" teardown threw:`, err);\n }\n }\n }\n\n function has(name: string): boolean {\n return findIndex(name) >= 0;\n }\n\n function list(): string[] {\n return entries.map((e) => e.plugin.name);\n }\n\n function disposeAll(): void {\n // Reverse order so teardowns mirror the registration sequence.\n while (entries.length) {\n const entry = entries.pop();\n if (entry?.teardown) {\n try {\n entry.teardown();\n } catch (err) {\n console.error(\n `[@f8team/reel-core] plugin \"${entry.plugin.name}\" teardown threw on dispose:`,\n err,\n );\n }\n }\n }\n }\n\n return { register, unregister, has, list, disposeAll };\n}\n","/**\n * Shared command registry. Plugins and adapters publish/run commands through\n * this single instance.\n */\n\nimport { type CommandRegistry } from \"../types/plugin.js\";\n\nexport function createCommandRegistry(): CommandRegistry {\n type Handler = (payload: unknown) => void;\n const handlers = new Map<string, Handler>();\n\n function add<P>(name: string, handler: (payload: P) => void): () => void {\n if (handlers.has(name)) {\n throw new Error(`[@f8team/reel-core] command \"${name}\" is already registered`);\n }\n handlers.set(name, handler as Handler);\n return () => {\n const current = handlers.get(name);\n if (current === handler) handlers.delete(name);\n };\n }\n\n function run<P>(name: string, payload?: P): void {\n const handler = handlers.get(name);\n if (!handler) return;\n try {\n handler(payload);\n } catch (err) {\n console.error(`[@f8team/reel-core] command \"${name}\" threw:`, err);\n }\n }\n\n function has(name: string): boolean {\n return handlers.has(name);\n }\n\n return { add, run, has };\n}\n","/**\n * Shared `PluginHost` factory. Each plugin gets a host bound to:\n * - the shared command registry (one per player)\n * - the typed event bus (for `emit`)\n * - a read-only view of the store\n * - the contribution slots for the active adapter\n */\n\nimport { type EventBus } from \"../events/bus.js\";\nimport {\n type CommandRegistry,\n type PluginMediaAttachment,\n type PluginHost,\n type SourceTransform,\n} from \"../types/plugin.js\";\nimport { type SourceDescriptor } from \"../types/source.js\";\nimport { type PlayerState } from \"../types/state.js\";\nimport { type ReadableStore } from \"../types/store.js\";\n\n/** The contribution registry the adapter reads from. */\nexport interface ControlsRegistry {\n contribute(slot: string, render: () => Element): () => void;\n /** Snapshot of the renders for a slot (adapter-only). */\n snapshot(slot: string): readonly (() => Element)[];\n /** Drop every contribution. */\n clear(): void;\n}\n\nexport function createControlsRegistry(): ControlsRegistry {\n const slots = new Map<string, Set<() => Element>>();\n\n function contribute(slot: string, render: () => Element): () => void {\n let set = slots.get(slot);\n if (!set) {\n set = new Set();\n slots.set(slot, set);\n }\n set.add(render);\n return () => {\n slots.get(slot)?.delete(render);\n };\n }\n\n function snapshot(slot: string): readonly (() => Element)[] {\n const set = slots.get(slot);\n return set ? Array.from(set) : [];\n }\n\n function clear(): void {\n slots.clear();\n }\n\n return { contribute, snapshot, clear };\n}\n\n/** Internal registry used to normalize descriptors before provider attach. */\nexport interface SourceTransformRegistry {\n register(transform: SourceTransform): () => void;\n apply(source: SourceDescriptor): SourceDescriptor;\n}\n\nexport function createSourceTransformRegistry(): SourceTransformRegistry {\n const transforms = new Set<SourceTransform>();\n\n function register(transform: SourceTransform): () => void {\n transforms.add(transform);\n return () => transforms.delete(transform);\n }\n\n function apply(source: SourceDescriptor): SourceDescriptor {\n let current = source;\n for (const transform of transforms) {\n current = transform(current);\n }\n return current;\n }\n\n return { register, apply };\n}\n\n/** Internal registry for the media element owned by this player instance. */\nexport interface MediaAttachmentRegistry {\n get(): PluginMediaAttachment | null;\n set(attachment: PluginMediaAttachment | null): void;\n subscribe(listener: (attachment: PluginMediaAttachment | null) => void): () => void;\n}\n\nexport function createMediaAttachmentRegistry(): MediaAttachmentRegistry {\n let current: PluginMediaAttachment | null = null;\n const listeners = new Set<(attachment: PluginMediaAttachment | null) => void>();\n\n function get(): PluginMediaAttachment | null {\n return current;\n }\n\n function set(attachment: PluginMediaAttachment | null): void {\n current = attachment;\n for (const listener of listeners) listener(current);\n }\n\n function subscribe(listener: (attachment: PluginMediaAttachment | null) => void): () => void {\n listeners.add(listener);\n if (current) listener(current);\n return () => listeners.delete(listener);\n }\n\n return { get, set, subscribe };\n}\n\nexport interface CreateHostArgs {\n commands: CommandRegistry;\n controls: ControlsRegistry;\n store: ReadableStore<PlayerState>;\n bus: EventBus;\n sourceTransforms?: SourceTransformRegistry;\n mediaAttachments?: MediaAttachmentRegistry;\n}\n\nexport function createPluginHost({\n commands,\n controls,\n store,\n bus,\n sourceTransforms = createSourceTransformRegistry(),\n mediaAttachments = createMediaAttachmentRegistry(),\n}: CreateHostArgs): PluginHost {\n return {\n controls: {\n contribute: controls.contribute,\n },\n commands,\n sources: {\n transform: sourceTransforms.register,\n },\n media: {\n get: mediaAttachments.get,\n subscribe: mediaAttachments.subscribe,\n },\n store,\n emit: (event, payload) => {\n bus.emit(event as string, payload);\n },\n };\n}\n","/**\n * URL helpers used by the source registry to dispatch a source descriptor to\n * the right provider. Pure string predicates - no DOM, no I/O.\n */\n\nimport { type SourceDescriptor, type SourceType } from \"../types/source.js\";\n\n/** Compare the descriptor fields that affect provider loading or media UI. */\nexport function areSourceDescriptorsEquivalent(\n previous: SourceDescriptor | null,\n next: SourceDescriptor | null,\n): boolean {\n if (previous === next) return true;\n if (!previous || !next) return false;\n\n const previousThumbnails = previous.thumbnails;\n const nextThumbnails = next.thumbnails;\n\n return (\n previous.src === next.src &&\n (previous.type || \"auto\") === (next.type || \"auto\") &&\n previous.withCredentials === next.withCredentials &&\n previous.tracks === next.tracks &&\n (previousThumbnails === nextThumbnails ||\n (previousThumbnails?.src === nextThumbnails?.src &&\n previousThumbnails?.withCredentials === nextThumbnails?.withCredentials))\n );\n}\n\n/** Whether a media/resource URL is safe to hand to browser media APIs. */\nexport function isSafeMediaUrl(input: string | undefined | null): boolean {\n if (!input?.trim()) return false;\n try {\n return /^(https?|blob|data):$/.test(new URL(input, \"https://reel.invalid\").protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Heuristic for HLS m3u8 URLs.\n *\n * Accepts:\n * - `*.m3u8` (case-insensitive) at any path/query position\n * - `application/vnd.apple.mpegurl` MIME hints inside `?type=`\n *\n * Rejects:\n * - YouTube-hosted m3u8 (handled by the YouTube provider).\n * - Empty / non-string inputs.\n */\nexport function looksLikeHls(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n if (lower.includes(\"youtube.com\") || lower.includes(\"youtu.be\")) return false;\n if (lower.includes(\".m3u8\")) return true;\n if (lower.includes(\"application/vnd.apple.mpegurl\")) return true;\n return false;\n}\n\n/**\n * YouTube URL recognition. Matches `youtube.com/watch?v=`, `youtu.be/<id>`,\n * `youtube.com/embed/<id>`, and `youtube.com/shorts/<id>`.\n */\nexport function looksLikeYouTube(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n return lower.includes(\"youtube.com\") || lower.includes(\"youtu.be\");\n}\n\n/**\n * MP4 / WebM / Ogg recognition by extension or `blob:` / `data:` schemes.\n */\nexport function looksLikeProgressive(input: string | undefined | null): boolean {\n if (!input) return false;\n const lower = input.toLowerCase();\n if (lower.startsWith(\"blob:\") || lower.startsWith(\"data:\")) return true;\n return /\\.(mp4|m4v|webm|ogv)(\\?|#|$)/.test(lower);\n}\n\n/**\n * Resolve the effective `SourceType` for a descriptor.\n *\n * Honors an explicit non-`auto` type. For `auto`, dispatch by URL: HLS first,\n * then YouTube, then progressive, falling back to `native` (which dispatches\n * to the always-on native loader).\n */\nexport function detectSourceType(source: SourceDescriptor): SourceType {\n if (source.type && source.type !== \"auto\") return source.type;\n if (looksLikeHls(source.src)) return \"hls\";\n if (looksLikeYouTube(source.src)) return \"youtube\";\n if (looksLikeProgressive(source.src)) return \"mp4\";\n return \"native\";\n}\n\n/**\n * Resolve a `withCredentials` policy against a concrete URL. `boolean` wins\n * outright; functions are called once per URL and SHOULD NOT throw.\n */\nexport function resolveWithCredentials(\n policy: SourceDescriptor[\"withCredentials\"],\n url: string,\n): boolean {\n if (typeof policy === \"boolean\") return policy;\n if (typeof policy === \"function\") {\n try {\n return policy(url);\n } catch {\n return false;\n }\n }\n return false;\n}\n","/**\n * HLS source provider. Lazy-loads `hls.js` on first attach.\n *\n * Golden cases:\n * - G1 / G2: HLS playback with `playsInline` on iOS WebKit.\n * - G7: HLS quality menu (variant levels).\n * - G13: 401/403 surfacing via `xhrSetup` + readystatechange hook.\n * - G14: forces hls.js even on Safari iOS so the manifest goes through xhrSetup.\n */\n\nimport { type PlayerErrorCode } from \"../types/error.js\";\nimport {\n type QualityLevel,\n type SourceDescriptor,\n type SourceLoader,\n type SourceProvider,\n} from \"../types/source.js\";\nimport { detectSourceType, looksLikeHls, resolveWithCredentials } from \"../util/url.js\";\n\n/**\n * Subset of the `hls.js` runtime surface we touch. Defining it here lets\n * tests inject a mock without depending on the actual `hls.js` package\n * being installed.\n */\nexport interface HlsRuntime {\n isSupported: () => boolean;\n Events: {\n MANIFEST_PARSED: string;\n LEVEL_SWITCHED: string;\n FRAG_LOADING: string;\n FRAG_BUFFERED: string;\n ERROR: string;\n };\n ErrorTypes: { NETWORK_ERROR: string; MEDIA_ERROR: string };\n /** Constructor signature is on the default export when imported as a module. */\n new (config?: HlsConfig): HlsInstance;\n}\n\n/** Minimal config shape we set on the HLS instance. */\nexport interface HlsConfig {\n xhrSetup?: (xhr: XMLHttpRequest, url: string) => void;\n enableWorker?: boolean;\n startPosition?: number;\n capLevelToPlayerSize?: boolean;\n fragLoadPolicy?: HlsLoadPolicy;\n keyLoadPolicy?: HlsLoadPolicy;\n manifestLoadPolicy?: HlsLoadPolicy;\n playlistLoadPolicy?: HlsLoadPolicy;\n}\n\n/** Minimal instance shape we touch. */\nexport interface HlsInstance {\n loadSource(url: string): void;\n attachMedia(video: HTMLVideoElement): void;\n detachMedia(): void;\n destroy(): void;\n recoverMediaError?(): void;\n stopLoad?(): void;\n on(event: string, handler: (...args: unknown[]) => void): void;\n off(event: string, handler: (...args: unknown[]) => void): void;\n levels: HlsLevel[];\n currentLevel: number;\n}\n\ninterface HlsLevel {\n height?: number;\n bitrate?: number;\n name?: string;\n}\n\ninterface HlsLoadPolicy {\n default: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryPolicy;\n errorRetry: HlsRetryPolicy;\n };\n}\n\ninterface HlsRetryPolicy {\n maxNumRetry: number;\n retryDelayMs: number;\n maxRetryDelayMs: number;\n backoff: \"linear\" | \"exponential\";\n}\n\ninterface HlsFragment {\n url?: string;\n relurl?: string;\n sn?: number | string;\n level?: number;\n type?: string;\n cc?: number;\n start?: number;\n startPTS?: number;\n}\n\ninterface HlsErrorData {\n type?: string;\n details?: string;\n fatal?: boolean;\n response?: { code?: number; url?: string };\n url?: string;\n frag?: HlsFragment;\n reason?: string;\n}\n\nconst REPEATED_FRAGMENT_LOAD_LIMIT = 4;\nconst MEDIA_RECOVERY_LIMIT = 1;\n\nfunction makeLoadPolicy(options: {\n maxTimeToFirstByteMs: number;\n maxLoadTimeMs: number;\n timeoutRetry: HlsRetryPolicy;\n errorRetry: HlsRetryPolicy;\n}): HlsLoadPolicy {\n return {\n default: {\n maxTimeToFirstByteMs: options.maxTimeToFirstByteMs,\n maxLoadTimeMs: options.maxLoadTimeMs,\n timeoutRetry: options.timeoutRetry,\n errorRetry: options.errorRetry,\n },\n };\n}\n\nfunction makeLinearRetry(\n maxNumRetry: number,\n retryDelayMs: number,\n maxRetryDelayMs: number,\n): HlsRetryPolicy {\n return {\n maxNumRetry,\n retryDelayMs,\n maxRetryDelayMs,\n backoff: \"linear\",\n };\n}\n\nfunction makeHlsLoadPolicies(): Pick<\n HlsConfig,\n \"fragLoadPolicy\" | \"keyLoadPolicy\" | \"manifestLoadPolicy\" | \"playlistLoadPolicy\"\n> {\n return {\n manifestLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(1, 1_000, 8_000),\n }),\n playlistLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(2, 1_000, 8_000),\n }),\n keyLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 8_000,\n maxLoadTimeMs: 20_000,\n timeoutRetry: makeLinearRetry(1, 1_000, 8_000),\n errorRetry: makeLinearRetry(2, 1_000, 8_000),\n }),\n fragLoadPolicy: makeLoadPolicy({\n maxTimeToFirstByteMs: 10_000,\n maxLoadTimeMs: 30_000,\n timeoutRetry: makeLinearRetry(1, 0, 0),\n errorRetry: makeLinearRetry(2, 1_000, 4_000),\n }),\n };\n}\n\n/** Options handed to `createHlsProvider`. */\nexport interface HlsProviderOptions {\n /**\n * Override the dynamic loader. Default: `() => import(\"hls.js\").then(m => m.default)`.\n * Tests inject a mock; consumers can swap to a self-hosted SDK.\n */\n loadRuntime?: () => Promise<HlsRuntime>;\n /** Surface 401/403 to the core. */\n onUnauthorized?: (event: { url: string; status: 401 | 403; source: SourceDescriptor }) => void;\n /** Notify the core when the level list changes. */\n onQualities?: (qualities: QualityLevel[]) => void;\n /** Notify the core when the active level changes. */\n onActiveQuality?: (quality: QualityLevel | null, auto: boolean) => void;\n /** Surface a load error to the core. */\n onError?: (error: {\n code?: PlayerErrorCode;\n message: string;\n cause?: unknown;\n status?: number;\n url?: string;\n retryable?: boolean;\n }) => void;\n /** Spinner / overlay: `true` when a user-driven rendition change is in-flight. */\n onQualitySwitch?: (active: boolean) => void;\n /**\n * Reject the manifest-load Promise if `MANIFEST_PARSED` does not fire within\n * this many milliseconds. Defaults to 30000 (30s). Set to `0` to disable.\n *\n * Without a timeout, a stalled or non-fatal HLS error can leave the player\n * stuck in `loading` forever (A2 in the 2026-05-12 review).\n */\n manifestTimeoutMs?: number;\n /**\n * Let automatic quality selection stop at the smallest rendition whose width\n * or height reaches the player's larger on-screen side times devicePixelRatio\n * (hls.js `capLevelToPlayerSize`). Defaults to `true`: without it hls.js picks\n * the highest rendition the network allows, so a learner with a small player\n * on a modest PC is moved to 1440p within a second and pays decoding and\n * bandwidth for pixels they cannot see. A rendition chosen by hand from the\n * quality menu is never capped. `createHlsProvider` is internal to this\n * package, so this option is only reachable from code and tests in it.\n */\n capLevelToPlayerSize?: boolean;\n}\n\n// Dynamic import of hls.js. Using a regular import() (not `new Function`) so\n// that webpack/CRA can discover and bundle hls.js as a lazy chunk at compile\n// time. The `new Function` trick intentionally escapes static-analysis passes\n// (Vite, esbuild, Rollup) but breaks webpack because webpack cannot see the\n// specifier inside the function string and therefore never emits a chunk -\n// the browser's native import(\"hls.js\") fails with \"Failed to resolve module\n// specifier\". Tests still inject a mock via `loadRuntime`.\n\n/* c8 ignore start - only exercised in real browsers; tests inject `loadRuntime`. */\nconst defaultLoad = (): Promise<HlsRuntime> => {\n return import(\"hls.js\").then((m) => (m as unknown as { default: HlsRuntime }).default);\n};\n/* c8 ignore stop */\n\n/**\n * Construct an AbortError-shaped Error so callers can branch on `name` like\n * the standard Fetch API. We don't depend on DOMException because Node.js\n * unit tests run without it.\n */\nfunction makeAbortError(): Error {\n const err = new Error(\"HLS loader aborted\");\n err.name = \"AbortError\";\n return err;\n}\n\nclass HlsLoader implements SourceLoader {\n private hls: HlsInstance | null = null;\n private video: HTMLVideoElement | null = null;\n private detachListeners: Array<() => void> = [];\n private qualities: QualityLevel[] = [];\n private currentSource: SourceDescriptor | null = null;\n private unauthorizedFired = false;\n // Track every XHR that hls.js spawns so we can abort and remove their\n // readystatechange watcher on `abort()` / `detach()`. Without this set the\n // watcher closure leaks for every media segment (A1 in the review).\n private liveXhrs: Set<XMLHttpRequest> = new Set();\n private rejectAttach: ((err: Error) => void) | null = null;\n private manifestTimeout: ReturnType<typeof setTimeout> | null = null;\n private aborted = false;\n /**\n * Bumped by every abort/detach. `detach()` clears `aborted` so the loader can be reused, so a\n * source switch (abort, then detach) used to let an attach that was still awaiting the runtime\n * carry on and bind a stale hls.js instance to the <video>. Each attach keeps its own value.\n */\n private generation = 0;\n private lastLoadingFragmentKey: string | null = null;\n private repeatedFragmentLoadCount = 0;\n private repeatedFragmentErrorFired = false;\n private mediaRecoveryCount = 0;\n\n /** `false` idle; `'auto'` → first `LEVEL_SWITCHED` clears; otherwise await this level index. */\n private qualityAwait: false | \"auto\" | number = false;\n private qualitySwitchTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Tracks consecutive menu selections so redundant \"Auto → Auto\" skips the spinner. */\n private lastChosenQualityWasAuto = false;\n\n /**\n * `null` - user chose ABR auto (menu shows \"Auto\"). Real hls.js still exposes\n * `currentLevel >= 0` for the playing rendition; we must not mirror that into UI state.\n */\n private manualLevelIndex: number | null = null;\n\n constructor(private readonly options: HlsProviderOptions) {}\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.aborted = false;\n const generation = this.generation;\n this.video = video;\n this.currentSource = source;\n this.unauthorizedFired = false;\n\n const Hls = await (this.options.loadRuntime ?? defaultLoad)();\n if (this.aborted || generation !== this.generation) {\n throw makeAbortError();\n }\n\n if (!Hls.isSupported()) {\n return this.attachNative(video, source);\n }\n\n return this.attachWithHlsJs(Hls, video, source);\n }\n\n /**\n * Native-HLS branch (Safari iOS / desktop without MSE). Listeners are\n * pushed into `detachListeners` so that an early `detach()` / `abort()`\n * cleans them up instead of leaking (C3 in the review).\n */\n private attachNative(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n run();\n };\n const onMeta = (): void => settle(() => resolve());\n const onError = (): void => settle(() => reject(new Error(\"Native HLS playback failed\")));\n video.addEventListener(\"loadedmetadata\", onMeta);\n video.addEventListener(\"error\", onError);\n this.detachListeners.push(\n () => video.removeEventListener(\"loadedmetadata\", onMeta),\n () => video.removeEventListener(\"error\", onError),\n () =>\n settle(() => {\n // If `detach()` runs before either event fires, reject so callers\n // (createPlayer) can stop waiting on the stale Promise.\n reject(makeAbortError());\n }),\n );\n try {\n video.src = source.src;\n video.load();\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n private attachWithHlsJs(\n Hls: HlsRuntime,\n video: HTMLVideoElement,\n source: SourceDescriptor,\n ): Promise<void> {\n const hls = new Hls({\n enableWorker: true,\n capLevelToPlayerSize: this.options.capLevelToPlayerSize ?? true,\n ...makeHlsLoadPolicies(),\n xhrSetup: (xhr, url) => this.installXhrWatcher(xhr, url, source),\n });\n this.hls = hls;\n\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n this.clearManifestTimeout();\n run();\n };\n\n const onParsed = (): void => {\n this.refreshQualities();\n settle(() => resolve());\n };\n const onSwitched = (...args: unknown[]): void => {\n this.onLevelEventuallyStabilized(...args);\n this.refreshActiveQuality();\n };\n const onFragmentLoading = (...args: unknown[]): void => {\n this.onFragmentLoading(...args);\n };\n const onFragmentBuffered = (...args: unknown[]): void => {\n this.resetFragmentLoopGuardFromEvent(...args);\n };\n const onError = (..._args: unknown[]): void => {\n const data = this.getHlsEventData(_args);\n const status = data.response?.code;\n if (this.tryRecoverMediaError(Hls, data)) {\n return;\n }\n // 4xx/5xx surface as an error even if hls.js classifies them as\n // non-fatal - the player would otherwise sit in `loading` waiting\n // for a manifest that will never parse (A2).\n const isHttpError = typeof status === \"number\" && status >= 400;\n const isTerminalHlsError = this.isTerminalHlsError(data);\n if (data.fatal || isHttpError || isTerminalHlsError) {\n const message = this.formatHlsErrorMessage(data, status);\n this.stopHlsLoading();\n this.options.onError?.({\n code: this.getHlsErrorCode(data, status),\n message,\n cause: data,\n status,\n url: this.getErrorUrl(data),\n retryable: this.isRetryableHlsError(data, status),\n });\n settle(() => reject(new Error(message)));\n }\n };\n\n hls.on(Hls.Events.MANIFEST_PARSED, onParsed);\n hls.on(Hls.Events.LEVEL_SWITCHED, onSwitched);\n hls.on(Hls.Events.FRAG_LOADING, onFragmentLoading);\n hls.on(Hls.Events.FRAG_BUFFERED, onFragmentBuffered);\n hls.on(Hls.Events.ERROR, onError);\n\n this.detachListeners.push(\n () => hls.off(Hls.Events.MANIFEST_PARSED, onParsed),\n () => hls.off(Hls.Events.LEVEL_SWITCHED, onSwitched),\n () => hls.off(Hls.Events.FRAG_LOADING, onFragmentLoading),\n () => hls.off(Hls.Events.FRAG_BUFFERED, onFragmentBuffered),\n () => hls.off(Hls.Events.ERROR, onError),\n () => settle(() => reject(makeAbortError())),\n );\n\n const timeoutMs = this.options.manifestTimeoutMs ?? 30_000;\n if (timeoutMs > 0) {\n this.manifestTimeout = setTimeout(() => {\n const message = `HLS manifest timeout after ${timeoutMs}ms`;\n this.stopHlsLoading();\n this.options.onError?.({ message, cause: { type: \"timeout\" }, url: source.src });\n settle(() => reject(new Error(message)));\n }, timeoutMs);\n }\n\n try {\n hls.loadSource(source.src);\n hls.attachMedia(video);\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n /**\n * Wire the readystatechange watcher and remove it as soon as the XHR\n * completes - without this cleanup hls.js (which spawns one XHR per segment)\n * leaks a closure per request (A1).\n */\n private installXhrWatcher(xhr: XMLHttpRequest, url: string, source: SourceDescriptor): void {\n if (resolveWithCredentials(source.withCredentials, url)) {\n xhr.withCredentials = true;\n }\n this.liveXhrs.add(xhr);\n const watcher = (): void => {\n if (xhr.readyState !== 4) return;\n try {\n if ((xhr.status === 401 || xhr.status === 403) && !this.unauthorizedFired) {\n this.unauthorizedFired = true;\n this.options.onUnauthorized?.({\n url,\n status: xhr.status as 401 | 403,\n source,\n });\n }\n } finally {\n xhr.removeEventListener(\"readystatechange\", watcher);\n this.liveXhrs.delete(xhr);\n }\n };\n xhr.addEventListener(\"readystatechange\", watcher);\n }\n\n private getHlsEventData(args: unknown[]): HlsErrorData {\n const data = args[1] ?? args[0];\n return data !== null && typeof data === \"object\" ? (data as HlsErrorData) : {};\n }\n\n private getFragmentUrl(data: HlsErrorData): string | undefined {\n return data.frag?.url ?? data.frag?.relurl ?? data.response?.url ?? data.url;\n }\n\n private getErrorUrl(data: HlsErrorData): string | undefined {\n return this.getFragmentUrl(data) ?? this.currentSource?.src;\n }\n\n private getFragmentKey(data: HlsErrorData): string | null {\n const url = this.getFragmentUrl(data);\n const frag = data.frag;\n if (!frag) return url ?? null;\n const type = frag.type ?? \"main\";\n const level = frag.level ?? \"unknown-level\";\n const sn = frag.sn ?? \"unknown-sn\";\n const cc = frag.cc ?? \"unknown-cc\";\n const start = frag.start ?? frag.startPTS ?? \"unknown-start\";\n return `${url ?? \"unknown-url\"}:${type}:${level}:${sn}:${cc}:${start}`;\n }\n\n private isTerminalHlsError(data: HlsErrorData): boolean {\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelEmptyError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n case \"keyLoadError\":\n case \"keyLoadTimeOut\":\n case \"bufferFullError\":\n return true;\n default:\n return false;\n }\n }\n\n private formatHlsErrorMessage(data: HlsErrorData, status: number | undefined): string {\n if (data.fatal) {\n const type = data.type ?? \"unknown\";\n const details = data.details ? ` (${data.details})` : \"\";\n return `HLS fatal error: ${type}${details}`;\n }\n if (typeof status === \"number\" && status >= 400) {\n return `HLS load error: HTTP ${status}${data.details ? ` (${data.details})` : \"\"}`;\n }\n const type = data.type ?? \"unknown\";\n const details = data.details ? ` (${data.details})` : \"\";\n return `HLS error: ${type}${details}`;\n }\n\n private getHlsErrorCode(data: HlsErrorData, status: number | undefined): PlayerErrorCode {\n if (status === 401 || status === 403) return \"unauthorized\";\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n return \"decode\";\n default:\n return \"network\";\n }\n }\n\n private isRetryableHlsError(data: HlsErrorData, status: number | undefined): boolean {\n if (status === 401 || status === 403) return false;\n if (typeof status === \"number\" && status >= 400 && status < 500) return false;\n switch (data.details) {\n case \"manifestParsingError\":\n case \"manifestIncompatibleCodecsError\":\n case \"levelParsingError\":\n case \"fragParsingError\":\n case \"fragDecryptError\":\n return false;\n default:\n return true;\n }\n }\n\n private isRecoverableMediaError(Hls: HlsRuntime, data: HlsErrorData): boolean {\n if (data.type !== Hls.ErrorTypes.MEDIA_ERROR && data.type !== \"mediaError\") {\n return false;\n }\n if (!data.fatal) return false;\n if (this.mediaRecoveryCount >= MEDIA_RECOVERY_LIMIT) return false;\n if (typeof this.hls?.recoverMediaError !== \"function\") return false;\n\n switch (data.details) {\n case undefined:\n case \"bufferAppendError\":\n case \"bufferAppendingError\":\n case \"bufferStalledError\":\n case \"bufferSeekOverHole\":\n case \"bufferNudgeOnStall\":\n case \"bufferFullError\":\n return true;\n default:\n return false;\n }\n }\n\n private tryRecoverMediaError(Hls: HlsRuntime, data: HlsErrorData): boolean {\n if (!this.isRecoverableMediaError(Hls, data)) return false;\n this.mediaRecoveryCount += 1;\n this.resetFragmentLoopGuard();\n this.completeQualityAwaitIfBusy();\n try {\n this.hls?.recoverMediaError?.();\n return true;\n } catch {\n return false;\n }\n }\n\n private onFragmentLoading(...args: unknown[]): void {\n if (this.repeatedFragmentErrorFired) return;\n const data = this.getHlsEventData(args);\n const key = this.getFragmentKey(data);\n if (!key) return;\n\n if (key === this.lastLoadingFragmentKey) {\n this.repeatedFragmentLoadCount += 1;\n } else {\n this.lastLoadingFragmentKey = key;\n this.repeatedFragmentLoadCount = 1;\n }\n\n if (this.repeatedFragmentLoadCount < REPEATED_FRAGMENT_LOAD_LIMIT) return;\n\n this.repeatedFragmentErrorFired = true;\n this.stopHlsLoading();\n const url = this.getFragmentUrl(data);\n this.options.onError?.({\n code: \"hls-fragment-loop\",\n message: `HLS fragment repeatedly loading: ${url ?? key}`,\n cause: data,\n url,\n });\n }\n\n private resetFragmentLoopGuardFromEvent(...args: unknown[]): void {\n const data = this.getHlsEventData(args);\n if (this.getFragmentKey(data)) {\n this.resetFragmentLoopGuard();\n }\n }\n\n private resetFragmentLoopGuard(): void {\n this.lastLoadingFragmentKey = null;\n this.repeatedFragmentLoadCount = 0;\n this.repeatedFragmentErrorFired = false;\n }\n\n private abortLiveXhrs(): void {\n for (const xhr of [...this.liveXhrs]) {\n try {\n xhr.abort();\n } catch {\n // ignore\n }\n }\n this.liveXhrs.clear();\n }\n\n private stopHlsLoading(): void {\n this.completeQualityAwaitIfBusy();\n try {\n this.hls?.stopLoad?.();\n } catch {\n // ignore\n }\n this.abortLiveXhrs();\n }\n\n abort(): void {\n this.generation += 1;\n if (this.aborted) return;\n this.aborted = true;\n this.clearManifestTimeout();\n // Cancel every in-flight XHR. The watcher's `readystatechange` fires\n // synchronously on `abort()` with `readyState === 4`, which removes it\n // from `liveXhrs` for us; but be defensive.\n this.abortLiveXhrs();\n // Reject the pending attach Promise (if any) so callers stop waiting.\n const reject = this.rejectAttach;\n this.rejectAttach = null;\n reject?.(makeAbortError());\n }\n\n detach(): void {\n this.completeQualityAwaitIfBusy();\n // `abort()` first so the in-flight Promise is rejected before we tear\n // down the underlying engine.\n this.abort();\n while (this.detachListeners.length) {\n try {\n this.detachListeners.pop()?.();\n } catch {\n // ignore\n }\n }\n if (this.hls) {\n try {\n this.hls.detachMedia();\n this.hls.destroy();\n } catch {\n // ignore\n }\n this.hls = null;\n }\n if (this.video) {\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch {\n // ignore\n }\n this.video = null;\n }\n this.qualities = [];\n this.currentSource = null;\n this.unauthorizedFired = false;\n this.aborted = false; // reset so the loader can be reused\n this.lastChosenQualityWasAuto = false;\n this.manualLevelIndex = null;\n this.mediaRecoveryCount = 0;\n this.resetFragmentLoopGuard();\n }\n\n private clearQualitySwitchTimerOnly(): void {\n if (this.qualitySwitchTimer !== null) {\n clearTimeout(this.qualitySwitchTimer);\n this.qualitySwitchTimer = null;\n }\n }\n\n private armQualitySwitchTimeout(): void {\n this.clearQualitySwitchTimerOnly();\n this.qualitySwitchTimer = setTimeout(() => {\n this.qualitySwitchTimer = null;\n if (this.qualityAwait !== false) {\n this.completeQualityAwaitIfBusy();\n }\n }, 12_000);\n }\n\n /** Start or refresh awaited UI for a rendition change (rapid toggles reuse one spinner). */\n private armQualityAwait(kind: Exclude<typeof this.qualityAwait, false>): void {\n const wasIdle = this.qualityAwait === false;\n this.qualityAwait = kind;\n if (wasIdle) this.options.onQualitySwitch?.(true);\n this.armQualitySwitchTimeout();\n }\n\n private resolveQualityAwaitIfDone(levelIdxHint: number): void {\n const awaiting = this.qualityAwait;\n if (awaiting === false) return;\n\n // Prefer the engine's authoritative index: real hls.js payloads / listener arity\n // can differ from mocks, and strict `event.level === awaiting` left the spinner\n // armed until the 12s watchdog even when `currentLevel` had already settled.\n const engineLevel =\n this.hls !== null && typeof this.hls.currentLevel === \"number\"\n ? this.hls.currentLevel\n : levelIdxHint;\n\n const done = awaiting === \"auto\" || (typeof awaiting === \"number\" && awaiting === engineLevel);\n\n if (done) this.completeQualityAwaitIfBusy();\n }\n\n private onLevelEventuallyStabilized(...args: unknown[]): void {\n let levelIdx: number | undefined;\n for (let i = args.length - 1; i >= 0; i--) {\n const a = args[i];\n if (\n a !== null &&\n typeof a === \"object\" &&\n typeof (a as { level?: unknown }).level === \"number\"\n ) {\n levelIdx = (a as { level: number }).level;\n break;\n }\n }\n if (levelIdx === undefined) levelIdx = this.hls?.currentLevel;\n if (typeof levelIdx === \"number\") this.resolveQualityAwaitIfDone(levelIdx);\n }\n\n private completeQualityAwaitIfBusy(): void {\n if (this.qualityAwait === false) return;\n this.qualityAwait = false;\n this.clearQualitySwitchTimerOnly();\n this.options.onQualitySwitch?.(false);\n }\n\n private clearManifestTimeout(): void {\n if (this.manifestTimeout !== null) {\n clearTimeout(this.manifestTimeout);\n this.manifestTimeout = null;\n }\n }\n\n getQualities(): QualityLevel[] {\n return this.qualities.slice();\n }\n\n setQuality(level: QualityLevel | \"auto\"): void {\n if (!this.hls) return;\n if (level === \"auto\") {\n this.manualLevelIndex = null;\n this.hls.currentLevel = -1;\n this.options.onActiveQuality?.(null, true);\n if (!this.lastChosenQualityWasAuto) {\n this.armQualityAwait(\"auto\");\n }\n this.lastChosenQualityWasAuto = true;\n queueMicrotask(() => {\n this.completeQualityAwaitIfBusy();\n });\n return;\n }\n let idx = this.qualities.findIndex((q) => q.id === level.id);\n if (idx < 0 && typeof level.height === \"number\" && level.height > 0) {\n const byHeight = this.qualities.findIndex((q) => q.height === level.height);\n if (byHeight >= 0) {\n idx = byHeight;\n }\n }\n if (idx < 0) {\n return;\n }\n const resolved = this.qualities[idx];\n if (!resolved) return;\n this.manualLevelIndex = idx;\n this.lastChosenQualityWasAuto = false;\n if (this.hls.currentLevel === idx) {\n this.options.onActiveQuality?.(resolved, false);\n return;\n }\n // Initial preference/application runs while HLS is still on auto (-1). Arming the overlay\n // spinner here duplicates “startup buffering”; LEVEL_SWITCHED will sync visuals anyway.\n if (this.hls.currentLevel !== -1) {\n this.armQualityAwait(idx);\n }\n this.hls.currentLevel = idx;\n this.options.onActiveQuality?.(resolved, false);\n queueMicrotask(() => {\n if (!this.hls) return;\n this.resolveQualityAwaitIfDone(this.hls.currentLevel);\n });\n }\n\n private refreshQualities(): void {\n if (!this.hls) return;\n const next: QualityLevel[] = this.hls.levels.map((lvl, i) => ({\n id: String(i),\n height: lvl.height ?? 0,\n bitrate: lvl.bitrate ?? 0,\n label: lvl.name ?? (lvl.height ? `${lvl.height}p` : `Level ${i + 1}`),\n }));\n this.qualities = next;\n this.options.onQualities?.(next);\n this.refreshActiveQuality();\n }\n\n private refreshActiveQuality(): void {\n if (!this.hls) return;\n if (this.manualLevelIndex === null) {\n this.options.onActiveQuality?.(null, true);\n return;\n }\n const locked = this.qualities[this.manualLevelIndex] ?? null;\n this.options.onActiveQuality?.(locked, false);\n }\n\n /** @internal - for tests. */\n _getInternalState(): { source: SourceDescriptor | null; qualities: QualityLevel[] } {\n return { source: this.currentSource, qualities: this.qualities };\n }\n}\n\n/**\n * Build the HLS source provider with bound core callbacks.\n */\nexport function createHlsProvider(options: HlsProviderOptions = {}): SourceProvider {\n return {\n name: \"hls\",\n canHandle: (source) => {\n if (source.type === \"hls\") return true;\n const type = detectSourceType(source);\n return type === \"hls\" || (type === \"auto\" && looksLikeHls(source.src));\n },\n createLoader: () => new HlsLoader(options),\n };\n}\n","/**\n * Always-on native loader. Handles MP4, WebM, blob, data URLs, and acts as a\n * `\"maybe\"` fallback for unknown URLs.\n *\n * Golden cases: G3 (public video, native MP4), G5 (story composer blob),\n * G6 (landing hero), G10 (media manager modal).\n */\n\nimport { type SourceDescriptor, type SourceLoader, type SourceProvider } from \"../types/source.js\";\nimport { detectSourceType } from \"../util/url.js\";\n\nclass NativeLoader implements SourceLoader {\n private video: HTMLVideoElement | null = null;\n private cleanups: Array<() => void> = [];\n private rejectPending: ((reason: unknown) => void) | null = null;\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.video = video;\n return new Promise<void>((resolve, reject) => {\n const onMeta = (): void => {\n cleanupListeners();\n this.rejectPending = null;\n resolve();\n };\n const onError = (): void => {\n cleanupListeners();\n const err = video.error;\n const message = err\n ? `MediaError code=${err.code} message=${err.message}`\n : \"Native loader failed\";\n this.rejectPending = null;\n reject(new Error(message));\n };\n const cleanupListeners = (): void => {\n video.removeEventListener(\"loadedmetadata\", onMeta);\n video.removeEventListener(\"error\", onError);\n };\n\n video.addEventListener(\"loadedmetadata\", onMeta);\n video.addEventListener(\"error\", onError);\n this.cleanups.push(cleanupListeners);\n this.rejectPending = reject;\n\n video.src = source.src;\n // `load()` forces the browser to start fetching even if the src didn't\n // visibly change (helps with `blob:` reuse and same-URL retries).\n video.load();\n });\n }\n\n abort(): void {\n const reject = this.rejectPending;\n this.rejectPending = null;\n while (this.cleanups.length) {\n try {\n this.cleanups.pop()?.();\n } catch {\n // ignore\n }\n }\n if (reject) {\n const error = new Error(\"Native source load aborted\");\n error.name = \"AbortError\";\n reject(error);\n }\n }\n\n detach(): void {\n this.abort();\n if (this.video) {\n // Removing the src lets the browser free the underlying resource.\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch {\n // ignore\n }\n this.video = null;\n }\n }\n}\n\n/** Native source provider. Always available, registered by `createPlayer`. */\nexport const nativeProvider: SourceProvider = {\n name: \"native\",\n canHandle: (source) => {\n if (source.type === \"native\") return true;\n if (source.type === \"mp4\") return true;\n // Explicit non-native types (`dash`, `hls`, `youtube`, ...) must be\n // handled by their dedicated provider; surfacing as a loadFailed when\n // no provider matches is more useful than silently degrading.\n if (source.type && source.type !== \"auto\") return false;\n const type = detectSourceType(source);\n if (type === \"mp4\") return true;\n if (type === \"hls\" || type === \"youtube\") return false;\n // Unknown URL with auto/no type - let dedicated providers win first;\n // if none match, the registry falls back to this `\"maybe\"`.\n return \"maybe\";\n },\n createLoader: () => new NativeLoader(),\n};\n","/**\n * Source registry.\n *\n * Providers register themselves once. On `resolve(source)`, the registry\n * picks the first provider whose `canHandle` returns `true`, falling back to\n * the first `\"maybe\"` (the native loader uses `\"maybe\"` so it can absorb any\n * source without claiming it).\n */\n\nimport { type SourceDescriptor, type SourceProvider } from \"../types/source.js\";\n\nexport interface SourceRegistry {\n register(provider: SourceProvider): () => void;\n unregister(name: string): void;\n resolve(source: SourceDescriptor): SourceProvider | null;\n /** Snapshot list of registered providers. Useful for tests. */\n list(): readonly SourceProvider[];\n clear(): void;\n}\n\nexport function createSourceRegistry(): SourceRegistry {\n const providers: SourceProvider[] = [];\n\n function register(provider: SourceProvider): () => void {\n if (providers.some((p) => p.name === provider.name)) {\n throw new Error(\n `[@f8team/reel-core] source provider \"${provider.name}\" is already registered`,\n );\n }\n providers.push(provider);\n return () => unregister(provider.name);\n }\n\n function unregister(name: string): void {\n const idx = providers.findIndex((p) => p.name === name);\n if (idx >= 0) providers.splice(idx, 1);\n }\n\n function resolve(source: SourceDescriptor): SourceProvider | null {\n let fallback: SourceProvider | null = null;\n for (const p of providers) {\n const verdict = p.canHandle(source);\n if (verdict === true) return p;\n if (verdict === \"maybe\" && !fallback) fallback = p;\n }\n return fallback;\n }\n\n function list(): readonly SourceProvider[] {\n return providers.slice();\n }\n\n function clear(): void {\n providers.length = 0;\n }\n\n return { register, unregister, resolve, list, clear };\n}\n","/**\n * YouTube source provider. Lazy-loads the IFrame Player API and bridges the\n * core `play / pause / seekTo / time` to a YT.Player instance hosted in an\n * off-DOM iframe parented to the player container.\n *\n * Golden case: G11 (admin upload preview).\n */\n\nimport { type SourceDescriptor, type SourceLoader, type SourceProvider } from \"../types/source.js\";\nimport { detectSourceType, looksLikeYouTube } from \"../util/url.js\";\n\n/** Minimal subset of the YT.Player API we touch. */\nexport interface YouTubePlayerInstance {\n playVideo(): void;\n pauseVideo(): void;\n seekTo(seconds: number, allowSeekAhead?: boolean): void;\n getCurrentTime(): number;\n getDuration(): number;\n getPlayerState(): number;\n destroy(): void;\n}\n\n/** Subset of YT.Player constructor we touch. */\nexport type YouTubePlayerCtor = new (\n el: HTMLElement,\n options: {\n videoId?: string;\n width?: string | number;\n height?: string | number;\n playerVars?: Record<string, unknown>;\n events?: {\n onReady?: (event: { target: YouTubePlayerInstance }) => void;\n onStateChange?: (event: { data: number; target: YouTubePlayerInstance }) => void;\n onError?: (event: { data: number; target: YouTubePlayerInstance }) => void;\n };\n },\n) => YouTubePlayerInstance;\n\nexport interface YouTubeRuntime {\n Player: YouTubePlayerCtor;\n PlayerState: { ENDED: number; PLAYING: number; PAUSED: number; BUFFERING: number };\n}\n\nexport interface YouTubeProviderOptions {\n /** Override the runtime loader. Default: inject the YT IFrame API `<script>`. */\n loadRuntime?: () => Promise<YouTubeRuntime>;\n /** Surface state changes to the core. */\n onStateChange?: (state: \"playing\" | \"paused\" | \"ended\" | \"buffering\" | \"ready\") => void;\n /** Surface load errors to the core. */\n onError?: (error: { message: string; cause?: unknown }) => void;\n /**\n * Bridge YouTube's polled `getCurrentTime()` value back into the core\n * store / event bus. Without this callback, seek bars and time-aware\n * plugins (markers, resume-position, analytics) would never tick on\n * YouTube sources (A3 in the 2026-05-12 review).\n */\n onTimeUpdate?: (currentTime: number) => void;\n /**\n * Bridge YouTube's `getDuration()` once the player is ready. Fires once\n * per attach.\n */\n onDuration?: (duration: number) => void;\n /**\n * Polling interval for the time bridge in milliseconds. Defaults to 250.\n */\n timeBridgeIntervalMs?: number;\n}\n\nconst YT_SCRIPT_SRC = \"https://www.youtube.com/iframe_api\";\n\n/* c8 ignore start - only exercised in real browsers; tests inject `loadRuntime`. */\nconst defaultLoad = (): Promise<YouTubeRuntime> => {\n if (typeof window === \"undefined\") {\n return Promise.reject(new Error(\"YouTube source provider requires a browser environment\"));\n }\n type YT = { Player: YouTubePlayerCtor; PlayerState: YouTubeRuntime[\"PlayerState\"] };\n type Win = Window & {\n YT?: YT;\n onYouTubeIframeAPIReady?: () => void;\n };\n const w = window as Win;\n if (w.YT && typeof w.YT.Player === \"function\") return Promise.resolve(w.YT);\n return new Promise<YouTubeRuntime>((resolve, reject) => {\n const existing = document.querySelector<HTMLScriptElement>(`script[src=\"${YT_SCRIPT_SRC}\"]`);\n const onReady = (): void => {\n if (w.YT && typeof w.YT.Player === \"function\") resolve(w.YT);\n else reject(new Error(\"YouTube IFrame API loaded without YT.Player\"));\n };\n const previousReady = w.onYouTubeIframeAPIReady;\n w.onYouTubeIframeAPIReady = () => {\n previousReady?.();\n onReady();\n };\n if (!existing) {\n const script = document.createElement(\"script\");\n script.src = YT_SCRIPT_SRC;\n script.async = true;\n script.onerror = () => reject(new Error(\"Failed to load YouTube IFrame API\"));\n document.head.appendChild(script);\n }\n });\n};\n/* c8 ignore stop */\n\n/** Extract the `videoId` from any YouTube URL form. */\nexport function extractYouTubeId(url: string): string | null {\n const m =\n url.match(/[?&]v=([^&]+)/) ??\n url.match(/youtu\\.be\\/([^?&/]+)/) ??\n url.match(/youtube\\.com\\/embed\\/([^?&/]+)/) ??\n url.match(/youtube\\.com\\/shorts\\/([^?&/]+)/);\n return m?.[1] ?? null;\n}\n\n/**\n * Marker attribute applied to the underlying `<video>` element while the\n * YouTube iframe owns playback. CSS theme contracts hide the native element\n * via `[data-reel-yt-hidden] { visibility: hidden; }` (B6 - replaces\n * the inline-style mutation that fought host CSS).\n */\nconst YT_HIDDEN_ATTR = \"data-reel-yt-hidden\";\n\nlet staticParentWarned = false;\n\nclass YouTubeLoader implements SourceLoader {\n private yt: YouTubePlayerInstance | null = null;\n private video: HTMLVideoElement | null = null;\n private host: HTMLElement | null = null;\n private timeIntervalId: ReturnType<typeof setInterval> | null = null;\n private duration = 0;\n private rejectAttach: ((err: Error) => void) | null = null;\n private aborted = false;\n /**\n * Bumped by every abort/detach. `detach()` clears `aborted` so the loader can be reused, so a\n * source switch (abort, then detach) used to let an attach that was still awaiting the runtime\n * carry on and mount a second iframe. Each attach keeps the value it started with instead.\n */\n private generation = 0;\n\n constructor(private readonly options: YouTubeProviderOptions) {}\n\n async attach(video: HTMLVideoElement, source: SourceDescriptor): Promise<void> {\n this.detach();\n this.aborted = false;\n const generation = this.generation;\n const id = extractYouTubeId(source.src);\n if (!id) {\n throw new Error(`Cannot extract YouTube videoId from \"${source.src}\"`);\n }\n this.video = video;\n\n const YT = await (this.options.loadRuntime ?? defaultLoad)();\n if (this.aborted || generation !== this.generation) {\n throw makeYtAbortError();\n }\n\n const parent = video.parentElement;\n if (!parent) {\n throw new Error(\"YouTube source provider requires <video> to be attached to the DOM\");\n }\n\n // The YouTube iframe relies on `position: absolute; inset: 0` on the\n // host, which only works when an ancestor is a positioned offsetParent.\n // Warn (once per page) so consumers know to set `position: relative` on\n // the player container (B6 part 2).\n /* c8 ignore start - getComputedStyle is a no-op in jsdom for parents that aren't styled */\n if (typeof window !== \"undefined\" && !staticParentWarned) {\n try {\n const computed = window.getComputedStyle(parent).position;\n if (computed === \"static\") {\n staticParentWarned = true;\n console.warn(\n \"[@f8team/reel-core] YouTube source: <video>'s parent has `position: static`. \" +\n \"Set the player container to `position: relative` (or absolute/fixed) so \" +\n \"the YouTube iframe can fill the stage.\",\n );\n }\n } catch {\n // ignore - happens in non-browser test environments\n }\n }\n /* c8 ignore stop */\n\n const host = document.createElement(\"div\");\n host.setAttribute(\"data-reel-yt-host\", \"\");\n // The host must fill the stage absolutely so the YT iframe stretches to 100%.\n host.style.cssText = \"position:absolute;inset:0;overflow:hidden;background:#000\";\n const mount = document.createElement(\"div\");\n host.appendChild(mount);\n parent.appendChild(host);\n this.host = host;\n\n // Hide the underlying <video> via a data attribute instead of inline\n // style - host CSS owns the actual `visibility` rule. This avoids\n // fighting the host's CSS transitions / dark-mode overrides (B6).\n video.setAttribute(YT_HIDDEN_ATTR, \"\");\n\n return new Promise<void>((resolve, reject) => {\n this.rejectAttach = reject;\n let settled = false;\n const settle = (run: () => void): void => {\n if (settled) return;\n settled = true;\n run();\n };\n\n try {\n // The IFrame API replaces its mount node. Keep `host` as a stable\n // wrapper so sizing, ownership selectors, and cleanup remain valid.\n this.yt = new YT.Player(mount, {\n videoId: id,\n // 100% so the iframe fills the host div rather than using default px dimensions.\n width: \"100%\",\n height: \"100%\",\n playerVars: {\n playsinline: 1,\n modestbranding: 1,\n rel: 0,\n // enablejsapi is implicitly set by the IFrame API; explicit = good practice.\n enablejsapi: 1,\n },\n events: {\n onReady: () => {\n // Force the generated <iframe> to fill its parent regardless of\n // what YT.Player chose as its initial dimensions.\n const iframe = host.querySelector(\"iframe\");\n if (iframe) {\n iframe.style.cssText = \"width:100%;height:100%;border:none;display:block\";\n }\n try {\n this.duration = this.yt?.getDuration() ?? 0;\n if (this.duration > 0) {\n this.options.onDuration?.(this.duration);\n }\n } catch {\n // ignore\n }\n this.startTimeBridge();\n this.options.onStateChange?.(\"ready\");\n settle(() => resolve());\n },\n onStateChange: ({ data }) => {\n switch (data) {\n case YT.PlayerState.PLAYING:\n this.options.onStateChange?.(\"playing\");\n break;\n case YT.PlayerState.PAUSED:\n this.options.onStateChange?.(\"paused\");\n break;\n case YT.PlayerState.ENDED:\n this.options.onStateChange?.(\"ended\");\n break;\n case YT.PlayerState.BUFFERING:\n this.options.onStateChange?.(\"buffering\");\n break;\n default:\n break;\n }\n },\n onError: ({ data }) => {\n const err = { message: `YouTube error code=${data}`, cause: { code: data } };\n this.options.onError?.(err);\n settle(() => reject(new Error(err.message)));\n },\n },\n });\n } catch (err) {\n settle(() => reject(err instanceof Error ? err : new Error(String(err))));\n }\n });\n }\n\n abort(): void {\n this.generation += 1;\n if (this.aborted) return;\n this.aborted = true;\n const reject = this.rejectAttach;\n this.rejectAttach = null;\n reject?.(makeYtAbortError());\n }\n\n detach(): void {\n this.abort();\n if (this.timeIntervalId !== null) {\n clearInterval(this.timeIntervalId);\n this.timeIntervalId = null;\n }\n if (this.yt) {\n try {\n this.yt.destroy();\n } catch {\n // ignore\n }\n this.yt = null;\n }\n if (this.host && this.host.parentElement) {\n try {\n this.host.parentElement.removeChild(this.host);\n } catch {\n // ignore\n }\n }\n this.host = null;\n if (this.video) {\n this.video.removeAttribute(YT_HIDDEN_ATTR);\n this.video = null;\n }\n this.duration = 0;\n this.aborted = false;\n }\n\n private startTimeBridge(): void {\n if (this.timeIntervalId !== null) return;\n const interval = this.options.timeBridgeIntervalMs ?? 250;\n this.timeIntervalId = setInterval(() => {\n if (!this.yt) return;\n try {\n const currentTime = this.yt.getCurrentTime();\n this.options.onTimeUpdate?.(currentTime);\n // Cache duration in case it became known after onReady (rare but\n // possible for live YouTube streams).\n const duration = this.yt.getDuration();\n if (duration > 0 && duration !== this.duration) {\n this.duration = duration;\n this.options.onDuration?.(duration);\n }\n } catch {\n // ignore\n }\n }, interval);\n }\n\n /** @internal */\n _instance(): YouTubePlayerInstance | null {\n return this.yt;\n }\n}\n\nfunction makeYtAbortError(): Error {\n const err = new Error(\"YouTube loader aborted\");\n err.name = \"AbortError\";\n return err;\n}\n\n/**\n * Build the YouTube source provider with bound core callbacks.\n */\nexport function createYouTubeProvider(options: YouTubeProviderOptions = {}): SourceProvider {\n return {\n name: \"youtube\",\n canHandle: (source) => {\n if (source.type === \"youtube\") return true;\n const type = detectSourceType(source);\n return type === \"youtube\" || (type === \"auto\" && looksLikeYouTube(source.src));\n },\n createLoader: () => new YouTubeLoader(options),\n };\n}\n","/**\n * Pure player state machine. Inputs are `(status, event)` and the output is\n * `(next, effects)`. The orchestrator (`createPlayer`) applies the effects\n * against the underlying `<video>` and the typed event bus; the reducer\n * itself never touches the DOM.\n *\n * Transition diagram lives in `docs/spec/architecture.md`.\n */\n\nimport { type PlayerError } from \"../types/error.js\";\nimport { type SourceDescriptor } from \"../types/source.js\";\nimport { type PlayerStatus } from \"../types/state.js\";\n\n/** Inputs accepted by the reducer. */\nexport type MachineEvent =\n /** Caller asked to (re)load a source. `null` clears back to idle. */\n | { type: \"setSource\"; source: SourceDescriptor | null }\n /** The source loader signalled `loadedmetadata`. */\n | { type: \"loaded\" }\n /** Load failed (manifest 4xx/5xx, decode, unsupported). */\n | { type: \"loadFailed\"; error: PlayerError }\n /** Caller asked to play (or the native engine fired `play`). */\n | { type: \"play\" }\n /** Caller asked to pause (or the native engine fired `pause`). */\n | { type: \"pause\" }\n /** Native `ended`. */\n | { type: \"ended\" }\n /** Runtime failure during playback (network drop, decoder crash). */\n | { type: \"runtimeError\"; error: PlayerError }\n /** Caller asked to retry after `error`. */\n | { type: \"retry\" }\n /** Caller invoked `dispose`. Always wins. */\n | { type: \"dispose\" };\n\n/** Side-effects produced by transitions, applied by the orchestrator. */\nexport type MachineEffect =\n | { type: \"attachSource\"; source: SourceDescriptor }\n | { type: \"detachSource\" }\n | { type: \"mediaPlay\" }\n | { type: \"mediaPause\" }\n | { type: \"mediaSeek\"; seconds: number }\n | { type: \"clearError\" }\n | { type: \"setError\"; error: PlayerError };\n\n/** Reducer return shape. `effects` is always frozen for safety. */\nexport interface MachineResult {\n next: PlayerStatus;\n effects: readonly MachineEffect[];\n}\n\n/** Result with no transition and no effects. */\nconst STAY: Pick<MachineResult, \"effects\"> = { effects: Object.freeze([]) };\n\nconst noop = (status: PlayerStatus): MachineResult => ({ next: status, ...STAY });\n\n/**\n * Run one step of the state machine.\n *\n * Invalid transitions return the current state with no effects (the reducer\n * is a total function — never throws). The orchestrator can decide whether\n * to surface a warning.\n */\nexport function reduce(status: PlayerStatus, event: MachineEvent): MachineResult {\n // `dispose` always wins from any state and is idempotent on `idle`.\n if (event.type === \"dispose\") {\n if (status === \"idle\") return noop(\"idle\");\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n\n switch (status) {\n case \"idle\":\n if (event.type === \"setSource\") {\n if (event.source === null) return noop(\"idle\");\n return {\n next: \"loading\",\n effects: [{ type: \"clearError\" }, { type: \"attachSource\", source: event.source }],\n };\n }\n return noop(\"idle\");\n\n case \"loading\":\n switch (event.type) {\n case \"loaded\":\n return noop(\"ready\");\n case \"loadFailed\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"loading\");\n }\n\n case \"ready\":\n switch (event.type) {\n case \"play\":\n return { next: \"playing\", effects: [{ type: \"mediaPlay\" }] };\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"ready\");\n }\n\n case \"playing\":\n switch (event.type) {\n case \"pause\":\n return { next: \"paused\", effects: [{ type: \"mediaPause\" }] };\n case \"ended\":\n return noop(\"ended\");\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"playing\");\n }\n\n case \"paused\":\n switch (event.type) {\n case \"play\":\n return { next: \"playing\", effects: [{ type: \"mediaPlay\" }] };\n case \"ended\":\n return noop(\"ended\");\n case \"runtimeError\":\n return { next: \"error\", effects: [{ type: \"setError\", error: event.error }] };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"paused\");\n }\n\n case \"ended\":\n switch (event.type) {\n case \"play\":\n // Replay: seek to 0 then play.\n return {\n next: \"playing\",\n effects: [{ type: \"mediaSeek\", seconds: 0 }, { type: \"mediaPlay\" }],\n };\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"ended\");\n }\n\n case \"error\":\n switch (event.type) {\n case \"retry\": {\n // Retry only makes sense if we have a previously-attached source,\n // but the reducer is source-agnostic; the orchestrator passes a\n // fresh `setSource` after `retry`. We move to `loading` optimistically.\n return { next: \"loading\", effects: [{ type: \"clearError\" }] };\n }\n case \"setSource\":\n if (event.source === null) {\n return { next: \"idle\", effects: [{ type: \"detachSource\" }] };\n }\n return {\n next: \"loading\",\n effects: [\n { type: \"detachSource\" },\n { type: \"clearError\" },\n { type: \"attachSource\", source: event.source },\n ],\n };\n default:\n return noop(\"error\");\n }\n\n default: {\n // Exhaustive guard — TS will complain if we add a status without\n // handling it here.\n const _exhaustive: never = status;\n return _exhaustive;\n }\n }\n}\n","/**\n * Reactive store with microtask-batched updates and selector subscriptions.\n *\n * Design goals:\n * - **Tiny**: ~30 lines of logic, no external runtime.\n * - **Predictable**: subscribers fire synchronously after the microtask flush.\n * Multiple `setState` calls in the same tick fire one round of subscribers.\n * - **Selector-aware**: a subscriber registered with a selector only re-runs\n * when its selected slice changes (`Object.is` equality by default).\n */\n\nimport { type MutableStore } from \"../types/store.js\";\n\ninterface Subscriber<U = unknown> {\n selector: (state: never) => U;\n listener: (value: U) => void;\n /** Cached selected value from the last fired tick. */\n last: U;\n /** Custom equality, defaulted to `Object.is`. */\n isEqual: (a: U, b: U) => boolean;\n}\n\nconst defaultEquals = <U>(a: U, b: U): boolean => Object.is(a, b);\n\n/**\n * Optional knobs handed to `createStore`.\n *\n * The generic `T` is unused at the type level today, but it locks the option\n * shape to a specific store so future per-state hooks (e.g. `selectorOf`)\n * stay backwards-compatible.\n */\nexport interface CreateStoreOptions<_T> {\n /**\n * Override the global microtask scheduler (used by tests so the store\n * can flush synchronously). Default: `queueMicrotask`.\n */\n scheduleFlush?: (run: () => void) => void;\n /** Custom equality at the store level, used by `subscribe` if none is passed. */\n isEqual?: <U>(a: U, b: U) => boolean;\n}\n\n/**\n * Build a reactive store seeded with `initial`.\n */\nexport function createStore<T extends object>(\n initial: T,\n options: CreateStoreOptions<T> = {},\n): MutableStore<T> {\n const schedule = options.scheduleFlush ?? queueMicrotask;\n const defaultIsEqual =\n (options.isEqual as (<U>(a: U, b: U) => boolean) | undefined) ?? defaultEquals;\n\n let state: T = initial;\n /**\n * `subscribers` is a Set so removal during emit doesn't shift indices.\n * We snapshot to an array on flush.\n */\n const subscribers = new Set<Subscriber<unknown>>();\n let dirty = false;\n let disposed = false;\n\n function flush(): void {\n dirty = false;\n if (disposed) return;\n const snapshot = Array.from(subscribers);\n for (const sub of snapshot) {\n const next = (sub.selector as (s: T) => unknown)(state);\n if (sub.isEqual(next, sub.last)) continue;\n sub.last = next;\n try {\n sub.listener(next);\n } catch (err) {\n // One bad listener does not abort the rest. Surface for diagnosis.\n\n console.error(\"[@f8team/reel-core] store subscriber threw:\", err);\n }\n }\n }\n\n function getState(): T {\n return state;\n }\n\n function setState(patch: Partial<T> | ((current: T) => Partial<T>)): void {\n if (disposed) return;\n const next = typeof patch === \"function\" ? patch(state) : patch;\n state = { ...state, ...next };\n if (!dirty) {\n dirty = true;\n schedule(flush);\n }\n }\n\n function subscribe<U>(selector: (state: T) => U, listener: (value: U) => void): () => void {\n if (disposed) {\n return () => {\n /* no-op: store is dead */\n };\n }\n const sub: Subscriber<U> = {\n selector: selector as (state: never) => U,\n listener,\n last: selector(state),\n isEqual: defaultIsEqual,\n };\n subscribers.add(sub as Subscriber<unknown>);\n return () => {\n subscribers.delete(sub as Subscriber<unknown>);\n };\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n subscribers.clear();\n }\n\n return { getState, setState, subscribe, dispose };\n}\n","/**\n * `createPlayer(options)` - wires every piece of `@f8team/reel-core` into a\n * single `Player`. The factory is the one and only public entry point.\n *\n * Responsibilities:\n * 1. Build the reactive store seeded with the initial PlayerOptions.\n * 2. Build the event bus, command registry, controls registry, plugin bus.\n * 3. Register the always-on native source provider (and HLS / YouTube\n * providers with callbacks bound to this player's store and bus).\n * 4. Bridge `<video>` events ⇄ the state-machine reducer.\n * 5. Apply machine effects (attach/detach source, mediaPlay/Pause/Seek,\n * clearError/setError) against the live `<video>` element.\n * 6. Expose the `Player` interface defined in\n * `docs/spec/api-contract.md`.\n *\n * Tests live next to this file and validate the external behavior; lower-level\n * pieces (store, machine, sources, plugins, etc.) are covered by their own\n * unit tests.\n */\n\nimport { classifyMediaError, classifyUnknown } from \"./errors/classify.js\";\nimport { createPlayerError } from \"./errors/registry.js\";\nimport { createEventBus, type EventBus } from \"./events/bus.js\";\nimport { createPluginBus, type PluginBus } from \"./plugins/bus.js\";\nimport { createCommandRegistry } from \"./plugins/commands.js\";\nimport {\n createControlsRegistry,\n createMediaAttachmentRegistry,\n createPluginHost,\n createSourceTransformRegistry,\n} from \"./plugins/host.js\";\nimport { createHlsProvider } from \"./sources/hls.js\";\nimport { nativeProvider } from \"./sources/native.js\";\nimport { createSourceRegistry, type SourceRegistry } from \"./sources/registry.js\";\nimport { createYouTubeProvider, type YouTubePlayerInstance } from \"./sources/youtube.js\";\nimport { reduce, type MachineEffect, type MachineEvent } from \"./state/machine.js\";\nimport { createStore, type CreateStoreOptions } from \"./state/store.js\";\nimport { type PlayerError } from \"./types/error.js\";\nimport { type PlayerEvents, type UnauthorizedEvent } from \"./types/events.js\";\nimport { type PlayerOptions } from \"./types/options.js\";\nimport { type Disposer, type Player } from \"./types/player.js\";\nimport { type PluginInstance } from \"./types/plugin.js\";\nimport {\n type QualityLevel,\n type SourceDescriptor,\n type SourceLoader,\n type SourceProvider,\n} from \"./types/source.js\";\nimport { type BufferedRange, type PlayerState, type PlayerStatus } from \"./types/state.js\";\nimport { isSafeMediaUrl } from \"./util/url.js\";\n\n// Contract shared with @f8team/reel-plugin-fullscreen (kept as literals there so the\n// plugin still runs against older cores).\nconst WINDOW_FULLSCREEN_ATTR = \"data-reel-window-fullscreen\";\nconst WINDOW_FULLSCREEN_EVENT = \"reel-windowfullscreenchange\";\n\n/** @internal - extra knobs surfaced for tests and adapters. */\nexport interface CreatePlayerInternalOptions {\n /** Override the microtask scheduler for the store. Tests use this. */\n storeOptions?: CreateStoreOptions<PlayerState>;\n /** Inject extra source providers (e.g. dash, in-house DRM). */\n extraProviders?: SourceProvider[];\n}\n\nfunction makeInitialState(options: PlayerOptions): PlayerState {\n return {\n status: \"idle\",\n source: options.source ?? null,\n currentTime: 0,\n duration: 0,\n buffered: [],\n playbackRate: options.playbackRate ?? 1,\n volume: options.volume ?? 1,\n muted: options.muted ?? options.autoplay === \"muted\",\n videoWidth: 0,\n videoHeight: 0,\n pip: false,\n fullscreen: false,\n qualities: [],\n activeQuality: null,\n error: null,\n };\n}\n\nfunction bufferedToRanges(buffered: TimeRanges | null | undefined): BufferedRange[] {\n if (!buffered) return [];\n const out: BufferedRange[] = [];\n for (let i = 0; i < buffered.length; i++) {\n out.push({ start: buffered.start(i), end: buffered.end(i) });\n }\n return out;\n}\n\n/**\n * Build a fresh `Player`. Safe to construct in the browser, jsdom, or\n * server-rendering tests (only `attach()` touches the DOM).\n */\nexport function createPlayer(\n options: PlayerOptions = {},\n internal: CreatePlayerInternalOptions = {},\n): Player {\n /* ---------------------------------------------------------------- */\n /* State */\n /* ---------------------------------------------------------------- */\n\n const store = createStore<PlayerState>(makeInitialState(options), internal.storeOptions);\n const bus: EventBus = createEventBus();\n const commands = createCommandRegistry();\n const controls = createControlsRegistry();\n const sourceTransforms = createSourceTransformRegistry();\n const mediaAttachments = createMediaAttachmentRegistry();\n\n let status: PlayerStatus = \"idle\";\n let video: HTMLVideoElement | null = null;\n let activeLoader: SourceLoader | null = null;\n let pendingAttachAbort: (() => void) | null = null;\n let pendingSourceLoad: {\n promise: Promise<void>;\n resolve: () => void;\n reject: (reason: unknown) => void;\n } | null = null;\n let latestSourceLoadPromise: Promise<void> | null = null;\n let disposed = false;\n // Tracks a `play()` call that arrived while the engine is still in the\n // `loading` state (HLS manifest, native metadata). The state machine\n // intentionally treats `play` as a noop in `loading`, so we queue the\n // intent here and re-dispatch on the next `ready` transition. Without\n // this, the very first user click on the play button is silently\n // swallowed and the user has to click twice for HLS sources.\n let pendingPlay = false;\n\n function createPendingSourceLoad(): NonNullable<typeof pendingSourceLoad> {\n let resolve!: () => void;\n let reject!: (reason: unknown) => void;\n const promise = new Promise<void>((onResolve, onReject) => {\n resolve = onResolve;\n reject = onReject;\n });\n // A source can be set imperatively without anyone awaiting `attach()`.\n // Mark the rejection as observed while preserving the original promise\n // for callers that do await the attachment lifecycle.\n void promise.catch(() => undefined);\n latestSourceLoadPromise = promise;\n return { promise, resolve, reject };\n }\n\n function resolvePendingSourceLoad(): void {\n const load = pendingSourceLoad;\n if (!load) return;\n pendingSourceLoad = null;\n load.resolve();\n }\n\n function rejectPendingSourceLoad(reason: unknown): void {\n const load = pendingSourceLoad;\n if (!load) return;\n pendingSourceLoad = null;\n load.reject(reason);\n }\n\n function createAbortError(): Error {\n return Object.assign(new Error(\"Aborted\"), { name: \"AbortError\" });\n }\n\n const YT_PLAYER_STATE_PLAYING = 1;\n\n type LoaderWithYouTubeInstance = SourceLoader & {\n _instance?: () => YouTubePlayerInstance | null;\n };\n\n function getYouTubePlayer(): YouTubePlayerInstance | null {\n return (activeLoader as LoaderWithYouTubeInstance | null)?._instance?.() ?? null;\n }\n\n /* ---------------------------------------------------------------- */\n /* Source registry */\n /* ---------------------------------------------------------------- */\n\n const registry: SourceRegistry = createSourceRegistry();\n\n function emitUnauthorized(payload: UnauthorizedEvent): void {\n bus.emit(\"unauthorized\", payload);\n options.hooks?.onUnauthorized?.(payload);\n }\n\n function applyError(err: PlayerError): void {\n store.setState({ error: err });\n bus.emit(\"error\", err);\n options.hooks?.onError?.(err);\n }\n\n function setQualities(qualities: QualityLevel[]): void {\n store.setState({ qualities });\n }\n\n function setActiveQuality(quality: QualityLevel | null, auto: boolean): void {\n store.setState({ activeQuality: quality });\n bus.emit(\"qualitychange\", { quality, auto });\n }\n\n // Built-in command: hls-quality plugin delegates to this via\n // player.commands.run(\"hls:setQuality\", level).\n commands.add(\"hls:setQuality\", (level: unknown) => {\n if (\n level !== null &&\n (typeof level !== \"object\" || typeof (level as QualityLevel).height !== \"number\")\n ) {\n return;\n }\n bus.emit(\"qualitypreference\", {\n qualityHeight: level === null ? null : (level as QualityLevel).height,\n });\n\n const loader = activeLoader as { setQuality?: (l: QualityLevel | \"auto\") => void } | null;\n if (typeof loader?.setQuality === \"function\") {\n loader.setQuality(level === null ? \"auto\" : (level as QualityLevel));\n }\n });\n\n // Order matters: extra providers win first so consumers (and tests) can\n // override the built-ins without unregistering them.\n for (const provider of internal.extraProviders ?? []) registry.register(provider);\n registry.register(\n createHlsProvider({\n onUnauthorized: (e) => emitUnauthorized(e),\n onQualities: (q) => setQualities(q),\n onActiveQuality: (q, auto) => setActiveQuality(q, auto),\n onError: (err) => {\n const playerError = createPlayerError({ ...err, code: err.code ?? \"network\" });\n if (status === \"loading\") {\n dispatch({ type: \"loadFailed\", error: playerError });\n return;\n }\n dispatch({ type: \"runtimeError\", error: playerError });\n },\n onQualitySwitch: (active) => bus.emit(\"qualityswitch\", { active }),\n }),\n );\n registry.register(\n createYouTubeProvider({\n onError: (err) => applyError(createPlayerError({ ...err, code: \"source\" })),\n // Bridge YouTube's polled time/duration into the same store fields and\n // bus events that hls.js / native engines populate. Without this, the\n // seek bar, transcripts, resume-position and analytics plugins would\n // never tick on YouTube sources (A3).\n onTimeUpdate: (currentTime) => {\n const duration = store.getState().duration;\n store.setState({ currentTime });\n bus.emit(\"timeupdate\", { currentTime, playedSeconds: currentTime, duration });\n },\n onDuration: (duration) => {\n store.setState({ duration });\n bus.emit(\"durationchange\", { duration });\n },\n onStateChange: (ytState) => {\n if (ytState === \"playing\") {\n bus.emit(\"play\");\n if (status !== \"playing\" && status !== \"loading\") dispatch({ type: \"play\" });\n } else if (ytState === \"paused\") {\n bus.emit(\"pause\");\n if (status === \"playing\") dispatch({ type: \"pause\" });\n } else if (ytState === \"ended\") {\n bus.emit(\"ended\");\n if (status !== \"ended\") dispatch({ type: \"ended\" });\n } else if (ytState === \"buffering\") {\n bus.emit(\"buffering\", { isBuffering: true });\n }\n },\n }),\n );\n registry.register(nativeProvider);\n\n /* ---------------------------------------------------------------- */\n /* Player object (forward declaration so plugins can capture a ref) */\n /* ---------------------------------------------------------------- */\n\n const playerRef = {} as Player;\n const host = createPluginHost({\n commands,\n controls,\n store: { getState: store.getState, subscribe: store.subscribe },\n bus,\n sourceTransforms,\n mediaAttachments,\n });\n const plugins: PluginBus = createPluginBus({ player: playerRef, host });\n\n /* ---------------------------------------------------------------- */\n /* Reducer wiring */\n /* ---------------------------------------------------------------- */\n\n function dispatch(event: MachineEvent): void {\n if (disposed) return;\n const prev = status;\n const result = reduce(status, event);\n status = result.next;\n store.setState({ status });\n for (const effect of result.effects) applyEffect(effect);\n if (prev !== \"ready\" && status === \"ready\") {\n bus.emit(\"ready\", { duration: store.getState().duration });\n resolvePendingSourceLoad();\n }\n if (event.type === \"loadFailed\") {\n rejectPendingSourceLoad(event.error);\n }\n }\n\n function applyEffect(effect: MachineEffect): void {\n switch (effect.type) {\n case \"attachSource\":\n runAttachSource(effect.source);\n return;\n case \"detachSource\":\n runDetachSource();\n return;\n case \"mediaPlay\":\n runMediaPlay();\n return;\n case \"mediaPause\":\n runMediaPause();\n return;\n case \"mediaSeek\":\n runMediaSeek(effect.seconds);\n return;\n case \"clearError\":\n if (store.getState().error) store.setState({ error: null });\n return;\n case \"setError\":\n applyError(effect.error);\n return;\n default: {\n const _exhaustive: never = effect;\n return _exhaustive;\n }\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Effect runners */\n /* ---------------------------------------------------------------- */\n\n function runAttachSource(source: SourceDescriptor): void {\n // Cancel any prior in-flight loader BEFORE we replace activeLoader so a\n // rapid setSource(A) → setSource(B) sequence cannot let A's resolved\n // metadata leak into B's state. detach() will be invoked by the next\n // detachSource effect (state machine emits detachSource before\n // attachSource on every source switch).\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n\n store.setState({\n source,\n currentTime: 0,\n duration: 0,\n buffered: [],\n qualities: [],\n activeQuality: null,\n });\n bus.emit(\"qualitychange\", { quality: null, auto: true });\n if (\n !isSafeMediaUrl(source.src) ||\n source.tracks?.some((track) => !isSafeMediaUrl(track.src)) ||\n (source.thumbnails && !isSafeMediaUrl(source.thumbnails.src))\n ) {\n if (video) {\n pendingSourceLoad = createPendingSourceLoad();\n }\n const error = createPlayerError({\n code: \"unsupported\",\n message: \"Invalid URL\",\n });\n dispatch({ type: \"loadFailed\", error });\n return;\n }\n if (!video) return; // attach happens once a <video> is provided\n const sourceLoad = createPendingSourceLoad();\n pendingSourceLoad = sourceLoad;\n const provider = registry.resolve(source);\n if (!provider) {\n const error = createPlayerError({\n code: \"unsupported\",\n message: `No source provider for ${source.src}`,\n });\n dispatch({\n type: \"loadFailed\",\n error,\n });\n return;\n }\n const loader = provider.createLoader();\n activeLoader = loader;\n\n let aborted = false;\n pendingAttachAbort = () => {\n aborted = true;\n // Tell the loader to cancel its in-flight network work. The loader\n // implementation is responsible for being idempotent and safe across\n // detach() ordering (see SourceLoader.abort docstring).\n try {\n loader.abort?.();\n } catch (error) {\n console.error(error);\n }\n if (pendingSourceLoad === sourceLoad) {\n rejectPendingSourceLoad(createAbortError());\n } else {\n sourceLoad.reject(createAbortError());\n }\n };\n\n loader\n .attach(video, source)\n .then(() => {\n if (aborted) return;\n if (!video) return;\n // Capture metadata into the store; the native `loadedmetadata`\n // event listener will also have fired, but plugins-with-mock-engines\n // (HLS native fallback, YouTube) can resolve `attach` later.\n store.setState({\n duration: Number.isFinite(video.duration) ? video.duration : 0,\n videoWidth: video.videoWidth,\n videoHeight: video.videoHeight,\n buffered: bufferedToRanges(video.buffered),\n });\n dispatch({ type: \"loaded\" });\n })\n .catch((err) => {\n if (aborted) return;\n const playerError = classifyUnknown(err, source.src);\n dispatch({ type: \"loadFailed\", error: playerError });\n });\n }\n\n function runDetachSource(): void {\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n if (activeLoader) {\n try {\n activeLoader.detach();\n } catch (err) {\n console.error(\"[@f8team/reel-core] active loader detach threw:\", err);\n }\n activeLoader = null;\n }\n store.setState({\n source: null,\n duration: 0,\n currentTime: 0,\n buffered: [],\n qualities: [],\n activeQuality: null,\n });\n }\n\n function runMediaPlay(): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.playVideo();\n } catch {\n // ignore\n }\n return;\n }\n const result = video.play();\n if (result && typeof (result as Promise<void>).then === \"function\") {\n (result as Promise<void>).catch((err: unknown) => {\n dispatch({\n type: \"runtimeError\",\n error: classifyUnknown(err),\n });\n });\n }\n }\n\n function runMediaPause(): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.pauseVideo();\n } catch {\n // ignore\n }\n return;\n }\n try {\n video.pause();\n } catch {\n // ignore\n }\n }\n\n function runMediaSeek(seconds: number): void {\n if (!video) return;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.seekTo(seconds, true);\n store.setState({ currentTime: seconds });\n bus.emit(\"timeupdate\", {\n currentTime: seconds,\n playedSeconds: seconds,\n duration: store.getState().duration,\n });\n } catch {\n // ignore\n }\n return;\n }\n try {\n video.currentTime = seconds;\n } catch {\n // ignore\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Native <video> event bridge */\n /* ---------------------------------------------------------------- */\n\n const nativeListeners: Array<() => void> = [];\n\n function bindNativeEvents(target: HTMLVideoElement): void {\n function on<T extends Event>(name: string, fn: (e: T) => void): void {\n const handler = (e: Event): void => fn(e as T);\n target.addEventListener(name, handler);\n nativeListeners.push(() => target.removeEventListener(name, handler));\n }\n on(\"loadedmetadata\", () => {\n store.setState({\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n videoWidth: target.videoWidth,\n videoHeight: target.videoHeight,\n buffered: bufferedToRanges(target.buffered),\n });\n // The state machine will also receive `loaded` from the loader;\n // calling dispatch here is safe because invalid transitions are no-ops.\n if (status === \"loading\") dispatch({ type: \"loaded\" });\n });\n on(\"durationchange\", () => {\n const duration = Number.isFinite(target.duration) ? target.duration : 0;\n store.setState({ duration });\n bus.emit(\"durationchange\", { duration });\n });\n on(\"timeupdate\", () => {\n // YouTube owns time via the polled bridge; the hidden <video> still fires\n // native timeupdate at currentTime=0 and would clobber the store / onProgress.\n if (getYouTubePlayer()) return;\n const currentTime = target.currentTime;\n store.setState({ currentTime, buffered: bufferedToRanges(target.buffered) });\n bus.emit(\"timeupdate\", {\n currentTime,\n playedSeconds: currentTime,\n duration: target.duration,\n });\n });\n on(\"play\", () => {\n bus.emit(\"play\");\n dispatch({ type: \"play\" });\n });\n on(\"pause\", () => {\n bus.emit(\"pause\");\n dispatch({ type: \"pause\" });\n });\n on(\"ended\", () => {\n bus.emit(\"ended\");\n dispatch({ type: \"ended\" });\n });\n on(\"error\", () => {\n const err = classifyMediaError(target.error, target.currentSrc);\n if (status === \"loading\") dispatch({ type: \"loadFailed\", error: err });\n else dispatch({ type: \"runtimeError\", error: err });\n });\n on(\"volumechange\", () => {\n store.setState({ volume: target.volume, muted: target.muted });\n bus.emit(\"volumechange\", { volume: target.volume, muted: target.muted });\n });\n on(\"ratechange\", () => {\n store.setState({ playbackRate: target.playbackRate });\n bus.emit(\"ratechange\", { playbackRate: target.playbackRate });\n });\n on(\"seeking\", () => {\n bus.emit(\"seeking\", { time: target.currentTime });\n // Seeking flushes the decode pipeline; show the same center spinner as\n // `waiting` until `seeked` / `playing` settles (avoids a \"frozen\" feel).\n bus.emit(\"buffering\", { isBuffering: true });\n });\n on(\"seeked\", () => {\n bus.emit(\"seeked\", { time: target.currentTime });\n // Paused scrubs: nothing will fire `playing` to clear the seek spinner.\n if (target.paused) {\n bus.emit(\"buffering\", { isBuffering: false });\n return;\n }\n // Playing: if the browser already has enough decoded data, clear early;\n // otherwise keep showing until `waiting` → `playing` (or `playing` alone).\n if (target.readyState >= 3 /* HAVE_FUTURE_DATA */) {\n bus.emit(\"buffering\", { isBuffering: false });\n }\n });\n on(\"waiting\", () => {\n // Initial decode/load commonly emits `waiting` while HAVE_NOTHING/HAVE_METADATA, which\n // stacks awkwardly with the poster/boot UI (persistent spinner right after F5).\n // Treat stalls as buffering once we already reached CURRENT_DATA for this playback session.\n if (target.readyState < 2 /* HAVE_CURRENT_DATA */) return;\n bus.emit(\"buffering\", { isBuffering: true });\n });\n on(\"playing\", () => {\n bus.emit(\"buffering\", { isBuffering: false });\n });\n on(\"enterpictureinpicture\", () => {\n store.setState({ pip: true });\n bus.emit(\"pipchange\", { pip: true });\n });\n on(\"leavepictureinpicture\", () => {\n store.setState({ pip: false });\n bus.emit(\"pipchange\", { pip: false });\n });\n\n // `fullscreenchange` fires on `document`, not on the <video> element.\n // We track it here so `state.fullscreen` stays accurate without requiring\n // consumers to install the fullscreen plugin.\n // Browsers without the element Fullscreen API (iPhone Safari) get a window\n // fallback from the fullscreen plugin: it marks an ancestor with\n // WINDOW_FULLSCREEN_ATTR and dispatches WINDOW_FULLSCREEN_EVENT on the video.\n const ownerDocument = target.ownerDocument;\n const onFullscreenChange = (): void => {\n const isFullscreen =\n !!ownerDocument.fullscreenElement?.contains(target) ||\n !!target.closest(`[${WINDOW_FULLSCREEN_ATTR}]`);\n store.setState({ fullscreen: isFullscreen });\n bus.emit(\"fullscreenchange\", { fullscreen: isFullscreen });\n };\n ownerDocument.addEventListener(\"fullscreenchange\", onFullscreenChange);\n target.addEventListener(WINDOW_FULLSCREEN_EVENT, onFullscreenChange);\n nativeListeners.push(\n () => ownerDocument.removeEventListener(\"fullscreenchange\", onFullscreenChange),\n () => target.removeEventListener(WINDOW_FULLSCREEN_EVENT, onFullscreenChange),\n );\n }\n\n function unbindNativeEvents(): void {\n while (nativeListeners.length) {\n try {\n nativeListeners.pop()?.();\n } catch {\n // ignore\n }\n }\n }\n\n /* ---------------------------------------------------------------- */\n /* Public Player */\n /* ---------------------------------------------------------------- */\n\n function applyAttachOptions(): void {\n if (!video) return;\n const state = store.getState();\n video.volume = state.volume;\n video.muted = state.muted;\n video.playbackRate = state.playbackRate;\n if (options.poster) video.poster = options.poster;\n if (options.preload) video.preload = options.preload;\n video.playsInline = options.playsInline ?? true;\n video.toggleAttribute(\"webkit-playsinline\", video.playsInline);\n // T3.5: default `crossOrigin: \"anonymous\"`. Required for WebVTT subtitle\n // tracks (G15) and HLS segment fetch with `withCredentials`. Consumers can\n // override with an explicit `\"use-credentials\"` or `null`. Note the\n // `in options` guard - `options.crossOrigin === null` is treated as\n // \"no attribute on the element\" (matches the JSDoc semantics), and\n // `undefined` falls through to the default.\n video.crossOrigin = \"crossOrigin\" in options ? (options.crossOrigin ?? null) : \"anonymous\";\n video.loop = !!options.loop;\n }\n\n // Per-attach disposers (autoplay / startTime listeners + post-ready\n // immediate work) so that re-attach after detach doesn't leak listeners\n // and does fire autoplay/startTime even when the player is already in\n // the `ready` state on the second attach (A5).\n const attachDisposers: Array<() => void> = [];\n\n function flushAttachDisposers(): void {\n while (attachDisposers.length) {\n try {\n attachDisposers.pop()?.();\n } catch {\n // ignore\n }\n }\n }\n\n function applyStartTimeNow(): void {\n if (video && typeof options.startTime === \"number\" && options.startTime > 0) {\n video.currentTime = options.startTime;\n }\n }\n\n function applyAutoplayNow(): void {\n if (!options.autoplay || options.autoplay === \"off\") return;\n if (options.autoplay === \"muted\" && video) video.muted = true;\n playerRef.play().catch(() => {\n /* swallow - surfaced via runtimeError */\n });\n }\n\n async function attach(el: HTMLVideoElement): Promise<void> {\n if (disposed) throw new Error(\"[@f8team/reel-core] cannot attach: player disposed\");\n if (video === el) {\n await latestSourceLoadPromise;\n return;\n }\n if (video) detach();\n video = el;\n mediaAttachments.set({\n video: el,\n container: el.closest(\"[data-reel]\") ?? el.parentElement ?? el,\n });\n bindNativeEvents(el);\n applyAttachOptions();\n const currentSource = store.getState().source;\n if (currentSource) setSource(currentSource);\n const sourceLoadPromise = latestSourceLoadPromise;\n\n const wantStartTime = typeof options.startTime === \"number\" && options.startTime > 0;\n const wantAutoplay = !!options.autoplay && options.autoplay !== \"off\" && !!options.source;\n\n // If the engine has already reached ready (e.g. second attach to the\n // same already-loaded source), apply autoplay/startTime synchronously\n // so the second mount behaves identically to the first.\n if (status === \"ready\") {\n if (wantStartTime) applyStartTimeNow();\n if (wantAutoplay) applyAutoplayNow();\n } else {\n if (wantStartTime) {\n const off = bus.on(\"ready\", () => {\n applyStartTimeNow();\n off();\n });\n attachDisposers.push(off);\n }\n if (wantAutoplay) {\n const off = bus.on(\"ready\", () => {\n applyAutoplayNow();\n off();\n });\n attachDisposers.push(off);\n }\n }\n\n await sourceLoadPromise;\n }\n\n function detach(): void {\n pendingAttachAbort?.();\n pendingAttachAbort = null;\n flushAttachDisposers();\n unbindNativeEvents();\n if (activeLoader) {\n try {\n activeLoader.detach();\n } catch {\n // ignore\n }\n activeLoader = null;\n }\n mediaAttachments.set(null);\n video = null;\n }\n\n function dispose(): void {\n if (disposed) return;\n disposed = true;\n plugins.disposeAll();\n dispatch({ type: \"dispose\" });\n detach();\n bus.clear();\n controls.clear();\n store.dispose();\n }\n\n function setSource(source: SourceDescriptor | null): void {\n // Cancel any queued play intent so a play() issued during the previous\n // load doesn't auto-fire on the new source's `ready` event.\n pendingPlay = false;\n latestSourceLoadPromise = null;\n dispatch({ type: \"setSource\", source: source ? sourceTransforms.apply(source) : null });\n }\n\n function getSource(): SourceDescriptor | null {\n return store.getState().source;\n }\n\n // Retry replays the most recent source through the state machine. We do\n // this at the orchestrator layer (rather than inside the reducer) because\n // the reducer is pure and the source is owned by the store. Calling\n // `setSource(currentSource)` re-emits detachSource → clearError →\n // attachSource which gives us the same cycle as a fresh load (C1).\n function retry(): boolean {\n const current = store.getState().source;\n if (!current) return false;\n setSource(current);\n return true;\n }\n\n async function play(): Promise<void> {\n if (disposed) throw new Error(\"[@f8team/reel-core] cannot play: player disposed\");\n if (!video) throw new Error(\"[@f8team/reel-core] cannot play: no <video> attached\");\n if (!store.getState().source) throw new Error(\"[@f8team/reel-core] cannot play: no source set\");\n\n // In `error`, `dispatch({ type: \"play\" })` is intentionally a reducer noop - user\n // Space/Play would appear dead. Replay the descriptor through the machine like `retry()`\n // so we return to loading and defer until `ready`.\n if (status === \"error\") {\n pendingPlay = false;\n if (!retry()) {\n throw new Error(\"[@f8team/reel-core] cannot play: error state without replayable source\");\n }\n // retry() transitioned to loading synchronously via dispatch.\n }\n\n // Defer-play during loading: the state machine treats `play` as a noop\n // in `loading`, so a single user click would otherwise be lost while\n // HLS.js is still fetching the m3u8 manifest. Queue the intent and\n // re-dispatch on the next `ready` transition. Tied to attach lifecycle\n // via `attachDisposers` so detach/dispose cancels the queued play.\n if (status === \"loading\") {\n if (pendingPlay) {\n return;\n }\n pendingPlay = true;\n const off = bus.on(\"ready\", () => {\n off();\n if (!pendingPlay) return;\n pendingPlay = false;\n if (disposed || !video || !store.getState().source) return;\n dispatch({ type: \"play\" });\n });\n attachDisposers.push(() => {\n pendingPlay = false;\n off();\n });\n return;\n }\n\n dispatch({ type: \"play\" });\n // If the underlying engine returned a play() promise, the runner already\n // surfaced its rejection through dispatch(runtimeError).\n }\n\n function pause(): void {\n // Cancel any queued play intent so explicitly pausing during loading\n // doesn't autoplay once `ready` fires.\n pendingPlay = false;\n dispatch({ type: \"pause\" });\n }\n\n function paused(): boolean {\n if (!video) return true;\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n return yt.getPlayerState() !== YT_PLAYER_STATE_PLAYING;\n } catch {\n return true;\n }\n }\n return video.paused;\n }\n\n function seekTo(seconds: number): void {\n if (!Number.isFinite(seconds)) return;\n if (!video) return;\n const duration = Number.isFinite(video.duration) ? video.duration : Number.POSITIVE_INFINITY;\n const clamped = Math.max(0, Math.min(seconds, duration));\n const yt = getYouTubePlayer();\n if (yt) {\n try {\n yt.seekTo(clamped, true);\n store.setState({ currentTime: clamped });\n bus.emit(\"timeupdate\", {\n currentTime: clamped,\n playedSeconds: clamped,\n duration: store.getState().duration,\n });\n } catch {\n // ignore\n }\n return;\n }\n video.currentTime = clamped;\n }\n\n function syncVolumeMutedStoreFromVideo(): void {\n if (!video) return;\n store.setState({ volume: video.volume, muted: video.muted });\n }\n\n function syncPlaybackRateStoreFromVideo(): void {\n if (!video) return;\n store.setState({ playbackRate: video.playbackRate });\n }\n\n function setPlaybackRate(rate: number): void {\n if (!Number.isFinite(rate) || rate <= 0) return;\n if (!video) return;\n video.playbackRate = rate;\n syncPlaybackRateStoreFromVideo();\n }\n\n function setVolume(volume: number): void {\n if (!Number.isFinite(volume)) return;\n if (!video) return;\n video.volume = Math.max(0, Math.min(1, volume));\n syncVolumeMutedStoreFromVideo();\n }\n\n function setMuted(muted: boolean): void {\n if (!video) return;\n video.muted = muted;\n syncVolumeMutedStoreFromVideo();\n }\n\n function getState(): PlayerState {\n return store.getState();\n }\n\n function getCurrentTime(): number {\n return store.getState().currentTime;\n }\n\n function getDuration(): number {\n return store.getState().duration;\n }\n\n function getBuffered(): BufferedRange[] {\n return store.getState().buffered.slice();\n }\n\n function on<K extends keyof PlayerEvents>(\n event: K,\n handler: (payload: PlayerEvents[K]) => void,\n ): Disposer {\n return bus.on(event, handler as never);\n }\n\n function off<K extends keyof PlayerEvents>(\n event: K,\n handler: (payload: PlayerEvents[K]) => void,\n ): void {\n bus.off(event, handler as never);\n }\n\n function subscribe<T>(\n selector: (state: PlayerState) => T,\n listener: (value: T) => void,\n ): Disposer {\n return store.subscribe(selector, listener);\n }\n\n function use(plugin: PluginInstance): void {\n plugins.register(plugin);\n }\n\n function removePlugin(name: string): void {\n plugins.unregister(name);\n }\n\n // Materialize the public surface on the existing reference so plugins\n // captured a stable identity at construction time.\n Object.assign(playerRef, {\n setSource,\n getSource,\n retry,\n play,\n pause,\n paused,\n seekTo,\n setPlaybackRate,\n setVolume,\n setMuted,\n getState,\n getCurrentTime,\n getDuration,\n getBuffered,\n on,\n off,\n subscribe,\n use,\n removePlugin,\n commands,\n attach,\n detach,\n dispose,\n } satisfies Player);\n\n // Pre-register plugins from PlayerOptions.\n for (const plugin of options.plugins ?? []) plugins.register(plugin);\n\n return playerRef;\n}\n","/**\n * Identity helper used by plugin authors so editors get type narrowing\n * on `setup` arguments without typing `as PluginInstance` at every call site.\n *\n * @example\n * const subtitles = definePlugin({\n * name: \"subtitles\",\n * setup: (player, host) => { ... },\n * });\n */\nimport { type PluginInstance } from \"../types/plugin.js\";\n\nexport function definePlugin(spec: PluginInstance): PluginInstance {\n return spec;\n}\n","/**\n * Default token values. Phase 3 ships theme CSS files (`classroom.css`,\n * `story.css`, `admin.css`, `minimal.css`) that override these via class\n * selectors. The defaults below are intentionally neutral so an unstyled\n * player still looks reasonable.\n */\n\nimport { type ThemeName, type ThemeTokens } from \"../types/theme.js\";\n\n/**\n * Token name → CSS custom property name. Adapters write to the variable\n * directly so consumers can also use plain CSS to override.\n */\nexport const TOKEN_TO_CSS_VAR: Record<keyof ThemeTokens, string> = {\n \"color-bg\": \"--reel-color-bg\",\n \"color-fg\": \"--reel-color-fg\",\n \"color-accent\": \"--reel-color-accent\",\n \"color-overlay\": \"--reel-color-overlay\",\n \"control-size\": \"--reel-control-size\",\n \"control-radius\": \"--reel-control-radius\",\n \"control-gap\": \"--reel-control-gap\",\n \"control-padding\": \"--reel-control-padding\",\n \"focus-ring-color\": \"--reel-focus-ring-color\",\n \"focus-ring-width\": \"--reel-focus-ring-width\",\n \"seekbar-height\": \"--reel-seekbar-height\",\n \"seekbar-buffered\": \"--reel-seekbar-buffered\",\n \"seekbar-played\": \"--reel-seekbar-played\",\n \"seekbar-knob-size\": \"--reel-seekbar-knob-size\",\n \"font-family\": \"--reel-font-family\",\n \"font-size-sm\": \"--reel-font-size-sm\",\n \"font-size-md\": \"--reel-font-size-md\",\n \"motion-fast\": \"--reel-motion-fast\",\n \"motion-base\": \"--reel-motion-base\",\n};\n\n/**\n * Neutral default tokens. Adapters apply these on the player root before any\n * theme class wins. Values use `1rem = 10px` (F8 frontends use the 62.5%\n * font-size convention).\n */\nexport const DEFAULT_TOKENS: Required<ThemeTokens> = {\n \"color-bg\": \"#0d0d0d\",\n \"color-fg\": \"#ffffff\",\n \"color-accent\": \"#ff5722\",\n \"color-overlay\": \"rgba(0, 0, 0, 0.55)\",\n\n \"control-size\": \"3.6rem\",\n \"control-radius\": \"0.8rem\",\n \"control-gap\": \"0.8rem\",\n \"control-padding\": \"0.8rem\",\n\n \"focus-ring-color\": \"#3ea6ff\",\n \"focus-ring-width\": \"0.2rem\",\n\n \"seekbar-height\": \"0.4rem\",\n \"seekbar-buffered\": \"rgba(255, 255, 255, 0.35)\",\n \"seekbar-played\": \"var(--reel-color-accent)\",\n \"seekbar-knob-size\": \"1.2rem\",\n\n \"font-family\": \"system-ui, -apple-system, 'Segoe UI', sans-serif\",\n \"font-size-sm\": \"1.2rem\",\n \"font-size-md\": \"1.4rem\",\n\n \"motion-fast\": \"120ms\",\n \"motion-base\": \"200ms\",\n};\n\n/** Built-in theme presets. Phase 3 packages the CSS counterpart. */\nexport const THEME_PRESETS: Record<ThemeName, ThemeTokens> = {\n classroom: {\n \"color-bg\": \"#0e1117\",\n \"color-accent\": \"#ff6b00\",\n \"control-size\": \"4.0rem\",\n \"seekbar-height\": \"0.4rem\",\n },\n story: {\n \"color-bg\": \"transparent\",\n \"color-overlay\": \"rgba(0, 0, 0, 0.45)\",\n \"control-size\": \"4.4rem\",\n \"seekbar-height\": \"0.3rem\",\n },\n admin: {\n \"color-bg\": \"#1a1d23\",\n \"color-accent\": \"#3ea6ff\",\n \"control-size\": \"3.2rem\",\n \"seekbar-height\": \"0.5rem\",\n },\n minimal: {\n \"color-bg\": \"transparent\",\n \"control-size\": \"3.0rem\",\n \"seekbar-height\": \"0.3rem\",\n },\n};\n","/**\n * Apply theme tokens to an element's `style`.\n *\n * Adapters call this once per mount and again whenever the theme prop changes.\n * Plugins can overlay extra tokens through the same helper.\n */\n\nimport { type ThemeName, type ThemeTokens } from \"../types/theme.js\";\n\nimport { DEFAULT_TOKENS, THEME_PRESETS, TOKEN_TO_CSS_VAR } from \"./tokens.js\";\n\nexport interface ApplyThemeArgs {\n /** Theme preset name. `undefined` skips preset application. */\n preset?: ThemeName;\n /** Extra token overrides. Wins over the preset. */\n overrides?: ThemeTokens;\n /** Whether to apply the neutral defaults first. Default: `true`. */\n applyDefaults?: boolean;\n}\n\n/**\n * Resolve a final token map by layering defaults → preset → overrides.\n */\nexport function resolveTokens(args: ApplyThemeArgs = {}): Partial<ThemeTokens> {\n const out: ThemeTokens = {};\n if (args.applyDefaults !== false) Object.assign(out, DEFAULT_TOKENS);\n if (args.preset) Object.assign(out, THEME_PRESETS[args.preset]);\n if (args.overrides) Object.assign(out, args.overrides);\n return out;\n}\n\n/**\n * Apply tokens to `element.style`. Returns a disposer that resets the\n * variables to their previous values (useful for adapters that need to\n * roll back on theme change).\n */\nexport function applyTheme(element: HTMLElement, args: ApplyThemeArgs = {}): () => void {\n const tokens = resolveTokens(args);\n const previous: Partial<Record<keyof ThemeTokens, string>> = {};\n for (const [key, value] of Object.entries(tokens)) {\n if (typeof value !== \"string\") continue;\n const cssVar = TOKEN_TO_CSS_VAR[key as keyof ThemeTokens];\n if (!cssVar) continue;\n previous[key as keyof ThemeTokens] = element.style.getPropertyValue(cssVar);\n element.style.setProperty(cssVar, value);\n }\n return () => {\n for (const [key, prev] of Object.entries(previous)) {\n const cssVar = TOKEN_TO_CSS_VAR[key as keyof ThemeTokens];\n if (!cssVar) continue;\n if (prev) element.style.setProperty(cssVar, prev);\n else element.style.removeProperty(cssVar);\n }\n };\n}\n","/**\n * Single shared off-screen `aria-live` region. Adapters / plugins call\n * `announce(\"Subtitles on\")` to push messages to assistive tech without\n * jumping focus.\n *\n * The region is created lazily (so SSR-only consumers pay nothing) and\n * polite by default. Screen readers respect rate-limit conventions, so\n * announcements queue up and read sequentially.\n */\n\nconst REGION_ID = \"reel-live-region\";\n\nlet region: HTMLElement | null = null;\n\nfunction ensureRegion(): HTMLElement | null {\n if (typeof document === \"undefined\") return null;\n if (region && region.isConnected) return region;\n const existing = document.getElementById(REGION_ID);\n if (existing) {\n region = existing;\n return region;\n }\n const node = document.createElement(\"div\");\n node.id = REGION_ID;\n node.setAttribute(\"aria-live\", \"polite\");\n node.setAttribute(\"aria-atomic\", \"true\");\n node.setAttribute(\"role\", \"status\");\n // Visually hidden, but exposed to screen readers.\n Object.assign(node.style, {\n position: \"absolute\",\n width: \"1px\",\n height: \"1px\",\n padding: \"0\",\n margin: \"-1px\",\n overflow: \"hidden\",\n clip: \"rect(0,0,0,0)\",\n whiteSpace: \"nowrap\",\n border: \"0\",\n } satisfies Partial<CSSStyleDeclaration>);\n document.body.appendChild(node);\n region = node;\n return region;\n}\n\n/**\n * Announce a message to assistive tech. No-op outside the browser.\n *\n * Subsequent calls with the same string force a fresh DOM mutation (we\n * blank the region for one frame) so screen readers re-read identical\n * messages — useful for repeated state toggles like Mute on/off.\n */\nexport function announce(message: string): void {\n if (!message) return;\n const node = ensureRegion();\n if (!node) return;\n if (node.textContent === message) {\n node.textContent = \"\";\n }\n // Microtask delay — gives the screen reader a chance to notice the empty\n // mutation when re-announcing the same string.\n queueMicrotask(() => {\n if (node.isConnected) node.textContent = message;\n });\n}\n\n/** @internal — drop the live region. Used by the test cleanup hooks. */\nexport function _disposeAnnounce(): void {\n if (region && region.parentElement) region.parentElement.removeChild(region);\n region = null;\n}\n","/**\n * Minimal focus trap helper.\n *\n * Used by adapters in fullscreen so Tab / Shift+Tab stays inside the player.\n * Not a replacement for full focus-management libraries (focus-trap-react)\n * — but enough for the player's small, well-known interactive surface.\n */\n\nconst FOCUSABLE_SELECTOR = [\n \"a[href]\",\n \"area[href]\",\n \"input:not([disabled])\",\n \"select:not([disabled])\",\n \"textarea:not([disabled])\",\n \"button:not([disabled])\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"[tabindex]:not([tabindex='-1'])\",\n \"[contenteditable]\",\n].join(\",\");\n\nfunction isFocusable(el: Element): el is HTMLElement {\n if (!(el instanceof HTMLElement)) return false;\n if (el.hidden) return false;\n if (el.tabIndex === -1) return false;\n // Production DOM gives us a layout-aware visibility check. We can't trust\n // it in jsdom (where offsetParent often stays null until layout flushes).\n // The selector already excludes `disabled` and `tabindex=\"-1\"`; that's\n // enough to keep the API honest.\n return true;\n}\n\nfunction focusables(container: HTMLElement): HTMLElement[] {\n const all = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR));\n return all.filter(isFocusable);\n}\n\nexport interface FocusTrap {\n /** Activate the trap. Optionally focuses the first focusable. */\n activate(opts?: { focusFirst?: boolean }): void;\n /** Deactivate. Optionally restores focus to the previously focused element. */\n deactivate(opts?: { restoreFocus?: boolean }): void;\n}\n\n/**\n * Build a focus trap rooted at `container`.\n *\n * The trap installs a `keydown` listener and rotates focus among the\n * descendants matching `FOCUSABLE_SELECTOR` when Tab/Shift+Tab fires near\n * the boundary.\n */\nexport function createFocusTrap(container: HTMLElement): FocusTrap {\n let active = false;\n let previouslyFocused: Element | null = null;\n\n function onKeyDown(event: KeyboardEvent): void {\n if (!active) return;\n if (event.key !== \"Tab\") return;\n const items = focusables(container);\n if (items.length === 0) {\n event.preventDefault();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n if (!first || !last) return;\n const current = document.activeElement;\n if (event.shiftKey) {\n if (current === first || !container.contains(current)) {\n event.preventDefault();\n last.focus();\n }\n } else if (current === last || !container.contains(current)) {\n event.preventDefault();\n first.focus();\n }\n }\n\n function activate(opts: { focusFirst?: boolean } = {}): void {\n if (active) return;\n active = true;\n previouslyFocused = document.activeElement;\n container.addEventListener(\"keydown\", onKeyDown, true);\n if (opts.focusFirst) {\n const items = focusables(container);\n items[0]?.focus();\n }\n }\n\n function deactivate(opts: { restoreFocus?: boolean } = {}): void {\n if (!active) return;\n active = false;\n container.removeEventListener(\"keydown\", onKeyDown, true);\n if (opts.restoreFocus && previouslyFocused instanceof HTMLElement) {\n try {\n previouslyFocused.focus();\n } catch {\n // ignore\n }\n }\n previouslyFocused = null;\n }\n\n return { activate, deactivate };\n}\n","/**\n * Focus helpers for the auto-hiding controls chrome.\n *\n * The themes keep the controls bar visible while the player matches\n * `:focus-within`, so keyboard users never lose the control they are on.\n * A pointer click focuses that control too, which used to latch the chrome\n * open forever - most visibly after tapping the fullscreen button, the only\n * way into fullscreen. `shouldKeepControlsVisible` tells the auto-hide timer\n * which of the two it is looking at, and `blurFocusInside` releases the\n * pointer-induced focus so `:focus-within` stops matching.\n */\n\n/** Marks an open control menu (settings, quality, captions...). */\nconst OPEN_MENU_SELECTOR = \"[data-reel-menu-open]\";\n\nfunction activeElementInside(container: Element): HTMLElement | null {\n const active = (container.ownerDocument ?? document).activeElement;\n if (!(active instanceof HTMLElement)) return null;\n return container.contains(active) ? active : null;\n}\n\n/**\n * Clears focus from any focused descendant of `container`.\n *\n * Used on pointer leave of the `[data-reel]` wrapper and when the auto-hide\n * timer fires, so `:focus-within` does not keep the controls bar visible\n * after a mouse click or tap on a control.\n */\nexport function blurFocusInside(container: Element): void {\n activeElementInside(container)?.blur();\n}\n\n/**\n * `true` when the controls must stay on screen even though the idle timer\n * expired: an open menu, or a control the user reached with the keyboard.\n *\n * Pointer focus deliberately returns `false` - a tap must not pin the chrome.\n */\nexport function shouldKeepControlsVisible(container: Element): boolean {\n if (container.querySelector(OPEN_MENU_SELECTOR) !== null) return true;\n const active = activeElementInside(container);\n if (!active) return false;\n try {\n return active.matches(\":focus-visible\");\n } catch {\n // Engines without `:focus-visible` (or jsdom) must not latch the chrome.\n return false;\n }\n}\n","/**\n * Time helpers shared by the seek bar, transcript markers (G8), and the\n * keyboard / commands layer.\n */\n\nconst TIME_RE = /^(?:(\\d+):)?(\\d{1,2}):(\\d{1,2})(?:\\.(\\d+))?$/;\n\n/**\n * Parse a time string like `\"00:01:23\"`, `\"1:23\"`, `\"00:01:23.456\"` to seconds.\n * Returns `NaN` for invalid input — callers should guard.\n *\n * Accepted forms:\n * - `\"H:MM:SS\"` / `\"H:MM:SS.fff\"`\n * - `\"M:SS\"` / `\"MM:SS\"` / `\"MM:SS.fff\"`\n *\n * Anything else (including bare numbers, negative values, NaN strings) is\n * `NaN`. Callers that want to accept numbers SHOULD test `typeof === \"number\"`\n * first.\n */\nexport function parseTime(input: string): number {\n if (typeof input !== \"string\") return Number.NaN;\n const trimmed = input.trim();\n const match = TIME_RE.exec(trimmed);\n if (!match) return Number.NaN;\n const [, hStr, mStr, sStr, fracStr] = match;\n const h = hStr ? Number.parseInt(hStr, 10) : 0;\n const m = Number.parseInt(mStr ?? \"0\", 10);\n const s = Number.parseInt(sStr ?? \"0\", 10);\n const frac = fracStr ? Number.parseFloat(`0.${fracStr}`) : 0;\n if (m > 59 || s > 59) return Number.NaN;\n return h * 3600 + m * 60 + s + frac;\n}\n\n/**\n * Format seconds to `H:MM:SS` (when ≥ 1h) or `MM:SS` (otherwise). NaN /\n * negative inputs are coerced to `0:00`.\n *\n * The ARIA-friendly verbose form (`\"1 hour 2 minutes\"`) is the adapter's job.\n */\nexport function formatTime(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return \"0:00\";\n const total = Math.floor(seconds);\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = total % 60;\n const pad = (n: number, len = 2): string => n.toString().padStart(len, \"0\");\n if (h > 0) return `${h}:${pad(m)}:${pad(s)}`;\n return `${m}:${pad(s)}`;\n}\n\n/**\n * Coerce a time-like input to seconds. Accepts numbers, formatted strings,\n * and clamps negatives to 0.\n *\n * Returns `NaN` if the input cannot be coerced (so callers can refuse to\n * call `seekTo` rather than seeking to 0 silently).\n */\nexport function toSeconds(input: number | string): number {\n if (typeof input === \"number\") {\n if (!Number.isFinite(input)) return Number.NaN;\n return input < 0 ? 0 : input;\n }\n return parseTime(input);\n}\n"]}