1
0
mirror of https://github.com/danog/dns.git synced 2024-11-30 04:29:06 +01:00
dns/lib/Internal/UdpSocket.php

62 lines
1.5 KiB
PHP
Raw Normal View History

2017-06-23 07:34:11 +02:00
<?php
namespace Amp\Dns\Internal;
2017-06-23 07:34:11 +02:00
use Amp\Dns\ResolutionException;
2017-06-23 07:34:11 +02:00
use Amp\Promise;
use Amp\Success;
use LibDNS\Decoder\DecoderFactory;
use LibDNS\Encoder\EncoderFactory;
use LibDNS\Messages\Message;
use function Amp\call;
/** @internal */
class UdpSocket extends Socket {
/** @var \LibDNS\Encoder\Encoder */
2017-06-23 07:34:11 +02:00
private $encoder;
/** @var \LibDNS\Decoder\Decoder */
2017-06-23 07:34:11 +02:00
private $decoder;
public static function connect(string $uri): Promise {
if (!$socket = @\stream_socket_client($uri, $errno, $errstr, 0, STREAM_CLIENT_ASYNC_CONNECT)) {
throw new ResolutionException(\sprintf(
"Connection to %s failed: [Error #%d] %s",
$uri,
$errno,
$errstr
));
}
return new Success(new self($socket));
}
protected function __construct($socket) {
parent::__construct($socket);
$this->encoder = (new EncoderFactory)->create();
$this->decoder = (new DecoderFactory)->create();
}
protected function send(Message $message): Promise {
$data = $this->encoder->encode($message);
return $this->write($data);
}
protected function receive(): Promise {
return call(function () {
$data = yield $this->read();
if ($data === null) {
throw new ResolutionException("Reading from the server failed");
}
return $this->decoder->decode($data);
});
}
2017-06-23 12:49:16 +02:00
public function isAlive(): bool {
return true;
}
}