import type { SnapbackProviderDiagnosticReport, } from './diagnostics.mjs'; import type { SnapbackArtifactIndex, SnapbackContractDataManifest, } from './artifact-validation.mjs'; export type ContractConnectionState = | 'connecting' | 'live' | 'polling' | 'stale' | 'disconnected' | null; export interface ContractSerializedError { name: string; message: string; code?: string; diagnostic?: unknown; } /** Cell states delivered to keyed query observers. */ export type ContractQueryCell = | { status: 'pending'; connection: ContractConnectionState } | { status: 'ready'; value: unknown; rows: unknown; empty: boolean; connection: ContractConnectionState; } | { status: 'error'; error: ContractSerializedError; previous?: unknown; rows?: unknown; connection: ContractConnectionState; diagnostic?: unknown; }; export interface ContractSubscriptionHandle { dispose(): void; } export type ContractEphemeralCell = { status: 'pending' | 'ready' | 'error'; entries: unknown[]; connection?: Exclude; }; export type KeyedBoundaryEphemeralSource = ( args: Record, emit: (cell: ContractEphemeralCell) => void, ) => ContractSubscriptionHandle | (() => void) | void; /** The transport provider consumed by Exact's keyed-query runtime. */ export interface KeyedSnapbackContractProviderTransport { readonly manifest: SnapbackContractDataManifest; partitionId(): string; subscribe( queryName: string, args: Record | undefined, observer: (cell: ContractQueryCell) => void, ): ContractSubscriptionHandle; forceQueryState( queryName: string, state: unknown, options?: { scope?: unknown }, ): ContractSubscriptionHandle; subscribeEphemeral?( name: string, args: Record, observer: (cell: ContractEphemeralCell) => void, ): ContractSubscriptionHandle; mutate( mutationName: string, args?: Record, correlation?: Readonly>, ): Promise< | { ok: true; value: unknown } | { ok: false; error: ContractSerializedError } >; onReceipt?(listener: (receipt: unknown) => void): () => void; receipts?(): unknown[]; } export interface KeyedSnapbackContractProvider { readonly provider: KeyedSnapbackContractProviderTransport; readonly links: Readonly< Record) => unknown> >; readonly diagnostics: SnapbackProviderDiagnosticReport[]; readonly userId: string | undefined; readonly disposed: boolean; readonly authorityPaused: boolean; /** Quiesce then resume under the new opaque partition. */ rotateAuthority(next?: { userId?: string; authorityCapture?: unknown }): string; quiesceAuthority(): unknown; resumeAuthority(next?: { userId?: string; authorityCapture?: unknown }): string; dispose(): void; } /** * Create the transport provider consumed by Exact's keyed-query runtime. * `keyedQueries` is an allowlist (null admits every non-ephemeral manifest * query); legacy `{ name, args }` entries keep their args ignored. */ export function createKeyedSnapbackContractProvider(options: { runtime: { createProviderQueryHandle( provider: KeyedSnapbackContractProviderTransport, name: string, args: Record, ): unknown; rotatePartition(provider: KeyedSnapbackContractProviderTransport): unknown; createProviderMutation?( provider: KeyedSnapbackContractProviderTransport, name: string, ): (args?: Record) => unknown; }; client: { liveQuery?(name: string, options: Record): Promise<{ rows?: unknown; connection?: ContractConnectionState; dispose?(): void; }>; query?(name: string, options: Record): Promise<{ rows?: unknown }>; mutate(name: string, options: Record): Promise; onReceipt?(listener: (receipt: unknown) => void): () => void; receipts?(): unknown[]; }; manifest: SnapbackContractDataManifest; artifactIndex?: SnapbackArtifactIndex | null; schemaManifest?: Readonly> | null; functionManifest?: Readonly> | null; userId?: string; initialAuthorityCapture?: unknown; keyedQueries?: readonly (string | Readonly<{ name: string; args?: Record }>)[] | null; livePush?: boolean; liveFallbackToPoll?: boolean; connectionId?: string | null; liveStreamOptions?: Record; onConnectionChange?: | ((connection: ContractConnectionState, detail: Readonly>) => void) | null; onSubscriptionEvent?: ((event: Readonly>) => void) | null; ephemerals?: Readonly> | null; onReceipt?: ((receipt: unknown) => void) | null; rootId?: string; }): KeyedSnapbackContractProvider;