diff --git a/composer.json b/composer.json index 6f56bc0..d9559a8 100644 --- a/composer.json +++ b/composer.json @@ -40,9 +40,9 @@ "php": ">=8.1", "ext-json": "*", "ext-sockets": "*", - "psr/log": "^2.0|^3.0", + "psr/log": "^2.0 || ^3.0", "spiral/goridge": "^4.1.0", - "spiral/roadrunner": "^2023.1", + "spiral/roadrunner": "^2023.1 || ^2024.1", "composer-runtime-api": "^2.0" }, "require-dev": { diff --git a/src/Worker.php b/src/Worker.php index c4f0b78..ca7bd92 100644 --- a/src/Worker.php +++ b/src/Worker.php @@ -95,10 +95,15 @@ public function withStreamMode(): static return $clone; } - public function respond(Payload $payload): void + /** + * @param int|null $codec The codec used for encoding the payload header. + * Can be {@see Frame::CODEC_PROTO} for Protocol Buffers or {@see Frame::CODEC_JSON} for JSON. + * This parameter will be removed in v4.0 and {@see Frame::CODEC_PROTO} will be used by default. + */ + public function respond(Payload $payload, ?int $codec = null): void { $this->streamMode and ++$this->framesSent; - $this->send($payload->body, $payload->header, $payload->eos); + $this->send($payload->body, $payload->header, $payload->eos, $codec); } public function error(string $error): void @@ -198,7 +203,7 @@ private function pullPayload(): ?Payload return $payload; } - private function send(string $body = '', string $header = '', bool $eos = true): void + private function send(string $body = '', string $header = '', bool $eos = true, ?int $codec = null): void { $frame = new Frame($header . $body, [\strlen($header)]); @@ -210,6 +215,10 @@ private function send(string $body = '', string $header = '', bool $eos = true): $frame->byte10 |= Frame::BYTE10_PING; } + if ($codec !== null) { + $frame->setFlag($codec); + } + $this->sendFrame($frame); } diff --git a/tests/Unit/WorkerTest.php b/tests/Unit/WorkerTest.php new file mode 100644 index 0000000..7e859a5 --- /dev/null +++ b/tests/Unit/WorkerTest.php @@ -0,0 +1,38 @@ + 0], $expectedFlags); + + $relay = $this->createMock(RelayInterface::class); + $relay + ->expects($this->once()) + ->method('send') + ->with($this->equalTo($expected)); + + $worker = new Worker($relay, false); + + $worker->respond(new Payload('Hello World!'), $codec); + } + + public static function respondDataProvider(): \Traversable + { + yield [0, null]; + yield [Frame::CODEC_PROTO, Frame::CODEC_PROTO]; + yield [Frame::CODEC_JSON, Frame::CODEC_JSON]; + } +}