diff --git a/README.md b/README.md index e29569d..8f6c790 100644 --- a/README.md +++ b/README.md @@ -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 `` and `` 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 ``. ## msg diff --git a/config.prs b/config.prs index 775a49a..5851592 100644 --- a/config.prs +++ b/config.prs @@ -7,6 +7,8 @@ JsonTranslatorArguments = { dataspace: #!any }. +JsonTranslatorConnected = . + JsonSocketTranslatorArguments = { dataspace: #!any socket: string diff --git a/mpv.config-example.pr b/mpv.config-example.pr index d0fc8e8..e11ed82 100644 --- a/mpv.config-example.pr +++ b/mpv.config-example.pr @@ -1,39 +1,52 @@ -? $mpv [ +let ?socketPath = "/run/user/1000/mpv.sock" +let ?mpvSpace = dataspace +$mpvSpace [ + ; announce the dataspace when the translator is connected + ? [ + $config + ] + ; translate to an MPV command ?? [ ! ] - ?? [ $log ! ] + ; clear the playlist on idle so it doesn't grow indefinitely + ?? [ + ! + ] + ; log anything that comes back from MPV + ?? [ $log ! ] ] +; need the translator and the translator needs the daemon > - ready>> + ready>> -let ?socketPath = "/run/user/1000/mpv.sock" - - - - - -let ?mpvSpace = dataspace ? ?cap> [ $cap { dataspace: $mpvSpace socket: $socketPath } - +] + +; assert and retract the daemon as the daemon is built (this is a testing artifact) +? [ + + + ] diff --git a/src/json_socket_translator.nim b/src/json_socket_translator.nim index 91fb1b7..6d78b83 100644 --- a/src/json_socket_translator.nim +++ b/src/json_socket_translator.nim @@ -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) diff --git a/src/schema/config.nim b/src/schema/config.nim index e06008f..e40bc8d 100644 --- a/src/schema/config.nim +++ b/src/schema/config.nim @@ -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)) diff --git a/syndicate_utils.nimble b/syndicate_utils.nimble index 32d2dbe..a009778 100644 --- a/syndicate_utils.nimble +++ b/syndicate_utils.nimble @@ -1,6 +1,6 @@ # Package -version = "20230507" +version = "20230516" author = "Emery Hemingway" description = "Utilites for Syndicated Actors and Synit" license = "unlicense"