it-length-prefixed
Streaming length prefixed buffers with async iterables
Table of contents
Install
$ npm i it-length-prefixed
Browser <script>
tag
Loading this module through a script tag will make it's exports available as ItLengthPrefixed
in the global namespace.
<script src="https://unpkg.com/it-length-prefixed/dist/index.min.js"></script>
Usage
import { pipe } from 'it-pipe'
import * as lp from 'it-length-prefixed'
const encoded = []
await pipe(
[uint8ArrayFromString('hello world')],
(source) => lp.encode(source),
async source => {
for await (const chunk of source) {
encoded.push(chunk.slice())
}
}
)
console.log(encoded)
const decoded = []
await pipe(
encoded,
(source) => lp.decode(source),
async source => {
for await (const chunk of source) {
decoded.push(chunk.slice())
}
}
)
console.log(decoded)
API
import {
encode, decode
} from 'it-length-prefixed'
import {
encode
} from 'it-length-prefixed/encode'
import {
decode,
MAX_LENGTH_LENGTH,
MAX_DATA_LENGTH
} from 'it-length-prefixed/decode'
encode(source, [opts])
source: Iterable<Uint8ArrayList | Uint8Array> | AsyncIterable<Uint8ArrayList | Uint8Array>
source to read bytes fromopts: Object
, optional
lengthEncoder: Function
: A function that encodes the length that will prefix each message. By default this is a varint
encoder. It is passed a value
to encode, an (optional) target
buffer to write to and an (optional) offset
to start writing from. The function should encode the value
into the target
(or alloc a new Buffer if not specified), set the lengthEncoder.bytes
value (the number of bytes written) and return the target
.
Returns Generator
or AsyncGenerator
that yields Uint8ArrayList
objects. All messages will be prefixed with a length, determined by the lengthEncoder
function.
encode.single(chunk, [opts])
chunk: Buffer|Uint8ArrayList
chunk to encodeopts: Object
, optional
lengthEncoder: Function
: See description above. Note that this encoder will not be passed a target
or offset
and so will need to allocate a buffer to write to.
Returns a Uint8ArrayList
containing the encoded chunk.
decode(source, [opts])
source: Iterable<Uint8ArrayList | Uint8Array> | AsyncIterable<Uint8ArrayList | Uint8Array>
source to read bytes fromopts: Object
, optional
maxLengthLength
: If provided, will not decode messages whose length section exceeds the size specified, if omitted will use the default of 147 bytes.maxDataLength
: If provided, will not decode messages whose data section exceeds the size specified, if omitted will use the default of 4MB.onLength(len: Number)
: Called for every length prefix that is decoded from the streamonData(data: Uint8ArrayList)
: Called for every chunk of data that is decoded from the streamlengthDecoder: Function
: A function that decodes the length that prefixes each message. By default this is a varint
decoder. It is passed some data
to decode which is a Uint8ArrayList
. The function should decode the length, set the lengthDecoder.bytes
value (the number of bytes read) and return the length. If the length cannot be decoded, the function should throw a RangeError
.
Returns Generator
or AsyncGenerator
that yields Uint8ArrayList
objects.
decode.fromReader(reader, [opts])
Behaves like decode
except it only reads the exact number of bytes needed for each message in reader
.
reader: Reader
: An it-readeropts: Object
, optional
maxLengthLength
: If provided, will not decode messages whose length section exceeds the size specified, if omitted will use the default of 147 bytes.maxDataLength
: If provided, will not decode messages whose data section exceeds the size specified, if omitted will use the default of 4MB.onData(data: Uint8ArrayList)
: Called for every chunk of data that is decoded from the streamlengthEncoder: Function
: See description above.
Returns Generator
or AsyncGenerator
that yields Uint8ArrayList
objects.
Contribute
PRs and issues gladly accepted! Check out the issues.
API Docs
License
Licensed under either of
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.