diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:44:51 +0000 |
commit | a1ec78bf0dc93d0e05e5f066f1949dc3baecea06 (patch) | |
tree | ee596ce1bc9840661386f96f9b8d1f919a106317 /vendor/gipfl/stream | |
parent | Initial commit. (diff) | |
download | icingaweb2-module-incubator-a1ec78bf0dc93d0e05e5f066f1949dc3baecea06.tar.xz icingaweb2-module-incubator-a1ec78bf0dc93d0e05e5f066f1949dc3baecea06.zip |
Adding upstream version 0.20.0.upstream/0.20.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/gipfl/stream')
-rw-r--r-- | vendor/gipfl/stream/composer.json | 26 | ||||
-rw-r--r-- | vendor/gipfl/stream/src/BufferedLineReader.php | 100 |
2 files changed, 126 insertions, 0 deletions
diff --git a/vendor/gipfl/stream/composer.json b/vendor/gipfl/stream/composer.json new file mode 100644 index 0000000..3bbcb6a --- /dev/null +++ b/vendor/gipfl/stream/composer.json @@ -0,0 +1,26 @@ +{ + "name": "gipfl/stream", + "description": "Helpful ReactPHP stream utility classes", + "type": "library", + "license": "MIT", + "autoload": { + "psr-4": { + "gipfl\\Stream\\": "src/" + } + }, + "authors": [ + { + "name": "Thomas Gelf", + "email": "thomas@gelf.net" + } + ], + "require": { + "react/event-loop": ">=1.0", + "react/stream": ">=1.0" + }, + "require-dev": { + "gipfl/test": ">=0.1.1", + "phpunit/phpunit": "^9.3 || ^7.5 || ^6.5 || ^5.7", + "squizlabs/php_codesniffer": "^3.6" + } +} diff --git a/vendor/gipfl/stream/src/BufferedLineReader.php b/vendor/gipfl/stream/src/BufferedLineReader.php new file mode 100644 index 0000000..bd43155 --- /dev/null +++ b/vendor/gipfl/stream/src/BufferedLineReader.php @@ -0,0 +1,100 @@ +<?php + +namespace gipfl\Stream; + +use Evenement\EventEmitterTrait; +use React\EventLoop\LoopInterface; +use React\Stream\WritableStreamInterface; +use function strlen; +use function strpos; +use function substr; + +class BufferedLineReader implements WritableStreamInterface +{ + use EventEmitterTrait; + + /** @var LoopInterface */ + protected $loop; + + protected $buffer = ''; + + protected $writable = true; + + /** @var string */ + protected $separator; + + /** @var int */ + protected $separatorLength; + + protected $process; + + // protected $maxBufferSize; // Not yet. Do we need this? + + /** + * @param string $separator + * @param LoopInterface $loop + */ + public function __construct($separator, LoopInterface $loop) + { + $this->loop = $loop; + $this->separator = $separator; + $this->separatorLength = strlen($separator); + $this->process = function () { + $this->processBuffer(); + }; + } + + protected function processBuffer() + { + $lastPos = 0; + while (false !== ($pos = strpos($this->buffer, $this->separator, $lastPos))) { + $this->emit('line', [substr($this->buffer, $lastPos, $pos - $lastPos)]); + $lastPos = $pos + $this->separatorLength; + } + if ($lastPos !== 0) { + $this->buffer = substr($this->buffer, $lastPos); + } + } + + public function isWritable() + { + return $this->writable; + } + + public function write($data) + { + if (! $this->writable) { + return false; + } + $this->buffer .= $data; + if (strpos($data, $this->separator) !== false) { + $this->loop->futureTick($this->process); + } + + return true; + } + + public function end($data = null) + { + if ($data !== null) { + $this->buffer .= $data; + } + $this->close(); + } + + public function close() + { + $this->writable = false; + $this->processBuffer(); + $remainingBuffer = $this->buffer; + $this->buffer = ''; + if ($length = strlen($remainingBuffer)) { + $this->emit('error', [new \Exception(sprintf( + 'There are %d unprocessed bytes in our buffer: %s', + $length, + substr($remainingBuffer, 0, 64) + ))]); + } + $this->emit('close'); + } +} |