decode static method
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,
);
}
}