rateLimit method

bool rateLimit(
  1. String tag,
  2. Duration duration,
  3. VoidCallback onExecute, {
  4. VoidCallback? onAfter,
})

Will execute onExecute immediately and record additional attempts to call rateLimit with the same tag happens until the given duration has passed when it will execute with the last attempt.

tag is any arbitrary String, and is used to identify this particular rate limited operation in subsequent calls to rateLimit() or cancel().

duration is the amount of time until the subsequent attempts will be sent.

onAfter is executed after the duration has passed in which there were no rate limited calls.

Returns whether the operation was rate limited

Implementation

bool rateLimit(
  String tag,
  Duration duration,
  VoidCallback onExecute, {
  VoidCallback? onAfter,
}) {
  final rateLimited = _rateLimitOperations.containsKey(tag);
  if (rateLimited) {
    _rateLimitOperations[tag]?.callback = onExecute;
    _rateLimitOperations[tag]?.onAfter = onAfter;
    return true;
  }

  final operation = _InnerOperation(
    timer: Timer.periodic(duration, (Timer timer) {
      final operation = _rateLimitOperations[tag];

      if (operation != null) {
        operation.callback();
        if (operation.onAfter != null) {
          operation.onAfter!();
        }
        operation.callback = () {};
        operation.onAfter = null;
      }
    }),
    callback: onExecute,
    onAfter: onAfter,
  );

  _rateLimitOperations[tag] = operation;

  onExecute();

  return false;
}