diff options
| author | polwex <polwex@sortug.com> | 2025-11-18 05:43:28 +0700 |
|---|---|---|
| committer | polwex <polwex@sortug.com> | 2025-11-18 05:43:28 +0700 |
| commit | 2497097f6cd639f9bfefec1d037a8c19a65e8145 (patch) | |
| tree | 5a96016bcb020fdebe29156f37e35e92be3116c1 /app/lib | |
| parent | 95d6b57ae9bd152724c26151c7247508acbb022e (diff) | |
big fixes to websockets handling
Diffstat (limited to 'app/lib')
| -rw-r--r-- | app/lib/json/nostrill.hoon | 55 | ||||
| -rw-r--r-- | app/lib/mutations/nostr.hoon | 289 | ||||
| -rw-r--r-- | app/lib/mutations/trill.hoon | 1 | ||||
| -rw-r--r-- | app/lib/nostr/client.hoon | 65 | ||||
| -rw-r--r-- | app/lib/nostrill.hoon | 14 | ||||
| -rw-r--r-- | app/lib/nostrill/follows.hoon | 6 | ||||
| -rw-r--r-- | app/lib/websockets.hoon | 28 |
7 files changed, 239 insertions, 219 deletions
diff --git a/app/lib/json/nostrill.hoon b/app/lib/json/nostrill.hoon index 266a6c8..ed8f0a8 100644 --- a/app/lib/json/nostrill.hoon +++ b/app/lib/json/nostrill.hoon @@ -25,12 +25,13 @@ (event:en:nostr ev) ++ en-relays - |= r=(map @t relay-stats:nsur) ^- json + |= r=(map @ relay-stats:nsur) ^- json %- pairs %+ turn ~(tap by r) - |= [url=@t rs=relay-stats:nsur] - :- url %- pairs - :~ :- %connected ?~ connected.rs ~ (time u.connected.rs) - :- %reqs (relay-stats reqs.rs) + |= [wid=@ud rs=relay-stats:nsur] + :- url.rs %- pairs + :~ :- %start (time start.rs) + :- %wid (numb wid) + :- %reqs (relay-stats reqs.rs) == ++ relay-stats |= rm=(map @t event-stats:nsur) %- pairs %+ turn ~(tap by rm) |= [sub-id=@t es=event-stats:nsur] @@ -83,6 +84,7 @@ %post (postfact +.f) %enga (enga +.f) %fols (fols +.f) + %hark (hark +.f) == ++ fols |= ff=fols-fact:ui:sur ^- json %+ frond -.ff @@ -103,9 +105,50 @@ (post-wrapper +.pf) ++ enga |= [pw=post-wrapper:sur reaction=*] + :: TODO ^- json ~ + ++ hark |= =notif:sur + ^- json + %+ frond -.notif + ?- -.notif + %prof (prof-notif +.notif) + %fols (pairs :~(['user' (user user.notif)] ['accepted' %b accepted.notif] ['msg' %s msg.notif])) + %fans (user p.notif) + %beg (beg-notif +.notif) + %post (post-notif +.notif) + == + ++ prof-notif |= [u=user:sur prof=user-meta:nsur] + %- pairs + :~ user+(user u) + profile+(user-meta:en:nostr prof) + == + ++ beg-notif |= [beg=begs-poke:ui:sur accepted=? msg=@t] + ^- json + %+ frond -.beg + %- pairs + :~ ['accepted' %b accepted] + ['msg' %s msg] + ?- -.beg + %feed ['ship' %s (scot %p +.beg)] + %thread ['post' (pid:en:trill +.beg)] + == + == + ++ post-notif |= [pid=[@p @da] u=user:sur p=post-notif:sur] + ^- json + %- pairs + :~ ['post' (pid:en:trill pid)] + ['user' (user u)] + :- -.p + ?- -.p + %reply (poast:en:trill +.p) + %quote (poast:en:trill +.p) + %reaction [%s +.p] + %rp ~ + %del ~ + == + == ++ post-wrapper |= p=post-wrapper:sur %- pairs :~ post+(poast:en:trill post.p) @@ -233,7 +276,7 @@ ++ ui-relay %- of :~ add+so - del+so + del+de-atom-id sync+ul send+de-relay-send == diff --git a/app/lib/mutations/nostr.hoon b/app/lib/mutations/nostr.hoon index 154bed9..4657784 100644 --- a/app/lib/mutations/nostr.hoon +++ b/app/lib/mutations/nostr.hoon @@ -8,10 +8,29 @@ njs=json-nostr, postlib=trill-post, nostr-client, - sr=sortug + sr=sortug, + ws=websockets |_ [=state:sur =bowl:gall] +$ card card:agent:gall +:: relay state +++ set-relay |= wid=@ud + ^- (quip card _state) + =/ socket (get-url:ws wid bowl) + ?~ socket ~& "socket wid not in iris" !! + ?. ?=(%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 + +++ unset-relay |= wid=@ud + ^- (quip card _state) + =. relays.state (~(del by relays.state) wid) + :_ state + :~ (disconnect:ws wid) + == + + :: events ++ handle-client-event |= [wid=@ =event:nsur] ^- (quip card _state) ~& handling-client-event=event @@ -54,44 +73,28 @@ =^ cards state (get-profiles:nclient pubkeys) [cards state] -++ handle-msg |= msg=relay-msg:nsur - ^- (quip card _state) - ?+ -.msg `state - %event - (handle-event '' sub-id.msg event.msg) - %eose - `state - %closed - `state - %auth ~& >> auth=+.msg :: TODO handle auth challenges? - `state - %notice ~& >> notice=+.msg :: TODO pass to UI? - `state - == -++ handle-ws |= [relay=@t msg=relay-msg:nsur] - =/ rs (~(get by relays.state) relay) - ?~ rs :: TODO do we really - `state +++ handle-ws |= [wid=@ud relay=relay-stats:nsur msg=relay-msg:nsur] + |^ =^ cards state - ~& handle-ws=-.msg + ~& >>> "HANDLING-WS-FROM-SERVER" + ~& > handle-ws=-.msg + ~& >>> "**************" ?- -.msg - %ok (handle-ok relay +.msg) - %event - =. relays.state (update-relay-stats relay sub-id.msg) - (handle-event relay sub-id.msg event.msg) - + :: This gets returned when we post a message to a relay + %ok (handle-ok url.relay +.msg) + %event (handle-event sub-id.msg event.msg) %eose :: TODO do unsub for replaceable/addressable events - =/ creq (~(get by reqs.u.rs) +.msg) + =/ creq (~(get by reqs.relay) +.msg) ?~ creq `state :: =. reqs.u.rs (~(del by reqs.u.rs) +.msg) :: =. relays.state (~(put by relays.state) relay u.rs) =/ cardslib ~(. cards:lib bowl) =/ c (update-ui:cardslib [%nostr nostr-feed.state]) :_ state :~(c) - %closed =. reqs.u.rs (~(del by reqs.u.rs) sub-id.msg) - =. relays.state (~(put by relays.state) relay u.rs) + %closed =. reqs.relay (~(del by reqs.relay) sub-id.msg) + =. relays.state (~(put by relays.state) wid relay) `state %auth ~& >> auth=+.msg :: TODO handle auth challenges? `state @@ -115,128 +118,120 @@ :: [ncards this] :: `state -++ update-relay-stats - |= [relay=@t sub-id=@t] ^+ relays.state - - =/ cur (~(get by relays.state) relay) - =/ curr ?~ cur *relay-stats:nsur u.cur - =? connected.curr ?=(%~ connected.curr) (some now.bowl) - =/ creq (~(get by reqs.curr) sub-id) - ?~ creq relays.state :: bail - =/ nreq u.creq(received +(received.u.creq)) - =. reqs.curr (~(put by reqs.curr) sub-id nreq) - (~(put by relays.state) relay curr) - -++ handle-ok |= [relay=@t event-id=@ux accepted=? msg=@t] - ^- (quip card _state) - :: TODO pass to UI - `state - + ++ handle-ok |= [relay=@t event-id=@ux accepted=? msg=@t] + ^- (quip card _state) + :: TODO pass to UI + `state -++ handle-event - |= [relay=@t sub-id=@t =event:nsur] - ^- (quip card _state) - |^ - ~& 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 + ++ handle-event + |= [sub-id=@t =event:nsur] + ^- (quip card _state) + ~& > handle-event-sub=sub-id + =/ req (~(get by reqs.relay) sub-id) + ?~ 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) + |^ + ~& 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 + + `state + + ++ parse-metadata + ^- (quip card _state) + =/ jstring content.event + =/ ujon (de:json:html jstring) + ?~ ujon ~& failed-parse-metadata=ujon `state + =/ umeta (user-meta:de:njs u.ujon) + ?~ umeta ~& >> failed-dejs-metadata=ujon `state + =. profiles.state (~(put by profiles.state) [%nostr pubkey.event] u.umeta) + `state + + + ++ parse-poast + ^- (quip card _state) + =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event) + :: =/ uprof (~(get by profiles.state) pubkey.event) + :: ?~ uprof + :: =/ shimm ~(. shim [state bowl]) + :: =^ cards state (get-profiles:shimm (silt ~[pubkey.event])) + :: [cards state] + + + :: =/ fid (~(get by following.state) pubkey.event) + :: ?~ fid `state :: don't save post if we don't follow the fucker + + :: =/ cl (tokenize:postlib content.event) + + :: =/ ts (from-unix:jikan:sr created-at.event) + :: :: TODO wtf + :: =/ cm=content-map:post (init-content-map:postlib cl ts) + + :: =/ p=post:post :* + :: id=ts + :: host=`@p`pubkey.event + :: author=`@p`pubkey.event + :: thread=ts + :: parent=~ + :: children=~ + :: contents=cm + :: read=*lock:gate + :: write=*lock:gate + :: *engagement:post + :: 0v0 + :: *signature:post + :: tags=~ + :: == + :: =/ nfid (put:orm:feed u.fid ts p) + :: =. following.state (~(put by following.state) pubkey.event nfid) `state - - ++ parse-metadata - ^- (quip card _state) - =/ jstring content.event - =/ ujon (de:json:html jstring) - ?~ ujon ~& failed-parse-metadata=ujon `state - =/ umeta (user-meta:de:njs u.ujon) - ?~ umeta ~& >> failed-dejs-metadata=ujon `state - =. profiles.state (~(put by profiles.state) [%nostr pubkey.event] u.umeta) + ++ parse-follow + ^- (quip card _state) + =/ following (~(get by follow-graph.state) [%nostr pubkey.event]) + =/ follow-set ?~ following *(set follow:sur) u.following + |- ?~ tags.event `state + =/ t=tag:nsur i.tags.event + :: ?. .=('p' key.t) $(tags.event t.tags.event) + :: =/ pubkeys value.t + :: =/ pubkey (slaw:sr %ux pubkeys) + :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event) + :: =/ relay (snag 0 rest.t) + :: =/ rel ?: .=(relay '') ~ (some relay) + :: =/ nickname (snag 1 rest.t) + :: =/ meta=follow:sur [u.pubkey nickname rel] + :: =. follow-set (~(put in follow-set) meta) + :: =. 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 - - - ++ parse-poast - ^- (quip card _state) - =. nostr-feed.state (put:norm:sur nostr-feed.state created-at.event event) - :: =/ uprof (~(get by profiles.state) pubkey.event) - :: ?~ uprof - :: =/ shimm ~(. shim [state bowl]) - :: =^ cards state (get-profiles:shimm (silt ~[pubkey.event])) - :: [cards state] - - - :: =/ fid (~(get by following.state) pubkey.event) - :: ?~ fid `state :: don't save post if we don't follow the fucker - - :: =/ cl (tokenize:postlib content.event) - - :: =/ ts (from-unix:jikan:sr created-at.event) - :: :: TODO wtf - :: =/ cm=content-map:post (init-content-map:postlib cl ts) - - :: =/ p=post:post :* - :: id=ts - :: host=`@p`pubkey.event - :: author=`@p`pubkey.event - :: thread=ts - :: parent=~ - :: children=~ - :: contents=cm - :: read=*lock:gate - :: write=*lock:gate - :: *engagement:post - :: 0v0 - :: *signature:post - :: tags=~ - :: == - :: =/ 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]) - =/ follow-set ?~ following *(set follow:sur) u.following - |- ?~ tags.event `state - =/ t=tag:nsur i.tags.event - :: ?. .=('p' key.t) $(tags.event t.tags.event) - :: =/ pubkeys value.t - :: =/ pubkey (slaw:sr %ux pubkeys) - :: ?~ pubkey ~& "parsing hex error" $(tags.event t.tags.event) - :: =/ relay (snag 0 rest.t) - :: =/ rel ?: .=(relay '') ~ (some relay) - :: =/ nickname (snag 1 rest.t) - :: =/ meta=follow:sur [u.pubkey nickname rel] - :: =. follow-set (~(put in follow-set) meta) - :: =. follow-graph.state (~(put by follow-graph.state) pubkey.event follow-set) - $(tags.event t.tags.event) - ++ parse-relay-oneose - ^- (quip card _state) - =/ rs (~(get by relays.state) relay) - ?~ rs `state - =. reqs.u.rs (~(del by reqs.u.rs) sub-id) - =. relays.state (~(put by relays.state) relay u.rs) - `state + -- -- - -++ handle-prof-fact |= pf=prof-fact:comms - ^- (quip card _state) - =/ =user:sur [%urbit src.bowl] - ?- -.pf - %prof =. profiles.state (~(put by profiles.state) user +.pf) - :: TODO kinda wanna send it to the UI - `state - %keys `state - :: TODO really need a way to keep track of everyone's pubkeys - == + ++ handle-prof-fact |= pf=prof-fact:comms + ^- (quip card _state) + =/ =user:sur [%urbit src.bowl] + ?- -.pf + %prof =. profiles.state (~(put by profiles.state) user +.pf) + :: TODO kinda wanna send it to the UI + `state + %keys `state + :: TODO really need a way to keep track of everyone's pubkeys + == -- diff --git a/app/lib/mutations/trill.hoon b/app/lib/mutations/trill.hoon index 653a493..d5cfb67 100644 --- a/app/lib/mutations/trill.hoon +++ b/app/lib/mutations/trill.hoon @@ -41,6 +41,7 @@ =/ profile (~(get by profiles.state) [%urbit our.bowl]) =/ pubkey pub.i.keys.state =/ crds ~(. cards:lib bowl) + :: TODO UI notifications [%hark ] ?- -.poke %del =. feed.state =< + (del:orm:feed feed.state id.poke) diff --git a/app/lib/nostr/client.hoon b/app/lib/nostr/client.hoon index 1cda3e3..f0d12a2 100644 --- a/app/lib/nostr/client.hoon +++ b/app/lib/nostr/client.hoon @@ -28,27 +28,32 @@ :: :: build http card :: =/ [url=@t rs=relay-stats:nsur] i.rls :: :: mutate relays stats -:: =/ es=event-stats:nsur [fs 0] -:: =/ nreqs (~(put by reqs.rs) sub-id es) :: =/ nrs rs(reqs nreqs) :: =. relays.state (~(put by relays.state) url nrs) :: $(urls [url urls], rls t.rls) ++ send-req |= fs=(list filter:nsur) ^- (quip card _state) - =/ rls ~(tap by relays.state) =/ sub-id (gen-sub-id:nostr-keys eny.bowl) =/ req=client-msg:nsur [%req sub-id fs] =/ rls ~(tap by relays.state) ?~ rls !! - =/ url -.i.rls + :: TODO not how this should work + =/ rs=relay-stats:nsur +.i.rls + =/ wid -.i.rls + =/ url url.rs + =/ es=event-stats:nsur [fs 0] + =. reqs.rs (~(put by reqs.rs) sub-id es) + =. relays.state (~(put by relays.state) wid rs) + ~& > sending-ws-req=sub-id :- :~ (send url req) == state ++ get-posts ^- (quip card _state) =/ kinds (silt ~[1]) - =/ last-week (sub now.bowl ~d1) + :: =/ last-week (sub now.bowl ~d7) + =/ last-week (sub now.bowl ~m2) :: =/ since (to-unix-secs:jikan:sr last-week) =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] (send-req ~[filter]) @@ -105,48 +110,12 @@ =/ octs (json-to-octs:server req-body) =/ wmsg=websocket-message:eyre [1 `octs] ~& >> sup=sup.bowl - :: =/ conn (check-connected:ws relay-url bowl) - :: ~& >>> send-client-conn=conn - :: ?~ conn :: if no ws connection we start a thread which will connect first, then send the message - :: =/ pat /to-nostr-relay - :: [%pass (weld /ws pat) %arvo %k %fard dap.bowl %ws %noun !>([relay-url wmsg])] + =/ conn (check-connected:ws relay-url bowl) + ~& >>> send-client-conn=conn + ?~ conn :: if no ws connection we start a thread which will connect first, then send the message + !! + :: =/ =task:iris [%websocket-connect dap.bowl relay-url] + :: [%pass /ws-req/nostrill %arvo %i task] :: - :: (give-ws-payload-client:ws id.u.conn wmsg) - :: (give-ws-payload-client:ws wid wmsg) - - =/ =task:iris [%websocket-connect dap.bowl relay-url] - [%pass /ws-req/nostrill %arvo %i task] - - -:: ++ send-http -:: |= req=http-req:shim:nsur -:: ^- card:agent:gall -:: =/ req-body (http-req:en:js req) -:: :: ~& shim-req-json=(en:json:html req-body) -:: =/ host .^(hart:eyre %e /(scot %p our.bowl)/host/(scot %da now.bowl)) -:: =/ origin %- crip (head:en-purl:html host) -:: =/ headers :~ -:: [key='content-type' value='application/json'] -:: [key='origin' value=origin] -:: == -:: =/ =request:http [%'POST' url:shim:nsur headers `(json-body:web req-body)] -:: [%pass /http/[sub-id.req] %arvo %k %fard dap.bowl %fetch %noun !>(request)] -:: :: -:: :: HTTP -:: :: - -:: ++ get-profiles-http -:: |= pubkeys=(set @ux) -:: ^- (quip card _state) -:: =/ relays ~(key by relays.state) -:: :: TODO make a function to use most reliable -:: =/ relay (head ~(tap in relays)) -:: ~& http=relay -:: =/ sub-id (gen-sub-id:nostr-keys eny.bowl) -:: =/ kinds (silt ~[0]) -:: =/ total=filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] -:: =/ req=http-req:shim:nsur [relay http-delay:constants sub-id ~[total]] -:: =/ =card (send-http req) -:: :- :~(card) state - + (give-ws-payload-client:ws wid.u.conn wmsg) -- diff --git a/app/lib/nostrill.hoon b/app/lib/nostrill.hoon index 1f5db40..32099b2 100644 --- a/app/lib/nostrill.hoon +++ b/app/lib/nostrill.hoon @@ -5,22 +5,18 @@ :: ++ default-state |= =bowl:gall ^- state:sur =/ s *state-0:sur - =/ l public-relays:nsur - :: =/ l (scag 1 l) :: =/ l ~['wss://relay.damus.io' 'wss://nos.lol'] - =/ rl %+ turn l |= t=@t [t *relay-stats:nsur] - :: =/ l ~[['wss://relay.damus.io' ~]] =/ key (gen-keys:nostr-keys eny.bowl) =/ keyl [key ~] - s(relays (malt rl), keys keyl) + s(keys keyl) ++ print-relay-stats - |= rm=(map @t relay-stats:nsur) + |= rm=(map @ relay-stats:nsur) =/ l ~(tap by rm) |- ?~ l ~ - =/ [url=@t rs=relay-stats:nsur] i.l - ~& relay=url - ~& connected=connected.rs + =/ [wid=@ rs=relay-stats:nsur] i.l + ~& relay-url=url.rs + ~& connected=start.rs ~& sub-count=~(wyt by reqs.rs) =/ total-received %+ roll ~(tap by reqs.rs) diff --git a/app/lib/nostrill/follows.hoon b/app/lib/nostrill/follows.hoon index 942a876..fb477d6 100644 --- a/app/lib/nostrill/follows.hoon +++ b/app/lib/nostrill/follows.hoon @@ -33,8 +33,10 @@ ++ handle-follow-res |= =res:comms ?- -.res - %ng :: bruh - `state + %ng + :_ state + =/ =fact:ui:sur [%hark %fols [%urbit src.bowl] .n msg.res] + =/ c (update-ui:cards:lib fact) :~(c) %ok ?- -.p.res %feed (handle-follow-ok [%urbit src.bowl] fc.+.p.res profile.+.p.res) diff --git a/app/lib/websockets.hoon b/app/lib/websockets.hoon index 8e6d45c..ae48775 100644 --- a/app/lib/websockets.hoon +++ b/app/lib/websockets.hoon @@ -1,4 +1,15 @@ |% + ++ connect |= [endpoint=@t =bowl:gall] + ^- card:agent:gall + =/ =task:iris [%websocket-connect dap.bowl endpoint] + [%pass /ws-connect %arvo %i task] + + ++ disconnect |= wid=@ud + ^- card:agent:gall + =/ =path /websocket-client/(scot %ud wid) + =/ ws-paths :~(path) + [%give %fact ws-paths %disconnect !>(~)] + :: ++ give-ws-payload-client |= [wid=@ msg=websocket-message:eyre] ^- card:agent:gall @@ -32,15 +43,18 @@ :~ (give-ws-payload-server wid response) == - +:: %iris scries + +$ socket [wid=@ud url=@t status=$?(%accepted %pending)] ++ get-url - |= [wid=@ud =bowl:gall] ^- @t + |= [wid=@ud =bowl:gall] ^- (unit socket) =/ scry-path=path /(scot %p our.bowl)/ws/(scot %da now.bowl)/id/(scot %ud wid) - =/ conn .^(websocket-connection:iris %ix scry-path) - url.conn + .^((unit socket) %ix scry-path) ++ check-connected - |= [url=@t =bowl:gall] ^- (unit websocket-connection:iris) + |= [url=@t =bowl:gall] ^- (unit socket) =/ scry-path=path /(scot %p our.bowl)/ws/(scot %da now.bowl)/url/[url] - =/ conn .^((unit websocket-connection:iris) %ix scry-path) - conn + .^((unit socket) %ix scry-path) + ++ list-connected + |= =bowl:gall ^- (list socket) + =/ scry-path=path /(scot %p our.bowl)/ws/(scot %da now.bowl)/app + .^((list socket) %ix scry-path) -- |
