obelisk 0.41.0

Deterministic workflow engine
[[activity_exec]]
ffqn = "testing:integration/exec-stream.stream-test"
content = '''#!/usr/bin/env bash
set -exuo pipefail

echo "line1" >&2
sleep 0.1
echo "line2" >&2
'''
env_vars = ["PATH"] # for sleep

[[activity_exec]]
ffqn = "testing:integration/exec-greet.greet-include"
location = "crates/testing/test-programs/exec/greet.sh"
params = [
  { name = "name", type = "string" },
]
return_type = "result<string, string>"
env_vars = ["PATH"] # for jq

[[activity_exec]]
ffqn = "testing:integration/exec-greet.greet-inline"
content = '''
#!/usr/bin/env bash
set -exuo pipefail
raw=$(echo $1 | jq -r .)
echo "\"Hello, $raw!\""
'''
params = [
  { name = "name", type = "string" },
]
return_type = "result<string, string>"
env_vars = ["PATH"] # for jq


# Fan-out workflow to reproduce https://github.com/obeli-sk/obelisk/issues/821:
# submitting many inline exec activities at once makes their spawns race.
[[workflow_js]]
ffqn = "testing:integration/workflow-exec-fanout.exec-fanout"
content = '''
export default function exec_fanout(count) {
    const js = obelisk.createJoinSet();
    for (let i = 0; i < count; i++) {
        js.submit('testing:integration/exec-greet.greet-inline', [`name-${i}`]);
    }
    const results = [];
    for (let i = 0; i < count; i++) {
        results.push(js.joinNext());
    }
    return JSON.stringify(results);
}
'''
params = [
  { name = "count", type = "u32" },
]
return_type = "result<string, string>"

[[activity_exec]]
ffqn = "testing:integration/exec-busy.busy"
content = '''
#!/usr/bin/env bash
i=0
while true; do
    if (( i % 1000000 == 0 )); then
        echo "$i"
    fi
    ((i++))
done
'''
exec.lock_expiry.seconds = 10