From 76f99af3c98a689441315b5ed087c4b83c083191 Mon Sep 17 00:00:00 2001 From: polwex Date: Tue, 18 Nov 2025 16:58:46 +0700 Subject: refactooooring --- app/lib/mutations/nostr.hoon | 157 ++++++++++++++++++++++++++++++------------- 1 file changed, 110 insertions(+), 47 deletions(-) (limited to 'app/lib/mutations/nostr.hoon') diff --git a/app/lib/mutations/nostr.hoon b/app/lib/mutations/nostr.hoon index 232fcea..66fdc35 100644 --- a/app/lib/mutations/nostr.hoon +++ b/app/lib/mutations/nostr.hoon @@ -11,12 +11,18 @@ postlib=trill-post, nostr-client, sr=sortug, + scri, ws=websockets |_ [=state:sur =bowl:gall] -+* nclient ~(. nostr-client [state bowl]) ++* cardslib ~(. cards:lib bowl) +$ card card:agent:gall :: relay state +++ get-relay ^- (unit [wid=@ud relay=relay-stats:nsur]) + =/ rls ~(tap by relays.state) + ?~ rls ~ + `i.rls + ++ set-relay |= wid=@ud ^- (quip card _state) =/ socket (get-url:ws wid bowl) @@ -24,13 +30,17 @@ ?. ?=(%accepted status.u.socket) ~& "socket status in iris unsync" !! =/ relay=relay-stats:nsur [now.bowl url.u.socket ~] =. relays.state (~(put by relays.state) wid relay) - `state + :_ state + =/ ui-card (update-ui:cardslib [%nostr %relays relays.state]) + :~(ui-card) ++ unset-relay |= wid=@ud ^- (quip card _state) =. relays.state (~(del by relays.state) wid) + =/ ui-card (update-ui:cardslib [%nostr %relays relays.state]) :_ state :~ (disconnect:ws wid) + ui-card == @@ -69,15 +79,8 @@ :: $(evs t.evs) :: [cards state] -++ populate-profiles - |= pubkeys=(set @ux) - ^- (quip card _state) - =/ nclient ~(. nostr-client [state bowl]) - =^ cards state get-profiles:nclient - [cards state] - - ++ handle-ws |= [wid=@ud relay=relay-stats:nsur msg=relay-msg:nsur] + =/ nclient ~(. nostr-client [state bowl wid relay]) |^ =^ cards state ~& > handle-ws=-.msg @@ -120,32 +123,39 @@ ++ handle-event |= [sub-id=@t =event:nsur] ^- (quip card _state) - ~& > handle-event-sub=sub-id :: increment event count in relay state + ~& >> parsing-nostr-event=kind.event + ~& >> sub-id=sub-id + ~& > relay-subs=~(key by reqs.relay) =/ req (~(get by reqs.relay) sub-id) - ?~ req ~& "sub id not found in relay state" `state + ?~ req ~& >>> "sub id not found in relay state" `state + =. received.u.req +(received.u.req) =. reqs.relay (~(put by reqs.relay) sub-id u.req) =. relays.state (~(put by relays.state) wid relay) :: |^ - ~& parsing-nostr-event=kind.event :: https://nostrdata.github.io/kinds/ - ?: .=(kind.event 666) :: one_off subs eose cf. 999 - parse-relay-oneose - ?: .=(kind.event 0) :: user metadata - parse-metadata - ?: .=(kind.event 1) :: apparently a poast - parse-poast - ?: .=(kind.event 3) :: follow list - parse-follow - :: ?: .=(kind.event 5) :: delete - ?: .=(kind.event 6) :: RT - parse-follow - ?: .=(kind.event 7) :: Reaction - parse-follow - + =/ cs1=(list card) + ?~ ongoing.u.req ~ + ?. u.ongoing.u.req ~ + :: If it's an ongoing request and %eose has been reached we pass the individual event to the UI as is + =/ c (update-ui:cardslib [%nostr %event event]) + :~(c) + =^ cs state + ?: .=(kind.event 0) :: user metadata + parse-metadata + ?: .=(kind.event 1) :: apparently a poast + parse-poast + ?: .=(kind.event 3) :: follow list + parse-follow + :: ?: .=(kind.event 5) :: delete + ?: .=(kind.event 6) :: RT + parse-follow + ?: .=(kind.event 7) :: Reaction + parse-follow `state + [(weld cs1 cs) state] ++ parse-metadata ^- (quip card _state) @@ -161,6 +171,14 @@ ++ parse-poast ^- (quip card _state) =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event) + =/ user-feed (~(get by following.state) [%nostr pubkey.event]) + =? following.state ?=(^ user-feed) + =/ pw (event-to-post:evlib event ~ ~) + =/ poast=post:post -.pw + =/ nf (put:orm:feed u.user-feed id.poast poast) + (~(put by following.state) [%nostr pubkey.event] nf) + :_ state + ~ :: =/ uprof (~(get by profiles.state) pubkey.event) :: ?~ uprof :: =/ shimm ~(. shim [state bowl]) @@ -194,7 +212,6 @@ :: == :: =/ nfid (put:orm:feed u.fid ts p) :: =. following.state (~(put by following.state) pubkey.event nfid) - `state ++ parse-follow ^- (quip card _state) =/ following (~(get by follow-graph.state) [%nostr pubkey.event]) @@ -213,11 +230,6 @@ :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set) $(tags.event t.tags.event) :: - ++ parse-relay-oneose - ^- (quip card _state) - =. reqs.relay (~(del by reqs.relay) sub-id) - =. relays.state (~(put by relays.state) wid relay) - `state -- ++ handle-eose |= sub-id=@t @@ -228,26 +240,54 @@ ?~ creq ~& >>> "sub id not found! on eose" `state ~& >> eose=u.creq ~& >>> "**************" + :: :: if there's a queue we setup the next subscription - =^ cards state - =/ is-feed (is-feed:evlib filters.u.creq) - ?. is-feed [~ state] - =/ cardslib ~(. cards:lib bowl) - =/ c (update-ui:cardslib [%nostr nostr-feed.state]) - =^ mc state get-profiles:nclient - [[c mc] state] - =^ cards2 state - ?~ chunked.u.creq [~ state] + =^ cards relay + ?: (is-feed:evlib filters.u.creq) + =/ c (update-ui:cardslib [%nostr %feed nostr-feed.state]) + =^ mc relay get-profiles:nclient + [[c mc] relay] + :: + =/ users=(set @ux) (user-req:evlib filters.u.creq) + ?: (gth ~(wyt in users) 0) + =/ poasts (tap:norm:sur nostr-feed.state) + =/ subset %+ skim poasts |= [* ev=event:nsur] (~(has in users) pubkey.ev) + =/ f (gas:norm:sur *nostr-feed:sur subset) + =/ c (update-ui:cardslib [%nostr %user f]) + =^ mc relay get-profiles:nclient + [[c mc] relay] + =/ thread-id (thread-req:evlib filters.u.creq) + ?^ thread-id + =/ poasts (tap:norm:sur nostr-feed.state) + =/ subset %+ skim poasts |= [* ev=event:nsur] + ?| .=(u.thread-id id.ev) + =/ refs (get-references:evlib ev) + (~(has in refs) u.thread-id) + == + =/ f (gas:norm:sur *nostr-feed:sur subset) + =/ c (update-ui:cardslib [%nostr %thread f]) + =^ mc relay get-profiles:nclient + [[c mc] relay] + :: + [~ relay] + :: + =^ cards2 relay + ?~ chunked.u.creq [~ relay] =/ head i.chunked.u.creq =/ tail t.chunked.u.creq =/ ncreq=event-stats:nsur [filters.u.creq received.u.creq ongoing.u.creq ~] =. reqs.relay (~(put by reqs.relay) sub-id ncreq) - =. relays.state (~(put by relays.state) wid relay) (send-req:nclient :~(head) ongoing.u.creq tail) - =^ cards3 state - ?: ongoing.u.creq [~ state] - (close-sub:nclient sub-id wid relay) - :: + :: + =^ cards3 relay + ?~ ongoing.u.creq + ~& >>> closing-relay-sub=[sub-id filters.u.creq] + (close-sub:nclient sub-id wid relay) + =/ ncreq=event-stats:nsur [filters.u.creq received.u.creq `.y ~] + =. reqs.relay (~(put by reqs.relay) sub-id ncreq) + [~ relay] + :: + =. relays.state (~(put by relays.state) wid relay) :_ state (weld (weld cards cards2) cards3) -- @@ -261,4 +301,27 @@ %keys `state :: TODO really need a way to keep track of everyone's pubkeys == + ++ handle-rela |= rh=relay-handling:ui:sur + ^- (quip card _state) + =/ rl get-relay + ?~ rl ~& >>> "no relay!!!!" `state + =/ wid=@ud -.u.rl + =/ relay=relay-stats:nsur +.u.rl + =/ nclient ~(. nostr-client [state bowl wid relay]) + ?: ?=(%send -.rh) + =/ scry ~(. scri [state bowl]) + =/ upoast (get-poast:scry host.rh id.rh) + ?~ upoast `state + =/ event (post-to-event:evlib i.keys.state eny.bowl u.upoast) + =/ cs :~((send:nclient url.relay [%event event])) + [cs state] + =^ cs relay + ?- -.rh + %sync get-posts:nclient + %user (get-user-feed:nclient +.rh) + %thread (get-thread:nclient +.rh) + :: + == + =. relays.state (~(put by relays.state) -.u.rl relay) + [cs state] -- -- cgit v1.2.3