Use binary Preserves over stdio
This commit is contained in:
parent
fa5a4a9cbc
commit
68a742797c
|
@ -1,7 +1,7 @@
|
|||
# SPDX-FileCopyrightText: ☭ 2021 Emery Hemingway
|
||||
# SPDX-License-Identifier: Unlicense
|
||||
|
||||
import std/[asyncdispatch, options, tables]
|
||||
import std/[asyncdispatch, options, streams, tables]
|
||||
import preserves
|
||||
import ./actors, ./durings, ./membranes, ./protocols/[protocol, sturdy]
|
||||
|
||||
|
@ -232,7 +232,7 @@ proc dispatch(relay: Relay; v: Preserve[WireRef]) =
|
|||
of PacketKind.Extension:
|
||||
discard
|
||||
else:
|
||||
stderr.writeLine "discarding unparsed packet ", v
|
||||
stderr.writeLine "discarding undecoded packet ", v
|
||||
|
||||
type
|
||||
RelayOptions = object of RootObj
|
||||
|
@ -350,12 +350,13 @@ proc connectUnix*(turn: var Turn; path: string; cap: SturdyRef; bootProc: Connec
|
|||
|
||||
import std/asyncfile
|
||||
|
||||
const stdinReadSize = 128
|
||||
|
||||
proc connectStdio*(ds: Ref; turn: var Turn) =
|
||||
## Connect to an external dataspace over stdin and stdout.
|
||||
proc stdoutWriter(packet: sink Packet): Future[void] {.async.} =
|
||||
# var buf = encode(packet)
|
||||
# doAssert writeBytes(stdout, buf, 0, buf.len) == buf.len
|
||||
write(stdout, packet)
|
||||
var buf = encode(packet)
|
||||
doAssert writeBytes(stdout, buf, 0, buf.len) == buf.len
|
||||
flushFile(stdout)
|
||||
var opts = RelayActorOptions(
|
||||
packetWriter: stdoutWriter,
|
||||
|
@ -367,15 +368,27 @@ proc connectStdio*(ds: Ref; turn: var Turn) =
|
|||
asyncStdin = openAsync("/dev/stdin")
|
||||
facet.actor.atExit do (turn: var Turn):
|
||||
close(asyncStdin)
|
||||
var wireBuf = newStringStream()
|
||||
proc recvCb(pktFut: Future[string]) {.gcsafe.} =
|
||||
if pktFut.failed: discard
|
||||
else:
|
||||
let buf = pktFut.read
|
||||
if not pktFut.failed:
|
||||
var buf = pktFut.read
|
||||
if buf.len == 0:
|
||||
run(facet) do (turn: var Turn): stopActor(turn)
|
||||
else:
|
||||
var v = parsePreserves(buf)
|
||||
dispatch(relay, cast[Preserve[WireRef]](v))
|
||||
callSoon: asyncStdin.readLine().addCallback(recvCb)
|
||||
var decodePos: int
|
||||
if wireBuf.atEnd:
|
||||
wireBuf.setPosition(0)
|
||||
wireBuf.data = move buf
|
||||
else:
|
||||
decodePos = wireBuf.getPosition
|
||||
wireBuf.data.add(buf)
|
||||
try:
|
||||
while not wireBuf.atEnd:
|
||||
decodePos = wireBuf.getPosition
|
||||
var pr = decodePreserves(wireBuf, WireRef)
|
||||
dispatch(relay, pr)
|
||||
except IOError, ValueError:
|
||||
wireBuf.setPosition(decodePos)
|
||||
callSoon: asyncStdin.read(stdinReadSize).addCallback(recvCb)
|
||||
# do not process the next line immediately
|
||||
asyncStdin.readLine().addCallback(recvCb)
|
||||
asyncStdin.read(stdinReadSize).addCallback(recvCb)
|
||||
|
|
Loading…
Reference in New Issue