Use <recv-json …> and <send-json …> schema
This commit is contained in:
parent
a26a83c623
commit
9ec580ff79
12
config.prs
12
config.prs
|
@ -1,3 +1,13 @@
|
||||||
version 1 .
|
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
|
||||||
|
}.
|
||||||
|
|
|
@ -1,28 +1,39 @@
|
||||||
let ?beepSpace = dataspace
|
? <mpv ?mpv> $mpv [
|
||||||
<bind "syndicate" #x"" $beepSpace>
|
|
||||||
|
?? <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"
|
let ?socketPath = "/run/user/1000/mpv.sock"
|
||||||
|
|
||||||
<require-service <daemon mpv>>
|
|
||||||
<daemon mpv {
|
<daemon mpv {
|
||||||
argv: ["/run/current-system/sw/bin/mpv"
|
argv: [
|
||||||
"--input-ipc-server=/run/user/1000/mpv.sock"
|
"/run/current-system/sw/bin/mpv"
|
||||||
"--idle=yes"
|
|
||||||
"--really-quiet"
|
"--really-quiet"
|
||||||
|
"--idle=yes"
|
||||||
|
"--no-audio-display"
|
||||||
|
"--input-ipc-server=/run/user/1000/mpv.sock"
|
||||||
]
|
]
|
||||||
protocol: none
|
protocol: none
|
||||||
}>
|
}>
|
||||||
|
|
||||||
<require-service <daemon mpv-translator>>
|
|
||||||
<daemon mpv-translator {
|
<daemon mpv-translator {
|
||||||
argv: "/home/repo/syndicate/syndicate_utils/src/json_socket_translator"
|
argv: "/home/emery/src/bin/json_socket_translator"
|
||||||
protocol: text/syndicate
|
protocol: application/syndicate
|
||||||
}>
|
}>
|
||||||
|
|
||||||
? <service-object <daemon mpv-translator> ?mpvSpace> [
|
let ?mpvSpace = dataspace
|
||||||
$mpvSpace <json-socket mpv $socketPath>
|
? <service-object <daemon mpv-translator> ?cap> [
|
||||||
$beepSpace ?? <beep ?code> [
|
$cap {
|
||||||
$mpvSpace ! <mpv 1 { "command": ["loadfile" "/tmp/beep.ogg"] }>
|
dataspace: $mpvSpace
|
||||||
]
|
socket: $socketPath
|
||||||
|
}
|
||||||
|
<mpv $mpvSpace>
|
||||||
]
|
]
|
||||||
|
|
|
@ -7,27 +7,30 @@ import preserves, preserves/jsonhooks, syndicate, syndicate/patterns
|
||||||
|
|
||||||
import ./schema/config
|
import ./schema/config
|
||||||
|
|
||||||
bootDataspace("main") do (ds: Ref; turn: var Turn):
|
bootDataspace("main") do (root: Ref; turn: var Turn):
|
||||||
connectStdio(ds, turn)
|
connectStdio(root, turn)
|
||||||
during(turn, ds, ?config.JsonSocket) do (label: Assertion, socketPath: string):
|
during(turn, root, ?JsonSocketTranslatorArguments) do (ds: Ref, socketPath: string):
|
||||||
let socket = newAsyncSocket(
|
let socket = newAsyncSocket(
|
||||||
domain = AF_UNIX,
|
domain = AF_UNIX,
|
||||||
sockType = SOCK_STREAM,
|
sockType = SOCK_STREAM,
|
||||||
protocol = cast[Protocol](0),
|
protocol = cast[Protocol](0),
|
||||||
buffered = false)
|
buffered = false,
|
||||||
|
)
|
||||||
waitFor connectUnix(socket, socketPath)
|
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
|
var js: JsonNode
|
||||||
if fromPreserve(js, data):
|
if fromPreserve(js, data):
|
||||||
asyncCheck socket.send($js & "\n")
|
asyncCheck(turn, send(socket, $js & "\n"))
|
||||||
|
else:
|
||||||
let f = turn.facet
|
writeLine(stderr, "cannot convert assertion to JSON - ", data)
|
||||||
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)
|
|
||||||
|
|
||||||
runForever()
|
runForever()
|
||||||
|
|
|
@ -7,6 +7,8 @@ import syndicate
|
||||||
|
|
||||||
from preserves/jsonhooks import toPreserveHook
|
from preserves/jsonhooks import toPreserveHook
|
||||||
|
|
||||||
|
import ./schema/config
|
||||||
|
|
||||||
proc runChild: string =
|
proc runChild: string =
|
||||||
let params = commandLineParams()
|
let params = commandLineParams()
|
||||||
if params.len < 1:
|
if params.len < 1:
|
||||||
|
@ -31,10 +33,9 @@ proc translate(output: string): Assertion =
|
||||||
quit 1
|
quit 1
|
||||||
js.toPreserveHook(Ref)
|
js.toPreserveHook(Ref)
|
||||||
|
|
||||||
|
|
||||||
bootDataspace("main") do (root: Ref; turn: var Turn):
|
bootDataspace("main") do (root: Ref; turn: var Turn):
|
||||||
connectStdio(root, turn)
|
connectStdio(root, turn)
|
||||||
discard publish(turn, root,
|
onPublish(turn, root, ?JsonTranslatorArguments) do (ds: Ref):
|
||||||
initRecord[Ref]("output", runChild().translate()))
|
message(turn, ds, initRecord[Ref]("recv-json", runChild().translate()))
|
||||||
|
|
||||||
runForever()
|
runForever()
|
||||||
|
|
|
@ -3,12 +3,23 @@ import
|
||||||
std/typetraits, preserves
|
std/typetraits, preserves
|
||||||
|
|
||||||
type
|
type
|
||||||
JsonSocket* {.preservesRecord: "json-socket".} = object
|
Output* {.preservesRecord: "recv-json".} = object
|
||||||
`label`*: Symbol
|
`field0`*: Preserve[void]
|
||||||
`path`*: string
|
|
||||||
|
|
||||||
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))
|
`$`(toPreserve(x))
|
||||||
|
|
||||||
proc encode*(x: JsonSocket): seq[byte] =
|
proc encode*(x: Output | JsonTranslatorArguments | JsonSocketTranslatorArguments |
|
||||||
|
Input): seq[byte] =
|
||||||
encode(toPreserve(x))
|
encode(toPreserve(x))
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Package
|
# Package
|
||||||
|
|
||||||
version = "20230410"
|
version = "20230505"
|
||||||
author = "Emery Hemingway"
|
author = "Emery Hemingway"
|
||||||
description = "Utilites for Syndicated Actors and Synit"
|
description = "Utilites for Syndicated Actors and Synit"
|
||||||
license = "unlicense"
|
license = "unlicense"
|
||||||
|
|
Loading…
Reference in New Issue