1.1.7 • Published 2 years ago

buffer-descriptors v1.1.7

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

Buffer Descriptors

This library provides ways to describe the format of a buffers. These descriptors can be quite easy like describing number or strings with fixed or variable lengths, but also provides the possibility to describe quite complex ones, like arrays, subformats or stopConditions and lookups. The created descriptor can then be used to parse the buffers according to the descriptor.

Installation

  npm install buffer-descriptors

Usage/Examples

import { BufferDescriptor, Describe, SerializedMessage, parseBuffer } from 'buffer-descriptors'
import { Channel } from '../somewhere'

export interface ChatMessage extends SerializedMessage {
  channel: Channel
  msg: string
  timestamp: number
  fingerprint: string
  senderId: number
  senderName: string
  prefix: string
  senderAccountId: number
}

export const ChatDescriptor: BufferDescriptor<ChatMessage> = [
  Describe.header,
  Describe.number.char('channel'),
  Describe.string.chunk('msg'),
  Describe.number.int('timestamp'),
  Describe.string.chunk('fingerprint'),
  Describe.number.double('senderId'),
  Describe.string.chunk('senderName'),
  Describe.string.chunk('prefix'),
  Describe.number.int('senderAccountId'),
]

parseBuffer(myBuffer, ChatDescriptor)

Documentation

Predefined Descriptors

  • Number
    • number.char
    • number.short
    • number.int
    • number.double
    • number.customLength
  • String
    • string.fixed
    • string.variable
    • string.chunk - shortcut for length and string
  • Array
    • array.fixed
    • array.variable
    • array.chunk - shortcut for length and array
    • array.fromFixedLength - if needing actual length instead of amount
    • array.flattenedChunk
  • boolean
  • unknown
  • unknownBuffer
  • header - { msgId: number, lengthBytes: number, contentLength: number }
  • withCondition - wrapper to add conditions

Write own descriptors

See src/descriptors-types.ts for docs on the different types of descriptors. Use these interfaces to write your own descriptors. Or check src/descriptors/* for the predefined descriptors, to see how these are written.

Example

interface BufferWithString {
  stringLength: number
  myString: string
}

const StringLengthChunk: LengthChunk<BufferWithString, number> = {
  type: 'length',
  name: 'stringLength',
  transform: toNumber,
  length: 2,
}

const StringChunk: LengthChunk<BufferWithString, string> = {
  type: 'length',
  name: 'myString',
  transform: toText,
  length: {
    valueFrom: 'stringLength',
    transform: toNumber,
  },
}

const dsc: BufferDescriptor<BufferWithString> = [StringLengthChunk, StringChunk]

Optimizations

Feel free to open an issue, if you feel something is missing.

1.1.7

2 years ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.3

2 years ago

1.1.2

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.0.0

2 years ago