Syndicate API update

This commit is contained in:
Emery Hemingway 2024-04-05 14:18:47 +01:00
parent 242bda24e5
commit c9b38dd86e
18 changed files with 429 additions and 218 deletions

309
lock.json
View File

@ -6,12 +6,55 @@
"bigints" "bigints"
], ],
"path": "/nix/store/jvrm392g8adfsgf36prgwkbyd7vh5jsw-source", "path": "/nix/store/jvrm392g8adfsgf36prgwkbyd7vh5jsw-source",
"ref": "20231006",
"rev": "86ea14d31eea9275e1408ca34e6bfe9c99989a96", "rev": "86ea14d31eea9275e1408ca34e6bfe9c99989a96",
"sha256": "15pcpmnk1bnw3k8769rjzcpg00nahyrypwbxs88jnwr4aczp99j4", "sha256": "15pcpmnk1bnw3k8769rjzcpg00nahyrypwbxs88jnwr4aczp99j4",
"srcDir": "src", "srcDir": "src",
"url": "https://github.com/ehmry/nim-bigints/archive/86ea14d31eea9275e1408ca34e6bfe9c99989a96.tar.gz" "url": "https://github.com/ehmry/nim-bigints/archive/86ea14d31eea9275e1408ca34e6bfe9c99989a96.tar.gz"
}, },
{
"method": "fetchzip",
"packages": [
"cps"
],
"path": "/nix/store/8gbhwni0akqskdb3qhn5nfgv6gkdz0vz-source",
"rev": "c90530ac57f98a842b7be969115c6ef08bdcc564",
"sha256": "0h8ghs2fqg68j3jdcg7grnxssmllmgg99kym2w0a3vlwca1zvr62",
"srcDir": "",
"url": "https://github.com/ehmry/cps/archive/c90530ac57f98a842b7be969115c6ef08bdcc564.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"cps"
],
"path": "/nix/store/8gbhwni0akqskdb3qhn5nfgv6gkdz0vz-source",
"rev": "c90530ac57f98a842b7be969115c6ef08bdcc564",
"sha256": "0h8ghs2fqg68j3jdcg7grnxssmllmgg99kym2w0a3vlwca1zvr62",
"srcDir": "",
"url": "https://github.com/ehmry/cps/archive/c90530ac57f98a842b7be969115c6ef08bdcc564.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"getdns"
],
"path": "/nix/store/x9xmn7w4k6jg8nv5bnx148ibhnsfh362-source",
"rev": "c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6",
"sha256": "1sbgx2x51szr22i72n7c8jglnfmr8m7y7ga0v85d58fwadiv7g6b",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"getdns"
],
"path": "/nix/store/x9xmn7w4k6jg8nv5bnx148ibhnsfh362-source",
"rev": "c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6",
"sha256": "1sbgx2x51szr22i72n7c8jglnfmr8m7y7ga0v85d58fwadiv7g6b",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.tar.gz"
},
{ {
"method": "fetchzip", "method": "fetchzip",
"packages": [ "packages": [
@ -23,77 +66,237 @@
"srcDir": "", "srcDir": "",
"url": "https://github.com/ehmry/hashlib/archive/f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac.tar.gz" "url": "https://github.com/ehmry/hashlib/archive/f9455d4be988e14e3dc7933eb7cc7d7c4820b7ac.tar.gz"
}, },
{
"method": "fetchzip",
"packages": [
"illwill"
],
"path": "/nix/store/3lmm3z36qn4gz7bfa209zv0pqrpm3di9-source",
"ref": "v0.3.2",
"rev": "1d12cb36ab7b76c31d2d25fa421013ecb382e625",
"sha256": "0f9yncl5gbdja18mrqf5ixrdgrh95k0khda923dm1jd1x1b7ar8z",
"srcDir": "",
"url": "https://github.com/johnnovak/illwill/archive/1d12cb36ab7b76c31d2d25fa421013ecb382e625.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"nimcrypto"
],
"path": "/nix/store/zyr8zwh7vaiycn1s4r8cxwc71f2k5l0h-source",
"ref": "traditional-api",
"rev": "602c5d20c69c76137201b5d41f788f72afb95aa8",
"sha256": "1dmdmgb6b9m5f8dyxk781nnd61dsk3hdxqks7idk9ncnpj9fng65",
"srcDir": "",
"url": "https://github.com/cheatfate/nimcrypto/archive/602c5d20c69c76137201b5d41f788f72afb95aa8.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"npeg"
],
"path": "/nix/store/ffkxmjmigfs7zhhiiqm0iw2c34smyciy-source",
"ref": "1.2.1",
"rev": "26d62fdc40feb84c6533956dc11d5ee9ea9b6c09",
"sha256": "0xpzifjkfp49w76qmaylan8q181bs45anmp46l4bwr3lkrr7bpwh",
"srcDir": "src",
"url": "https://github.com/zevv/npeg/archive/26d62fdc40feb84c6533956dc11d5ee9ea9b6c09.tar.gz"
},
{ {
"method": "fetchzip", "method": "fetchzip",
"packages": [ "packages": [
"preserves" "preserves"
], ],
"path": "/nix/store/6nnn5di5vip1vladlb7z56rbw18d1y7j-source", "path": "/nix/store/2hy124xgabz134dxj3wji7mp47fdwy3w-source",
"ref": "20240208", "rev": "9ae435a83c6d5028405538af5d24a023af625b6e",
"rev": "2825bceecf33a15b9b7942db5331a32cbc39b281", "sha256": "1k7ywcp1a53x2fpc6wc2b0qzb264dkifash0s1wcp66rw3lx15k2",
"sha256": "145vf46fy3wc52j6vs509fm9bi5lx7c53gskbkpcfbkv82l86dgk",
"srcDir": "src", "srcDir": "src",
"url": "https://git.syndicate-lang.org/ehmry/preserves-nim/archive/2825bceecf33a15b9b7942db5331a32cbc39b281.tar.gz" "url": "https://git.syndicate-lang.org/ehmry/preserves-nim/archive/9ae435a83c6d5028405538af5d24a023af625b6e.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"stew"
],
"path": "/nix/store/mqg8qzsbcc8xqabq2yzvlhvcyqypk72c-source",
"rev": "3c91b8694e15137a81ec7db37c6c58194ec94a6a",
"sha256": "17lfhfxp5nxvld78xa83p258y80ks5jb4n53152cdr57xk86y07w",
"srcDir": "",
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
}, },
{ {
"method": "fetchzip", "method": "fetchzip",
"packages": [ "packages": [
"syndicate" "syndicate"
], ],
"path": "/nix/store/y9f3j4m7vmhf8gbpkvqa77jvzrc5ynlm-source", "path": "/nix/store/kl628g7vg2ww8wilf8h2ag7qqnvvwdzb-source",
"ref": "20240208", "rev": "c2e1e2e0fa403529750196ce3ccb5a99a4d6c006",
"rev": "50a77995bcfe15e6062f54c6af0f55fba850c329", "sha256": "1r8ab79pgrrnzmp49h8rp50c9x8zd0p7bsvzxaphc221nvyfx09j",
"sha256": "1avrk86c34qg39w8vlixsksli2gwgbsf29jhlap27ffzdbj2zbal",
"srcDir": "src", "srcDir": "src",
"url": "https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/50a77995bcfe15e6062f54c6af0f55fba850c329.tar.gz" "url": "https://git.syndicate-lang.org/ehmry/syndicate-nim/archive/c2e1e2e0fa403529750196ce3ccb5a99a4d6c006.tar.gz"
}, },
{ {
"method": "fetchzip", "method": "fetchzip",
"packages": [ "packages": [
"ws" "sys"
], ],
"path": "/nix/store/zd51j4dphs6h1hyhdbzdv840c8813ai8-source", "path": "/nix/store/syhxsjlsdqfap0hk4qp3s6kayk8cqknd-source",
"ref": "0.5.0", "rev": "4ef3b624db86e331ba334e705c1aa235d55b05e1",
"rev": "9536bf99ddf5948db221ccb7bb3663aa238a8e21", "sha256": "1q4qgw4an4mmmcbx48l6xk1jig1vc8p9cq9dbx39kpnb0890j32q",
"sha256": "0j8z9jlvzb1h60v7rryvh2wx6vg99lra6i62whf3fknc53l641fz",
"srcDir": "src", "srcDir": "src",
"url": "https://github.com/treeform/ws/archive/9536bf99ddf5948db221ccb7bb3663aa238a8e21.tar.gz" "url": "https://github.com/ehmry/nim-sys/archive/4ef3b624db86e331ba334e705c1aa235d55b05e1.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"sys"
],
"path": "/nix/store/syhxsjlsdqfap0hk4qp3s6kayk8cqknd-source",
"rev": "4ef3b624db86e331ba334e705c1aa235d55b05e1",
"sha256": "1q4qgw4an4mmmcbx48l6xk1jig1vc8p9cq9dbx39kpnb0890j32q",
"srcDir": "src",
"url": "https://github.com/ehmry/nim-sys/archive/4ef3b624db86e331ba334e705c1aa235d55b05e1.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"sys"
],
"path": "/nix/store/vf9ls2wip6d8xhsi3rjh0dqsqg597i6b-source",
"rev": "c117ee60542f084525f254e6ade590675a6a2ed6",
"sha256": "12qzx2lnh84xqfgypy0pka8nflq0y8n1izfwx8mb4zya5nzawmyf",
"srcDir": "src",
"url": "https://github.com/alaviss/nim-sys/archive/c117ee60542f084525f254e6ade590675a6a2ed6.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"taps"
],
"path": "/nix/store/6y14ia52kr7jyaa0izx37mlablmq9s65-source",
"rev": "8c8572cd971d1283e6621006b310993c632da247",
"sha256": "1dp166bv9x773jmfqppg5i3v3rilgff013vb11yzwcid9l7s3iy8",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/nim_taps/archive/8c8572cd971d1283e6621006b310993c632da247.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"taps"
],
"path": "/nix/store/6y14ia52kr7jyaa0izx37mlablmq9s65-source",
"rev": "8c8572cd971d1283e6621006b310993c632da247",
"sha256": "1dp166bv9x773jmfqppg5i3v3rilgff013vb11yzwcid9l7s3iy8",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/nim_taps/archive/8c8572cd971d1283e6621006b310993c632da247.tar.gz"
},
{
"date": "2024-04-02T15:38:57+01:00",
"deepClone": false,
"fetchLFS": false,
"fetchSubmodules": true,
"hash": "sha256-iZb9aAgYr4FGkqfIg49QWiCqeizIi047kFhugHiP8o0=",
"leaveDotGit": false,
"method": "git",
"packages": [
"solo5_dispatcher"
],
"path": "/nix/store/sf5dgj2ljvahcm6my7d61ibda51vnrii-solo5_dispatcher",
"rev": "a7a894a96a2221284012800e6fd32923d83d20bd",
"sha256": "13gjixw80vjqj0xlx2y85ixal82sa27q7j57j9383bqq11lgv5l9",
"srcDir": "pkg",
"url": "https://git.sr.ht/~ehmry/solo5_dispatcher"
},
{
"method": "fetchzip",
"packages": [
"getdns"
],
"path": "/nix/store/x9xmn7w4k6jg8nv5bnx148ibhnsfh362-source",
"rev": "c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6",
"sha256": "1sbgx2x51szr22i72n7c8jglnfmr8m7y7ga0v85d58fwadiv7g6b",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"getdns"
],
"path": "/nix/store/x9xmn7w4k6jg8nv5bnx148ibhnsfh362-source",
"rev": "c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6",
"sha256": "1sbgx2x51szr22i72n7c8jglnfmr8m7y7ga0v85d58fwadiv7g6b",
"srcDir": "src",
"url": "https://git.sr.ht/~ehmry/getdns-nim/archive/c73cbe288d9f9480586b8fa87f6d794ffb6a6ce6.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"nimcrypto"
],
"path": "/nix/store/fkrcpp8lzj2yi21na79xm63xk0ggnqsp-source",
"rev": "f147d30c69bc1c9bcf0e37f7699bcf0fbaab97b5",
"sha256": "1h3dzdbc9kacwpi10mj73yjglvn7kbizj1x8qc9099ax091cj5xn",
"srcDir": "",
"url": "https://github.com/cheatfate/nimcrypto/archive/f147d30c69bc1c9bcf0e37f7699bcf0fbaab97b5.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"npeg"
],
"path": "/nix/store/xpn694ibgipj8xak3j4bky6b3k0vp7hh-source",
"rev": "ec0cc6e64ea4c62d2aa382b176a4838474238f8d",
"sha256": "1fi9ls3xl20bmv1ikillxywl96i9al6zmmxrbffx448gbrxs86kg",
"srcDir": "src",
"url": "https://github.com/zevv/npeg/archive/ec0cc6e64ea4c62d2aa382b176a4838474238f8d.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"stew"
],
"path": "/nix/store/mqg8qzsbcc8xqabq2yzvlhvcyqypk72c-source",
"rev": "3c91b8694e15137a81ec7db37c6c58194ec94a6a",
"sha256": "17lfhfxp5nxvld78xa83p258y80ks5jb4n53152cdr57xk86y07w",
"srcDir": "",
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"sys"
],
"path": "/nix/store/vf9ls2wip6d8xhsi3rjh0dqsqg597i6b-source",
"rev": "c117ee60542f084525f254e6ade590675a6a2ed6",
"sha256": "12qzx2lnh84xqfgypy0pka8nflq0y8n1izfwx8mb4zya5nzawmyf",
"srcDir": "src",
"url": "https://github.com/alaviss/nim-sys/archive/c117ee60542f084525f254e6ade590675a6a2ed6.tar.gz"
},
{
"date": "2024-04-02T15:38:57+01:00",
"deepClone": false,
"fetchLFS": false,
"fetchSubmodules": true,
"hash": "sha256-iZb9aAgYr4FGkqfIg49QWiCqeizIi047kFhugHiP8o0=",
"leaveDotGit": false,
"method": "git",
"packages": [
"solo5_dispatcher"
],
"path": "/nix/store/sf5dgj2ljvahcm6my7d61ibda51vnrii-solo5_dispatcher",
"rev": "a7a894a96a2221284012800e6fd32923d83d20bd",
"sha256": "13gjixw80vjqj0xlx2y85ixal82sa27q7j57j9383bqq11lgv5l9",
"srcDir": "pkg",
"url": "https://git.sr.ht/~ehmry/solo5_dispatcher"
},
{
"method": "fetchzip",
"packages": [
"cps"
],
"path": "/nix/store/phdf6siqbhj7vx4qq507lzla81si60iz-source",
"rev": "58772ff9ddb38a4b2ec52da142d8532ba2fe7039",
"sha256": "1lph7v27nqwgm3a0ssi8q348gjrkjwgqc50agw38j7xif6wj80cw",
"srcDir": "",
"url": "https://github.com/ehmry/cps/archive/58772ff9ddb38a4b2ec52da142d8532ba2fe7039.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"cps"
],
"path": "/nix/store/phdf6siqbhj7vx4qq507lzla81si60iz-source",
"rev": "58772ff9ddb38a4b2ec52da142d8532ba2fe7039",
"sha256": "1lph7v27nqwgm3a0ssi8q348gjrkjwgqc50agw38j7xif6wj80cw",
"srcDir": "",
"url": "https://github.com/ehmry/cps/archive/58772ff9ddb38a4b2ec52da142d8532ba2fe7039.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"stew"
],
"path": "/nix/store/mqg8qzsbcc8xqabq2yzvlhvcyqypk72c-source",
"rev": "3c91b8694e15137a81ec7db37c6c58194ec94a6a",
"sha256": "17lfhfxp5nxvld78xa83p258y80ks5jb4n53152cdr57xk86y07w",
"srcDir": "",
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
},
{
"method": "fetchzip",
"packages": [
"stew"
],
"path": "/nix/store/mqg8qzsbcc8xqabq2yzvlhvcyqypk72c-source",
"rev": "3c91b8694e15137a81ec7db37c6c58194ec94a6a",
"sha256": "17lfhfxp5nxvld78xa83p258y80ks5jb4n53152cdr57xk86y07w",
"srcDir": "",
"url": "https://github.com/status-im/nim-stew/archive/3c91b8694e15137a81ec7db37c6c58194ec94a6a.tar.gz"
} }
] ]
} }

