react-fastload 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/PriorityEngine.ts","../src/core/ResourceRegistry.ts","../src/core/Scheduler.ts","../src/utils/browserSupport.ts","../src/observers/ViewportObserver.ts","../src/utils/connection.ts","../src/core/LoadManager.ts","../src/observers/PerformanceObserver.ts","../src/metrics/WebVitals.ts","../src/metrics/ResourceMetrics.ts","../src/metrics/MetricsCollector.ts","../src/components/FastLoadProvider.tsx","../src/hooks/useLazyLoad.ts","../src/resources/ImageLoader.ts","../src/components/SmartImage.tsx","../src/resources/VideoLoader.ts","../src/components/SmartVideo.tsx","../src/resources/AudioLoader.ts","../src/components/SmartAudio.tsx","../src/resources/ComponentLoader.ts","../src/components/LazyComponent.tsx","../src/hooks/usePriority.ts","../src/hooks/useFastLoadMetrics.ts"],"names":["useRef","useState","useEffect","_a","useMemo","jsx","resolvePriority","jsxs","PlayGlyph","_b","_c","React"],"mappings":"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","file":"index.js","sourcesContent":["import type { ConnectionInfo, Priority, ResourceRecord } from \"./types\";\n\nconst PRIORITY_ORDER: Record<Priority, number> = {\n CRITICAL: 0,\n HIGH: 1,\n NORMAL: 2,\n LOW: 3,\n IDLE: 4,\n};\n\nexport interface PriorityContext {\n connection: ConnectionInfo;\n /** Preload distance in pixels, as configured on the provider. */\n preloadDistance: number;\n}\n\n/**\n * PriorityEngine turns a resource's declared priority plus live signals\n * (viewport distance, network conditions) into an *effective* priority\n * score used purely for ordering within the scheduler. It never mutates\n * the resource's declared priority — that stays whatever the developer set.\n */\nexport class PriorityEngine {\n /**\n * Lower score = loaded sooner. CRITICAL always sorts first regardless\n * of other signals, per the \"never delay explicitly critical resources\"\n * requirement.\n */\n score(resource: ResourceRecord, ctx: PriorityContext): number {\n if (resource.priority === \"CRITICAL\") return -Infinity;\n\n let score = PRIORITY_ORDER[resource.priority] * 1000;\n\n // Closer resources should load sooner within the same priority band.\n const distance = resource.viewportDistance;\n if (typeof distance === \"number\") {\n // Resources already in view (distance <= 0) get a strong boost.\n score += Math.max(distance, 0) / 10;\n } else {\n // Unknown viewport position (e.g. not yet observed): treat as far away,\n // but not so far it beats explicit LOW/IDLE ordering.\n score += 500;\n }\n\n // On slow/constrained connections, push LOW and IDLE priority further back\n // to avoid competing with visible content for limited bandwidth.\n if (this.isConstrainedConnection(ctx.connection)) {\n if (resource.priority === \"LOW\" || resource.priority === \"IDLE\") {\n score += 2000;\n }\n }\n\n return score;\n }\n\n compare(a: ResourceRecord, b: ResourceRecord, ctx: PriorityContext): number {\n return this.score(a, ctx) - this.score(b, ctx);\n }\n\n isConstrainedConnection(connection: ConnectionInfo): boolean {\n if (connection.saveData) return true;\n if (!connection.supported) return false;\n if (connection.effectiveType === \"slow-2g\" || connection.effectiveType === \"2g\") {\n return true;\n }\n if (typeof connection.downlink === \"number\" && connection.downlink > 0 && connection.downlink < 1.5) {\n return true;\n }\n return false;\n }\n\n /** Whether a resource sitting at `distance` px from the viewport should become eligible. */\n isWithinPreloadZone(distance: number | undefined, preloadDistance: number): boolean {\n if (typeof distance !== \"number\") return false;\n return distance <= preloadDistance;\n }\n}\n","import type {\n RegisterResourceInput,\n ResourceRecord,\n ResourceState,\n} from \"./types\";\n\ntype Listener = (resources: ResourceRecord[]) => void;\n\n/**\n * ResourceRegistry is the single source of truth for every resource\n * ReactFastLoad knows about. It does not make loading decisions itself —\n * that's the PriorityEngine and Scheduler's job — it only stores state\n * and notifies subscribers when that state changes.\n */\nexport class ResourceRegistry {\n private resources = new Map<string, ResourceRecord>();\n private listeners = new Set<Listener>();\n\n register(input: RegisterResourceInput): ResourceRecord {\n const existing = this.resources.get(input.id);\n if (existing) {\n return existing;\n }\n\n const record: ResourceRecord = {\n id: input.id,\n type: input.type,\n priority: input.priority,\n strategy: input.strategy,\n state: \"idle\",\n estimatedSize: input.estimatedSize,\n meta: input.meta,\n deferred: false,\n prefetched: false,\n abortController: typeof AbortController !== \"undefined\" ? new AbortController() : undefined,\n timestamps: {\n registeredAt: now(),\n },\n };\n\n this.resources.set(input.id, record);\n this.emit();\n return record;\n }\n\n unregister(id: string): void {\n if (this.resources.delete(id)) {\n this.emit();\n }\n }\n\n get(id: string): ResourceRecord | undefined {\n return this.resources.get(id);\n }\n\n has(id: string): boolean {\n return this.resources.has(id);\n }\n\n all(): ResourceRecord[] {\n return Array.from(this.resources.values());\n }\n\n byState(state: ResourceState): ResourceRecord[] {\n return this.all().filter((r) => r.state === state);\n }\n\n update(id: string, patch: Partial<ResourceRecord>): ResourceRecord | undefined {\n const record = this.resources.get(id);\n if (!record) return undefined;\n\n const updated: ResourceRecord = {\n ...record,\n ...patch,\n timestamps: { ...record.timestamps, ...patch.timestamps },\n };\n this.resources.set(id, updated);\n this.emit();\n return updated;\n }\n\n /**\n * Returns the CURRENT record after the transition — not the stale\n * pre-call reference. This matters: a caller that does\n * `const r = registry.setState(id, \"eligible\")` must see `r.state ===\n * \"eligible\"`, not whatever `r` looked like before this call, since\n * `update()` replaces the Map entry with a new object rather than\n * mutating the old one in place. (This exact mismatch was a real bug\n * in LoadManager.register(), caught by a clean-install runtime smoke\n * test — see CHANGELOG.) Returns `undefined` only if `id` isn't\n * registered at all.\n */\n setState(id: string, state: ResourceState): ResourceRecord | undefined {\n const record = this.resources.get(id);\n if (!record) return undefined;\n if (record.state === state) return record;\n\n const timestamps = { ...record.timestamps };\n const t = now();\n if (state === \"eligible\" && !timestamps.eligibleAt) timestamps.eligibleAt = t;\n if (state === \"loading\" && !timestamps.loadStartedAt) timestamps.loadStartedAt = t;\n if ((state === \"loaded\" || state === \"error\") && !timestamps.loadEndedAt) {\n timestamps.loadEndedAt = t;\n }\n\n return this.update(id, { state, timestamps });\n }\n\n setViewportDistance(id: string, distance: number): void {\n this.update(id, { viewportDistance: distance });\n }\n\n markDeferred(id: string): void {\n this.update(id, { deferred: true });\n }\n\n markPrefetched(id: string): void {\n this.update(id, { prefetched: true });\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n clear(): void {\n this.resources.clear();\n this.emit();\n }\n\n /** Aggregate counters used by the metrics layer. Pure derived data, no side effects. */\n summary() {\n const all = this.all();\n let deferredRequests = 0;\n let bytesDeferred = 0;\n let imagesDeferred = 0;\n let videosDeferred = 0;\n let audiosDeferred = 0;\n let componentsDeferred = 0;\n\n for (const r of all) {\n if (r.deferred) {\n deferredRequests += 1;\n bytesDeferred += r.estimatedSize ?? 0;\n if (r.type === \"image\") imagesDeferred += 1;\n if (r.type === \"video\") videosDeferred += 1;\n if (r.type === \"audio\") audiosDeferred += 1;\n if (r.type === \"component\") componentsDeferred += 1;\n }\n }\n\n return {\n totalRequests: all.length,\n initialRequests: all.filter((r) => !r.deferred).length,\n deferredRequests,\n deferredResources: deferredRequests,\n bytesDeferred,\n imagesDeferred,\n videosDeferred,\n audiosDeferred,\n componentsDeferred,\n };\n }\n\n private emit(): void {\n const snapshot = this.all();\n for (const listener of this.listeners) listener(snapshot);\n }\n}\n\nfunction now(): number {\n return typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? performance.now()\n : Date.now();\n}\n","import { PriorityEngine, type PriorityContext } from \"./PriorityEngine\";\nimport { ResourceRegistry } from \"./ResourceRegistry\";\nimport type { ResourceRecord, SchedulerDecision, SchedulerOptions } from \"./types\";\n\nexport type LoaderFn = (resource: ResourceRecord) => Promise<void>;\n\ninterface RunOptions {\n ctx: PriorityContext;\n}\n\n/**\n * Scheduler is the central coordinator described in the architecture:\n *\n * Registry -> PriorityEngine -> signals -> Scheduler -> loading decision\n *\n * It owns no DOM logic and knows nothing about images/video/components —\n * it only decides, given the current registry state and priority scores,\n * which *eligible* resources get a loader slot right now, respecting a\n * concurrency cap so competing requests don't starve visible content.\n *\n * Loaders are registered per resource type by the resources/* modules and\n * invoked by the scheduler when it decides to load a resource.\n */\nexport class Scheduler {\n private concurrency: number;\n private onDecision?: (decision: SchedulerDecision) => void;\n private activeCount = 0;\n private loaders = new Map<string, LoaderFn>();\n private decisions: SchedulerDecision[] = [];\n private readonly maxDecisionLog = 200;\n private scheduled = false;\n\n constructor(\n private registry: ResourceRegistry,\n private priorityEngine: PriorityEngine,\n options: SchedulerOptions = {}\n ) {\n this.concurrency = options.concurrency ?? 4;\n this.onDecision = options.onDecision;\n }\n\n /** Register the function used to actually load a given resource id (called once per resource). */\n registerLoader(resourceId: string, loader: LoaderFn): void {\n this.loaders.set(resourceId, loader);\n }\n\n unregisterLoader(resourceId: string): void {\n this.loaders.delete(resourceId);\n }\n\n /**\n * Request a scheduling pass. Coalesced into a microtask so multiple\n * rapid registry updates (e.g. many IntersectionObserver callbacks in\n * one frame) only trigger a single pass.\n */\n requestPass(ctx: PriorityContext): void {\n if (this.scheduled) return;\n this.scheduled = true;\n queueMicrotask(() => {\n this.scheduled = false;\n this.runPass({ ctx });\n });\n }\n\n /** Synchronous scheduling pass, exposed directly for tests and advanced use. */\n runPass({ ctx }: RunOptions): void {\n const eligible = this.registry\n .byState(\"eligible\")\n .slice()\n .sort((a, b) => this.priorityEngine.compare(a, b, ctx));\n\n let freeSlots = this.concurrency - this.activeCount;\n if (freeSlots <= 0) return;\n\n for (const resource of eligible) {\n if (freeSlots <= 0) break;\n\n const loader = this.loaders.get(resource.id);\n if (!loader) continue; // no loader registered yet; skip until it is\n\n freeSlots -= 1;\n this.dispatch(resource, loader);\n }\n }\n\n private dispatch(resource: ResourceRecord, loader: LoaderFn): void {\n this.activeCount += 1;\n this.registry.setState(resource.id, \"loading\");\n this.record({\n resourceId: resource.id,\n action: \"load\",\n reason: `priority=${resource.priority} distance=${resource.viewportDistance ?? \"unknown\"}`,\n timestamp: nowMs(),\n });\n\n loader(resource)\n .then(() => {\n this.registry.setState(resource.id, \"loaded\");\n })\n .catch(() => {\n this.registry.setState(resource.id, \"error\");\n })\n .finally(() => {\n this.activeCount -= 1;\n this.unregisterLoader(resource.id);\n });\n }\n\n /** Explicitly defer a resource (used by observers when it leaves the preload zone again, or on slow connections). */\n defer(resourceId: string, reason: string): void {\n this.registry.markDeferred(resourceId);\n this.record({ resourceId, action: \"defer\", reason, timestamp: nowMs() });\n }\n\n prefetch(resourceId: string, reason: string): void {\n this.registry.markPrefetched(resourceId);\n this.record({ resourceId, action: \"prefetch\", reason, timestamp: nowMs() });\n }\n\n getDecisionLog(): SchedulerDecision[] {\n return this.decisions.slice();\n }\n\n private record(decision: SchedulerDecision): void {\n this.decisions.push(decision);\n if (this.decisions.length > this.maxDecisionLog) {\n this.decisions.shift();\n }\n this.onDecision?.(decision);\n }\n}\n\nfunction nowMs(): number {\n return typeof performance !== \"undefined\" ? performance.now() : Date.now();\n}\n","/**\n * Centralized feature-detection so the rest of the codebase never sprinkles\n * `typeof window !== \"undefined\"` checks everywhere, and so SSR doesn't crash.\n */\n\nexport const isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\nexport function supportsIntersectionObserver(): boolean {\n return isBrowser && typeof (window as any).IntersectionObserver === \"function\";\n}\n\nexport function supportsPerformanceObserver(): boolean {\n return isBrowser && typeof PerformanceObserver !== \"undefined\";\n}\n\nexport function supportsNavigationTiming(): boolean {\n return (\n isBrowser &&\n typeof performance !== \"undefined\" &&\n typeof performance.getEntriesByType === \"function\"\n );\n}\n\nexport function supportsNetworkInformation(): boolean {\n return isBrowser && \"connection\" in navigator;\n}\n\nexport function supportsRequestIdleCallback(): boolean {\n return isBrowser && \"requestIdleCallback\" in window;\n}\n\n/** Schedule non-urgent work using requestIdleCallback where available, falling back to a short timeout. */\nexport function scheduleIdle(callback: () => void, timeout = 200): void {\n if (supportsRequestIdleCallback()) {\n (window as any).requestIdleCallback(callback, { timeout });\n } else if (isBrowser) {\n window.setTimeout(callback, 1);\n } else {\n callback();\n }\n}\n\nexport function supportsFetchPriority(): boolean {\n if (!isBrowser) return false;\n const img = document.createElement(\"img\");\n return \"fetchPriority\" in img;\n}\n","import { supportsIntersectionObserver } from \"../utils/browserSupport\";\n\nexport type ViewportCallback = (distance: number, isIntersecting: boolean) => void;\n\n/**\n * Thin, testable wrapper around IntersectionObserver.\n *\n * Rather than only exposing a boolean \"is it visible\", this computes an\n * approximate pixel distance from the viewport so the PriorityEngine can\n * rank near-viewport resources ahead of far-off ones, and so `rootMargin`\n * (the preload distance) can be configured per observer instance.\n *\n * Falls back to reporting elements as immediately eligible when\n * IntersectionObserver isn't supported (very old browsers, some SSR/test\n * environments) — a graceful degrade rather than a crash, per the\n * \"progressive enhancement\" requirement.\n */\nexport class ViewportObserver {\n private observer?: IntersectionObserver;\n private callbacks = new Map<Element, ViewportCallback>();\n private preloadDistance: number;\n\n constructor(preloadDistance = 1000) {\n this.preloadDistance = preloadDistance;\n\n if (supportsIntersectionObserver()) {\n this.observer = new IntersectionObserver(\n (entries) => this.handleEntries(entries),\n {\n root: null,\n rootMargin: `${preloadDistance}px`,\n threshold: [0, 0.01, 0.5, 1],\n }\n );\n }\n }\n\n observe(element: Element, callback: ViewportCallback): void {\n this.callbacks.set(element, callback);\n\n if (!this.observer) {\n // No IntersectionObserver support: treat everything as already in range\n // rather than never loading it at all.\n callback(0, true);\n return;\n }\n\n this.observer.observe(element);\n }\n\n unobserve(element: Element): void {\n this.callbacks.delete(element);\n this.observer?.unobserve(element);\n }\n\n disconnect(): void {\n this.observer?.disconnect();\n this.callbacks.clear();\n }\n\n private handleEntries(entries: IntersectionObserverEntry[]): void {\n for (const entry of entries) {\n const callback = this.callbacks.get(entry.target);\n if (!callback) continue;\n\n const distance = estimateDistance(entry);\n callback(distance, entry.isIntersecting);\n }\n }\n}\n\n/**\n * Approximates the pixel distance between the viewport (its expanded\n * rootMargin box, since that's what IntersectionObserver measured against)\n * and the target element. When intersecting, distance is 0 or negative.\n */\nfunction estimateDistance(entry: IntersectionObserverEntry): number {\n if (entry.isIntersecting) return 0;\n\n const target = entry.boundingClientRect;\n const root = entry.rootBounds;\n\n if (!root) {\n // No rootBounds (e.g. root is not attached / some test doubles) — we\n // can't compute a real distance, so report \"far away\" rather than guessing.\n return Number.POSITIVE_INFINITY;\n }\n\n if (target.bottom < root.top) return root.top - target.bottom;\n if (target.top > root.bottom) return target.top - root.bottom;\n if (target.right < root.left) return root.left - target.right;\n if (target.left > root.right) return target.left - root.right;\n return 0;\n}\n","import { isBrowser, supportsNetworkInformation } from \"./browserSupport\";\nimport type { ConnectionInfo } from \"../core/types\";\n\ninterface NetworkInformationLike {\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n addEventListener?: (type: \"change\", listener: () => void) => void;\n removeEventListener?: (type: \"change\", listener: () => void) => void;\n}\n\nfunction getConnectionApi(): NetworkInformationLike | undefined {\n if (!isBrowser) return undefined;\n const nav = navigator as Navigator & {\n connection?: NetworkInformationLike;\n mozConnection?: NetworkInformationLike;\n webkitConnection?: NetworkInformationLike;\n };\n return nav.connection ?? nav.mozConnection ?? nav.webkitConnection;\n}\n\n/**\n * Reads the current network conditions using the Network Information API\n * where supported. Never invents values: unsupported fields are `null`,\n * and callers must treat that as \"unknown\", not \"fast\".\n */\nexport function getConnectionInfo(): ConnectionInfo {\n const conn = getConnectionApi();\n const supported = supportsNetworkInformation() && !!conn;\n\n if (!supported || !conn) {\n return {\n effectiveType: null,\n downlink: null,\n rtt: null,\n saveData: false,\n supported: false,\n };\n }\n\n return {\n effectiveType: conn.effectiveType ?? null,\n downlink: typeof conn.downlink === \"number\" ? conn.downlink : null,\n rtt: typeof conn.rtt === \"number\" ? conn.rtt : null,\n saveData: conn.saveData ?? false,\n supported: true,\n };\n}\n\n/** Subscribes to connection changes; no-ops (returns a noop unsubscribe) when unsupported/SSR. */\nexport function subscribeToConnectionChange(\n onChange: (info: ConnectionInfo) => void\n): () => void {\n const conn = getConnectionApi();\n if (!conn || typeof conn.addEventListener !== \"function\") {\n return () => {};\n }\n\n const handler = () => onChange(getConnectionInfo());\n conn.addEventListener(\"change\", handler);\n return () => conn.removeEventListener?.(\"change\", handler);\n}\n","import { PriorityEngine } from \"./PriorityEngine\";\nimport { ResourceRegistry } from \"./ResourceRegistry\";\nimport { Scheduler, type LoaderFn } from \"./Scheduler\";\nimport { ViewportObserver, type ViewportCallback } from \"../observers/ViewportObserver\";\nimport { getConnectionInfo, subscribeToConnectionChange } from \"../utils/connection\";\nimport type {\n ConnectionInfo,\n FastLoadDebugSnapshot,\n Priority,\n RegisterResourceInput,\n SchedulerDecision,\n} from \"./types\";\n\nexport interface LoadManagerOptions {\n preloadDistance?: number;\n concurrency?: number;\n debug?: boolean;\n}\n\n/**\n * LoadManager wires together the registry, priority engine, and scheduler\n * into the single object that FastLoadProvider creates and shares via\n * context. This is the \"central intellectual component\" the architecture\n * calls for — resource wrappers (SmartImage, SmartVideo, LazyComponent)\n * only ever talk to a LoadManager instance, never to the DOM-observation\n * or scheduling internals directly.\n *\n * Two behaviors worth calling out because they're easy to get wrong:\n *\n * 1. Request deduplication: `register()` is reference-counted. Two\n * mounted components that resolve to the SAME resource id (by default,\n * `${type}:${src}` — see SmartImage/SmartVideo/SmartAudio) share ONE\n * registry entry, one loader call, and one AbortController. The entry\n * is only actually removed — and its AbortController only actually\n * aborted — once every consumer has unregistered. Without this, an\n * id reused by two instances would let the first unmount delete a\n * resource the second instance still depends on.\n * 2. Viewport observation is centralized here as ONE shared\n * IntersectionObserver for the whole provider, not one per resource.\n * An earlier version had each `useLazyLoad` call create its own\n * ViewportObserver — harmless correctness-wise, but wasteful: a page\n * with 50 resources was creating 50 separate native\n * IntersectionObserver instances all doing the same kind of work.\n */\nexport class LoadManager {\n readonly registry: ResourceRegistry;\n readonly priorityEngine: PriorityEngine;\n readonly scheduler: Scheduler;\n readonly viewportObserver: ViewportObserver;\n readonly preloadDistance: number;\n readonly debug: boolean;\n\n private connection: ConnectionInfo;\n private unsubscribeConnection?: () => void;\n private refCounts = new Map<string, number>();\n\n constructor(options: LoadManagerOptions = {}) {\n this.preloadDistance = options.preloadDistance ?? 1000;\n this.debug = options.debug ?? false;\n this.registry = new ResourceRegistry();\n this.priorityEngine = new PriorityEngine();\n this.viewportObserver = new ViewportObserver(this.preloadDistance);\n this.connection = getConnectionInfo();\n\n this.scheduler = new Scheduler(this.registry, this.priorityEngine, {\n concurrency: options.concurrency ?? 4,\n onDecision: this.debug ? (d) => this.logDecision(d) : undefined,\n });\n\n this.unsubscribeConnection = subscribeToConnectionChange((info) => {\n this.connection = info;\n this.requestPass();\n });\n }\n\n register(input: RegisterResourceInput) {\n const refCount = (this.refCounts.get(input.id) ?? 0) + 1;\n this.refCounts.set(input.id, refCount);\n\n let record = this.registry.register(input);\n if (input.strategy === \"eager\" || input.priority === \"CRITICAL\") {\n // Eager/critical resources skip viewport gating entirely. Idempotent —\n // safe to call again for a resource a second consumer just joined.\n // Use setState's return value, not the pre-call `record` above —\n // registry updates replace the stored object rather than mutating\n // it in place, so `record` itself would otherwise still read\n // \"idle\" even though the registry's own state is now \"eligible\".\n record = this.registry.setState(record.id, \"eligible\") ?? record;\n this.requestPass();\n }\n return record;\n }\n\n /**\n * Decrements the id's reference count. Only when it reaches zero — i.e.\n * the last mounted consumer of this resource has unmounted — does this\n * actually abort any in-flight load, remove the scheduler's loader, and\n * delete the registry entry. See the class doc for why.\n */\n unregister(id: string): void {\n const remaining = (this.refCounts.get(id) ?? 1) - 1;\n if (remaining > 0) {\n this.refCounts.set(id, remaining);\n return;\n }\n this.refCounts.delete(id);\n\n const record = this.registry.get(id);\n // Abort only if nothing else is using it (refCount just hit zero) and\n // it never finished — aborting a resource other consumers still want,\n // or one that already loaded successfully, would be a real bug (the\n // \"don't abort resources shared by other consumers\" requirement).\n if (record && record.state !== \"loaded\" && record.state !== \"error\") {\n record.abortController?.abort();\n }\n\n this.scheduler.unregisterLoader(id);\n this.registry.unregister(id);\n }\n\n setLoader(id: string, loader: LoaderFn): void {\n this.scheduler.registerLoader(id, loader);\n this.requestPass();\n }\n\n /**\n * Attaches the shared ViewportObserver to an element for a given\n * resource id. Returns an unobserve function. A no-op (returning a\n * no-op cleanup) for resources that skip viewport gating — callers\n * don't need to branch on that themselves.\n */\n observeViewport(id: string, element: Element): () => void {\n const callback: ViewportCallback = (distance) => this.reportViewportDistance(id, distance);\n this.viewportObserver.observe(element, callback);\n return () => this.viewportObserver.unobserve(element);\n }\n\n /** Called whenever a resource's distance-from-viewport changes. */\n reportViewportDistance(id: string, distance: number): void {\n const record = this.registry.get(id);\n if (!record) return;\n\n this.registry.setViewportDistance(id, distance);\n\n if (record.state === \"idle\") {\n const withinZone = this.priorityEngine.isWithinPreloadZone(distance, this.preloadDistance);\n if (withinZone) {\n this.registry.setState(id, \"eligible\");\n if (distance > 0) {\n this.scheduler.prefetch(id, `entered preload zone at ${Math.round(distance)}px`);\n }\n } else {\n this.scheduler.defer(id, `outside preload zone (${Math.round(distance)}px > ${this.preloadDistance}px)`);\n }\n }\n\n this.requestPass();\n }\n\n requestPass(): void {\n this.scheduler.requestPass({\n connection: this.connection,\n preloadDistance: this.preloadDistance,\n });\n }\n\n getConnection(): ConnectionInfo {\n return this.connection;\n }\n\n getDebugSnapshot(): FastLoadDebugSnapshot {\n return {\n resources: this.registry.all(),\n decisions: this.scheduler.getDecisionLog(),\n connection: this.connection,\n };\n }\n\n setPriority(id: string, priority: Priority): void {\n this.registry.update(id, { priority });\n this.requestPass();\n }\n\n destroy(): void {\n this.unsubscribeConnection?.();\n this.viewportObserver.disconnect();\n this.refCounts.clear();\n this.registry.clear();\n }\n\n private logDecision(decision: SchedulerDecision): void {\n if (typeof console === \"undefined\") return;\n // eslint-disable-next-line no-console\n console.debug(\n `[react-fastload] ${decision.action} \"${decision.resourceId}\" — ${decision.reason}`\n );\n }\n}\n","import { supportsPerformanceObserver } from \"../utils/browserSupport\";\n\nexport type PerfEntryCallback = (entries: PerformanceEntry[]) => void;\n\n/**\n * Thin wrapper around the native PerformanceObserver, used by the metrics\n * layer to collect Paint Timing, LCP, CLS, and Resource Timing entries.\n * Every subscription degrades gracefully: if a given `entryType` isn't\n * supported by the browser, `observe` simply never fires for it instead\n * of throwing.\n */\nexport class BrowserPerformanceObserver {\n private observers: PerformanceObserver[] = [];\n\n observe(entryTypes: string[], callback: PerfEntryCallback, options?: { buffered?: boolean }): void {\n if (!supportsPerformanceObserver()) return;\n\n for (const type of entryTypes) {\n try {\n const observer = new PerformanceObserver((list) => {\n callback(list.getEntries());\n });\n observer.observe({ type, buffered: options?.buffered ?? true } as PerformanceObserverInit);\n this.observers.push(observer);\n } catch {\n // Entry type unsupported in this browser (e.g. \"largest-contentful-paint\"\n // on older Firefox). Skip silently rather than crashing the app.\n }\n }\n }\n\n disconnect(): void {\n for (const observer of this.observers) observer.disconnect();\n this.observers = [];\n }\n}\n","import { BrowserPerformanceObserver } from \"../observers/PerformanceObserver\";\nimport { supportsNavigationTiming } from \"../utils/browserSupport\";\n\nexport interface WebVitalsSnapshot {\n /** First Contentful Paint, in ms. null until observed or if unsupported. */\n fcp: number | null;\n /** Largest Contentful Paint, in ms. Updates as later, larger candidates appear. */\n lcp: number | null;\n /** Cumulative Layout Shift score (unitless). Accumulates for the page's lifetime. */\n cls: number | null;\n}\n\ntype Listener = (snapshot: WebVitalsSnapshot) => void;\n\n/**\n * Collects real, browser-measured Core Web Vitals via PerformanceObserver.\n * This module does NOT estimate or simulate these values — if the browser\n * doesn't support a given entry type, the corresponding field simply stays\n * `null` rather than being backfilled with a guess.\n */\nexport class WebVitals {\n private snapshot: WebVitalsSnapshot = { fcp: null, lcp: null, cls: null };\n private listeners = new Set<Listener>();\n private perfObserver = new BrowserPerformanceObserver();\n private clsAccumulator = 0;\n\n start(): void {\n if (!supportsNavigationTiming()) return;\n\n this.perfObserver.observe([\"paint\"], (entries) => {\n for (const entry of entries) {\n if (entry.name === \"first-contentful-paint\") {\n this.update({ fcp: entry.startTime });\n }\n }\n });\n\n this.perfObserver.observe([\"largest-contentful-paint\"], (entries) => {\n const last = entries[entries.length - 1] as (PerformanceEntry & { renderTime?: number; loadTime?: number }) | undefined;\n if (last) {\n const value = last.renderTime || last.loadTime || last.startTime;\n this.update({ lcp: value });\n }\n });\n\n this.perfObserver.observe([\"layout-shift\"], (entries) => {\n for (const entry of entries as Array<PerformanceEntry & { value: number; hadRecentInput?: boolean }>) {\n if (!entry.hadRecentInput) {\n this.clsAccumulator += entry.value;\n }\n }\n this.update({ cls: this.clsAccumulator });\n });\n }\n\n getSnapshot(): WebVitalsSnapshot {\n return { ...this.snapshot };\n }\n\n subscribe(listener: Listener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n stop(): void {\n this.perfObserver.disconnect();\n this.listeners.clear();\n }\n\n private update(patch: Partial<WebVitalsSnapshot>): void {\n this.snapshot = { ...this.snapshot, ...patch };\n for (const listener of this.listeners) listener(this.snapshot);\n }\n}\n","import { supportsNavigationTiming } from \"../utils/browserSupport\";\n\nexport interface NavigationMetrics {\n /** Time to first byte, in ms. Null if Navigation Timing Level 2 isn't available. */\n ttfb: number | null;\n /** DOMContentLoaded timing relative to navigation start, in ms. */\n domContentLoaded: number | null;\n /** Full load event timing relative to navigation start, in ms. */\n loadEvent: number | null;\n}\n\nexport interface ResourceTimingSummary {\n /** Total number of Resource Timing entries observed for this page load. */\n totalResources: number;\n /** Sum of `transferSize` across all resources, in bytes. 0 if unavailable (e.g. cross-origin without Timing-Allow-Origin). */\n totalTransferBytes: number;\n /** Slowest resource duration observed, in ms. */\n slowestResourceMs: number | null;\n}\n\n/**\n * Reads real, already-recorded browser timing data via the Navigation\n * Timing and Resource Timing APIs. This is a point-in-time snapshot, not\n * a live subscription — call it when you actually need a reading (e.g.\n * from useFastLoadMetrics on mount and on demand).\n */\nexport function getNavigationMetrics(): NavigationMetrics {\n if (!supportsNavigationTiming()) {\n return { ttfb: null, domContentLoaded: null, loadEvent: null };\n }\n\n const [nav] = performance.getEntriesByType(\"navigation\") as PerformanceNavigationTiming[];\n if (!nav) {\n return { ttfb: null, domContentLoaded: null, loadEvent: null };\n }\n\n return {\n ttfb: round(nav.responseStart - nav.startTime),\n domContentLoaded: round(nav.domContentLoadedEventEnd - nav.startTime),\n loadEvent: nav.loadEventEnd > 0 ? round(nav.loadEventEnd - nav.startTime) : null,\n };\n}\n\nexport function getResourceTimingSummary(): ResourceTimingSummary {\n if (!supportsNavigationTiming()) {\n return { totalResources: 0, totalTransferBytes: 0, slowestResourceMs: null };\n }\n\n const entries = performance.getEntriesByType(\"resource\") as PerformanceResourceTiming[];\n let totalTransferBytes = 0;\n let slowest: number | null = null;\n\n for (const entry of entries) {\n totalTransferBytes += entry.transferSize || 0;\n const duration = entry.duration;\n if (slowest === null || duration > slowest) slowest = duration;\n }\n\n return {\n totalResources: entries.length,\n totalTransferBytes,\n slowestResourceMs: slowest !== null ? round(slowest) : null,\n };\n}\n\nfunction round(value: number): number {\n return Math.round(value * 100) / 100;\n}\n","import { WebVitals, type WebVitalsSnapshot } from \"./WebVitals\";\nimport { getNavigationMetrics, getResourceTimingSummary } from \"./ResourceMetrics\";\nimport type { LoadManager } from \"../core/LoadManager\";\n\n/**\n * The metrics object returned by useFastLoadMetrics().\n *\n * Every field is documented with where its value actually comes from.\n * Nothing here is fabricated: browser-observed fields are `null` until\n * the browser has actually reported them, and internal counters are\n * derived directly from the registry's bookkeeping (never guessed).\n */\nexport interface FastLoadMetrics {\n // --- Browser-observed (PerformanceObserver / Paint Timing / LCP / CLS) ---\n /** First Contentful Paint in ms. Browser-observed. */\n fcp: number | null;\n /** Largest Contentful Paint in ms. Browser-observed; may update as the page loads. */\n lcp: number | null;\n /** Cumulative Layout Shift score. Browser-observed. */\n cls: number | null;\n /** Time to first byte in ms, from Navigation Timing. Browser-observed. */\n ttfb: number | null;\n\n // --- Browser-observed (Resource Timing) ---\n /** Total resources loaded for the page per the Resource Timing API. Browser-observed. */\n totalResourcesObserved: number;\n /** Total bytes transferred per Resource Timing (0 when transferSize is unavailable, e.g. opaque cross-origin responses). Browser-observed. */\n totalTransferBytesObserved: number;\n\n // --- ReactFastLoad internal (registry bookkeeping, not a browser measurement) ---\n /** Resources registered with ReactFastLoad that were NOT deferred (loaded on initial pass). Internal. */\n initialRequests: number;\n /** Resources registered with ReactFastLoad that the scheduler deferred past their natural load time. Internal. */\n deferredRequests: number;\n /** Same as deferredRequests; kept for API clarity per the requested shape. Internal. */\n deferredResources: number;\n /** Sum of estimatedSize across deferred resources. This is an ESTIMATE — see estimatedSize on each resource. Estimated. */\n bytesDeferred: number;\n imagesDeferred: number;\n videosDeferred: number;\n audiosDeferred: number;\n componentsDeferred: number;\n}\n\n/**\n * MetricsCollector composes browser-observed Web Vitals / Resource Timing\n * with the LoadManager's internal registry counters into one snapshot.\n * It never blends the two categories into a single \"score\" — the\n * distinction is preserved field-by-field, per the module's core\n * requirement not to present estimates as measurements.\n */\nexport class MetricsCollector {\n private webVitals = new WebVitals();\n private started = false;\n\n constructor(private loadManager: LoadManager) {}\n\n start(): void {\n if (this.started) return;\n this.started = true;\n this.webVitals.start();\n }\n\n stop(): void {\n this.webVitals.stop();\n this.started = false;\n }\n\n subscribeWebVitals(listener: (snapshot: WebVitalsSnapshot) => void): () => void {\n return this.webVitals.subscribe(listener);\n }\n\n snapshot(): FastLoadMetrics {\n const vitals = this.webVitals.getSnapshot();\n const nav = getNavigationMetrics();\n const resourceTiming = getResourceTimingSummary();\n const registrySummary = this.loadManager.registry.summary();\n\n return {\n fcp: vitals.fcp,\n lcp: vitals.lcp,\n cls: vitals.cls,\n ttfb: nav.ttfb,\n totalResourcesObserved: resourceTiming.totalResources,\n totalTransferBytesObserved: resourceTiming.totalTransferBytes,\n initialRequests: registrySummary.initialRequests,\n deferredRequests: registrySummary.deferredRequests,\n deferredResources: registrySummary.deferredResources,\n bytesDeferred: registrySummary.bytesDeferred,\n imagesDeferred: registrySummary.imagesDeferred,\n videosDeferred: registrySummary.videosDeferred,\n audiosDeferred: registrySummary.audiosDeferred,\n componentsDeferred: registrySummary.componentsDeferred,\n };\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useRef, useState } from \"react\";\nimport { LoadManager } from \"../core/LoadManager\";\nimport { MetricsCollector } from \"../metrics/MetricsCollector\";\nimport type { FastLoadDebugSnapshot } from \"../core/types\";\n\nexport interface FastLoadContextValue {\n loadManager: LoadManager;\n metricsCollector: MetricsCollector;\n debug: boolean;\n}\n\nconst FastLoadContext = createContext<FastLoadContextValue | null>(null);\n\nexport interface FastLoadProviderProps {\n children: React.ReactNode;\n /**\n * \"adaptive\" (default) lets the scheduler weigh viewport distance,\n * connection quality, and priority together. \"eager\" raises the\n * effective floor so more resources load sooner (useful for\n * low-resource-count pages where deferral has little benefit).\n * \"conservative\" is the inverse — favors deferring anything not\n * CRITICAL/HIGH, useful for resource-heavy pages on constrained devices.\n */\n strategy?: \"adaptive\" | \"eager\" | \"conservative\";\n preloadDistance?: number;\n concurrency?: number;\n /** Enables the developer debug overlay/console reporting described in the docs. */\n debug?: boolean;\n}\n\nconst STRATEGY_CONCURRENCY: Record<NonNullable<FastLoadProviderProps[\"strategy\"]>, number> = {\n adaptive: 4,\n eager: 8,\n conservative: 2,\n};\n\n/**\n * FastLoadProvider initializes the resource registry, scheduler, and\n * metrics collector for the subtree, and makes them available to\n * SmartImage/SmartVideo/LazyComponent/hooks via context. There is exactly\n * one LoadManager per provider instance — nesting providers creates\n * independent scheduling domains, which is intentional (e.g. for\n * micro-frontends) but not required for typical use.\n */\nexport function FastLoadProvider({\n children,\n strategy = \"adaptive\",\n preloadDistance = 1000,\n concurrency,\n debug = false,\n}: FastLoadProviderProps) {\n const loadManagerRef = useRef<LoadManager>();\n if (!loadManagerRef.current) {\n loadManagerRef.current = new LoadManager({\n preloadDistance,\n concurrency: concurrency ?? STRATEGY_CONCURRENCY[strategy],\n debug,\n });\n }\n\n const metricsCollectorRef = useRef<MetricsCollector>();\n if (!metricsCollectorRef.current) {\n metricsCollectorRef.current = new MetricsCollector(loadManagerRef.current);\n }\n\n useEffect(() => {\n const manager = loadManagerRef.current!;\n const collector = metricsCollectorRef.current!;\n collector.start();\n return () => {\n collector.stop();\n manager.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const value = useMemo<FastLoadContextValue>(\n () => ({\n loadManager: loadManagerRef.current!,\n metricsCollector: metricsCollectorRef.current!,\n debug,\n }),\n [debug]\n );\n\n return (\n <FastLoadContext.Provider value={value}>\n {children}\n {debug && <FastLoadDebugPanel />}\n </FastLoadContext.Provider>\n );\n}\n\nexport function useFastLoadContext(): FastLoadContextValue {\n const ctx = useContext(FastLoadContext);\n if (!ctx) {\n throw new Error(\n \"react-fastload: this hook/component must be used inside a <FastLoadProvider>.\"\n );\n }\n return ctx;\n}\n\n/**\n * A minimal, dependency-free debug panel. It intentionally does not try to\n * be a full devtools experience — its job is to make the scheduler's\n * decisions visible during development, per the \"developer debug mode\"\n * requirement, not to be a polished product surface.\n */\nfunction FastLoadDebugPanel() {\n const { loadManager } = useFastLoadContext();\n const [snapshot, setSnapshot] = useState<FastLoadDebugSnapshot>(() => loadManager.getDebugSnapshot());\n\n useEffect(() => {\n const unsubscribe = loadManager.registry.subscribe(() => {\n setSnapshot(loadManager.getDebugSnapshot());\n });\n const interval = setInterval(() => setSnapshot(loadManager.getDebugSnapshot()), 1000);\n return () => {\n unsubscribe();\n clearInterval(interval);\n };\n }, [loadManager]);\n\n // `process` is a Node/bundler global, not a browser one — Vite, webpack,\n // and Next.js all define process.env.NODE_ENV for compatibility, but a\n // consumer using this library via a bare ESM <script> with no bundler\n // (or any environment that doesn't polyfill `process`) would hit a\n // ReferenceError here. Our own tests run under Vitest (Node), where\n // `process` is a real global, so this was invisible until audited.\n const isProduction = typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\n if (isProduction) return null;\n\n return (\n <div\n style={{\n position: \"fixed\",\n bottom: 8,\n right: 8,\n zIndex: 999999,\n maxWidth: 360,\n maxHeight: 320,\n overflow: \"auto\",\n background: \"rgba(17, 17, 17, 0.92)\",\n color: \"#e6e6e6\",\n fontFamily: \"monospace\",\n fontSize: 11,\n borderRadius: 8,\n padding: 10,\n lineHeight: 1.4,\n }}\n data-testid=\"fastload-debug-panel\"\n >\n <div style={{ fontWeight: 700, marginBottom: 6 }}>react-fastload debug</div>\n <div>connection: {snapshot.connection.effectiveType ?? \"unknown\"} (saveData: {String(snapshot.connection.saveData)})</div>\n <div style={{ marginTop: 6 }}>resources ({snapshot.resources.length})</div>\n {snapshot.resources.map((r) => (\n <div key={r.id} style={{ opacity: r.state === \"loaded\" ? 0.6 : 1 }}>\n [{r.priority}] {r.id} — {r.state}\n {r.deferred ? \" (deferred)\" : \"\"}\n {r.prefetched ? \" (prefetched)\" : \"\"}\n </div>\n ))}\n <div style={{ marginTop: 6 }}>recent decisions</div>\n {snapshot.decisions.slice(-8).map((d, i) => (\n <div key={i}>\n {d.action} {d.resourceId}: {d.reason}\n </div>\n ))}\n </div>\n );\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport { useFastLoadContext } from \"../components/FastLoadProvider\";\nimport type { LoaderFn } from \"../core/Scheduler\";\nimport type {\n LoadingStrategy,\n Priority,\n ResourceRecord,\n ResourceState,\n ResourceType,\n} from \"../core/types\";\n\nexport interface UseLazyLoadOptions {\n id: string;\n type: ResourceType;\n priority: Priority;\n strategy: LoadingStrategy;\n estimatedSize?: number;\n meta?: Record<string, unknown>;\n /** The actual load function (e.g. loadImage, loadVideo, dynamic import wrapper). */\n loader: LoaderFn;\n}\n\nexport interface UseLazyLoadResult {\n /** Attach to the DOM node whose viewport position should be observed. */\n ref: (node: Element | null) => void;\n state: ResourceState;\n record: ResourceRecord | undefined;\n}\n\n/**\n * Shared internal hook: registers a resource with the LoadManager, wires\n * viewport observation up to the provider's single shared\n * ViewportObserver (unless the strategy is \"eager\", which skips\n * observation entirely and loads immediately), and tracks the resource's\n * state for re-rendering. SmartImage, SmartVideo, and SmartAudio are thin\n * wrappers around this hook plus their own rendering concerns.\n *\n * Request deduplication: `id` defaults to `${type}:${src}` in the Smart*\n * components, so two mounted instances with the same `src` resolve to the\n * SAME resource id here — LoadManager.register()/unregister() are\n * reference-counted specifically so that works correctly (the resource\n * isn't torn down until the LAST consumer unmounts). Pass an explicit\n * `resourceId` to opt out when two elements with the same src genuinely\n * need independent scheduling.\n */\nexport function useLazyLoad(options: UseLazyLoadOptions): UseLazyLoadResult {\n const { loadManager } = useFastLoadContext();\n const { id, type, priority, strategy, estimatedSize, meta, loader } = options;\n\n const unobserveRef = useRef<(() => void) | undefined>(undefined);\n const elementRef = useRef<Element | null>(null);\n const shouldObserveRef = useRef(strategy !== \"eager\" && priority !== \"CRITICAL\");\n shouldObserveRef.current = strategy !== \"eager\" && priority !== \"CRITICAL\";\n\n const [state, setState] = useState<ResourceState>(\"idle\");\n const [record, setRecord] = useState<ResourceRecord | undefined>(undefined);\n\n useEffect(() => {\n const initial = loadManager.register({ id, type, priority, strategy, estimatedSize, meta });\n setRecord(initial);\n setState(initial.state);\n loadManager.setLoader(id, loader);\n\n const unsubscribe = loadManager.registry.subscribe((all) => {\n const found = all.find((r) => r.id === id);\n if (found) {\n setRecord(found);\n setState(found.state);\n }\n });\n\n if (shouldObserveRef.current && elementRef.current) {\n unobserveRef.current = loadManager.observeViewport(id, elementRef.current);\n }\n\n return () => {\n unsubscribe();\n unobserveRef.current?.();\n unobserveRef.current = undefined;\n loadManager.unregister(id);\n };\n // Intentionally re-run only when the resource identity changes —\n // priority/estimatedSize changes are handled by usePriority instead\n // of re-registering the whole resource.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [id]);\n\n const ref = (node: Element | null) => {\n if (elementRef.current === node) return;\n\n unobserveRef.current?.();\n unobserveRef.current = undefined;\n elementRef.current = node;\n\n if (node && shouldObserveRef.current) {\n unobserveRef.current = loadManager.observeViewport(id, node);\n }\n };\n\n return { ref, state, record };\n}\n","import { supportsFetchPriority } from \"../utils/browserSupport\";\nimport type { Priority } from \"../core/types\";\n\nexport interface ImageLoadOptions {\n src: string;\n priority: Priority;\n decoding?: \"async\" | \"sync\" | \"auto\";\n /** When provided and aborted, cancels the in-flight load (clears handlers and the image src) and rejects with an AbortError, rather than letting an unmounted/irrelevant image keep downloading. */\n signal?: AbortSignal;\n}\n\nconst PRIORITY_TO_FETCH_PRIORITY: Record<Priority, \"high\" | \"low\" | \"auto\"> = {\n CRITICAL: \"high\",\n HIGH: \"high\",\n NORMAL: \"auto\",\n LOW: \"low\",\n IDLE: \"low\",\n};\n\n/**\n * Loads an image using a detached HTMLImageElement so the scheduler can\n * know exactly when the browser has actually decoded it, independent of\n * whether/when the real <img> gets mounted into the DOM. This lets\n * SmartImage mount its <img> only once loading is scheduled, which is\n * what actually defers the network request — the detached-image trick\n * here is just how we observe completion, not how we cause the delay.\n */\nexport function loadImage(options: ImageLoadOptions): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n if (typeof Image === \"undefined\") {\n // SSR / non-DOM environment: nothing to load, resolve immediately.\n resolve({} as HTMLImageElement);\n return;\n }\n\n if (options.signal?.aborted) {\n reject(new DOMException(\"Image load aborted before it started\", \"AbortError\"));\n return;\n }\n\n const img = new Image();\n\n if (supportsFetchPriority()) {\n (img as HTMLImageElement & { fetchPriority?: string }).fetchPriority =\n PRIORITY_TO_FETCH_PRIORITY[options.priority];\n }\n img.decoding = options.decoding ?? \"async\";\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n\n const onAbort = () => {\n cleanup();\n // Clearing src is the standard trick to actually cancel an in-flight\n // <img> network request — setting it to empty string, not removing\n // the attribute, is what stops the browser from continuing to fetch.\n img.src = \"\";\n reject(new DOMException(\"Image load aborted\", \"AbortError\"));\n };\n\n img.onload = () => {\n cleanup();\n resolve(img);\n };\n img.onerror = (event) => {\n cleanup();\n reject(event instanceof Event ? new Error(\"Image failed to load\") : event);\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n img.src = options.src;\n });\n}\n","import React, { useMemo } from \"react\";\nimport { useLazyLoad } from \"../hooks/useLazyLoad\";\nimport { loadImage } from \"../resources/ImageLoader\";\nimport { supportsFetchPriority } from \"../utils/browserSupport\";\nimport type { LoadingStrategy, Priority, ResourceRecord } from \"../core/types\";\n\nexport type PriorityProp = Priority | \"auto\";\n\nexport interface SmartImageProps\n extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, \"src\" | \"placeholder\" | \"onLoad\" | \"onError\"> {\n src: string;\n /** \"auto\" (default) resolves to NORMAL; pass an explicit Priority to override the scheduler's ranking. */\n priority?: PriorityProp;\n /** Shown while `src` is loading/deferred. Rendered as a background-image so layout doesn't depend on it loading. */\n placeholder?: string;\n /** Explicit id for scheduler bookkeeping/debugging. Defaults to `src`. */\n resourceId?: string;\n /** \"eager\" skips viewport gating entirely (use for above-the-fold images). \"lazy\" (default) waits for the preload zone. \"auto\" behaves like \"lazy\" but lets CRITICAL priority still force eager. */\n strategy?: LoadingStrategy;\n /** Estimated byte size, used only for the bytesDeferred metric — never affects loading behavior. */\n estimatedSize?: number;\n onLoad?: (event: React.SyntheticEvent<HTMLImageElement>) => void;\n onError?: (event: React.SyntheticEvent<HTMLImageElement>) => void;\n}\n\nfunction resolvePriority(priority: PriorityProp | undefined): Priority {\n if (!priority || priority === \"auto\") return \"NORMAL\";\n return priority;\n}\n\n/**\n * A drop-in <img> replacement that registers with the ReactFastLoad\n * scheduler instead of relying solely on the browser's native\n * `loading=\"lazy\"`. This adds real value over native lazy loading in two\n * ways: (1) a configurable preload distance shared across every resource\n * type via one scheduler, and (2) priority-aware concurrency — so, e.g.,\n * five LOW-priority images entering view at once don't compete with a\n * HIGH-priority one for the same network queue.\n *\n * For CRITICAL/HIGH priority images with strategy=\"eager\", this renders a\n * plain <img> immediately — it deliberately does NOT duplicate\n * `loading=\"lazy\"` for resources that shouldn't be lazy at all.\n */\nexport function SmartImage({\n src,\n priority = \"auto\",\n placeholder,\n resourceId,\n strategy = \"auto\",\n estimatedSize,\n alt,\n decoding = \"async\",\n style,\n onLoad,\n onError,\n ...rest\n}: SmartImageProps) {\n // Defaults to `${type}:${src}` (not suffixed with a per-instance id) so\n // that two mounted <SmartImage> using the same src resolve to the SAME\n // registry entry — this is what makes request deduplication work (see\n // LoadManager's reference counting). Pass an explicit `resourceId` to\n // opt out when two elements with the same src genuinely need\n // independent scheduling (e.g. deliberately repeating a demo widget).\n const id = resourceId ?? `image:${src}`;\n const resolvedPriority = resolvePriority(priority);\n const effectiveStrategy: LoadingStrategy =\n strategy === \"auto\" ? (resolvedPriority === \"CRITICAL\" ? \"eager\" : \"lazy\") : strategy;\n\n const loader = useMemo(\n () => (resource: ResourceRecord) =>\n loadImage({ src, priority: resolvedPriority, decoding, signal: resource.abortController?.signal }).then(\n () => undefined\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [src, resolvedPriority, decoding]\n );\n\n const { ref, state } = useLazyLoad({\n id,\n type: \"image\",\n priority: resolvedPriority,\n strategy: effectiveStrategy,\n estimatedSize,\n // Stored so tooling (e.g. a benchmark or devtools panel) can\n // cross-reference a deferred registry entry against its real\n // Resource Timing entry once it eventually loads. Never read by the\n // scheduler itself.\n meta: { src },\n loader,\n });\n\n const shouldRenderRealImage = effectiveStrategy === \"eager\" || state === \"loading\" || state === \"loaded\";\n\n const containerStyle: React.CSSProperties = {\n ...style,\n ...(placeholder && !shouldRenderRealImage\n ? {\n backgroundImage: `url(${placeholder})`,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n }\n : {}),\n };\n\n if (!shouldRenderRealImage) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n role=\"img\"\n aria-label={alt}\n aria-busy={state === \"eligible\"}\n data-fastload-state={state}\n style={{ display: \"inline-block\", ...containerStyle }}\n />\n );\n }\n\n // `fetchPriority` isn't declared on ImgHTMLAttributes in every @types/react\n // version, but it's a real, standardized DOM attribute — pass it through\n // via a loosened type rather than skipping a legitimate perf hint.\n const imgProps: React.ImgHTMLAttributes<HTMLImageElement> & { fetchPriority?: string } = {\n src,\n alt,\n decoding,\n loading: effectiveStrategy === \"eager\" ? \"eager\" : \"lazy\",\n style: containerStyle,\n onLoad,\n onError,\n ...(supportsFetchPriority() ? { fetchPriority: fetchPriorityFor(resolvedPriority) } : {}),\n ...rest,\n };\n\n return (\n <img\n ref={ref as unknown as React.Ref<HTMLImageElement>}\n data-fastload-state={state}\n {...imgProps}\n />\n );\n}\n\nfunction fetchPriorityFor(priority: Priority): \"high\" | \"low\" | \"auto\" {\n if (priority === \"CRITICAL\" || priority === \"HIGH\") return \"high\";\n if (priority === \"LOW\" || priority === \"IDLE\") return \"low\";\n return \"auto\";\n}\n","import type { Priority } from \"../core/types\";\n\nexport interface VideoLoadOptions {\n src: string;\n poster?: string;\n priority: Priority;\n /** When aborted, cancels the poster warm-up (if any) and resolves immediately rather than rejecting — an aborted poster fetch shouldn't be treated as a load failure, since the real video never started downloading anyway. */\n signal?: AbortSignal;\n}\n\n/**\n * \"Loading\" a video, in ReactFastLoad's sense, means becoming eligible for\n * its <video> element to be mounted with a real `src`/`preload` attribute —\n * we deliberately do NOT fetch the full video file ourselves (that would\n * duplicate the browser's own byte-range/streaming behavior and could\n * download data unnecessarily, which the spec explicitly warns against).\n *\n * Instead, for CRITICAL/HIGH priority video we optionally warm the poster\n * image only, which is cheap and improves perceived load without pulling\n * video bytes. For lower priority we resolve immediately and let\n * SmartVideo mount `preload=\"none\"` until the user interacts or the\n * element is in view.\n */\nexport function loadVideo(options: VideoLoadOptions): Promise<void> {\n return new Promise((resolve) => {\n if (options.signal?.aborted) {\n resolve();\n return;\n }\n\n if (options.poster && (options.priority === \"CRITICAL\" || options.priority === \"HIGH\")) {\n if (typeof Image === \"undefined\") {\n resolve();\n return;\n }\n const img = new Image();\n\n const cleanup = () => {\n img.onload = null;\n img.onerror = null;\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const onAbort = () => {\n cleanup();\n img.src = \"\";\n resolve(); // not an error — the real video never started downloading\n };\n\n img.onload = () => {\n cleanup();\n resolve();\n };\n img.onerror = () => {\n cleanup();\n resolve(); // poster failing shouldn't block video eligibility\n };\n\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n img.src = options.poster;\n return;\n }\n resolve();\n });\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useLazyLoad } from \"../hooks/useLazyLoad\";\nimport { loadVideo } from \"../resources/VideoLoader\";\nimport type { LoadingStrategy, Priority, ResourceRecord } from \"../core/types\";\nimport type { PriorityProp } from \"./SmartImage\";\n\nexport interface SmartVideoProps\n extends Omit<React.VideoHTMLAttributes<HTMLVideoElement>, \"src\" | \"poster\" | \"preload\"> {\n src: string;\n poster?: string;\n priority?: PriorityProp;\n resourceId?: string;\n strategy?: LoadingStrategy;\n /** Estimated byte size (the full video, not just the poster), used only for the bytesDeferred metric — never affects loading behavior. */\n estimatedSize?: number;\n /**\n * CSS `aspect-ratio` (e.g. `\"16/9\"`) reserved for BOTH the pre-eligible\n * placeholder and the real `<video>` element, so swapping between them\n * doesn't change the element's box size — that mismatch is a real\n * layout-shift (CLS) source if left to each render its own default\n * height. Omit only if you're already reserving space yourself via a\n * wrapping container.\n */\n aspectRatio?: string;\n /**\n * Explicit autoplay request. Unlike the native `autoPlay` attribute,\n * this is only honored once the resource has actually become eligible\n * (in view / eager), so a below-the-fold \"autoplay\" video never\n * silently starts downloading and playing off-screen.\n */\n autoplay?: boolean;\n}\n\nfunction resolvePriority(priority: PriorityProp | undefined): Priority {\n if (!priority || priority === \"auto\") return \"NORMAL\";\n return priority;\n}\n\n/**\n * A <video> wrapper that avoids downloading video data before it's\n * needed. Below the preload zone, it renders only the poster (if given)\n * with `preload=\"none\"`; once eligible, it mounts a real <video> with\n * `preload=\"metadata\"` (or \"auto\" for CRITICAL/HIGH priority) and, if\n * `autoplay` was requested, attempts to play once mounted.\n *\n * We never fetch the video bytes ourselves — the browser's own\n * range-request/streaming behavior handles that once the element mounts,\n * per the \"work with browser-native mechanisms\" requirement.\n */\nexport function SmartVideo({\n src,\n poster,\n priority = \"auto\",\n resourceId,\n strategy = \"auto\",\n estimatedSize,\n aspectRatio,\n autoplay = false,\n muted,\n controls = true,\n style,\n ...rest\n}: SmartVideoProps) {\n // Defaults to `${type}:${src}` for request deduplication — see\n // SmartImage's id comment, same reasoning applies here.\n const id = resourceId ?? `video:${src}`;\n const resolvedPriority = resolvePriority(priority);\n const effectiveStrategy: LoadingStrategy =\n strategy === \"auto\" ? (resolvedPriority === \"CRITICAL\" ? \"eager\" : \"lazy\") : strategy;\n\n const [userInteracted, setUserInteracted] = useState(false);\n\n const loader = useMemo(\n () => (resource: ResourceRecord) =>\n loadVideo({ src, poster, priority: resolvedPriority, signal: resource.abortController?.signal }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [src, poster, resolvedPriority]\n );\n\n const { ref, state } = useLazyLoad({\n id,\n type: \"video\",\n priority: resolvedPriority,\n strategy: effectiveStrategy,\n estimatedSize,\n // Stored so tooling (e.g. a benchmark or devtools panel) can\n // cross-reference a deferred registry entry against its real\n // Resource Timing entry once it eventually loads. Never read by the\n // scheduler itself.\n meta: { src },\n loader,\n });\n\n const isEligible = effectiveStrategy === \"eager\" || state === \"loading\" || state === \"loaded\";\n const shouldMountVideo = isEligible || userInteracted;\n\n if (!shouldMountVideo) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n role=\"button\"\n tabIndex={0}\n aria-label=\"Load video\"\n data-fastload-state={state}\n onClick={() => setUserInteracted(true)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") setUserInteracted(true);\n }}\n style={{\n position: \"relative\",\n cursor: \"pointer\",\n backgroundImage: poster ? `url(${poster})` : undefined,\n backgroundSize: \"cover\",\n backgroundPosition: \"center\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: aspectRatio ? undefined : 120,\n aspectRatio,\n ...style,\n }}\n >\n <PlayGlyph />\n </div>\n );\n }\n\n return (\n <video\n ref={ref as unknown as React.Ref<HTMLVideoElement>}\n src={src}\n poster={poster}\n preload={resolvedPriority === \"CRITICAL\" || resolvedPriority === \"HIGH\" ? \"auto\" : \"metadata\"}\n autoPlay={autoplay && isEligible}\n muted={autoplay ? true : muted}\n controls={controls}\n data-fastload-state={state}\n style={{ aspectRatio, ...style }}\n {...rest}\n />\n );\n}\n\nfunction PlayGlyph() {\n return (\n <svg width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" aria-hidden=\"true\">\n <circle cx=\"24\" cy=\"24\" r=\"23\" fill=\"rgba(0,0,0,0.55)\" stroke=\"white\" strokeWidth=\"1\" />\n <polygon points=\"19,14 19,34 35,24\" fill=\"white\" />\n </svg>\n );\n}\n","import type { Priority } from \"../core/types\";\n\nexport interface AudioLoadOptions {\n src: string;\n priority: Priority;\n /** When aborted, cancels the metadata warm-up (if any) and resolves immediately. */\n signal?: AbortSignal;\n}\n\n/**\n * Mirrors VideoLoader's philosophy: we do not fetch the audio file\n * ourselves. For CRITICAL/HIGH priority we warm up just the metadata\n * (duration, seekability) via a detached <audio> element with\n * `preload=\"metadata\"`, which is a small request compared to the full\n * file. For lower priority we resolve immediately and let SmartAudio\n * mount `preload=\"none\"` until the resource is eligible or the user\n * interacts — the browser's own streaming/range-request behavior takes\n * over once a real <audio> element with a src is mounted.\n */\nexport function loadAudio(options: AudioLoadOptions): Promise<void> {\n return new Promise((resolve) => {\n if (options.signal?.aborted) {\n resolve();\n return;\n }\n\n if (options.priority !== \"CRITICAL\" && options.priority !== \"HIGH\") {\n resolve();\n return;\n }\n\n if (typeof Audio === \"undefined\") {\n resolve();\n return;\n }\n\n const audio = new Audio();\n audio.preload = \"metadata\";\n\n const cleanup = () => {\n audio.removeEventListener(\"loadedmetadata\", finish);\n audio.removeEventListener(\"error\", finish);\n options.signal?.removeEventListener(\"abort\", onAbort);\n };\n const finish = () => {\n cleanup();\n resolve();\n };\n const onAbort = () => {\n cleanup();\n audio.src = \"\";\n resolve();\n };\n\n audio.addEventListener(\"loadedmetadata\", finish, { once: true });\n audio.addEventListener(\"error\", finish, { once: true }); // metadata failing shouldn't block eligibility\n options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n audio.src = options.src;\n });\n}\n","import React, { useMemo, useState } from \"react\";\nimport { useLazyLoad } from \"../hooks/useLazyLoad\";\nimport { loadAudio } from \"../resources/AudioLoader\";\nimport type { LoadingStrategy, Priority, ResourceRecord } from \"../core/types\";\nimport type { PriorityProp } from \"./SmartImage\";\n\nexport interface SmartAudioProps\n extends Omit<React.AudioHTMLAttributes<HTMLAudioElement>, \"src\" | \"preload\"> {\n src: string;\n priority?: PriorityProp;\n resourceId?: string;\n strategy?: LoadingStrategy;\n /** Estimated byte size, used only for the bytesDeferred metric — never affects loading behavior. */\n estimatedSize?: number;\n /** Track title, shown on the pre-eligible placeholder's play affordance. Optional. */\n label?: string;\n /**\n * Same semantics as SmartVideo's `autoplay`: only honored once the\n * resource is actually eligible, and implies `muted` — most browsers\n * block unmuted audio autoplay outright, so this exists mainly for\n * background/ambient-track use cases where that's acceptable.\n */\n autoplay?: boolean;\n}\n\nfunction resolvePriority(priority: PriorityProp | undefined): Priority {\n if (!priority || priority === \"auto\") return \"NORMAL\";\n return priority;\n}\n\n/**\n * An <audio> wrapper for songs/podcasts/sound effects — the audio\n * equivalent of SmartVideo. Below the preload zone it renders a small\n * click/keyboard-activatable placeholder instead of a real <audio>\n * element, so nothing downloads early. Once eligible, it mounts a real\n * <audio> with `preload=\"auto\"` for CRITICAL/HIGH priority or\n * `preload=\"metadata\"` otherwise, and lets the browser's own streaming\n * behavior handle the actual byte transfer — this library never fetches\n * audio data itself.\n */\nexport function SmartAudio({\n src,\n priority = \"auto\",\n resourceId,\n strategy = \"auto\",\n estimatedSize,\n label,\n autoplay = false,\n muted,\n controls = true,\n ...rest\n}: SmartAudioProps) {\n // Defaults to `${type}:${src}` for request deduplication — see\n // SmartImage's id comment, same reasoning applies here.\n const id = resourceId ?? `audio:${src}`;\n const resolvedPriority = resolvePriority(priority);\n const effectiveStrategy: LoadingStrategy =\n strategy === \"auto\" ? (resolvedPriority === \"CRITICAL\" ? \"eager\" : \"lazy\") : strategy;\n\n const [userInteracted, setUserInteracted] = useState(false);\n\n const loader = useMemo(\n () => (resource: ResourceRecord) =>\n loadAudio({ src, priority: resolvedPriority, signal: resource.abortController?.signal }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [src, resolvedPriority]\n );\n\n const { ref, state } = useLazyLoad({\n id,\n type: \"audio\",\n priority: resolvedPriority,\n strategy: effectiveStrategy,\n estimatedSize,\n // Stored so tooling (e.g. a benchmark or devtools panel) can\n // cross-reference a deferred registry entry against its real\n // Resource Timing entry once it eventually loads. Never read by the\n // scheduler itself.\n meta: { src },\n loader,\n });\n\n const isEligible = effectiveStrategy === \"eager\" || state === \"loading\" || state === \"loaded\";\n const shouldMountAudio = isEligible || userInteracted;\n\n if (!shouldMountAudio) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n role=\"button\"\n tabIndex={0}\n aria-label={label ? `Load audio: ${label}` : \"Load audio\"}\n data-fastload-state={state}\n onClick={() => setUserInteracted(true)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") setUserInteracted(true);\n }}\n style={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 8,\n padding: \"8px 12px\",\n borderRadius: 999,\n border: \"1px solid rgba(0,0,0,0.15)\",\n cursor: \"pointer\",\n userSelect: \"none\",\n }}\n >\n <PlayGlyph />\n {label ?? \"Load audio\"}\n </div>\n );\n }\n\n return (\n <audio\n ref={ref as unknown as React.Ref<HTMLAudioElement>}\n src={src}\n preload={resolvedPriority === \"CRITICAL\" || resolvedPriority === \"HIGH\" ? \"auto\" : \"metadata\"}\n autoPlay={autoplay && isEligible}\n muted={autoplay ? true : muted}\n controls={controls}\n data-fastload-state={state}\n {...rest}\n />\n );\n}\n\nfunction PlayGlyph() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polygon points=\"6,4 6,20 20,12\" fill=\"currentColor\" />\n </svg>\n );\n}\n","export type DynamicImport<T> = () => Promise<{ default: T }>;\n\n/**\n * Caches dynamic import() calls per LazyComponent instance so that the\n * scheduler triggering \"load\" more than once (which shouldn't normally\n * happen, but could under fast re-renders) never issues duplicate network\n * requests. The import promise itself is the cache key's value — React.lazy\n * expects a function that returns the *same* promise across renders once\n * resolved, so we memoize at this layer rather than inside the component.\n */\nexport function createComponentLoader<T>(importFn: DynamicImport<T>): DynamicImport<T> {\n let cached: Promise<{ default: T }> | undefined;\n\n return () => {\n if (!cached) {\n cached = importFn();\n }\n return cached;\n };\n}\n","import React, { Suspense, useId, useMemo } from \"react\";\nimport { useLazyLoad } from \"../hooks/useLazyLoad\";\nimport { createComponentLoader, type DynamicImport } from \"../resources/ComponentLoader\";\nimport type { LoadingStrategy, Priority } from \"../core/types\";\n\nexport interface LazyComponentOptions {\n priority?: Priority;\n /** Overrides the provider's preloadDistance for this component only. Currently informational — actual gating uses the provider's shared observer distance; a per-instance override is planned for a future minor version. */\n preloadDistance?: number;\n strategy?: LoadingStrategy;\n /** Rendered while the component hasn't become eligible to load yet. Defaults to null (renders nothing). */\n placeholder?: React.ReactNode;\n /** Rendered by Suspense while the dynamic import is in flight. Defaults to `placeholder`. */\n fallback?: React.ReactNode;\n resourceId?: string;\n /** Estimated byte size of the chunk this component imports, used only for the bytesDeferred metric — never affects loading behavior. */\n estimatedSize?: number;\n}\n\n/**\n * Wraps React.lazy + Suspense so that the dynamic import() itself is not\n * triggered until the scheduler decides this component is eligible\n * (in the preload zone, or eager/CRITICAL). Plain React.lazy has no\n * concept of \"not yet\" — it fetches as soon as it's first rendered. This\n * is the actual gap LazyComponent closes over ordinary code splitting.\n */\nexport function lazyComponent<P extends object>(\n importFn: DynamicImport<React.ComponentType<P>>,\n options: LazyComponentOptions = {}\n): React.ComponentType<P> {\n const cachedImport = createComponentLoader(importFn);\n const priority: Priority = options.priority ?? \"NORMAL\";\n const strategy: LoadingStrategy = options.strategy ?? (priority === \"CRITICAL\" ? \"eager\" : \"lazy\");\n\n function LazyComponentWrapper(props: P) {\n const generatedId = useId();\n const id = options.resourceId ?? `component:${generatedId}`;\n\n const LazyReal = useMemo(() => React.lazy(cachedImport), []);\n\n const loader = useMemo(\n () => () => cachedImport().then(() => undefined),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n []\n );\n\n const { ref, state } = useLazyLoad({\n id,\n type: \"component\",\n priority,\n strategy,\n estimatedSize: options.estimatedSize,\n loader,\n });\n\n const isEligible = strategy === \"eager\" || state === \"eligible\" || state === \"loading\" || state === \"loaded\";\n\n if (!isEligible) {\n return (\n <div ref={ref as unknown as React.Ref<HTMLDivElement>} data-fastload-state={state}>\n {options.placeholder ?? null}\n </div>\n );\n }\n\n // React.lazy's inferred component type doesn't preserve the generic P\n // through the assignment above in a way TS can verify structurally;\n // the cast is safe because LazyReal is React.lazy(cachedImport), whose\n // resolved module default is exactly React.ComponentType<P>.\n const Rendered = LazyReal as unknown as React.ComponentType<P>;\n\n return (\n <Suspense fallback={options.fallback ?? options.placeholder ?? null}>\n <Rendered {...props} />\n </Suspense>\n );\n }\n\n LazyComponentWrapper.displayName = `LazyComponent(${options.resourceId ?? \"anonymous\"})`;\n return LazyComponentWrapper;\n}\n","import { useEffect } from \"react\";\nimport { useFastLoadContext } from \"../components/FastLoadProvider\";\nimport type { Priority } from \"../core/types\";\n\n/**\n * Lets a component update a registered resource's priority after the\n * fact — e.g. bumping an image from LOW to HIGH once the user hovers\n * over a card, or once a carousel slide becomes the active one.\n */\nexport function usePriority(resourceId: string, priority: Priority): void {\n const { loadManager } = useFastLoadContext();\n\n useEffect(() => {\n if (!loadManager.registry.has(resourceId)) return;\n loadManager.setPriority(resourceId, priority);\n }, [loadManager, resourceId, priority]);\n}\n","import { useEffect, useState } from \"react\";\nimport { useFastLoadContext } from \"../components/FastLoadProvider\";\nimport type { FastLoadMetrics } from \"../metrics/MetricsCollector\";\n\n/**\n * Returns a live-updating FastLoadMetrics snapshot. Re-renders when:\n * - a browser Web Vitals entry arrives (FCP/LCP/CLS), or\n * - the resource registry changes (a resource loads, defers, etc.)\n *\n * The returned object always reflects real state at the time of the\n * render that produced it — see FastLoadMetrics' field-level docs for\n * which values are browser-observed vs. internal bookkeeping.\n */\nexport function useFastLoadMetrics(): FastLoadMetrics {\n const { loadManager, metricsCollector } = useFastLoadContext();\n const [metrics, setMetrics] = useState<FastLoadMetrics>(() => metricsCollector.snapshot());\n\n useEffect(() => {\n const refresh = () => setMetrics(metricsCollector.snapshot());\n\n const unsubVitals = metricsCollector.subscribeWebVitals(refresh);\n const unsubRegistry = loadManager.registry.subscribe(refresh);\n\n refresh();\n\n return () => {\n unsubVitals();\n unsubRegistry();\n };\n }, [loadManager, metricsCollector]);\n\n return metrics;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,75 @@
1
+ {
2
+ "name": "react-fastload",
3
+ "version": "0.1.0",
4
+ "description": "An adaptive resource-loading scheduler for React apps, with real browser performance metrics — not marketing claims.",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "README.md",
20
+ "LICENSE"
21
+ ],
22
+ "sideEffects": false,
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "test": "vitest run",
27
+ "test:watch": "vitest",
28
+ "typecheck": "tsc --noEmit",
29
+ "lint": "eslint src --ext .ts,.tsx",
30
+ "prepublishOnly": "npm run typecheck && npm run test && npm run build"
31
+ },
32
+ "peerDependencies": {
33
+ "react": ">=17.0.0",
34
+ "react-dom": ">=17.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@testing-library/react": "^14.2.1",
38
+ "@types/node": "^26.6.3",
39
+ "@types/react": "^18.2.0",
40
+ "@types/react-dom": "^18.2.0",
41
+ "@vitejs/plugin-react": "^4.2.1",
42
+ "jsdom": "^24.0.0",
43
+ "react": "^18.2.0",
44
+ "react-dom": "^18.2.0",
45
+ "tsup": "^8.0.2",
46
+ "typescript": "^5.4.0",
47
+ "vitest": "^1.4.0"
48
+ },
49
+ "keywords": [
50
+ "react",
51
+ "performance",
52
+ "lazy-loading",
53
+ "scheduler",
54
+ "web-vitals",
55
+ "intersection-observer",
56
+ "video",
57
+ "audio",
58
+ "concurrency",
59
+ "viewport",
60
+ "preload",
61
+ "deduplication"
62
+ ],
63
+ "license": "MIT",
64
+ "repository": {
65
+ "type": "git",
66
+ "url": "https://github.com/abhishek-kumar-pundir/react-fastload.git"
67
+ },
68
+ "homepage": "https://github.com/abhishek-kumar-pundir/react-fastload#readme",
69
+ "bugs": {
70
+ "url": "https://github.com/abhishek-kumar-pundir/react-fastload/issues"
71
+ },
72
+ "engines": {
73
+ "node": ">=16"
74
+ }
75
+ }