diff --git a/config/services.yaml b/config/services.yaml index d3db831..d0ef403 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -24,5 +24,7 @@ services: - { name: kernel.event_subscriber } Macpaw\SchemaContextBundle\Messenger\Middleware\BaggageSchemaMiddleware: + arguments: + $sendersLocator: '@messenger.senders_locator' tags: - { name: messenger.middleware } diff --git a/src/Messenger/Middleware/BaggageSchemaMiddleware.php b/src/Messenger/Middleware/BaggageSchemaMiddleware.php index 04d7e7a..91f6523 100644 --- a/src/Messenger/Middleware/BaggageSchemaMiddleware.php +++ b/src/Messenger/Middleware/BaggageSchemaMiddleware.php @@ -11,10 +11,13 @@ use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Stamp\ReceivedStamp; +use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; +use Symfony\Component\Messenger\Transport\Sync\SyncTransport; class BaggageSchemaMiddleware implements MiddlewareInterface { public function __construct( + private SendersLocatorInterface $sendersLocator, private BaggageSchemaResolver $baggageSchemaResolver, private BaggageCodec $baggageCodec, ) { @@ -24,7 +27,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope { $stamp = $envelope->last(BaggageSchemaStamp::class); - if ($envelope->last(ReceivedStamp::class)) { + if ($this->isWorker($envelope) && !$this->isSyncTransport($envelope)) { if ($stamp instanceof BaggageSchemaStamp) { $this->baggageSchemaResolver ->setSchema($stamp->schema) @@ -47,4 +50,20 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope return $stack->next()->handle($envelope, $stack); } + + private function isWorker(Envelope $envelope): bool + { + return (bool) $envelope->last(ReceivedStamp::class); + } + + private function isSyncTransport(Envelope $envelope): bool + { + foreach ($this->sendersLocator->getSenders($envelope) as $sender) { + if ($sender instanceof SyncTransport) { + return true; + } + } + + return false; + } } diff --git a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php index 92744e4..bccd3d6 100644 --- a/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php +++ b/tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php @@ -13,6 +13,7 @@ use Symfony\Component\Messenger\Middleware\MiddlewareInterface; use Symfony\Component\Messenger\Middleware\StackInterface; use Symfony\Component\Messenger\Stamp\ReceivedStamp; +use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface; class BaggageSchemaMiddlewareTest extends TestCase { @@ -28,9 +29,10 @@ public function testSchemaIsSetFromStamp(): void 'X-Schema' => 'tenant1', ]; + $sendersLocator = $this->createMock(SendersLocatorInterface::class); $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); $stamp = new BaggageSchemaStamp($schema, $rawBaggage); $envelope = (new Envelope(new \stdClass()))->with($stamp); $envelope = $envelope->with(new ReceivedStamp('async')); @@ -73,12 +75,14 @@ public function testSchemaStampIsInjectedIfMissing(): void $baggage = [ 'X-Schema' => 'tenant1', ]; + + $sendersLocator = $this->createMock(SendersLocatorInterface::class); $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); $resolver ->setSchema($schema) ->setBaggage($baggage); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); $originalEnvelope = new Envelope(new \stdClass()); $stack = $this->createMock(StackInterface::class); @@ -108,9 +112,10 @@ public function testSchemaStampIsDefaultSchema(): void $environmentName = 'dev'; $schemaOverridableEnvironments = ['dev', 'test']; + $sendersLocator = $this->createMock(SendersLocatorInterface::class); $resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments); $baggageCodec = new BaggageCodec(); - $middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec); + $middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec); $originalEnvelope = new Envelope(new \stdClass()); $stack = $this->createMock(StackInterface::class);