Compare commits
5 Commits
Author | SHA1 | Date |
---|---|---|
Tony Garnock-Jones | a1b11c85f5 | |
Emery Hemingway | c88d08bdda | |
Tony Garnock-Jones | 5ba404d99e | |
Tony Garnock-Jones | e691199095 | |
Tony Garnock-Jones | 80ebbe4fd9 |
|
@ -1,7 +1,7 @@
|
|||
# syndicate-sh
|
||||
|
||||
This is an implementation of the Syndicate network protocol (based on
|
||||
[Preserves](https://preserves.gitlab.io/)) for Bash.
|
||||
[Preserves](https://preserves.dev/)) for Bash.
|
||||
|
||||
**Q.** Is this a joke, or is this serious?
|
||||
**A.** Yes.
|
||||
|
|
|
@ -5,10 +5,10 @@ set -euo pipefail
|
|||
. $(dirname "$0")/../lib/syndicate.sh
|
||||
|
||||
demo_ds_resolved() {
|
||||
local oid="$(ds_project "$ds_event" '^ assert . 0 .embedded . 1')"
|
||||
local oid="$(ds_project "$ds_event" '^ A . 0 ^ accepted . 0 .embedded . 1')"
|
||||
if [ -n "$oid" ]
|
||||
then
|
||||
ds_ref="#![1 $oid]"
|
||||
ds_ref="#:[1 $oid]"
|
||||
echo "Dataspace: $ds_ref"
|
||||
|
||||
username="user$$"
|
||||
|
@ -16,13 +16,13 @@ demo_ds_resolved() {
|
|||
declare -A demo_user_presence
|
||||
demo_presence() {
|
||||
case $(ds_project "$ds_event" .^) in
|
||||
assert)
|
||||
A)
|
||||
local h="$(ds_project "$ds_event" '. 1')"
|
||||
local who="$(ds_project "$ds_event" '. 0 . 0')"
|
||||
demo_user_presence[$h]="$who"
|
||||
echo "JOIN: $who"
|
||||
;;
|
||||
retract)
|
||||
R)
|
||||
local h="$(ds_project "$ds_event" '. 0')"
|
||||
local who="${demo_user_presence[$h]}"
|
||||
echo "PART: $who"
|
||||
|
@ -31,14 +31,16 @@ demo_ds_resolved() {
|
|||
esac
|
||||
}
|
||||
ds_object presence demo_presence
|
||||
ds_assert "$ds_ref" "<Observe <compound <rec Present 1> {0: <bind <_>>}> $presence>"
|
||||
ds_assert "$ds_ref" "<Observe <rec Present [<bind <_>>]> $presence>"
|
||||
ds_assert "$ds_ref" "<Present \"$username\">"
|
||||
|
||||
demo_utterance() {
|
||||
ds_project "$ds_event" '^ message . 0'
|
||||
local who="$(ds_project "$ds_event" '^ M . 0 . 0')"
|
||||
local what="$(ds_project "$ds_event" '^ M . 0 . 1')"
|
||||
echo "$who: $what"
|
||||
}
|
||||
ds_object utterance demo_utterance
|
||||
ds_assert "$ds_ref" "<Observe <compound <rec Says 2> {0: <bind <_>> 1: <bind <_>>}> $utterance>"
|
||||
ds_assert "$ds_ref" "<Observe <rec Says [<bind <_>> <bind <_>>]> $utterance>"
|
||||
|
||||
ds_flush
|
||||
ds_mainloop </dev/null &
|
||||
|
@ -56,4 +58,4 @@ demo_ds_resolved() {
|
|||
ds_object bootk demo_ds_resolved
|
||||
ds_connect \
|
||||
'<unix "./sock">' \
|
||||
'ds_assert "#![1 0]" "<resolve <ref \"syndicate\" [] #x\"a6480df5306611ddd0d3882b546e1977\"> $bootk>"'
|
||||
'ds_assert "#:[1 0]" "<resolve <ref {oid: \"syndicate\" sig: #x\"69ca300c1dbfa08fba692102dd82311a\"}> $bootk>"'
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
#!/bin/bash
|
||||
|
||||
. $(dirname "$0")/../lib/syndicate.sh
|
||||
|
||||
service() {
|
||||
echo $ds_event
|
||||
case $(ds_project "$ds_event" ".^") in
|
||||
retract)
|
||||
echo 'Bye!'
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
ds_object service_entry service
|
||||
echo 'Running' >&2
|
||||
ds_connect '<stdio>'
|
|
@ -153,7 +153,7 @@ ds_flush() {
|
|||
ds_assert() {
|
||||
local h="$ds_handle"
|
||||
ds_handle=$(($ds_handle + 1))
|
||||
ds_action "$1" "<assert $2 $h>"
|
||||
ds_action "$1" "<A $2 $h>"
|
||||
if [ -n "${3:-}" ]
|
||||
then
|
||||
ds_handle_oids[$3]="$1"
|
||||
|
@ -167,7 +167,7 @@ ds_assert() {
|
|||
# `ds_assert`.
|
||||
#
|
||||
ds_retract() {
|
||||
ds_action "${ds_handle_oids[$1]}" "<retract ${ds_handles[$1]}>"
|
||||
ds_action "${ds_handle_oids[$1]}" "<R ${ds_handles[$1]}>"
|
||||
}
|
||||
|
||||
# ds_message <wireref> <term>
|
||||
|
@ -175,7 +175,7 @@ ds_retract() {
|
|||
# Sends `term` to `wireref`.
|
||||
#
|
||||
ds_message() {
|
||||
ds_action "$1" "<message $2>"
|
||||
ds_action "$1" "<M $2>"
|
||||
}
|
||||
|
||||
# ds_object <varname> <code>
|
||||
|
@ -188,5 +188,5 @@ ds_object() {
|
|||
local oid="$ds_handle"
|
||||
ds_handle=$(($ds_handle + 1))
|
||||
ds_object_map[$oid]="$2"
|
||||
printf -v $1 '%s' "#![0,$oid]"
|
||||
printf -v $1 '%s' "#:[0,$oid]"
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue