# 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 runActor("main") do (root: Cap; turn: var Turn): connectStdio(turn, root) 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)