From 1c1c5f8be38f9f05b1ec9ade81492e0e8f15daee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20L=C3=BCck?= Date: Tue, 12 Apr 2022 14:15:00 +0200 Subject: [PATCH] Ignore empty `event` type as per EventSource specs --- src/MessageEvent.php | 6 +++--- tests/MessageEventTest.php | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/MessageEvent.php b/src/MessageEvent.php index 6490874..35445e4 100644 --- a/src/MessageEvent.php +++ b/src/MessageEvent.php @@ -24,15 +24,15 @@ public static function parse($data, $lastEventId) foreach ($lines as $line) { $name = strstr($line, ':', true); - $value = substr(strstr($line, ':'), 1); + $value = (string) substr(strstr($line, ':'), 1); if (isset($value[0]) && $value[0] === ' ') { - $value = substr($value, 1); + $value = (string) substr($value, 1); } if ($name === 'data') { $data .= $value . "\n"; } elseif ($name === 'id') { $id = $value; - } elseif ($name === 'event') { + } elseif ($name === 'event' && $value !== '') { $type = $value; } elseif ($name === 'retry' && $value === (string)(int)$value && $value >= 0) { $retry = (int)$value; diff --git a/tests/MessageEventTest.php b/tests/MessageEventTest.php index 84ef8ea..599c1ba 100644 --- a/tests/MessageEventTest.php +++ b/tests/MessageEventTest.php @@ -88,6 +88,38 @@ public function testParseWithMultipleIdsReturnsMessageWithLastEventIdFromStream( $this->assertEquals('2', $message->lastEventId); } + public function testParseReturnsMessageWithTypeFromStream() + { + $message = MessageEvent::parse("data: hello\r\nevent: join", ''); + + $this->assertEquals("hello", $message->data); + $this->assertEquals('join', $message->type); + } + + public function testParseWithoutEventReturnsMessageWithDefaultMessageType() + { + $message = MessageEvent::parse("data: hello", ''); + + $this->assertEquals("hello", $message->data); + $this->assertEquals('message', $message->type); + } + + public function testParseWithMultipleEventsReturnsMessageWithLastTypeFromStream() + { + $message = MessageEvent::parse("data: hello\nevent: join\nevent: leave", ''); + + $this->assertEquals("hello", $message->data); + $this->assertEquals('leave', $message->type); + } + + public function testParseWithEmptyEventReturnsMessageWithDefaultMessageType() + { + $message = MessageEvent::parse("data: hello\r\nevent:", ''); + + $this->assertEquals("hello", $message->data); + $this->assertEquals('message', $message->type); + } + public function retryTimeDataProvider() { return [