This documents contains practical examples of a number of Jael's task
s.
General documentation of the task
s demonstrated here can be found in the API Reference document, and details of the data types mentioned can be found in the Data Types document.
%private-keys
Here we'll look at subscribing to private key updates from Jael. We'll use a thread to pass Jael a %private-keys
task
, take the %private-keys
gift
it returns, debug print it to the terminal and finally unsubscribe with a %nuke
task
.
sub-priv.hoon
/- spider/+ strandio=, strand=strand:spider=, card=card:agent:gall^- thread:spider|= arg=vase=/ m (strand ,vase)^- form:m;< ~ bind:m (send-raw-card:strandio %pass /sub-priv %arvo %j %private-keys ~);< res=[=wire =sign-arvo] bind:m take-sign-arvo:strandio?> ?=([%sub-priv ~] wire.res)?> ?=([%jael *] sign-arvo.res)~& +.sign-arvo.res;< ~ bind:m (send-raw-card:strandio %pass /sub-priv %arvo %j %nuke ~)(pure:m !>(~))
Save the above thread in the /ted
directory of your %base
desk and |commit %base
.
Now let's run the thread:
> -sub-priv
You should see the %private-key
gift
it returns in the Dojo:
[ %private-keyslife=1vein{ [ p=1q1.729.646.917.183.337.[...truncated for brevity]]}]
At this point our thread unsubscribes again with a %nuke
task
but without that it would send a new %private-key
gift
each time the private keys were changed.
%public-keys
and %nuke
Here we'll look at both subscribing and unsubscribing to updates of a ship's public keys in Jael. We'll subscribe by sending Jael a %public-keys
task
, take the %public-keys
gift
it responds with, print it to the terminal, scry for the set
of duct
s subscribed to the ship in question, print them to the terminal, and finally send Jael a %nuke
task
to unsubscribe.
Here's a thread that performs these actions:
sub-pub.hoon
/- spider/+ strandio=, strand=strand:spider=, card=card:agent:gall=>|%+$ subs$: yen=(jug duct ship)ney=(jug ship duct)nel=(set duct)==--^- thread:spider|= arg=vase=/ m (strand ,vase)^- form:m=/ =@p (need !<((unit @p) arg)):::: sub to public updates for specified ship=/ c1=card [%pass /sub-pubkeys %arvo %j %public-keys (silt ~[p])];< ~ bind:m (send-raw-card:strandio c1):::: take response from jael & print it;< res=[=wire =sign-arvo] bind:m take-sign-arvo:strandio?> ?=([%sub-pubkeys ~] wire.res)?> ?=([%jael %public-keys *] sign-arvo.res)~& +.sign-arvo.res:::: scry for tracking subs for specified ship in jael & print;< =subs bind:m (scry:strandio ,subs /j/subscriptions/1)=/ ducts=(set duct) (~(get ju ney.subs) p)~& ducts:::: unsub from public updates for specified ships=/ c2=card [%pass /sub-pubkeys %arvo %j %nuke (silt ~[p])];< ~ bind:m (send-raw-card:strandio c2)(pure:m !>(~))
Note this example was performed on a comet as a fake ship won't have the required information in Jael.
Save the above thread in the /ted
directory and |commit %base
. The thread takes a ship
as an argument, so we'll try to subscribe to pubkey updates for ~dopzod
. Let's run the thread:
> -sub-pub ~dopzod
It first passes a %public-keys
task
to Jael that looks like [%public-keys (silt ~[~dopzod])]
in order to subscribe. Jael will immediately respond with a %public-keys
gift
that contains a %full
$public-keys-result. The (map ship point)
contained will (for each ship specified in the task
) include the current pubkeys for the ship's current life as well as previous keys for previous life
s. It thus contains a complete record of keys up to the present for each ship. Our thread will print these out to the terminal like so:
[ %public-keyspublic-keys-result[ %fullpoints{ [ p=~dopzodq[ rift=2life=3keys{ [ p=1q[ crypto-suite=1pass939.529.329.928[...truncated for brevity...]]][ p=2q[ crypto-suite=1pass2.215.774.809.906.200.376.0[...truncated for brevity...]]][ p=3q[ crypto-suite=1pass707.070.568.606.374.[...truncated for brevity...]]]}sponsor=~]]}]]
Along with giving us the current information, Jael will also subscribe us to any future updates for the ships in question. Such updates will come as additional %public-keys
gift
s, but rather than a %full
public-keys-result
, they'll instead contain either a %diff
or %breach
public-keys-result
, depending on what's happened to the ship in question. It's difficult to simulate such events for demonstrative purposes so an example is not included, but you can look at the $public-keys-result to get an idea.
Jael maintains a (jug duct ship)
and its reverse (jug ship duct)
in its state to track subscriptions. If we do a subscriptions scry and filter the result for ~dopzod
, we can see the duct of our thread has now been added to the ~dopzod
set
. Our thread does this, and will output something like:
{~[/gall/use/spider/0w1.vGVi-/~sampel-palnet/thread/~.dojo_0v6.0hlak.dam1b.bcdou.ai7gq.19fi8/sub-pubkeys /dill //term/1]}
At this point our thread will send a %nuke
task
like [%nuke (silt ~[~dopzod])]
to cancel our subscription. Jael doesn't respond to it, but now, with our thread having finished and exited, we can again scry & filter for subscriptions to ~dopzod
:
> =/(a .^([yen=(jug duct ship) ney=(jug ship duct) nel=(set duct)] %j /=subscriptions=/1) (~(get ju ney.a) ~dopzod))~
As you can see the set
is now empty, so we know the %nuke
succeeded and Jael will no longer send us pubkey updates for ~dopzod
. One thing to note about %nuke
is that it must come from the same duct
as the original subscription. You can't unsubscribe another app, ship, thread or what have you, so if we'd tried %nuke
ing the subscription from a separate thread it wouldn't have worked.
%turf
Here we'll look at using a %turf
task
to get Jael's list of domains. Note on a fake ship the list will be empty, so you may with to run it on a comet or moon.
Here's a simple thread that'll pass Jael a %turf
task
, take the %turf
gift
it sends back and print it to the terminal:
turf.hoon
/- spider/+ strandio=, strand=strand:spider^- thread:spider|= arg=vase=/ m (strand ,vase)^- form:m=/ =task:jael [%turf ~]=/ =card:agent:gall [%pass /get-domains %arvo %j task];< ~ bind:m (send-raw-card:strandio card);< resp=[=wire =sign-arvo] bind:m take-sign-arvo:strandio?> ?=([%get-domains ~] wire.resp)?> ?=([%jael %turf *] sign-arvo.resp)~& +.sign-arvo.resp(pure:m !>(~))
Save in in the /ted
directory of your ship and |commit %base
. Next, let's try running it:
> -turf[%turf turf=~[<|org urbit|>]]
As you see, the %turf
gift
contains urbit.org
as ~['org' 'urbit']
.
%step
Here we'll look at changing the web login code with a %step
task.
First, let's see the current step
with a %step
scry:
> .^(@ud %j /=step=/(scot %p our))0
...and the current code with the +code
generator:
> +codelidlut-tabwed-pillex-ridrup
Now, let's pass Jael a %step
task by using |pass
in the dojo:
> |pass [%j %step ~]
Jael will pass
Eyre a %code-changed
task:eyre
to let Eyre know the code's changed so you'll see a message from Eyre in the terminal:
eyre: code-changed: throwing away cookies and sessions
Now let's again scry for the step
and see that it's been incremented:
> .^(@ud %j /=step=/(scot %p our))1
And finally, let's again run +code
and see there's now a new web login code:
> +coderaldev-topnul-mirnut-lablut