2023-09-06 06:18:07 +00:00
|
|
|
import { type Event, type Filter, matchFilters } from '@/deps.ts';
|
2023-08-17 21:48:58 +00:00
|
|
|
import * as pipeline from '@/pipeline.ts';
|
2023-09-06 06:18:07 +00:00
|
|
|
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>[]> {
|
2023-08-19 17:37:42 +00:00
|
|
|
if (!filters.length) return Promise.resolve([]);
|
2023-04-30 01:23:51 +00:00
|
|
|
return new Promise((resolve) => {
|
2023-05-01 01:21:55 +00:00
|
|
|
let tid: number;
|
2023-08-17 02:53:51 +00:00
|
|
|
const results: Event[] = [];
|
2023-05-01 01:21:55 +00:00
|
|
|
|
2023-09-06 06:18:07 +00:00
|
|
|
const unsub = pool.subscribe(
|
2023-08-16 21:12:27 +00:00
|
|
|
filters,
|
2023-09-06 06:18:07 +00:00
|
|
|
allRelays,
|
2023-08-17 02:53:51 +00:00
|
|
|
(event: Event | null) => {
|
2023-08-16 21:12:27 +00:00
|
|
|
if (event && matchFilters(filters, event)) {
|
2023-08-18 01:54:11 +00:00
|
|
|
pipeline.handleEvent(event).catch(() => {});
|
2023-05-04 02:54:22 +00:00
|
|
|
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) {
|
2023-05-01 01:21:55 +00:00
|
|
|
unsub();
|
|
|
|
clearTimeout(tid);
|
2023-08-17 02:53:51 +00:00
|
|
|
resolve(results as Event<K>[]);
|
2023-05-01 01:21:55 +00:00
|
|
|
}
|
2023-04-30 01:23:51 +00:00
|
|
|
},
|
|
|
|
undefined,
|
2023-05-01 01:21:55 +00:00
|
|
|
() => {
|
|
|
|
unsub();
|
|
|
|
clearTimeout(tid);
|
2023-08-17 02:53:51 +00:00
|
|
|
resolve(results as Event<K>[]);
|
2023-05-01 01:21:55 +00:00
|
|
|
},
|
2023-04-30 01:23:51 +00:00
|
|
|
);
|
2023-05-01 01:21:55 +00:00
|
|
|
|
|
|
|
if (typeof opts.timeout === 'number') {
|
|
|
|
tid = setTimeout(() => {
|
|
|
|
unsub();
|
2023-08-17 02:53:51 +00:00
|
|
|
resolve(results as Event<K>[]);
|
2023-05-01 01:21:55 +00:00
|
|
|
}, opts.timeout);
|
|
|
|
}
|
2023-04-30 01:23:51 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2023-08-18 01:54:11 +00:00
|
|
|
export { getFilters };
|