use readOnce

This commit is contained in:
Dmitriy Ryajov 2020-04-15 12:12:40 -06:00
parent d17997540f
commit d521bb91e8

View File

@ -7,19 +7,23 @@
## This file may not be copied, modified, or distributed except according to ## This file may not be copied, modified, or distributed except according to
## those terms. ## those terms.
# {.push raises: [].}
import chronos, chronicles import chronos, chronicles
import stream, ringbuffer import stream
logScope: logScope:
topic = "ChronosStream" topic = "ChronosStream"
const DefaultChunkSize* = 1 shl 20 # 1MB const DefaultChunkSize* = 1 shl 20 # 1MB
# const DefaultChunkSize* = 10
type ChronosStream* = ref object of Stream type ChronosStream* = ref object of Stream
reader: AsyncStreamReader reader: AsyncStreamReader
writer: AsyncStreamWriter writer: AsyncStreamWriter
server: StreamServer server: StreamServer
client: StreamTransport client: StreamTransport
eof: bool
buffer: seq[byte] buffer: seq[byte]
maxChunkSize: int maxChunkSize: int
@ -36,14 +40,18 @@ proc init*(C: type[ChronosStream],
buffer: newSeq[byte](maxChunkSize)) buffer: newSeq[byte](maxChunkSize))
proc internalRead(c: ChronosStream): Future[seq[byte]] {.async.} = proc internalRead(c: ChronosStream): Future[seq[byte]] {.async.} =
var buff = newSeq[byte](1024) var read = await c.reader.readOnce(addr c.buffer[0], c.buffer.len)
var read = await c.reader.readOnce(unsafeAddr buff[0], buff.len) if read <= 0:
result = buff[0..<read] c.eof = true
return
result = c.buffer[0..<read]
method source*(c: ChronosStream): Source[seq[byte]] = method source*(c: ChronosStream): Source[seq[byte]] =
return iterator(): Future[seq[byte]] = return iterator(): Future[seq[byte]] =
while not c.reader.atEof(): while not c.atEof():
yield c.internalRead() yield c.internalRead()
echo c.buffer
method sink*(c: ChronosStream): Sink[seq[byte]] = method sink*(c: ChronosStream): Sink[seq[byte]] =
return proc(i: Source[seq[byte]]) {.async.} = return proc(i: Source[seq[byte]]) {.async.} =
@ -55,7 +63,7 @@ method sink*(c: ChronosStream): Sink[seq[byte]] =
var cchunk = await chunk var cchunk = await chunk
await c.writer.write(cchunk) await c.writer.write(cchunk)
method close*(c: ChronosStream) {.async.} = proc close*(c: ChronosStream) {.async.} =
if not c.closed: if not c.closed:
trace "shutting chronos stream", address = $c.client.remoteAddress() trace "shutting chronos stream", address = $c.client.remoteAddress()
if not c.writer.closed(): if not c.writer.closed():
@ -69,5 +77,7 @@ method close*(c: ChronosStream) {.async.} =
c.isClosed = true c.isClosed = true
method atEof*(c: ChronosStream): bool = proc atEof*(c: ChronosStream): bool =
c.reader.atEof() c.eof
# {.pop.}