import { Filter, NostrEvent, SimplePool } from "nostr-tools"; import { LOOKUP_RELAYS } from "./env.js"; import { NSITE_KIND } from "./const.js"; const pool = new SimplePool(); export async function getUserOutboxes(pubkey: string) { const mailboxes = await pool.get(LOOKUP_RELAYS, { kinds: [10002], authors: [pubkey] }); if (!mailboxes) return; return mailboxes.tags.filter((t) => t[0] === "r" && (t[2] === undefined || t[2] === "write")).map((t) => t[1]); } export function subscribeForEvents(relays: string[], onevent: (event: NostrEvent) => any) { return pool.subscribeMany(relays, [{ kinds: [NSITE_KIND], since: Math.round(Date.now() / 1000) - 60 * 60 }], { onevent, }); } export function requestEvents(relays: string[], filter: Filter) { return new Promise<NostrEvent[]>(async (res, rej) => { const events: NostrEvent[] = []; await Promise.allSettled(relays.map((url) => pool.ensureRelay(url).catch((e) => {}))); const sub = pool.subscribeMany(relays, [filter], { onevent: (e) => events.push(e), oneose: () => sub.close(), onclose: (reasons) => { const errs = reasons.filter((r) => r !== "closed by caller"); if (errs.length > 0 && events.length === 0) rej(new Error(errs.join(", "))); else res(events); }, }); }); } export default pool;