readLine function

Future<String?> readLine(
  1. AsyncBufRead reader
)

Reads a UTF-8 line from a buffered source, sans trailing \n/\r\n.

Implementation

Future<String?> readLine(AsyncBufRead reader) async {
  final bytes = BytesMut();
  while (true) {
    if (reader.buffered == 0) {
      final ok = await reader.fillBuf();
      if (!ok) {
        if (bytes.isEmpty) return null;
        break;
      }
    }
    final buf = reader.buffer;
    final nl = buf.indexOf(0x0A);
    if (nl < 0) {
      final spare = bytes.spareView(buf.length);
      spare.setRange(0, buf.length, buf);
      bytes.advance(buf.length);
      reader.consume(buf.length);
      continue;
    }
    final spare = bytes.spareView(nl);
    spare.setRange(0, nl, buf);
    bytes.advance(nl);
    reader.consume(nl + 1);
    break;
  }
  final list = bytes.asUint8List();
  final end = list.isNotEmpty && list.last == 0x0D
      ? list.length - 1
      : list.length;
  return utf8.decode(list.sublist(0, end));
}