ditto/src/client.ts

54 lines
1.5 KiB
TypeScript
Raw Normal View History

import { type Event, type Filter, matchFilters } from '@/deps.ts';
import * as pipeline from '@/pipeline.ts';
import { allRelays, pool } from '@/pool.ts';
2023-03-05 04:10:56 +00:00
2023-08-25 18:38:21 +00:00
import type { GetFiltersOpts } from '@/filter.ts';
2023-03-05 04:10:56 +00:00
2023-04-30 01:23:51 +00:00
/** Get events from a NIP-01 filter. */
2023-08-17 02:53:51 +00:00
function getFilters<K extends number>(filters: Filter<K>[], opts: GetFiltersOpts = {}): Promise<Event<K>[]> {
if (!filters.length) return Promise.resolve([]);
2023-04-30 01:23:51 +00:00
return new Promise((resolve) => {
let tid: number;
2023-08-17 02:53:51 +00:00
const results: Event[] = [];
const unsub = pool.subscribe(
filters,
allRelays,
2023-08-17 02:53:51 +00:00
(event: Event | null) => {
if (event && matchFilters(filters, event)) {
pipeline.handleEvent(event).catch(() => {});
results.push({
id: event.id,
kind: event.kind,
pubkey: event.pubkey,
content: event.content,
tags: event.tags,
created_at: event.created_at,
sig: event.sig,
});
2023-04-30 01:23:51 +00:00
}
2023-08-17 02:38:21 +00:00
if (typeof opts.limit === 'number' && results.length >= opts.limit) {
unsub();
clearTimeout(tid);
2023-08-17 02:53:51 +00:00
resolve(results as Event<K>[]);
}
2023-04-30 01:23:51 +00:00
},
undefined,
() => {
unsub();
clearTimeout(tid);
2023-08-17 02:53:51 +00:00
resolve(results as Event<K>[]);
},
2023-04-30 01:23:51 +00:00
);
if (typeof opts.timeout === 'number') {
tid = setTimeout(() => {
unsub();
2023-08-17 02:53:51 +00:00
resolve(results as Event<K>[]);
}, opts.timeout);
}
2023-04-30 01:23:51 +00:00
});
}
export { getFilters };