3 namespace seekat\API\Call
;
7 Client
, Client\Request
, Client\Response
9 use React\Promise\ExtendedPromiseInterface
;
14 class Deferred
extends \React\Promise\Deferred
implements SplObserver
17 * The response importer
38 * The executed request
45 * The promised response
52 * Create a deferred promise for the response of $request
54 * @param API $api The endpoint of the request
55 * @param Request $request The request to execute
56 * @param Cache\Service $cache
58 function __construct(API
$api, Request
$request, Cache\Service
$cache = null) {
59 parent
::__construct(function ($resolve, $reject) {
60 return $this->cancel($resolve, $reject);
63 $this->request
= $request;
64 $this->client
= $api->getClient();
65 $this->result
= new Result($api);
66 $this->cache
= new Cache($cache);
68 if ($this->cache
->load($this->request
, $cached)) {
69 $api->getLogger()->info("deferred -> cached", [
70 "method" => $request->getRequestMethod(),
71 "url" => $request->getRequestUrl(),
74 $this->response
= $cached;
80 $this->client
->attach($this);
81 $this->client
->enqueue($this->request
, function(Response
$response) use($cached) {
82 if ($response->getResponseCode() == 304) {
83 $this->response
= $cached;
85 $this->response
= $response;
93 $api->getLogger()->info("deferred -> enqueued", [
94 "method" => $request->getRequestMethod(),
95 "url" => $request->getRequestUrl(),
98 $this->client
->once();
105 * Import the response's data on success and resolve the promise.
107 * @param SplSubject $client The observed HTTP client
108 * @param Request $request The request which generated the update
109 * @param object $progress The progress information
111 function update(SplSubject
$client, Request
$request = null, $progress = null) {
112 if ($request !== $this->request
) {
116 $this->notify((object) compact("client", "request", "progress"));
120 * Completion callback
121 * @param callable $resolve
122 * @param callable $reject
124 private function complete(callable
$resolve, callable
$reject) {
125 $this->client
->detach($this);
127 if ($this->response
) {
129 $api = ($this->result
)($this->response
);
131 $this->cache
->save($this->request
, $this->response
);
134 } catch (Exception
$e) {
138 $reject($this->client
->getTransferInfo($this->request
)->error
);
143 * Cancellation callback
144 * @param callable $resolve
145 * @param callable $reject
147 private function cancel(callable
$resolve, callable
$reject) {
148 /* did we finish in the meantime? */
149 if ($this->response
) {
150 $this->complete($resolve, $reject);
152 $this->client
->detach($this);
153 $this->client
->dequeue($this->request
);
154 $reject("Cancelled");