2
2
3
3
from dataclasses import dataclass , field
4
4
from enum import Enum
5
- from typing import Dict , List , Optional , Callable
5
+ from typing import Dict , List , Optional , Callable , TypedDict , Literal
6
6
7
7
from cadence .api .v1 import (
8
8
decision_pb2 as decision ,
@@ -81,12 +81,18 @@ def __str__(self) -> str:
81
81
@dataclass
82
82
class StateTransition :
83
83
"""Represents a state transition with associated actions."""
84
- next_state : DecisionState
84
+ next_state : Optional [ DecisionState ]
85
85
action : Optional [Callable [['BaseDecisionStateMachine' , history .HistoryEvent ], None ]] = None
86
86
condition : Optional [Callable [['BaseDecisionStateMachine' , history .HistoryEvent ], bool ]] = None
87
87
88
88
89
- decision_state_transition_map = {
89
+ class TransitionInfo (TypedDict ):
90
+ type : Literal ["initiated" , "started" , "completion" , "canceled" , "cancel_initiated" , "cancel_failed" , "initiation_failed" ]
91
+ decision_type : DecisionType
92
+ transition : StateTransition
93
+
94
+
95
+ decision_state_transition_map : Dict [str , TransitionInfo ] = {
90
96
"activity_task_scheduled_event_attributes" : {
91
97
"type" : "initiated" ,
92
98
"decision_type" : DecisionType .ACTIVITY ,
@@ -247,6 +253,10 @@ class BaseDecisionStateMachine:
247
253
Subclasses are responsible for mapping workflow history events into state
248
254
transitions and producing the next set of decisions when queried.
249
255
"""
256
+
257
+ # Common fields that subclasses may use
258
+ scheduled_event_id : Optional [int ] = None
259
+ started_event_id : Optional [int ] = None
250
260
251
261
def get_id (self ) -> str :
252
262
raise NotImplementedError
@@ -890,12 +900,12 @@ def handle_history_event(self, event: history.HistoryEvent) -> None:
890
900
if transition_info :
891
901
event_type = transition_info ["type" ]
892
902
# Route to all relevant machines using the new unified handle_event method
893
- for m in list (self .activities .values ()):
894
- m .handle_event (event , event_type )
895
- for m in list (self .timers .values ()):
896
- m .handle_event (event , event_type )
897
- for m in list (self .children .values ()):
898
- m .handle_event (event , event_type )
903
+ for activity_machine in list (self .activities .values ()):
904
+ activity_machine .handle_event (event , event_type )
905
+ for timer_machine in list (self .timers .values ()):
906
+ timer_machine .handle_event (event , event_type )
907
+ for child_machine in list (self .children .values ()):
908
+ child_machine .handle_event (event , event_type )
899
909
900
910
# ----- Decision aggregation -----
901
911
@@ -907,11 +917,11 @@ def collect_pending_decisions(self) -> List[decision.Decision]:
907
917
decisions .extend (machine .collect_pending_decisions ())
908
918
909
919
# Timers
910
- for machine in list (self .timers .values ()):
911
- decisions .extend (machine .collect_pending_decisions ())
920
+ for timer_machine in list (self .timers .values ()):
921
+ decisions .extend (timer_machine .collect_pending_decisions ())
912
922
913
923
# Children
914
- for machine in list (self .children .values ()):
915
- decisions .extend (machine .collect_pending_decisions ())
924
+ for child_machine in list (self .children .values ()):
925
+ decisions .extend (child_machine .collect_pending_decisions ())
916
926
917
927
return decisions
0 commit comments