mirror of
https://github.com/status-im/nim-libp2p.git
synced 2025-02-28 04:20:39 +00:00
use readOnce
This commit is contained in:
parent
d17997540f
commit
d521bb91e8
@ -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.}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user