@frame-by-frame/core 1.0.0-rc.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-controller-jGcw6iqQ.js","names":["#listeners","#reportAsyncError","clampProgress","isRecord","clampProgress","isRecord","isRecord","#program","#dependencies","#events","#axes","#bindings","#handleScroll","#status","#enabled","#hidden","#applySnapshot","#emitUpdate","#transitionToRuntimeError","#config","#assertNotDestroyed","#mountPromise","#mountGeneration","#lastError","#performMount","#handleMountFailure","#scheduler","#subscribe","#unsubscribeFromSource","#assertMediaLifecycle","#selectBindings","#getMountedRenderer","#getBinding","#source","#activeBreakpoints","#prefersReducedMotion","#destroyEnvironment","#destroyRenderers","#handleMediaChange","#handleResize","#handleVisibilityChange","#environment","#adoptConfig","#createRenderers","#applyRendererActivity","#handleRendererEvent","#getRendererActivity","#applyResponsiveConfig","#syncSubscription","#unsubscribe","#dependencies","#entries","#createEntry","#release","#load","#publish","#readBlob","#handle","#target","#onEvent","#snapshot","#waiters","#readinessWaiters","#dependencies","#viewportTarget","#fullAssets","#loadProgress","#config","#activity","#autoLoad","#prepareAllFullClips","#stopObserving","#activate","#assertNotDestroyed","#observeNearViewport","#rejectWaiters","#activeClipId","#selectedSource","#supersedeReadiness","#releaseFullAssets","#desired","#resetSource","#manualUnload","#cancelFrameObservation","#startConfiguredLoadingPolicy","#destroyed","#loadState","#beginDesiredClip","#requestSeek","#error","#discardFullAsset","#readinessGeneration","#readinessTasks","#duration","#appliedTime","#presentedTime","#seeking","#rejectReadinessWaiters","#ensureFullAsset","#playableSources","#loadFullAssetCandidates","#emit","#publishProgress","#waitForReadiness","#hasReadiness","#fail","#candidateSources","#candidateIndex","#startFullCandidate","#startCandidate","#prepareCandidate","#isCurrentGeneration","#loadTargetSource","#generation","#removeSourceListeners","#seekInFlight","#pendingSeek","#applyClipAttributes","#attachSourceListeners","#handleSourceFailure","#handleLoadedMetadata","#handleLoadedData","#handleSeeked","#resolveWaiters","#resolveReadinessWaiters","#supportsVideoFrameCallback","#scheduleFrameObservation","#presentFrame","#applySeek","#frameToken","#frameHandle","isRecord","getGlobalDocument","#owners","#source","#reportAsyncError","#subscribers","#handleScroll","#schedule","#handleFrame","#frameHandle","#xMax","#yMax","#schedulers"],"sources":["../src/core/event-emitter.ts","../src/core/errors.ts","../src/mapping/easing.ts","../src/mapping/normalize-timeline.ts","../src/mapping/timeline.ts","../src/core/controller-config.ts","../src/responsive/environment-observer.ts","../src/core/controller.ts","../src/media/asset-cache.ts","../src/media/video-renderer.ts","../src/media/video-target.ts","../src/scroll/source.ts","../src/scroll/source-scheduler.ts","../src/core/public-controller.ts"],"sourcesContent":["import type { AsyncErrorReporter } from '../scroll/source-scheduler.js';\n\n/** Small typed emitter that isolates failures from individual listeners. */\nexport class EventEmitter<EventMap extends object> {\n readonly #listeners = new Map<keyof EventMap, Set<(payload: never) => void>>();\n readonly #reportAsyncError: AsyncErrorReporter;\n\n constructor(reportAsyncError: AsyncErrorReporter) {\n this.#reportAsyncError = reportAsyncError;\n }\n\n on<EventName extends keyof EventMap>(\n event: EventName,\n listener: (payload: EventMap[EventName]) => void,\n ): () => void {\n let listeners = this.#listeners.get(event);\n\n if (listeners === undefined) {\n listeners = new Set();\n this.#listeners.set(event, listeners);\n }\n\n const storedListener = listener as (payload: never) => void;\n listeners.add(storedListener);\n let active = true;\n\n return (): void => {\n if (!active) {\n return;\n }\n\n active = false;\n listeners.delete(storedListener);\n };\n }\n\n emit<EventName extends keyof EventMap>(event: EventName, payload: EventMap[EventName]): void {\n const listeners = this.#listeners.get(event);\n\n if (listeners === undefined) {\n return;\n }\n\n for (const listener of [...listeners]) {\n try {\n listener(payload as never);\n } catch (error) {\n this.#reportAsyncError(error);\n }\n }\n }\n\n clear(): void {\n this.#listeners.clear();\n }\n}\n","import type {\n FrameByFrameErrorCode,\n FrameByFrameErrorDetails,\n FrameByFrameErrorInfo,\n FrameByFrameErrorOptions,\n} from '../types.js';\n\n/** An error with a stable package-specific code and structured context. */\nexport class FrameByFrameError extends Error implements FrameByFrameErrorInfo {\n override readonly name = 'FrameByFrameError' as const;\n override readonly cause: unknown;\n readonly code: FrameByFrameErrorCode;\n readonly details: FrameByFrameErrorDetails | undefined;\n\n constructor(\n code: FrameByFrameErrorCode,\n message: string,\n options: FrameByFrameErrorOptions = {},\n ) {\n super(message, options.cause === undefined ? undefined : { cause: options.cause });\n this.cause = options.cause;\n this.code = code;\n this.details =\n options.details === undefined ? undefined : Object.freeze({ ...options.details });\n }\n}\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport type { Easing, EasingFunction } from '../types.js';\n\nconst clampProgress = (progress: number): number => Math.min(1, Math.max(0, progress));\n\nconst sampleBezier = (parameter: number, firstControl: number, secondControl: number): number => {\n const inverse = 1 - parameter;\n\n return (\n 3 * inverse * inverse * parameter * firstControl +\n 3 * inverse * parameter * parameter * secondControl +\n parameter * parameter * parameter\n );\n};\n\nconst createCubicBezier = (x1: number, y1: number, x2: number, y2: number): EasingFunction => {\n return (progress: number): number => {\n const x = clampProgress(progress);\n\n if (x === 0 || x === 1) {\n return x;\n }\n\n let lower = 0;\n let upper = 1;\n let parameter = x;\n\n for (let iteration = 0; iteration < 24; iteration += 1) {\n const sampledX = sampleBezier(parameter, x1, x2);\n\n if (Math.abs(sampledX - x) <= 1e-7) {\n break;\n }\n\n if (sampledX < x) {\n lower = parameter;\n } else {\n upper = parameter;\n }\n\n parameter = (lower + upper) / 2;\n }\n\n return clampProgress(sampleBezier(parameter, y1, y2));\n };\n};\n\nconst namedEasing = {\n linear: (progress: number): number => progress,\n 'ease-in': createCubicBezier(0.42, 0, 1, 1),\n 'ease-out': createCubicBezier(0, 0, 0.58, 1),\n 'ease-in-out': createCubicBezier(0.42, 0, 0.58, 1),\n} satisfies Readonly<Record<string, EasingFunction>>;\n\nconst invalidEasingDefinition = (easing: unknown, segmentIndex: number | null): never => {\n const scope = segmentIndex === null ? 'timeline' : `segment at index ${String(segmentIndex)}`;\n\n throw new FrameByFrameError(\n segmentIndex === null ? 'INVALID_TIMELINE' : 'INVALID_SEGMENT',\n `The ${scope} has an unsupported easing definition.`,\n {\n details: {\n easing,\n segmentIndex,\n },\n },\n );\n};\n\nexport function assertEasingDefinition(\n easing: unknown,\n segmentIndex: number | null,\n): asserts easing is Easing | undefined {\n if (easing === undefined || typeof easing === 'function') {\n return;\n }\n\n if (typeof easing !== 'string' || !Object.hasOwn(namedEasing, easing)) {\n invalidEasingDefinition(easing, segmentIndex);\n }\n}\n\nexport const resolveEasing = (easing: Easing | undefined, segmentIndex: number): EasingFunction => {\n if (easing === undefined) {\n return namedEasing.linear;\n }\n\n if (typeof easing === 'string') {\n return namedEasing[easing];\n }\n\n return (progress: number): number => {\n let result: number;\n\n try {\n result = easing(clampProgress(progress));\n } catch (cause) {\n throw new FrameByFrameError(\n 'INVALID_EASING_RESULT',\n `The custom easing for segment at index ${String(segmentIndex)} threw an error.`,\n {\n cause,\n details: {\n progress,\n segmentIndex,\n },\n },\n );\n }\n\n if (!Number.isFinite(result)) {\n throw new FrameByFrameError(\n 'INVALID_EASING_RESULT',\n `The custom easing for segment at index ${String(segmentIndex)} returned a non-finite value.`,\n {\n details: {\n progress,\n result,\n segmentIndex,\n },\n },\n );\n }\n\n return clampProgress(result);\n };\n};\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport { assertEasingDefinition, resolveEasing } from './easing.js';\n\nimport type { EasingFunction, ScrollUnit, TimelineOptions } from '../types.js';\n\nexport interface NormalizedSegment {\n readonly sourceIndex: number;\n readonly scrollStart: number;\n readonly scrollEnd: number;\n readonly mediaStart: number;\n readonly mediaEnd: number;\n readonly clipId: string | null;\n readonly easing: EasingFunction;\n}\n\nexport interface NormalizedTimeline {\n readonly unit: ScrollUnit;\n readonly segments: readonly NormalizedSegment[];\n readonly frameRate: number | null;\n}\n\ninterface RuntimeSegment {\n readonly scroll?: unknown;\n readonly media?: unknown;\n readonly scrollUnit?: unknown;\n readonly clip?: unknown;\n readonly easing?: unknown;\n}\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null;\n\nconst invalidTimeline = (message: string, details: Readonly<Record<string, unknown>>): never => {\n throw new FrameByFrameError('INVALID_TIMELINE', message, { details });\n};\n\nconst invalidSegment = (\n index: number,\n message: string,\n details: Readonly<Record<string, unknown>>,\n): never => {\n throw new FrameByFrameError('INVALID_SEGMENT', message, {\n details: {\n ...details,\n segmentIndex: index,\n },\n });\n};\n\nconst readSegment = (value: unknown, segmentIndex: number): RuntimeSegment => {\n if (!isRecord(value)) {\n return invalidSegment(segmentIndex, 'Each timeline segment must be an object.', {\n segment: value,\n });\n }\n\n return value;\n};\n\nconst readTuple = (\n value: unknown,\n field: 'scroll' | 'media',\n segmentIndex: number,\n): readonly [number, number] => {\n if (!Array.isArray(value) || value.length !== 2) {\n return invalidSegment(segmentIndex, `Segment ${field} must contain exactly two numbers.`, {\n field,\n value,\n });\n }\n\n const tuple = value as readonly unknown[];\n const start = tuple[0];\n const end = tuple[1];\n\n if (typeof start !== 'number' || !Number.isFinite(start)) {\n return invalidSegment(segmentIndex, `Segment ${field} start must be finite.`, {\n field,\n value: start,\n });\n }\n\n if (typeof end !== 'number' || !Number.isFinite(end)) {\n return invalidSegment(segmentIndex, `Segment ${field} end must be finite.`, {\n field,\n value: end,\n });\n }\n\n return [start, end];\n};\n\nconst readUnit = (value: unknown, segmentIndex: number): ScrollUnit => {\n if (value === undefined) {\n return 'px';\n }\n\n if (value !== 'px' && value !== 'progress') {\n return invalidSegment(segmentIndex, 'Segment scrollUnit must be \"px\" or \"progress\".', {\n scrollUnit: value,\n });\n }\n\n return value;\n};\n\nconst readClipId = (value: unknown, segmentIndex: number): string | null => {\n if (value === undefined) {\n return null;\n }\n\n if (typeof value !== 'string' || value.trim().length === 0) {\n return invalidSegment(segmentIndex, 'Segment clip must be a non-empty string.', {\n clip: value,\n });\n }\n\n return value;\n};\n\nconst readFrameRate = (value: unknown): number | null => {\n if (value === undefined) {\n return null;\n }\n\n if (!isRecord(value)) {\n throw new FrameByFrameError('INVALID_FRAME_RATE', 'Frame configuration must be an object.', {\n details: { frame: value },\n });\n }\n\n if (value['snap'] === undefined || value['snap'] === false) {\n if (value['fps'] !== undefined) {\n throw new FrameByFrameError(\n 'INVALID_FRAME_RATE',\n 'Frame rate may only be provided when frame snapping is enabled.',\n { details: { frame: value } },\n );\n }\n\n return null;\n }\n\n if (\n value['snap'] !== true ||\n typeof value['fps'] !== 'number' ||\n !Number.isFinite(value['fps'])\n ) {\n throw new FrameByFrameError(\n 'INVALID_FRAME_RATE',\n 'Frame snapping requires a finite, positive fps value.',\n { details: { frame: value } },\n );\n }\n\n if (value['fps'] <= 0) {\n throw new FrameByFrameError(\n 'INVALID_FRAME_RATE',\n 'Frame snapping requires a finite, positive fps value.',\n { details: { frame: value } },\n );\n }\n\n return value['fps'];\n};\n\nexport const normalizeTimeline = (options: TimelineOptions): NormalizedTimeline => {\n if (!isRecord(options)) {\n return invalidTimeline('Timeline options must be an object.', { options });\n }\n\n const segmentsValue: unknown = options.segments;\n\n if (!Array.isArray(segmentsValue) || segmentsValue.length === 0) {\n return invalidTimeline('A timeline requires at least one segment.', {\n segments: segmentsValue,\n });\n }\n\n assertEasingDefinition(options.easing, null);\n\n const defaultEasing = options.easing;\n let timelineUnit: ScrollUnit | undefined;\n const normalizedSegments: NormalizedSegment[] = [];\n const segmentValues = segmentsValue as readonly unknown[];\n\n for (const [sourceIndex, segmentValue] of segmentValues.entries()) {\n const segment = readSegment(segmentValue, sourceIndex);\n const scroll = readTuple(segment.scroll, 'scroll', sourceIndex);\n const media = readTuple(segment.media, 'media', sourceIndex);\n const unit = readUnit(segment.scrollUnit, sourceIndex);\n\n if (timelineUnit === undefined) {\n timelineUnit = unit;\n } else if (timelineUnit !== unit) {\n return invalidTimeline('All segments in a timeline must use the same scroll unit.', {\n expectedUnit: timelineUnit,\n receivedUnit: unit,\n segmentIndex: sourceIndex,\n });\n }\n\n if (scroll[1] <= scroll[0]) {\n invalidSegment(sourceIndex, 'Segment scroll intervals must be strictly increasing.', {\n scroll,\n });\n }\n\n if (unit === 'progress' && (scroll[0] < 0 || scroll[1] > 1)) {\n invalidSegment(sourceIndex, 'Progress segment boundaries must stay between 0 and 1.', {\n scroll,\n });\n }\n\n if (media[0] < 0 || media[1] < 0) {\n invalidSegment(sourceIndex, 'Segment media times cannot be negative.', { media });\n }\n\n const segmentEasing: unknown = segment.easing;\n assertEasingDefinition(segmentEasing, sourceIndex);\n\n const easingDefinition = segmentEasing ?? defaultEasing;\n\n normalizedSegments.push({\n sourceIndex,\n scrollStart: scroll[0],\n scrollEnd: scroll[1],\n mediaStart: media[0],\n mediaEnd: media[1],\n clipId: readClipId(segment.clip, sourceIndex),\n easing: resolveEasing(easingDefinition, sourceIndex),\n });\n }\n\n normalizedSegments.sort(\n (left, right): number =>\n left.scrollStart - right.scrollStart ||\n left.scrollEnd - right.scrollEnd ||\n left.sourceIndex - right.sourceIndex,\n );\n\n for (let index = 1; index < normalizedSegments.length; index += 1) {\n const previous = normalizedSegments[index - 1];\n const current = normalizedSegments[index];\n\n if (\n previous !== undefined &&\n current !== undefined &&\n current.scrollStart < previous.scrollEnd\n ) {\n throw new FrameByFrameError(\n 'OVERLAPPING_SEGMENTS',\n `Segments at indexes ${String(previous.sourceIndex)} and ${String(current.sourceIndex)} overlap.`,\n {\n details: {\n currentSegmentIndex: current.sourceIndex,\n previousSegmentIndex: previous.sourceIndex,\n },\n },\n );\n }\n }\n\n return {\n unit: timelineUnit ?? 'px',\n segments: normalizedSegments,\n frameRate: readFrameRate(options.frame),\n };\n};\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport { normalizeTimeline } from './normalize-timeline.js';\n\nimport type { NormalizedSegment, NormalizedTimeline } from './normalize-timeline.js';\nimport type { Timeline, TimelineOptions, TimelineResolution } from '../types.js';\n\nconst clampProgress = (progress: number): number => Math.min(1, Math.max(0, progress));\n\nconst snapTime = (time: number, frameRate: number | null): number =>\n frameRate === null ? time : Math.round(time * frameRate) / frameRate;\n\nconst createHeldResolution = (\n phase: 'before' | 'gap' | 'after',\n segment: NormalizedSegment,\n requestedTime: number,\n frameRate: number | null,\n): TimelineResolution => ({\n phase,\n segmentIndex: null,\n clipId: segment.clipId,\n rawProgress: null,\n easedProgress: null,\n requestedTime,\n targetTime: snapTime(requestedTime, frameRate),\n});\n\nconst createActiveResolution = (\n segment: NormalizedSegment,\n position: number,\n frameRate: number | null,\n): TimelineResolution => {\n const rawProgress = clampProgress(\n (position - segment.scrollStart) / (segment.scrollEnd - segment.scrollStart),\n );\n const easedProgress = segment.easing(rawProgress);\n const requestedTime =\n segment.mediaStart + easedProgress * (segment.mediaEnd - segment.mediaStart);\n\n return {\n phase: 'active',\n segmentIndex: segment.sourceIndex,\n clipId: segment.clipId,\n rawProgress,\n easedProgress,\n requestedTime,\n targetTime: snapTime(requestedTime, frameRate),\n };\n};\n\nconst findLastStartedSegment = (\n segments: readonly NormalizedSegment[],\n position: number,\n): number => {\n let lower = 0;\n let upper = segments.length;\n\n while (lower < upper) {\n const middle = Math.floor((lower + upper) / 2);\n const segment = segments[middle];\n\n if (segment !== undefined && segment.scrollStart <= position) {\n lower = middle + 1;\n } else {\n upper = middle;\n }\n }\n\n return lower - 1;\n};\n\nconst resolveTimeline = (timeline: NormalizedTimeline, position: number): TimelineResolution => {\n if (!Number.isFinite(position)) {\n throw new FrameByFrameError('INVALID_TIMELINE', 'Timeline position must be finite.', {\n details: { position },\n });\n }\n\n const first = timeline.segments[0];\n const last = timeline.segments[timeline.segments.length - 1];\n\n if (first === undefined || last === undefined) {\n throw new FrameByFrameError('INVALID_TIMELINE', 'A timeline requires at least one segment.');\n }\n\n if (position < first.scrollStart) {\n return createHeldResolution('before', first, first.mediaStart, timeline.frameRate);\n }\n\n if (position > last.scrollEnd) {\n return createHeldResolution('after', last, last.mediaEnd, timeline.frameRate);\n }\n\n const candidateIndex = findLastStartedSegment(timeline.segments, position);\n const candidate = timeline.segments[candidateIndex];\n\n if (candidate === undefined) {\n return createHeldResolution('before', first, first.mediaStart, timeline.frameRate);\n }\n\n if (position <= candidate.scrollEnd) {\n return createActiveResolution(candidate, position, timeline.frameRate);\n }\n\n return createHeldResolution('gap', candidate, candidate.mediaEnd, timeline.frameRate);\n};\n\n/** Creates an immutable, DOM-independent scroll-to-media timeline. */\nexport const createTimeline = (options: TimelineOptions): Timeline => {\n const normalized = normalizeTimeline(options);\n\n return Object.freeze({\n unit: normalized.unit,\n resolve: (position: number): TimelineResolution => resolveTimeline(normalized, position),\n });\n};\n","import { createTimeline } from '../mapping/timeline.js';\nimport { FrameByFrameError } from './errors.js';\n\nimport type {\n AxisName,\n CanvasFit,\n CanvasFrameByFrameOptions,\n FrameByFrameAxisConfig,\n FrameByFrameOptions,\n MediaCrossOrigin,\n ReducedMotionBehavior,\n RendererType,\n Timeline,\n TimelineOptions,\n VideoPreload,\n VideoLoadingTrigger,\n} from '../types.js';\n\nexport interface ControllerVideoSourceConfig {\n readonly src: string;\n readonly type: string | null;\n}\n\nexport interface ControllerVideoClipConfig {\n readonly id: string;\n readonly sources: readonly ControllerVideoSourceConfig[];\n readonly poster: string | null;\n readonly crossOrigin: MediaCrossOrigin | null;\n readonly preload: VideoPreload;\n}\n\nexport interface ControllerVideoOptions {\n readonly muted: boolean | undefined;\n readonly playsInline: boolean | undefined;\n readonly controls: boolean | undefined;\n readonly loop: boolean | undefined;\n}\n\nexport interface ControllerCanvasOptions {\n readonly fit: CanvasFit;\n readonly pixelRatio: number | 'device';\n readonly imageSmoothingEnabled: boolean;\n readonly decoderTarget: unknown;\n}\n\nexport interface ControllerLoadingConfig {\n readonly mode: 'immediate' | 'on-demand';\n readonly trigger: VideoLoadingTrigger | null;\n readonly rootMargin: string | null;\n readonly credentials: RequestCredentials;\n readonly cache: RequestCache;\n}\n\nexport interface ControllerBindingConfig {\n readonly id: string;\n readonly axis: AxisName;\n readonly renderer: RendererType;\n readonly timeline: Timeline;\n readonly startPosition: number;\n readonly endPosition: number;\n readonly target: unknown;\n readonly mountTo: unknown;\n readonly clips: readonly ControllerVideoClipConfig[];\n readonly loading: ControllerLoadingConfig;\n readonly video: ControllerVideoOptions;\n readonly canvas: ControllerCanvasOptions | null;\n readonly timeEpsilon: number;\n readonly decoderSignature: string;\n readonly mediaSignature: string;\n readonly definition: Readonly<Record<string, unknown>>;\n}\n\nexport interface ControllerAxisConfig {\n readonly enabled: boolean;\n readonly bindings: readonly ControllerBindingConfig[];\n}\n\nexport interface ControllerConfig {\n readonly source: unknown;\n readonly axes: Readonly<Partial<Record<AxisName, ControllerAxisConfig>>>;\n readonly bindings: readonly ControllerBindingConfig[];\n}\n\nexport interface ControllerBreakpointConfig {\n readonly id: string;\n readonly query: string;\n readonly override: Readonly<Record<string, unknown>>;\n}\n\nexport interface ControllerProgram {\n readonly base: ControllerConfig;\n readonly breakpoints: readonly ControllerBreakpointConfig[];\n readonly reducedMotion: ReducedMotionBehavior;\n readonly supportedRenderers: ReadonlySet<RendererType>;\n}\n\ntype ControllerInputOptions = FrameByFrameOptions | CanvasFrameByFrameOptions;\n\nconst AXES = ['x', 'y'] as const;\nconst CROSS_ORIGIN_VALUES = ['', 'anonymous', 'use-credentials'] as const;\nconst PRELOAD_VALUES = ['none', 'metadata', 'auto', 'full'] as const;\nconst LOADING_MODES = ['immediate', 'on-demand'] as const;\nconst LOADING_TRIGGERS = ['manual', 'target-near-viewport', 'first-use'] as const;\nconst REQUEST_CREDENTIALS = ['omit', 'same-origin', 'include'] as const;\nconst REQUEST_CACHE = [\n 'default',\n 'no-store',\n 'reload',\n 'no-cache',\n 'force-cache',\n 'only-if-cached',\n] as const;\nconst REDUCED_MOTION_BEHAVIORS = ['first-frame', 'last-frame', 'disable', 'ignore'] as const;\nconst BREAKPOINT_KEYS = ['id', 'query', 'override'] as const;\nconst BREAKPOINT_OVERRIDE_KEYS = ['axes'] as const;\nconst AXIS_OVERRIDE_KEYS = ['enabled', 'bindings'] as const;\nconst VIDEO_BINDING_OVERRIDE_KEYS = [\n 'id',\n 'segments',\n 'clips',\n 'easing',\n 'frame',\n 'loading',\n 'video',\n 'seek',\n] as const;\nconst CANVAS_BINDING_OVERRIDE_KEYS = [...VIDEO_BINDING_OVERRIDE_KEYS, 'canvas'] as const;\nconst CANVAS_FITS = ['contain', 'cover', 'fill', 'none'] as const;\nconst CANVAS_OVERRIDE_KEYS = ['fit', 'pixelRatio', 'imageSmoothingEnabled'] as const;\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null;\n\nconst invalidController = (message: string, details: Readonly<Record<string, unknown>>): never => {\n throw new FrameByFrameError('INVALID_CONTROLLER', message, { details });\n};\n\nconst invalidMediaConfig = (\n bindingId: string,\n message: string,\n details: Readonly<Record<string, unknown>>,\n): never => {\n throw new FrameByFrameError('INVALID_MEDIA_CONFIG', message, {\n details: { ...details, bindingId },\n });\n};\n\nconst invalidBreakpoint = (\n message: string,\n details: Readonly<Record<string, unknown>>,\n cause?: unknown,\n): never => {\n throw new FrameByFrameError('INVALID_BREAKPOINT_CONFIG', message, { cause, details });\n};\n\nconst cloneTuple = (value: unknown): unknown =>\n Array.isArray(value) ? Object.freeze([...(value as unknown[])]) : value;\n\nconst cloneSegments = (value: unknown): unknown => {\n if (!Array.isArray(value)) {\n return value;\n }\n\n return Object.freeze(\n (value as unknown[]).map((segment: unknown): unknown =>\n isRecord(segment)\n ? Object.freeze({\n ...segment,\n scroll: cloneTuple(segment['scroll']),\n media: cloneTuple(segment['media']),\n })\n : segment,\n ),\n );\n};\n\nconst cloneClips = (value: unknown): unknown => {\n if (!Array.isArray(value)) {\n return value;\n }\n\n return Object.freeze(\n (value as unknown[]).map((clip: unknown): unknown =>\n isRecord(clip)\n ? Object.freeze({\n ...clip,\n sources: Array.isArray(clip['sources'])\n ? Object.freeze(\n (clip['sources'] as unknown[]).map((source: unknown): unknown =>\n isRecord(source) ? Object.freeze({ ...source }) : source,\n ),\n )\n : clip['sources'],\n })\n : clip,\n ),\n );\n};\n\nconst cloneOption = (value: unknown): unknown =>\n isRecord(value) ? Object.freeze({ ...value }) : value;\n\nconst createBindingDefinition = (\n value: Readonly<Record<string, unknown>>,\n axis: AxisName,\n): Readonly<Record<string, unknown>> =>\n Object.freeze({\n id: value['id'],\n axis,\n ...(value['renderer'] === undefined ? {} : { renderer: value['renderer'] }),\n ...(value['target'] === undefined ? {} : { target: value['target'] }),\n ...(value['mountTo'] === undefined ? {} : { mountTo: value['mountTo'] }),\n segments: cloneSegments(value['segments']),\n clips: cloneClips(value['clips']),\n ...(value['easing'] === undefined ? {} : { easing: value['easing'] }),\n ...(value['frame'] === undefined ? {} : { frame: cloneOption(value['frame']) }),\n ...(value['loading'] === undefined ? {} : { loading: cloneOption(value['loading']) }),\n ...(value['video'] === undefined ? {} : { video: cloneOption(value['video']) }),\n ...(value['canvas'] === undefined ? {} : { canvas: cloneOption(value['canvas']) }),\n ...(value['seek'] === undefined ? {} : { seek: cloneOption(value['seek']) }),\n });\n\nconst readAxis = (value: unknown, axis: AxisName): FrameByFrameAxisConfig => {\n if (!isRecord(value)) {\n return invalidController(`Axis \"${axis}\" must be an object or false.`, { axis, value });\n }\n\n if (value['enabled'] !== undefined && typeof value['enabled'] !== 'boolean') {\n return invalidController(`Axis \"${axis}\" enabled must be a boolean.`, {\n axis,\n enabled: value['enabled'],\n });\n }\n\n if (!Array.isArray(value['bindings']) || value['bindings'].length === 0) {\n return invalidController(`Axis \"${axis}\" requires at least one binding.`, {\n axis,\n bindings: value['bindings'],\n });\n }\n\n return value as unknown as FrameByFrameAxisConfig;\n};\n\nconst isElementReference = (value: unknown): boolean =>\n typeof value === 'function' ||\n (typeof value === 'string' && value.trim().length > 0) ||\n isRecord(value);\n\nconst compileSource = (\n value: unknown,\n bindingId: string,\n clipId: string,\n sourceIndex: number,\n): ControllerVideoSourceConfig => {\n if (!isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Each video source must be an object.', {\n clipId,\n source: value,\n sourceIndex,\n });\n }\n\n const src = value['src'];\n const type = value['type'];\n\n if (typeof src !== 'string' || src.trim().length === 0) {\n return invalidMediaConfig(bindingId, 'Video source src must be a non-empty string.', {\n clipId,\n sourceIndex,\n src,\n });\n }\n\n if (type !== undefined && (typeof type !== 'string' || type.trim().length === 0)) {\n return invalidMediaConfig(bindingId, 'Video source type must be a non-empty string.', {\n clipId,\n sourceIndex,\n type,\n });\n }\n\n return Object.freeze({ src, type: type ?? null });\n};\n\nconst compileClip = (\n value: unknown,\n bindingId: string,\n clipIndex: number,\n): ControllerVideoClipConfig => {\n if (!isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Each video clip must be an object.', {\n clip: value,\n clipIndex,\n });\n }\n\n const id = value['id'];\n const sources = value['sources'];\n const poster = value['poster'];\n const crossOrigin = value['crossOrigin'];\n const preload = value['preload'];\n\n if (typeof id !== 'string' || id.trim().length === 0) {\n return invalidMediaConfig(bindingId, 'Each video clip requires a non-empty string ID.', {\n clipId: id,\n clipIndex,\n });\n }\n\n if (!Array.isArray(sources) || sources.length === 0) {\n return invalidMediaConfig(bindingId, `Video clip \"${id}\" requires at least one source.`, {\n clipId: id,\n sources,\n });\n }\n\n if (poster !== undefined && (typeof poster !== 'string' || poster.trim().length === 0)) {\n return invalidMediaConfig(bindingId, 'Video clip poster must be a non-empty string.', {\n clipId: id,\n poster,\n });\n }\n\n if (crossOrigin !== undefined && !CROSS_ORIGIN_VALUES.includes(crossOrigin as MediaCrossOrigin)) {\n return invalidMediaConfig(bindingId, 'Video clip crossOrigin is invalid.', {\n clipId: id,\n crossOrigin,\n });\n }\n\n if (preload !== undefined && !PRELOAD_VALUES.includes(preload as VideoPreload)) {\n return invalidMediaConfig(bindingId, 'Video clip preload is invalid.', {\n clipId: id,\n preload,\n });\n }\n\n return Object.freeze({\n id,\n sources: Object.freeze(\n sources.map((source, sourceIndex) => compileSource(source, bindingId, id, sourceIndex)),\n ),\n poster: poster ?? null,\n crossOrigin: (crossOrigin as MediaCrossOrigin | undefined) ?? null,\n preload: (preload as VideoPreload | undefined) ?? 'metadata',\n });\n};\n\nconst compileClips = (value: unknown, bindingId: string): readonly ControllerVideoClipConfig[] => {\n if (!Array.isArray(value) || value.length === 0) {\n return invalidMediaConfig(bindingId, 'Each binding requires at least one video clip.', {\n clips: value,\n });\n }\n\n const ids = new Set<string>();\n const clips = value.map((clip, clipIndex) => compileClip(clip, bindingId, clipIndex));\n\n for (const clip of clips) {\n if (ids.has(clip.id)) {\n return invalidMediaConfig(bindingId, `Video clip ID \"${clip.id}\" is duplicated.`, {\n clipId: clip.id,\n });\n }\n\n ids.add(clip.id);\n }\n\n return Object.freeze(clips);\n};\n\nconst compileVideoOptions = (value: unknown, bindingId: string): ControllerVideoOptions => {\n if (value !== undefined && !isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Video options must be an object.', { video: value });\n }\n\n const options = value ?? {};\n const fields = ['muted', 'playsInline', 'controls', 'loop'] as const;\n\n for (const field of fields) {\n if (options[field] !== undefined && typeof options[field] !== 'boolean') {\n return invalidMediaConfig(bindingId, `Video option \"${field}\" must be a boolean.`, {\n field,\n value: options[field],\n });\n }\n }\n\n return Object.freeze({\n muted: options['muted'] as boolean | undefined,\n playsInline: options['playsInline'] as boolean | undefined,\n controls: options['controls'] as boolean | undefined,\n loop: options['loop'] as boolean | undefined,\n });\n};\n\nconst compileCanvasOptions = (\n value: unknown,\n bindingId: string,\n renderer: RendererType,\n): ControllerCanvasOptions | null => {\n if (renderer === 'video') {\n if (value !== undefined) {\n return invalidMediaConfig(bindingId, 'Canvas options require renderer \"canvas\".', {\n canvas: value,\n });\n }\n\n return null;\n }\n\n if (value !== undefined && !isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Canvas options must be an object.', { canvas: value });\n }\n\n const options = value ?? {};\n const fit = options['fit'] ?? 'contain';\n const pixelRatio = options['pixelRatio'] ?? 'device';\n const imageSmoothingEnabled = options['imageSmoothingEnabled'] ?? true;\n const decoderTarget = options['decoderTarget'];\n\n if (!CANVAS_FITS.includes(fit as CanvasFit)) {\n return invalidMediaConfig(bindingId, 'Canvas fit is invalid.', { fit });\n }\n\n if (\n pixelRatio !== 'device' &&\n (typeof pixelRatio !== 'number' || !Number.isFinite(pixelRatio) || pixelRatio <= 0)\n ) {\n return invalidMediaConfig(\n bindingId,\n 'Canvas pixelRatio must be \"device\" or finite and positive.',\n {\n pixelRatio,\n },\n );\n }\n\n if (typeof imageSmoothingEnabled !== 'boolean') {\n return invalidMediaConfig(bindingId, 'Canvas imageSmoothingEnabled must be a boolean.', {\n imageSmoothingEnabled,\n });\n }\n\n if (decoderTarget !== undefined && !isElementReference(decoderTarget)) {\n return invalidMediaConfig(\n bindingId,\n 'Canvas decoderTarget must be an element, selector, or resolver.',\n { decoderTarget },\n );\n }\n\n return Object.freeze({\n fit: fit as CanvasFit,\n pixelRatio,\n imageSmoothingEnabled,\n decoderTarget,\n });\n};\n\nconst compileLoading = (\n value: unknown,\n bindingId: string,\n clips: readonly ControllerVideoClipConfig[],\n): ControllerLoadingConfig => {\n if (value !== undefined && !isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Loading options must be an object.', { loading: value });\n }\n\n const options = value ?? {};\n const mode = options['mode'] ?? 'immediate';\n const trigger = options['trigger'];\n const rootMargin = options['rootMargin'];\n const credentials = options['credentials'] ?? 'same-origin';\n const cache = options['cache'] ?? 'default';\n\n if (!LOADING_MODES.includes(mode as (typeof LOADING_MODES)[number])) {\n return invalidMediaConfig(bindingId, 'Loading mode is invalid.', { mode });\n }\n\n if (mode === 'on-demand') {\n if (!LOADING_TRIGGERS.includes(trigger as VideoLoadingTrigger)) {\n return invalidMediaConfig(bindingId, 'On-demand loading requires an explicit trigger.', {\n trigger,\n });\n }\n } else if (trigger !== undefined) {\n return invalidMediaConfig(bindingId, 'Immediate loading cannot declare a trigger.', {\n trigger,\n });\n }\n\n if (rootMargin !== undefined) {\n if (\n mode !== 'on-demand' ||\n trigger !== 'target-near-viewport' ||\n typeof rootMargin !== 'string' ||\n rootMargin.trim().length === 0\n ) {\n return invalidMediaConfig(\n bindingId,\n 'rootMargin is only valid for target-near-viewport loading.',\n { rootMargin, trigger },\n );\n }\n }\n\n if (!REQUEST_CREDENTIALS.includes(credentials as RequestCredentials)) {\n return invalidMediaConfig(bindingId, 'Full preload credentials are invalid.', { credentials });\n }\n\n if (!REQUEST_CACHE.includes(cache as RequestCache)) {\n return invalidMediaConfig(bindingId, 'Full preload cache mode is invalid.', { cache });\n }\n\n const hasFullPreload = clips.some((clip) => clip.preload === 'full');\n\n if (!hasFullPreload && (options['credentials'] !== undefined || options['cache'] !== undefined)) {\n return invalidMediaConfig(\n bindingId,\n 'Fetch credentials and cache options require at least one full-preload clip.',\n { cache: options['cache'], credentials: options['credentials'] },\n );\n }\n\n return Object.freeze({\n mode: mode as 'immediate' | 'on-demand',\n trigger: mode === 'on-demand' ? (trigger as VideoLoadingTrigger) : null,\n rootMargin:\n mode === 'on-demand' && trigger === 'target-near-viewport' ? (rootMargin ?? '0px') : null,\n credentials: credentials as RequestCredentials,\n cache: cache as RequestCache,\n });\n};\n\nconst compileTimeEpsilon = (value: unknown, bindingId: string): number => {\n if (value === undefined) {\n return 0.001;\n }\n\n if (!isRecord(value)) {\n return invalidMediaConfig(bindingId, 'Seek options must be an object.', { seek: value });\n }\n\n const epsilon = value['timeEpsilon'];\n\n if (\n epsilon !== undefined &&\n (typeof epsilon !== 'number' || !Number.isFinite(epsilon) || epsilon < 0)\n ) {\n return invalidMediaConfig(bindingId, 'Seek timeEpsilon must be finite and non-negative.', {\n timeEpsilon: epsilon,\n });\n }\n\n return epsilon ?? 0.001;\n};\n\nconst validateSegmentClips = (\n segments: unknown,\n clips: readonly ControllerVideoClipConfig[],\n bindingId: string,\n): void => {\n if (!Array.isArray(segments)) {\n return;\n }\n\n const clipIds = new Set(clips.map((clip) => clip.id));\n\n for (const [segmentIndex, segment] of segments.entries()) {\n if (!isRecord(segment)) {\n continue;\n }\n\n const clipId = segment['clip'];\n\n if (clips.length > 1 && clipId === undefined) {\n invalidMediaConfig(\n bindingId,\n 'Every segment requires a clip when a binding has multiple clips.',\n {\n segmentIndex,\n },\n );\n }\n\n if (clipId !== undefined && (typeof clipId !== 'string' || !clipIds.has(clipId))) {\n invalidMediaConfig(bindingId, 'Timeline segment references an unknown video clip.', {\n clipId,\n segmentIndex,\n });\n }\n }\n};\n\nconst compileBinding = (\n value: unknown,\n axis: AxisName,\n supportedRenderers: ReadonlySet<RendererType>,\n): ControllerBindingConfig => {\n if (!isRecord(value)) {\n return invalidController('Each controller binding must be an object.', {\n axis,\n binding: value,\n });\n }\n\n const id = value['id'];\n\n if (typeof id !== 'string' || id.trim().length === 0) {\n return invalidController('Each controller binding requires a non-empty string ID.', {\n axis,\n id,\n });\n }\n\n const rendererValue = value['renderer'] ?? 'video';\n\n if (rendererValue !== 'video' && rendererValue !== 'canvas') {\n return invalidMediaConfig(id, 'The configured renderer is not supported.', {\n renderer: value['renderer'],\n });\n }\n\n const renderer: RendererType = rendererValue;\n\n if (!supportedRenderers.has(renderer)) {\n return invalidMediaConfig(\n id,\n renderer === 'canvas'\n ? 'Canvas rendering requires the @frame-by-frame/core/canvas entry point.'\n : 'The configured renderer is not supported.',\n { renderer: value['renderer'] },\n );\n }\n\n const hasTarget = value['target'] !== undefined;\n const hasMountTo = value['mountTo'] !== undefined;\n\n if (hasTarget === hasMountTo) {\n return invalidMediaConfig(id, 'A binding requires exactly one of target or mountTo.', {\n mountTo: value['mountTo'],\n target: value['target'],\n });\n }\n\n const reference = hasTarget ? value['target'] : value['mountTo'];\n\n if (!isElementReference(reference)) {\n return invalidMediaConfig(\n id,\n 'Media target references must be elements, selectors, or resolvers.',\n {\n reference,\n },\n );\n }\n\n const timelineOptions: TimelineOptions = {\n segments: value['segments'] as TimelineOptions['segments'],\n ...(value['easing'] === undefined\n ? {}\n : { easing: value['easing'] as NonNullable<TimelineOptions['easing']> }),\n ...(value['frame'] === undefined\n ? {}\n : { frame: value['frame'] as NonNullable<TimelineOptions['frame']> }),\n };\n const timeline = createTimeline(timelineOptions);\n const clips = compileClips(value['clips'], id);\n validateSegmentClips(value['segments'], clips, id);\n const loading = compileLoading(value['loading'], id, clips);\n const video = compileVideoOptions(value['video'], id);\n const canvas = compileCanvasOptions(value['canvas'], id, renderer);\n const timeEpsilon = compileTimeEpsilon(value['seek'], id);\n const segments = value['segments'] as TimelineOptions['segments'];\n const startPosition = Math.min(...segments.map((segment) => segment.scroll[0]));\n const endPosition = Math.max(...segments.map((segment) => segment.scroll[1]));\n const definition = createBindingDefinition(value, axis);\n const decoderSignature = JSON.stringify({ clips, loading, video, timeEpsilon });\n\n return Object.freeze({\n id,\n axis,\n renderer,\n timeline,\n startPosition,\n endPosition,\n target: hasTarget ? value['target'] : undefined,\n mountTo: hasMountTo ? value['mountTo'] : undefined,\n clips,\n loading,\n video,\n canvas,\n timeEpsilon,\n decoderSignature,\n mediaSignature: JSON.stringify({\n decoderSignature,\n canvas:\n canvas === null\n ? null\n : {\n fit: canvas.fit,\n pixelRatio: canvas.pixelRatio,\n imageSmoothingEnabled: canvas.imageSmoothingEnabled,\n },\n }),\n definition,\n });\n};\n\n/** Validates controller shape and compiles every timeline and media binding at factory time. */\nexport const compileControllerConfig = (\n options: ControllerInputOptions,\n supportedRenderers: ReadonlySet<RendererType> = new Set<RendererType>(['video']),\n): ControllerConfig => {\n if (!isRecord(options)) {\n return invalidController('Controller options must be an object.', { options });\n }\n\n const axesValue: unknown = options.axes;\n\n if (!isRecord(axesValue)) {\n return invalidController('Controller axes must be an object.', { axes: axesValue });\n }\n\n const axes: Partial<Record<AxisName, ControllerAxisConfig>> = {};\n const bindings: ControllerBindingConfig[] = [];\n const ids = new Set<string>();\n\n for (const axisName of AXES) {\n const axisValue = axesValue[axisName];\n\n if (axisValue === undefined || axisValue === false) {\n continue;\n }\n\n const axis = readAxis(axisValue, axisName);\n const axisBindings = axis.bindings.map((binding) =>\n compileBinding(binding, axisName, supportedRenderers),\n );\n\n for (const binding of axisBindings) {\n if (ids.has(binding.id)) {\n throw new FrameByFrameError(\n 'DUPLICATE_BINDING_ID',\n `Binding ID \"${binding.id}\" is used more than once.`,\n { details: { bindingId: binding.id } },\n );\n }\n\n ids.add(binding.id);\n bindings.push(binding);\n }\n\n axes[axisName] = Object.freeze({\n enabled: axis.enabled ?? true,\n bindings: Object.freeze(axisBindings),\n });\n }\n\n if (bindings.length === 0) {\n return invalidController('At least one configured axis with one binding is required.', {\n axes: axesValue,\n });\n }\n\n return Object.freeze({\n source: options.source,\n axes: Object.freeze(axes),\n bindings: Object.freeze(bindings),\n });\n};\n\nconst hasOwn = (value: Readonly<Record<string, unknown>>, key: string): boolean =>\n Object.prototype.hasOwnProperty.call(value, key);\n\nconst assertKnownKeys = (\n value: Readonly<Record<string, unknown>>,\n allowed: readonly string[],\n breakpointId: string,\n scope: string,\n): void => {\n for (const key of Object.keys(value)) {\n if (!allowed.includes(key)) {\n invalidBreakpoint(`Breakpoint \"${breakpointId}\" cannot override \"${scope}.${key}\".`, {\n breakpointId,\n key,\n scope,\n });\n }\n }\n};\n\nconst cloneBindingOverride = (\n value: unknown,\n breakpointId: string,\n axis: AxisName,\n bindingIds: ReadonlySet<string>,\n canvasEnabled: boolean,\n): Readonly<Record<string, unknown>> => {\n if (!isRecord(value)) {\n return invalidBreakpoint('Each breakpoint binding override must be an object.', {\n axis,\n breakpointId,\n value,\n });\n }\n\n assertKnownKeys(\n value,\n canvasEnabled ? CANVAS_BINDING_OVERRIDE_KEYS : VIDEO_BINDING_OVERRIDE_KEYS,\n breakpointId,\n `axes.${axis}.bindings`,\n );\n const id = value['id'];\n\n if (typeof id !== 'string' || !bindingIds.has(id)) {\n return invalidBreakpoint(\n `Breakpoint \"${breakpointId}\" references an unknown binding on axis \"${axis}\".`,\n { axis, bindingId: id, breakpointId },\n );\n }\n\n for (const field of ['segments', 'clips'] as const) {\n if (hasOwn(value, field) && !Array.isArray(value[field])) {\n invalidBreakpoint(`Breakpoint binding override \"${field}\" must be an array.`, {\n axis,\n bindingId: id,\n breakpointId,\n field,\n });\n }\n }\n\n for (const field of ['frame', 'loading', 'video', 'seek', 'canvas'] as const) {\n if (hasOwn(value, field) && !isRecord(value[field])) {\n invalidBreakpoint(`Breakpoint binding override \"${field}\" must be an object.`, {\n axis,\n bindingId: id,\n breakpointId,\n field,\n });\n }\n }\n\n if (hasOwn(value, 'canvas')) {\n const canvas = value['canvas'] as Readonly<Record<string, unknown>>;\n assertKnownKeys(canvas, CANVAS_OVERRIDE_KEYS, breakpointId, `axes.${axis}.bindings.canvas`);\n }\n\n return Object.freeze({\n id,\n ...(hasOwn(value, 'segments') ? { segments: cloneSegments(value['segments']) } : {}),\n ...(hasOwn(value, 'clips') ? { clips: cloneClips(value['clips']) } : {}),\n ...(hasOwn(value, 'easing') ? { easing: value['easing'] } : {}),\n ...(hasOwn(value, 'frame') ? { frame: cloneOption(value['frame']) } : {}),\n ...(hasOwn(value, 'loading') ? { loading: cloneOption(value['loading']) } : {}),\n ...(hasOwn(value, 'video') ? { video: cloneOption(value['video']) } : {}),\n ...(hasOwn(value, 'canvas') ? { canvas: cloneOption(value['canvas']) } : {}),\n ...(hasOwn(value, 'seek') ? { seek: cloneOption(value['seek']) } : {}),\n });\n};\n\nconst cloneBreakpointOverride = (\n value: unknown,\n breakpointId: string,\n base: ControllerConfig,\n canvasEnabled: boolean,\n): Readonly<Record<string, unknown>> => {\n if (!isRecord(value)) {\n return invalidBreakpoint(`Breakpoint \"${breakpointId}\" override must be an object.`, {\n breakpointId,\n override: value,\n });\n }\n\n assertKnownKeys(value, BREAKPOINT_OVERRIDE_KEYS, breakpointId, 'override');\n const axesValue = value['axes'];\n\n if (!isRecord(axesValue) || Object.keys(axesValue).length === 0) {\n return invalidBreakpoint(`Breakpoint \"${breakpointId}\" requires at least one axis override.`, {\n axes: axesValue,\n breakpointId,\n });\n }\n\n assertKnownKeys(axesValue, AXES, breakpointId, 'axes');\n const axes: Partial<Record<AxisName, unknown>> = {};\n\n for (const axis of AXES) {\n if (!hasOwn(axesValue, axis)) {\n continue;\n }\n\n const axisValue = axesValue[axis];\n const baseAxis = base.axes[axis];\n\n if (baseAxis === undefined) {\n return invalidBreakpoint(`Breakpoint \"${breakpointId}\" references an unconfigured axis.`, {\n axis,\n breakpointId,\n });\n }\n\n if (axisValue === false) {\n axes[axis] = false;\n continue;\n }\n\n if (!isRecord(axisValue)) {\n return invalidBreakpoint(`Breakpoint axis \"${axis}\" must be an object or false.`, {\n axis,\n breakpointId,\n value: axisValue,\n });\n }\n\n assertKnownKeys(axisValue, AXIS_OVERRIDE_KEYS, breakpointId, `axes.${axis}`);\n\n if (hasOwn(axisValue, 'enabled') && typeof axisValue['enabled'] !== 'boolean') {\n return invalidBreakpoint(`Breakpoint axis \"${axis}\" enabled must be a boolean.`, {\n axis,\n breakpointId,\n enabled: axisValue['enabled'],\n });\n }\n\n const bindingIds = new Set(baseAxis.bindings.map((binding) => binding.id));\n const bindingsValue = axisValue['bindings'];\n\n if (hasOwn(axisValue, 'bindings') && !Array.isArray(bindingsValue)) {\n return invalidBreakpoint(`Breakpoint axis \"${axis}\" bindings must be an array.`, {\n axis,\n bindings: bindingsValue,\n breakpointId,\n });\n }\n\n const seen = new Set<string>();\n const bindings = Array.isArray(bindingsValue)\n ? bindingsValue.map((binding) => {\n const cloned = cloneBindingOverride(\n binding,\n breakpointId,\n axis,\n bindingIds,\n canvasEnabled,\n );\n const bindingId = cloned['id'] as string;\n\n if (seen.has(bindingId)) {\n invalidBreakpoint(\n `Breakpoint \"${breakpointId}\" overrides binding \"${bindingId}\" more than once.`,\n { axis, bindingId, breakpointId },\n );\n }\n\n seen.add(bindingId);\n return cloned;\n })\n : undefined;\n\n axes[axis] = Object.freeze({\n ...(hasOwn(axisValue, 'enabled') ? { enabled: axisValue['enabled'] } : {}),\n ...(bindings === undefined ? {} : { bindings: Object.freeze(bindings) }),\n });\n }\n\n return Object.freeze({ axes: Object.freeze(axes) });\n};\n\nconst compileBreakpoints = (\n value: unknown,\n base: ControllerConfig,\n canvasEnabled: boolean,\n): readonly ControllerBreakpointConfig[] => {\n if (value === undefined) {\n return Object.freeze([]);\n }\n\n if (!Array.isArray(value)) {\n return invalidBreakpoint('Controller breakpoints must be an array.', { breakpoints: value });\n }\n\n const ids = new Set<string>();\n const breakpoints = value.map((candidate, index): ControllerBreakpointConfig => {\n if (!isRecord(candidate)) {\n return invalidBreakpoint('Each breakpoint must be an object.', {\n breakpoint: candidate,\n index,\n });\n }\n\n const provisionalId =\n typeof candidate['id'] === 'string' && candidate['id'].trim().length > 0\n ? candidate['id']\n : `#${String(index)}`;\n assertKnownKeys(candidate, BREAKPOINT_KEYS, provisionalId, 'breakpoint');\n\n const id = candidate['id'];\n const query = candidate['query'];\n\n if (typeof id !== 'string' || id.trim().length === 0) {\n return invalidBreakpoint('Each breakpoint requires a non-empty string ID.', { id, index });\n }\n\n if (ids.has(id)) {\n return invalidBreakpoint(`Breakpoint ID \"${id}\" is duplicated.`, { breakpointId: id });\n }\n\n if (typeof query !== 'string' || query.trim().length === 0) {\n return invalidBreakpoint(`Breakpoint \"${id}\" requires a non-empty media query.`, {\n breakpointId: id,\n query,\n });\n }\n\n ids.add(id);\n return Object.freeze({\n id,\n query,\n override: cloneBreakpointOverride(candidate['override'], id, base, canvasEnabled),\n });\n });\n\n return Object.freeze(breakpoints);\n};\n\nconst mergeOption = (current: unknown, override: unknown): unknown =>\n isRecord(current) && isRecord(override)\n ? Object.freeze({ ...current, ...override })\n : cloneOption(override);\n\nconst mergeBindingDefinition = (\n current: Readonly<Record<string, unknown>>,\n override: Readonly<Record<string, unknown>>,\n): Readonly<Record<string, unknown>> => {\n const next: Record<string, unknown> = { ...current };\n\n for (const field of ['segments', 'clips', 'easing'] as const) {\n if (hasOwn(override, field)) {\n next[field] = override[field];\n }\n }\n\n for (const field of ['frame', 'loading', 'video', 'seek', 'canvas'] as const) {\n if (hasOwn(override, field)) {\n next[field] = mergeOption(current[field], override[field]);\n }\n }\n\n const frame = next['frame'];\n\n if (isRecord(frame) && frame['snap'] === false) {\n const withoutFps = { ...frame };\n delete withoutFps['fps'];\n next['frame'] = Object.freeze(withoutFps);\n }\n\n const loading = next['loading'];\n\n if (isRecord(loading)) {\n const normalized = { ...loading };\n\n if (normalized['mode'] === 'immediate') {\n delete normalized['trigger'];\n delete normalized['rootMargin'];\n } else if (normalized['trigger'] !== 'target-near-viewport') {\n delete normalized['rootMargin'];\n }\n\n next['loading'] = Object.freeze(normalized);\n }\n\n return Object.freeze(next);\n};\n\n/** Resolves and revalidates one ordered set of matching breakpoint IDs. */\nexport const resolveControllerConfig = (\n program: ControllerProgram,\n activeBreakpointIds: readonly string[],\n): ControllerConfig => {\n const active = new Set(activeBreakpointIds);\n const axes = new Map<\n AxisName,\n { enabled: boolean; bindings: Map<string, Readonly<Record<string, unknown>>> }\n >();\n\n for (const axis of AXES) {\n const baseAxis = program.base.axes[axis];\n\n if (baseAxis !== undefined) {\n axes.set(axis, {\n enabled: baseAxis.enabled,\n bindings: new Map(\n baseAxis.bindings.map((binding) => [binding.id, binding.definition] as const),\n ),\n });\n }\n }\n\n for (const breakpoint of program.breakpoints) {\n if (!active.has(breakpoint.id)) {\n continue;\n }\n\n const breakpointAxes = breakpoint.override['axes'] as Readonly<Record<string, unknown>>;\n\n for (const axis of AXES) {\n if (!hasOwn(breakpointAxes, axis)) {\n continue;\n }\n\n const target = axes.get(axis);\n const override = breakpointAxes[axis];\n\n if (target === undefined) {\n continue;\n }\n\n if (override === false) {\n target.enabled = false;\n continue;\n }\n\n if (!isRecord(override)) {\n continue;\n }\n\n if (hasOwn(override, 'enabled')) {\n target.enabled = override['enabled'] as boolean;\n }\n\n const bindingOverrides = override['bindings'];\n\n if (Array.isArray(bindingOverrides)) {\n for (const bindingOverride of bindingOverrides as Readonly<Record<string, unknown>>[]) {\n const bindingId = bindingOverride['id'] as string;\n const current = target.bindings.get(bindingId);\n\n if (current !== undefined) {\n target.bindings.set(bindingId, mergeBindingDefinition(current, bindingOverride));\n }\n }\n }\n }\n }\n\n const resolvedAxes: Record<string, unknown> = {};\n\n for (const [axis, value] of axes) {\n resolvedAxes[axis] = {\n enabled: value.enabled,\n bindings: [...value.bindings.values()],\n };\n }\n\n try {\n return compileControllerConfig(\n {\n ...(program.base.source === undefined ? {} : { source: program.base.source }),\n axes: resolvedAxes,\n } as unknown as ControllerInputOptions,\n program.supportedRenderers,\n );\n } catch (cause) {\n return invalidBreakpoint(\n 'The matching breakpoint cascade does not produce a valid controller configuration.',\n { activeBreakpoints: Object.freeze([...activeBreakpointIds]) },\n cause,\n );\n }\n};\n\n/** Compiles the immutable base configuration and responsive program at factory time. */\nexport const compileControllerProgram = (\n options: ControllerInputOptions,\n supportedRenderers: ReadonlySet<RendererType> = new Set<RendererType>(['video']),\n): ControllerProgram => {\n const base = compileControllerConfig(options, supportedRenderers);\n const reducedMotion = options.reducedMotion ?? 'first-frame';\n\n if (!REDUCED_MOTION_BEHAVIORS.includes(reducedMotion)) {\n return invalidController('Controller reducedMotion behavior is invalid.', { reducedMotion });\n }\n\n return Object.freeze({\n base,\n breakpoints: compileBreakpoints(options.breakpoints, base, supportedRenderers.has('canvas')),\n reducedMotion,\n supportedRenderers,\n });\n};\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport type { ControllerBreakpointConfig } from '../core/controller-config.js';\nimport type { ScrollSource } from '../types.js';\n\ninterface MediaQueryListLike {\n readonly matches: boolean;\n addEventListener?: (type: 'change', listener: () => void) => void;\n removeEventListener?: (type: 'change', listener: () => void) => void;\n addListener?: (listener: () => void) => void;\n removeListener?: (listener: () => void) => void;\n}\n\ninterface ResizeObserverLike {\n observe(target: Element): void;\n disconnect(): void;\n}\n\ninterface BrowserViewLike {\n matchMedia?: (query: string) => MediaQueryListLike;\n addEventListener?: (\n type: string,\n listener: () => void,\n options?: AddEventListenerOptions,\n ) => void;\n removeEventListener?: (type: string, listener: () => void) => void;\n ResizeObserver?: new (callback: () => void) => ResizeObserverLike;\n}\n\n/** Current browser preferences observed by one mounted controller. */\nexport interface ControllerEnvironmentSnapshot {\n readonly activeBreakpoints: readonly string[];\n readonly prefersReducedMotion: boolean;\n readonly hidden: boolean;\n}\n\nexport interface ControllerEnvironmentObserver {\n getSnapshot(): ControllerEnvironmentSnapshot;\n observeTargets(targets: readonly Element[]): void;\n destroy(): void;\n}\n\nexport interface ControllerEnvironmentObserverOptions {\n readonly source: ScrollSource;\n readonly breakpoints: readonly ControllerBreakpointConfig[];\n readonly requestFrame: (callback: FrameRequestCallback) => number;\n readonly cancelFrame: (handle: number) => void;\n readonly onMediaChange: (snapshot: ControllerEnvironmentSnapshot) => void;\n readonly onResize: () => void;\n readonly onVisibilityChange: (hidden: boolean) => void;\n}\n\nexport type ControllerEnvironmentObserverFactory = (\n options: ControllerEnvironmentObserverOptions,\n) => ControllerEnvironmentObserver;\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null;\n\nconst getDocument = (source: ScrollSource): Document | null => {\n if (source.nodeType === 9) {\n return source as Document;\n }\n\n const ownerDocument = (source as HTMLElement).ownerDocument;\n return ownerDocument.nodeType === 9 ? ownerDocument : null;\n};\n\nconst getView = (document: Document | null): BrowserViewLike | null => {\n const ownerView: unknown = document?.defaultView;\n\n if (isRecord(ownerView)) {\n return ownerView;\n }\n\n const globalWindow: unknown = (globalThis as { readonly window?: unknown }).window;\n return isRecord(globalWindow) ? globalWindow : null;\n};\n\nconst freezeSnapshot = (\n activeBreakpoints: readonly string[],\n prefersReducedMotion: boolean,\n hidden: boolean,\n): ControllerEnvironmentSnapshot =>\n Object.freeze({\n activeBreakpoints: Object.freeze([...activeBreakpoints]),\n prefersReducedMotion,\n hidden,\n });\n\nconst arraysEqual = (left: readonly string[], right: readonly string[]): boolean =>\n left.length === right.length && left.every((value, index) => value === right[index]);\n\nconst listenToMediaQuery = (query: MediaQueryListLike, listener: () => void): (() => void) => {\n if (query.addEventListener !== undefined && query.removeEventListener !== undefined) {\n query.addEventListener('change', listener);\n return (): void => {\n query.removeEventListener?.('change', listener);\n };\n }\n\n if (query.addListener !== undefined && query.removeListener !== undefined) {\n query.addListener(listener);\n return (): void => {\n query.removeListener?.(listener);\n };\n }\n\n return (): void => undefined;\n};\n\n/** Mount-scoped browser observers with no import-time DOM access or timers. */\nexport const createControllerEnvironmentObserver: ControllerEnvironmentObserverFactory = (\n options,\n) => {\n const document = getDocument(options.source);\n const view = getView(document);\n const mediaQueries = new Map<string, MediaQueryListLike>();\n const cleanups: (() => void)[] = [];\n let reducedMotionQuery: MediaQueryListLike | null = null;\n let resizeObserver: ResizeObserverLike | null = null;\n let resizeFrame: number | null = null;\n let mediaScheduled = false;\n let destroyed = false;\n\n const readHidden = (): boolean => document?.hidden === true;\n const readSnapshot = (): ControllerEnvironmentSnapshot =>\n freezeSnapshot(\n options.breakpoints\n .filter((breakpoint) => mediaQueries.get(breakpoint.id)?.matches === true)\n .map((breakpoint) => breakpoint.id),\n reducedMotionQuery?.matches === true,\n readHidden(),\n );\n let snapshot = freezeSnapshot([], false, readHidden());\n\n const publishMedia = (): void => {\n mediaScheduled = false;\n\n if (destroyed) {\n return;\n }\n\n const next = readSnapshot();\n\n if (\n next.prefersReducedMotion !== snapshot.prefersReducedMotion ||\n !arraysEqual(next.activeBreakpoints, snapshot.activeBreakpoints)\n ) {\n snapshot = next;\n options.onMediaChange(snapshot);\n }\n };\n const scheduleMedia = (): void => {\n if (!mediaScheduled) {\n mediaScheduled = true;\n globalThis.queueMicrotask(publishMedia);\n }\n };\n\n if (view?.matchMedia !== undefined) {\n for (const breakpoint of options.breakpoints) {\n let mediaQuery: MediaQueryListLike;\n\n try {\n mediaQuery = view.matchMedia(breakpoint.query);\n } catch (cause) {\n for (const cleanup of cleanups.splice(0)) {\n cleanup();\n }\n\n throw new FrameByFrameError(\n 'INVALID_BREAKPOINT_CONFIG',\n `The media query for breakpoint \"${breakpoint.id}\" could not be evaluated.`,\n { cause, details: { breakpointId: breakpoint.id, query: breakpoint.query } },\n );\n }\n\n mediaQueries.set(breakpoint.id, mediaQuery);\n cleanups.push(listenToMediaQuery(mediaQuery, scheduleMedia));\n }\n\n try {\n reducedMotionQuery = view.matchMedia('(prefers-reduced-motion: reduce)');\n } catch (cause) {\n for (const cleanup of cleanups.splice(0)) {\n cleanup();\n }\n\n throw new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n 'The reduced-motion media query could not be evaluated.',\n { cause },\n );\n }\n\n cleanups.push(listenToMediaQuery(reducedMotionQuery, scheduleMedia));\n }\n\n snapshot = readSnapshot();\n\n const scheduleResize = (): void => {\n if (resizeFrame === null && !snapshot.hidden && !destroyed) {\n resizeFrame = options.requestFrame((): void => {\n resizeFrame = null;\n options.onResize();\n });\n }\n };\n\n if (view?.addEventListener !== undefined && view.removeEventListener !== undefined) {\n view.addEventListener('resize', scheduleResize, { passive: true });\n cleanups.push((): void => {\n view.removeEventListener?.('resize', scheduleResize);\n });\n }\n\n if (document !== null) {\n const handleVisibility = (): void => {\n const hidden = readHidden();\n\n if (hidden === snapshot.hidden) {\n return;\n }\n\n snapshot = freezeSnapshot(snapshot.activeBreakpoints, snapshot.prefersReducedMotion, hidden);\n\n if (hidden && resizeFrame !== null) {\n options.cancelFrame(resizeFrame);\n resizeFrame = null;\n }\n\n options.onVisibilityChange(hidden);\n };\n document.addEventListener('visibilitychange', handleVisibility);\n cleanups.push((): void => {\n document.removeEventListener('visibilitychange', handleVisibility);\n });\n }\n\n const ResizeObserverConstructor = view?.ResizeObserver ?? globalThis.ResizeObserver;\n\n if (typeof ResizeObserverConstructor === 'function') {\n try {\n resizeObserver = new ResizeObserverConstructor(scheduleResize);\n const sourceTarget =\n options.source.nodeType === 9 ? document?.documentElement : options.source;\n\n if (sourceTarget !== undefined) {\n resizeObserver.observe(sourceTarget as Element);\n }\n } catch {\n resizeObserver?.disconnect();\n resizeObserver = null;\n }\n }\n\n return {\n getSnapshot: (): ControllerEnvironmentSnapshot => snapshot,\n observeTargets: (targets): void => {\n for (const target of targets) {\n resizeObserver?.observe(target);\n }\n },\n destroy: (): void => {\n if (destroyed) {\n return;\n }\n\n destroyed = true;\n\n if (resizeFrame !== null) {\n options.cancelFrame(resizeFrame);\n resizeFrame = null;\n }\n\n resizeObserver?.disconnect();\n resizeObserver = null;\n\n for (const cleanup of cleanups.splice(0)) {\n cleanup();\n }\n },\n };\n};\n","import { EventEmitter } from './event-emitter.js';\nimport { FrameByFrameError } from './errors.js';\nimport { compileControllerProgram, resolveControllerConfig } from './controller-config.js';\nimport { createControllerEnvironmentObserver } from '../responsive/environment-observer.js';\n\nimport type {\n ControllerBindingConfig,\n ControllerConfig,\n ControllerProgram,\n} from './controller-config.js';\nimport type {\n MediaRenderer,\n MediaRendererFactory,\n VideoRendererConfigTransaction,\n VideoRendererEvent,\n VideoRendererState,\n} from '../media/video-renderer.js';\nimport type {\n ControllerEnvironmentObserver,\n ControllerEnvironmentObserverFactory,\n ControllerEnvironmentSnapshot,\n} from '../responsive/environment-observer.js';\nimport type { ResolvedScrollSource } from '../scroll/source.js';\nimport type {\n AsyncErrorReporter,\n ScrollSourceSnapshot,\n SourceRegistry,\n SourceScheduler,\n} from '../scroll/source-scheduler.js';\nimport type {\n AxisName,\n CanvasFrameByFrameController,\n CanvasFrameByFrameOptions,\n FrameByFrameAxisState,\n FrameByFrameBindingState,\n FrameByFrameErrorCode,\n FrameByFrameEventMap,\n FrameByFrameOptions,\n FrameByFrameState,\n FrameByFrameStatus,\n FrameByFrameUpdateReason,\n ScrollSource,\n RendererType,\n TimelineResolution,\n} from '../types.js';\n\nexport interface ControllerDependencies {\n readonly resolveSource: (reference: unknown) => ResolvedScrollSource;\n readonly sourceRegistry: SourceRegistry;\n readonly reportAsyncError: AsyncErrorReporter;\n readonly createRenderer: MediaRendererFactory;\n readonly supportedRenderers: ReadonlySet<RendererType>;\n readonly createEnvironmentObserver?: ControllerEnvironmentObserverFactory;\n}\n\ninterface MutableAxisState {\n enabled: boolean;\n offset: number;\n max: number;\n progress: number;\n}\n\ninterface MutableBindingState {\n config: ControllerBindingConfig;\n resolution: TimelineResolution | null;\n renderer: MediaRenderer | null;\n media: VideoRendererState;\n}\n\nconst createInitialMediaState = (): VideoRendererState => ({\n loadState: 'idle',\n loadProgress: Object.freeze({}),\n activeClipId: null,\n selectedSource: null,\n duration: null,\n appliedTime: null,\n presentedTime: null,\n seeking: false,\n error: null,\n});\n\nconst cloneResolution = (resolution: TimelineResolution): TimelineResolution =>\n Object.freeze({ ...resolution });\n\nconst cloneError = (error: FrameByFrameError): FrameByFrameError =>\n new FrameByFrameError(error.code, error.message, {\n cause: error.cause,\n ...(error.details === undefined ? {} : { details: error.details }),\n });\n\nconst asPackageError = (\n error: unknown,\n code: FrameByFrameErrorCode,\n message: string,\n): FrameByFrameError =>\n error instanceof FrameByFrameError\n ? error\n : new FrameByFrameError(code, message, { cause: error });\n\nclass Controller implements CanvasFrameByFrameController {\n readonly #program: ControllerProgram;\n #config: ControllerConfig;\n readonly #dependencies: ControllerDependencies;\n readonly #events: EventEmitter<FrameByFrameEventMap>;\n readonly #axes: Partial<Record<AxisName, MutableAxisState>> = {};\n readonly #bindings = new Map<string, MutableBindingState>();\n readonly #handleScroll = (snapshot: ScrollSourceSnapshot): void => {\n if (this.#status !== 'ready' || !this.#enabled || this.#hidden) {\n return;\n }\n\n try {\n this.#applySnapshot(snapshot, true);\n this.#emitUpdate('scroll');\n } catch (error) {\n this.#transitionToRuntimeError(error);\n }\n };\n\n #status: FrameByFrameStatus = 'idle';\n #enabled = true;\n #source: ScrollSource | null = null;\n #scheduler: SourceScheduler | null = null;\n #unsubscribe: (() => void) | null = null;\n #mountPromise: Promise<void> | null = null;\n #mountGeneration = 0;\n #lastError: FrameByFrameError | null = null;\n #environment: ControllerEnvironmentObserver | null = null;\n #activeBreakpoints: readonly string[] = Object.freeze([]);\n #prefersReducedMotion = false;\n #hidden = false;\n\n constructor(\n options: FrameByFrameOptions | CanvasFrameByFrameOptions,\n dependencies: ControllerDependencies,\n ) {\n this.#program = compileControllerProgram(options, dependencies.supportedRenderers);\n this.#config = this.#program.base;\n this.#dependencies = dependencies;\n this.#events = new EventEmitter(dependencies.reportAsyncError);\n\n for (const [axisName, axisConfig] of Object.entries(this.#config.axes) as [\n AxisName,\n NonNullable<ControllerConfig['axes'][AxisName]>,\n ][]) {\n this.#axes[axisName] = {\n enabled: axisConfig.enabled,\n offset: 0,\n max: 0,\n progress: 0,\n };\n }\n\n for (const binding of this.#config.bindings) {\n this.#bindings.set(binding.id, {\n config: binding,\n resolution: null,\n renderer: null,\n media: createInitialMediaState(),\n });\n }\n }\n\n mount(): Promise<void> {\n this.#assertNotDestroyed();\n\n if (this.#status === 'ready' || this.#status === 'disabled') {\n return Promise.resolve();\n }\n\n if (this.#status === 'mounting' && this.#mountPromise !== null) {\n return this.#mountPromise;\n }\n\n const generation = ++this.#mountGeneration;\n this.#status = 'mounting';\n this.#lastError = null;\n\n const promise = Promise.resolve()\n .then((): void => {\n this.#performMount(generation);\n })\n .catch((error: unknown): never => {\n throw this.#handleMountFailure(error, generation);\n })\n .finally((): void => {\n if (this.#mountPromise === promise) {\n this.#mountPromise = null;\n }\n });\n\n this.#mountPromise = promise;\n return promise;\n }\n\n refresh(): void {\n this.#assertNotDestroyed();\n\n if ((this.#status !== 'ready' && this.#status !== 'disabled') || this.#scheduler === null) {\n throw new FrameByFrameError(\n 'INVALID_LIFECYCLE_OPERATION',\n 'refresh() requires a successfully mounted controller.',\n { details: { status: this.#status } },\n );\n }\n\n try {\n for (const binding of this.#bindings.values()) {\n binding.renderer?.resize();\n }\n\n this.#applySnapshot(this.#scheduler.refresh(), this.#enabled);\n this.#emitUpdate('refresh');\n } catch (error) {\n const packageError = this.#transitionToRuntimeError(error);\n throw packageError;\n }\n }\n\n enable(): void {\n this.#assertNotDestroyed();\n\n if (this.#enabled) {\n return;\n }\n\n this.#enabled = true;\n\n if (this.#status === 'disabled' && this.#scheduler !== null) {\n try {\n this.#applySnapshot(this.#scheduler.getSnapshot(), true);\n this.#status = 'ready';\n this.#subscribe();\n } catch (error) {\n const packageError = this.#transitionToRuntimeError(error);\n throw packageError;\n }\n }\n\n this.#emitUpdate('enable');\n }\n\n disable(): void {\n this.#assertNotDestroyed();\n\n if (!this.#enabled) {\n return;\n }\n\n this.#enabled = false;\n\n if (this.#status === 'ready') {\n this.#unsubscribeFromSource();\n this.#status = 'disabled';\n }\n\n this.#emitUpdate('disable');\n }\n\n load(bindingId?: string): Promise<void> {\n this.#assertMediaLifecycle('load()');\n return Promise.all(\n this.#selectBindings(bindingId).map((binding) => this.#getMountedRenderer(binding).load()),\n ).then((): void => undefined);\n }\n\n whenReady(): Promise<FrameByFrameState> {\n this.#assertMediaLifecycle('whenReady()');\n return Promise.all(\n [...this.#bindings.values()].map((binding) => this.#getMountedRenderer(binding).whenReady()),\n ).then((): FrameByFrameState => {\n this.#assertNotDestroyed();\n return this.getState();\n });\n }\n\n unload(bindingId?: string): void {\n this.#assertMediaLifecycle('unload()');\n\n for (const binding of this.#selectBindings(bindingId)) {\n this.#getMountedRenderer(binding).unload();\n }\n }\n\n getTarget(bindingId: string): HTMLVideoElement | HTMLCanvasElement | null {\n this.#assertNotDestroyed();\n const binding = this.#getBinding(bindingId);\n return binding.renderer?.getTarget() ?? null;\n }\n\n getState(): FrameByFrameState {\n const axes: Partial<Record<AxisName, FrameByFrameAxisState>> = {};\n\n for (const [axisName, axis] of Object.entries(this.#axes) as [AxisName, MutableAxisState][]) {\n axes[axisName] = Object.freeze({\n enabled: axis.enabled,\n offset: axis.offset,\n max: axis.max,\n progress: axis.progress,\n });\n }\n\n const bindings: Record<string, FrameByFrameBindingState> = {};\n\n for (const [id, binding] of this.#bindings) {\n const media = binding.renderer?.getState() ?? binding.media;\n bindings[id] = Object.freeze({\n id,\n axis: binding.config.axis,\n resolution: binding.resolution === null ? null : cloneResolution(binding.resolution),\n renderer: binding.config.renderer,\n loadState: media.loadState,\n loadProgress: Object.freeze(\n Object.fromEntries(\n Object.entries(media.loadProgress).map(([clipId, progress]) => [\n clipId,\n Object.freeze({ ...progress }),\n ]),\n ),\n ),\n activeClipId: media.activeClipId,\n selectedSource: media.selectedSource,\n duration: media.duration,\n appliedTime: media.appliedTime,\n presentedTime: media.presentedTime,\n seeking: media.seeking,\n error: media.error === null ? null : cloneError(media.error),\n });\n }\n\n return Object.freeze({\n status: this.#status,\n enabled: this.#enabled,\n source: this.#source,\n activeBreakpoints: Object.freeze([...this.#activeBreakpoints]),\n prefersReducedMotion: this.#prefersReducedMotion,\n axes: Object.freeze(axes),\n bindings: Object.freeze(bindings),\n lastError: this.#lastError === null ? null : cloneError(this.#lastError),\n });\n }\n\n on<EventName extends keyof FrameByFrameEventMap>(\n event: EventName,\n listener: (payload: FrameByFrameEventMap[EventName]) => void,\n ): () => void {\n this.#assertNotDestroyed();\n\n if (typeof listener !== 'function') {\n throw new FrameByFrameError('INVALID_CONTROLLER', 'Event listeners must be functions.', {\n details: { event, listener },\n });\n }\n\n return this.#events.on(event, listener);\n }\n\n destroy(): void {\n if (this.#status === 'destroyed') {\n return;\n }\n\n ++this.#mountGeneration;\n this.#unsubscribeFromSource();\n this.#destroyEnvironment();\n this.#destroyRenderers();\n this.#scheduler = null;\n this.#source = null;\n this.#enabled = false;\n this.#status = 'destroyed';\n this.#events.emit('destroy', this.getState());\n this.#events.clear();\n }\n\n #performMount(generation: number): void {\n if (generation !== this.#mountGeneration) {\n throw new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed before mount completed.',\n );\n }\n\n const resolvedSource = this.#dependencies.resolveSource(this.#config.source);\n const scheduler = this.#dependencies.sourceRegistry.get(resolvedSource);\n const snapshot = scheduler.refresh();\n const createEnvironment =\n this.#dependencies.createEnvironmentObserver ?? createControllerEnvironmentObserver;\n const environment = createEnvironment({\n source: resolvedSource.publicSource,\n breakpoints: this.#program.breakpoints,\n requestFrame: resolvedSource.requestFrame,\n cancelFrame: resolvedSource.cancelFrame,\n onMediaChange: (next): void => {\n this.#handleMediaChange(next);\n },\n onResize: (): void => {\n this.#handleResize();\n },\n onVisibilityChange: (hidden): void => {\n this.#handleVisibilityChange(hidden);\n },\n });\n const environmentSnapshot = environment.getSnapshot();\n let initialConfig: ControllerConfig;\n\n try {\n initialConfig = resolveControllerConfig(this.#program, environmentSnapshot.activeBreakpoints);\n } catch (error) {\n environment.destroy();\n throw error;\n }\n\n this.#environment = environment;\n this.#activeBreakpoints = environmentSnapshot.activeBreakpoints;\n this.#prefersReducedMotion = environmentSnapshot.prefersReducedMotion;\n this.#hidden = environmentSnapshot.hidden;\n this.#adoptConfig(initialConfig);\n\n this.#createRenderers();\n\n if (generation !== this.#mountGeneration || this.#status === 'destroyed') {\n throw new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed before mount completed.',\n );\n }\n\n this.#source = resolvedSource.publicSource;\n this.#scheduler = scheduler;\n this.#applyRendererActivity();\n this.#applySnapshot(snapshot, this.#enabled);\n this.#status = this.#enabled ? 'ready' : 'disabled';\n this.#subscribe();\n environment.observeTargets(\n [...this.#bindings.values()]\n .map((binding) => binding.renderer?.getTarget() ?? null)\n .filter((target): target is HTMLVideoElement | HTMLCanvasElement => target !== null),\n );\n\n const state = this.getState();\n this.#events.emit('mount', state);\n this.#events.emit('update', { reason: 'mount', state: this.getState() });\n }\n\n #handleMountFailure(error: unknown, generation: number): FrameByFrameError {\n const packageError = asPackageError(\n error,\n 'SOURCE_NOT_FOUND',\n 'The controller could not mount its scroll source.',\n );\n\n if (this.#status === 'destroyed' || generation !== this.#mountGeneration) {\n return packageError.code === 'CONTROLLER_DESTROYED'\n ? packageError\n : new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed before mount completed.',\n { cause: packageError },\n );\n }\n\n this.#unsubscribeFromSource();\n this.#destroyEnvironment();\n this.#destroyRenderers();\n this.#scheduler = null;\n this.#source = null;\n this.#status = 'error';\n this.#lastError = packageError;\n this.#events.emit('error', cloneError(packageError));\n return packageError;\n }\n\n #applySnapshot(snapshot: ScrollSourceSnapshot, resolveBindings: boolean): void {\n for (const axisName of ['x', 'y'] as const) {\n const axis = this.#axes[axisName];\n\n if (axis === undefined) {\n continue;\n }\n\n const metrics = snapshot[axisName];\n axis.offset = metrics.offset;\n axis.max = metrics.max;\n axis.progress = metrics.progress;\n }\n\n for (const binding of this.#bindings.values()) {\n const axis = this.#axes[binding.config.axis];\n const reducedMotionBehavior = this.#program.reducedMotion;\n\n if (\n !resolveBindings ||\n !axis?.enabled ||\n (this.#prefersReducedMotion && reducedMotionBehavior === 'disable')\n ) {\n binding.resolution = null;\n binding.renderer?.setResolution(null);\n continue;\n }\n\n const position =\n this.#prefersReducedMotion && reducedMotionBehavior === 'first-frame'\n ? binding.config.startPosition\n : this.#prefersReducedMotion && reducedMotionBehavior === 'last-frame'\n ? binding.config.endPosition\n : binding.config.timeline.unit === 'px'\n ? axis.offset\n : axis.progress;\n binding.resolution = binding.config.timeline.resolve(position);\n binding.renderer?.setResolution(binding.resolution);\n }\n }\n\n #createRenderers(): void {\n try {\n for (const binding of this.#bindings.values()) {\n const renderer = this.#dependencies.createRenderer(\n binding.config,\n (event): void => {\n this.#handleRendererEvent(binding.config.id, event);\n },\n this.#getRendererActivity(),\n );\n binding.renderer = renderer;\n binding.media = renderer.getState();\n }\n } catch (error) {\n this.#destroyRenderers();\n throw error;\n }\n }\n\n #destroyRenderers(): void {\n for (const binding of this.#bindings.values()) {\n const renderer = binding.renderer;\n\n if (renderer === null) {\n continue;\n }\n\n renderer.destroy();\n binding.media = renderer.getState();\n binding.renderer = null;\n }\n }\n\n #handleRendererEvent(bindingId: string, event: VideoRendererEvent): void {\n const binding = this.#bindings.get(bindingId);\n const renderer = binding?.renderer;\n\n if (\n binding === undefined ||\n renderer === undefined ||\n renderer === null ||\n this.#status === 'destroyed'\n ) {\n return;\n }\n\n binding.media = renderer.getState();\n\n switch (event.type) {\n case 'loadstart':\n case 'loadready':\n this.#events.emit(event.type, {\n bindingId,\n clipId: event.clipId,\n state: this.getState(),\n });\n break;\n case 'loadprogress':\n this.#events.emit('loadprogress', {\n bindingId,\n clipId: event.clipId,\n loadedBytes: event.progress.loadedBytes,\n totalBytes: event.progress.totalBytes,\n ratio: event.progress.ratio,\n state: this.getState(),\n });\n break;\n case 'loadedmetadata':\n this.#events.emit('loadedmetadata', {\n bindingId,\n clipId: event.clipId,\n duration: event.duration,\n state: this.getState(),\n });\n break;\n case 'seekrequest':\n this.#events.emit('seekrequest', {\n bindingId,\n clipId: event.clipId,\n requestedTime: event.requestedTime,\n targetTime: event.targetTime,\n state: this.getState(),\n });\n break;\n case 'frame':\n this.#events.emit('frame', {\n bindingId,\n clipId: event.clipId,\n presentedTime: event.presentedTime,\n expectedDisplayTime: event.expectedDisplayTime,\n width: event.width,\n height: event.height,\n state: this.getState(),\n });\n break;\n case 'error':\n this.#events.emit('error', cloneError(event.error));\n break;\n }\n }\n\n #adoptConfig(config: ControllerConfig): void {\n this.#config = config;\n\n for (const axisName of ['x', 'y'] as const) {\n const axis = this.#axes[axisName];\n const next = config.axes[axisName];\n\n if (axis !== undefined && next !== undefined) {\n axis.enabled = next.enabled;\n }\n }\n\n for (const next of config.bindings) {\n const binding = this.#bindings.get(next.id);\n\n if (binding !== undefined) {\n binding.config = next;\n }\n }\n }\n\n #applyResponsiveConfig(config: ControllerConfig): void {\n const transactions: VideoRendererConfigTransaction[] = [];\n\n try {\n for (const next of config.bindings) {\n const binding = this.#bindings.get(next.id);\n\n if (\n binding?.renderer !== null &&\n binding?.renderer !== undefined &&\n binding.config.mediaSignature !== next.mediaSignature\n ) {\n transactions.push(binding.renderer.prepareConfig(next));\n }\n }\n } catch (cause) {\n for (const transaction of transactions) {\n transaction.cancel();\n }\n\n throw asPackageError(\n cause,\n 'INVALID_BREAKPOINT_CONFIG',\n 'The responsive media configuration could not be prepared atomically.',\n );\n }\n\n for (const transaction of transactions) {\n transaction.commit();\n }\n\n this.#adoptConfig(config);\n }\n\n #handleMediaChange(snapshot: ControllerEnvironmentSnapshot): void {\n if (this.#status !== 'ready' && this.#status !== 'disabled') {\n return;\n }\n\n let breakpointChanged =\n snapshot.activeBreakpoints.length !== this.#activeBreakpoints.length ||\n snapshot.activeBreakpoints.some((id, index) => id !== this.#activeBreakpoints[index]);\n const preferenceChanged = snapshot.prefersReducedMotion !== this.#prefersReducedMotion;\n const previousBreakpoints = this.#activeBreakpoints;\n\n if (breakpointChanged) {\n try {\n const candidate = resolveControllerConfig(this.#program, snapshot.activeBreakpoints);\n this.#applyResponsiveConfig(candidate);\n this.#activeBreakpoints = Object.freeze([...snapshot.activeBreakpoints]);\n this.#lastError = null;\n } catch (error) {\n const packageError = asPackageError(\n error,\n 'INVALID_BREAKPOINT_CONFIG',\n 'The responsive configuration change was rejected.',\n );\n this.#lastError = packageError;\n this.#events.emit('error', cloneError(packageError));\n breakpointChanged = false;\n }\n }\n\n if (preferenceChanged) {\n this.#prefersReducedMotion = snapshot.prefersReducedMotion;\n }\n\n if (!breakpointChanged && !preferenceChanged) {\n return;\n }\n\n try {\n this.#applyRendererActivity();\n\n if (this.#scheduler !== null) {\n const scrollSnapshot = breakpointChanged\n ? this.#scheduler.refresh()\n : this.#scheduler.getSnapshot();\n this.#applySnapshot(scrollSnapshot, this.#enabled);\n }\n\n this.#syncSubscription();\n } catch (error) {\n this.#transitionToRuntimeError(error);\n return;\n }\n\n if (breakpointChanged) {\n const state = this.getState();\n this.#events.emit('breakpointchange', {\n previous: Object.freeze([...previousBreakpoints]),\n current: Object.freeze([...this.#activeBreakpoints]),\n state,\n });\n this.#emitUpdate('breakpoint');\n }\n\n if (preferenceChanged) {\n this.#emitUpdate('preference');\n }\n }\n\n #handleResize(): void {\n if (\n (this.#status !== 'ready' && this.#status !== 'disabled') ||\n this.#scheduler === null ||\n this.#hidden\n ) {\n return;\n }\n\n try {\n for (const binding of this.#bindings.values()) {\n binding.renderer?.resize();\n }\n\n this.#applySnapshot(this.#scheduler.refresh(), this.#enabled);\n this.#emitUpdate('resize');\n } catch (error) {\n this.#transitionToRuntimeError(error);\n }\n }\n\n #handleVisibilityChange(hidden: boolean): void {\n if (this.#status !== 'ready' && this.#status !== 'disabled') {\n return;\n }\n\n this.#hidden = hidden;\n\n try {\n if (hidden) {\n this.#unsubscribeFromSource();\n }\n\n this.#applyRendererActivity();\n\n if (!hidden && this.#scheduler !== null) {\n this.#applySnapshot(this.#scheduler.refresh(), this.#enabled);\n this.#subscribe();\n }\n\n this.#emitUpdate('visibility');\n } catch (error) {\n this.#transitionToRuntimeError(error);\n }\n }\n\n #getRendererActivity(): 'active' | 'suspended' | 'disabled' {\n if (this.#prefersReducedMotion && this.#program.reducedMotion === 'disable') {\n return 'disabled';\n }\n\n return this.#hidden ? 'suspended' : 'active';\n }\n\n #applyRendererActivity(): void {\n const activity = this.#getRendererActivity();\n\n for (const binding of this.#bindings.values()) {\n binding.renderer?.setActivity(activity);\n }\n }\n\n #destroyEnvironment(): void {\n this.#environment?.destroy();\n this.#environment = null;\n this.#hidden = false;\n }\n\n #selectBindings(bindingId: string | undefined): MutableBindingState[] {\n if (bindingId === undefined) {\n return [...this.#bindings.values()];\n }\n\n return [this.#getBinding(bindingId)];\n }\n\n #getBinding(bindingId: string): MutableBindingState {\n const binding = this.#bindings.get(bindingId);\n\n if (binding === undefined) {\n throw new FrameByFrameError(\n 'INVALID_CONTROLLER',\n `Binding \"${bindingId}\" is not configured.`,\n {\n details: { bindingId },\n },\n );\n }\n\n return binding;\n }\n\n #getMountedRenderer(binding: MutableBindingState): MediaRenderer {\n const renderer = binding.renderer;\n\n if (renderer === null) {\n throw new FrameByFrameError(\n 'INVALID_LIFECYCLE_OPERATION',\n 'Media operations require a successfully mounted controller.',\n { details: { bindingId: binding.config.id, status: this.#status } },\n );\n }\n\n return renderer;\n }\n\n #assertMediaLifecycle(operation: string): void {\n this.#assertNotDestroyed();\n\n if (this.#status !== 'ready' && this.#status !== 'disabled') {\n throw new FrameByFrameError(\n 'INVALID_LIFECYCLE_OPERATION',\n `${operation} requires a successfully mounted controller.`,\n { details: { status: this.#status } },\n );\n }\n }\n\n #subscribe(): void {\n if (\n this.#unsubscribe !== null ||\n !this.#enabled ||\n this.#hidden ||\n this.#scheduler === null ||\n !Object.values(this.#axes).some((axis) => axis.enabled)\n ) {\n return;\n }\n\n this.#unsubscribe = this.#scheduler.subscribe(this.#handleScroll);\n }\n\n #syncSubscription(): void {\n if (!this.#enabled || this.#hidden || !Object.values(this.#axes).some((axis) => axis.enabled)) {\n this.#unsubscribeFromSource();\n return;\n }\n\n this.#subscribe();\n }\n\n #unsubscribeFromSource(): void {\n this.#unsubscribe?.();\n this.#unsubscribe = null;\n }\n\n #transitionToRuntimeError(error: unknown): FrameByFrameError {\n const packageError = asPackageError(\n error,\n 'INVALID_CONTROLLER',\n 'The controller failed while resolving a scroll update.',\n );\n this.#unsubscribeFromSource();\n this.#destroyEnvironment();\n this.#destroyRenderers();\n this.#scheduler = null;\n this.#source = null;\n this.#status = 'error';\n this.#lastError = packageError;\n this.#events.emit('error', cloneError(packageError));\n return packageError;\n }\n\n #emitUpdate(reason: FrameByFrameUpdateReason): void {\n this.#events.emit('update', { reason, state: this.getState() });\n }\n\n #assertNotDestroyed(): void {\n if (this.#status === 'destroyed') {\n throw new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller has already been destroyed.',\n );\n }\n }\n}\n\n/** Internal factory with injectable browser dependencies for deterministic tests. */\nexport const createController = (\n options: FrameByFrameOptions | CanvasFrameByFrameOptions,\n dependencies: ControllerDependencies,\n): CanvasFrameByFrameController => new Controller(options, dependencies);\n","export interface AssetLoadProgress {\n readonly loadedBytes: number;\n readonly totalBytes: number | null;\n readonly ratio: number | null;\n}\n\nexport interface AssetRequest {\n readonly url: string;\n readonly credentials: RequestCredentials;\n readonly cache: RequestCache;\n}\n\nexport interface LoadedAsset {\n readonly objectUrl: string;\n readonly size: number;\n readonly type: string;\n}\n\nexport interface AssetConsumer {\n readonly result: Promise<LoadedAsset>;\n release(): void;\n}\n\nexport interface AssetCacheDependencies {\n readonly fetch: (url: string, init: RequestInit) => Promise<Response>;\n readonly createObjectURL: (blob: Blob) => string;\n readonly revokeObjectURL: (url: string) => void;\n}\n\ninterface CacheEntry {\n readonly key: string;\n readonly request: AssetRequest;\n readonly abortController: AbortController;\n readonly listeners: Set<(progress: AssetLoadProgress) => void>;\n references: number;\n progress: AssetLoadProgress;\n asset: LoadedAsset | null;\n result: Promise<LoadedAsset>;\n}\n\nconst initialProgress = (): AssetLoadProgress =>\n Object.freeze({ loadedBytes: 0, totalBytes: null, ratio: null });\n\nconst readTotalBytes = (response: Response): number | null => {\n const header = response.headers.get('content-length');\n\n if (header === null) {\n return null;\n }\n\n const value = Number(header);\n return Number.isFinite(value) && value >= 0 ? value : null;\n};\n\nconst calculateRatio = (loadedBytes: number, totalBytes: number | null): number | null =>\n totalBytes !== null && totalBytes > 0 ? Math.min(1, loadedBytes / totalBytes) : null;\n\nconst cacheKey = (request: AssetRequest): string =>\n JSON.stringify([request.url, request.credentials, request.cache]);\n\n/** Internal reference-counted cache used only by explicit full-file preloads. */\nexport class AssetCache {\n readonly #dependencies: AssetCacheDependencies;\n readonly #entries = new Map<string, CacheEntry>();\n\n constructor(dependencies: AssetCacheDependencies) {\n this.#dependencies = dependencies;\n }\n\n acquire(request: AssetRequest, onProgress: (progress: AssetLoadProgress) => void): AssetConsumer {\n const key = cacheKey(request);\n let entry = this.#entries.get(key);\n\n if (entry === undefined) {\n entry = this.#createEntry(key, request);\n this.#entries.set(key, entry);\n }\n\n entry.references += 1;\n entry.listeners.add(onProgress);\n onProgress(entry.progress);\n let released = false;\n\n return {\n result: entry.result,\n release: (): void => {\n if (released) {\n return;\n }\n\n released = true;\n entry.listeners.delete(onProgress);\n this.#release(entry);\n },\n };\n }\n\n #createEntry(key: string, request: AssetRequest): CacheEntry {\n const entry: CacheEntry = {\n key,\n request,\n abortController: new AbortController(),\n listeners: new Set(),\n references: 0,\n progress: initialProgress(),\n asset: null,\n result: Promise.resolve(null as never),\n };\n\n entry.result = this.#load(entry).catch((error: unknown): never => {\n if (this.#entries.get(key) === entry) {\n this.#entries.delete(key);\n }\n\n throw error;\n });\n return entry;\n }\n\n async #load(entry: CacheEntry): Promise<LoadedAsset> {\n const response = await this.#dependencies.fetch(entry.request.url, {\n signal: entry.abortController.signal,\n credentials: entry.request.credentials,\n cache: entry.request.cache,\n mode: entry.request.cache === 'only-if-cached' ? 'same-origin' : 'cors',\n });\n\n if (!response.ok) {\n throw new Error(`Full preload request failed with HTTP ${String(response.status)}.`);\n }\n\n const totalBytes = readTotalBytes(response);\n this.#publish(entry, 0, totalBytes);\n const blob = await this.#readBlob(entry, response, totalBytes);\n const objectUrl = this.#dependencies.createObjectURL(blob);\n const asset = Object.freeze({ objectUrl, size: blob.size, type: blob.type });\n entry.asset = asset;\n this.#publish(entry, blob.size, totalBytes);\n return asset;\n }\n\n async #readBlob(entry: CacheEntry, response: Response, totalBytes: number | null): Promise<Blob> {\n if (response.body === null) {\n const blob = await response.blob();\n this.#publish(entry, blob.size, totalBytes);\n return blob;\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array<ArrayBuffer>[] = [];\n let loadedBytes = 0;\n\n try {\n for (;;) {\n const chunk = await reader.read();\n\n if (chunk.done) {\n break;\n }\n\n const bytes = new Uint8Array(chunk.value);\n chunks.push(bytes);\n loadedBytes += bytes.byteLength;\n this.#publish(entry, loadedBytes, totalBytes);\n }\n } finally {\n reader.releaseLock();\n }\n\n return new Blob(chunks, {\n type: response.headers.get('content-type') ?? '',\n });\n }\n\n #publish(entry: CacheEntry, loadedBytes: number, totalBytes: number | null): void {\n const progress = Object.freeze({\n loadedBytes,\n totalBytes,\n ratio: calculateRatio(loadedBytes, totalBytes),\n });\n entry.progress = progress;\n\n for (const listener of entry.listeners) {\n listener(progress);\n }\n }\n\n #release(entry: CacheEntry): void {\n entry.references -= 1;\n\n if (entry.references > 0) {\n return;\n }\n\n if (this.#entries.get(entry.key) === entry) {\n this.#entries.delete(entry.key);\n }\n\n if (entry.asset === null) {\n entry.abortController.abort();\n return;\n }\n\n this.#dependencies.revokeObjectURL(entry.asset.objectUrl);\n }\n}\n","import { FrameByFrameError } from '../core/errors.js';\nimport { AssetCache } from './asset-cache.js';\n\nimport type {\n ControllerBindingConfig,\n ControllerVideoClipConfig,\n ControllerVideoSourceConfig,\n} from '../core/controller-config.js';\nimport type { ResolvedVideoTarget } from './video-target.js';\nimport type { AssetConsumer, AssetLoadProgress, LoadedAsset } from './asset-cache.js';\nimport type { TimelineResolution, VideoLoadProgress, VideoLoadState } from '../types.js';\n\ninterface DesiredMediaTarget {\n readonly clipId: string;\n readonly requestedTime: number;\n readonly targetTime: number;\n}\n\ninterface VideoFrameMetadataLike {\n readonly mediaTime?: number;\n readonly expectedDisplayTime?: number;\n readonly width?: number;\n readonly height?: number;\n}\n\ninterface VideoFrameTarget {\n requestVideoFrameCallback?: (\n callback: (now: number, metadata: VideoFrameMetadataLike) => void,\n ) => number;\n cancelVideoFrameCallback?: (handle: number) => void;\n}\n\ninterface TargetSnapshot {\n readonly attributes: Readonly<Record<string, string | null>>;\n readonly srcObject: unknown;\n readonly muted: boolean;\n readonly defaultMuted: boolean;\n readonly playsInline: boolean;\n readonly controls: boolean;\n readonly loop: boolean;\n readonly autoplay: boolean;\n}\n\ninterface LoadWaiter {\n readonly resolve: () => void;\n readonly reject: (error: FrameByFrameError) => void;\n}\n\ninterface ReadinessWaiter extends LoadWaiter {\n readonly clipId: string;\n readonly state: 'metadata' | 'ready';\n}\n\ninterface PreparedFullAsset {\n readonly asset: LoadedAsset;\n readonly source: ControllerVideoSourceConfig;\n readonly sourceIndex: number;\n}\n\ninterface FullAssetPreparation {\n readonly clipId: string;\n consumer: AssetConsumer | null;\n result: Promise<PreparedFullAsset>;\n}\n\nexport interface VideoRendererDependencies {\n readonly assetCache: AssetCache;\n readonly resolveUrl: (source: string, target: HTMLVideoElement) => string;\n readonly observeNearViewport: (\n target: Element,\n rootMargin: string,\n onEnter: () => void,\n ) => () => void;\n}\n\n/** Detached media state consumed by controller snapshots. */\nexport interface VideoRendererState {\n readonly loadState: VideoLoadState;\n readonly loadProgress: Readonly<Record<string, VideoLoadProgress>>;\n readonly activeClipId: string | null;\n readonly selectedSource: string | null;\n readonly duration: number | null;\n readonly appliedTime: number | null;\n readonly presentedTime: number | null;\n readonly seeking: boolean;\n readonly error: FrameByFrameError | null;\n}\n\nexport type VideoRendererEvent =\n | {\n readonly type: 'loadstart';\n readonly clipId: string;\n }\n | {\n readonly type: 'loadprogress';\n readonly clipId: string;\n readonly progress: VideoLoadProgress;\n }\n | {\n readonly type: 'loadedmetadata';\n readonly clipId: string;\n readonly duration: number | null;\n }\n | {\n readonly type: 'loadready';\n readonly clipId: string;\n }\n | {\n readonly type: 'seekrequest';\n readonly clipId: string;\n readonly requestedTime: number;\n readonly targetTime: number;\n }\n | {\n readonly type: 'frame';\n readonly clipId: string;\n readonly presentedTime: number;\n readonly expectedDisplayTime: number | null;\n readonly width: number | null;\n readonly height: number | null;\n }\n | {\n readonly type: 'error';\n readonly error: FrameByFrameError;\n };\n\n/** Renderer contract shared by native-video and canvas presentation. */\nexport interface MediaRenderer {\n prepareConfig(config: ControllerBindingConfig): VideoRendererConfigTransaction;\n setActivity(activity: VideoRendererActivity): void;\n setResolution(resolution: TimelineResolution | null): void;\n load(): Promise<void>;\n whenReady(): Promise<void>;\n unload(): void;\n resize(): void;\n getTarget(): HTMLVideoElement | HTMLCanvasElement;\n getState(): VideoRendererState;\n destroy(): void;\n}\n\n/** Native renderer specialization used by the video-only entry point. */\nexport interface VideoRenderer extends MediaRenderer {\n getTarget(): HTMLVideoElement;\n}\n\nexport type VideoRendererActivity = 'active' | 'suspended' | 'disabled';\n\nexport interface VideoRendererConfigTransaction {\n commit(): void;\n cancel(): void;\n}\n\nexport type VideoRendererFactory = (\n config: ControllerBindingConfig,\n onEvent: (event: VideoRendererEvent) => void,\n activity?: VideoRendererActivity,\n) => VideoRenderer;\n\nexport type MediaRendererFactory = (\n config: ControllerBindingConfig,\n onEvent: (event: VideoRendererEvent) => void,\n activity?: VideoRendererActivity,\n) => MediaRenderer;\n\nconst defaultAssetCache = new AssetCache({\n fetch: (url, init) => globalThis.fetch(url, init),\n createObjectURL: (blob) => globalThis.URL.createObjectURL(blob),\n revokeObjectURL: (url) => {\n globalThis.URL.revokeObjectURL(url);\n },\n});\n\nconst defaultDependencies: VideoRendererDependencies = {\n assetCache: defaultAssetCache,\n resolveUrl: (source, target) => {\n return new URL(source, target.ownerDocument.baseURI).href;\n },\n observeNearViewport: (target, rootMargin, onEnter) => {\n if (typeof globalThis.IntersectionObserver !== 'function') {\n throw new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n 'IntersectionObserver is required by target-near-viewport loading.',\n );\n }\n\n const observer = new globalThis.IntersectionObserver(\n (entries): void => {\n if (entries.some((entry) => entry.isIntersecting)) {\n onEnter();\n }\n },\n { root: null, rootMargin },\n );\n observer.observe(target);\n return (): void => {\n observer.disconnect();\n };\n },\n};\n\nconst SNAPSHOT_ATTRIBUTES = [\n 'src',\n 'preload',\n 'poster',\n 'crossorigin',\n 'muted',\n 'playsinline',\n 'controls',\n 'loop',\n 'autoplay',\n] as const;\n\nconst finiteOrNull = (value: number): number | null => (Number.isFinite(value) ? value : null);\n\nconst readDuration = (target: HTMLVideoElement): number | null => {\n const duration = finiteOrNull(target.duration);\n return duration === null ? null : Math.max(0, duration);\n};\n\nconst snapshotTarget = (target: HTMLVideoElement): TargetSnapshot => {\n const attributes: Record<string, string | null> = {};\n\n for (const attribute of SNAPSHOT_ATTRIBUTES) {\n attributes[attribute] = target.getAttribute(attribute);\n }\n\n return {\n attributes: Object.freeze(attributes),\n srcObject: target.srcObject,\n muted: target.muted,\n defaultMuted: target.defaultMuted,\n playsInline: target.playsInline,\n controls: target.controls,\n loop: target.loop,\n autoplay: target.autoplay,\n };\n};\n\nconst restoreTarget = (target: HTMLVideoElement, snapshot: TargetSnapshot): void => {\n for (const attribute of SNAPSHOT_ATTRIBUTES) {\n const value = snapshot.attributes[attribute];\n\n if (value === null || value === undefined) {\n target.removeAttribute(attribute);\n } else {\n target.setAttribute(attribute, value);\n }\n }\n\n target.srcObject = snapshot.srcObject as MediaProvider | null;\n target.muted = snapshot.muted;\n target.defaultMuted = snapshot.defaultMuted;\n target.playsInline = snapshot.playsInline;\n target.controls = snapshot.controls;\n target.loop = snapshot.loop;\n target.autoplay = snapshot.autoplay;\n\n try {\n target.load();\n } catch {\n // Restoration is best effort after every package-owned reference has been released.\n }\n};\n\nconst restoreTargetConfiguration = (target: HTMLVideoElement, snapshot: TargetSnapshot): void => {\n for (const attribute of SNAPSHOT_ATTRIBUTES) {\n if (attribute === 'src') {\n continue;\n }\n\n const value = snapshot.attributes[attribute];\n\n if (value === null || value === undefined) {\n target.removeAttribute(attribute);\n } else {\n target.setAttribute(attribute, value);\n }\n }\n\n target.muted = snapshot.muted;\n target.defaultMuted = snapshot.defaultMuted;\n target.playsInline = snapshot.playsInline;\n target.controls = snapshot.controls;\n target.loop = snapshot.loop;\n target.autoplay = snapshot.autoplay;\n};\n\nconst configureTarget = (\n target: HTMLVideoElement,\n config: ControllerBindingConfig,\n owned: boolean,\n): void => {\n target.pause();\n target.autoplay = false;\n\n if (owned) {\n const muted = config.video.muted ?? true;\n target.muted = muted;\n target.defaultMuted = muted;\n target.playsInline = config.video.playsInline ?? true;\n target.controls = config.video.controls ?? false;\n target.loop = config.video.loop ?? false;\n return;\n }\n\n if (config.video.muted !== undefined) {\n target.muted = config.video.muted;\n target.defaultMuted = config.video.muted;\n }\n\n if (config.video.playsInline !== undefined) {\n target.playsInline = config.video.playsInline;\n }\n\n if (config.video.controls !== undefined) {\n target.controls = config.video.controls;\n }\n\n if (config.video.loop !== undefined) {\n target.loop = config.video.loop;\n }\n};\n\nconst createError = (\n code:\n | 'MEDIA_SOURCE_UNSUPPORTED'\n | 'MEDIA_LOAD_FAILED'\n | 'MEDIA_DECODE_FAILED'\n | 'MEDIA_SEEK_FAILED'\n | 'FULL_PRELOAD_FAILED',\n message: string,\n bindingId: string,\n clipId: string | null,\n source: string | null,\n cause?: unknown,\n): FrameByFrameError =>\n new FrameByFrameError(code, message, {\n cause,\n details: {\n bindingId,\n clipId,\n source,\n },\n });\n\nclass NativeVideoRenderer implements VideoRenderer {\n #config: ControllerBindingConfig;\n readonly #handle: ResolvedVideoTarget;\n readonly #target: HTMLVideoElement;\n readonly #onEvent: (event: VideoRendererEvent) => void;\n readonly #snapshot: TargetSnapshot | null;\n readonly #waiters = new Set<LoadWaiter>();\n readonly #readinessWaiters = new Set<ReadinessWaiter>();\n readonly #dependencies: VideoRendererDependencies;\n readonly #viewportTarget: Element;\n readonly #fullAssets = new Map<string, FullAssetPreparation>();\n readonly #loadProgress = new Map<string, VideoLoadProgress>();\n\n #loadState: VideoLoadState = 'idle';\n #activeClipId: string | null = null;\n #selectedSource: string | null = null;\n #duration: number | null = null;\n #appliedTime: number | null = null;\n #presentedTime: number | null = null;\n #seeking = false;\n #error: FrameByFrameError | null = null;\n #desired: DesiredMediaTarget | null = null;\n #autoLoad: boolean;\n #destroyed = false;\n #generation = 0;\n #candidateSources: readonly ControllerVideoSourceConfig[] = [];\n #candidateIndex = -1;\n #removeSourceListeners: (() => void) | null = null;\n #seekInFlight = false;\n #pendingSeek: DesiredMediaTarget | null = null;\n #frameHandle: number | null = null;\n #frameToken = 0;\n #readinessGeneration = 0;\n #stopObserving: (() => void) | null = null;\n #activity: VideoRendererActivity = 'active';\n #manualUnload = false;\n\n constructor(\n config: ControllerBindingConfig,\n handle: ResolvedVideoTarget,\n onEvent: (event: VideoRendererEvent) => void,\n dependencies: VideoRendererDependencies,\n activity: VideoRendererActivity,\n viewportTarget: Element,\n ) {\n this.#config = config;\n this.#handle = handle;\n this.#target = handle.target;\n this.#onEvent = onEvent;\n this.#dependencies = dependencies;\n this.#viewportTarget = viewportTarget;\n this.#activity = activity;\n this.#snapshot = handle.owned ? null : snapshotTarget(this.#target);\n configureTarget(this.#target, config, handle.owned);\n this.#autoLoad = activity === 'active' && config.loading.mode === 'immediate';\n\n if (this.#autoLoad) {\n this.#prepareAllFullClips();\n } else if (activity === 'active' && config.loading.trigger === 'target-near-viewport') {\n try {\n this.#stopObserving = dependencies.observeNearViewport(\n this.#viewportTarget,\n config.loading.rootMargin ?? '0px',\n (): void => {\n this.#activate(true, true);\n },\n );\n } catch (cause) {\n throw cause instanceof FrameByFrameError\n ? cause\n : new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n 'The target-near-viewport observer could not be created.',\n { cause, details: { bindingId: config.id } },\n );\n }\n }\n }\n\n prepareConfig(config: ControllerBindingConfig): VideoRendererConfigTransaction {\n this.#assertNotDestroyed();\n\n if (\n config.id !== this.#config.id ||\n config.axis !== this.#config.axis ||\n config.target !== this.#config.target ||\n config.mountTo !== this.#config.mountTo\n ) {\n throw new FrameByFrameError(\n 'INVALID_BREAKPOINT_CONFIG',\n 'Responsive overrides cannot change binding identity, axis, or target ownership.',\n { details: { bindingId: this.#config.id } },\n );\n }\n\n let committed = false;\n let enteredBeforeCommit = false;\n let candidateObserver: (() => void) | null = null;\n\n if (\n this.#activity === 'active' &&\n config.loading.mode === 'on-demand' &&\n config.loading.trigger === 'target-near-viewport'\n ) {\n candidateObserver = this.#observeNearViewport(config, (): void => {\n if (committed) {\n this.#activate(true, true);\n } else {\n enteredBeforeCommit = true;\n }\n });\n }\n\n let settled = false;\n\n return {\n commit: (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n this.#stopObserving?.();\n this.#stopObserving = null;\n this.#rejectWaiters(\n createError(\n 'MEDIA_LOAD_FAILED',\n 'Media loading was superseded by a responsive configuration change.',\n this.#config.id,\n this.#activeClipId,\n this.#selectedSource,\n ),\n );\n this.#supersedeReadiness();\n this.#releaseFullAssets();\n this.#desired = null;\n this.#resetSource('idle');\n\n if (this.#snapshot !== null) {\n restoreTargetConfiguration(this.#target, this.#snapshot);\n }\n\n this.#config = config;\n configureTarget(this.#target, config, this.#handle.owned);\n this.#manualUnload = false;\n this.#autoLoad = this.#activity === 'active' && config.loading.mode === 'immediate';\n committed = true;\n\n if (this.#activity === 'active') {\n if (this.#autoLoad) {\n candidateObserver?.();\n candidateObserver = null;\n this.#prepareAllFullClips();\n } else {\n this.#stopObserving = candidateObserver;\n candidateObserver = null;\n\n if (enteredBeforeCommit) {\n this.#activate(true, true);\n }\n }\n } else {\n candidateObserver?.();\n candidateObserver = null;\n }\n },\n cancel: (): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n candidateObserver?.();\n candidateObserver = null;\n },\n };\n }\n\n setActivity(activity: VideoRendererActivity): void {\n this.#assertNotDestroyed();\n\n if (activity === this.#activity) {\n return;\n }\n\n this.#activity = activity;\n\n if (activity === 'suspended') {\n this.#cancelFrameObservation();\n return;\n }\n\n if (activity === 'disabled') {\n this.#autoLoad = false;\n this.#stopObserving?.();\n this.#stopObserving = null;\n this.#rejectWaiters(\n createError(\n 'MEDIA_LOAD_FAILED',\n 'Media loading was cancelled by the active reduced-motion behavior.',\n this.#config.id,\n this.#activeClipId,\n this.#selectedSource,\n ),\n );\n this.#supersedeReadiness();\n this.#releaseFullAssets();\n this.#desired = null;\n this.#resetSource('unloaded');\n return;\n }\n\n if (this.#manualUnload) {\n return;\n }\n\n this.#startConfiguredLoadingPolicy();\n }\n\n setResolution(resolution: TimelineResolution | null): void {\n if (this.#destroyed || resolution === null || this.#activity === 'disabled') {\n return;\n }\n\n const clipId = resolution.clipId ?? this.#config.clips[0]?.id;\n\n if (clipId === undefined) {\n return;\n }\n\n const desired: DesiredMediaTarget = {\n clipId,\n requestedTime: resolution.requestedTime,\n targetTime: resolution.targetTime,\n };\n const clipChanged = this.#desired?.clipId !== clipId;\n this.#desired = desired;\n\n if (this.#activity === 'suspended') {\n return;\n }\n\n if (\n !this.#autoLoad &&\n this.#config.loading.mode === 'on-demand' &&\n this.#config.loading.trigger === 'first-use' &&\n this.#loadState !== 'unloaded'\n ) {\n this.#activate(false, false);\n }\n\n if (clipChanged) {\n this.#supersedeReadiness();\n }\n\n if (!this.#autoLoad || this.#loadState === 'unloaded') {\n return;\n }\n\n if (clipChanged || this.#activeClipId !== clipId || this.#loadState === 'idle') {\n this.#beginDesiredClip();\n return;\n }\n\n if (this.#loadState === 'metadata' || this.#loadState === 'ready') {\n this.#requestSeek(desired);\n }\n }\n\n load(): Promise<void> {\n this.#assertNotDestroyed();\n this.#manualUnload = false;\n\n if (this.#activity === 'disabled') {\n return Promise.resolve();\n }\n\n if (this.#error?.code === 'FULL_PRELOAD_FAILED' && this.#desired !== null) {\n this.#discardFullAsset(this.#desired.clipId);\n }\n\n this.#activate(true);\n\n if (this.#desired === null) {\n const soleClip = this.#config.clips[0];\n\n if (this.#config.clips.length !== 1 || soleClip === undefined) {\n return Promise.reject(\n createError(\n 'MEDIA_LOAD_FAILED',\n 'The binding has no currently resolved clip to load.',\n this.#config.id,\n null,\n null,\n ),\n );\n }\n\n this.#desired = { clipId: soleClip.id, requestedTime: 0, targetTime: 0 };\n }\n\n if (\n this.#activeClipId === this.#desired.clipId &&\n (this.#loadState === 'metadata' || this.#loadState === 'ready')\n ) {\n return Promise.resolve();\n }\n\n const promise = new Promise<void>((resolve, reject): void => {\n this.#waiters.add({ resolve, reject });\n });\n\n if (\n this.#activeClipId !== this.#desired.clipId ||\n this.#loadState === 'idle' ||\n this.#loadState === 'unloaded' ||\n this.#loadState === 'error'\n ) {\n this.#beginDesiredClip();\n }\n\n return promise;\n }\n\n async whenReady(): Promise<void> {\n this.#assertNotDestroyed();\n\n for (;;) {\n const generation = this.#readinessGeneration;\n const tasks = this.#readinessTasks();\n await Promise.all(tasks);\n\n if (this.#destroyed) {\n throw new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed while media readiness was pending.',\n { details: { bindingId: this.#config.id } },\n );\n }\n\n if (generation === this.#readinessGeneration) {\n return;\n }\n }\n }\n\n unload(): void {\n this.#assertNotDestroyed();\n this.#manualUnload = true;\n this.#autoLoad = false;\n this.#stopObserving?.();\n this.#stopObserving = null;\n this.#rejectWaiters(\n createError(\n 'MEDIA_LOAD_FAILED',\n 'Media loading was cancelled by unload().',\n this.#config.id,\n this.#activeClipId,\n this.#selectedSource,\n ),\n );\n this.#supersedeReadiness();\n this.#releaseFullAssets();\n this.#resetSource('unloaded');\n }\n\n resize(): void {\n this.#assertNotDestroyed();\n }\n\n getTarget(): HTMLVideoElement {\n this.#assertNotDestroyed();\n return this.#target;\n }\n\n getState(): VideoRendererState {\n return {\n loadState: this.#loadState,\n loadProgress: Object.freeze(Object.fromEntries(this.#loadProgress)),\n activeClipId: this.#activeClipId,\n selectedSource: this.#selectedSource,\n duration: this.#duration,\n appliedTime: this.#appliedTime,\n presentedTime: this.#presentedTime,\n seeking: this.#seeking,\n error: this.#error,\n };\n }\n\n destroy(): void {\n if (this.#destroyed) {\n return;\n }\n\n this.#destroyed = true;\n this.#autoLoad = false;\n this.#stopObserving?.();\n this.#stopObserving = null;\n this.#rejectWaiters(\n new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed while media was loading.',\n { details: { bindingId: this.#config.id } },\n ),\n );\n this.#rejectReadinessWaiters(\n new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The controller was destroyed while media readiness was pending.',\n { details: { bindingId: this.#config.id } },\n ),\n );\n this.#releaseFullAssets();\n this.#resetSource('unloaded');\n\n try {\n if (this.#snapshot !== null) {\n restoreTarget(this.#target, this.#snapshot);\n }\n } finally {\n this.#handle.release();\n }\n }\n\n #activate(prepareAllFullClips: boolean, beginDesired = true): void {\n if (this.#activity !== 'active') {\n return;\n }\n\n const changed = !this.#autoLoad;\n this.#autoLoad = true;\n this.#stopObserving?.();\n this.#stopObserving = null;\n\n if (changed) {\n this.#supersedeReadiness();\n }\n\n if (prepareAllFullClips) {\n this.#prepareAllFullClips();\n }\n\n if (\n beginDesired &&\n this.#desired !== null &&\n (changed ||\n this.#activeClipId !== this.#desired.clipId ||\n this.#loadState === 'idle' ||\n this.#loadState === 'unloaded' ||\n this.#loadState === 'error')\n ) {\n this.#beginDesiredClip();\n }\n }\n\n #observeNearViewport(config: ControllerBindingConfig, onEnter: () => void): () => void {\n try {\n return this.#dependencies.observeNearViewport(\n this.#viewportTarget,\n config.loading.rootMargin ?? '0px',\n onEnter,\n );\n } catch (cause) {\n throw cause instanceof FrameByFrameError\n ? cause\n : new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n 'The target-near-viewport observer could not be created.',\n { cause, details: { bindingId: config.id } },\n );\n }\n }\n\n #startConfiguredLoadingPolicy(): void {\n this.#stopObserving?.();\n this.#stopObserving = null;\n if (this.#loadState === 'unloaded') {\n this.#loadState = 'idle';\n }\n this.#autoLoad = this.#config.loading.mode === 'immediate';\n\n if (this.#autoLoad) {\n this.#prepareAllFullClips();\n\n if (this.#desired !== null) {\n if (\n this.#activeClipId === this.#desired.clipId &&\n (this.#loadState === 'metadata' || this.#loadState === 'ready')\n ) {\n this.#requestSeek(this.#desired);\n } else {\n this.#beginDesiredClip();\n }\n }\n return;\n }\n\n if (this.#config.loading.trigger === 'target-near-viewport') {\n this.#stopObserving = this.#observeNearViewport(this.#config, (): void => {\n this.#activate(true, true);\n });\n }\n\n if (this.#config.loading.trigger === 'first-use' && this.#desired !== null) {\n this.#activate(false, true);\n }\n }\n\n #prepareAllFullClips(): void {\n for (const clip of this.#config.clips) {\n if (clip.preload === 'full') {\n const preparation = this.#ensureFullAsset(clip, 0);\n void preparation.result.catch((): void => undefined);\n }\n }\n }\n\n #ensureFullAsset(clip: ControllerVideoClipConfig, startIndex: number): FullAssetPreparation {\n const current = this.#fullAssets.get(clip.id);\n\n if (current !== undefined) {\n return current;\n }\n\n const candidates = this.#playableSources(clip);\n const preparation: FullAssetPreparation = {\n clipId: clip.id,\n consumer: null,\n result: Promise.resolve(null as never),\n };\n preparation.result = this.#loadFullAssetCandidates(\n preparation,\n clip,\n candidates,\n startIndex,\n ).catch((cause: unknown): never => {\n const error =\n cause instanceof FrameByFrameError\n ? cause\n : createError(\n 'FULL_PRELOAD_FAILED',\n `Every full-preload source failed for video clip \"${clip.id}\".`,\n this.#config.id,\n clip.id,\n candidates.at(-1)?.src ?? null,\n cause,\n );\n\n if (this.#fullAssets.get(clip.id) === preparation && !this.#destroyed) {\n this.#error = error;\n this.#emit({ type: 'error', error });\n }\n\n throw error;\n });\n this.#fullAssets.set(clip.id, preparation);\n return preparation;\n }\n\n async #loadFullAssetCandidates(\n preparation: FullAssetPreparation,\n clip: ControllerVideoClipConfig,\n candidates: readonly ControllerVideoSourceConfig[],\n startIndex: number,\n ): Promise<PreparedFullAsset> {\n let lastCause: unknown;\n\n for (let sourceIndex = startIndex; sourceIndex < candidates.length; sourceIndex += 1) {\n const source = candidates[sourceIndex];\n\n if (source === undefined) {\n continue;\n }\n\n try {\n const url = this.#dependencies.resolveUrl(source.src, this.#target);\n const consumer = this.#dependencies.assetCache.acquire(\n {\n url,\n credentials: this.#config.loading.credentials,\n cache: this.#config.loading.cache,\n },\n (progress): void => {\n if (this.#fullAssets.get(clip.id) === preparation) {\n this.#publishProgress(clip.id, progress);\n }\n },\n );\n preparation.consumer = consumer;\n\n try {\n const asset = await consumer.result;\n return Object.freeze({ asset, source, sourceIndex });\n } catch (cause) {\n lastCause = cause;\n consumer.release();\n preparation.consumer = null;\n }\n } catch (cause) {\n lastCause = cause;\n }\n }\n\n throw createError(\n 'FULL_PRELOAD_FAILED',\n `Every full-preload source failed for video clip \"${clip.id}\".`,\n this.#config.id,\n clip.id,\n candidates.at(-1)?.src ?? null,\n lastCause,\n );\n }\n\n #publishProgress(clipId: string, progress: AssetLoadProgress): void {\n const snapshot = Object.freeze({ ...progress });\n this.#loadProgress.set(clipId, snapshot);\n this.#emit({ type: 'loadprogress', clipId, progress: snapshot });\n }\n\n #releaseFullAssets(): void {\n for (const preparation of this.#fullAssets.values()) {\n preparation.consumer?.release();\n }\n\n this.#fullAssets.clear();\n this.#loadProgress.clear();\n }\n\n #discardFullAsset(clipId: string): void {\n const preparation = this.#fullAssets.get(clipId);\n preparation?.consumer?.release();\n this.#fullAssets.delete(clipId);\n this.#loadProgress.delete(clipId);\n }\n\n #readinessTasks(): Promise<unknown>[] {\n if (!this.#autoLoad) {\n return [];\n }\n\n const tasks: Promise<unknown>[] = [...this.#fullAssets.values()].map(\n (preparation) => preparation.result,\n );\n const desired = this.#desired;\n\n if (desired === null) {\n return tasks;\n }\n\n const clip = this.#config.clips.find((candidate) => candidate.id === desired.clipId);\n\n if (clip === undefined || clip.preload === 'none') {\n return tasks;\n }\n\n if (clip.preload === 'full') {\n const preparation = this.#ensureFullAsset(clip, 0);\n\n if (!tasks.includes(preparation.result)) {\n tasks.push(preparation.result);\n }\n }\n\n tasks.push(this.#waitForReadiness(clip.id, clip.preload === 'metadata' ? 'metadata' : 'ready'));\n return tasks;\n }\n\n #waitForReadiness(clipId: string, state: 'metadata' | 'ready'): Promise<void> {\n if (this.#activeClipId === clipId && this.#hasReadiness(state)) {\n return Promise.resolve();\n }\n\n if (this.#activeClipId === clipId && this.#loadState === 'error' && this.#error !== null) {\n return Promise.reject(this.#error);\n }\n\n return new Promise<void>((resolve, reject): void => {\n this.#readinessWaiters.add({ clipId, state, resolve, reject });\n });\n }\n\n #hasReadiness(state: 'metadata' | 'ready'): boolean {\n return state === 'metadata'\n ? this.#loadState === 'metadata' || this.#loadState === 'ready'\n : this.#loadState === 'ready';\n }\n\n #resolveReadinessWaiters(): void {\n for (const waiter of this.#readinessWaiters) {\n if (waiter.clipId === this.#activeClipId && this.#hasReadiness(waiter.state)) {\n waiter.resolve();\n this.#readinessWaiters.delete(waiter);\n }\n }\n }\n\n #supersedeReadiness(): void {\n this.#readinessGeneration += 1;\n\n for (const waiter of this.#readinessWaiters) {\n waiter.resolve();\n }\n\n this.#readinessWaiters.clear();\n }\n\n #rejectReadinessWaiters(error: FrameByFrameError): void {\n for (const waiter of this.#readinessWaiters) {\n waiter.reject(error);\n }\n\n this.#readinessWaiters.clear();\n }\n\n #playableSources(clip: ControllerVideoClipConfig): readonly ControllerVideoSourceConfig[] {\n return clip.sources.filter((source) => {\n if (source.type === null) {\n return true;\n }\n\n try {\n return this.#target.canPlayType(source.type) !== '';\n } catch {\n return false;\n }\n });\n }\n\n #beginDesiredClip(): void {\n const desired = this.#desired;\n\n if (desired === null) {\n return;\n }\n\n const clip = this.#config.clips.find((candidate) => candidate.id === desired.clipId);\n\n if (clip === undefined) {\n this.#fail(\n createError(\n 'MEDIA_SOURCE_UNSUPPORTED',\n `Video clip \"${desired.clipId}\" is not configured.`,\n this.#config.id,\n desired.clipId,\n null,\n ),\n );\n return;\n }\n\n const candidates = this.#playableSources(clip);\n\n if (candidates.length === 0) {\n this.#fail(\n createError(\n 'MEDIA_SOURCE_UNSUPPORTED',\n `No playable source is available for video clip \"${clip.id}\".`,\n this.#config.id,\n clip.id,\n null,\n ),\n );\n return;\n }\n\n this.#candidateSources = candidates;\n this.#candidateIndex = 0;\n\n if (clip.preload === 'full') {\n this.#startFullCandidate(clip, 0);\n } else {\n this.#startCandidate(clip, candidates[0]);\n }\n }\n\n #startFullCandidate(clip: ControllerVideoClipConfig, startIndex: number): void {\n const source = this.#candidateSources[startIndex];\n\n if (source === undefined || this.#destroyed) {\n return;\n }\n\n const generation = this.#prepareCandidate(clip, source);\n const preparation = this.#ensureFullAsset(clip, startIndex);\n void preparation.result.then(\n (prepared): void => {\n if (!this.#isCurrentGeneration(generation)) {\n return;\n }\n\n this.#candidateIndex = prepared.sourceIndex;\n this.#selectedSource = prepared.source.src;\n this.#loadTargetSource(prepared.asset.objectUrl, generation);\n },\n (error: unknown): void => {\n const packageError =\n error instanceof FrameByFrameError\n ? error\n : createError(\n 'FULL_PRELOAD_FAILED',\n `Full preload failed for video clip \"${clip.id}\".`,\n this.#config.id,\n clip.id,\n source.src,\n error,\n );\n\n if (this.#isCurrentGeneration(generation)) {\n this.#fail(packageError, this.#error !== packageError);\n }\n },\n );\n }\n\n #startCandidate(\n clip: ControllerVideoClipConfig,\n source: ControllerVideoSourceConfig | undefined,\n ): void {\n if (source === undefined || this.#destroyed) {\n return;\n }\n\n const generation = this.#prepareCandidate(clip, source);\n this.#loadTargetSource(source.src, generation);\n }\n\n #prepareCandidate(clip: ControllerVideoClipConfig, source: ControllerVideoSourceConfig): number {\n const generation = ++this.#generation;\n this.#cancelFrameObservation();\n this.#removeSourceListeners?.();\n this.#removeSourceListeners = null;\n this.#seekInFlight = false;\n this.#pendingSeek = null;\n this.#seeking = false;\n this.#activeClipId = clip.id;\n this.#selectedSource = source.src;\n this.#duration = null;\n this.#appliedTime = null;\n this.#presentedTime = null;\n this.#error = null;\n this.#loadState = 'loading';\n this.#applyClipAttributes(clip);\n this.#emit({ type: 'loadstart', clipId: clip.id });\n return generation;\n }\n\n #loadTargetSource(targetSource: string, generation: number): void {\n this.#attachSourceListeners(generation);\n\n try {\n this.#target.pause();\n this.#target.srcObject = null;\n this.#target.setAttribute('src', targetSource);\n this.#target.load();\n } catch (cause) {\n this.#handleSourceFailure(generation, cause);\n }\n }\n\n #applyClipAttributes(clip: ControllerVideoClipConfig): void {\n this.#target.preload = clip.preload === 'full' ? 'auto' : clip.preload;\n\n if (clip.poster === null) {\n this.#target.removeAttribute('poster');\n } else {\n this.#target.poster = clip.poster;\n }\n\n if (clip.crossOrigin === null) {\n this.#target.removeAttribute('crossorigin');\n } else {\n this.#target.crossOrigin = clip.crossOrigin;\n }\n }\n\n #attachSourceListeners(generation: number): void {\n const loadedMetadata = (): void => {\n if (this.#isCurrentGeneration(generation)) {\n this.#handleLoadedMetadata();\n }\n };\n const loadedData = (): void => {\n if (this.#isCurrentGeneration(generation)) {\n this.#handleLoadedData();\n }\n };\n const seeked = (): void => {\n if (this.#isCurrentGeneration(generation)) {\n this.#handleSeeked();\n }\n };\n const error = (): void => {\n if (this.#isCurrentGeneration(generation)) {\n this.#handleSourceFailure(generation, this.#target.error);\n }\n };\n\n this.#target.addEventListener('loadedmetadata', loadedMetadata);\n this.#target.addEventListener('loadeddata', loadedData);\n this.#target.addEventListener('seeked', seeked);\n this.#target.addEventListener('error', error);\n\n this.#removeSourceListeners = (): void => {\n this.#target.removeEventListener('loadedmetadata', loadedMetadata);\n this.#target.removeEventListener('loadeddata', loadedData);\n this.#target.removeEventListener('seeked', seeked);\n this.#target.removeEventListener('error', error);\n };\n }\n\n #handleLoadedMetadata(): void {\n const clipId = this.#activeClipId;\n\n if (clipId === null) {\n return;\n }\n\n this.#duration = readDuration(this.#target);\n this.#loadState = 'metadata';\n this.#error = null;\n this.#emit({ type: 'loadedmetadata', clipId, duration: this.#duration });\n this.#resolveWaiters();\n this.#resolveReadinessWaiters();\n\n if (this.#activity === 'active' && this.#desired?.clipId === clipId) {\n this.#requestSeek(this.#desired);\n }\n }\n\n #handleLoadedData(): void {\n const clipId = this.#activeClipId;\n\n if (clipId === null) {\n return;\n }\n\n this.#loadState = 'ready';\n this.#emit({ type: 'loadready', clipId });\n this.#resolveReadinessWaiters();\n\n if (this.#activity !== 'active') {\n return;\n }\n\n if (this.#supportsVideoFrameCallback()) {\n this.#scheduleFrameObservation();\n } else if (!this.#seekInFlight) {\n this.#presentFrame(this.#target.currentTime, null, null, null);\n }\n }\n\n #handleSeeked(): void {\n this.#seekInFlight = false;\n this.#seeking = false;\n\n if (this.#activity === 'active' && !this.#supportsVideoFrameCallback()) {\n this.#presentFrame(this.#target.currentTime, null, null, null);\n }\n\n const pending = this.#pendingSeek;\n this.#pendingSeek = null;\n\n if (this.#activity === 'active' && pending !== null && pending.clipId === this.#activeClipId) {\n this.#requestSeek(pending);\n }\n }\n\n #requestSeek(desired: DesiredMediaTarget): void {\n if (\n this.#activity !== 'active' ||\n desired.clipId !== this.#activeClipId ||\n this.#loadState === 'loading'\n ) {\n return;\n }\n\n const targetTime =\n this.#duration === null\n ? Math.max(0, desired.targetTime)\n : Math.min(this.#duration, Math.max(0, desired.targetTime));\n const normalized = { ...desired, targetTime };\n const reference =\n this.#pendingSeek?.targetTime ?? this.#appliedTime ?? this.#target.currentTime;\n\n if (Math.abs(reference - targetTime) <= this.#config.timeEpsilon) {\n return;\n }\n\n if (this.#seekInFlight) {\n this.#pendingSeek = normalized;\n return;\n }\n\n this.#applySeek(normalized);\n }\n\n #applySeek(desired: DesiredMediaTarget): void {\n try {\n this.#target.currentTime = desired.targetTime;\n this.#appliedTime = desired.targetTime;\n this.#seekInFlight = true;\n this.#seeking = true;\n this.#emit({\n type: 'seekrequest',\n clipId: desired.clipId,\n requestedTime: desired.requestedTime,\n targetTime: desired.targetTime,\n });\n this.#scheduleFrameObservation();\n } catch (cause) {\n this.#fail(\n createError(\n 'MEDIA_SEEK_FAILED',\n 'The native video target rejected a seek request.',\n this.#config.id,\n desired.clipId,\n this.#selectedSource,\n cause,\n ),\n );\n }\n }\n\n #scheduleFrameObservation(): void {\n if (\n this.#activity !== 'active' ||\n !this.#supportsVideoFrameCallback() ||\n this.#activeClipId === null\n ) {\n return;\n }\n\n this.#cancelFrameObservation();\n const generation = this.#generation;\n const token = ++this.#frameToken;\n const request = (this.#target as unknown as VideoFrameTarget).requestVideoFrameCallback;\n\n if (request === undefined) {\n return;\n }\n\n this.#frameHandle = request.call(this.#target, (_now, metadata): void => {\n if (\n this.#destroyed ||\n generation !== this.#generation ||\n token !== this.#frameToken ||\n this.#activeClipId === null\n ) {\n return;\n }\n\n this.#frameHandle = null;\n const presentedTime =\n typeof metadata.mediaTime === 'number' && Number.isFinite(metadata.mediaTime)\n ? metadata.mediaTime\n : this.#target.currentTime;\n this.#presentFrame(\n presentedTime,\n finiteOrNull(metadata.expectedDisplayTime ?? Number.NaN),\n finiteOrNull(metadata.width ?? Number.NaN),\n finiteOrNull(metadata.height ?? Number.NaN),\n );\n });\n }\n\n #presentFrame(\n presentedTime: number,\n expectedDisplayTime: number | null,\n width: number | null,\n height: number | null,\n ): void {\n const clipId = this.#activeClipId;\n\n if (this.#activity !== 'active' || clipId === null || !Number.isFinite(presentedTime)) {\n return;\n }\n\n this.#presentedTime = presentedTime;\n this.#emit({\n type: 'frame',\n clipId,\n presentedTime,\n expectedDisplayTime,\n width,\n height,\n });\n }\n\n #handleSourceFailure(generation: number, cause: unknown): void {\n if (!this.#isCurrentGeneration(generation)) {\n return;\n }\n\n const nextIndex = this.#candidateIndex + 1;\n const desiredClip = this.#activeClipId;\n const clip = this.#config.clips.find((candidate) => candidate.id === desiredClip);\n\n if (clip !== undefined && nextIndex < this.#candidateSources.length) {\n this.#candidateIndex = nextIndex;\n\n if (clip.preload === 'full') {\n this.#discardFullAsset(clip.id);\n this.#startFullCandidate(clip, nextIndex);\n } else {\n this.#startCandidate(clip, this.#candidateSources[nextIndex]);\n }\n return;\n }\n\n const mediaErrorCode = this.#target.error?.code;\n const code =\n mediaErrorCode === 3\n ? 'MEDIA_DECODE_FAILED'\n : mediaErrorCode === 4\n ? 'MEDIA_SOURCE_UNSUPPORTED'\n : 'MEDIA_LOAD_FAILED';\n this.#fail(\n createError(\n code,\n code === 'MEDIA_DECODE_FAILED'\n ? 'The browser could not decode the selected video clip.'\n : code === 'MEDIA_SOURCE_UNSUPPORTED'\n ? 'The browser could not use any source for the selected video clip.'\n : 'The selected video clip failed to load.',\n this.#config.id,\n this.#activeClipId,\n this.#selectedSource,\n cause,\n ),\n );\n }\n\n #fail(error: FrameByFrameError, emit = true): void {\n ++this.#generation;\n this.#cancelFrameObservation();\n this.#removeSourceListeners?.();\n this.#removeSourceListeners = null;\n this.#seekInFlight = false;\n this.#pendingSeek = null;\n this.#seeking = false;\n this.#loadState = 'error';\n this.#error = error;\n this.#rejectWaiters(error);\n this.#rejectReadinessWaiters(error);\n\n if (emit) {\n this.#emit({ type: 'error', error });\n }\n }\n\n #resetSource(loadState: 'idle' | 'unloaded'): void {\n ++this.#generation;\n this.#cancelFrameObservation();\n this.#removeSourceListeners?.();\n this.#removeSourceListeners = null;\n this.#seekInFlight = false;\n this.#pendingSeek = null;\n this.#seeking = false;\n this.#activeClipId = null;\n this.#selectedSource = null;\n this.#duration = null;\n this.#appliedTime = null;\n this.#presentedTime = null;\n this.#error = null;\n this.#loadState = loadState;\n\n try {\n this.#target.pause();\n this.#target.srcObject = null;\n this.#target.removeAttribute('src');\n this.#target.load();\n } catch {\n // Cleanup remains idempotent even if a custom element-like target rejects load().\n }\n }\n\n #supportsVideoFrameCallback(): boolean {\n return (\n typeof (this.#target as unknown as VideoFrameTarget).requestVideoFrameCallback === 'function'\n );\n }\n\n #cancelFrameObservation(): void {\n ++this.#frameToken;\n\n if (this.#frameHandle === null) {\n return;\n }\n\n try {\n const cancel = (this.#target as unknown as VideoFrameTarget).cancelVideoFrameCallback;\n\n if (cancel !== undefined) {\n cancel.call(this.#target, this.#frameHandle);\n }\n } catch {\n // The generation token still invalidates a callback that cannot be cancelled.\n }\n\n this.#frameHandle = null;\n }\n\n #resolveWaiters(): void {\n for (const waiter of this.#waiters) {\n waiter.resolve();\n }\n\n this.#waiters.clear();\n }\n\n #rejectWaiters(error: FrameByFrameError): void {\n for (const waiter of this.#waiters) {\n waiter.reject(error);\n }\n\n this.#waiters.clear();\n }\n\n #emit(event: VideoRendererEvent): void {\n if (!this.#destroyed) {\n this.#onEvent(event);\n }\n }\n\n #isCurrentGeneration(generation: number): boolean {\n return !this.#destroyed && generation === this.#generation;\n }\n\n #assertNotDestroyed(): void {\n if (this.#destroyed) {\n throw new FrameByFrameError(\n 'CONTROLLER_DESTROYED',\n 'The video renderer has already been destroyed.',\n { details: { bindingId: this.#config.id } },\n );\n }\n }\n}\n\n/** Creates one native video renderer around an already resolved and claimed target. */\nexport const createNativeVideoRenderer = (\n config: ControllerBindingConfig,\n handle: ResolvedVideoTarget,\n onEvent: (event: VideoRendererEvent) => void,\n dependencies: VideoRendererDependencies = defaultDependencies,\n activity: VideoRendererActivity = 'active',\n viewportTarget: Element = handle.target,\n): VideoRenderer =>\n new NativeVideoRenderer(config, handle, onEvent, dependencies, activity, viewportTarget);\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport type { ControllerBindingConfig } from '../core/controller-config.js';\n\n/** A claimed video target and its package ownership metadata. */\nexport interface ResolvedVideoTarget {\n readonly target: HTMLVideoElement;\n readonly owned: boolean;\n release(): void;\n}\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null;\n\nexport const isMediaDocument = (value: unknown): value is Document =>\n isRecord(value) &&\n value['nodeType'] === 9 &&\n typeof value['querySelector'] === 'function' &&\n typeof value['createElement'] === 'function';\n\nexport const isMediaHtmlElement = (value: unknown): value is HTMLElement =>\n isRecord(value) &&\n value['nodeType'] === 1 &&\n typeof value['appendChild'] === 'function' &&\n isMediaDocument(value['ownerDocument']);\n\nconst getElementName = (value: Readonly<Record<string, unknown>>): string => {\n const localName = value['localName'];\n\n if (typeof localName === 'string') {\n return localName.toLowerCase();\n }\n\n const tagName = value['tagName'];\n return typeof tagName === 'string' ? tagName.toLowerCase() : '';\n};\n\nexport const isMediaVideoElement = (value: unknown): value is HTMLVideoElement =>\n isRecord(value) &&\n value['nodeType'] === 1 &&\n getElementName(value) === 'video' &&\n typeof value['addEventListener'] === 'function' &&\n typeof value['removeEventListener'] === 'function' &&\n typeof value['canPlayType'] === 'function' &&\n typeof value['load'] === 'function' &&\n typeof value['pause'] === 'function' &&\n typeof value['getAttribute'] === 'function' &&\n typeof value['setAttribute'] === 'function' &&\n typeof value['removeAttribute'] === 'function' &&\n typeof value['currentTime'] === 'number';\n\nconst getGlobalDocument = (): Document | null => {\n const candidate: unknown = (globalThis as { readonly document?: unknown }).document;\n return isMediaDocument(candidate) ? candidate : null;\n};\n\nconst targetError = (\n code: 'TARGET_NOT_FOUND' | 'INVALID_TARGET_TYPE',\n bindingId: string,\n message: string,\n cause: unknown,\n): never => {\n throw new FrameByFrameError(code, message, {\n cause,\n details: { bindingId },\n });\n};\n\nexport const resolveMediaReference = (\n reference: unknown,\n bindingId: string,\n label: string,\n): unknown => {\n let candidate = reference;\n\n if (typeof candidate === 'function') {\n try {\n candidate = (candidate as () => unknown)();\n } catch (cause) {\n return targetError(\n 'TARGET_NOT_FOUND',\n bindingId,\n `The ${label} resolver threw an error.`,\n cause,\n );\n }\n }\n\n if (typeof candidate === 'string') {\n const document = getGlobalDocument();\n\n if (document === null) {\n throw new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n `A browser document is required to resolve the ${label} selector.`,\n { details: { bindingId } },\n );\n }\n\n try {\n candidate = document.querySelector(candidate);\n } catch (cause) {\n return targetError('TARGET_NOT_FOUND', bindingId, `The ${label} selector is invalid.`, cause);\n }\n }\n\n if (candidate === null || candidate === undefined) {\n return targetError(\n 'TARGET_NOT_FOUND',\n bindingId,\n `The ${label} could not be resolved.`,\n candidate,\n );\n }\n\n return candidate;\n};\n\n/** Prevents more than one mounted binding from writing to the same target. */\nexport class VideoTargetRegistry {\n readonly #owners = new WeakMap<object, object>();\n\n acquire(target: HTMLVideoElement, owner: object, bindingId: string): () => void {\n if (this.#owners.has(target)) {\n throw new FrameByFrameError(\n 'TARGET_CONFLICT',\n 'The video target is already controlled by another mounted binding.',\n { details: { bindingId } },\n );\n }\n\n this.#owners.set(target, owner);\n let active = true;\n\n return (): void => {\n if (!active) {\n return;\n }\n\n active = false;\n\n if (this.#owners.get(target) === owner) {\n this.#owners.delete(target);\n }\n };\n }\n}\n\nconst createOwnedTarget = (mountTo: HTMLElement, bindingId: string): HTMLVideoElement => {\n const document: unknown = mountTo.ownerDocument;\n\n if (!isMediaDocument(document)) {\n throw new FrameByFrameError(\n 'ENVIRONMENT_UNAVAILABLE',\n 'The mount container does not expose an owner document.',\n { details: { bindingId } },\n );\n }\n\n const target: unknown = document.createElement('video');\n\n if (!isMediaVideoElement(target)) {\n return targetError(\n 'INVALID_TARGET_TYPE',\n bindingId,\n 'The owner document could not create an HTMLVideoElement.',\n target,\n );\n }\n\n mountTo.appendChild(target);\n return target;\n};\n\n/** Resolves, creates, and globally claims one binding's native video target. */\nexport const resolveVideoTarget = (\n config: ControllerBindingConfig,\n registry: VideoTargetRegistry,\n): ResolvedVideoTarget => {\n const owner = {};\n let target: HTMLVideoElement;\n let owned = false;\n\n if (config.target !== undefined) {\n const candidate = resolveMediaReference(config.target, config.id, 'video target');\n\n if (!isMediaVideoElement(candidate)) {\n return targetError(\n 'INVALID_TARGET_TYPE',\n config.id,\n 'The resolved target must be an HTMLVideoElement.',\n candidate,\n );\n }\n\n target = candidate;\n } else {\n const candidate = resolveMediaReference(config.mountTo, config.id, 'video mount container');\n\n if (!isMediaHtmlElement(candidate)) {\n return targetError(\n 'INVALID_TARGET_TYPE',\n config.id,\n 'The resolved mountTo value must be an HTMLElement.',\n candidate,\n );\n }\n\n target = createOwnedTarget(candidate, config.id);\n owned = true;\n }\n\n let releaseOwnership: (() => void) | null = null;\n\n try {\n releaseOwnership = registry.acquire(target, owner, config.id);\n } catch (error) {\n if (owned) {\n target.parentNode?.removeChild(target);\n }\n\n throw error;\n }\n\n let active = true;\n\n return {\n target,\n owned,\n release: (): void => {\n if (!active) {\n return;\n }\n\n active = false;\n releaseOwnership();\n\n if (owned) {\n target.parentNode?.removeChild(target);\n }\n },\n };\n};\n","import { FrameByFrameError } from '../core/errors.js';\n\nimport type { ScrollSource } from '../types.js';\n\ninterface ScrollMetricsTarget {\n readonly scrollLeft: number;\n readonly scrollTop: number;\n readonly scrollWidth: number;\n readonly scrollHeight: number;\n readonly clientWidth: number;\n readonly clientHeight: number;\n}\n\ninterface AnimationFrameHost {\n requestAnimationFrame(callback: FrameRequestCallback): number;\n cancelAnimationFrame(handle: number): void;\n}\n\n/** A canonical scroll source with the browser capabilities used by the scheduler. */\nexport interface ResolvedScrollSource {\n readonly key: object;\n readonly publicSource: ScrollSource;\n readonly eventTarget: EventTarget;\n readonly metricsTarget: ScrollMetricsTarget;\n readonly requestFrame: (callback: FrameRequestCallback) => number;\n readonly cancelFrame: (handle: number) => void;\n}\n\nconst isRecord = (value: unknown): value is Readonly<Record<string, unknown>> =>\n typeof value === 'object' && value !== null;\n\nconst hasEventTargetMethods = (value: Readonly<Record<string, unknown>>): boolean =>\n typeof value['addEventListener'] === 'function' &&\n typeof value['removeEventListener'] === 'function';\n\nconst isDocument = (value: unknown): value is Document =>\n isRecord(value) &&\n value['nodeType'] === 9 &&\n hasEventTargetMethods(value) &&\n typeof value['querySelector'] === 'function' &&\n isRecord(value['documentElement']);\n\nconst isHtmlElement = (value: unknown): value is HTMLElement =>\n isRecord(value) &&\n value['nodeType'] === 1 &&\n hasEventTargetMethods(value) &&\n typeof value['scrollLeft'] === 'number' &&\n typeof value['scrollTop'] === 'number' &&\n typeof value['scrollWidth'] === 'number' &&\n typeof value['scrollHeight'] === 'number' &&\n typeof value['clientWidth'] === 'number' &&\n typeof value['clientHeight'] === 'number';\n\nconst isAnimationFrameHost = (value: unknown): value is AnimationFrameHost =>\n isRecord(value) &&\n typeof value['requestAnimationFrame'] === 'function' &&\n typeof value['cancelAnimationFrame'] === 'function';\n\nconst getGlobalDocument = (): Document | null => {\n const candidate: unknown = (globalThis as { readonly document?: unknown }).document;\n return isDocument(candidate) ? candidate : null;\n};\n\nconst getGlobalWindow = (): unknown => (globalThis as { readonly window?: unknown }).window;\n\nconst environmentUnavailable = (message: string): never => {\n throw new FrameByFrameError('ENVIRONMENT_UNAVAILABLE', message);\n};\n\nconst sourceNotFound = (message: string, cause: unknown): never => {\n throw new FrameByFrameError('SOURCE_NOT_FOUND', message, { cause });\n};\n\nconst getDocumentMetricsTarget = (documentSource: Document): HTMLElement => {\n const metricsTarget = documentSource.scrollingElement ?? documentSource.documentElement;\n\n if (!isHtmlElement(metricsTarget)) {\n return sourceNotFound('The document does not expose a valid scrolling element.', metricsTarget);\n }\n\n return metricsTarget;\n};\n\nconst getOwnerDocument = (source: Document | HTMLElement): Document | null => {\n if (isDocument(source)) {\n return source;\n }\n\n const ownerDocument: unknown = source.ownerDocument;\n return isDocument(ownerDocument) ? ownerDocument : null;\n};\n\nconst resolveFrameHost = (source: Document | HTMLElement): AnimationFrameHost => {\n const ownerDocument = getOwnerDocument(source);\n const ownerWindow: unknown = ownerDocument?.defaultView;\n const frameHost = isAnimationFrameHost(ownerWindow) ? ownerWindow : getGlobalWindow();\n\n if (!isAnimationFrameHost(frameHost)) {\n return environmentUnavailable(\n 'requestAnimationFrame and cancelAnimationFrame are required to mount a controller.',\n );\n }\n\n return frameHost;\n};\n\nconst canonicalizeSource = (source: Document | HTMLElement): Document | HTMLElement => {\n if (isDocument(source)) {\n return source;\n }\n\n const ownerDocument = getOwnerDocument(source);\n\n if (\n ownerDocument !== null &&\n (source === ownerDocument.scrollingElement ||\n (ownerDocument.scrollingElement === null && source === ownerDocument.documentElement))\n ) {\n return ownerDocument;\n }\n\n return source;\n};\n\nconst resolveReference = (reference: unknown): Document | HTMLElement => {\n let candidate = reference;\n\n if (typeof candidate === 'function') {\n try {\n candidate = (candidate as () => unknown)();\n } catch (cause) {\n return sourceNotFound('The scroll source resolver threw an error.', cause);\n }\n }\n\n if (candidate === undefined) {\n const globalDocument = getGlobalDocument();\n\n if (globalDocument === null) {\n return environmentUnavailable(\n 'A browser document is required when no scroll source is provided.',\n );\n }\n\n return globalDocument;\n }\n\n if (typeof candidate === 'string') {\n const globalDocument = getGlobalDocument();\n\n if (globalDocument === null) {\n return environmentUnavailable('A browser document is required to resolve a selector.');\n }\n\n let selected: Element | null;\n\n try {\n selected = globalDocument.querySelector(candidate);\n } catch (cause) {\n return sourceNotFound(`The scroll source selector \"${candidate}\" is invalid.`, cause);\n }\n\n if (!isHtmlElement(selected)) {\n return sourceNotFound(\n `The scroll source selector \"${candidate}\" did not resolve to an HTMLElement.`,\n selected,\n );\n }\n\n return selected;\n }\n\n if (!isDocument(candidate) && !isHtmlElement(candidate)) {\n return sourceNotFound(\n 'The scroll source must be a Document, HTMLElement, selector, or synchronous resolver.',\n candidate,\n );\n }\n\n return candidate;\n};\n\n/** Resolves and canonicalizes a configured source without accessing the DOM before mount. */\nexport const resolveScrollSource = (reference: unknown): ResolvedScrollSource => {\n const source = canonicalizeSource(resolveReference(reference));\n const frameHost = resolveFrameHost(source);\n const metricsTarget = isDocument(source) ? getDocumentMetricsTarget(source) : source;\n\n return {\n key: source,\n publicSource: source,\n eventTarget: source,\n metricsTarget,\n requestFrame: frameHost.requestAnimationFrame.bind(frameHost),\n cancelFrame: frameHost.cancelAnimationFrame.bind(frameHost),\n };\n};\n","import type { AxisName } from '../types.js';\nimport type { ResolvedScrollSource } from './source.js';\n\n/** Scroll metrics read once and shared with every controller on a source. */\nexport interface ScrollAxisSnapshot {\n readonly offset: number;\n readonly max: number;\n readonly progress: number;\n}\n\n/** Horizontal and vertical metrics captured in one scheduler pass. */\nexport type ScrollSourceSnapshot = Readonly<Record<AxisName, ScrollAxisSnapshot>>;\n\nexport type ScrollSourceSubscriber = (snapshot: ScrollSourceSnapshot) => void;\nexport type AsyncErrorReporter = (error: unknown) => void;\n\nconst clampProgress = (value: number): number => Math.min(1, Math.max(0, value));\n\nconst finiteOrZero = (value: number): number => (Number.isFinite(value) ? value : 0);\n\nconst createAxisSnapshot = (offset: number, max: number): ScrollAxisSnapshot => ({\n offset,\n max,\n progress: max === 0 ? 0 : clampProgress(offset / max),\n});\n\n/** One passive listener and at most one pending animation frame per scroll source. */\nexport class SourceScheduler {\n readonly #source: ResolvedScrollSource;\n readonly #reportAsyncError: AsyncErrorReporter;\n readonly #subscribers = new Set<ScrollSourceSubscriber>();\n readonly #handleScroll = (): void => {\n this.#schedule();\n };\n readonly #handleFrame = (): void => {\n this.#frameHandle = null;\n const snapshot = this.getSnapshot();\n\n for (const subscriber of [...this.#subscribers]) {\n try {\n subscriber(snapshot);\n } catch (error) {\n this.#reportAsyncError(error);\n }\n }\n };\n\n #frameHandle: number | null = null;\n #xMax = 0;\n #yMax = 0;\n\n constructor(source: ResolvedScrollSource, reportAsyncError: AsyncErrorReporter) {\n this.#source = source;\n this.#reportAsyncError = reportAsyncError;\n }\n\n subscribe(subscriber: ScrollSourceSubscriber): () => void {\n const shouldAttach = this.#subscribers.size === 0;\n this.#subscribers.add(subscriber);\n\n if (shouldAttach) {\n try {\n this.#source.eventTarget.addEventListener('scroll', this.#handleScroll, { passive: true });\n } catch (error) {\n this.#subscribers.delete(subscriber);\n throw error;\n }\n }\n\n let active = true;\n\n return (): void => {\n if (!active) {\n return;\n }\n\n active = false;\n this.#subscribers.delete(subscriber);\n\n if (this.#subscribers.size === 0) {\n this.#source.eventTarget.removeEventListener('scroll', this.#handleScroll);\n\n if (this.#frameHandle !== null) {\n this.#source.cancelFrame(this.#frameHandle);\n this.#frameHandle = null;\n }\n }\n };\n }\n\n refresh(): ScrollSourceSnapshot {\n const metrics = this.#source.metricsTarget;\n this.#xMax = Math.max(0, finiteOrZero(metrics.scrollWidth) - finiteOrZero(metrics.clientWidth));\n this.#yMax = Math.max(\n 0,\n finiteOrZero(metrics.scrollHeight) - finiteOrZero(metrics.clientHeight),\n );\n return this.getSnapshot();\n }\n\n getSnapshot(): ScrollSourceSnapshot {\n const metrics = this.#source.metricsTarget;\n const x = createAxisSnapshot(finiteOrZero(metrics.scrollLeft), this.#xMax);\n const y = createAxisSnapshot(finiteOrZero(metrics.scrollTop), this.#yMax);\n\n return Object.freeze({\n x: Object.freeze(x),\n y: Object.freeze(y),\n });\n }\n\n #schedule(): void {\n if (this.#frameHandle === null && this.#subscribers.size > 0) {\n this.#frameHandle = this.#source.requestFrame(this.#handleFrame);\n }\n }\n}\n\n/** Weakly keys the shared scheduler used by every controller on one source. */\nexport class SourceRegistry {\n readonly #schedulers = new WeakMap<object, SourceScheduler>();\n readonly #reportAsyncError: AsyncErrorReporter;\n\n constructor(reportAsyncError: AsyncErrorReporter) {\n this.#reportAsyncError = reportAsyncError;\n }\n\n get(source: ResolvedScrollSource): SourceScheduler {\n const existing = this.#schedulers.get(source.key);\n\n if (existing !== undefined) {\n return existing;\n }\n\n const scheduler = new SourceScheduler(source, this.#reportAsyncError);\n this.#schedulers.set(source.key, scheduler);\n return scheduler;\n }\n}\n","import { createController } from './controller.js';\nimport { createNativeVideoRenderer } from '../media/video-renderer.js';\nimport { resolveVideoTarget, VideoTargetRegistry } from '../media/video-target.js';\nimport { resolveScrollSource } from '../scroll/source.js';\nimport { SourceRegistry } from '../scroll/source-scheduler.js';\n\nimport type { VideoRendererFactory } from '../media/video-renderer.js';\nimport type { FrameByFrameController, FrameByFrameOptions } from '../types.js';\n\nexport const reportAsyncError = (error: unknown): void => {\n globalThis.queueMicrotask((): void => {\n throw error;\n });\n};\n\nexport const sourceRegistry: SourceRegistry = new SourceRegistry(reportAsyncError);\nexport const videoTargetRegistry: VideoTargetRegistry = new VideoTargetRegistry();\nexport const createVideoRenderer: VideoRendererFactory = (config, onEvent, activity) => {\n const handle = resolveVideoTarget(config, videoTargetRegistry);\n\n try {\n return createNativeVideoRenderer(config, handle, onEvent, undefined, activity);\n } catch (error) {\n handle.release();\n throw error;\n }\n};\n\n/** Creates an SSR-safe controller; browser capabilities are resolved by mount(). */\nexport const createFrameByFrame = (options: FrameByFrameOptions): FrameByFrameController =>\n createController(options, {\n resolveSource: resolveScrollSource,\n sourceRegistry,\n reportAsyncError,\n createRenderer: createVideoRenderer,\n supportedRenderers: new Set(['video']),\n }) as FrameByFrameController;\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { $ as Timeline, F as FrameByFrameErrorOptions, M as FrameByFrameErrorCode, N as FrameByFrameErrorDetails, P as FrameByFrameErrorInfo, et as TimelineOptions } from "./types-BYfMRnsj.js";
2
+ //#region src/core/errors.d.ts
3
+ /** An error with a stable package-specific code and structured context. */
4
+ declare class FrameByFrameError extends Error implements FrameByFrameErrorInfo {
5
+ override readonly name = "FrameByFrameError";
6
+ override readonly cause: unknown;
7
+ readonly code: FrameByFrameErrorCode;
8
+ readonly details: FrameByFrameErrorDetails | undefined;
9
+ constructor(code: FrameByFrameErrorCode, message: string, options?: FrameByFrameErrorOptions);
10
+ }
11
+ //#endregion
12
+ //#region src/mapping/timeline.d.ts
13
+ /** Creates an immutable, DOM-independent scroll-to-media timeline. */
14
+ declare const createTimeline: (options: TimelineOptions) => Timeline;
15
+ //#endregion
16
+ export { FrameByFrameError as n, createTimeline as t };
17
+ //# sourceMappingURL=timeline-DDuRBPRJ.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timeline-DDuRBPRJ.d.ts","names":[],"sources":["../src/core/errors.ts","../src/mapping/timeline.ts"],"mappings":";;;cAQa,0BAA0B,iBAAiB;oBACpC;oBACA;WACT,MAAM;WACN,SAAS;EAElB,YACE,MAAM,uBACN,iBACA,UAAS;;;;;cC2FA,iBAAkB,SAAS,oBAAkB"}