Skip to content

Commit 4ddf411

Browse files
[cross-repo from workflow#412] server + workflow: add explicit v2 local activities support (#113)
1 parent 6bfd235 commit 4ddf411

3 files changed

Lines changed: 72 additions & 0 deletions

File tree

app/Support/WorkerProtocol.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public static function supportedWorkflowTaskCommands(): array
9090
* query_tasks: bool,
9191
* activity_retry_policy: bool,
9292
* activity_timeouts: bool,
93+
* local_activities: array<string, mixed>,
9394
* worker_session_verbs: list<string>,
9495
* worker_sessions: array<string, mixed>,
9596
* child_workflow_retry_policy: bool,
@@ -126,6 +127,7 @@ public static function serverCapabilities(): array
126127
'query_tasks' => true,
127128
'activity_retry_policy' => true,
128129
'activity_timeouts' => true,
130+
'local_activities' => self::localActivitySemantics(),
129131
'worker_session_verbs' => method_exists(WorkerProtocolVersion::class, 'workerSessionVerbs')
130132
? WorkerProtocolVersion::workerSessionVerbs()
131133
: ['create', 'heartbeat', 'close'],
@@ -176,6 +178,52 @@ public static function serverCapabilities(): array
176178
];
177179
}
178180

181+
/**
182+
* @return array<string, mixed>
183+
*/
184+
private static function localActivitySemantics(): array
185+
{
186+
if (method_exists(WorkerProtocolVersion::class, 'localActivitySemantics')) {
187+
return WorkerProtocolVersion::localActivitySemantics();
188+
}
189+
190+
return [
191+
'schema' => 'durable-workflow.v2.local-activity.contract',
192+
'version' => 1,
193+
'supported' => false,
194+
'api' => [
195+
'functions' => ['Workflow\\V2\\localActivity'],
196+
'workflow_facade' => [
197+
'Workflow\\V2\\Workflow::localActivity',
198+
'Workflow\\V2\\Workflow::executeLocalActivity',
199+
],
200+
'options' => 'Workflow\\V2\\Support\\LocalActivityOptions',
201+
],
202+
'execution' => [
203+
'mode' => 'local',
204+
'same_process' => true,
205+
'ordinary_activity_task_created' => false,
206+
'history_marker' => [
207+
'execution_mode' => 'local',
208+
'local_activity' => true,
209+
],
210+
],
211+
'routing' => [
212+
'admission' => 'activity_class_must_resolve_in_the_workflow_worker_process',
213+
'queue_bypassed' => true,
214+
'rejected_options' => ['connection', 'queue', 'worker_session', 'schedule_to_start_timeout'],
215+
],
216+
'retry' => [
217+
'cold_replay_reason' => 'cold_replay',
218+
],
219+
'visibility' => [
220+
'activity_execution_marker' => 'activity_options.execution_mode',
221+
'history_marker' => 'payload.execution_mode',
222+
'metrics_marker' => 'activities.local_*',
223+
],
224+
];
225+
}
226+
179227
/**
180228
* @return array{
181229
* version: string,

tests/Feature/ClusterInfoTest.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,20 @@ public function test_it_advertises_worker_command_option_capabilities_in_worker_
11371137
->assertOk()
11381138
->assertJsonPath('worker_protocol.server_capabilities.activity_retry_policy', true)
11391139
->assertJsonPath('worker_protocol.server_capabilities.activity_timeouts', true)
1140+
->assertJsonPath(
1141+
'worker_protocol.server_capabilities.local_activities.schema',
1142+
'durable-workflow.v2.local-activity.contract',
1143+
)
1144+
->assertJsonPath('worker_protocol.server_capabilities.local_activities.version', 1)
1145+
->assertJsonPath('worker_protocol.server_capabilities.local_activities.execution.mode', 'local')
1146+
->assertJsonPath(
1147+
'worker_protocol.server_capabilities.local_activities.execution.ordinary_activity_task_created',
1148+
false,
1149+
)
1150+
->assertJsonPath(
1151+
'worker_protocol.server_capabilities.local_activities.routing.rejected_options',
1152+
['connection', 'queue', 'worker_session', 'schedule_to_start_timeout'],
1153+
)
11401154
->assertJsonPath('worker_protocol.server_capabilities.child_workflow_retry_policy', true)
11411155
->assertJsonPath('worker_protocol.server_capabilities.child_workflow_timeouts', true)
11421156
->assertJsonPath('worker_protocol.server_capabilities.parent_close_policy', true)

tests/Feature/WorkerProtocolSuccessContractTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,16 @@ public function test_worker_success_responses_use_worker_protocol_contract(
142142
->assertJsonPath('server_capabilities.supported_workflow_task_commands.0', 'complete_workflow')
143143
->assertJsonPath('server_capabilities.activity_retry_policy', true)
144144
->assertJsonPath('server_capabilities.activity_timeouts', true)
145+
->assertJsonPath(
146+
'server_capabilities.local_activities.schema',
147+
'durable-workflow.v2.local-activity.contract',
148+
)
149+
->assertJsonPath('server_capabilities.local_activities.version', 1)
150+
->assertJsonPath('server_capabilities.local_activities.execution.mode', 'local')
151+
->assertJsonPath(
152+
'server_capabilities.local_activities.execution.ordinary_activity_task_created',
153+
false,
154+
)
145155
->assertJsonPath('server_capabilities.child_workflow_retry_policy', true)
146156
->assertJsonPath('server_capabilities.child_workflow_timeouts', true)
147157
->assertJsonPath('server_capabilities.parent_close_policy', true)

0 commit comments

Comments
 (0)