From 8cda3cc14c66551bab270fc3ae28270ef3cab1b8 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Thu, 21 May 2026 20:34:37 +0300 Subject: [PATCH 1/3] Stop wrapping messages in envelopes during deserialization --- src/Message/JsonMessageSerializer.php | 16 +--------------- .../Unit/Message/JsonMessageSerializerTest.php | 18 ++++-------------- 2 files changed, 5 insertions(+), 29 deletions(-) diff --git a/src/Message/JsonMessageSerializer.php b/src/Message/JsonMessageSerializer.php index d8831900..b5458069 100644 --- a/src/Message/JsonMessageSerializer.php +++ b/src/Message/JsonMessageSerializer.php @@ -54,12 +54,6 @@ public function unserialize(string $value): MessageInterface throw new InvalidArgumentException('Metadata must be an array. Got ' . get_debug_type($meta) . '.'); } - $envelopes = []; - if (isset($meta[Envelope::ENVELOPE_STACK_KEY]) && is_array($meta[Envelope::ENVELOPE_STACK_KEY])) { - $envelopes = $meta[Envelope::ENVELOPE_STACK_KEY]; - } - $meta[Envelope::ENVELOPE_STACK_KEY] = []; - $class = $meta['message-class'] ?? Message::class; // Don't check subclasses when it's a default class: that's faster if ($class !== Message::class && !is_subclass_of($class, MessageInterface::class)) { @@ -69,14 +63,6 @@ public function unserialize(string $value): MessageInterface /** * @var class-string $class */ - $message = $class::fromData($type, $payload['data'] ?? null, $meta); - - foreach ($envelopes as $envelope) { - if (is_string($envelope) && class_exists($envelope) && is_subclass_of($envelope, Envelope::class)) { - $message = $envelope::fromMessage($message); - } - } - - return $message; + return $class::fromData($type, $payload['data'] ?? null, $meta); } } diff --git a/tests/Unit/Message/JsonMessageSerializerTest.php b/tests/Unit/Message/JsonMessageSerializerTest.php index 44f98281..05723d9c 100644 --- a/tests/Unit/Message/JsonMessageSerializerTest.php +++ b/tests/Unit/Message/JsonMessageSerializerTest.php @@ -115,7 +115,7 @@ public function testUnserializeFromData(): void $message = $serializer->unserialize(json_encode($payload, JSON_THROW_ON_ERROR)); $this->assertEquals($payload['data'], $message->getData()); - $this->assertEquals([Envelope::ENVELOPE_STACK_KEY => []], $message->getMetadata()); + $this->assertEquals([], $message->getMetadata()); } public function testUnserializeWithMetadata(): void @@ -126,7 +126,7 @@ public function testUnserializeWithMetadata(): void $message = $serializer->unserialize(json_encode($payload, JSON_THROW_ON_ERROR)); $this->assertEquals($payload['data'], $message->getData()); - $this->assertEquals(['int' => 1, 'str' => 'string', 'bool' => true, Envelope::ENVELOPE_STACK_KEY => []], $message->getMetadata()); + $this->assertEquals(['int' => 1, 'str' => 'string', 'bool' => true], $message->getMetadata()); } public function testUnserializeEnvelopeStack(): void @@ -148,9 +148,7 @@ public function testUnserializeEnvelopeStack(): void $this->assertEquals($payload['data'], $message->getData()); $this->assertEquals([IdEnvelope::class], $message->getMetadata()[Envelope::ENVELOPE_STACK_KEY]); - $this->assertInstanceOf(IdEnvelope::class, $message); - $this->assertNull($message->getId()); - $this->assertInstanceOf(Message::class, $message->getMessage()); + $this->assertInstanceOf(Message::class, $message); } public function testSerialize(): void @@ -186,11 +184,9 @@ public function testSerializeEnvelopeStack(): void $json, ); - /** @var IdEnvelope $message */ $message = $serializer->unserialize($json); - $this->assertInstanceOf(IdEnvelope::class, $message); - $this->assertEquals('test-id', $message->getId()); + $this->assertInstanceOf(Message::class, $message); $this->assertEquals([ Envelope::ENVELOPE_STACK_KEY => [ IdEnvelope::class, @@ -198,12 +194,6 @@ public function testSerializeEnvelopeStack(): void IdEnvelope::MESSAGE_ID_KEY => 'test-id', 'message-class' => Message::class, ], $message->getMetadata()); - - $this->assertEquals([ - Envelope::ENVELOPE_STACK_KEY => [], - IdEnvelope::MESSAGE_ID_KEY => 'test-id', - 'message-class' => Message::class, - ], $message->getMessage()->getMetadata()); } public function testRestoreOriginalMessageClass(): void From 9f263a4db3382ea349d08d07e13c8b777e92f030 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 22 May 2026 11:10:55 +0300 Subject: [PATCH 2/3] Remove `Envelope::ENVELOPE_STACK_KEY` --- src/Message/Envelope.php | 26 +------------------ tests/Unit/EnvelopeTest.php | 18 ------------- tests/Unit/Message/EnvelopeTest.php | 12 --------- .../Message/JsonMessageSerializerTest.php | 15 ++--------- 4 files changed, 3 insertions(+), 68 deletions(-) diff --git a/src/Message/Envelope.php b/src/Message/Envelope.php index dc122f12..ef1a2ab6 100644 --- a/src/Message/Envelope.php +++ b/src/Message/Envelope.php @@ -4,13 +4,8 @@ namespace Yiisoft\Queue\Message; -use function is_array; - abstract class Envelope implements MessageInterface { - /** @psalm-suppress MissingClassConstType */ - final public const ENVELOPE_STACK_KEY = 'envelopes'; - /** * @psalm-var array */ @@ -20,7 +15,7 @@ abstract class Envelope implements MessageInterface public function __construct(MessageInterface $message, array $metadata) { - $this->metadata = $this->prepareMetadata($message->getMetadata(), $metadata); + $this->metadata = array_merge($message->getMetadata(), $metadata); while ($message instanceof self) { $message = $message->getMessage(); @@ -54,23 +49,4 @@ final public function getMetadata(): array { return $this->metadata; } - - private function prepareMetadata(array $messageMeta, array $metadata): array - { - $stack = $messageMeta[self::ENVELOPE_STACK_KEY] ?? []; - if (!is_array($stack)) { - $stack = []; - } - - return array_merge( - $messageMeta, - [ - self::ENVELOPE_STACK_KEY => array_merge( - $stack, - [static::class], - ), - ], - $metadata, - ); - } } diff --git a/tests/Unit/EnvelopeTest.php b/tests/Unit/EnvelopeTest.php index 5c9bc112..a353c494 100644 --- a/tests/Unit/EnvelopeTest.php +++ b/tests/Unit/EnvelopeTest.php @@ -5,7 +5,6 @@ namespace Yiisoft\Queue\Tests\Unit; use PHPUnit\Framework\TestCase; -use Yiisoft\Queue\Message\Envelope; use Yiisoft\Queue\Message\IdEnvelope; use Yiisoft\Queue\Message\Message; @@ -17,14 +16,6 @@ public function testEnvelopeStack(): void $message = new IdEnvelope($message, 'test-id'); $this->assertEquals('test', $message->getMessage()->getData()); - - $stack = $message->getMetadata()[Envelope::ENVELOPE_STACK_KEY]; - $this->assertIsArray($stack); - - $this->assertEquals([ - IdEnvelope::class, - ], $stack); - $this->assertEquals('test-id', $message->getMetadata()[IdEnvelope::MESSAGE_ID_KEY]); } @@ -36,15 +27,6 @@ public function testEnvelopeDuplicates(): void $message = new IdEnvelope($message, 'test-id-3'); $this->assertEquals('test', $message->getMessage()->getData()); - - $stack = $message->getMetadata()[Envelope::ENVELOPE_STACK_KEY]; - $this->assertIsArray($stack); - $this->assertEquals([ - IdEnvelope::class, - IdEnvelope::class, - IdEnvelope::class, - ], $stack); - $this->assertEquals('test-id-3', $message->getMetadata()[IdEnvelope::MESSAGE_ID_KEY]); } } diff --git a/tests/Unit/Message/EnvelopeTest.php b/tests/Unit/Message/EnvelopeTest.php index 22f109cd..67ba1d2e 100644 --- a/tests/Unit/Message/EnvelopeTest.php +++ b/tests/Unit/Message/EnvelopeTest.php @@ -5,9 +5,7 @@ namespace Yiisoft\Queue\Tests\Unit\Message; use PHPUnit\Framework\TestCase; -use Yiisoft\Queue\Message\Envelope; use Yiisoft\Queue\Tests\App\DummyEnvelope; -use Yiisoft\Queue\Message\Message; final class EnvelopeTest extends TestCase { @@ -25,14 +23,4 @@ public function testFromData(): void $this->assertArrayHasKey('meta', $envelope->getMetadata()); $this->assertSame('data', $envelope->getMetadata()['meta']); } - - public function testNonArrayStackIsNormalized(): void - { - $base = new Message('handler', 'data', [Envelope::ENVELOPE_STACK_KEY => 'oops']); - $wrapped = new DummyEnvelope($base); - - $meta = $wrapped->getMetadata(); - self::assertIsArray($meta[Envelope::ENVELOPE_STACK_KEY]); - self::assertSame([DummyEnvelope::class], $meta[Envelope::ENVELOPE_STACK_KEY]); - } } diff --git a/tests/Unit/Message/JsonMessageSerializerTest.php b/tests/Unit/Message/JsonMessageSerializerTest.php index 05723d9c..24ca571a 100644 --- a/tests/Unit/Message/JsonMessageSerializerTest.php +++ b/tests/Unit/Message/JsonMessageSerializerTest.php @@ -7,7 +7,6 @@ use InvalidArgumentException; use PHPUnit\Framework\Attributes\DataProvider; use PHPUnit\Framework\TestCase; -use Yiisoft\Queue\Message\Envelope; use Yiisoft\Queue\Message\IdEnvelope; use Yiisoft\Queue\Message\JsonMessageSerializer; use Yiisoft\Queue\Message\Message; @@ -134,11 +133,7 @@ public function testUnserializeEnvelopeStack(): void $payload = [ 'type' => 'handler', 'data' => 'test', - 'meta' => [ - Envelope::ENVELOPE_STACK_KEY => [ - IdEnvelope::class, - ], - ], + 'meta' => [], ]; $serializer = $this->createSerializer(); @@ -146,8 +141,6 @@ public function testUnserializeEnvelopeStack(): void $message = $serializer->unserialize(json_encode($payload, JSON_THROW_ON_ERROR)); $this->assertEquals($payload['data'], $message->getData()); - $this->assertEquals([IdEnvelope::class], $message->getMetadata()[Envelope::ENVELOPE_STACK_KEY]); - $this->assertInstanceOf(Message::class, $message); } @@ -176,8 +169,7 @@ public function testSerializeEnvelopeStack(): void $this->assertEquals( sprintf( - '{"type":"handler","data":"test","meta":{"envelopes":["%s"],"%s":"test-id","message-class":"%s"}}', - str_replace('\\', '\\\\', IdEnvelope::class), + '{"type":"handler","data":"test","meta":{"%s":"test-id","message-class":"%s"}}', IdEnvelope::MESSAGE_ID_KEY, str_replace('\\', '\\\\', Message::class), ), @@ -188,9 +180,6 @@ public function testSerializeEnvelopeStack(): void $this->assertInstanceOf(Message::class, $message); $this->assertEquals([ - Envelope::ENVELOPE_STACK_KEY => [ - IdEnvelope::class, - ], IdEnvelope::MESSAGE_ID_KEY => 'test-id', 'message-class' => Message::class, ], $message->getMetadata()); From 74caa6ad68f748b6ba4d4b2efe52cc1e9873112a Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Fri, 22 May 2026 11:40:54 +0300 Subject: [PATCH 3/3] fix --- tests/Unit/Message/JsonMessageSerializerTest.php | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/tests/Unit/Message/JsonMessageSerializerTest.php b/tests/Unit/Message/JsonMessageSerializerTest.php index 24ca571a..a201aa2f 100644 --- a/tests/Unit/Message/JsonMessageSerializerTest.php +++ b/tests/Unit/Message/JsonMessageSerializerTest.php @@ -128,22 +128,6 @@ public function testUnserializeWithMetadata(): void $this->assertEquals(['int' => 1, 'str' => 'string', 'bool' => true], $message->getMetadata()); } - public function testUnserializeEnvelopeStack(): void - { - $payload = [ - 'type' => 'handler', - 'data' => 'test', - 'meta' => [], - ]; - $serializer = $this->createSerializer(); - - /** @var IdEnvelope $message */ - $message = $serializer->unserialize(json_encode($payload, JSON_THROW_ON_ERROR)); - - $this->assertEquals($payload['data'], $message->getData()); - $this->assertInstanceOf(Message::class, $message); - } - public function testSerialize(): void { $message = new Message('handler', 'test');