/** Shared, renderer-agnostic asset contracts. */ export type AssetDevice = 'desktop' | 'mobile'; export type AssetUrl = string | readonly string[]; export interface AssetSource { readonly url: string; readonly format?: string; readonly bytes?: number; } export interface AssetVariant { readonly url?: TUrl; readonly bytes?: number; readonly sources?: readonly TSource[]; readonly disabled?: boolean; } export interface AssetVariants { readonly desktop?: AssetVariant; readonly mobile?: AssetVariant; } export interface AssetRetryContext { readonly attempt: number; readonly error: unknown; readonly definition: AssetDefinition; } export interface AssetRetryPolicy { /** Retry count after the initial attempt. */ readonly retries: number; readonly delayMs?: number | ((context: AssetRetryContext) => number); readonly shouldRetry?: (context: AssetRetryContext) => boolean; } export type AssetRetry = number | AssetRetryPolicy; export interface AssetDefinition { readonly type: TType; readonly url?: TUrl; readonly bytes?: number; readonly required?: boolean; readonly persistent?: boolean; readonly cacheKey?: string; readonly variants?: AssetVariants; readonly retry?: AssetRetry; readonly metadata?: Readonly>; } export interface GltfCodecConfiguration { readonly draco?: false | { readonly decoderPath?: string; }; readonly ktx2?: false | { readonly transcoderPath?: string; }; readonly meshopt?: boolean; readonly gltfCurve?: boolean | { readonly extensionName?: string; }; } export interface GltfAssetDefinition extends AssetDefinition<'gltf', string, never> { readonly url: string; readonly codecs?: GltfCodecConfiguration; } export interface GlbAssetDefinition extends AssetDefinition<'glb', string, never> { readonly url: string; readonly codecs?: GltfCodecConfiguration; } export interface HdrAssetDefinition extends AssetDefinition<'hdr', string, never> { readonly url: string; } export interface ExrAssetDefinition extends AssetDefinition<'exr', string, never> { readonly url: string; } export type ImageAssetFormat = 'png' | 'jpeg' | 'webp' | 'avif'; export interface ImageAssetDefinition extends AssetDefinition<'image', string, never> { readonly url: string; readonly format?: ImageAssetFormat; readonly colorSpace?: string; } export interface TextureAssetDefinition extends AssetDefinition<'texture', string, never> { readonly url: string; readonly format?: ImageAssetFormat | 'ktx2'; readonly colorSpace?: string; } export interface Ktx2AssetDefinition extends AssetDefinition<'ktx2', string, never> { readonly url: string; readonly transcoderPath?: string; } export interface JsonAssetDefinition extends AssetDefinition<'json', string, never> { readonly url: string; } export interface BinaryAssetDefinition extends AssetDefinition<'binary', string, never> { readonly url: string; } export interface CubeTextureAssetDefinition extends AssetDefinition<'cubeTexture', readonly [string, string, string, string, string, string], never> { readonly url: readonly [string, string, string, string, string, string]; readonly colorSpace?: string; } export interface AudioAssetDefinition extends AssetDefinition<'audio', string, AssetSource> { readonly url?: string; readonly sources?: readonly AssetSource[]; readonly preferredFormats?: readonly string[]; /** Set by AssetManager after supported-format fallback selection. */ readonly selectedFormat?: string; } export interface FontAssetDefinition extends AssetDefinition<'font', string, never> { readonly url: string; readonly family?: string; } export type StandardAssetDefinition = GltfAssetDefinition | GlbAssetDefinition | HdrAssetDefinition | ExrAssetDefinition | ImageAssetDefinition | TextureAssetDefinition | Ktx2AssetDefinition | JsonAssetDefinition | BinaryAssetDefinition | CubeTextureAssetDefinition | AudioAssetDefinition | FontAssetDefinition; /** The standard vocabulary; concrete renderer/decoder adapters remain explicit dependencies. */ export interface StandardAssetDefinitionMap { readonly gltf: GltfAssetDefinition; readonly glb: GlbAssetDefinition; readonly hdr: HdrAssetDefinition; readonly exr: ExrAssetDefinition; readonly image: ImageAssetDefinition; readonly texture: TextureAssetDefinition; readonly ktx2: Ktx2AssetDefinition; readonly json: JsonAssetDefinition; readonly binary: BinaryAssetDefinition; readonly cubeTexture: CubeTextureAssetDefinition; readonly audio: AudioAssetDefinition; readonly font: FontAssetDefinition; } export type StandardAssetResultMap = { readonly [TType in keyof StandardAssetDefinitionMap]: unknown; }; export type StandardAssetAdapters = { readonly [TType in keyof StandardAssetDefinitionMap]: AssetAdapter; }; export interface AbortSignalLike { readonly aborted: boolean; readonly reason?: unknown; addEventListener(type: 'abort', listener: () => void, options?: { readonly once?: boolean; }): void; removeEventListener(type: 'abort', listener: () => void): void; } export interface AssetLoadContext { readonly signal: AbortSignalLike; readonly attempt: number; readonly reportProgress: (progress: number) => void; } export interface AssetDisposeContext { readonly reason: 'zero-references' | 'evicted' | 'shutdown'; } export interface AssetAdapterCapabilities { readonly formats?: readonly string[]; readonly codecs?: { readonly draco?: boolean; readonly ktx2?: boolean; readonly meshopt?: boolean; readonly gltfCurve?: boolean; }; readonly workerSafe?: boolean; readonly notes?: string; } export interface AssetAdapter { readonly type: TDefinition['type']; readonly capabilities?: AssetAdapterCapabilities; load(definition: TDefinition, context: AssetLoadContext): TResult | PromiseLike; dispose?(value: TResult, context: AssetDisposeContext): void | PromiseLike; } export type AssetAdapterDefinition = TAdapter extends AssetAdapter ? TDefinition : never; export type AssetAdapterResult = TAdapter extends AssetAdapter ? TResult : never; export type AssetAdapterRecord = Readonly>>; export type AssetDefinitionForAdapters = { [TKey in keyof TAdapters]: AssetAdapterDefinition; }[keyof TAdapters]; export type AssetManifestForAdapters = Readonly>>; type AdapterForDefinition = TDefinition extends { readonly type: infer TType; } ? TType extends keyof TAdapters ? TAdapters[TType] : never : never; export type AssetValueForDefinition = AssetAdapterResult>; type AssetRequiredFlag = 'required' extends keyof TDefinition ? TDefinition[Extract<'required', keyof TDefinition>] : true; export type AssetResultForDefinition = false extends AssetRequiredFlag ? AssetValueForDefinition | undefined : AssetValueForDefinition; export type AssetResults = { -readonly [TName in keyof TManifest]: AssetResultForDefinition; }; export type NamedAssetPromises = { readonly [TName in keyof TResult]: Promise; }; export type NamedAssetHandles = { readonly [TName in keyof TResult]: AssetHandle; }; export interface AssetProgress { readonly progress: number; readonly loadedWeight: number; readonly totalWeight: number; readonly asset?: string; } export interface AssetLoadOptions { readonly signal?: AbortSignalLike; readonly onProgress?: (progress: AssetProgress) => void; } export type AssetLoadErrorCode = 'aborted' | 'adapter-error' | 'filtered-optional' | 'filtered-required' | 'invalid-definition' | 'manager-disposed' | 'missing-adapter' | 'no-audio-source'; export declare class AssetLoadError extends Error { readonly code: AssetLoadErrorCode; readonly assetName: string; readonly assetType: string; readonly attempts: number; readonly causeValue: unknown; constructor(options: { readonly code: AssetLoadErrorCode; readonly assetName: string; readonly assetType: string; readonly message: string; readonly attempts?: number; readonly cause?: unknown; }); } export interface AssetFailure { readonly assetName: string; readonly assetType: string; readonly required: boolean; readonly error: AssetLoadError; } export declare class AssetAggregateError extends Error { readonly failures: readonly AssetFailure[]; readonly optionalFailures: readonly AssetFailure[]; constructor(failures: readonly AssetFailure[], optionalFailures?: readonly AssetFailure[]); } export interface AssetManifestDiff { readonly added: readonly string[]; readonly removed: readonly string[]; readonly changed: readonly string[]; readonly unchanged: readonly string[]; } export interface AssetCacheEntrySnapshot { readonly key: string; readonly type: string; readonly status: 'queued' | 'loading' | 'ready'; readonly references: number; readonly persistent: boolean; readonly progress: number; } export declare class AssetHandle { #private; readonly name: string; readonly promise: Promise; constructor(name: string, promise: Promise, release: () => void); get released(): boolean; release(): void; } export {};