diff --git a/lock.json b/lock.json index 091ca5a..c602155 100644 --- a/lock.json +++ b/lock.json @@ -6,12 +6,55 @@ "bigints" ], "path": "/nix/store/jvrm392g8adfsgf36prgwkbyd7vh5jsw-source", - "ref": "20231006", "rev": "86ea14d31eea9275e1408ca34e6bfe9c99989a96", "sha256": "15pcpmnk1bnw3k8769rjzcpg00nahyrypwbxs88jnwr4aczp99j4", "srcDir": "src", "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", "packages": [ @@ -23,77 +66,237 @@ "srcDir": "", "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", "packages": [ "preserves" ], - "path": "/nix/store/6nnn5di5vip1vladlb7z56rbw18d1y7j-source", - "ref": "20240208", - "rev": "2825bceecf33a15b9b7942db5331a32cbc39b281", - "sha256": "145vf46fy3wc52j6vs509fm9bi5lx7c53gskbkpcfbkv82l86dgk", + "path": "/nix/store/2hy124xgabz134dxj3wji7mp47fdwy3w-source", + "rev": "9ae435a83c6d5028405538af5d24a023af625b6e", + "sha256": "1k7ywcp1a53x2fpc6wc2b0qzb264dkifash0s1wcp66rw3lx15k2", "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", "packages": [ "syndicate" ], - "path": "/nix/store/y9f3j4m7vmhf8gbpkvqa77jvzrc5ynlm-source", - "ref": "20240208", - "rev": "50a77995bcfe15e6062f54c6af0f55fba850c329", - "sha256": "1avrk86c34qg39w8vlixsksli2gwgbsf29jhlap27ffzdbj2zbal", + "path": "/nix/store/kl628g7vg2ww8wilf8h2ag7qqnvvwdzb-source", + "rev": "c2e1e2e0fa403529750196ce3ccb5a99a4d6c006", + "sha256": "1r8ab79pgrrnzmp49h8rp50c9x8zd0p7bsvzxaphc221nvyfx09j", "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", "packages": [ - "ws" + "sys" ], - "path": "/nix/store/zd51j4dphs6h1hyhdbzdv840c8813ai8-source", - "ref": "0.5.0", - "rev": "9536bf99ddf5948db221ccb7bb3663aa238a8e21", - "sha256": "0j8z9jlvzb1h60v7rryvh2wx6vg99lra6i62whf3fknc53l641fz", + "path": "/nix/store/syhxsjlsdqfap0hk4qp3s6kayk8cqknd-source", + "rev": "4ef3b624db86e331ba334e705c1aa235d55b05e1", + "sha256": "1q4qgw4an4mmmcbx48l6xk1jig1vc8p9cq9dbx39kpnb0890j32q", "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" } ] } diff --git a/src/Tupfile b/src/Tupfile index dfe2d53..472519d 100644 --- a/src/Tupfile +++ b/src/Tupfile @@ -1,4 +1,4 @@ include_rules -: foreach *.nim | $(SYNDICATE_PROTOCOL) ./ ./syndesizer/ |> !nim_bin |> {bin} +: foreach *.nim | $(SYNDICATE_PROTOCOL) ./ |> !nim_bin |> {bin} : foreach {bin} |> !assert_built |> : $(BIN_DIR)/msg |> cp %f %o |> $(BIN_DIR)/beep diff --git a/src/mount_actor.nim b/src/mount_actor.nim index 1f53e69..db900db 100644 --- a/src/mount_actor.nim +++ b/src/mount_actor.nim @@ -8,7 +8,7 @@ when not defined(linux): import std/oserrors import preserves -import syndicate, syndicate/relays +import syndicate import ./schema/mountpoints 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: "".} ## `umount(2)` -runActor("mount_actor") do (turn: var Turn; root: Cap): - let - targetPat = ?Observe(pattern: !Mountpoint) ?? { 1: grabLit() } - sourcePat = ?Observe(pattern: !Mountpoint) ?? { 0: grabLit(), 2: grabLit() } - connectStdio(turn, root) - during(turn, root, ?:BootArgs) do (ds: Cap): - during(turn, ds, targetPat) do (target: string): - during(turn, ds, sourcePat) do (source: string, fsType: string): - var mountpoint = Mountpoint( - source: source, - target: target, - `type`: fsType, - ) - var rc = mount(source, target, fsType, 0, nil) - if rc == 0: - mountpoint.status = Status(orKind: StatusKind.success) - else: - mountpoint.status = Status(orKind: StatusKind.Failure) - mountpoint.status.failure.msg = osErrorMsg(osLastError()) - discard publish(turn, ds, mountpoint) - do: - discard umount(target) +proc spawnMountActor*(turn: var Turn; ds: Cap): Actor {.discardable.} = + spawnActor(turn, "mount_actor") do (turn: var Turn): + let + targetPat = ?Observe(pattern: !Mountpoint) ?? { 1: grabLit() } + sourcePat = ?Observe(pattern: !Mountpoint) ?? { 0: grabLit(), 2: grabLit() } + during(turn, ds, ?:BootArgs) do (ds: Cap): + during(turn, ds, targetPat) do (target: string): + during(turn, ds, sourcePat) do (source: string, fsType: string): + var mountpoint = Mountpoint( + source: source, + target: target, + `type`: fsType, + ) + var rc = mount(source, target, fsType, 0, nil) + if rc == 0: + mountpoint.status = Status(orKind: StatusKind.success) + else: + mountpoint.status = Status(orKind: StatusKind.Failure) + mountpoint.status.failure.msg = osErrorMsg(osLastError()) + discard publish(turn, ds, mountpoint) + do: + 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) diff --git a/src/msg.nim b/src/msg.nim index 98e0964..22a98c2 100644 --- a/src/msg.nim +++ b/src/msg.nim @@ -1,20 +1,13 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense -import std/[asyncdispatch, sequtils, os] +import std/[sequtils, os] import preserves, syndicate, syndicate/relays -proc main = - let - route = envRoute() - data = map(commandLineParams(), parsePreserves) - - discard bootDataspace("msg") do (turn: var Turn; root: Cap): - spawnRelays(turn, root) - resolve(turn, root, route) do (turn: var Turn; ds: Cap): - for e in data: - message(turn, ds, e) - - for _ in 1..2: poll() - -main() +runActor("msg") do (turn: var Turn): + var data = map(commandLineParams(), parsePreserves) + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + for e in data: + message(turn, ds, e) + sync(turn, ds) do (turn: var Turn): + stopActor(turn) diff --git a/src/rofi_script_actor.nim b/src/rofi_script_actor.nim index 1620f78..4be3ff8 100644 --- a/src/rofi_script_actor.nim +++ b/src/rofi_script_actor.nim @@ -3,40 +3,29 @@ ## 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 ./schema/rofi -proc main = - let - route = envRoute() - rofiPid = getEnv("ROFI_OUTSIDE") - if rofiPid == "": - quit("run this program in rofi") +if getEnv("ROFI_OUTSIDE") == "": + quit("run this program in rofi") - runActor("rofi_script_actor") do (turn: var Turn; root: Cap): - let rootFacet = turn.facet - resolve(turn, root, route) do (turn: var Turn; ds: Cap): - case paramCount() - of 0: - let pat = ?:Options - onPublish(turn, ds, pat) do (options: seq[string]): - stdout.writeLine options.join("\n") - quit() +runActor("rofi_script_actor") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + case paramCount() + of 0: + let pat = ?:Options + onPublish(turn, ds, pat) do (options: seq[string]): + stdout.writeLine options.join("\n") + quit() - of 1: - var select = Select(option: commandLineParams()[0]) - for (key, val) in envPairs(): - if key.startsWith "ROFI_": - select.environment[Symbol key] = val - message(turn, ds, select) - # TODO: sync not implemented correctly - # sync(turn, ds, stopActor) - callSoon do (): - waitFor sleepAsync(1) - quit() + of 1: + var select = Select(option: commandLineParams()[0]) + for (key, val) in envPairs(): + if key.startsWith "ROFI_": + select.environment[Symbol key] = val + message(turn, ds, select) + sync(turn, ds, stopActor) - else: - quit("rofi passed an unexpected number of arguments") - -main() + else: + quit("rofi passed an unexpected number of arguments") diff --git a/src/syndesizer.nim b/src/syndesizer.nim index 0bf209e..dabc665 100644 --- a/src/syndesizer.nim +++ b/src/syndesizer.nim @@ -3,7 +3,7 @@ ## Syndicate multitool. -import syndicate, syndicate/relays, syndicate/actors/timers +import syndicate, syndicate/relays, syndicate/drivers/timers const withPostgre* {.booldefine.}: bool = true @@ -24,17 +24,17 @@ when withPostgre: when withSqlite: import ./syndesizer/sqlite_actor -runActor("syndesizer") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - discard spawnTimers(turn, root) - discard spawnCacheActor(turn, root) - discard spawnFileSystemUsageActor(turn, root) - discard spawnJsonSocketTranslator(turn, root) - discard spawnJsonStdioTranslator(turn, root) - discard spawnPulseActor(turn, root) - discard spawnXmlTranslator(turn, root) - discard spawnXsltActor(turn, root) - when withPostgre: - discard spawnPostgreActor(turn, root) - when withSqlite: - discard spawnSqliteActor(turn, root) +runActor("syndesizer") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + discard spawnTimerDriver(turn, ds) + discard spawnCacheActor(turn, ds) + discard spawnFileSystemUsageActor(turn, ds) + discard spawnJsonSocketTranslator(turn, ds) + discard spawnJsonStdioTranslator(turn, ds) + discard spawnPulseActor(turn, ds) + discard spawnXmlTranslator(turn, ds) + discard spawnXsltActor(turn, ds) + when withPostgre: + discard spawnPostgreActor(turn, ds) + when withSqlite: + discard spawnSqliteActor(turn, ds) diff --git a/src/syndesizer/Tupfile b/src/syndesizer/Tupfile index b223d66..6406539 100644 --- a/src/syndesizer/Tupfile +++ b/src/syndesizer/Tupfile @@ -1,2 +1,3 @@ include_rules -: foreach *.nim | $(SYNDICATE_PROTOCOL) ../ |> !nim_check |> | ./ +: foreach *.nim | $(SYNDICATE_PROTOCOL) ../ |> !nim_bin |> {bin} +: foreach {bin} |> !assert_built |> diff --git a/src/syndesizer/cache_actor.nim b/src/syndesizer/cache_actor.nim index b5c7d3b..6d297ea 100644 --- a/src/syndesizer/cache_actor.nim +++ b/src/syndesizer/cache_actor.nim @@ -3,8 +3,8 @@ import std/times import preserves, syndicate, - syndicate/[durings, relays], - syndicate/actors/timers + syndicate/durings, + syndicate/drivers/timers import ../schema/config @@ -35,7 +35,7 @@ proc isObserve(pat: Pattern): bool = pat.dcompound.rec.label.isSymbol"Observe" 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): onPublish(turn, ds, ?:Observe) do (pat: Pattern, obs: Cap): var cache: CacheEntity @@ -51,7 +51,8 @@ proc spawnCacheActor*(turn: var Turn; root: Cap): Actor = discard observe(turn, ds, pat, cache) when isMainModule: - runActor("cache_actor") do (turn: var Turn; root: Cap): - spawnTimers(turn, root) - connectStdio(turn, root) - discard spawnCacheActor(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + discard spawnTimerDriver(turn, ds) + discard spawnCacheActor(turn, ds) diff --git a/src/syndesizer/file_system_usage.nim b/src/syndesizer/file_system_usage.nim index 1c6f10c..b3ccc71 100644 --- a/src/syndesizer/file_system_usage.nim +++ b/src/syndesizer/file_system_usage.nim @@ -3,7 +3,7 @@ import std/[dirs, os, paths] import preserves -import syndicate, syndicate/relays +import syndicate import ../schema/[assertions, config] @@ -22,6 +22,7 @@ proc spawnFileSystemUsageActor*(turn: var Turn; root: Cap): Actor {.discardable. # TODO: updates? when isMainModule: - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - discard spawnFileSystemUsageActor(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + discard spawnFileSystemUsageActor(turn, ds) diff --git a/src/syndesizer/json_socket_translator.nim b/src/syndesizer/json_socket_translator.nim index 24aa8be..c45a018 100644 --- a/src/syndesizer/json_socket_translator.nim +++ b/src/syndesizer/json_socket_translator.nim @@ -1,39 +1,60 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense -import std/[asyncdispatch, asyncnet, json] -from std/nativesockets import AF_UNIX, SOCK_STREAM, Protocol -import preserves, preserves/jsonhooks, syndicate, syndicate/relays +import std/[json, options] +import pkg/sys/[ioqueue, sockets] +import preserves, preserves/jsonhooks, syndicate import ../schema/config, ../json_messages -proc spawnJsonSocketTranslator*(turn: var Turn; root: Cap): Actor = - spawn("json-socket-translator", turn) do (turn: var Turn): +proc translateSocket(facet: Facet; ds: Cap; path: string) {.asyncio.} = + 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): - let socket = newAsyncSocket( - domain = AF_UNIX, - sockType = SOCK_STREAM, - 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) + linkActor(turn, "json-socket-translator") do (turn: var Turn): + discard trampoline: + whelp translateSocket(turn.facet, ds, socketPath) when isMainModule: - runActor("json_socket_translator") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - discard spawnJsonSocketTranslator(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnJsonSocketTranslator(turn, ds) diff --git a/src/syndesizer/json_translator.nim b/src/syndesizer/json_translator.nim index da439d6..4d8a710 100644 --- a/src/syndesizer/json_translator.nim +++ b/src/syndesizer/json_translator.nim @@ -3,7 +3,7 @@ import std/[json, osproc] import preserves -import syndicate, syndicate/relays +import syndicate import ../schema/config import ../json_messages @@ -21,13 +21,14 @@ proc runChild(params: seq[string]): string = stderr.writeLine "no ouput" 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): var js = parseJson(runChild(argv)) message(turn, ds, RecvJson(data: js)) discard publish(turn, ds, RecvJson(data: js)) when isMainModule: - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - spawnJsonStdioTranslator(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnJsonStdioTranslator(turn, ds) diff --git a/src/syndesizer/postgre_actor.nim b/src/syndesizer/postgre_actor.nim index 6c54ff5..10010b9 100644 --- a/src/syndesizer/postgre_actor.nim +++ b/src/syndesizer/postgre_actor.nim @@ -1,8 +1,7 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense - -import preserves, syndicate, syndicate/relays +import preserves, syndicate import ../schema/[config, sql] {.passL: "-lpq".} @@ -126,6 +125,7 @@ proc spawnPostgreActor*(turn: var Turn; root: Cap): Actor {.discardable.} = PQfinish(conn) when isMainModule: - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - spawnPostgreActor(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnPostgreActor(turn, ds) diff --git a/src/syndesizer/pulses.nim b/src/syndesizer/pulses.nim index 49773f4..d30ec66 100644 --- a/src/syndesizer/pulses.nim +++ b/src/syndesizer/pulses.nim @@ -2,9 +2,7 @@ # SPDX-License-Identifier: Unlicense import std/[options, tables, times] -import preserves, syndicate, - syndicate/relays, - syndicate/actors/timers +import preserves, syndicate, syndicate/drivers/timers 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 = ## Spawn an actor that retracts and re-asserts observers on ## 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() } during(turn, root, ?:PulseArguments) do (ds: Cap): 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) when isMainModule: - runActor("main") do (turn: var Turn; root: Cap): - spawnTimers(turn, root) - connectStdio(turn, root) - discard spawnPulseActor(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + discard spawnPulseActor(turn, ds) diff --git a/src/syndesizer/sqlite_actor.nim b/src/syndesizer/sqlite_actor.nim index 50721b2..785c01f 100644 --- a/src/syndesizer/sqlite_actor.nim +++ b/src/syndesizer/sqlite_actor.nim @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense -import preserves, syndicate, syndicate/relays +import preserves, syndicate import ../schema/[config, sql] # 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) when isMainModule: - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - spawnSqliteActor(turn, root) + import syndicate/relays + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnSqliteActor(turn, ds) diff --git a/src/syndesizer/xml_translator.nim b/src/syndesizer/xml_translator.nim index 24fdd12..acf67c2 100644 --- a/src/syndesizer/xml_translator.nim +++ b/src/syndesizer/xml_translator.nim @@ -18,7 +18,7 @@ proc translatePreserves(pr: Value): XmlTranslation {.gcsafe.} = if xn.isSome: result.xml = $get(xn) 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): let obsPat = ?Observe(pattern: !XmlTranslation) 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: import syndicate/relays - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - spawnXmlTranslator(turn, root) + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnXmlTranslator(turn, ds) diff --git a/src/syndesizer/xslt_actor.nim b/src/syndesizer/xslt_actor.nim index 8f63b7f..3b7a12d 100644 --- a/src/syndesizer/xslt_actor.nim +++ b/src/syndesizer/xslt_actor.nim @@ -174,7 +174,7 @@ proc toPreservesHook*(xn: xmlNodePtr): Value = items[0] proc spawnXsltActor*(turn: var Turn; root: Cap): Actor {.discardable.} = - spawn("xslt", turn) do (turn: var Turn): + spawnActor(turn, "xslt") do (turn: var Turn): initLibXml() during(turn, root, ?:XsltArguments) do (ds: Cap): let sheetsPat = ?Observe(pattern: !XsltTransform) ?? {0: grab(), 1: grab()} @@ -206,6 +206,6 @@ proc spawnXsltActor*(turn: var Turn; root: Cap): Actor {.discardable.} = when isMainModule: import syndicate/relays - runActor("main") do (turn: var Turn; root: Cap): - connectStdio(turn, root) - spawnXsltActor(turn, root) + runActor("main") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): + spawnXsltActor(turn, ds) diff --git a/src/syndump.nim b/src/syndump.nim index 2db0ee7..66a9dca 100644 --- a/src/syndump.nim +++ b/src/syndump.nim @@ -58,14 +58,10 @@ proc exitProc() {.noconv.} = proc main = let - route = envRoute() patterns = inputPatterns() entity = DumpEntity() - runActor("syndex_card") do (root: Cap; turn: var Turn): - for pat in patterns: - discard observe(turn, root, pat, entity) - spawnRelays(turn, root) - resolve(turn, root, route) do (turn: var Turn; ds: Cap): + runActor("syndex_card") do (turn: var Turn): + resolveEnvironment(turn) do (turn: var Turn; ds: Cap): for pat in patterns: discard observe(turn, ds, pat, entity) diff --git a/syndicate_utils.nimble b/syndicate_utils.nimble index 89fde3d..87175d2 100644 --- a/syndicate_utils.nimble +++ b/syndicate_utils.nimble @@ -1,6 +1,6 @@ # Package -version = "20240209" +version = "20240405" author = "Emery Hemingway" description = "Utilites for Syndicated Actors and Synit" license = "unlicense" @@ -10,4 +10,4 @@ bin = @["mintsturdyref", "mount_actor", "msg", "preserve_process_envir # 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"