api = $api; $this->client = $client; $this->request = $request; parent::__construct(function($resolve, $reject) { return $this->cancel($resolve, $reject); }); $client->attach($this); $client->enqueue($request, function(Response $response) { $this->response = $response; $this->complete( [$this, "resolve"], [$this, "reject"] ); return true; }); /* start off */ $client->once(); } /** * Progress observer * * Import the response's data on success and resolve the promise. * * @param SplSubject $client The observed HTTP client * @param Request $request The request which generated the update * @param object $progress The progress information */ function update(SplSubject $client, Request $request = null, $progress = null) { if ($request !== $this->request) { return; } $this->notify((object) compact("client", "request", "progress")); } /** * Completion callback * @param callable $resolve * @param callable $reject */ private function complete(callable $resolve, callable $reject) { $this->client->detach($this); if ($this->response) { try { $resolve($this->api->import($this->response)); } catch (Exception $e) { $reject($e); } } else { $reject($this->client->getTransferInfo($this->request)->error); } } /** * Cancellation callback * @param callable $resolve * @param callable $reject */ private function cancel(callable $resolve, callable $reject) { /* did we finish in the meantime? */ if ($this->response) { $this->complete($resolve, $reject); } else { $this->client->detach($this); $this->client->dequeue($this->request); $reject("Cancelled"); } } }