Skip to content

Commit 1a282de

Browse files
committed
Refactoring
1 parent 4fa19d0 commit 1a282de

11 files changed

Lines changed: 162 additions & 122 deletions

File tree

psalm-baseline.xml

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -589,9 +589,6 @@
589589
<InvalidReturnType>
590590
<code><![CDATA[\Traversable<ActivityPrototype>]]></code>
591591
</InvalidReturnType>
592-
<PossiblyUndefinedVariable>
593-
<code><![CDATA[$contextClass]]></code>
594-
</PossiblyUndefinedVariable>
595592
<RawObjectIteration>
596593
<code><![CDATA[$group]]></code>
597594
<code><![CDATA[$group]]></code>
@@ -600,21 +597,6 @@
600597
<code><![CDATA[$retry !== null]]></code>
601598
</RedundantConditionGivenDocblockType>
602599
</file>
603-
<file src="src/Internal/Declaration/WorkflowInstance.php">
604-
<LessSpecificImplementedReturnType>
605-
<code><![CDATA[UpdateHandler|null]]></code>
606-
</LessSpecificImplementedReturnType>
607-
<PropertyNotSetInConstructor>
608-
<code><![CDATA[$queryExecutor]]></code>
609-
<code><![CDATA[$updateExecutor]]></code>
610-
<code><![CDATA[$updateValidator]]></code>
611-
</PropertyNotSetInConstructor>
612-
</file>
613-
<file src="src/Internal/Declaration/WorkflowInstance/SignalQueue.php">
614-
<MissingConstructor>
615-
<code><![CDATA[$onSignal]]></code>
616-
</MissingConstructor>
617-
</file>
618600
<file src="src/Internal/Events/EventEmitterInterface.php">
619601
<InvalidTemplateParam>
620602
<code><![CDATA[T]]></code>
@@ -1026,22 +1008,10 @@
10261008
<PossiblyUndefinedStringArrayOffset>
10271009
<code><![CDATA[$request->getOptions()['name']]]></code>
10281010
</PossiblyUndefinedStringArrayOffset>
1029-
<UndefinedInterfaceMethod>
1030-
<code><![CDATA[getQueryHandlerNames]]></code>
1031-
</UndefinedInterfaceMethod>
10321011
<UnusedVariable>
10331012
<code><![CDATA[$headers]]></code>
10341013
</UnusedVariable>
10351014
</file>
1036-
<file src="src/Internal/Transport/Router/InvokeSignal.php">
1037-
<ArgumentTypeCoercion>
1038-
<code><![CDATA[$request->getID()]]></code>
1039-
<code><![CDATA[$request->getID()]]></code>
1040-
</ArgumentTypeCoercion>
1041-
<PossiblyUndefinedStringArrayOffset>
1042-
<code><![CDATA[$request->getOptions()['name']]]></code>
1043-
</PossiblyUndefinedStringArrayOffset>
1044-
</file>
10451015
<file src="src/Internal/Transport/Router/InvokeUpdate.php">
10461016
<ArgumentTypeCoercion>
10471017
<code><![CDATA[$request->getID()]]></code>
@@ -1052,8 +1022,6 @@
10521022
</PossiblyUndefinedStringArrayOffset>
10531023
<UndefinedInterfaceMethod>
10541024
<code><![CDATA[cancel]]></code>
1055-
<code><![CDATA[findValidateUpdateHandler]]></code>
1056-
<code><![CDATA[getUpdateHandlerNames]]></code>
10571025
</UndefinedInterfaceMethod>
10581026
</file>
10591027
<file src="src/Internal/Transport/Router/StackTrace.php">
@@ -1491,8 +1459,8 @@
14911459
<file src="src/Workflow.php">
14921460
<InvalidReturnStatement>
14931461
<code><![CDATA[self::getCurrentContext()->newActivityStub($class, $options)]]></code>
1494-
<code><![CDATA[self::getCurrentContext()->registerQuery($queryType, $handler)]]></code>
1495-
<code><![CDATA[self::getCurrentContext()->registerSignal($name, $handler)]]></code>
1462+
<code><![CDATA[self::getCurrentContext()->registerQuery($queryType, $handler, $description)]]></code>
1463+
<code><![CDATA[self::getCurrentContext()->registerSignal($name, $handler, $description)]]></code>
14961464
</InvalidReturnStatement>
14971465
<InvalidReturnType>
14981466
<code><![CDATA[ScopedContextInterface]]></code>

