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