* @copyright 2015 - 2018 Timothy J. Warren * @license http://www.opensource.org/licenses/mit-license.html MIT License * @version 4.0 * @link https://git.timshomepage.net/timw4mail/HummingBirdAnimeClient */ namespace Aviat\AnimeClient\API; use function Amp\call; use function Amp\Promise\{all, wait}; /** * Class to simplify making and validating simultaneous requests */ class ParallelAPIRequest { /** * Set of requests to make in parallel * * @var array */ protected $requests = []; /** * Add a request * * @param string|Request $request * @param string|number $key * @return self */ public function addRequest($request, $key = NULL): self { if ( ! is_null($key)) { $this->requests[$key] = $request; return $this; } $this->requests[] = $request; return $this; } /** * Add multiple requests * * @param string[]|Request[] $requests * @return self */ public function addRequests(array $requests): self { array_walk($requests, [$this, 'addRequest']); return $this; } /** * Actually make the requests * * @return array */ public function makeRequests(): array { $client = new HummingbirdClient(); $promises = []; foreach ($this->requests as $key => $url) { $promises[$key] = call(function () use ($client, $url) { $response = yield $client->request($url); $body = yield $response->getBody(); return $body; }); } return wait(all($promises)); } }