(events: RelayEvent[])
| 196 | } |
| 197 | |
| 198 | function dedup(events: RelayEvent[]): RelayEvent[] { |
| 199 | const best = new Map<string, RelayEvent>(); |
| 200 | |
| 201 | for (const e of events) { |
| 202 | const d = getTag(e, "d") ?? ""; |
| 203 | const key = `${e.pubkey}:${e.kind}:${d}`; |
| 204 | const prev = best.get(key); |
| 205 | |
| 206 | if (!prev || e.created_at > prev.created_at) { |
| 207 | best.set(key, e); |
| 208 | } |
| 209 | } |
| 210 | |
| 211 | return [...best.values()]; |
| 212 | } |
| 213 | |
| 214 | async function fetchProjects(): Promise<Project[]> { |
| 215 | const [events, deletionEvents] = await Promise.all([ |
no test coverage detected