X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fseekat;a=blobdiff_plain;f=lib%2FAPI%2FCall.php;h=a913bdaffb6c49c4f7031576342af864960a2f84;hp=26a52ee0995fbff2807d3e4ab850ca97f157eea9;hb=HEAD;hpb=3958595e9ff27162ae918db1453ddecd4840d481 diff --git a/lib/API/Call.php b/lib/API/Call.php index 26a52ee..a913bda 100644 --- a/lib/API/Call.php +++ b/lib/API/Call.php @@ -2,121 +2,21 @@ namespace seekat\API; -use Exception; -use http\ { - Client, - Client\Request, - Client\Response -}; -use React\Promise\Deferred; +use http\Url; use seekat\API; -use SplObserver; -use SplSubject; -class Call extends Deferred implements SplObserver -{ - /** - * The endpoint - * @var API - */ - private $api; - - /** - * The HTTP client - * @var Client - */ - private $client; - - /** - * The executed request - * @var Request - */ - private $request; - - /** - * The promised response - * @var Response - */ - private $response; - - /** - * Create a deferred promise for the response of $request - * - * @param API $api The endpoint of the request - * @param Client $client The HTTP client to send the request - * @param Request $request The request to execute - */ - function __construct(API $api, Client $client, Request $request) { - $this->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")); +final class Call { + function __construct(private readonly API $api, private readonly string $call) { } - /** - * 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); - } + function __invoke(array $args) { + if ($this->api->exists($this->call."_url", $url)) { + $url = new Url(uri_template($url, (array) current($args))); + $promise = $this->api->withUrl($url)->get(...$args); } else { - $reject($this->client->getTransferInfo($this->request)->error); + $promise = $this->api->{$this->call}->get(...$args); } - } - /** - * 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"); - } + return $promise; } }