2017-02-17 08:25:19 -05:00
|
|
|
<?php declare(strict_types=1);
|
|
|
|
/**
|
|
|
|
* Hummingbird Anime List Client
|
|
|
|
*
|
2018-08-22 13:48:27 -04:00
|
|
|
* An API client for Kitsu to manage anime and manga watch lists
|
2017-02-17 08:25:19 -05:00
|
|
|
*
|
2021-02-04 11:57:01 -05:00
|
|
|
* PHP version 8
|
2017-02-17 08:25:19 -05:00
|
|
|
*
|
2022-03-04 15:50:35 -05:00
|
|
|
* @copyright 2015 - 2022 Timothy J. Warren <tim@timshome.page>
|
2017-02-17 08:25:19 -05:00
|
|
|
* @license http://www.opensource.org/licenses/mit-license.html MIT License
|
2020-12-10 17:06:50 -05:00
|
|
|
* @version 5.2
|
2022-03-04 15:50:35 -05:00
|
|
|
* @link https://git.timshome.page/timw4mail/HummingBirdAnimeClient
|
2017-02-17 08:25:19 -05:00
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Aviat\AnimeClient\API;
|
|
|
|
|
2020-03-11 16:26:17 -04:00
|
|
|
use Amp\Http\Client\Request;
|
2022-03-03 17:26:09 -05:00
|
|
|
use Generator;
|
|
|
|
use Throwable;
|
2017-12-08 22:32:00 -05:00
|
|
|
use function Amp\call;
|
2022-03-03 17:26:09 -05:00
|
|
|
|
2017-12-08 22:32:00 -05:00
|
|
|
use function Amp\Promise\{all, wait};
|
2018-12-07 10:24:42 -05:00
|
|
|
use function Aviat\AnimeClient\getApiClient;
|
2018-11-29 11:00:50 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
/**
|
|
|
|
* Class to simplify making and validating simultaneous requests
|
|
|
|
*/
|
2022-03-03 17:26:09 -05:00
|
|
|
final class ParallelAPIRequest
|
|
|
|
{
|
2017-02-17 08:25:19 -05:00
|
|
|
/**
|
|
|
|
* Set of requests to make in parallel
|
|
|
|
*/
|
2020-04-10 20:01:46 -04:00
|
|
|
private array $requests = [];
|
2017-12-08 22:32:00 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
/**
|
|
|
|
* Add a request
|
|
|
|
*/
|
2023-05-09 12:49:36 -04:00
|
|
|
public function addRequest(string|Request $request, string|int|null $key = NULL): self
|
2017-02-17 08:25:19 -05:00
|
|
|
{
|
2018-02-02 09:50:58 -05:00
|
|
|
if ($key !== NULL)
|
2017-02-17 08:25:19 -05:00
|
|
|
{
|
|
|
|
$this->requests[$key] = $request;
|
2022-03-03 17:26:09 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
return $this;
|
|
|
|
}
|
2017-12-08 22:32:00 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
$this->requests[] = $request;
|
2022-03-03 17:26:09 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
return $this;
|
|
|
|
}
|
2017-12-08 22:32:00 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
/**
|
|
|
|
* Add multiple requests
|
|
|
|
*
|
2022-03-03 17:26:09 -05:00
|
|
|
* @param Request[]|string[] $requests
|
2017-02-17 08:25:19 -05:00
|
|
|
*/
|
|
|
|
public function addRequests(array $requests): self
|
|
|
|
{
|
|
|
|
array_walk($requests, [$this, 'addRequest']);
|
2022-03-03 17:26:09 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
return $this;
|
|
|
|
}
|
2017-12-08 22:32:00 -05:00
|
|
|
|
2017-02-17 08:25:19 -05:00
|
|
|
/**
|
2018-10-01 10:50:22 -04:00
|
|
|
* Make the requests, and return the body for each
|
2017-02-17 08:25:19 -05:00
|
|
|
*
|
2019-12-09 14:34:23 -05:00
|
|
|
* @throws Throwable
|
2022-03-03 13:25:10 -05:00
|
|
|
* @return mixed[]
|
2017-02-17 08:25:19 -05:00
|
|
|
*/
|
2017-12-08 22:32:00 -05:00
|
|
|
public function makeRequests(): array
|
2017-02-17 08:25:19 -05:00
|
|
|
{
|
2018-12-07 10:24:42 -05:00
|
|
|
$client = getApiClient();
|
2018-12-06 16:21:02 -05:00
|
|
|
|
2017-12-08 22:32:00 -05:00
|
|
|
$promises = [];
|
|
|
|
|
|
|
|
foreach ($this->requests as $key => $url)
|
|
|
|
{
|
2022-03-03 17:26:09 -05:00
|
|
|
$promises[$key] = call(static function () use ($client, $url): Generator {
|
2017-12-08 22:32:00 -05:00
|
|
|
$response = yield $client->request($url);
|
2020-03-11 16:26:17 -04:00
|
|
|
return yield $response->getBody()->buffer();
|
2017-12-08 22:32:00 -05:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
return wait(all($promises));
|
2017-02-17 08:25:19 -05:00
|
|
|
}
|
2018-10-01 10:50:22 -04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Make the requests and return the response objects
|
|
|
|
*
|
2019-12-09 14:34:23 -05:00
|
|
|
* @throws Throwable
|
2022-03-03 13:25:10 -05:00
|
|
|
* @return mixed[]
|
2018-10-01 10:50:22 -04:00
|
|
|
*/
|
|
|
|
public function getResponses(): array
|
|
|
|
{
|
2018-12-07 10:24:42 -05:00
|
|
|
$client = getApiClient();
|
2018-12-06 16:21:02 -05:00
|
|
|
|
2018-10-01 10:50:22 -04:00
|
|
|
$promises = [];
|
|
|
|
|
|
|
|
foreach ($this->requests as $key => $url)
|
|
|
|
{
|
2022-03-03 17:26:09 -05:00
|
|
|
$promises[$key] = call(static fn () => yield $client->request($url));
|
2018-10-01 10:50:22 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
return wait(all($promises));
|
|
|
|
}
|
2022-03-03 17:26:09 -05:00
|
|
|
}
|