View File

@ -1,4 +1,4 @@
include_rules include_rules
: foreach *.nim | $(SYNDICATE_PROTOCOL) ./<schema> ./syndesizer/<checks> |> !nim_bin |> {bin} : foreach *.nim | $(SYNDICATE_PROTOCOL) ./<schema> |> !nim_bin |> {bin}
: foreach {bin} |> !assert_built |> : foreach {bin} |> !assert_built |>
: $(BIN_DIR)/msg |> cp %f %o |> $(BIN_DIR)/beep : $(BIN_DIR)/msg |> cp %f %o |> $(BIN_DIR)/beep

View File

@ -8,7 +8,7 @@ when not defined(linux):
import std/oserrors import std/oserrors
import preserves import preserves
import syndicate, syndicate/relays import syndicate
import ./schema/mountpoints import ./schema/mountpoints
type BootArgs {.preservesDictionary.} = object type BootArgs {.preservesDictionary.} = object
@ -20,25 +20,31 @@ proc mount(source, target, fsType: cstring; flags: culong; data: pointer): cint
proc umount(target: cstring): cint {.importc, header: "<sys/mount.h>".} proc umount(target: cstring): cint {.importc, header: "<sys/mount.h>".}
## `umount(2)` ## `umount(2)`
runActor("mount_actor") do (turn: var Turn; root: Cap): proc spawnMountActor*(turn: var Turn; ds: Cap): Actor {.discardable.} =
let spawnActor(turn, "mount_actor") do (turn: var Turn):
targetPat = ?Observe(pattern: !Mountpoint) ?? { 1: grabLit() } let
sourcePat = ?Observe(pattern: !Mountpoint) ?? { 0: grabLit(), 2: grabLit() } targetPat = ?Observe(pattern: !Mountpoint) ?? { 1: grabLit() }
connectStdio(turn, root) sourcePat = ?Observe(pattern: !Mountpoint) ?? { 0: grabLit(), 2: grabLit() }
during(turn, root, ?:BootArgs) do (ds: Cap): during(turn, ds, ?:BootArgs) do (ds: Cap):
during(turn, ds, targetPat) do (target: string): during(turn, ds, targetPat) do (target: string):
during(turn, ds, sourcePat) do (source: string, fsType: string): during(turn, ds, sourcePat) do (source: string, fsType: string):
var mountpoint = Mountpoint( var mountpoint = Mountpoint(
source: source, source: source,
target: target, target: target,
`type`: fsType, `type`: fsType,
) )
var rc = mount(source, target, fsType, 0, nil) var rc = mount(source, target, fsType, 0, nil)
if rc == 0: if rc == 0:
mountpoint.status = Status(orKind: StatusKind.success) mountpoint.status = Status(orKind: StatusKind.success)
else: else:
mountpoint.status = Status(orKind: StatusKind.Failure) mountpoint.status = Status(orKind: StatusKind.Failure)
mountpoint.status.failure.msg = osErrorMsg(osLastError()) mountpoint.status.failure.msg = osErrorMsg(osLastError())
discard publish(turn, ds, mountpoint) discard publish(turn, ds, mountpoint)
do: do:
discard umount(target) discard umount(target)
when isMainModule:
import syndicate/relays
runActor("main") do (turn: var Turn):
resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard spawnMountActor(turn, ds)

