initial commit of actions

This commit is contained in:
Dominik Polakovics Polakovics 2026-01-31 18:56:04 +01:00
commit 949ece5785
44660 changed files with 12034344 additions and 0 deletions

View file

@ -0,0 +1,49 @@
# binary-parse-stream
Painless streaming binary protocol parsers using generators.
## Installation
npm install binary-parse-stream
## Synchronous
This module uses the exact same generator interface as [binary-parse-stream](https://github.com/nathan7/binary-parse-stream), which presents a synchronous interface to a generator parser.
## Usage
```js
const BinaryParseStream = require('binary-parse-stream')
const {One} = BinaryParseStream // -1
```
BinaryParseStream is a TransformStream that consumes buffers and outputs objects on the other end.
It expects your subclass to implement a `_parse` method that is a generator.
When your generator yields a number, it'll be fed a buffer of that length from the input.
If it yields -1, it'll be given the value of the first byte instead of a single-byte buffer.
When your generator returns, the return value will be pushed to the output side.
## Example
The following module parses a protocol that consists of a 32-bit unsigned big-endian type parameter, an unsigned 8-bit length parameter, and a buffer of the specified length.
It outputs `{type, buf}` objects.
```js
class SillyProtocolParseStream extends BinaryParseStream {
constructor(options) {
super(options)
this.count = 0
}
*_parse() {
const type = (yield 4).readUInt32BE(0, true)
const length = yield -1
const buf = yield length
this.count++
return {type, buf}
}
}
```
There is also a shorter syntax for when you don't want to explicitly subclass: `BinaryParseStream.extend(function*())`.

View file

@ -0,0 +1,96 @@
// Tweaked version of nathan7's binary-parse-stream
// (see https://github.com/nathan7/binary-parse-stream)
// Uses NoFilter instead of the readable in the original. Removes
// the ability to read -1, which was odd and un-needed.
// License for binary-parse-stream: MIT
// binary-parse-stream is now unmaintained, so I have rewritten it as
// more modern JS so I can get tsc to help check types.
'use strict'
const stream = require('stream')
const NoFilter = require('nofilter')
/**
* BinaryParseStream is a TransformStream that consumes buffers and outputs
* objects on the other end. It expects your subclass to implement a `_parse`
* method that is a generator. When your generator yields a number, it'll be
* fed a buffer of that length from the input. When your generator returns,
* the return value will be pushed to the output side.
*
* @extends stream.Transform
*/
class BinaryParseStream extends stream.Transform {
/**
* Creates an instance of BinaryParseStream.
*
* @param {stream.TransformOptions} options Stream options.
* @memberof BinaryParseStream
*/
constructor(options) {
super(options)
// Doesn't work to pass these in as opts, for some reason
// also, work around typescript not knowing TransformStream internals
// eslint-disable-next-line dot-notation
this['_writableState'].objectMode = false
// eslint-disable-next-line dot-notation
this['_readableState'].objectMode = true
this.bs = new NoFilter()
this.__restart()
}
_transform(fresh, encoding, cb) {
this.bs.write(fresh)
while (this.bs.length >= this.__needed) {
let ret = null
const chunk = (this.__needed === null) ?
undefined :
this.bs.read(this.__needed)
try {
ret = this.__parser.next(chunk)
} catch (e) {
return cb(e)
}
if (this.__needed) {
this.__fresh = false
}
if (ret.done) {
this.push(ret.value)
this.__restart()
} else {
this.__needed = ret.value || Infinity
}
}
return cb()
}
/**
* Subclasses must override this to set their parsing behavior. Yield a
* number to receive a Buffer of that many bytes.
*
* @abstract
* @returns {Generator<number, undefined, Buffer>}
*/
/* istanbul ignore next */
*_parse() { // eslint-disable-line class-methods-use-this, require-yield
throw new Error('Must be implemented in subclass')
}
__restart() {
this.__needed = null
this.__parser = this._parse()
this.__fresh = true
}
_flush(cb) {
cb(this.__fresh ? null : new Error('unexpected end of input'))
}
}
module.exports = BinaryParseStream