urbit/pkg/arvo/app/metadata-hook.hoon

321 lines
7.7 KiB
Plaintext
Raw Normal View History

:: metadata-hook [landscape]:
::
:: allow syncing foreign metadata
2020-02-15 03:31:52 +03:00
::
2020-02-22 03:13:22 +03:00
:: watch paths:
:: /group/%group-path all updates related to this group
::
2020-02-19 04:35:00 +03:00
/- *metadata-store, *metadata-hook
2020-12-02 10:03:05 +03:00
/+ default-agent, dbug, verb, grpl=group, *migrate
~% %metadata-hook-top ..is ~
2020-02-15 03:31:52 +03:00
|%
+$ card card:agent:gall
+$ versioned-state
2020-02-15 03:31:52 +03:00
$% state-zero
2020-07-23 08:02:54 +03:00
state-one
2020-02-15 03:31:52 +03:00
==
::
+$ state-zero
$: %0
2020-02-19 04:35:00 +03:00
synced=(map group-path ship)
2020-02-15 03:31:52 +03:00
==
2020-07-23 08:02:54 +03:00
+$ state-one
$: %1
synced=(map group-path ship)
==
2020-02-15 03:31:52 +03:00
--
2020-07-23 08:02:54 +03:00
=| state-one
2020-02-15 03:31:52 +03:00
=* state -
2020-03-27 03:30:30 +03:00
%- agent:dbug
2020-05-25 08:52:54 +03:00
%+ verb |
2020-02-15 03:31:52 +03:00
^- agent:gall
=<
|_ =bowl:gall
+* this .
2020-02-20 04:56:36 +03:00
hc ~(. +> bowl)
2020-02-15 03:31:52 +03:00
def ~(. (default-agent this %|) bowl)
::
2020-02-19 04:35:00 +03:00
++ on-init
2020-02-20 04:56:36 +03:00
[[%pass /updates %agent [our.bowl %metadata-store] %watch /updates]~ this]
2020-02-15 03:31:52 +03:00
::
2020-02-19 04:35:00 +03:00
++ on-save !>(state)
++ on-load
2020-07-23 08:02:54 +03:00
|= =vase
=/ old
!<(versioned-state vase)
?: ?=(%1 -.old)
`this(state old)
:: groups OTA did not migrate metadata syncs
:: we clear our syncs, and wait for metadata-store
:: to poke us with the syncs
`this
::
2020-02-15 03:31:52 +03:00
++ on-leave on-leave:def
2020-12-01 00:06:41 +03:00
++ on-peek
|= =path
^- (unit (unit cage))
?+ path (on-peek:def path)
[%x %export ~]
``noun+!>(state)
==
::
++ on-arvo
|= [=wire =sign-arvo]
^- (quip card _this)
?. ?=([%try-rejoin @ @ *] wire)
(on-arvo:def wire sign-arvo)
=/ nack-count=@ud (slav %ud i.t.wire)
=/ who=@p (slav %p i.t.t.wire)
=/ pax t.t.t.wire
?> ?=([%b %wake *] sign-arvo)
~? ?=(^ error.sign-arvo)
"behn errored in backoff timers, continuing anyway"
:_ this
[(try-rejoin:hc who pax +(nack-count))]~
::
2020-02-15 03:31:52 +03:00
++ on-fail on-fail:def
2020-12-01 00:06:41 +03:00
::
2020-02-15 03:31:52 +03:00
++ on-poke
|= [=mark =vase]
^- (quip card _this)
2020-02-19 04:35:00 +03:00
?+ mark (on-poke:def mark vase)
%metadata-hook-action
=^ cards state
(poke-hook-action:hc !<(metadata-hook-action vase))
[cards this]
::
%metadata-action
[(poke-action:hc !<(metadata-action vase)) this]
2020-12-01 00:06:41 +03:00
::
%import
?> (team:title our.bowl src.bowl)
=^ cards state
(poke-import:hc q.vase)
[cards this]
2020-05-19 23:53:55 +03:00
==
2020-02-15 03:31:52 +03:00
::
++ on-watch
|= =path
^- (quip card _this)
2020-02-19 04:35:00 +03:00
?+ path (on-watch:def path)
2020-02-20 04:56:36 +03:00
[%group *] [(watch-group:hc t.path) this]
2020-02-19 04:35:00 +03:00
==
2020-02-15 03:31:52 +03:00
::
++ on-agent
|= [=wire =sign:agent:gall]
^- (quip card _this)
?+ -.sign (on-agent:def wire sign)
2020-02-20 04:56:36 +03:00
%kick =^(cards state (kick:hc wire) [cards this])
%watch-ack =^(cards state (watch-ack:hc wire p.sign) [cards this])
2020-02-15 03:31:52 +03:00
%fact
?+ p.cage.sign (on-agent:def wire sign)
%metadata-update
=^ cards state
2020-02-19 04:35:00 +03:00
(fact-metadata-update:hc wire !<(metadata-update q.cage.sign))
2020-02-15 03:31:52 +03:00
[cards this]
==
==
--
::
2020-02-20 04:56:36 +03:00
|_ =bowl:gall
2020-05-25 08:52:54 +03:00
+* grp ~(. grpl bowl)
2020-02-19 04:35:00 +03:00
++ poke-hook-action
|= act=metadata-hook-action
^- (quip card _state)
|^
?- -.act
%add-owned
2020-02-20 04:56:36 +03:00
?> (team:title our.bowl src.bowl)
2020-02-19 04:35:00 +03:00
:- ~
?: (~(has by synced) path.act) state
2020-02-20 04:56:36 +03:00
state(synced (~(put by synced) path.act our.bowl))
2020-02-19 04:35:00 +03:00
::
%add-synced
2020-02-20 04:56:36 +03:00
?> (team:title our.bowl src.bowl)
2020-02-19 04:35:00 +03:00
=/ =path [%group path.act]
?: (~(has by synced) path.act) [~ state]
:_ state(synced (~(put by synced) path.act ship.act))
[%pass path %agent [ship.act %metadata-hook] %watch path]~
::
%remove
=/ ship (~(get by synced) path.act)
?~ ship [~ state]
2020-02-22 03:13:22 +03:00
?: &(!=(u.ship src.bowl) ?!((team:title our.bowl src.bowl)))
2020-02-19 04:35:00 +03:00
[~ state]
:_ state(synced (~(del by synced) path.act))
%- zing
2020-02-20 04:56:36 +03:00
:~ (unsubscribe [%group path.act] u.ship)
2020-02-19 04:35:00 +03:00
[%give %kick ~[[%group path.act]] ~]~
==
==
::
++ unsubscribe
2020-02-20 04:56:36 +03:00
|= [=path =ship]
2020-02-19 04:35:00 +03:00
^- (list card)
2020-02-20 04:56:36 +03:00
?: =(ship our.bowl)
[%pass path %agent [our.bowl %metadata-store] %leave ~]~
[%pass path %agent [ship %metadata-hook] %leave ~]~
2020-02-19 04:35:00 +03:00
--
::
++ poke-action
|= act=metadata-action
^- (list card)
|^
?: (team:title our.bowl src.bowl)
?- -.act
%add (send group-path.act)
%remove (send group-path.act)
==
2020-07-02 05:17:28 +03:00
?> (is-member:grp src.bowl group-path.act)
?- -.act
%add (metadata-poke our.bowl %metadata-store)
%remove (metadata-poke our.bowl %metadata-store)
==
::
++ send
|= =group-path
^- (list card)
=/ =ship
%+ slav %p
(snag 1 group-path)
=/ app ?:(=(ship our.bowl) %metadata-store %metadata-hook)
(metadata-poke ship app)
::
++ metadata-poke
|= [=ship app=@tas]
^- (list card)
[%pass / %agent [ship app] %poke %metadata-action !>(act)]~
::
++ is-managed
|= =path
^- ?
?> ?=(^ path)
!=(i.path '~')
--
::
2020-12-01 00:06:41 +03:00
++ poke-import
|= arc=*
^- (quip card _state)
2020-12-02 10:03:05 +03:00
=/ sty=state-one
[%1 (remake-map ;;((tree [group-path ship]) +.arc))]
2020-12-01 00:06:41 +03:00
:_ sty
%+ murn ~(tap by synced.sty)
|= [=group-path =ship]
?: =(ship our.bowl)
~
=/ =path [%group group-path]
`(try-rejoin ship path 0)
::
++ try-rejoin
|= [who=@p pax=path nack-count=@ud]
^- card
=/ =wire
[%try-rejoin (scot %ud nack-count) (scot %p who) pax]
[%pass wire %agent [who %metadata-hook] %watch pax]
::
2020-02-19 04:35:00 +03:00
++ watch-group
|= =path
^- (list card)
|^
2020-02-22 03:13:22 +03:00
?> =(our.bowl (~(got by synced) path))
2020-07-02 05:17:28 +03:00
?> (is-member:grp src.bowl path)
%+ turn ~(tap by (metadata-scry path))
|= [[=group-path =md-resource] =metadata]
^- card
[%give %fact ~ %metadata-update !>([%add group-path md-resource metadata])]
::
++ metadata-scry
|= pax=^path
^- associations
2020-05-19 23:53:55 +03:00
=. pax
;: weld
/(scot %p our.bowl)/metadata-store/(scot %da now.bowl)/group
pax
/noun
==
.^(associations %gx pax)
--
2020-02-19 04:35:00 +03:00
::
++ fact-metadata-update
|= [wir=wire fact=metadata-update]
^- (quip card _state)
|^
2020-02-20 04:56:36 +03:00
[?:((team:title our.bowl src.bowl) handle-local handle-foreign) state]
2020-02-19 04:35:00 +03:00
::
++ handle-local
?+ -.fact ~
%add
2020-02-20 04:56:36 +03:00
?. (~(has by synced) group-path.fact) ~
(give group-path.fact fact)
2020-02-19 04:35:00 +03:00
::
%update-metadata
2020-02-20 04:56:36 +03:00
?. (~(has by synced) group-path.fact) ~
(give group-path.fact fact)
2020-02-19 04:35:00 +03:00
::
%remove
2020-02-20 04:56:36 +03:00
?. (~(has by synced) group-path.fact) ~
(give group-path.fact fact)
2020-02-19 04:35:00 +03:00
==
::
++ handle-foreign
?+ -.fact ~
%add
2020-02-20 04:56:36 +03:00
?. =(src.bowl (~(got by synced) group-path.fact)) ~
(poke fact)
2020-02-19 04:35:00 +03:00
::
%update-metadata
2020-02-20 04:56:36 +03:00
?. =(src.bowl (~(got by synced) group-path.fact)) ~
(poke [%add +.fact])
2020-02-19 04:35:00 +03:00
::
%remove
2020-02-20 04:56:36 +03:00
?. =(src.bowl (~(got by synced) group-path.fact)) ~
(poke fact)
2020-02-19 04:35:00 +03:00
==
2020-02-20 04:56:36 +03:00
::
++ give
|= [=path upd=metadata-update]
^- (list card)
[%give %fact ~[[%group path]] %metadata-update !>(upd)]~
::
++ poke
|= act=metadata-action
^- (list card)
[%pass / %agent [our.bowl %metadata-store] %poke %metadata-action !>(act)]~
2020-02-19 04:35:00 +03:00
--
::
++ kick
|= wir=wire
^- (quip card _state)
:_ state
2020-12-01 00:06:41 +03:00
|-
?+ wir !!
2020-12-01 00:06:41 +03:00
[%try-rejoin @ @ *]
$(wir t.t.t.wir)
::
[%updates ~]
[%pass /updates %agent [our.bowl %metadata-store] %watch /updates]~
::
[%group @ *]
?. (~(has by synced) t.wir) ~
=/ =ship (~(got by synced) t.wir)
?: =(ship our.bowl)
[%pass wir %agent [our.bowl %metadata-store] %watch wir]~
[%pass wir %agent [ship %metadata-hook] %watch wir]~
==
2020-02-19 04:35:00 +03:00
::
2020-02-15 03:31:52 +03:00
++ watch-ack
|= [wir=wire saw=(unit tang)]
^- (quip card _state)
2020-12-01 00:06:41 +03:00
?: ?=([%try-rejoin @ *] wir)
?~ saw
[~ state]
=/ nack-count=@ud (slav %ud i.t.wir)
=/ wakeup=@da
(add now.bowl (mul ~s1 (bex (min 19 nack-count))))
:_ state
[%pass wir %arvo %b %wait wakeup]~
2020-02-15 03:31:52 +03:00
?> ?=(^ wir)
[~ ?~(saw state state(synced (~(del by synced) t.wir)))]
::
2020-02-15 03:31:52 +03:00
--