import { NostrEvent } from "../helpers/event.js"; import { Filter } from "../helpers/filter.js"; import { LRU } from "../helpers/lru.js"; import { IEventMemory } from "./interface.js"; /** An in-memory database of events */ export declare class EventMemory implements IEventMemory { protected log: import("debug").Debugger; /** Indexes */ protected kinds: Map>; protected authors: Map>; protected tags: LRU>; protected created_at: NostrEvent[]; /** Composite index for kind+author queries (common pattern) */ protected kindAuthor: Map>; /** LRU cache of last events touched */ events: LRU; /** A sorted array of replaceable events by address */ protected replaceable: Map; /** The number of events in the database */ get size(): number; /** Checks if the database contains an event without touching it */ hasEvent(id: string): boolean; /** Gets a single event based on id */ getEvent(id: string): NostrEvent | undefined; /** Checks if the event set has a replaceable event */ hasReplaceable(kind: number, pubkey: string, identifier?: string): boolean; /** Gets the latest replaceable event */ getReplaceable(kind: number, pubkey: string, identifier?: string): NostrEvent | undefined; /** Gets the history of a replaceable event */ getReplaceableHistory(kind: number, pubkey: string, identifier?: string): NostrEvent[] | undefined; /** Gets all events that match the filters */ getByFilters(filters: Filter | Filter[]): NostrEvent[]; /** Gets a timeline of events that match the filters */ getTimeline(filters: Filter | Filter[]): NostrEvent[]; /** Inserts an event into the database and notifies all subscriptions */ add(event: NostrEvent): NostrEvent; /** Removes an event from the database and notifies all subscriptions */ remove(eventOrId: string | NostrEvent): boolean; /** Remove multiple events that match the given filters */ removeByFilters(filters: Filter | Filter[]): number; /** Notify the database that an event has updated */ update(_event: NostrEvent): void; /** A weak map of events to claim reference counts */ protected claims: WeakMap; /** Moves an event to the top of the LRU cache */ touch(event: NostrEvent): void; /** Increments the claim count on the event and touches it */ claim(event: NostrEvent): void; /** Checks if an event is claimed by anything */ isClaimed(event: NostrEvent): boolean; /** Decrements the claim count on an event */ removeClaim(event: NostrEvent): void; /** Removes all claims on an event */ clearClaim(event: NostrEvent): void; /** Returns a generator of unclaimed events in order of least used */ unclaimed(): Generator; /** Removes events that are not claimed (free up memory) */ prune(limit?: number): number; /** Index helper methods */ protected getKindIndex(kind: number): Set; protected getAuthorsIndex(author: string): Set; protected getKindAuthorIndex(kind: number, pubkey: string): Set; protected getTagIndex(tagAndValue: string): Set; /** * Helper method to remove an event from a sorted array using binary search. * Falls back to indexOf if binary search doesn't find exact match. */ protected removeFromSortedArray(array: NostrEvent[], event: NostrEvent): void; /** Iterates over all events by author */ iterateAuthors(authors: Iterable): Generator; /** Iterates over all events by indexable tag and value */ iterateTag(tag: string, values: Iterable): Generator; /** Iterates over all events by kind */ iterateKinds(kinds: Iterable): Generator; /** Iterates over all events by time */ iterateTime(since: number | undefined, until: number | undefined): Generator; /** Iterates over all events by id */ iterateIds(ids: Iterable): Generator; /** Returns all events that match the filter */ protected getEventsForFilter(filter: Filter): Set; /** Returns all events that match the filters */ protected getEventsForFilters(filters: Filter[]): Set; /** Resets the event set */ reset(): void; }