nim-libp2p/libp2p/stream/chronosstream.nim

51 lines
1.4 KiB
Nim
Raw Normal View History

## Nim-LibP2P
2019-09-24 11:48:23 -06:00
## Copyright (c) 2019 Status Research & Development GmbH
## Licensed under either of
## * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
## * MIT license ([LICENSE-MIT](LICENSE-MIT))
## at your option.
## This file may not be copied, modified, or distributed except according to
## those terms.
2019-09-11 20:10:38 -06:00
import chronos, chronicles
2019-09-11 20:10:38 -06:00
logScope:
topic = "ChronosStream"
2020-04-12 22:26:42 -06:00
const DefaultChunkSize* = 1 shl 20 # 1MB
type ChronosStream* = ref object
reader: AsyncStreamReader
writer: AsyncStreamWriter
server: StreamServer
client: StreamTransport
2020-04-12 22:26:42 -06:00
maxChunkSize: int
closed: bool
proc init*[T](c: type[ChronosStream],
server: StreamServer,
client: StreamTransport,
maxChunkSize = DefaultChunkSize): c =
ChronosStream(server: server,
client: client,
reader: newAsyncStreamReader(client),
writer: newAsyncStreamWriter(client),
maxChunkSize)
proc close*(c: ChronosStream) =
c.closed = true
iterator source*(c: ChronosStream, size: int = c.maxChunkSize): Future[seq[byte]] =
while not c.reader.atEof():
yield c.reader.read(c.maxChunkSize)
proc sink*(c: ChronosStream,
iter: iterator(): Future[seq[byte]]):
Future[void] {.async.}=
for chunk in iter():
if c.closed:
break
await c.writer.write((await chunk))