import { type AbstractType } from "@dao-xyz/borsh"; import type { PeerId, TypedEventTarget } from "@libp2p/interface"; import type { Multiaddr } from "@multiformats/multiaddr"; import { type MaybePromise, PublicSignKey } from "@peerbit/crypto"; import * as types from "@peerbit/document-interface"; import { type QueryCacheOptions } from "@peerbit/indexer-cache"; import * as indexerTypes from "@peerbit/indexer-interface"; import { type Encoding, Entry } from "@peerbit/log"; import { Program } from "@peerbit/program"; import { RPC, type RPCRequestAllOptions } from "@peerbit/rpc"; import { type CoverRange, type ReplicationDomain, SharedLog } from "@peerbit/shared-log"; import { type PeerRefs } from "@peerbit/stream-interface"; import type { DocumentEvents, DocumentsChange } from "./events.js"; import type { QueryPredictor } from "./most-common-query-predictor.js"; import { type Operation } from "./operation.js"; import { Prefetch } from "./prefetch.js"; import type { ExtractArgs } from "./program.js"; export type UpdateMergeStrategy> = boolean | { filter?: (evt: DocumentsChange) => MaybePromise | void>; }; export type UpdateReason = "initial" | "manual" | "join" | "change" | "push"; export type UpdateCallbacks> = { /** * Fires whenever the iterator detects new work (e.g. push, join, change). * Ideal for reactive consumers that need to call `next()` or trigger UI work. */ notify?: (reason: UpdateReason) => void | Promise; /** * Fires whenever the iterator yields a batch to the consumer. * Good for external sync (e.g. React state). */ onBatch?: (batch: RT[], meta: { reason: UpdateReason; }) => void | Promise; }; /** * Unified update options for iterate()/search()/get() and hooks. * If you pass `true`, defaults to `{ merge: "sorted" }`. */ export type UpdateModeShortcut = "local" | "remote" | "all"; export type UpdateOptions = boolean | UpdateModeShortcut | ({ /** Live update behavior. Only sorted merging is supported; optional filter can mutate/ignore events. */ merge?: UpdateMergeStrategy; /** Request push-style notifications backed by the prefetch channel. */ push?: boolean | types.PushUpdatesMode; } & UpdateCallbacks); export type JoiningTargets = { /** Specific peers you care about */ peers?: Array; /** Multiaddrs you care about */ multiaddrs?: (string | Multiaddr)[]; /** * From the previous cover set (what you "knew" about earlier). * - "any": wait until at least 1 of the known peers is ready * - "all": wait until all known peers are ready * - number: wait until N known peers are ready */ known?: "any" | "all" | number; }; export type JoiningTimeoutPolicy = "proceed" | "error"; export type JoiningOnMissedResults = (evt: { /** How many items should have preceded the current frontier. */ amount: number; /** The peer whose arrival triggered the gap calculation. */ peer: PublicSignKey; }) => void | Promise; export type OutOfOrderMode = "drop" | "queue"; export type LateResultsItem = { indexed: WithContext; context: types.Context; from: PublicSignKey; value?: any; }; export type LateResultsEvent = { /** Count of items that should have appeared earlier than the current frontier */ amount: number; /** If attributable, the peer that produced the late items */ peer?: PublicSignKey; } & (M extends "queue" ? { items: Item[]; } : { items?: undefined; }); export type LateResultsHelpers = { /** Collect concrete late items if available for the chosen mode */ collect: () => Promise; }; export type WaitBehavior = "block" | "keep-open"; export type WaitPolicy = { timeout: number; until?: "any"; onTimeout?: "proceed" | "error"; behavior?: WaitBehavior; }; export type ReachScope = { /** who to consider for readiness */ eager?: boolean; discover?: PublicSignKey[]; }; export type RemoteQueryOptions = RPCRequestAllOptions & { replicate?: boolean; minAge?: number; throwOnMissing?: boolean; retryMissingResponses?: boolean; strategy?: "fallback"; domain?: { args: ExtractArgs; } | { range: CoverRange; }; /** WHO can answer? How do we grow the candidate set? */ reach?: ReachScope; /** WHEN are we allowed to proceed? Quorum semantics over a chosen group. */ wait?: WaitPolicy; }; export type QueryOptions = { remote?: boolean | RemoteQueryOptions; local?: boolean; resolve?: Resolve; signal?: AbortSignal; updates?: UpdateOptions; outOfOrder?: { mode?: "drop"; handle?: (evt: LateResultsEvent<"drop">, helpers: LateResultsHelpers<"drop">) => void | Promise; } | { mode: "queue"; handle?: (evt: LateResultsEvent<"queue">, helpers: LateResultsHelpers<"queue">) => void | Promise; }; /** * Controls iterator liveness after batches are consumed. * - 'onEmpty' (default): close when no more results * - 'manual': keep open until iterator.close() or program close; good for live updates */ closePolicy?: "onEmpty" | "manual"; }; export type GetOptions<_T, _I, D, Resolve extends boolean | undefined> = { remote?: boolean | RemoteQueryOptions; local?: boolean; resolve?: Resolve; signal?: AbortSignal; waitFor?: number; }; export type SearchOptions = QueryOptions; type Transformer = (obj: T, context: types.Context) => MaybePromise; export type ResultsIterator = { close: () => Promise; next: (number: number) => Promise; done: () => boolean; all: () => Promise; pending: () => MaybePromise; first: () => Promise; [Symbol.asyncIterator]: () => AsyncIterator; }; type QueryLike = { query?: indexerTypes.Query[] | indexerTypes.QueryLike; sort?: indexerTypes.Sort[] | indexerTypes.Sort | indexerTypes.SortLike; }; type ExtractResolveFromOptions = O extends QueryOptions ? X extends boolean ? X : true : true; export type CanSearch = (request: types.SearchRequest | types.IterationRequest | types.CollectNextRequest, from: PublicSignKey) => Promise | boolean; export type CanRead = (result: T, from: PublicSignKey) => Promise | boolean; export type CanReadIndexed = (result: I, from: PublicSignKey) => Promise | boolean; export type WithContext = { __context: types.Context; } & I; export declare const INDEX_CONTEXT_SHAPE: { readonly __context: { readonly created: true; readonly modified: true; readonly head: true; readonly gid: true; readonly size: true; }; }; export type IndexedContextOnly> = indexerTypes.ReturnTypeFromShape, typeof INDEX_CONTEXT_SHAPE>; export type WithIndexed = { __indexed: I; } & T; export type WithIndexedContext = WithContext>; export type ValueTypeFromRequest = Resolve extends false ? WithContext : WithIndexedContext; export type TransformerAsConstructor = { type?: new (arg: T, context: types.Context) => I; }; export type TransformerAsFunction = { type: AbstractType; transform: (arg: T, context: types.Context) => I | Promise; }; export type TransformOptions = TransformerAsConstructor | TransformerAsFunction; export type PrefetchOptions = { predictor?: QueryPredictor; ttl: number; accumulator: Prefetch; strict?: boolean; }; export type OpenOptions> = { documentEvents: TypedEventTarget>; documentType: AbstractType; dbType: AbstractType>; log: SharedLog; canRead?: CanRead; canSearch?: CanSearch; replicate: (request: types.SearchRequest | types.SearchRequestIndexed | types.IterationRequest, results: types.Results>) => Promise; indexBy?: string | string[]; transform?: TransformOptions; cache?: { resolver?: number; query?: QueryCacheOptions; }; compatibility: 6 | 7 | 8 | 9 | undefined; maybeOpen: (value: T & Program) => Promise; prefetch?: boolean | Partial; includeIndexed?: boolean; }; type IndexableClass = new (value: I, context: types.Context) => WithContext; export declare const coerceWithContext: (value: T | WithContext, context: types.Context) => WithContext; export declare const coerceWithIndexed: (value: T | WithIndexed, indexed: I) => WithIndexed; export declare class DocumentIndex, D extends ReplicationDomain> extends Program> { _query: RPC; documentType: AbstractType; transformer: Transformer; wrappedIndexedType: IndexableClass; indexedType: AbstractType; dbType: AbstractType>; indexedTypeIsDocumentType: boolean; private indexBy; private indexByResolver; index: indexerTypes.Index>; private _resumableIterators; private _prefetch?; private includeIndexed; compatibility: 6 | 7 | 8 | 9 | undefined; private _valueEncoding; private _sync; private _log; private _resolverProgramCache?; private _resolverCache?; private isProgramValued; private _maybeOpen; private canSearch?; private canRead?; private documentEvents; private _joinListener?; private _resultQueue; private iteratorKeepAliveTimers?; constructor(properties?: { query?: RPC; }); get valueEncoding(): Encoding; private ensurePrefetchAccumulator; private wrapPushResults; private drainQueuedResults; private handleDocumentChange; private get nestedProperties(); open(properties: OpenOptions): Promise; get prefetch(): PrefetchOptions | undefined; private queryRPCResponseHandler; private handleSearchRequest; afterOpen(): Promise; getPending(cursorId: string): Promise; get hasPending(): boolean; close(from?: Program): Promise; drop(from?: Program): Promise; get>(key: indexerTypes.Ideable | indexerTypes.IdKey, options?: Options): Promise>; get>(key: indexerTypes.Ideable | indexerTypes.IdKey, options?: Options): Promise>; getFromGid(gid: string): Promise>>; getFromHash(hash: string): Promise>>; put(value: T, id: indexerTypes.IdKey, entry: Entry, existing: indexerTypes.IndexedResult> | indexerTypes.IndexedResult> | null | undefined): Promise<{ context: types.Context; indexable: I; }>; putWithContext(value: T, id: indexerTypes.IdKey, context: types.Context, options?: { replace?: boolean; }): Promise<{ context: types.Context; indexable: I; }>; del(key: indexerTypes.IdKey): indexerTypes.IdKey[] | Promise; getDetailed, Resolve extends boolean | undefined = ExtractResolveFromOptions, RT extends types.Result = Resolve extends true ? types.ResultValue> : types.ResultIndexedValue>>(key: indexerTypes.IdKey | indexerTypes.IdPrimitive, options?: QueryOptions): Promise[] | undefined>; getSize(): Promise | number; private resolveDocument; processQuery(query: R, from: PublicSignKey, isLocal: boolean, options?: { canRead?: CanRead; }): Promise>>; private scheduleIteratorKeepAlive; private cancelIteratorKeepAlive; private clearResultsQueue; get countIteratorsInProgress(): number; private clearAllResultQueues; private waitForCoverReady; private createReplicatorJoinListener; processCloseIteratorRequest(query: types.CloseIteratorRequest, publicKey: PublicSignKey): void; /** * Query and retrieve results with most details * @param queryRequest * @param options * @returns */ private queryCommence; search(queryRequest: QueryLike, options?: SearchOptions): Promise[]>; search(queryRequest: QueryLike, options?: SearchOptions): Promise[]>; private resolveIndexed; iterate(query?: QueryLike, options?: QueryOptions): ResultsIterator>; iterate(query?: QueryLike, options?: QueryOptions): ResultsIterator>; updateResults(into: WithContext[], change: { added?: WithContext[] | WithContext[]; removed?: WithContext[] | WithContext[]; }, query: QueryLike, resolve: R): Promise[]>; /** * Resolve the primary key for a document or indexed representation using the configured indexBy fields. * Useful when consumers need a stable id without assuming a specific property name exists. */ resolveId(value: ValueTypeFromRequest | WithContext | WithIndexedContext | WithIndexed | I): indexerTypes.IdKey; waitFor(other: PeerRefs, options?: { seek?: "any" | "present"; signal?: AbortSignal; timeout?: number; }): Promise; } export {}; //# sourceMappingURL=search.d.ts.map