# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense import std/[asyncdispatch, asyncnet, json] from std/nativesockets import AF_UNIX, SOCK_STREAM, Protocol import preserves, preserves/jsonhooks, syndicate, syndicate/relays import ./schema/config, ./json_messages proc spawnJsonSocketTranslator*(turn: var Turn; root: Cap): Actor = spawn("json_socket_translator", turn) do (turn: var Turn): during(turn, root, ?:JsonSocketTranslatorArguments) do (ds: Cap, socketPath: string): let socket = newAsyncSocket( domain = AF_UNIX, sockType = SOCK_STREAM, protocol = cast[Protocol](0), buffered = false, ) addCallback(connectUnix(socket, socketPath), turn) do (turn: var Turn): let a = JsonTranslatorConnected(path: socketPath) discard publish(turn, ds, a) let socketFacet = turn.facet proc processOutput(fut: Future[string]) {.gcsafe.} = run(socketFacet) do (turn: var Turn): var data = fut.read.parseJson message(turn, ds, RecvJson(data: data)) socket.recvLine.addCallback(processOutput) socket.recvLine.addCallback(processOutput) onMessage(turn, ds, ?:SendJson) do (data: JsonNode): asyncCheck(turn, send(socket, $data & "\n")) do: close(socket) when isMainModule: runActor("json_socket_translator") do (turn: var Turn; root: Cap): connectStdio(turn, root) discard spawnJsonSocketTranslator(turn, root)