Use <recv-json …> and <send-json …> schema

This commit is contained in:
Emery Hemingway 2023-05-05 17:38:04 +01:00
parent a26a83c623
commit 9ec580ff79
6 changed files with 78 additions and 42 deletions

View File

@ -1,3 +1,13 @@
version 1 .
JsonSocket = <json-socket @label symbol @path string> .
Input = <send-json any>.
Output = <recv-json any>.
JsonTranslatorArguments = {
dataspace: #!any
}.
JsonSocketTranslatorArguments = {
dataspace: #!any
socket: string
}.

View File

@ -1,28 +1,39 @@
let ?beepSpace = dataspace
<bind "syndicate" #x"" $beepSpace>
? <mpv ?mpv> $mpv [
?? <play-file ?file> [
! <send-json { "command": ["loadfile" $file "append-play"] }>
]
?? <recv-json ?js> [ $log ! <log "-" { mpv: $js }> ]
]
<require-service <daemon mpv-translator>>
<depends-on <daemon mpv-translator> <service-state <daemon mpv> ready>>
let ?socketPath = "/run/user/1000/mpv.sock"
<require-service <daemon mpv>>
<daemon mpv {
argv: ["/run/current-system/sw/bin/mpv"
"--input-ipc-server=/run/user/1000/mpv.sock"
"--idle=yes"
argv: [
"/run/current-system/sw/bin/mpv"
"--really-quiet"
"--idle=yes"
"--no-audio-display"
"--input-ipc-server=/run/user/1000/mpv.sock"
]
protocol: none
}>
<require-service <daemon mpv-translator>>
<daemon mpv-translator {
argv: "/home/repo/syndicate/syndicate_utils/src/json_socket_translator"
protocol: text/syndicate
argv: "/home/emery/src/bin/json_socket_translator"
protocol: application/syndicate
}>
? <service-object <daemon mpv-translator> ?mpvSpace> [
$mpvSpace <json-socket mpv $socketPath>
$beepSpace ?? <beep ?code> [
$mpvSpace ! <mpv 1 { "command": ["loadfile" "/tmp/beep.ogg"] }>
]
let ?mpvSpace = dataspace
? <service-object <daemon mpv-translator> ?cap> [
$cap {
dataspace: $mpvSpace
socket: $socketPath
}
<mpv $mpvSpace>
]

View File

@ -7,27 +7,30 @@ import preserves, preserves/jsonhooks, syndicate, syndicate/patterns
import ./schema/config
bootDataspace("main") do (ds: Ref; turn: var Turn):
connectStdio(ds, turn)
during(turn, ds, ?config.JsonSocket) do (label: Assertion, socketPath: string):
bootDataspace("main") do (root: Ref; turn: var Turn):
connectStdio(root, turn)
during(turn, root, ?JsonSocketTranslatorArguments) do (ds: Ref, socketPath: string):
let socket = newAsyncSocket(
domain = AF_UNIX,
sockType = SOCK_STREAM,
protocol = cast[Protocol](0),
buffered = false)
domain = AF_UNIX,
sockType = SOCK_STREAM,
protocol = cast[Protocol](0),
buffered = false,
)
waitFor connectUnix(socket, socketPath)
onMessage(turn, ds, recordPattern(label, ?toPreserve(1), grab())) do (data: Assertion):
let f = turn.facet
proc processOutput(fut: Future[string]) {.gcsafe.} =
run(f) do (turn: var Turn):
var data = fut.read.parseJson.toPreserve
message(turn, ds, initRecord("recv-json", data))
socket.recvLine.addCallback(processOutput)
socket.recvLine.addCallback(processOutput)
onMessage(turn, ds, ?Input) do (data: Assertion):
var js: JsonNode
if fromPreserve(js, data):
asyncCheck socket.send($js & "\n")
let f = turn.facet
proc processIncoming(fut: Future[string]) {.gcsafe.} =
var data = fut.read.parseJson.toPreserve(Ref)
run(f) do (turn: var Turn):
message(turn, ds, initRecord(label, 0.toPreserve(Ref), data))
socket.recvLine.addCallback(processIncoming)
socket.recvLine.addCallback(processIncoming)
asyncCheck(turn, send(socket, $js & "\n"))
else:
writeLine(stderr, "cannot convert assertion to JSON - ", data)
runForever()

View File

@ -7,6 +7,8 @@ import syndicate
from preserves/jsonhooks import toPreserveHook
import ./schema/config
proc runChild: string =
let params = commandLineParams()
if params.len < 1:
@ -31,10 +33,9 @@ proc translate(output: string): Assertion =
quit 1
js.toPreserveHook(Ref)
bootDataspace("main") do (root: Ref; turn: var Turn):
connectStdio(root, turn)
discard publish(turn, root,
initRecord[Ref]("output", runChild().translate()))
onPublish(turn, root, ?JsonTranslatorArguments) do (ds: Ref):
message(turn, ds, initRecord[Ref]("recv-json", runChild().translate()))
runForever()

View File

@ -3,12 +3,23 @@ import
std/typetraits, preserves
type
JsonSocket* {.preservesRecord: "json-socket".} = object
`label`*: Symbol
`path`*: string
Output* {.preservesRecord: "recv-json".} = object
`field0`*: Preserve[void]
proc `$`*(x: JsonSocket): string =
JsonTranslatorArguments* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: Preserve[void]
JsonSocketTranslatorArguments* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: Preserve[void]
`socket`*: string
Input* {.preservesRecord: "send-json".} = object
`field0`*: Preserve[void]
proc `$`*(x: Output | JsonTranslatorArguments | JsonSocketTranslatorArguments |
Input): string =
`$`(toPreserve(x))
proc encode*(x: JsonSocket): seq[byte] =
proc encode*(x: Output | JsonTranslatorArguments | JsonSocketTranslatorArguments |
Input): seq[byte] =
encode(toPreserve(x))

View File

@ -1,6 +1,6 @@
# Package
version = "20230410"
version = "20230505"
author = "Emery Hemingway"
description = "Utilites for Syndicated Actors and Synit"
license = "unlicense"