decode static method

void decode(
  1. Uint8List payload,
  2. void visit(
    1. WalOpKind kind,
    2. Uint8List key,
    3. Uint8List? value
    )
)

Decodes a frame payload, visiting operations in order.

Key and value slices point into payload; do not mutate it while using them. Throws VxsFormatException on malformed input.

Implementation

static void decode(
  Uint8List payload,
  void Function(WalOpKind kind, Uint8List key, Uint8List? value) visit,
) {
  final count = VxsVarint.decode(payload, 0, payload.length);
  var pos = count.next;
  for (var i = 0; i < count.value; i++) {
    if (pos >= payload.length) {
      throw VxsFormatException('truncated WAL batch', offset: pos);
    }
    final kind = WalOpKind.fromCode(payload[pos++]);
    final keyLength = VxsVarint.decode(payload, pos, payload.length);
    pos = keyLength.next;
    if (keyLength.value < 0 || keyLength.value > payload.length - pos) {
      throw VxsFormatException('WAL key overruns the batch', offset: pos);
    }
    final keyEnd = pos + keyLength.value;
    final key = Uint8List.sublistView(payload, pos, keyEnd);
    pos = keyEnd;
    final valueLength = VxsVarint.decode(payload, pos, payload.length);
    pos = valueLength.next;
    Uint8List? value;
    if (kind == WalOpKind.put) {
      if (valueLength.value < 0 || valueLength.value > payload.length - pos) {
        throw VxsFormatException('WAL value overruns the batch', offset: pos);
      }
      final valueEnd = pos + valueLength.value;
      value = Uint8List.sublistView(payload, pos, valueEnd);
      pos = valueEnd;
    } else if (valueLength.value != 0) {
      throw VxsFormatException(
        'delete op carries ${valueLength.value} value bytes',
        offset: pos,
      );
    }
    visit(kind, key, value);
  }
  if (pos != payload.length) {
    throw VxsFormatException(
      '${payload.length - pos} trailing bytes in WAL batch',
      offset: pos,
    );
  }
}