2024-01-23 12:07:22 -06:00
|
|
|
import { type DittoEvent } from '@/interfaces/DittoEvent.ts';
|
|
|
|
import { type DittoFilter } from '@/interfaces/DittoFilter.ts';
|
|
|
|
import { type EventStore } from '@/storages/types.ts';
|
2024-01-04 01:44:56 -06:00
|
|
|
|
2024-01-23 12:07:22 -06:00
|
|
|
interface HydrateEventOpts {
|
|
|
|
events: DittoEvent[];
|
|
|
|
filters: DittoFilter[];
|
2024-01-04 01:44:56 -06:00
|
|
|
storage: EventStore;
|
2024-01-04 02:09:23 -06:00
|
|
|
signal?: AbortSignal;
|
2024-01-04 01:44:56 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Hydrate event relationships using the provided storage. */
|
2024-01-23 12:07:22 -06:00
|
|
|
async function hydrateEvents(opts: HydrateEventOpts): Promise<DittoEvent[]> {
|
2024-01-04 02:09:23 -06:00
|
|
|
const { events, filters, storage, signal } = opts;
|
2024-01-04 01:44:56 -06:00
|
|
|
|
|
|
|
if (filters.some((filter) => filter.relations?.includes('author'))) {
|
|
|
|
const pubkeys = new Set([...events].map((event) => event.pubkey));
|
2024-01-08 15:13:10 -06:00
|
|
|
const authors = await storage.filter([{ kinds: [0], authors: [...pubkeys] }], { signal });
|
2024-01-04 01:44:56 -06:00
|
|
|
|
|
|
|
for (const event of events) {
|
|
|
|
event.author = authors.find((author) => author.pubkey === event.pubkey);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return events;
|
|
|
|
}
|
|
|
|
|
|
|
|
export { hydrateEvents };
|