syndesizer: absorb json_translator

This commit is contained in:
Emery Hemingway 2024-01-08 22:10:55 +02:00
parent 7ed62e0482
commit eeaa80db88
7 changed files with 75 additions and 39 deletions

View File

@ -80,6 +80,29 @@ $mpvSpace [
]
```
### JSON Stdio Translator
Executes a command, parses its JSON output, converts to record `<recv @jsonData any>`, and publishes and messages it to a dataspace.
```
# Configuration example
<require-service <daemon syndesizer>>
let ?ds = dataspace
<bind <ref {oid: "syndicate" key: #x""}> $ds #f>
? <service-object <daemon syndesizer> ?cap> [
$cap <json-stdio-translator {
argv: [
"yt-dlp"
"--dump-json"
"https://youtu.be/RR9GkEXDvog"
]
dataspace: $ds
}>
]
```
### Webooks
Listens for webhook requests and sends request data to a dataspace as messages.
@ -106,10 +129,6 @@ Request data is formated according to the http schema [defined in syndicate-prot
---
## json_translator
Wrapper that executes a command, parses its JSON output, converts to Preserves record `<recv @jsonData any>`, and publishes and messages to its initial dataspace.
## mintsturdyref
A utility for minting [Sturdyrefs](https://synit.org/book/operation/builtin/gatekeeper.html#sturdyrefs).

View File

@ -6,6 +6,11 @@ CacheArguments = <cache {
lifetime: float
}>.
JsonTranslatorArguments = <json-stdio-translator {
argv: [string ...]
dataspace: #!any
}>.
JsonTranslatorConnected = <connected @path string>.
JsonSocketTranslatorArguments = <json-socket-translator {

View File

@ -1,31 +0,0 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[json, os, osproc]
import preserves
import syndicate, syndicate/relays
from preserves/jsonhooks import toPreservesHook
import ./json_messages
proc runChild: string =
let params = commandLineParams()
if params.len < 1:
stderr.writeLine "not enough parameters"
quit 1
let
cmd = params[0]
args = params[1..params.high]
try: result = execProcess(command=cmd, args=args, options={poUsePath})
except CatchableError as err:
quit("execProcess failed: " & err.msg)
if result == "":
stderr.writeLine "no ouput"
quit 1
runActor("main") do (ds: Cap; turn: var Turn):
connectStdio(turn, ds)
let js = runChild().parseJson()
message(turn, ds, RecvJson(data: js))
discard publish(turn, ds, RecvJson(data: js))

View File

@ -3,6 +3,13 @@ import
preserves, std/tables
type
JsonTranslatorArgumentsField0* {.preservesDictionary.} = object
`argv`*: seq[string]
`dataspace`* {.preservesEmbedded.}: EmbeddedRef
JsonTranslatorArguments* {.preservesRecord: "json-stdio-translator".} = object
`field0`*: JsonTranslatorArgumentsField0
JsonTranslatorConnected* {.preservesRecord: "connected".} = object
`path`*: string
@ -31,13 +38,15 @@ type
`host`*: string
`port`*: BiggestInt
proc `$`*(x: JsonTranslatorConnected | JsonSocketTranslatorArguments |
proc `$`*(x: JsonTranslatorArguments | JsonTranslatorConnected |
JsonSocketTranslatorArguments |
WebhooksArguments |
CacheArguments |
Tcp): string =
`$`(toPreserves(x))
proc encode*(x: JsonTranslatorConnected | JsonSocketTranslatorArguments |
proc encode*(x: JsonTranslatorArguments | JsonTranslatorConnected |
JsonSocketTranslatorArguments |
WebhooksArguments |
CacheArguments |
Tcp): seq[byte] =

View File

@ -6,11 +6,12 @@
import syndicate, syndicate/relays, syndicate/actors/timers
import ./syndesizer/[
cache_actor, json_socket_translator, webhooks]
cache_actor, json_socket_translator, json_translator, webhooks]
runActor("syndesizer") do (turn: var Turn; root: Cap):
connectStdio(turn, root)
discard spawnTimers(turn, root)
discard spawnCacheActor(turn, root)
discard spawnJsonSocketTranslator(turn, root)
discard spawnJsonStdioTranslator(turn, root)
discard spawnWebhookActor(turn, root)

View File

@ -0,0 +1,33 @@
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[json, osproc]
import preserves
import syndicate, syndicate/relays
import ../schema/config
import ../json_messages
proc runChild(params: seq[string]): string =
if params.len < 1:
stderr.writeLine "not enough parameters"
let
cmd = params[0]
args = params[1..params.high]
try: result = execProcess(command=cmd, args=args, options={poUsePath})
except CatchableError as err:
quit("execProcess failed: " & err.msg)
if result == "":
stderr.writeLine "no ouput"
proc spawnJsonStdioTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
spawn("json-stdio-translator", turn) 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)

View File

@ -5,7 +5,7 @@ author = "Emery Hemingway"
description = "Utilites for Syndicated Actors and Synit"
license = "unlicense"
srcDir = "src"
bin = @["json_translator", "mintsturdyref", "mount_actor", "msg", "net_mapper", "preserve_process_environment", "syndex_card", "syndump"]
bin = @["mintsturdyref", "mount_actor", "msg", "net_mapper", "preserve_process_environment", "syndex_card", "syndump"]
# Dependencies