add method

  1. @override
void add(
  1. Uint8List bytesIn
)
override

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);
  }
}