: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
namespace Smush\Core\Api;
private $max_attempts = 5;
private $use_jitter = true;
public function __construct() {
$this->set_decider( $this->get_default_decider() );
public function run( $callback ) {
$max_attempts = $this->get_max_attempts();
$result = call_user_func( $callback );
if ( $attempt >= $max_attempts ) {
$try = call_user_func( $this->get_decider(), $result );
private function wait( $attempt ) {
usleep( $this->get_wait_time( $attempt ) * 1000 );
private function get_max_attempts() {
return $this->max_attempts;
* @param mixed $max_attempts
public function set_max_attempts( $max_attempts ) {
$this->max_attempts = max( (int) $max_attempts, 0 );
private function get_wait_time( $attempt ) {
$wait_time = $attempt == 1
: pow( 2, $attempt ) * $this->wait;
return $this->jitter( (int) $wait_time );
private function get_initial_wait() {
public function set_wait( $wait ) {
private function get_decider() {
public function set_decider( $decider ) {
$this->decider = $decider;
private function get_default_decider() {
return function ( $result ) {
return is_wp_error( $result );
private function set_jitter( $useJitter ) {
$this->use_jitter = $useJitter;
public function enable_jitter() {
$this->set_jitter( true );
public function disable_jitter() {
$this->set_jitter( false );
private function jitter_enabled() {
return $this->use_jitter;
private function jitter( $wait_time ) {
if ( ! $this->jitter_enabled() ) {
$jitter_percentage = mt_rand( 1, 20 );
$add_or_subtract = array_rand( array(
$jitter = ( $wait_time * $jitter_percentage / 100 ) * $add_or_subtract;
return $wait_time + $jitter;