Skip to content

Commit 1db7f52

Browse files
Merge pull request #29 from MacPaw/fix/fix_sync_transport_reset_schema
fix: fix sync transport reset schema
2 parents 3d0504b + e471165 commit 1db7f52

File tree

3 files changed

+30
-4
lines changed

3 files changed

+30
-4
lines changed

config/services.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ services:
2424
- { name: kernel.event_subscriber }
2525

2626
Macpaw\SchemaContextBundle\Messenger\Middleware\BaggageSchemaMiddleware:
27+
arguments:
28+
$sendersLocator: '@messenger.senders_locator'
2729
tags:
2830
- { name: messenger.middleware }

src/Messenger/Middleware/BaggageSchemaMiddleware.php

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@
1111
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
1212
use Symfony\Component\Messenger\Middleware\StackInterface;
1313
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
14+
use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface;
15+
use Symfony\Component\Messenger\Transport\Sync\SyncTransport;
1416

1517
class BaggageSchemaMiddleware implements MiddlewareInterface
1618
{
1719
public function __construct(
20+
private SendersLocatorInterface $sendersLocator,
1821
private BaggageSchemaResolver $baggageSchemaResolver,
1922
private BaggageCodec $baggageCodec,
2023
) {
@@ -24,7 +27,7 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
2427
{
2528
$stamp = $envelope->last(BaggageSchemaStamp::class);
2629

27-
if ($envelope->last(ReceivedStamp::class)) {
30+
if ($this->isWorker($envelope) && !$this->isSyncTransport($envelope)) {
2831
if ($stamp instanceof BaggageSchemaStamp) {
2932
$this->baggageSchemaResolver
3033
->setSchema($stamp->schema)
@@ -47,4 +50,20 @@ public function handle(Envelope $envelope, StackInterface $stack): Envelope
4750

4851
return $stack->next()->handle($envelope, $stack);
4952
}
53+
54+
private function isWorker(Envelope $envelope): bool
55+
{
56+
return (bool) $envelope->last(ReceivedStamp::class);
57+
}
58+
59+
private function isSyncTransport(Envelope $envelope): bool
60+
{
61+
foreach ($this->sendersLocator->getSenders($envelope) as $sender) {
62+
if ($sender instanceof SyncTransport) {
63+
return true;
64+
}
65+
}
66+
67+
return false;
68+
}
5069
}

tests/Messenger/Middleware/BaggageSchemaMiddlewareTest.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Symfony\Component\Messenger\Middleware\MiddlewareInterface;
1414
use Symfony\Component\Messenger\Middleware\StackInterface;
1515
use Symfony\Component\Messenger\Stamp\ReceivedStamp;
16+
use Symfony\Component\Messenger\Transport\Sender\SendersLocatorInterface;
1617

1718
class BaggageSchemaMiddlewareTest extends TestCase
1819
{
@@ -28,9 +29,10 @@ public function testSchemaIsSetFromStamp(): void
2829
'X-Schema' => 'tenant1',
2930
];
3031

32+
$sendersLocator = $this->createMock(SendersLocatorInterface::class);
3133
$resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments);
3234
$baggageCodec = new BaggageCodec();
33-
$middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec);
35+
$middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec);
3436
$stamp = new BaggageSchemaStamp($schema, $rawBaggage);
3537
$envelope = (new Envelope(new \stdClass()))->with($stamp);
3638
$envelope = $envelope->with(new ReceivedStamp('async'));
@@ -73,12 +75,14 @@ public function testSchemaStampIsInjectedIfMissing(): void
7375
$baggage = [
7476
'X-Schema' => 'tenant1',
7577
];
78+
79+
$sendersLocator = $this->createMock(SendersLocatorInterface::class);
7680
$resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments);
7781
$resolver
7882
->setSchema($schema)
7983
->setBaggage($baggage);
8084
$baggageCodec = new BaggageCodec();
81-
$middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec);
85+
$middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec);
8286
$originalEnvelope = new Envelope(new \stdClass());
8387
$stack = $this->createMock(StackInterface::class);
8488

@@ -108,9 +112,10 @@ public function testSchemaStampIsDefaultSchema(): void
108112
$environmentName = 'dev';
109113
$schemaOverridableEnvironments = ['dev', 'test'];
110114

115+
$sendersLocator = $this->createMock(SendersLocatorInterface::class);
111116
$resolver = new BaggageSchemaResolver($environmentSchema, $environmentName, $schemaOverridableEnvironments);
112117
$baggageCodec = new BaggageCodec();
113-
$middleware = new BaggageSchemaMiddleware($resolver, $baggageCodec);
118+
$middleware = new BaggageSchemaMiddleware($sendersLocator, $resolver, $baggageCodec);
114119
$originalEnvelope = new Envelope(new \stdClass());
115120
$stack = $this->createMock(StackInterface::class);
116121

0 commit comments

Comments
 (0)