. * * @author Daniil Gentili * @copyright 2016-2020 Daniil Gentili * @license https://opensource.org/licenses/AGPL-3.0 AGPLv3 * * @link https://docs.madelineproto.xyz MadelineProto documentation */ namespace danog\MadelineProto\Stream\Transport; use Amp\ByteStream\ClosedException; use Amp\CancellationToken; use Amp\Promise; use Amp\Socket\Socket; use danog\MadelineProto\Stream\Async\RawStream; use danog\MadelineProto\Stream\ConnectionContext; use danog\MadelineProto\Stream\ProxyStreamInterface; use danog\MadelineProto\Stream\RawStreamInterface; /** * Premade stream wrapper. * * Manages reading data in chunks * * @author Daniil Gentili */ class PremadeStream implements RawStreamInterface, ProxyStreamInterface { use RawStream; private $stream; public function __construct() { } public function setupTls(?CancellationToken $cancellationToken = null): \Amp\Promise { return $this->stream->setupTls($cancellationToken); } public function getStream() { return $this->stream; } public function connect(ConnectionContext $ctx, string $header = ''): \Generator { if ($header !== '') { yield $this->stream->write($header); } } /** * Async chunked read. * * @return Promise */ public function read(): Promise { return $this->stream ? $this->stream->read() : new \Amp\Success(null); } /** * Async write. * * @param string $data Data to write * * @return Promise */ public function write(string $data): Promise { if (!$this->stream) { throw new ClosedException("MadelineProto stream was disconnected"); } return $this->stream->write($data); } /** * Async close. * * @return \Generator */ public function disconnect() { try { if ($this->stream) { if (\method_exists($this->stream, 'close')) { $this->stream->close(); } $this->stream = null; } } catch (\Throwable $e) { \danog\MadelineProto\Logger::log('Got exception while closing stream: '.$e->getMessage()); } } public function close() { $this->disconnect(); } /** * {@inheritdoc} * * @return \Amp\Socket\Socket */ public function getSocket(): Socket { return $this->stream; } /** * {@inheritdoc} */ public function setExtra($extra) { $this->stream = $extra; } public static function getName(): string { return __CLASS__; } }