View File

@ -1,20 +1,13 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import std/[asyncdispatch, sequtils, os] import std/[sequtils, os]
import preserves, syndicate, syndicate/relays import preserves, syndicate, syndicate/relays
proc main = runActor("msg") do (turn: var Turn):
let var data = map(commandLineParams(), parsePreserves)
route = envRoute() resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
data = map(commandLineParams(), parsePreserves) for e in data:
message(turn, ds, e)
discard bootDataspace("msg") do (turn: var Turn; root: Cap): sync(turn, ds) do (turn: var Turn):
spawnRelays(turn, root) stopActor(turn)
resolve(turn, root, route) do (turn: var Turn; ds: Cap):
for e in data:
message(turn, ds, e)
for _ in 1..2: poll()
main()

View File

@ -3,40 +3,29 @@
## See the rofi-script(5) manpage for documentation. ## See the rofi-script(5) manpage for documentation.
import std/[asyncdispatch, cmdline, envvars, strutils, tables] import std/[cmdline, envvars, strutils, tables]
import preserves, syndicate, syndicate/relays import preserves, syndicate, syndicate/relays
import ./schema/rofi import ./schema/rofi
proc main = if getEnv("ROFI_OUTSIDE") == "":
let quit("run this program in rofi")
route = envRoute()
rofiPid = getEnv("ROFI_OUTSIDE")
if rofiPid == "":
quit("run this program in rofi")
runActor("rofi_script_actor") do (turn: var Turn; root: Cap): runActor("rofi_script_actor") do (turn: var Turn):
let rootFacet = turn.facet resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
resolve(turn, root, route) do (turn: var Turn; ds: Cap): case paramCount()
case paramCount() of 0:
of 0: let pat = ?:Options
let pat = ?:Options onPublish(turn, ds, pat) do (options: seq[string]):
onPublish(turn, ds, pat) do (options: seq[string]): stdout.writeLine options.join("\n")
stdout.writeLine options.join("\n") quit()
quit()
of 1: of 1:
var select = Select(option: commandLineParams()[0]) var select = Select(option: commandLineParams()[0])
for (key, val) in envPairs(): for (key, val) in envPairs():
if key.startsWith "ROFI_": if key.startsWith "ROFI_":
select.environment[Symbol key] = val select.environment[Symbol key] = val
message(turn, ds, select) message(turn, ds, select)
# TODO: sync not implemented correctly sync(turn, ds, stopActor)
# sync(turn, ds, stopActor)
callSoon do ():
waitFor sleepAsync(1)
quit()
else: else:
quit("rofi passed an unexpected number of arguments") quit("rofi passed an unexpected number of arguments")
main()

