decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; } /** * Default exponential backoff delay function. * * @param int $retries * * @return int milliseconds. */ public static function exponentialDelay($retries) { return (int) pow(2, $retries - 1) * 1000; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options) ->then( $this->onFulfilled($request, $options), $this->onRejected($request, $options) ); } /** * Execute fulfilled closure * * @return mixed */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use ($req, $options) { if (!call_user_func( $this->decider, $options['retries'], $req, $value, null )) { return $value; } return $this->doRetry($req, $options, $value); }; } /** * Execute rejected closure * * @return callable */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use ($req, $options) { if (!call_user_func( $this->decider, $options['retries'], $req, null, $reason )) { return Promise\rejection_for($reason); } return $this->doRetry($req, $options); }; } /** * @return self */ private function doRetry(RequestInterface $request, array $options, ?ResponseInterface $response = null) { $options['delay'] = call_user_func($this->delay, ++$options['retries'], $response); return $this($request, $options); } }__halt_compiler();----SIGNATURE:----s+FhxvKX7PaBbBjURovUhuVvZsTi3Y8zLwAXD6MFFEVdp4/I7tzq8qc1TCrHicn2+v14FsjxTTDRVnpOtUBTFZTNHM8o4OTfpGNnA5feP8sV7Ef8CC3KmxH/DK6r+damf9sKNkEdex6Ug9LYSMIgJBWM6s6gYseow8Wam/MVfuBc74TFOH/msPMnqYm5arhHC6oGRTNusHsXwY4iNYQXfPuOEBpYJkdILFnIQ0vMU+GZIXZ9jLsfzzG3v44V5vYbtgxuqQmpCt4yTdBMUKCUbexBroAjgXXnXSP5qAo/mvf851lEVtE/rSUZdE2H1wbJwNC/tJ1dX4LpJDYcyqx9Dsp0NKWciHcNNmwivCT8x3moqR8jp5PQ65uvkmVvibl4oGPPMR9+RMgerbHS+fXwdxP9UYOcJlxwvSKGdqMm/wnE5natlNbjsZlZGjgfuW6WA/ngWSoTfWyi4BAuu8cPLgeG/X6UXmamp8IswRszgQC6tq8vBFWwO/TYObl0tl8RaeL8iPtwOOhU2tY1SNfNOCWWlBeM7YuJGDFT0HU0LQyCBDZ22TAGNxOpIhZwxiH6vuMtLfzpJa0LaewzljvcFbHwh9A+vM29L8EZlY0K9duh2ZY7vkngy+RCUs0wiHEw/4zAtP5Dm2fkr8g0OxIwCjTuBn9q6IZrgQfYWQwWmO0=----ATTACHMENT:----MzU5Nzk1MTYxMjQ0NzI5MCA0MjgwMTkxMTI1MDk1NTgwIDk1OTc3ODg4MzQyOTk3MzA=