Scodec-stream is a library for streaming binary encoding and decoding. It is built atop scodec and fs2. Here's a brief example of its use:
import scodec.codecs._
import scodec.stream._
import scodec.bits._
import cats.effect.{Blocker, IO}
val frames: StreamDecoder[ByteVector] = StreamDecoder.many(int32)
.flatMap { numBytes => StreamDecoder.once(bytes(numBytes)) }
val s: Stream[IO, ByteVector] =
Stream.resource(Blocker[IO]).flatMap { blocker =>
fs2.io.file.readAll[IO](filePath, blocker, 4096).through(streamThroughRecordsOnly.toPipeByte)
}
When consumed, s
will incrementally read chunks from "largefile.bin"
, then decode a stream of frames, where each frame is expected to begin with a number of bytes specified as a 32-bit signed int (the int32
codec), followed by a frame payload of that many bytes. Nothing happens until the s
stream is consumed, and s
will ensure the file is closed in the event of an error or normal termination of the consumer.
See the MPEG PCAP decoding example for a more sophisticated use case.
Links:
- Administrative
- Getting Binaries
- API docs
- scodec-protocols has useful streaming encoders and decoders for various domains and is a nice place to look for examples of the library in use.
This project is licensed under a 3-clause BSD license.
People are expected to follow the Typelevel Code of Conduct when discussing scodec on the Github page, Gitter channel, mailing list, or other venues.
Concerns or issues can be sent to Michael Pilquist ([email protected]) or to Typelevel.
See the releases page on the website.
See the Code of Conduct.