*/ public function parse(StreamInterface $stream, ?callable $shouldStop = null): \Generator { $buffer = ''; $eventData = ''; while (! $stream->eof()) { if ($shouldStop && $shouldStop()) { break; } $chunk = $stream->read($this->chunkSize); if ($chunk === '') { usleep(10000); continue; } $buffer .= $chunk; while (($pos = strpos($buffer, "\n")) !== false) { $line = substr($buffer, 0, $pos); $buffer = substr($buffer, $pos + 1); $line = rtrim($line, "\r"); if ($line === '') { if ($eventData !== '') { yield $eventData; $eventData = ''; } continue; } if (str_starts_with($line, 'data:')) { $data = ltrim(substr($line, 5)); if ($eventData !== '') { $eventData .= "\n"; } $eventData .= $data; } } } if ($buffer !== '') { $line = rtrim($buffer, "\r"); if (str_starts_with($line, 'data:')) { $data = ltrim(substr($line, 5)); if ($eventData !== '') { $eventData .= "\n"; } $eventData .= $data; } } if ($eventData !== '') { yield $eventData; } } }