add method
Adds a data event to the sink.
Must not be called on a closed sink.
Implementation
@override
void add(Uint8List bytesIn) {
parserBuffer.receive(bytesIn); // optional optimize by checking fragment state first
try {
// while - potentially 1+ packets queued, do while HeaderStatus(isPacketComplete: false)
while (parserBuffer.viewAsBytes.isNotEmpty) {
switch (parserBuffer.status) {
case HeaderStatus(isStartValid: false):
parserBuffer.seekStart();
case HeaderStatus(isIdValid: false):
throw PacketStatusException.meta;
// isFullLength
case HeaderStatus(isPacketComplete: true):
parserBuffer.completePacket(); // set length for checksum operation
switch (parserBuffer.status.isChecksumValid) {
case true || null: // null when no checksum implemented
// pass on the packet
_outputSink.add(parserBuffer.viewAsPacket); // data pointer is either from Link, or remainderBuffer
// transformed stream handles using same headerView before continuing
parserBuffer.seekTrailing(); // if excess packets queued, repeat parsing loop with trailing buffer as new buffer
case false:
throw PacketStatusException.checksum;
}
// in case of [sync][sync], todo check before check complete
case HeaderStatus(isLengthValid: false):
throw PacketStatusException.meta;
/// no recognizable id, or recognized as incomplete
case HeaderStatus(isPacketComplete: false):
assert(parserBuffer.length < parserBuffer.packetClass.lengthMax); // should be caught by isLengthValid
return;
}
}
} on PacketStatusException catch (e) {
// unparsable error
switch (e) {
case PacketStatusException.meta:
parserBuffer.clear(); // ensure remainder buffer is cleared this way
case PacketStatusException.checksum:
parserBuffer.seekTrailing();
}
_outputSink.addError(e);
}
}