summaryrefslogtreecommitdiffstats
path: root/vendor/gipfl/stream
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:44:51 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:44:51 +0000
commita1ec78bf0dc93d0e05e5f066f1949dc3baecea06 (patch)
treeee596ce1bc9840661386f96f9b8d1f919a106317 /vendor/gipfl/stream
parentInitial commit. (diff)
downloadicingaweb2-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.json26
-rw-r--r--vendor/gipfl/stream/src/BufferedLineReader.php100
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');
+ }
+}