mirror of
https://github.com/hoornet/vega.git
synced 2026-05-07 04:39:12 -07:00
Global feed now uses a persistent live subscription (closeOnEose: false) so new notes stream in real-time instead of requiring manual refresh. Inspired by Wisp's streaming architecture. Every fetchEvents call across the entire codebase now uses fetchWithTimeout with groupable: false — prevents NDK from batching/reusing stale subscriptions. This fixes Articles, DMs, Notifications, Zaps, and Trending hanging indefinitely. Also adds since filters on global (2h) and follow (24h) feeds to ensure relay freshness, and fixes ArticleFeed re-fetch bug where follows changes wiped latest tab results.
46 lines
2.0 KiB
TypeScript
46 lines
2.0 KiB
TypeScript
import { NDKEvent, NDKFilter, NDKKind } from "@nostr-dev-kit/ndk";
|
|
import { getNDK, fetchWithTimeout, SINGLE_TIMEOUT } from "./core";
|
|
|
|
export async function fetchBookmarkList(pubkey: string): Promise<string[]> {
|
|
const instance = getNDK();
|
|
const filter: NDKFilter = { kinds: [10003 as NDKKind], authors: [pubkey], limit: 1 };
|
|
const events = await fetchWithTimeout(instance, filter, SINGLE_TIMEOUT);
|
|
if (events.size === 0) return [];
|
|
const event = Array.from(events).sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];
|
|
return event.tags.filter((t) => t[0] === "e" && t[1]).map((t) => t[1]);
|
|
}
|
|
|
|
export async function publishBookmarkList(eventIds: string[]): Promise<void> {
|
|
const instance = getNDK();
|
|
if (!instance.signer) return;
|
|
const event = new NDKEvent(instance);
|
|
event.kind = 10003 as NDKKind;
|
|
event.content = "";
|
|
event.tags = eventIds.map((id) => ["e", id]);
|
|
await event.publish();
|
|
}
|
|
|
|
export async function fetchBookmarkListFull(pubkey: string): Promise<{ eventIds: string[]; articleAddrs: string[] }> {
|
|
const instance = getNDK();
|
|
const filter: NDKFilter = { kinds: [10003 as NDKKind], authors: [pubkey], limit: 1 };
|
|
const events = await fetchWithTimeout(instance, filter, SINGLE_TIMEOUT);
|
|
if (events.size === 0) return { eventIds: [], articleAddrs: [] };
|
|
const event = Array.from(events).sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];
|
|
const eventIds = event.tags.filter((t) => t[0] === "e" && t[1]).map((t) => t[1]);
|
|
const articleAddrs = event.tags.filter((t) => t[0] === "a" && t[1]).map((t) => t[1]);
|
|
return { eventIds, articleAddrs };
|
|
}
|
|
|
|
export async function publishBookmarkListFull(eventIds: string[], articleAddrs: string[]): Promise<void> {
|
|
const instance = getNDK();
|
|
if (!instance.signer) return;
|
|
const event = new NDKEvent(instance);
|
|
event.kind = 10003 as NDKKind;
|
|
event.content = "";
|
|
event.tags = [
|
|
...eventIds.map((id) => ["e", id]),
|
|
...articleAddrs.map((addr) => ["a", addr]),
|
|
];
|
|
await event.publish();
|
|
}
|