diff --git a/src/Micro/Internal/InfoResponse.php b/src/Micro/Internal/InfoResponse.php index 1eb7892..abc5135 100644 --- a/src/Micro/Internal/InfoResponse.php +++ b/src/Micro/Internal/InfoResponse.php @@ -27,13 +27,13 @@ public function jsonSerialize(): array 'id' => $this->info->identity->id, 'version' => $this->info->identity->version, 'description' => $this->info->description, - 'metadata' => $this->info->identity->metadata, + 'metadata' => (object) $this->info->identity->metadata, 'endpoints' => array_map( static fn(EndpointInfo $endpointInfo): array => [ 'name' => $endpointInfo->name, 'subject' => $endpointInfo->subject, 'queue_group' => $endpointInfo->queueGroup, - 'metadata' => $endpointInfo->metadata, + 'metadata' => (object) $endpointInfo->metadata, ], $this->info->endpoints, ), diff --git a/src/Micro/Internal/PingResponse.php b/src/Micro/Internal/PingResponse.php index 4ac916b..0278efd 100644 --- a/src/Micro/Internal/PingResponse.php +++ b/src/Micro/Internal/PingResponse.php @@ -25,7 +25,7 @@ public function jsonSerialize(): array 'name' => $this->identity->name, 'id' => $this->identity->id, 'version' => $this->identity->version, - 'metadata' => $this->identity->metadata, + 'metadata' => (object) $this->identity->metadata, ]; } } diff --git a/src/Micro/Internal/StatsResponse.php b/src/Micro/Internal/StatsResponse.php index dad2b52..d202dae 100644 --- a/src/Micro/Internal/StatsResponse.php +++ b/src/Micro/Internal/StatsResponse.php @@ -26,7 +26,7 @@ public function jsonSerialize(): array 'name' => $this->stats->identity->name, 'id' => $this->stats->identity->id, 'version' => $this->stats->identity->version, - 'metadata' => $this->stats->identity->metadata, + 'metadata' => (object) $this->stats->identity->metadata, 'started' => $this->stats->started->format(\DateTimeInterface::RFC3339), 'endpoints' => array_map( static fn(EndpointStats $stats): array => array_filter([ diff --git a/tests/Micro/ServiceTest.php b/tests/Micro/ServiceTest.php index 3ed3d18..c1639c4 100644 --- a/tests/Micro/ServiceTest.php +++ b/tests/Micro/ServiceTest.php @@ -147,6 +147,51 @@ public function testControlResponsesMatchMicroSchema(): void $srv->stop(); } + public function testEmptyMetadataIsEncodedAsJsonObject(): void + { + $nc = $this->client(); + + $srv = $nc->createService(new ServiceConfig( + name: 'NoMetadataService', + version: '1.0.0', + )); + + $srv->addEndpoint(new EndpointConfig('echo', subject: 'no-metadata.echo'), static function (Request $request): void { + $request->respond(new Response($request->data)); + }); + + foreach (['PING', 'INFO', 'STATS'] as $verb) { + $payload = (string) $nc->request("\$SRV.{$verb}.NoMetadataService")->message->payload; + + self::assertStringContainsString('"metadata":{}', $payload, $verb); + self::assertStringNotContainsString('"metadata":[]', $payload, $verb); + } + + $srv->stop(); + } + + public function testMetadataIsEncodedAsJsonObject(): void + { + $nc = $this->client(); + + $srv = $nc->createService(new ServiceConfig( + name: 'MetadataService', + version: '1.0.0', + metadata: ['env' => 'test'], + )); + + $srv->addEndpoint(new EndpointConfig('echo', subject: 'metadata.echo', metadata: ['v' => '1']), static function (Request $request): void { + $request->respond(new Response($request->data)); + }); + + $payload = (string) $nc->request('$SRV.INFO.MetadataService')->message->payload; + + self::assertStringContainsString('"metadata":{"env":"test"}', $payload); + self::assertStringContainsString('"metadata":{"v":"1"}', $payload); + + $srv->stop(); + } + public function testGroups(): void { $nc = $this->client();