Add <connected "…"> assertion to json_socket_translator

This commit is contained in:
Emery Hemingway 2023-05-16 10:51:56 +01:00
parent 2fe54f44bb
commit 3a3fc0db2d
6 changed files with 67 additions and 41 deletions

View File

@ -6,7 +6,9 @@ Wrapper that executes a command, parses its JSON output, and asserts a Preserves
## json_socket_translator
Utility to communicate with sockets that send and receive lines of JSON. Compatible with [mpv](https://mpv.io/), see [mpv.config-example.pr](./mpv.config-example.pr).
Utility to communicate with sockets that send and receive lines of JSON using `<sen-json …>` and `<recv-json …>` messages. Compatible with [mpv](https://mpv.io/), see [mpv.config-example.pr](./mpv.config-example.pr).
Do not send messages immediately to the dataspace passed `json_socket_translator`, wait until it asserts `<connected @socketPath string>`.
## msg

View File

@ -7,6 +7,8 @@ JsonTranslatorArguments = {
dataspace: #!any
}.
JsonTranslatorConnected = <connected @path string>.
JsonSocketTranslatorArguments = {
dataspace: #!any
socket: string

View File

@ -1,39 +1,52 @@
? <mpv ?mpv> $mpv [
let ?socketPath = "/run/user/1000/mpv.sock"
let ?mpvSpace = dataspace
$mpvSpace [
; announce the dataspace when the translator is connected
? <connected $socketPath> [
$config <mpv $mpvSpace>
]
; translate <play-file …> to an MPV command
?? <play-file ?file> [
! <send-json { "command": ["loadfile" $file "append-play"] }>
]
?? <recv-json ?js> [ $log ! <log "-" { mpv: $js }> ]
; clear the playlist on idle so it doesn't grow indefinitely
?? <recv-json {"event": "idle"}> [
! <send-json { "command": ["playlist-clear"] }>
]
; log anything that comes back from MPV
?? <recv-json ?js> [ $log ! <log "-" { mpv: $js }> ]
]
; need the translator and the translator needs the daemon
<require-service <daemon mpv-translator>>
<depends-on <daemon mpv-translator> <service-state <daemon mpv> ready>>
<depends-on <daemon mpv-translator> <service-state <daemon mpv-server> ready>>
let ?socketPath = "/run/user/1000/mpv.sock"
<daemon mpv {
argv: [
"/run/current-system/sw/bin/mpv"
"--really-quiet"
"--idle=yes"
"--no-audio-display"
"--input-ipc-server=/run/user/1000/mpv.sock"
]
protocol: none
}>
<daemon mpv-translator {
argv: "/home/emery/src/bin/json_socket_translator"
protocol: application/syndicate
}>
let ?mpvSpace = dataspace
? <service-object <daemon mpv-translator> ?cap> [
$cap {
dataspace: $mpvSpace
socket: $socketPath
}
<mpv $mpvSpace>
]
; assert and retract the daemon as the daemon is built (this is a testing artifact)
? <built "json_socket_translator" ?path ?sum> [
<daemon mpv-server {
argv: [
"/run/current-system/sw/bin/mpv"
"--really-quiet"
"--idle=yes"
"--no-audio-display"
"--input-ipc-server=/run/user/1000/mpv.sock"
]
protocol: none
}>
<daemon mpv-translator {
argv: [$path]
protocol: application/syndicate
env: {BUILD_SUM: $sum}
}>
]

View File

@ -16,19 +16,23 @@ runActor("main") do (root: Ref; turn: var Turn):
protocol = cast[Protocol](0),
buffered = false,
)
waitFor connectUnix(socket, socketPath)
addCallback(connectUnix(socket, socketPath), turn) do (turn: var Turn):
let a = JsonTranslatorConnected(path: socketPath)
discard publish(turn, ds, a)
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))
let socketFacet = turn.facet
proc processOutput(fut: Future[string]) {.gcsafe.} =
run(socketFacet) 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)
socket.recvLine.addCallback(processOutput)
onMessage(turn, ds, ?Input) do (data: Assertion):
var js: JsonNode
if fromPreserve(js, data):
asyncCheck(turn, send(socket, $js & "\n"))
else:
writeLine(stderr, "cannot convert assertion to JSON - ", data)
onMessage(turn, ds, ?Input) do (data: Assertion):
var js: JsonNode
if fromPreserve(js, data):
asyncCheck(turn, send(socket, $js & "\n"))
else:
writeLine(stderr, "cannot convert assertion to JSON - ", data)
do:
close(socket)

View File

@ -1,6 +1,6 @@
import
std/typetraits, preserves
preserves
type
Output* {.preservesRecord: "recv-json".} = object
@ -9,6 +9,9 @@ type
JsonTranslatorArguments* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: Preserve[void]
JsonTranslatorConnected* {.preservesRecord: "connected".} = object
`path`*: string
JsonSocketTranslatorArguments* {.preservesDictionary.} = object
`dataspace`* {.preservesEmbedded.}: Preserve[void]
`socket`*: string
@ -16,10 +19,12 @@ type
Input* {.preservesRecord: "send-json".} = object
`field0`*: Preserve[void]
proc `$`*(x: Output | JsonTranslatorArguments | JsonSocketTranslatorArguments |
proc `$`*(x: Output | JsonTranslatorArguments | JsonTranslatorConnected |
JsonSocketTranslatorArguments |
Input): string =
`$`(toPreserve(x))
proc encode*(x: Output | JsonTranslatorArguments | JsonSocketTranslatorArguments |
proc encode*(x: Output | JsonTranslatorArguments | JsonTranslatorConnected |
JsonSocketTranslatorArguments |
Input): seq[byte] =
encode(toPreserve(x))

View File

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