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