From 9e194f39507477ea54f522997eadb0fa94cc1d81 Mon Sep 17 00:00:00 2001 From: Daniil Gentili Date: Tue, 17 Sep 2019 21:45:48 +0200 Subject: [PATCH] Make WsStream a plain stream again --- .../Loop/Connection/PingLoop.php | 92 +++++++++++++++++++ .../Stream/Transport/WsStream.php | 21 +---- 2 files changed, 93 insertions(+), 20 deletions(-) create mode 100644 src/danog/MadelineProto/Loop/Connection/PingLoop.php diff --git a/src/danog/MadelineProto/Loop/Connection/PingLoop.php b/src/danog/MadelineProto/Loop/Connection/PingLoop.php new file mode 100644 index 00000000..67a0ee54 --- /dev/null +++ b/src/danog/MadelineProto/Loop/Connection/PingLoop.php @@ -0,0 +1,92 @@ +. + * + * @author Daniil Gentili + * @copyright 2016-2019 Daniil Gentili + * @license https://opensource.org/licenses/AGPL-3.0 AGPLv3 + * + * @link https://docs.madelineproto.xyz MadelineProto documentation + */ + +namespace danog\MadelineProto\Loop\Connection; + +use danog\MadelineProto\Connection; +use danog\MadelineProto\Loop\Impl\ResumableSignalLoop; + +/** + * Ping loop. + * + * @author Daniil Gentili + */ +class PingLoop extends ResumableSignalLoop +{ + /** + * Connection instance. + * + * @var \danog\MadelineProto\Connection + */ + protected $connection; + /** + * DC ID. + * + * @var string + */ + protected $datacenter; + + /** + * DataCenterConnection instance. + * + * @var \danog\MadelineProto\DataCenterConnection + */ + protected $datacenterConnection; + + public function __construct(Connection $connection) + { + $this->connection = $connection; + $this->API = $connection->getExtra(); + $this->datacenter = $connection->getDatacenterID(); + $this->datacenterConnection = $connection->getShared(); + } + + public function loop() + { + $API = $this->API; + $datacenter = $this->datacenter; + $connection = $this->connection; + $shared = $this->datacenterConnection; + + $timeout = $shared->getSettings()['timeout']; + while (true) { + while (!$shared->hasTempAuthKey()) { + if (yield $this->waitSignal($this->pause())) { + return; + } + } + if (yield $this->waitSignal($this->pause($timeout))) { + return; + } + if (\time() - $connection->getLastChunk() >= $timeout) { + $API->logger->logger("Ping DC $datacenter"); + try { + yield $connection->method_call_async_read('ping', ['ping_id' => \random_bytes(8)]); + } catch (\Throwable $e) { + $API->logger->logger("Error while pinging DC $datacenter"); + $API->logger->logger((string) $e); + } + } + } + } + + public function __toString(): string + { + return "Ping loop in DC {$this->datacenter}"; + } +} diff --git a/src/danog/MadelineProto/Stream/Transport/WsStream.php b/src/danog/MadelineProto/Stream/Transport/WsStream.php index ad6fb8af..c5a80d5b 100644 --- a/src/danog/MadelineProto/Stream/Transport/WsStream.php +++ b/src/danog/MadelineProto/Stream/Transport/WsStream.php @@ -28,11 +28,8 @@ use Amp\Websocket\Client\Internal\ClientSocket; use Amp\Websocket\Client\Rfc6455Connection; use Amp\Websocket\Rfc6455Client; use Amp\Websocket\Rfc7692CompressionFactory; -use danog\MadelineProto\API; -use danog\MadelineProto\MTProto; use danog\MadelineProto\Stream\Async\RawStream; use danog\MadelineProto\Stream\ConnectionContext; -use danog\MadelineProto\Stream\RawProxyStreamInterface; use function Amp\Websocket\generateKey; use function Amp\Websocket\validateAcceptForKey; @@ -41,16 +38,10 @@ use function Amp\Websocket\validateAcceptForKey; * * @author Daniil Gentili */ -class WsStream implements RawProxyStreamInterface +class WsStream implements RawStreamInterface { use RawStream; - /** - * API instance. - * - * @var MTProto - */ - private $API; /** * Websocket stream. * @@ -227,16 +218,6 @@ class WsStream implements RawProxyStreamInterface return null; } - /** - * Set API instance. - * - * @param MTProto $extra - * @return void - */ - public function setExtra($extra) - { - $this->API = $extra; - } /** * {@inheritdoc} *