2024-01-24 15:46:45 -06:00
|
|
|
import { type NostrEvent, type NStore } from '@/deps.ts';
|
2024-01-23 12:07:22 -06:00
|
|
|
import { type DittoEvent } from '@/interfaces/DittoEvent.ts';
|
2024-03-05 14:26:38 -06:00
|
|
|
import { type DittoRelation } from '@/interfaces/DittoFilter.ts';
|
2024-01-04 01:44:56 -06:00
|
|
|
|
2024-01-23 12:07:22 -06:00
|
|
|
interface HydrateEventOpts {
|
|
|
|
events: DittoEvent[];
|
2024-03-05 14:26:38 -06:00
|
|
|
relations: DittoRelation[];
|
2024-01-23 14:06:16 -06:00
|
|
|
storage: NStore;
|
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-03-05 14:26:38 -06:00
|
|
|
const { events, relations, storage, signal } = opts;
|
2024-01-04 01:44:56 -06:00
|
|
|
|
2024-03-06 12:55:02 -06:00
|
|
|
if (!events.length || !relations.length) {
|
2024-03-05 14:26:38 -06:00
|
|
|
return events;
|
|
|
|
}
|
|
|
|
|
2024-03-30 16:30:48 -05:00
|
|
|
for (const relation of relations) {
|
2024-03-30 16:12:48 -05:00
|
|
|
switch (relation) {
|
|
|
|
case 'author':
|
|
|
|
await hydrateAuthors({ events, storage, signal });
|
|
|
|
break;
|
2024-01-04 01:44:56 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return events;
|
|
|
|
}
|
|
|
|
|
2024-03-30 16:12:48 -05:00
|
|
|
async function hydrateAuthors(opts: Omit<HydrateEventOpts, 'relations'>): Promise<DittoEvent[]> {
|
|
|
|
const { events, storage, signal } = opts;
|
|
|
|
|
|
|
|
const pubkeys = new Set([...events].map((event) => event.pubkey));
|
|
|
|
const authors = await storage.query([{ kinds: [0], authors: [...pubkeys], limit: pubkeys.size }], { signal });
|
|
|
|
|
|
|
|
for (const event of events) {
|
|
|
|
event.author = authors.find((author) => author.pubkey === event.pubkey);
|
|
|
|
}
|
|
|
|
|
|
|
|
return events;
|
|
|
|
}
|
|
|
|
|
2024-01-24 15:46:45 -06:00
|
|
|
/** Return a normalized event without any non-standard keys. */
|
2024-03-16 13:19:39 -05:00
|
|
|
function purifyEvent(event: NostrEvent): NostrEvent {
|
2024-01-24 15:46:45 -06:00
|
|
|
return {
|
|
|
|
id: event.id,
|
|
|
|
pubkey: event.pubkey,
|
|
|
|
kind: event.kind,
|
|
|
|
content: event.content,
|
|
|
|
tags: event.tags,
|
|
|
|
sig: event.sig,
|
|
|
|
created_at: event.created_at,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2024-03-16 13:19:11 -05:00
|
|
|
export { hydrateEvents, purifyEvent };
|