. * * @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\Common; use danog\MadelineProto\Stream\BufferedStreamInterface; use danog\MadelineProto\Stream\BufferInterface; use danog\MadelineProto\Stream\RawStreamInterface; /** * Buffered raw stream, that simply returns less data on EOF instead of throwing. * * @author Daniil Gentili */ class SimpleBufferedRawStream extends BufferedRawStream implements BufferedStreamInterface, BufferInterface, RawStreamInterface { /** * Read data asynchronously. * * @param int $length Amount of data to read * * @return \Generator */ public function bufferReadGenerator(int $length): \Generator { $size = \fstat($this->memory_stream)['size']; $offset = \ftell($this->memory_stream); $buffer_length = $size - $offset; if ($buffer_length < $length && $buffer_length) { \fseek($this->memory_stream, $offset + $buffer_length); } while ($buffer_length < $length) { $chunk = yield $this->read(); if ($chunk === null) { break; } \fwrite($this->memory_stream, $chunk); $buffer_length += \strlen($chunk); } \fseek($this->memory_stream, $offset); return \fread($this->memory_stream, $length); } /** * {@inheritDoc} * * @return RawStreamInterface */ public function getStream(): RawStreamInterface { return $this->stream; } /** * Get class name. * * @return string */ public static function getName(): string { return __CLASS__; } }