Skip to content

Commit 08040bc

Browse files
committed
Let the stream event control the datastructure itself to make custom protocolls possibale
1 parent 48de253 commit 08040bc

File tree

4 files changed

+39
-20
lines changed

4 files changed

+39
-20
lines changed

packages/http/src/ServerSentEvent.php

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@
22

33
namespace Tempest\Http;
44

5-
/**
6-
* Represents a message streamed through server-sent events.
7-
*/
8-
final class ServerSentEvent
5+
interface ServerSentEvent
96
{
10-
public function __construct(
11-
public mixed $data,
12-
public string $event = 'message',
13-
) {}
7+
public array $datalines {
8+
get;
9+
}
1410
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Tempest\Http;
4+
5+
use Tempest\Support\Json;
6+
7+
/**
8+
* Represents a message streamed through server-sent events.
9+
*/
10+
final class ServerSentMessage implements ServerSentEvent
11+
{
12+
public function __construct(
13+
public mixed $data,
14+
public string $event = 'message',
15+
) {}
16+
17+
public array $datalines {
18+
get {
19+
return [
20+
"event: {$this->event}\n",
21+
"data: " . Json\encode($this->data),
22+
"\n\n",
23+
];
24+
}
25+
}
26+
}

packages/router/src/GenericResponseSender.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Tempest\Http\Responses\EventStream;
1717
use Tempest\Http\Responses\File;
1818
use Tempest\Http\ServerSentEvent;
19+
use Tempest\Http\ServerSentMessage;
1920
use Tempest\Support\Json;
2021
use Tempest\View\View;
2122
use Tempest\View\ViewRenderer;
@@ -119,17 +120,13 @@ private function sendEventStream(EventStream $response): void
119120
break;
120121
}
121122

122-
$event = 'message';
123-
$data = Json\encode($message);
124-
125-
if ($message instanceof ServerSentEvent) {
126-
$event = $message->event;
127-
$data = Json\encode($message->data);
123+
if (! ($message instanceof ServerSentEvent)) {
124+
$message = new ServerSentMessage(data: $message);
128125
}
129126

130-
echo "event: {$event}\n";
131-
echo "data: {$data}";
132-
echo "\n\n";
127+
foreach ($message->datalines as $dataline) {
128+
echo $dataline;
129+
}
133130

134131
if (ob_get_level() > 0) {
135132
ob_flush();

tests/Integration/Http/GenericResponseSenderTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Tempest\Http\Responses\EventStream;
1414
use Tempest\Http\Responses\File;
1515
use Tempest\Http\Responses\Ok;
16-
use Tempest\Http\ServerSentEvent;
16+
use Tempest\Http\ServerSentMessage;
1717
use Tempest\Http\Status;
1818
use Tempest\Router\GenericResponseSender;
1919
use Tempest\View\ViewRenderer;
@@ -190,8 +190,8 @@ public function test_stream_with_custom_event(): void
190190
{
191191
ob_start();
192192
$response = new EventStream(function () {
193-
yield new ServerSentEvent(data: 'hello', event: 'first');
194-
yield new ServerSentEvent(data: 'goodbye', event: 'last');
193+
yield new ServerSentMessage(data: 'hello', event: 'first');
194+
yield new ServerSentMessage(data: 'goodbye', event: 'last');
195195
});
196196
$responseSender = $this->container->get(GenericResponseSender::class);
197197
$responseSender->send($response);

0 commit comments

Comments
 (0)