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:----LCbo5fawU75CtgjzdIQglwrlH3xmyyFPkJhK5pf8egnTDp3fuXYXEYn7PwXgEic2aUjF5cDOkwaZEZDdBpNAh4u0RAhlj06Winqaawd4vCsbSYmRqjh/WOLJYPI3Y6GIjU0ePItBsejfKhbz2wZT93+dJK5aOZHJVsrPWmWi7E9aQYK3GzRrywJnQDsgrBjfbZfJKngPkGvfxNliAUu03Y9m25yEZbA4sb8IhgdKwyeFFRe5SMtrzNxfH75lg7oZH+V63UY8xmEB/ouOSkkzW+abUqDfxCr7scedgaVc/+j6kszzCtVDkXj/vTBuLwMc8Q04QkTTcTLAdv4uDKWCzPN90Og1c7zGxV0NdQi19PZqnfDvIrpoxJBgdB2NdXIYZfZJ1PMxaQn2RbFcc7xmXE8t3FuSiPG4DCBpCiPdwg6fNji8ZN6Yv/uvbI4l9/swVV3JhUB7mHj5eYK5z6/FzllGUKqADWWR+cWZ4UAR66qG3AsR4IjZ9yWmVUSM95Km7Pw2+OpG8Fq6AlqHTlxW4WknE+PrDIu044o4uSk1BrQEs2hGSuONZjDxQ9B+5OHTdnosU9oHOzz7x20MgobB7UG4qC2vAk68Y44mHWWG3ghyiBU6s8dr3C7QgSyZ5MouBeosKbmbb5UMZfTkn1Doi5kAYdRSX5756C3kjgYPe1Q=----ATTACHMENT:----MjQ4NjIwNDE1NjA2NTA4MyA5NzY2NzY1MTE5MjM3ODk4IDUzMjM3NzY0MjIyMDE5ODQ=