2023-05-06 19:08:38 +00:00
|
|
|
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
2022-06-09 18:15:13 +00:00
|
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
|
2024-06-04 07:54:21 +00:00
|
|
|
import
|
|
|
|
std/[json, options],
|
|
|
|
pkg/sys/[ioqueue, sockets],
|
|
|
|
pkg/preserves, pkg/preserves/jsonhooks,
|
|
|
|
pkg/syndicate, pkg/syndicate/protocols/[gatekeeper, sturdy],
|
|
|
|
../schema/[config, json_messages]
|
2022-06-09 18:15:13 +00:00
|
|
|
|
2024-04-05 13:16:03 +00:00
|
|
|
template translateSocketBody {.dirty.} =
|
|
|
|
# Template workaround for CPS and parameterized types.
|
2024-04-05 13:18:47 +00:00
|
|
|
var
|
|
|
|
guard = initGuard(facet)
|
|
|
|
dec = newBufferedDecoder(0)
|
|
|
|
buf = new string #TODO: get a pointer into the decoder
|
|
|
|
alive = true
|
2024-04-30 11:56:48 +00:00
|
|
|
proc kill(turn: Turn) =
|
2024-04-05 13:18:47 +00:00
|
|
|
alive = false
|
2024-04-30 11:56:48 +00:00
|
|
|
proc setup(turn: Turn) =
|
2024-04-05 13:18:47 +00:00
|
|
|
# Closure, not CPS.
|
|
|
|
onMessage(turn, ds, ?:SendJson) do (data: JsonNode):
|
|
|
|
if alive:
|
|
|
|
discard trampoline:
|
|
|
|
whelp write(socket[], $data & "\n")
|
|
|
|
else:
|
|
|
|
stderr.writeLine "dropped send of ", data
|
2024-06-04 07:54:21 +00:00
|
|
|
discard publish(turn, observer, ResolvedAccepted(responderSession: ds))
|
|
|
|
# Resolve the <json-socket-translator { }> step.
|
2024-04-05 13:18:47 +00:00
|
|
|
onStop(facet, kill)
|
|
|
|
run(facet, setup)
|
|
|
|
while alive:
|
|
|
|
# TODO: parse buffer
|
|
|
|
buf[].setLen(0x4000)
|
|
|
|
let n = read(socket[], buf)
|
|
|
|
if n < 1:
|
|
|
|
stderr.writeLine "socket read returned ", n
|
|
|
|
else:
|
|
|
|
buf[].setLen(n)
|
|
|
|
dec.feed(buf[])
|
|
|
|
var data = dec.parse()
|
|
|
|
if data.isSome:
|
2024-04-30 11:56:48 +00:00
|
|
|
proc send(turn: Turn) =
|
2024-04-05 13:18:47 +00:00
|
|
|
# Closure, not CPS.
|
|
|
|
message(turn, ds, initRecord("recv", data.get))
|
|
|
|
run(facet, send)
|
2024-04-05 13:16:03 +00:00
|
|
|
stderr.writeLine "close socket ", sa
|
2024-04-05 13:18:47 +00:00
|
|
|
close(socket[])
|
2023-05-05 16:38:04 +00:00
|
|
|
|
2024-06-04 07:54:21 +00:00
|
|
|
proc translateSocket(facet: Facet; sa: TcpAddress; ds, observer: Cap) {.asyncio.} =
|
2024-04-05 13:16:03 +00:00
|
|
|
var
|
|
|
|
socket = new AsyncConn[Protocol.Tcp]
|
|
|
|
conn = connectTcpAsync(sa.host, Port sa.port)
|
|
|
|
socket[] = conn
|
|
|
|
translateSocketBody()
|
|
|
|
|
2024-06-04 07:54:21 +00:00
|
|
|
proc translateSocket(facet: Facet; sa: UnixAddress; ds, observer: Cap) {.asyncio.} =
|
2024-04-05 13:16:03 +00:00
|
|
|
var
|
|
|
|
socket = new AsyncConn[Protocol.Unix]
|
|
|
|
conn = connectUnixAsync(sa.path)
|
|
|
|
socket[] = conn
|
|
|
|
translateSocketBody()
|
|
|
|
|
2024-06-04 07:54:21 +00:00
|
|
|
proc spawnJsonSocketTranslator*(turn: Turn; relay: Cap): Actor {.discardable.} =
|
|
|
|
let pat = Resolve?:{ 0: JsonSocketTranslatorStep.grabTypeFlat, 1: grab() }
|
2024-04-30 11:56:48 +00:00
|
|
|
spawnActor(turn, "json-socket-translator") do (turn: Turn):
|
2024-06-04 07:54:21 +00:00
|
|
|
during(turn, relay, pat) do (sa: TcpAddress, observer: Cap):
|
2024-04-30 11:56:48 +00:00
|
|
|
linkActor(turn, "json-socket-translator") do (turn: Turn):
|
2024-06-04 07:54:21 +00:00
|
|
|
let ds = turn.newDataspace()
|
2024-04-05 13:16:03 +00:00
|
|
|
discard trampoline:
|
2024-06-04 07:54:21 +00:00
|
|
|
whelp translateSocket(turn.facet, sa, ds, observer)
|
|
|
|
during(turn, relay, pat) do (sa: UnixAddress, observer: Cap):
|
2024-04-30 11:56:48 +00:00
|
|
|
linkActor(turn, "json-socket-translator") do (turn: Turn):
|
2024-06-04 07:54:21 +00:00
|
|
|
let ds = turn.newDataspace()
|
2024-04-05 13:18:47 +00:00
|
|
|
discard trampoline:
|
2024-06-04 07:54:21 +00:00
|
|
|
whelp translateSocket(turn.facet, sa, ds, observer)
|
2023-12-25 23:11:54 +00:00
|
|
|
|
|
|
|
when isMainModule:
|
2024-04-05 13:18:47 +00:00
|
|
|
import syndicate/relays
|
2024-04-30 11:56:48 +00:00
|
|
|
runActor("main") do (turn: Turn):
|
2024-06-04 07:54:21 +00:00
|
|
|
resolveEnvironment(turn) do (turn: Turn; relay: Cap):
|
|
|
|
spawnJsonSocketTranslator(turn, relay)
|