src/Internal/Declaration/Instantiator/WorkflowInstantiator.php

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,13 @@
2323
*/
2424
final class WorkflowInstantiator extends Instantiator
2525
{
26-
public function __construct(
27-
private PipelineProvider $interceptorProvider,
28-
) {}
29-
3026
public function instantiate(PrototypeInterface $prototype): WorkflowInstance
3127
{
3228
\assert($prototype instanceof WorkflowPrototype, 'Precondition failed');
3329

3430
return new WorkflowInstance(
3531
$prototype,
3632
$this->getInstance($prototype),
37-
$this->interceptorProvider->getPipeline(WorkflowInboundCallsInterceptor::class),
3833
);
3934
}
4035

src/Internal/Declaration/WorkflowInstance.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,10 @@ final class WorkflowInstance extends Instance implements WorkflowInstanceInterfa
2929

3030
/**
3131
* @param object $context Workflow object
32-
* @param Interceptor\Pipeline<WorkflowInboundCallsInterceptor, mixed> $pipeline
3332
*/
3433
public function __construct(
3534
private readonly WorkflowPrototype $prototype,
3635
object $context,
37-
Interceptor\Pipeline $pipeline,
3836
) {
3937
parent::__construct($prototype, $context);
4038

src/Internal/Transport/Router/InvokeQuery.php

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,7 @@ public function handle(ServerRequestInterface $request, array $headers, Deferred
5151
$context = $process->getContext();
5252

5353
match ($name) {
54-
// todo: refactor
55-
'__temporal_workflow_metadata' => $resolver->resolve(
56-
EncodedValues::fromValues([(new WorkflowMetadata())->setDefinition(
57-
(new WorkflowDefinition())
58-
->setQueryDefinitions($context->getQueryDispatcher()->getQueryHandlers())
59-
->setSignalDefinitions($context->getSignalDispatcher()->getSignalHandlers())
60-
->setUpdateDefinitions($context->getUpdateDispatcher()->getUpdateHandlers()),
61-
)]),
62-
),
54+
'__temporal_workflow_metadata' => $this->getWorkflowMetadata($resolver, $context),
6355
default => $this->handleQuery($name, $request, $resolver, $context, $headers),
6456
};
6557
}
@@ -112,4 +104,31 @@ private function findQueryHandlerOrFail(QueryDispatcher $dispatcher, string $nam
112104
),
113105
);
114106
}
107+
108+
/**
109+
* Returns workflow metadata including query, signal, and update definitions.
110+
*/
111+
private function getWorkflowMetadata(Deferred $resolver, WorkflowContext $context): void
112+
{
113+
$this->loop->once(
114+
LoopInterface::ON_QUERY,
115+
static function () use ($resolver, $context): void {
116+
try {
117+
$result = EncodedValues::fromValues([
118+
(new WorkflowMetadata())->setDefinition(
119+
(new WorkflowDefinition())
120+
->setQueryDefinitions($context->getQueryDispatcher()->getQueryHandlers())
121+
->setSignalDefinitions($context->getSignalDispatcher()->getSignalHandlers())
122+
->setUpdateDefinitions($context->getUpdateDispatcher()->getUpdateHandlers()),
123+
)
124+
]);
125+
126+
$resolver->resolve($result);
127+
} catch (\Throwable $e) {
128+
$resolver->reject($e);
129+
}
130+
},
131+
);
132+
133+
}
115134
}

