ditto/src/filter.ts

50 lines
1.6 KiB
TypeScript
Raw Normal View History

import { Conf } from '@/config.ts';
2023-08-25 18:38:21 +00:00
import { type Event, type Filter, matchFilters } from '@/deps.ts';
2023-08-24 20:28:13 +00:00
2023-08-25 18:38:21 +00:00
import type { EventData } from '@/types.ts';
/** Additional properties that may be added by Ditto to events. */
2023-12-10 21:54:31 +00:00
type Relation = 'author' | 'author_stats' | 'event_stats';
2023-08-25 18:38:21 +00:00
/** Custom filter interface that extends Nostr filters with extra options for Ditto. */
interface DittoFilter<K extends number = number> extends Filter<K> {
/** Whether the event was authored by a local user. */
2023-08-25 18:38:21 +00:00
local?: boolean;
/** Additional fields to add to the returned event. */
relations?: Relation[];
2023-08-25 18:38:21 +00:00
}
/** 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;
2023-12-21 20:56:21 +00:00
/** Relays to use, if applicable. */
relays?: WebSocket['url'][];
2023-08-25 18:38:21 +00:00
}
2023-08-24 20:28:13 +00:00
function matchDittoFilter(filter: DittoFilter, event: Event, data: EventData): boolean {
if (filter.local && !(data.user || event.pubkey === Conf.pubkey)) {
2023-08-24 20:28:13 +00:00
return false;
}
return matchFilters([filter], event);
}
2023-08-24 22:00:08 +00:00
/**
* 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.
*/
2023-08-24 20:28:13 +00:00
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, type Relation };