logBuffered method

void logBuffered(
  1. Object identifier,
  2. MessagesBlockLogger messagesBlockLogger,
  3. Level level,
  4. String message,
)

Implementation

void logBuffered(
  Object identifier,
  MessagesBlockLogger messagesBlockLogger,
  logging.Level level,
  String message,
) {
  final buffer = _buffers[identifier] ??= [];

  if (buffer.isEmpty) {
    buffer.add((level, [message]));
  } else {
    var levelBuffer = buffer.last;
    if (levelBuffer.$1 == level) {
      levelBuffer.$2.add(message);
    } else {
      buffer.add((level, [message]));
    }
  }

  Future<void>? call;

  call =
      _bufferedCalls[identifier] ??= Future.delayed(
        Duration(milliseconds: 100),
        () async {
          for (var levelBlock in buffer) {
            var level = levelBlock.$1;
            var messages = levelBlock.$2;
            messagesBlockLogger(level, messages);
          }

          buffer.clear();

          var prevCall = _bufferedCalls[identifier];
          if (identical(prevCall, call)) {
            _bufferedCalls[identifier] = null;
          }
        },
      );
}