import { type Event, type Filter, matchFilters } from '@/deps.ts'; import type { EventData } from '@/types.ts'; /** Custom filter interface that extends Nostr filters with extra options for Ditto. */ interface DittoFilter extends Filter { local?: boolean; } /** Additional options to apply to the whole subscription. */ interface GetFiltersOpts { /** How long to wait (in milliseconds) until aborting the request. */ timeout?: number; /** Event limit for the whole subscription. */ limit?: number; } function matchDittoFilter(filter: DittoFilter, event: Event, data: EventData): boolean { if (filter.local && !data.user) { return false; } return matchFilters([filter], event); } /** * Similar to nostr-tools `matchFilters`, but supports Ditto's custom keys. * Database calls are needed to look up the extra data, so it's passed in as an argument. */ function matchDittoFilters(filters: DittoFilter[], event: Event, data: EventData): boolean { for (const filter of filters) { if (matchDittoFilter(filter, event, data)) { return true; } } return false; } export { type DittoFilter, type GetFiltersOpts, matchDittoFilters };