From a40cdbce2ce26775d0be94d6988d8c26740515bc Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 4 Jun 2024 10:54:21 +0300 Subject: [PATCH] json_socket_translator: convert to gatekeeper protocol --- README.md | 34 +++++++++------------- config.prs | 5 +--- src/schema/config.nim | 22 ++++++-------- src/syndesizer/json_socket_translator.nim | 35 +++++++++++++---------- 4 files changed, 43 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index dbe3a7c..3d7b68d 100644 --- a/README.md +++ b/README.md @@ -88,8 +88,7 @@ $http [ ### JSON Socket Translator Communicate with sockets that send and receive lines of JSON using `` and `` messages. - -Do not send messages into the dataspace configure with `` until `` is asserted. +Responds to the gatekeeper step ` / $resolver>`. ``` # MPV configuration example @@ -107,25 +106,11 @@ Do not send messages into the dataspace configure with ` -let ?mpvSpace = dataspace - -? ready> [ - > - ? ?cap> [ - $cap - }> - ] -] - -$mpvSpace [ - +let ?resolver = dataspace +$resolver ? $mpvSpace [ # announce the dataspace when the translator is connected - ? [ - $config - $config $mpvSpace #f> - ] + $config + $config $mpvSpace #f> # translate to an MPV command ?? [ @@ -137,6 +122,15 @@ $mpvSpace [ ! ] ] + +? ready> [ + > + ? ?cap> [ + $cap + }> $resolver> + ] +] ``` ### JSON Stdio Translator diff --git a/config.prs b/config.prs index c683a91..1dd9f05 100644 --- a/config.prs +++ b/config.prs @@ -19,8 +19,6 @@ JsonTranslatorArguments = . -JsonTranslatorConnected = . - TcpAddress = . UnixAddress = . @@ -34,8 +32,7 @@ HttpDriverArguments = . -JsonSocketTranslatorArguments = . diff --git a/src/schema/config.nim b/src/schema/config.nim index 05fe11b..6b3d955 100644 --- a/src/schema/config.nim +++ b/src/schema/config.nim @@ -40,16 +40,6 @@ type Base64DecoderArguments* {.preservesRecord: "base64-decoder".} = object `field0`*: Base64DecoderArgumentsField0 - JsonTranslatorConnected* {.preservesRecord: "connected".} = object - `address`*: SocketAddress - - JsonSocketTranslatorArgumentsField0* {.preservesDictionary.} = object - `dataspace`* {.preservesEmbedded.}: EmbeddedRef - `socket`*: SocketAddress - - JsonSocketTranslatorArguments* {.preservesRecord: "json-socket-translator".} = object - `field0`*: JsonSocketTranslatorArgumentsField0 - XsltArgumentsField0* {.preservesDictionary.} = object `dataspace`* {.preservesEmbedded.}: EmbeddedRef @@ -62,6 +52,12 @@ type HttpDriverArguments* {.preservesRecord: "http-driver".} = object `field0`*: HttpDriverArgumentsField0 + JsonSocketTranslatorStepField0* {.preservesDictionary.} = object + `socket`*: SocketAddress + + JsonSocketTranslatorStep* {.preservesRecord: "json-socket-translator".} = object + `field0`*: JsonSocketTranslatorStepField0 + WebhooksArgumentsField0* {.preservesDictionary.} = object `endpoints`*: Table[seq[string], EmbeddedRef] `listen`*: Tcp @@ -131,10 +127,9 @@ type proc `$`*(x: WebsocketArguments | HttpClientArguments | JsonTranslatorArguments | SocketAddress | Base64DecoderArguments | - JsonTranslatorConnected | - JsonSocketTranslatorArguments | XsltArguments | HttpDriverArguments | + JsonSocketTranslatorStep | WebhooksArguments | FileSystemUsageArguments | SqliteArguments | @@ -153,10 +148,9 @@ proc encode*(x: WebsocketArguments | HttpClientArguments | JsonTranslatorArguments | SocketAddress | Base64DecoderArguments | - JsonTranslatorConnected | - JsonSocketTranslatorArguments | XsltArguments | HttpDriverArguments | + JsonSocketTranslatorStep | WebhooksArguments | FileSystemUsageArguments | SqliteArguments | diff --git a/src/syndesizer/json_socket_translator.nim b/src/syndesizer/json_socket_translator.nim index 5253abe..a64b921 100644 --- a/src/syndesizer/json_socket_translator.nim +++ b/src/syndesizer/json_socket_translator.nim @@ -1,11 +1,12 @@ # SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense -import std/[json, options] -import pkg/sys/[ioqueue, sockets] -import preserves, preserves/jsonhooks, syndicate - -import ../schema/[config, json_messages] +import + std/[json, options], + pkg/sys/[ioqueue, sockets], + pkg/preserves, pkg/preserves/jsonhooks, + pkg/syndicate, pkg/syndicate/protocols/[gatekeeper, sturdy], + ../schema/[config, json_messages] template translateSocketBody {.dirty.} = # Template workaround for CPS and parameterized types. @@ -24,7 +25,8 @@ template translateSocketBody {.dirty.} = whelp write(socket[], $data & "\n") else: stderr.writeLine "dropped send of ", data - discard publish(turn, ds, initRecord("connected", sa.toPreserves)) + discard publish(turn, observer, ResolvedAccepted(responderSession: ds)) + # Resolve the step. onStop(facet, kill) run(facet, setup) while alive: @@ -45,33 +47,36 @@ template translateSocketBody {.dirty.} = stderr.writeLine "close socket ", sa close(socket[]) -proc translateSocket(facet: Facet; ds: Cap; sa: TcpAddress) {.asyncio.} = +proc translateSocket(facet: Facet; sa: TcpAddress; ds, observer: Cap) {.asyncio.} = var socket = new AsyncConn[Protocol.Tcp] conn = connectTcpAsync(sa.host, Port sa.port) socket[] = conn translateSocketBody() -proc translateSocket(facet: Facet; ds: Cap; sa: UnixAddress) {.asyncio.} = +proc translateSocket(facet: Facet; sa: UnixAddress; ds, observer: Cap) {.asyncio.} = var socket = new AsyncConn[Protocol.Unix] conn = connectUnixAsync(sa.path) socket[] = conn translateSocketBody() -proc spawnJsonSocketTranslator*(turn: Turn; root: Cap): Actor {.discardable.} = +proc spawnJsonSocketTranslator*(turn: Turn; relay: Cap): Actor {.discardable.} = + let pat = Resolve?:{ 0: JsonSocketTranslatorStep.grabTypeFlat, 1: grab() } spawnActor(turn, "json-socket-translator") do (turn: Turn): - during(turn, root, ?:JsonSocketTranslatorArguments) do (ds: Cap, sa: TcpAddress): + during(turn, relay, pat) do (sa: TcpAddress, observer: Cap): linkActor(turn, "json-socket-translator") do (turn: Turn): + let ds = turn.newDataspace() discard trampoline: - whelp translateSocket(turn.facet, ds, sa) - during(turn, root, ?:JsonSocketTranslatorArguments) do (ds: Cap, sa: UnixAddress): + whelp translateSocket(turn.facet, sa, ds, observer) + during(turn, relay, pat) do (sa: UnixAddress, observer: Cap): linkActor(turn, "json-socket-translator") do (turn: Turn): + let ds = turn.newDataspace() discard trampoline: - whelp translateSocket(turn.facet, ds, sa) + whelp translateSocket(turn.facet, sa, ds, observer) when isMainModule: import syndicate/relays runActor("main") do (turn: Turn): - resolveEnvironment(turn) do (turn: Turn; ds: Cap): - spawnJsonSocketTranslator(turn, ds) + resolveEnvironment(turn) do (turn: Turn; relay: Cap): + spawnJsonSocketTranslator(turn, relay)