summaryrefslogtreecommitdiff
path: root/desk/lib/json
diff options
context:
space:
mode:
authorpolwex <polwex@sortug.com>2025-09-11 01:48:14 +0700
committerpolwex <polwex@sortug.com>2025-09-11 01:48:14 +0700
commitb1d68ac307ed87d63e83820cbdf843fff0fd9f7f (patch)
treed6a684a70a80509e68ff667b842aa4e4c091906f /desk/lib/json
init
Diffstat (limited to 'desk/lib/json')
-rw-r--r--desk/lib/json/common.hoon29
-rw-r--r--desk/lib/json/nostr.hoon116
-rw-r--r--desk/lib/json/nostril.hoon113
-rw-r--r--desk/lib/json/trill.hoon191
4 files changed, 449 insertions, 0 deletions
diff --git a/desk/lib/json/common.hoon b/desk/lib/json/common.hoon
new file mode 100644
index 0000000..64d4b03
--- /dev/null
+++ b/desk/lib/json/common.hoon
@@ -0,0 +1,29 @@
+/+ sr=sortug
+|%
+++ en
+=, enjs:format
+ |%
+ ++ cord |= s=@t ^- json s+s
+ ++ hex |= h=@ux ^- json
+ [%s (crip (scow:sr %ux h))]
+ ++ b64 |= h=@uv ^- json
+ [%s (crip (scow:sr %uv h))]
+ ++ ud |= n=@ ^- json
+ [%s (crip (scow:sr %ud n))]
+ ++ patp |= p=@p ^- json
+ [%s (scot %p p)]
+ --
+++ de
+=, dejs-soft:format
+ |%
+ ++ hex |= jon=json ^- (unit @ux)
+ ?. ?=(%s -.jon) ~
+ =/ atom=(unit @) (slaw:sr %ux p.jon)
+ ?~ atom ~
+ atom
+ ++ se |= aur=@tas |= jon=json
+ ?. ?=(%s -.jon) ~
+ (slaw aur p.jon)
+ --
+
+--
diff --git a/desk/lib/json/nostr.hoon b/desk/lib/json/nostr.hoon
new file mode 100644
index 0000000..aa5952a
--- /dev/null
+++ b/desk/lib/json/nostr.hoon
@@ -0,0 +1,116 @@
+/- sur=nostr
+/+ common=json-common, sr=sortug
+|%
+++ en
+=, enjs:format
+ |%
+ :: shim comms
+ ++ req |= =req:shim:sur ^- json
+ %+ frond -.req
+ ?- -.req
+ %get (get +.req)
+ %post (post +.req)
+ ==
+ ++ get |= rs=get:shim:sur
+ :- %a %+ turn rs |= [r=@t fs=(list filter:sur)]
+ %: pairs
+ relay+s+r
+ filters+a+(turn fs filter)
+ ~
+ ==
+ ::
+ ++ post |= p=post:shim:sur
+ %: pairs
+ event+(event event.p)
+ relays+a+(turn relays.p cord:en:common)
+ ~
+ ==
+ ::
+ ++ raw-event |= raw-event:sur
+ :: WTF nostr doesn't want the prefix on the pubkey
+ =/ pubkeyt (scow:sr %ux pubkey)
+ ?~ pubkeyt !!
+ =/ pubkeyj [%s (crip t.pubkeyt)]
+ :- %a :~
+ [%n '0']
+ pubkeyj
+ (numb created-at)
+ (numb kind)
+ a+(turn tags tag)
+ s+content
+ ==
+ ++ event
+ |= e=event:sur ^- json
+ =/ pubkeyt (scow:sr %ux pubkey.e)
+ ?~ pubkeyt !!
+ =/ pubkeyj [%s (crip t.pubkeyt)]
+ %: pairs
+ id+(hex:en:common id.e)
+ :: pubkey+(hex:en:common pubkey.e)
+ pubkey+pubkeyj
+ sig+(hex:en:common sig.e)
+ ['created_at' (numb created-at.e)]
+ kind+(numb kind.e)
+ content+s+content.e
+ tags+a+(turn tags.e tag)
+ ~
+ ==
+ ++ tag
+ |= t=tag:sur ^- json [%a (turn t cord:en:common)]
+ :: :- s+key.t
+ :: :- s+value.t
+ :: (turn rest.t |=(tt=@t s+tt))
+ ::
+ ++ filter
+ |= f=filter:sur ^- json
+ =| l=(list [key=@t jon=json])
+ =. l ?~ ids.f l :_ l ['ids' [%a (turn ids.f hex:en:common)]]
+ =. l ?~ authors.f l :_ l ['authors' [%a (turn authors.f hex:en:common)]]
+ =. l ?~ kinds.f l :_ l ['kinds' [%a (turn kinds.f numb)]]
+ =. l ?~ since.f l :_ l ['since' (numb u.since.f)]
+ =. l ?~ until.f l :_ l ['until' (numb u.until.f)]
+ =. l ?~ limit.f l :_ l ['limit' (numb u.limit.f)]
+ %- pairs l
+ ++ user-meta
+ |= meta=user-meta:sur
+ =/ other %+ turn ~(tap by other.meta) |= [key=@t val=@t]
+ [key %s val]
+ %: pairs
+ name+s+name.meta
+ picture+s+picture.meta
+ about+s+about.meta
+ other
+ ==
+ --
+++ de
+=, dejs-soft:format
+ |%
+ :: shim
+ ++ msg
+ %- ot :~
+ relay+so
+ event+event
+ ==
+ ++ event
+ %- ot :~
+ id+hex:de:common
+ pubkey+hex:de:common
+ ['created_at' ni]
+ kind+ni
+ tags+(ar (ar so))
+ content+so
+ sig+hex:de:common
+ ==
+ ++ user-meta |= jon=json
+ ^- (unit user-meta:sur)
+ =/ all ((om so) jon)
+ ?~ all ~
+ =/ base=(unit [name=@t about=@t picture=@t]) %. jon %- ot :~
+ name+so
+ about+so
+ picture+so
+ ==
+ ?~ base ~
+ `[name.u.base about.u.base picture.u.base u.all]
+ --
+--
diff --git a/desk/lib/json/nostril.hoon b/desk/lib/json/nostril.hoon
new file mode 100644
index 0000000..16792a9
--- /dev/null
+++ b/desk/lib/json/nostril.hoon
@@ -0,0 +1,113 @@
+/- sur=nostril, nsur=nostr, feed=trill-feed
+/+ sr=sortug, common=json-common, trill=json-trill, nostr=json-nostr
+|%
+++ en
+=, enjs:format
+|%
+ :: UI comms
+ ++ state |= state-0:sur ^- json
+ %: pairs
+ relays+(en-relays relays)
+ keys+a+(turn ~(tap in ~(key by keys)) hex:en:common)
+ profiles+(en-profiles profiles)
+ feed+(feed-with-cursor:en:trill feed ~ ~)
+ following+(enfollowing following)
+ ['followGraph' (engraph follow-graph)]
+ ~
+ ==
+ ++ en-relays
+ |= r=(map @t (list event:nsur)) ^- json
+ %- pairs %+ turn ~(tap by r)
+ |= [url=@t events=(list event:nsur)]
+ :- url :- %a %+ turn events event:en:nostr
+ ++ en-profiles |= m=(map @ux user-meta:nsur)
+ %- pairs
+ %+ turn ~(tap by m) |= [key=@ux p=user-meta:nsur]
+ :- (crip (scow:sr %ux key)) (user-meta:en:nostr p)
+
+ ++ enfollowing
+ |= m=(map @ux feed:feed)
+ ^- json
+ %- pairs %+ turn ~(tap by m) |= [key=@ux f=feed:feed]
+ :- (crip (scow:sr %ux key)) (feed:en:trill f)
+
+ ++ engraph
+ |= m=(map @ux (set follow:sur))
+ ^- json
+ %- pairs %+ turn ~(tap by m) |= [key=@ux s=(set follow:sur)]
+ :- (crip (scow:sr %ux key))
+ :- %a %+ turn ~(tap in s) |= f=follow:sur
+ %- pairs
+ :~ pubkey+(hex:en:common pubkey.f)
+ name+s+name.f
+ :- %relay ?~ relay.f ~ s+u.relay.f
+ ==
+
+
+ --
+++ de
+=, dejs-soft:format
+|%
+ :: ui
+++ ui
+ %- of :~
+ fols+ui-fols
+ prof+ui-prof
+ keys+ui-keys
+ post+ui-post
+ rela+ui-relay
+ ==
+++ ui-fols
+ %- of :~
+ add+hex:de:common
+ del+hex:de:common
+ ==
+++ ui-prof
+ %- of :~
+ add+add-prof
+ del+hex:de:common
+ ==
+++ add-prof %- ot :~
+ pubkey+hex:de:common
+ meta+user-meta:de:nostr
+==
+++ ui-keys
+ %- of :~
+ add+ul
+ del+hex:de:common
+ ==
+++ ui-post
+ %- of :~
+ add+de-post
+ rt+de-rt
+ del+hex:de:common
+ ==
+++ de-post
+ %- ot :~
+ pubkey+hex:de:common
+ content+so
+ ==
+++ de-rt
+ %- ot :~
+ id+hex:de:common
+ pubkey+hex:de:common
+ relay+so
+ ==
+++ ui-relay
+ %- of :~
+ send+de-relay
+ ==
+++ de-relay %- ot :~
+ host+(se:de:common %p)
+ id+de-atom-id
+ relays+(ar so)
+ ==
+++ de-atom-id
+ |= jon=json
+ ?. ?=([%s @t] jon) ~
+ (rush p.jon dem)
+
+ --
+
+--
+
diff --git a/desk/lib/json/trill.hoon b/desk/lib/json/trill.hoon
new file mode 100644
index 0000000..efa4ffc
--- /dev/null
+++ b/desk/lib/json/trill.hoon
@@ -0,0 +1,191 @@
+/- feed=trill-feed, post=trill-post
+/+ common=json-common, sr=sortug
+|%
+++ en
+=, enjs:format
+ |%
+ ++ feed-with-cursor
+ |= [f=feed:^feed start=(unit @da) end=(unit @da)] ^- json
+ %: pairs
+ feed+(feed f)
+ start+(cursor start)
+ end+(cursor end)
+ ~
+ ==
+ ++ cursor |= c=(unit @da)
+ ?~ c ~ (time u.c)
+ ++ feed
+ |= f=feed:^feed ^- json
+ %- pairs
+ %+ turn (tap:orm:^feed f)
+ |= [post-id=@da p=post:post]
+ ^- [@ta json]
+ :- (crip (scow:sr %ud `@ud`post-id))
+ (poast p)
+
+ ++ poast
+ |= p=post:post ^- json
+ %- pairs
+ :~ id+(ud:en:common id.p)
+ host+(patp:en:common host.p)
+ author+(patp:en:common author.p)
+ thread+(ud:en:common thread.p)
+ parent+?~(parent.p ~ (ud:en:common u.parent.p))
+ contents+(content contents.p)
+ hash+(b64:en:common hash.p)
+ engagement+(engagement engagement.p)
+ children+a+(turn ~(tap in children.p) ud:en:common)
+ time+(time id.p)
+ ==
+
+ ++ content
+ |= cm=content-map:post ^- json
+ =/ last (pry:corm:post cm)
+ ?~ last ~
+ =/ blocks=content-list:post +.u.last
+ :- %a %+ turn blocks en-block
+ ++ en-block
+ |= b=block:post ^- json
+ %+ frond -.b
+ ?- -.b
+ %paragraph a+(turn p.b inline)
+ %blockquote a+(turn p.b inline)
+ %table a+(turn rows.b table-row)
+ %heading (heading +.b)
+ %list (ilist +.b)
+ %media (media media.b)
+ %codeblock (codespan +.b)
+ %eval s+hoon.b
+ %ref (en-ref +.b)
+ %json (external +.b)
+ %poll ~
+ ==
+ ++ table-row
+ |= l=(list content-list:post)
+ :- %a %+ turn l
+ |= b=content-list:post
+ :- %a %+ turn b en-block
+ ++ heading
+ |= [p=cord q=@]
+ %- pairs
+ :~ text+s+p
+ num+(numb q)
+ ==
+ ++ ilist
+ |= [p=(list inline:post) q=?]
+ %- pairs
+ :~ text+a+(turn p inline)
+ ordered+b+q
+ ==
+ ++ media
+ |= =media:post
+ %+ frond -.media
+ ?- -.media
+ %images a+(turn p.media string)
+ %video s+p.media
+ %audio s+p.media
+ ==
+ ++ string
+ |= c=cord s+c
+ ++ en-ref :: TODO should the backend fetch this shit
+ |= [type=term s=@p p=^path]
+ %- pairs
+ :~ type+s+type
+ ship+(patp:en:common s)
+ path+(path p)
+ ==
+ ++ external
+ |= [p=term q=cord]
+ %- pairs
+ :~ origin+s+p
+ content+s+q
+ ==
+ ++ inline
+ |= i=inline:post ^- json
+ %+ frond -.i
+ ?+ -.i s+p.i
+ %ship (patp:en:common p.i)
+ %link (link +.i)
+ %ruby (ruby +.i)
+ %break ~
+ ==
+ ++ ruby
+ |= [p=@t q=@t]
+ %- pairs
+ :~ text+s+p
+ ruby+s+q
+ ==
+ ++ codespan
+ |= [code=cord lang=cord]
+ %- pairs
+ :~ code+s+code
+ lang+s+lang
+ ==
+ ++ link
+ |= [href=cord show=cord]
+ %- pairs
+ :~ href+s+href
+ show+s+show
+ ==
+
+ ++ engagement
+ |= =engagement:post ^- json
+ %- pairs
+ :~ reacts+(reacts reacts.engagement)
+ quoted+a+(turn ~(tap in quoted.engagement) signed-pid)
+ shared+a+(turn ~(tap in shared.engagement) signed-pid)
+ ==
+ ++ reacts
+ |= rs=(map @p [react:post signature:post])
+ ^- json
+ %- pairs
+ %+ turn ~(val by rs)
+ |= [r=react:post s=signature:post]
+ ^- [@ta json]
+ :- (scot %p q.s)
+ s+r
+ ++ signed-pid
+ |= =signed-pid:post
+ ^- json
+ %- pairs
+ :~ ship+(patp:en:common q.signature.signed-pid)
+ pid+(pid pid.signed-pid)
+ ==
+ ++ time-pid
+ |= [t=@da s=@p =id:post]
+ %- pairs
+ :~ id+(ud:en:common id)
+ ship+(patp:en:common s)
+ time+(time t)
+ ==
+ ++ time-ship
+ |= [t=@da s=@p] ^- json
+ %- pairs
+ :~ ship+(patp:en:common s)
+ time+(time t)
+ ==
+ ++ mention
+ |= [t=@da s=@p p=pid:post] ^- json
+ %- pairs
+ :~ pid+(pid p)
+ ship+(patp:en:common s)
+ time+(time t)
+ ==
+ ++ react
+ |= [t=@da s=@p p=pid:post react=@t] ^- json
+ %- pairs
+ :~ pid+(pid p)
+ ship+(patp:en:common s)
+ react+s+react
+ time+(time t)
+ ==
+ ++ pid
+ |= =pid:post
+ %- pairs
+ :~ ship+(patp:en:common ship.pid)
+ id+(ud:en:common id.pid)
+ ==
+ ::
+ ::
+ --
+--