From 1bd7895b5ff0517f9de26c7bfb8a6de7db163b05 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 5 Sep 2026 01:18:54 +0200 Subject: [PATCH] [Schema] Fix _meta guard key in Request and Notification jsonSerialize() (#485) --- src/Schema/JsonRpc/Notification.php | 2 +- src/Schema/JsonRpc/Request.php | 2 +- .../Unit/Schema/JsonRpc/NotificationTest.php | 40 +++++++++++++++++++ tests/Unit/Schema/JsonRpc/RequestTest.php | 37 +++++++++++++++++ 4 files changed, 79 insertions(+), 2 deletions(-) diff --git a/src/Schema/JsonRpc/Notification.php b/src/Schema/JsonRpc/Notification.php index bfd37f1..3ec0883 100644 --- a/src/Schema/JsonRpc/Notification.php +++ b/src/Schema/JsonRpc/Notification.php @@ -74,7 +74,7 @@ abstract class Notification implements HasMethodInterface, MessageInterface $array['params'] = $params; } - if (null !== $this->meta && !isset($params['meta'])) { + if (null !== $this->meta && !isset($params['_meta'])) { $array['params']['_meta'] = $this->meta; } diff --git a/src/Schema/JsonRpc/Request.php b/src/Schema/JsonRpc/Request.php index cb8ed83..afdf9e9 100644 --- a/src/Schema/JsonRpc/Request.php +++ b/src/Schema/JsonRpc/Request.php @@ -122,7 +122,7 @@ abstract class Request implements HasMethodInterface, MessageInterface $array['params'] = $params; } - if (null !== $this->meta && !isset($params['meta'])) { + if (null !== $this->meta && !isset($params['_meta'])) { $array['params']['_meta'] = $this->meta; } diff --git a/tests/Unit/Schema/JsonRpc/NotificationTest.php b/tests/Unit/Schema/JsonRpc/NotificationTest.php index 0d7d7c4..b2580de 100644 --- a/tests/Unit/Schema/JsonRpc/NotificationTest.php +++ b/tests/Unit/Schema/JsonRpc/NotificationTest.php @@ -53,4 +53,44 @@ final class NotificationTest extends TestCase $this->assertSame($expectedMeta, $notification->jsonSerialize()); } + + public function testMetaDoesNotOverrideMetaFromParams(): void + { + $notificationImplementation = new class extends Notification { + public static function getMethod(): string + { + return 'notifications/dummy'; + } + + public static function fromParams(?array $params): self + { + return new self(); + } + + protected function getParams(): array + { + return [ + '_meta' => ['key' => 'from-params'], + ]; + } + }; + + $notification = $notificationImplementation::fromArray([ + 'jsonrpc' => '2.0', + 'method' => 'notifications/dummy', + 'params' => [ + '_meta' => ['key' => 'from-meta'], + ], + ]); + + $expected = [ + 'jsonrpc' => '2.0', + 'method' => 'notifications/dummy', + 'params' => [ + '_meta' => ['key' => 'from-params'], + ], + ]; + + $this->assertSame($expected, $notification->jsonSerialize()); + } } diff --git a/tests/Unit/Schema/JsonRpc/RequestTest.php b/tests/Unit/Schema/JsonRpc/RequestTest.php index f400a90..d23b6a9 100644 --- a/tests/Unit/Schema/JsonRpc/RequestTest.php +++ b/tests/Unit/Schema/JsonRpc/RequestTest.php @@ -55,4 +55,41 @@ final class RequestTest extends TestCase $this->assertSame($expectedMeta, $notification->jsonSerialize()); } + + public function testMetaDoesNotOverrideMetaFromParams(): void + { + $requestImplementation = new class extends Request { + public static function getMethod(): string + { + return 'foo/bar'; + } + + public static function fromParams(?array $params): static + { + return new self(); + } + + protected function getParams(): array + { + return [ + '_meta' => ['key' => 'from-params'], + ]; + } + }; + + $request = $requestImplementation::fromParams(null) + ->withId('12345') + ->withMeta(['key' => 'from-meta']); + + $expected = [ + 'jsonrpc' => '2.0', + 'id' => '12345', + 'method' => 'foo/bar', + 'params' => [ + '_meta' => ['key' => 'from-params'], + ], + ]; + + $this->assertSame($expected, $request->jsonSerialize()); + } }