Streaming length prefixed buffers with async iterables
Encode/decode streams of bytes with length-prefixes.
import { pipe } from 'it-pipe'
import * as lp from 'it-length-prefixed'
const encoded = []
// encode
await pipe(
[uint8ArrayFromString('hello world')],
(source) => lp.encode(source),
async source => {
for await (const chunk of source) {
encoded.push(chunk.slice()) // (.slice converts Uint8ArrayList to Uint8Array)
}
}
)
console.log(encoded)
// => [Buffer <0b 68 65 6c 6c 6f 20 77 6f 72 6c 64>]
const decoded = []
// decode
await pipe(
encoded, // e.g. from above
(source) => lp.decode(source),
async source => {
for await (const chunk of source) {
decoded.push(chunk.slice()) // (.slice converts Uint8ArrayList to Uint8Array)
}
}
)
console.log(decoded)
// => [Buffer <68 65 6c 6c 6f 20 77 6f 72 6c 64>]
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'
source: Iterable<Uint8ArrayList | Uint8Array> | AsyncIterable<Uint8ArrayList | Uint8Array>
source to read bytes fromopts: Object
, optionallengthEncoder: Function
: A function that encodes the length that will prefix each message. By default this is avarint
encoder. It is passed avalue
to encode, an (optional)target
buffer to write to and an (optional)offset
to start writing from. The function should encode thevalue
into thetarget
(or alloc a new Buffer if not specified), set thelengthEncoder.bytes
value (the number of bytes written) and return thetarget
.
Returns Generator
or AsyncGenerator
that yields Uint8ArrayList
objects. All messages will be prefixed with a length, determined by the lengthEncoder
function.
chunk: Buffer|Uint8ArrayList
chunk to encodeopts: Object
, optionallengthEncoder: Function
: See description above. Note that this encoder will not be passed atarget
oroffset
and so will need to allocate a buffer to write to.
Returns a Uint8ArrayList
containing the encoded chunk.
source: Iterable<Uint8ArrayList | Uint8Array> | AsyncIterable<Uint8ArrayList | Uint8Array>
source to read bytes fromopts: Object
, optionalmaxLengthLength
: 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 avarint
decoder. It is passed somedata
to decode which is aUint8ArrayList
. The function should decode the length, set thelengthDecoder.bytes
value (the number of bytes read) and return the length. If the length cannot be decoded, the function should throw aRangeError
.
Returns Generator
or AsyncGenerator
that yields Uint8ArrayList
objects.
Behaves like decode
except it only reads the exact number of bytes needed for each message in reader
.
reader: Reader
: An it-readeropts: Object
, optionalmaxLengthLength
: 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.
Licensed under either of
- Apache 2.0, (LICENSE-APACHE / http://www.apache.org/licenses/LICENSE-2.0)
- MIT (LICENSE-MIT / http://opensource.org/licenses/MIT)
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.