A minimalist Sheens implementation in ECMAScript that's executed by Duktape and wrapped in a C library. Yes, that does sound a little odd.
The stripped 32-bit demo executable is 360KB. The supporting ECMAScript code (un-minified) is less than 40KB.
See that Sheens repo for more documentation about these machines.
This repo is licensed under Apache License 2.0.
See machines.h
.
For now, running the demo requires two tools written in Go, so you need Go installed to build this demo. (We'll remove this unncessary dependency soon.)
go get github.com/bronze1man/yaml2json
go get github.com/tdewolff/minify/cmd/minify
make demo
./demo
This demo is a simple process that reads messages from stdin
and
writes output to stdout
.
make specs/turnstile.js specs/double.js sheensio
# Define a "crew" of two machines.
cat<<EOF > crew.json
{"id":"simpsons",
"machines":{
"doubler":{"spec":"specs/double.js","node":"listen","bs":{"count":0}},
"turnstile":{"spec":"specs/turnstile.js","node":"locked","bs":{}}}}
EOF
# Send messages to that crew.
cat<<EOF | ./sheensio -d
{"double":1}
{"double":10}
{"double":100}
{"input":"push"}
{"input":"coin"}
{"input":"coin"}
{"input":"push"}
EOF
The above is in demo.sh
.
This demo shows how to do some primitive Sheens work from Javascript
(demo.js
).
make demo
./demo driver.js demo.js
The driver
executable will execute (mach_eval
) code in files given
on the command line. The environment includes what's in the directory
js
and in the file driver.js
, so you can experiment directly with
those functions. For example, if the file check.js
contains
JSON.stringify(match(null, {"likes":"?x"}, {"likes":"tacos"}, {}));
Then
./driver check.js
should write
[{"?x":"tacos"}]
Per the documentation for mach_eval
, the code that's executed should
return a string.
driver.js
implements optional routing that can present a message
only to machines specified in that message. If a message has a "to"
property, the value should be a string or an array of strings. The
message is then only presented to the machine or machines with those
ids.
For example, {"to":"doubler","double":1}
will only be sent to a
machine with id doubler
(if it exists). The message
{"to":["this","that"],...}
will only be presented to the machines
with ids this
and that
(if they exist). Note that the entire
message (including the "to"
property) is still present to the target
machines.
We take our code of conduct seriously. Please abide by it.
Please read our contributing guide for details on how to contribute to our project.