Files
kiri-rpc/src/JsonRpcPoolTransporter.php
T

72 lines
1.4 KiB
PHP
Raw Normal View History

2021-10-28 18:24:46 +08:00
<?php
namespace Kiri\Rpc;
use Exception;
use Http\Message\Response;
use Http\Message\Stream;
use Kiri\Abstracts\Config;
use Kiri\Exception\ConfigException;
use Kiri\Kiri;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Swoole\Coroutine\Client;
class JsonRpcPoolTransporter implements ClientInterface
{
use TraitTransporter;
public ClientPool $pool;
const POOL_NAME = 'rpc.client.pool';
/**
* @throws ConfigException
*/
public function init()
{
$config = Config::get('rpc.pool', null);
$this->pool = Kiri::getDi()->get(ClientPool::class, [], $config);
$this->pool->initConnections(self::POOL_NAME, true, $config['max']);
}
/**
* @param RequestInterface $request
* @return ResponseInterface
* @throws Exception
*/
public function sendRequest(RequestInterface $request): ResponseInterface
{
$content = $request->getBody()->getContents();
2021-10-28 18:31:25 +08:00
$response = $this->request($client = $this->newClient(), $content, false);
$this->pool->push(self::POOL_NAME, $client);
return (new Response())->withBody(new Stream($response));
2021-10-28 18:24:46 +08:00
}
/**
* @return Client|\Swoole\Client
* @throws ConfigException
* @throws Exception
*/
private function getClient(): Client|\Swoole\Client
{
return $this->pool->get(self::POOL_NAME, function () {
return $this->newClient();
});
}
}