View File

@ -3,7 +3,7 @@
## Syndicate multitool. ## Syndicate multitool.
import syndicate, syndicate/relays, syndicate/actors/timers import syndicate, syndicate/relays, syndicate/drivers/timers
const const
withPostgre* {.booldefine.}: bool = true withPostgre* {.booldefine.}: bool = true
@ -24,17 +24,17 @@ when withPostgre:
when withSqlite: when withSqlite:
import ./syndesizer/sqlite_actor import ./syndesizer/sqlite_actor
runActor("syndesizer") do (turn: var Turn; root: Cap): runActor("syndesizer") do (turn: var Turn):
connectStdio(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard spawnTimers(turn, root) discard spawnTimerDriver(turn, ds)
discard spawnCacheActor(turn, root) discard spawnCacheActor(turn, ds)
discard spawnFileSystemUsageActor(turn, root) discard spawnFileSystemUsageActor(turn, ds)
discard spawnJsonSocketTranslator(turn, root) discard spawnJsonSocketTranslator(turn, ds)
discard spawnJsonStdioTranslator(turn, root) discard spawnJsonStdioTranslator(turn, ds)
discard spawnPulseActor(turn, root) discard spawnPulseActor(turn, ds)
discard spawnXmlTranslator(turn, root) discard spawnXmlTranslator(turn, ds)
discard spawnXsltActor(turn, root) discard spawnXsltActor(turn, ds)
when withPostgre: when withPostgre:
discard spawnPostgreActor(turn, root) discard spawnPostgreActor(turn, ds)
when withSqlite: when withSqlite:
discard spawnSqliteActor(turn, root) discard spawnSqliteActor(turn, ds)

View File

@ -1,2 +1,3 @@
include_rules include_rules
: foreach *.nim | $(SYNDICATE_PROTOCOL) ../<schema> |> !nim_check |> | ./<checks> : foreach *.nim | $(SYNDICATE_PROTOCOL) ../<schema> |> !nim_bin |> {bin}
: foreach {bin} |> !assert_built |>

View File

@ -3,8 +3,8 @@
import std/times import std/times
import preserves, syndicate, import preserves, syndicate,
syndicate/[durings, relays], syndicate/durings,
syndicate/actors/timers syndicate/drivers/timers
import ../schema/config import ../schema/config
@ -35,7 +35,7 @@ proc isObserve(pat: Pattern): bool =
pat.dcompound.rec.label.isSymbol"Observe" pat.dcompound.rec.label.isSymbol"Observe"
proc spawnCacheActor*(turn: var Turn; root: Cap): Actor = proc spawnCacheActor*(turn: var Turn; root: Cap): Actor =
spawn("cache_actor", turn) do (turn: var Turn): spawnActor(turn, "cache_actor") do (turn: var Turn):
during(turn, root, ?:CacheArguments) do (ds: Cap, lifetime: float64): during(turn, root, ?:CacheArguments) do (ds: Cap, lifetime: float64):
onPublish(turn, ds, ?:Observe) do (pat: Pattern, obs: Cap): onPublish(turn, ds, ?:Observe) do (pat: Pattern, obs: Cap):
var cache: CacheEntity var cache: CacheEntity
@ -51,7 +51,8 @@ proc spawnCacheActor*(turn: var Turn; root: Cap): Actor =
discard observe(turn, ds, pat, cache) discard observe(turn, ds, pat, cache)
when isMainModule: when isMainModule:
runActor("cache_actor") do (turn: var Turn; root: Cap): import syndicate/relays
spawnTimers(turn, root) runActor("main") do (turn: var Turn):
connectStdio(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard spawnCacheActor(turn, root) discard spawnTimerDriver(turn, ds)
discard spawnCacheActor(turn, ds)

View File

@ -3,7 +3,7 @@
import std/[dirs, os, paths] import std/[dirs, os, paths]
import preserves import preserves
import syndicate, syndicate/relays import syndicate
import ../schema/[assertions, config] import ../schema/[assertions, config]
@ -22,6 +22,7 @@ proc spawnFileSystemUsageActor*(turn: var Turn; root: Cap): Actor {.discardable.
# TODO: updates? # TODO: updates?
when isMainModule: when isMainModule:
runActor("main") do (turn: var Turn; root: Cap): import syndicate/relays
connectStdio(turn, root) runActor("main") do (turn: var Turn):
discard spawnFileSystemUsageActor(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard spawnFileSystemUsageActor(turn, ds)

View File

@ -1,39 +1,60 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import std/[asyncdispatch, asyncnet, json] import std/[json, options]
from std/nativesockets import AF_UNIX, SOCK_STREAM, Protocol import pkg/sys/[ioqueue, sockets]
import preserves, preserves/jsonhooks, syndicate, syndicate/relays import preserves, preserves/jsonhooks, syndicate
import ../schema/config, ../json_messages import ../schema/config, ../json_messages
proc spawnJsonSocketTranslator*(turn: var Turn; root: Cap): Actor = proc translateSocket(facet: Facet; ds: Cap; path: string) {.asyncio.} =
spawn("json-socket-translator", turn) do (turn: var Turn): var
socket = new AsyncConn[Protocol.Unix]
conn = connectUnixAsync(path)
guard = initGuard(facet)
dec = newBufferedDecoder(0)
buf = new string #TODO: get a pointer into the decoder
alive = true
proc kill(turn: var Turn) =
alive = false
proc setup(turn: var Turn) =
# Closure, not CPS.
onMessage(turn, ds, ?:SendJson) do (data: JsonNode):
if alive:
discard trampoline:
whelp write(socket[], $data & "\n")
else:
stderr.writeLine "dropped send of ", data
discard publish(turn, ds, initRecord("connected", path.toPreserves))
onStop(facet, kill)
run(facet, setup)
while alive:
# TODO: parse buffer
buf[].setLen(0x4000)
let n = read(socket[], buf)
if n < 1:
stderr.writeLine "socket read returned ", n
else:
buf[].setLen(n)
dec.feed(buf[])
var data = dec.parse()
if data.isSome:
proc send(turn: var Turn) =
# Closure, not CPS.
message(turn, ds, initRecord("recv", data.get))
run(facet, send)
stderr.writeLine "close socket ", path
close(socket[])
proc spawnJsonSocketTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawnActor(turn, "json-socket-translator") do (turn: var Turn):
during(turn, root, ?:JsonSocketTranslatorArguments) do (ds: Cap, socketPath: string): during(turn, root, ?:JsonSocketTranslatorArguments) do (ds: Cap, socketPath: string):
let socket = newAsyncSocket( linkActor(turn, "json-socket-translator") do (turn: var Turn):
domain = AF_UNIX, discard trampoline:
sockType = SOCK_STREAM, whelp translateSocket(turn.facet, ds, socketPath)
protocol = cast[Protocol](0),
buffered = false,
)
addCallback(connectUnix(socket, socketPath), turn) do (turn: var Turn):
let a = JsonTranslatorConnected(path: socketPath)
discard publish(turn, ds, a)
let socketFacet = turn.facet
proc processOutput(fut: Future[string]) {.gcsafe.} =
run(socketFacet) do (turn: var Turn):
var data = fut.read.parseJson
message(turn, ds, RecvJson(data: data))
socket.recvLine.addCallback(processOutput)
socket.recvLine.addCallback(processOutput)
onMessage(turn, ds, ?:SendJson) do (data: JsonNode):
asyncCheck(turn, send(socket, $data & "\n"))
do:
close(socket)
when isMainModule: when isMainModule:
runActor("json_socket_translator") do (turn: var Turn; root: Cap): import syndicate/relays
connectStdio(turn, root) runActor("main") do (turn: var Turn):
discard spawnJsonSocketTranslator(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnJsonSocketTranslator(turn, ds)

View File

@ -3,7 +3,7 @@
import std/[json, osproc] import std/[json, osproc]
import preserves import preserves
import syndicate, syndicate/relays import syndicate
import ../schema/config import ../schema/config
import ../json_messages import ../json_messages
@ -21,13 +21,14 @@ proc runChild(params: seq[string]): string =
stderr.writeLine "no ouput" stderr.writeLine "no ouput"
proc spawnJsonStdioTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} = proc spawnJsonStdioTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("json-stdio-translator", turn) do (turn: var Turn): spawnActor(turn, "json-stdio-translator") do (turn: var Turn):
during(turn, root, ?:JsonTranslatorArguments) do (argv: seq[string], ds: Cap): during(turn, root, ?:JsonTranslatorArguments) do (argv: seq[string], ds: Cap):
var js = parseJson(runChild(argv)) var js = parseJson(runChild(argv))
message(turn, ds, RecvJson(data: js)) message(turn, ds, RecvJson(data: js))
discard publish(turn, ds, RecvJson(data: js)) discard publish(turn, ds, RecvJson(data: js))
when isMainModule: when isMainModule:
runActor("main") do (turn: var Turn; root: Cap): import syndicate/relays
connectStdio(turn, root) runActor("main") do (turn: var Turn):
spawnJsonStdioTranslator(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnJsonStdioTranslator(turn, ds)

View File

@ -1,8 +1,7 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import preserves, syndicate
import preserves, syndicate, syndicate/relays
import ../schema/[config, sql] import ../schema/[config, sql]
{.passL: "-lpq".} {.passL: "-lpq".}
@ -126,6 +125,7 @@ proc spawnPostgreActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
PQfinish(conn) PQfinish(conn)
when isMainModule: when isMainModule:
runActor("main") do (turn: var Turn; root: Cap): import syndicate/relays
connectStdio(turn, root) runActor("main") do (turn: var Turn):
spawnPostgreActor(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnPostgreActor(turn, ds)

View File

@ -2,9 +2,7 @@
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import std/[options, tables, times] import std/[options, tables, times]
import preserves, syndicate, import preserves, syndicate, syndicate/drivers/timers
syndicate/relays,
syndicate/actors/timers
import ../schema/[assertions, config] import ../schema/[assertions, config]
@ -88,7 +86,7 @@ proc newProxyEntity(turn: var Turn; timers, ds: Cap; period: float): ProxyEntity
proc spawnPulseActor*(turn: var Turn; root: Cap): Actor = proc spawnPulseActor*(turn: var Turn; root: Cap): Actor =
## Spawn an actor that retracts and re-asserts observers on ## Spawn an actor that retracts and re-asserts observers on
## a timed pulse. Requires a timer service on the `root` capability. ## a timed pulse. Requires a timer service on the `root` capability.
spawn("pulse", turn) do (turn: var Turn): spawnActor(turn, "pulse") do (turn: var Turn):
let grabPeriod = ?Observe(pattern: !Pulse) ?? { 0: grab() } let grabPeriod = ?Observe(pattern: !Pulse) ?? { 0: grab() }
during(turn, root, ?:PulseArguments) do (ds: Cap): during(turn, root, ?:PulseArguments) do (ds: Cap):
during(turn, ds, grabPeriod) do (lit: Literal[float]): during(turn, ds, grabPeriod) do (lit: Literal[float]):
@ -100,7 +98,7 @@ proc spawnPulseActor*(turn: var Turn; root: Cap): Actor =
discard publish(turn, ds, pulse) discard publish(turn, ds, pulse)
when isMainModule: when isMainModule:
runActor("main") do (turn: var Turn; root: Cap): import syndicate/relays
spawnTimers(turn, root) runActor("main") do (turn: var Turn):
connectStdio(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard spawnPulseActor(turn, root) discard spawnPulseActor(turn, ds)

View File

@ -1,7 +1,7 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
import preserves, syndicate, syndicate/relays import preserves, syndicate
import ../schema/[config, sql] import ../schema/[config, sql]
# Avoid Sqlite3 from the standard library because it is # Avoid Sqlite3 from the standard library because it is
@ -108,6 +108,7 @@ proc spawnSqliteActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
stderr.writeLine("closed SQLite database ", path) stderr.writeLine("closed SQLite database ", path)
when isMainModule: when isMainModule:
runActor("main") do (turn: var Turn; root: Cap): import syndicate/relays
connectStdio(turn, root) runActor("main") do (turn: var Turn):
spawnSqliteActor(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnSqliteActor(turn, ds)

View File

@ -18,7 +18,7 @@ proc translatePreserves(pr: Value): XmlTranslation {.gcsafe.} =
if xn.isSome: result.xml = $get(xn) if xn.isSome: result.xml = $get(xn)
proc spawnXmlTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} = proc spawnXmlTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("xml-translator", turn) do (turn: var Turn): spawnActor(turn, "xml-translator") do (turn: var Turn):
during(turn, root, ?:XmlTranslatorArguments) do (ds: Cap): during(turn, root, ?:XmlTranslatorArguments) do (ds: Cap):
let obsPat = ?Observe(pattern: !XmlTranslation) let obsPat = ?Observe(pattern: !XmlTranslation)
during(turn, ds, obsPat ?? {0: grab()}) do (xs: Literal[string]): during(turn, ds, obsPat ?? {0: grab()}) do (xs: Literal[string]):
@ -28,6 +28,6 @@ proc spawnXmlTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
when isMainModule: when isMainModule:
import syndicate/relays import syndicate/relays
runActor("main") do (turn: var Turn; root: Cap): runActor("main") do (turn: var Turn):
connectStdio(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnXmlTranslator(turn, root) spawnXmlTranslator(turn, ds)

View File

@ -174,7 +174,7 @@ proc toPreservesHook*(xn: xmlNodePtr): Value =
items[0] items[0]
proc spawnXsltActor*(turn: var Turn; root: Cap): Actor {.discardable.} = proc spawnXsltActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("xslt", turn) do (turn: var Turn): spawnActor(turn, "xslt") do (turn: var Turn):
initLibXml() initLibXml()
during(turn, root, ?:XsltArguments) do (ds: Cap): during(turn, root, ?:XsltArguments) do (ds: Cap):
let sheetsPat = ?Observe(pattern: !XsltTransform) ?? {0: grab(), 1: grab()} let sheetsPat = ?Observe(pattern: !XsltTransform) ?? {0: grab(), 1: grab()}
@ -206,6 +206,6 @@ proc spawnXsltActor*(turn: var Turn; root: Cap): Actor {.discardable.} =
when isMainModule: when isMainModule:
import syndicate/relays import syndicate/relays
runActor("main") do (turn: var Turn; root: Cap): runActor("main") do (turn: var Turn):
connectStdio(turn, root) resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnXsltActor(turn, root) spawnXsltActor(turn, ds)

View File

@ -58,14 +58,10 @@ proc exitProc() {.noconv.} =
proc main = proc main =
let let
route = envRoute()
patterns = inputPatterns() patterns = inputPatterns()
entity = DumpEntity() entity = DumpEntity()
runActor("syndex_card") do (root: Cap; turn: var Turn): runActor("syndex_card") do (turn: var Turn):
for pat in patterns: resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
discard observe(turn, root, pat, entity)
spawnRelays(turn, root)
resolve(turn, root, route) do (turn: var Turn; ds: Cap):
for pat in patterns: for pat in patterns:
discard observe(turn, ds, pat, entity) discard observe(turn, ds, pat, entity)

View File

@ -1,6 +1,6 @@
# Package # Package
version = "20240209" version = "20240405"
author = "Emery Hemingway" author = "Emery Hemingway"
description = "Utilites for Syndicated Actors and Synit" description = "Utilites for Syndicated Actors and Synit"
license = "unlicense" license = "unlicense"
@ -10,4 +10,4 @@ bin = @["mintsturdyref", "mount_actor", "msg", "preserve_process_envir
# Dependencies # Dependencies
requires "nim >= 2.0.0", "syndicate >= 20240208" requires "http://git.syndicate-lang.org/ehmry/syndicate-nim.git >= 20240405", "https://github.com/ehmry/nim-sys.git#4ef3b624db86e331ba334e705c1aa235d55b05e1", "https://git.sr.ht/~ehmry/nim_taps >= 20240405"