// Copyright (C) 2022 WYATT GROUP // Please see the AUTHORS file for details. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . import 'dart:core'; import 'dart:math'; /// Defines some delay functions. abstract class Delay { /// Returns a delay based on the [attempt]. static Duration getRetryDelay(int attempt) { assert(attempt >= 0, 'attempt cannot be negative'); if (attempt <= 0) { return Duration.zero; } final rand = Random(); const Duration delayFactor = Duration(milliseconds: 200); const double randomizationFactor = 0.25; const Duration maxDelay = Duration(seconds: 30); final rf = randomizationFactor * (rand.nextDouble() * 2 - 1) + 1; final exp = min(attempt, 31); // prevent overflows. final delay = delayFactor * pow(2.0, exp) * rf; return delay < maxDelay ? delay : maxDelay; } }