Airbreaks-Low-Power/Programming/Javascript/node_modules/@serialport/parser-byte-length/lib/index.js
2023-12-19 18:30:36 -06:00

56 lines
1.5 KiB
JavaScript

const { Transform } = require('stream')
/**
* Emit data every number of bytes
* @extends Transform
* @param {Object} options parser options object
* @param {Number} options.length the number of bytes on each data event
* @summary A transform stream that emits data as a buffer after a specific number of bytes are received. Runs in O(n) time.
* @example
const SerialPort = require('serialport')
const ByteLength = require('@serialport/parser-byte-length')
const port = new SerialPort('/dev/tty-usbserial1')
const parser = port.pipe(new ByteLength({length: 8}))
parser.on('data', console.log) // will have 8 bytes per data event
*/
class ByteLengthParser extends Transform {
constructor(options = {}) {
super(options)
if (typeof options.length !== 'number') {
throw new TypeError('"length" is not a number')
}
if (options.length < 1) {
throw new TypeError('"length" is not greater than 0')
}
this.length = options.length
this.position = 0
this.buffer = Buffer.alloc(this.length)
}
_transform(chunk, encoding, cb) {
let cursor = 0
while (cursor < chunk.length) {
this.buffer[this.position] = chunk[cursor]
cursor++
this.position++
if (this.position === this.length) {
this.push(this.buffer)
this.buffer = Buffer.alloc(this.length)
this.position = 0
}
}
cb()
}
_flush(cb) {
this.push(this.buffer.slice(0, this.position))
this.buffer = Buffer.alloc(this.length)
cb()
}
}
module.exports = ByteLengthParser