parse.ts (1845B)
1 import { KIND_FARM, KIND_PLOT, type RadrootsPlot } from "@radroots/events-bindings"; 2 import type { NostrEvent } from "../../types/nostr.js"; 3 import { get_event_tag, parse_nostr_event_basis } from "../lib.js"; 4 import type { NostrEventBasis } from "../subscription.js"; 5 6 export type RadrootsPlotNostrEvent = NostrEventBasis<typeof KIND_PLOT> & { plot: RadrootsPlot }; 7 8 type PlotFarmRef = { 9 pubkey: string; 10 d_tag: string; 11 }; 12 13 const parse_farm_addr = (value: string): PlotFarmRef | undefined => { 14 const parts = value.split(":"); 15 if (parts.length < 3) return undefined; 16 const kind = Number(parts[0]); 17 if (!Number.isFinite(kind) || kind !== KIND_FARM) return undefined; 18 const pubkey = parts[1]?.trim() || ""; 19 const d_tag = parts.slice(2).join(":").trim(); 20 if (!pubkey || !d_tag) return undefined; 21 return { pubkey, d_tag }; 22 }; 23 24 export const parse_nostr_plot_event = ( 25 event: NostrEvent, 26 ): RadrootsPlotNostrEvent | undefined => { 27 const ev = parse_nostr_event_basis(event, KIND_PLOT); 28 if (!ev) return undefined; 29 const d_tag = get_event_tag(event.tags, "d"); 30 if (!d_tag) return undefined; 31 const farm_addr = get_event_tag(event.tags, "a"); 32 if (!farm_addr) return undefined; 33 const farm_pubkey = get_event_tag(event.tags, "p"); 34 if (!farm_pubkey) return undefined; 35 const farm_ref = parse_farm_addr(farm_addr); 36 if (!farm_ref) return undefined; 37 if (farm_pubkey !== farm_ref.pubkey) return undefined; 38 try { 39 const parsed = JSON.parse(event.content); 40 const plot = parsed as RadrootsPlot; 41 if (plot.d_tag !== d_tag) return undefined; 42 if (plot.farm.pubkey !== farm_ref.pubkey) return undefined; 43 if (plot.farm.d_tag !== farm_ref.d_tag) return undefined; 44 return { ...ev, plot }; 45 } catch { 46 return undefined; 47 } 48 };