import type { Awaitable, Stop } from './types.js'; export type ResourceStatus = 'idle' | 'loading' | 'success' | 'error'; export interface ResourceSnapshot { readonly status: ResourceStatus; readonly data?: Data; readonly error?: unknown; readonly updatedAt: number; readonly stale: boolean; readonly fetching: boolean; } export interface ResourceContext { readonly signal: AbortSignal; readonly requestId: string; } export interface ResourceEndpoint { readonly load: (context: ResourceContext, argument: Argument) => Awaitable; readonly tags?: (data: Data, argument: Argument) => readonly string[]; readonly staleMs?: number; readonly retainMs?: number; readonly retry?: number; readonly retryDelayMs?: (attempt: number) => number; readonly stream?: (context: ResourceContext, argument: Argument, update: (recipe: (data: Data) => Data) => void) => Awaitable; } export type ResourceCatalog = Record>; export type ArgumentOf = Endpoint extends ResourceEndpoint ? Argument : never; export type DataOf = Endpoint extends ResourceEndpoint ? Data : never; export interface ResourceFetchOptions { readonly force?: boolean; readonly signal?: AbortSignal; } export interface ResourceHub { read(name: Name, argument: ArgumentOf): ResourceSnapshot>; fetch(name: Name, argument: ArgumentOf, options?: ResourceFetchOptions): Promise>; prefetch(name: Name, argument: ArgumentOf): Promise; watch(name: Name, argument: ArgumentOf, listener: () => void): Stop; invalidate(tags: readonly string[]): Promise; optimistic(name: Name, argument: ArgumentOf, recipe: (data: DataOf) => DataOf): Stop; startStream(name: Name, argument: ArgumentOf): Promise; inject(name: Name, endpoint: ResourceEndpoint): Stop; dehydrate(): unknown; hydrate(payload: unknown): void; clear(): void; } export declare function forgeResourceHub(initial: Endpoints): ResourceHub; export declare function bindBrowserResourceRefresh(hub: ResourceHub, targets: () => Array<{ name: keyof Endpoints & string; argument: unknown; }>): Stop; export declare function pollResource(hub: ResourceHub, name: Name, argument: ArgumentOf, intervalMs: number, options?: { readonly skipWhenHidden?: boolean; readonly onFault?: (error: unknown) => void; }): Stop; //# sourceMappingURL=resources.d.ts.map