From c61bca793741959fdcd87f70854bc75cf263495f Mon Sep 17 00:00:00 2001 From: polwex Date: Tue, 28 Oct 2025 02:54:55 +0700 Subject: refactor of nostrill backend to deal with websockets on Iris. almost complete --- app/lib/json/nostr.hoon | 73 +++++++++++++---------- app/lib/mutations/nostr.hoon | 28 ++------- app/lib/mutations/trill.hoon | 1 - app/lib/nostr/client.hoon | 131 ++++++++++++++++++++++++++++++++++++++++++ app/lib/nostrill.hoon | 6 +- app/lib/nostrill/follows.hoon | 6 +- app/lib/scri.hoon | 1 - app/lib/shim.hoon | 130 ----------------------------------------- 8 files changed, 182 insertions(+), 194 deletions(-) create mode 100644 app/lib/nostr/client.hoon delete mode 100644 app/lib/shim.hoon (limited to 'app/lib') diff --git a/app/lib/json/nostr.hoon b/app/lib/json/nostr.hoon index 0000234..887e0d8 100644 --- a/app/lib/json/nostr.hoon +++ b/app/lib/json/nostr.hoon @@ -4,23 +4,7 @@ ++ en =, enjs:format |% - :: shim comms - ++ bulk-req |= [relays=(list @t) r=client-msg:sur] ^- json - %+ frond %ws - %: pairs - relays+a+(turn relays cord:en:common) - req+(req r) - ~ - == - ++ http-req |= [relay=@t delay=@ud sub-id=@t fs=(list filter:sur)] - %+ frond %http - %: pairs - relay+s+relay - delay+(numb delay) - ['subscription_id' %s sub-id] - filters+a+(turn fs filter) - ~ - == + :: relay comms ++ req |= req=client-msg:sur ^- json =/ en-ev event :- %a :- s+(crip (cuss (trip -.req))) @@ -117,31 +101,58 @@ %closed ~[[%s sub-id.msg]] %notice ~[[%s msg.msg]] %auth ~[[%s challenge.msg]] - %error ~ == -- ++ de =, dejs-soft:format |% - :: shim - ++ shim-res - %- of :~ - http+(ar relay-msg) - ws+msg - == + :: relay ++ msg %- ot :~ relay+so msg+relay-msg == ++ relay-msg - %- of :~ - event+event-sub - ok+relay-ok - eose+so - closed+closed - notice+so - error+so + |= jon=json ^- (unit relay-msg:sur) + ?. ?=(%a -.jon) ~ + ?~ p.jon ~ + =/ head i.p.jon + ?~ t.p.jon ~ + =/ second i.t.p.jon + ?. ?=(%s -.head) ~ + :: TODO make sure they're always caps + ~& dejson=[p.head second] + ?+ p.head ~ + %'EVENT' + =/ d (so second) ?~ d ~ + ?~ t.t.p.jon ~ + =/ third i.t.t.p.jon + =/ t (event third) ?~ t ~ + `[%event u.d u.t] + %'OK' + =/ d (hex:de:common second) ?~ d ~ + ?~ t.t.p.jon ~ + =/ third i.t.t.p.jon + =/ t (bo third) ?~ t ~ + ?~ t.t.t.p.jon ~ + =/ fourth i.t.t.t.p.jon + =/ f (so fourth) ?~ f ~ + `[%ok u.d u.t u.f] + %'CLOSED' + =/ d (so second) ?~ d ~ + ?~ t.t.p.jon ~ + =/ third i.t.t.p.jon + =/ t (so third) ?~ t ~ + `[%closed u.d u.t] + %'EOSE' + =/ d (so second) ?~ d ~ + `[%eose u.d] + %'NOTICE' + =/ d (so second) ?~ d ~ + `[%notice u.d] + %'AUTH' + =/ d (so second) ?~ d ~ + `[%auth u.d] == ++ client-msg |= jon=json ^- (unit client-msg:sur) diff --git a/app/lib/mutations/nostr.hoon b/app/lib/mutations/nostr.hoon index 6e1ab3e..154bed9 100644 --- a/app/lib/mutations/nostr.hoon +++ b/app/lib/mutations/nostr.hoon @@ -7,7 +7,7 @@ server, njs=json-nostr, postlib=trill-post, - shim, + nostr-client, sr=sortug |_ [=state:sur =bowl:gall] @@ -50,23 +50,10 @@ ++ populate-profiles |= pubkeys=(set @ux) ^- (quip card _state) - =/ shimm ~(. shim [state bowl]) - =^ cards state (get-profiles-http:shimm pubkeys) + =/ nclient ~(. nostr-client [state bowl]) + =^ cards state (get-profiles:nclient pubkeys) [cards state] - - - - -++ handle-http - |= [sub-id=@t msgs=(list relay-msg:nsur)] - ~& handling-http=[sub-id (lent msgs)] - =| cards=(list card) - |- ?~ msgs [cards state] - =^ cards state (handle-msg i.msgs) - $(msgs t.msgs) - - ++ handle-msg |= msg=relay-msg:nsur ^- (quip card _state) ?+ -.msg `state @@ -80,8 +67,6 @@ `state %notice ~& >> notice=+.msg :: TODO pass to UI? `state - %error ~& >>> relay-error=+.msg - `state == ++ handle-ws |= [relay=@t msg=relay-msg:nsur] @@ -112,9 +97,6 @@ `state %notice ~& >> notice=+.msg :: TODO pass to UI? `state - %error ~& >>> relay-error=+.msg - =. relays.state (~(del by relays.state) relay) - `state == [cards state] @@ -158,7 +140,7 @@ ~& parsing-nostr-event=kind.event :: https://nostrdata.github.io/kinds/ ?: .=(kind.event 666) :: one_off subs eose cf. 999 - parse-shim-oneose + parse-relay-oneose ?: .=(kind.event 0) :: user metadata parse-metadata ?: .=(kind.event 1) :: apparently a poast @@ -238,7 +220,7 @@ :: =. 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-shim-oneose + ++ parse-relay-oneose ^- (quip card _state) =/ rs (~(get by relays.state) relay) ?~ rs `state diff --git a/app/lib/mutations/trill.hoon b/app/lib/mutations/trill.hoon index ea6dadf..40cce1e 100644 --- a/app/lib/mutations/trill.hoon +++ b/app/lib/mutations/trill.hoon @@ -6,7 +6,6 @@ trill=trill-post, njs=json-nostr, postlib=trill-post, - shim, sr=sortug |_ [=state:sur =bowl:gall] diff --git a/app/lib/nostr/client.hoon b/app/lib/nostr/client.hoon new file mode 100644 index 0000000..908b360 --- /dev/null +++ b/app/lib/nostr/client.hoon @@ -0,0 +1,131 @@ +/- sur=nostrill, nsur=nostr +/+ js=json-nostr, sr=sortug, nostr-keys, constants, server +/= web /web/router +|_ [=state:sur =bowl:gall] + ++$ card card:agent:gall +++ parse-msg + |= [eyre-id=@ta req=inbound-request:eyre] + ^- (unit relay-msg:nsur) + ?~ body.request.req ~ + =/ jstring q.u.body.request.req + (parse-body jstring) +++ parse-body |= jstring=@t + =/ ures (de:json:html jstring) + ?~ ures ~ + =/ ur (relay-msg:de:js u.ures) + ?~ ur ~& >>> relay-msg-parsing-failed=jstring ~ + ur +:: __ + +:: ++ get-req |= fs=(list filter:nsur) +:: ^- [bulk-req:shim:nsur _state] +:: =/ rls ~(tap by relays.state) +:: =| urls=(list @t) +:: =/ sub-id (gen-sub-id:nostr-keys eny.bowl) +:: =/ req=client-msg:nsur [%req sub-id fs] +:: |- ?~ rls [[urls req] state] +:: :: 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 + :- :~ (send url req) == state + + +++ get-posts + ^- (quip card _state) + =/ kinds (silt ~[1]) + =/ last-week (sub now.bowl ~d7) + :: =/ since (to-unix-secs:jikan:sr last-week) + =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] + (send-req ~[filter]) + +++ get-user-feed + |= pubkey=@ux + ^- (quip card _state) + =/ kinds (silt ~[1]) + :: =/ since (to-unix-secs:jikan:sr last-week) + =/ pubkeys (silt ~[pubkey]) + =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + (send-req ~[filter]) + +++ get-profiles + |= pubkeys=(set @ux) + ^- (quip card _state) + =/ kinds (silt ~[0]) + =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] + (send-req ~[filter]) + +++ get-engagement + |= post-ids=(set @ux) + ^- (quip card _state) + =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) + =/ =filter:nsur + =/ kinds (silt ~[6 7]) + =/ tags (malt :~([%e post-strings])) + [~ ~ `kinds `tags ~ ~ ~] + (send-req ~[filter]) + +++ get-quotes + |= post-id=@ux + ^- (quip card _state) + =/ post-string (crip (scow:sr %ux post-id)) + =/ kinds (silt ~[1]) + =/ tags (malt :~([%q (silt ~[post-string])])) + =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] + (send-req ~[filter]) + +:: TODO URGENT +++ send + |= [relay-url=@t req=client-msg:nsur] ^- card:agent:gall + =/ req-body=json (req:en:js req) + =/ octs (json-to-octs:server req-body) + =/ wev=websocket-event:eyre [%message 1 `octs] + =/ pat /to-nostr-relay + [%pass (weld /ws pat) %arvo %k %fard dap.bowl %ws %noun !>([relay-url wev])] + +:: ++ 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 + +-- diff --git a/app/lib/nostrill.hoon b/app/lib/nostrill.hoon index 933dc7f..b9d8f88 100644 --- a/app/lib/nostrill.hoon +++ b/app/lib/nostrill.hoon @@ -39,16 +39,12 @@ ++ cards |_ =bowl:gall - ++ shim-binding ^- card:agent:gall - [%pass /binding %arvo %e %connect [~ /nostr-shim] dap.bowl] - ++ relay-binding ^- card:agent:gall [%pass /binding %arvo %e %connect [~ /nostrill] dap.bowl] ++ ui-binding ^- card:agent:gall [%pass /binding %arvo %e %connect [~ /nostrill-ui] dap.bowl] ++ bindings - :~ shim-binding - relay-binding + :~ relay-binding ui-binding == ++ update-ui |= =fact:ui:sur ^- card:agent:gall diff --git a/app/lib/nostrill/follows.hoon b/app/lib/nostrill/follows.hoon index e4d04a6..34c1d19 100644 --- a/app/lib/nostrill/follows.hoon +++ b/app/lib/nostrill/follows.hoon @@ -1,19 +1,19 @@ /- sur=nostrill, nsur=nostr, comms=nostrill-comms, feed=trill-feed -/+ lib=nostrill, js=json-nostr, shim, sr=sortug, constants, gatelib=trill-gate, feedlib=trill-feed, jsonlib=json-nostrill +/+ lib=nostrill, js=json-nostr, nostr-client, sr=sortug, constants, gatelib=trill-gate, feedlib=trill-feed, jsonlib=json-nostrill |_ [=state:sur =bowl:gall] ++ handle-add |= =user:sur ^- (quip card:agent:gall _state) ?- -.user %urbit =/ c (urbit-watch +.user) :- :~(c) state - %nostr =/ shimm ~(. shim [state bowl]) + %nostr =/ nclient ~(. nostr-client [state bowl]) :: TODO now or on receival? =. following.state (~(put by following.state) user *feed:feed) =/ graph (~(get by follow-graph.state) [%urbit our.bowl]) =/ follows ?~ graph (silt ~[user]) (~(put in u.graph) user) =. follow-graph.state (~(put by follow-graph.state) [%urbit our.bowl] follows) - =^ cards state (get-user-feed:shimm +.user) + =^ cards state (get-user-feed:nclient +.user) [cards state] == ++ handle-del |= =user:sur diff --git a/app/lib/scri.hoon b/app/lib/scri.hoon index e76d79a..1ebaa54 100644 --- a/app/lib/scri.hoon +++ b/app/lib/scri.hoon @@ -6,7 +6,6 @@ njs=json-nostr, feedlib=trill-feed, postlib=trill-post, - shim, constants, sr=sortug diff --git a/app/lib/shim.hoon b/app/lib/shim.hoon deleted file mode 100644 index 77d5eed..0000000 --- a/app/lib/shim.hoon +++ /dev/null @@ -1,130 +0,0 @@ -/- sur=nostrill, nsur=nostr -/+ js=json-nostr, sr=sortug, nostr-keys, constants -/= web /web/router -|_ [=state:sur =bowl:gall] - -+$ card card:agent:gall -++ parse-msg - |= [eyre-id=@ta req=inbound-request:eyre] - ^- (unit res:shim:nsur) - ?~ body.request.req ~ - =/ jstring q.u.body.request.req - (parse-body jstring) -++ parse-body |= jstring=@t - =/ ures (de:json:html jstring) - ?~ ures ~ - =/ ur (shim-res:de:js u.ures) - ?~ ur ~& >>> shim-msg-parsing-failed=jstring ~ - ur -:: __ -++ get-req |= fs=(list filter:nsur) - ^- [bulk-req:shim:nsur _state] - =/ rls ~(tap by relays.state) - =| urls=(list @t) - =/ sub-id (gen-sub-id:nostr-keys eny.bowl) - =/ req=client-msg:nsur [%req sub-id fs] - |- ?~ rls [[urls req] state] - :: 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) - -++ get-posts - ^- (quip card _state) - =/ kinds (silt ~[1]) - =/ last-week (sub now.bowl ~d7) - :: =/ since (to-unix-secs:jikan:sr last-week) - =/ =filter:nsur [~ ~ `kinds ~ `last-week ~ ~] - =^ req=bulk-req:shim:nsur state (get-req ~[filter]) - :- :~((send req)) state - -++ get-user-feed - |= pubkey=@ux - ^- (quip card _state) - =/ kinds (silt ~[1]) - :: =/ since (to-unix-secs:jikan:sr last-week) - =/ pubkeys (silt ~[pubkey]) - =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - =^ req=bulk-req:shim:nsur state (get-req ~[filter]) - :- :~((send req)) state - -++ get-profiles - |= pubkeys=(set @ux) - ^- (quip card _state) - =/ kinds (silt ~[0]) - =/ =filter:nsur [~ `pubkeys `kinds ~ ~ ~ ~] - =^ req=bulk-req:shim:nsur state (get-req ~[filter]) - :- :~((send req)) state - -++ get-engagement - |= post-ids=(set @ux) - ^- (quip card _state) - =/ post-strings %- ~(run in post-ids) |= id=@ux (crip (scow:sr %ux id)) - =/ =filter:nsur - =/ kinds (silt ~[6 7]) - =/ tags (malt :~([%e post-strings])) - [~ ~ `kinds `tags ~ ~ ~] - =^ req state (get-req ~[filter]) - :- :~((send req)) state - -++ get-quotes - |= post-id=@ux - ^- (quip card _state) - =/ post-string (crip (scow:sr %ux post-id)) - =/ kinds (silt ~[1]) - =/ tags (malt :~([%q (silt ~[post-string])])) - =/ =filter:nsur [~ ~ `kinds `tags ~ ~ ~] - =^ req state (get-req ~[filter]) - :- :~((send req)) state - - -++ send - |= req=bulk-req:shim:nsur ^- card:agent:gall - =/ req-body (bulk-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)] - =/ pat /shim - [%pass (weld /ws pat) %arvo %k %fard dap.bowl %fetch %noun !>(request)] - -++ 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 - --- -- cgit v1.2.3