src/Internal/Transport/Router/InvokeSignal.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,20 @@ final class InvokeSignal extends WorkflowProcessAwareRoute
1919
{
2020
public function handle(ServerRequestInterface $request, array $headers, Deferred $resolver): void
2121
{
22-
$process = $this->findProcessOrFail($request->getID());
22+
$signalName = $request->getOptions()['name'] ?? '';
23+
$requestId = $request->getID();
24+
25+
\assert(\is_string($signalName) && $signalName !== '');
26+
\assert($requestId !== '');
27+
28+
$process = $this->findProcessOrFail($requestId);
2329
$handler = $process
2430
->getContext()
2531
->getSignalDispatcher()
26-
->getSignalHandler($request->getOptions()['name']);
32+
->getSignalHandler($signalName);
2733

2834
// Get Workflow context
29-
$context = $this->findProcessOrFail($request->getID())->getContext();
35+
$context = $this->findProcessOrFail($requestId)->getContext();
3036

3137
$info = $context->getInfo();
3238
$tickInfo = $request->getTickInfo();

src/Internal/Transport/Router/StartWorkflow.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public function __construct(
3939
private readonly ServiceContainer $services,
4040
) {
4141
$this->wfStartDeferred = FeatureFlags::$workflowDeferredHandlerStart;
42-
$this->instantiator = new WorkflowInstantiator($services->interceptorProvider);
42+
$this->instantiator = new WorkflowInstantiator();
4343
}
4444

4545
public function handle(ServerRequestInterface $request, array $headers, Deferred $resolver): void

src/Worker/Transport/Command/Server/ServerRequest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ class ServerRequest implements ServerRequestInterface
3939
* @param RequestOptions $options
4040
*/
4141
public function __construct(
42-
private string $name,
43-
private TickInfo $info,
44-
private array $options = [],
42+
private readonly string $name,
43+
private readonly TickInfo $info,
44+
private readonly array $options = [],
4545
?ValuesInterface $payloads = null,
4646
?string $id = null,
4747
?HeaderInterface $header = null,
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Temporal\Tests\Acceptance\Extra\Workflow\Metadata;
6+
7+
use PHPUnit\Framework\Attributes\Test;
8+
use Temporal\Api\Sdk\V1\WorkflowInteractionDefinition;
9+
use Temporal\Api\Sdk\V1\WorkflowMetadata;
10+
use Temporal\Client\WorkflowStubInterface;
11+
use Temporal\DataConverter\ValuesInterface;
12+
use Temporal\Tests\Acceptance\App\Attribute\Stub;
13+
use Temporal\Tests\Acceptance\App\TestCase;
14+
use Temporal\Workflow;
15+
use Temporal\Workflow\QueryMethod;
16+
use Temporal\Workflow\SignalMethod;
17+
use Temporal\Workflow\WorkflowInterface;
18+
use Temporal\Workflow\WorkflowMethod;
19+
20+
class MetadataTest extends TestCase
21+
{
22+
#[Test]
23+
public static function withoutDynamicHandlers(
24+
#[Stub('Extra_Workflow_Metadata')] WorkflowStubInterface $stub,
25+
): void {
26+
$metadata = $stub->query('__temporal_workflow_metadata')?->getValue(0, WorkflowMetadata::class);
27+
28+
self::assertInstanceOf(WorkflowMetadata::class, $metadata);
29+
self::assertNotNull($metadata->getDefinition());
30+
self::assertCount(1, $metadata->getDefinition()->getQueryDefinitions());
31+
self::assertCount(2, $metadata->getDefinition()->getSignalDefinitions());
32+
self::assertCount(0, $metadata->getDefinition()->getUpdateDefinitions());
33+
}
34+
35+
#[Test]
36+
public static function withDynamicHandlers(
37+
#[Stub('Extra_Workflow_Metadata', args: [true])]
38+
WorkflowStubInterface $stub,
39+
): void {
40+
/** @var WorkflowMetadata $metadata */
41+
$metadata = $stub->query('__temporal_workflow_metadata')?->getValue(0, WorkflowMetadata::class);
42+
43+
/** @var \ArrayAccess<int, WorkflowInteractionDefinition>|list<WorkflowInteractionDefinition> $queries */
44+
$queries = $metadata->getDefinition()->getQueryDefinitions();
45+
/** @var \ArrayAccess<int, WorkflowInteractionDefinition>|list<WorkflowInteractionDefinition> $signals */
46+
$signals = $metadata->getDefinition()->getSignalDefinitions();
47+
/** @var \ArrayAccess<int, WorkflowInteractionDefinition>|list<WorkflowInteractionDefinition> $updates */
48+
$updates = $metadata->getDefinition()->getUpdateDefinitions();
49+
50+
self::assertInstanceOf(WorkflowMetadata::class, $metadata);
51+
self::assertNotNull($metadata->getDefinition());
52+
53+
# Queries
54+
self::assertCount(2, $queries);
55+
# Dynamic query handler
56+
self::assertSame('Dynamic query handler', $queries[0]->getDescription());
57+
# Static query handler
58+
self::assertSame('get_counter', $queries[1]->getName());
59+
self::assertSame('Get the current counter value', $queries[1]->getDescription());
60+
61+
# Signals
62+
self::assertCount(3, $signals);
63+
# Dynamic signal handler
64+
self::assertSame('Dynamic signal handler', $signals[0]->getDescription());
65+
# Static signal handlers
66+
self::assertSame('finish', $signals[1]->getName());
67+
self::assertSame('Finish the workflow', $signals[1]->getDescription());
68+
self::assertSame('inc_counter', $signals[2]->getName());
69+
self::assertSame('', $signals[2]->getDescription());
70+
71+
# Updates
72+
self::assertCount(1, $updates);
73+
self::assertSame('Dynamic update handler', $updates[0]->getDescription());
74+
75+
}
76+
}
77+
78+
#[WorkflowInterface]
79+
class FeatureWorkflow
80+
{
81+
private int $counter = 0;
82+
private bool $beDone = false;
83+
84+
#[WorkflowMethod('Extra_Workflow_Metadata')]
85+
public function run(bool $registerFallbacks = false)
86+
{
87+
if ($registerFallbacks) {
88+
Workflow::registerDynamicQuery(static fn(string $name, ValuesInterface $values): mixed => $name);
89+
Workflow::registerDynamicSignal(static fn(string $name, ValuesInterface $values): mixed => $name);
90+
Workflow::registerDynamicUpdate(
91+
static fn(string $name, ValuesInterface $values): mixed => $name,
92+
static fn(string $name, ValuesInterface $values) => null,
93+
);
94+
}
95+
96+
yield Workflow::await(fn(): bool => $this->beDone);
97+
}
98+
99+
#[QueryMethod('get_counter', description: 'Get the current counter value')]
100+
public function getCounter(): int
101+
{
102+
return $this->counter;
103+
}
104+
105+
#[SignalMethod('inc_counter')]
106+
public function incCounter(): void
107+
{
108+
++$this->counter;
109+
}
110+
111+
#[SignalMethod('finish', description: 'Finish the workflow')]
112+
public function finish(): void
113+
{
114+
$this->beDone = true;
115+
}
116+
}

tests/Acceptance/Harness/Query/MetadataTest.php

Lines changed: 0 additions & 62 deletions
This file was deleted.

tests/Unit/Declaration/WorkflowDeclarationTestCase.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ public function testWorkflowWithInitConstructor(WorkflowReader $reader): void
219219

220220
public function testHierarchicalWorkflow(): void
221221
{
222-
$instantiator = new WorkflowInstantiator(new \Temporal\Interceptor\SimplePipelineProvider());
222+
$instantiator = new WorkflowInstantiator();
223223

224224
$instance = $instantiator->instantiate(
225225
new WorkflowPrototype(
@@ -243,7 +243,7 @@ public function testWorkflowWithInterface(): void
243243

244244
public function testInstantiateWorkflowWithInterface(): void
245245
{
246-
$instantiator = new WorkflowInstantiator(new \Temporal\Interceptor\SimplePipelineProvider());
246+
$instantiator = new WorkflowInstantiator();
247247
$reader = new WorkflowReader(new AttributeReader());
248248
$prototype = $reader->fromClass(AggregatedWorkflowImpl::class);
249249

0 commit comments

Comments
 (0)