Package Exports
- it-length-prefixed
- it-length-prefixed/decode
- it-length-prefixed/encode
Readme
it-length-prefixed
Streaming length prefixed buffers with async iterables
Table of contents
Install
$ npm i it-length-prefixedUsage
import { pipe } from 'it-pipe'
import * as lp from 'it-length-prefixed'
const encoded = []
// encode
await pipe(
[uint8ArrayFromString('hello world')],
lp.encode(),
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
lp.decode(),
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>]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([opts])
opts: Object, optionallengthEncoder: Function: A function that encodes the length that will prefix each message. By default this is avarintencoder. It is passed avalueto encode, an (optional)targetbuffer to write to and an (optional)offsetto start writing from. The function should encode thevalueinto thetarget(or alloc a new Buffer if not specified), set thelengthEncoder.bytesvalue (the number of bytes written) and return thetarget.
Returns a transform that yields Uint8ArrayList objects. All messages will be prefixed with a length, determined by the lengthEncoder function.
encode.single(chunk, [opts])
chunk: Buffer|Uint8ArrayListchunk to encodeopts: Object, optionallengthEncoder: Function: See description above. Note that this encoder will not be passed atargetoroffsetand so will need to allocate a buffer to write to.
Returns a Uint8ArrayList containing the encoded chunk.
decode([opts])
opts: 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 avarintdecoder. It is passed somedatato decode which is aUint8ArrayList. The function should decode the length, set thelengthDecoder.bytesvalue (the number of bytes read) and return the length. If the length cannot be decoded, the function should throw aRangeError.
Returns a transform 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, 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 a transform that yields Uint8ArrayList objects.
Contribute
PRs and issues gladly accepted! Check out the issues.
License
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)
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.