temporalio 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (469) hide show
  1. checksums.yaml +4 -4
  2. data/Cargo.lock +4035 -0
  3. data/Cargo.toml +25 -0
  4. data/Gemfile +20 -0
  5. data/LICENSE +16 -15
  6. data/README.md +455 -195
  7. data/Rakefile +387 -0
  8. data/ext/Cargo.toml +25 -0
  9. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  10. data/lib/temporalio/activity/context.rb +82 -77
  11. data/lib/temporalio/activity/definition.rb +77 -0
  12. data/lib/temporalio/activity/info.rb +42 -46
  13. data/lib/temporalio/activity.rb +49 -65
  14. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  15. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
  16. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  17. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  18. data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
  19. data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
  20. data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
  21. data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
  22. data/lib/temporalio/api/command/v1/message.rb +46 -0
  23. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  24. data/lib/temporalio/api/common/v1/message.rb +41 -0
  25. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  26. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  27. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  28. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  29. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  30. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  31. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  32. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  33. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  34. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  35. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  36. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  37. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  38. data/lib/temporalio/api/export/v1/message.rb +24 -0
  39. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  40. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  41. data/lib/temporalio/api/history/v1/message.rb +90 -0
  42. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  43. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  44. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  45. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  46. data/lib/temporalio/api/operatorservice.rb +3 -0
  47. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  48. data/lib/temporalio/api/query/v1/message.rb +27 -0
  49. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  50. data/lib/temporalio/api/schedule/v1/message.rb +42 -0
  51. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  52. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  53. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  54. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  55. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  56. data/lib/temporalio/api/update/v1/message.rb +33 -0
  57. data/lib/temporalio/api/version/v1/message.rb +26 -0
  58. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  59. data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
  60. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  61. data/lib/temporalio/api/workflowservice.rb +3 -0
  62. data/lib/temporalio/api.rb +13 -0
  63. data/lib/temporalio/cancellation.rb +150 -0
  64. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  65. data/lib/temporalio/client/async_activity_handle.rb +110 -0
  66. data/lib/temporalio/client/connection/cloud_service.rb +648 -0
  67. data/lib/temporalio/client/connection/operator_service.rb +249 -0
  68. data/lib/temporalio/client/connection/service.rb +41 -0
  69. data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
  70. data/lib/temporalio/client/connection.rb +270 -0
  71. data/lib/temporalio/client/interceptor.rb +316 -0
  72. data/lib/temporalio/client/workflow_execution.rb +103 -0
  73. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  74. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  75. data/lib/temporalio/client/workflow_handle.rb +380 -177
  76. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  77. data/lib/temporalio/client/workflow_update_handle.rb +67 -0
  78. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  79. data/lib/temporalio/client.rb +366 -93
  80. data/lib/temporalio/common_enums.rb +24 -0
  81. data/lib/temporalio/converters/data_converter.rb +102 -0
  82. data/lib/temporalio/converters/failure_converter.rb +200 -0
  83. data/lib/temporalio/converters/payload_codec.rb +26 -0
  84. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  85. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  86. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  87. data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
  88. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  89. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  90. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  91. data/lib/temporalio/converters/payload_converter.rb +73 -0
  92. data/lib/temporalio/converters.rb +9 -0
  93. data/lib/temporalio/error/failure.rb +119 -94
  94. data/lib/temporalio/error.rb +147 -0
  95. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  96. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  97. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  98. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  99. data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
  100. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  101. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
  102. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
  103. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  104. data/lib/temporalio/internal/bridge/api.rb +3 -0
  105. data/lib/temporalio/internal/bridge/client.rb +90 -0
  106. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  107. data/lib/temporalio/internal/bridge/testing.rb +46 -0
  108. data/lib/temporalio/internal/bridge/worker.rb +83 -0
  109. data/lib/temporalio/internal/bridge.rb +36 -0
  110. data/lib/temporalio/internal/client/implementation.rb +525 -0
  111. data/lib/temporalio/internal/proto_utils.rb +54 -0
  112. data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
  113. data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
  114. data/lib/temporalio/internal.rb +7 -0
  115. data/lib/temporalio/retry_policy.rb +39 -80
  116. data/lib/temporalio/runtime.rb +259 -13
  117. data/lib/temporalio/scoped_logger.rb +96 -0
  118. data/lib/temporalio/search_attributes.rb +300 -0
  119. data/lib/temporalio/testing/activity_environment.rb +132 -0
  120. data/lib/temporalio/testing/workflow_environment.rb +113 -88
  121. data/lib/temporalio/testing.rb +4 -169
  122. data/lib/temporalio/version.rb +3 -1
  123. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  124. data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
  125. data/lib/temporalio/worker/activity_executor.rb +55 -0
  126. data/lib/temporalio/worker/interceptor.rb +88 -0
  127. data/lib/temporalio/worker/tuner.rb +151 -0
  128. data/lib/temporalio/worker.rb +385 -163
  129. data/lib/temporalio/workflow_history.rb +22 -0
  130. data/lib/temporalio.rb +2 -7
  131. data/temporalio.gemspec +20 -38
  132. metadata +131 -596
  133. data/bridge/Cargo.lock +0 -2997
  134. data/bridge/Cargo.toml +0 -29
  135. data/bridge/sdk-core/ARCHITECTURE.md +0 -76
  136. data/bridge/sdk-core/Cargo.toml +0 -2
  137. data/bridge/sdk-core/LICENSE.txt +0 -23
  138. data/bridge/sdk-core/README.md +0 -117
  139. data/bridge/sdk-core/arch_docs/diagrams/README.md +0 -10
  140. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +0 -40
  141. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
  142. data/bridge/sdk-core/arch_docs/sticky_queues.md +0 -51
  143. data/bridge/sdk-core/client/Cargo.toml +0 -40
  144. data/bridge/sdk-core/client/LICENSE.txt +0 -23
  145. data/bridge/sdk-core/client/src/lib.rs +0 -1462
  146. data/bridge/sdk-core/client/src/metrics.rs +0 -174
  147. data/bridge/sdk-core/client/src/raw.rs +0 -932
  148. data/bridge/sdk-core/client/src/retry.rs +0 -763
  149. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +0 -185
  150. data/bridge/sdk-core/core/Cargo.toml +0 -129
  151. data/bridge/sdk-core/core/LICENSE.txt +0 -23
  152. data/bridge/sdk-core/core/benches/workflow_replay.rs +0 -76
  153. data/bridge/sdk-core/core/src/abstractions.rs +0 -355
  154. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +0 -1049
  155. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +0 -221
  156. data/bridge/sdk-core/core/src/core_tests/determinism.rs +0 -270
  157. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +0 -1046
  158. data/bridge/sdk-core/core/src/core_tests/mod.rs +0 -100
  159. data/bridge/sdk-core/core/src/core_tests/queries.rs +0 -893
  160. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +0 -65
  161. data/bridge/sdk-core/core/src/core_tests/workers.rs +0 -257
  162. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +0 -124
  163. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +0 -2433
  164. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +0 -609
  165. data/bridge/sdk-core/core/src/internal_flags.rs +0 -136
  166. data/bridge/sdk-core/core/src/lib.rs +0 -289
  167. data/bridge/sdk-core/core/src/pollers/mod.rs +0 -54
  168. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +0 -297
  169. data/bridge/sdk-core/core/src/protosext/mod.rs +0 -428
  170. data/bridge/sdk-core/core/src/replay/mod.rs +0 -215
  171. data/bridge/sdk-core/core/src/retry_logic.rs +0 -202
  172. data/bridge/sdk-core/core/src/telemetry/log_export.rs +0 -190
  173. data/bridge/sdk-core/core/src/telemetry/metrics.rs +0 -462
  174. data/bridge/sdk-core/core/src/telemetry/mod.rs +0 -423
  175. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +0 -83
  176. data/bridge/sdk-core/core/src/test_help/mod.rs +0 -939
  177. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +0 -536
  178. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +0 -89
  179. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +0 -1278
  180. data/bridge/sdk-core/core/src/worker/activities.rs +0 -557
  181. data/bridge/sdk-core/core/src/worker/client/mocks.rs +0 -107
  182. data/bridge/sdk-core/core/src/worker/client.rs +0 -389
  183. data/bridge/sdk-core/core/src/worker/mod.rs +0 -677
  184. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
  185. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +0 -99
  186. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +0 -1111
  187. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +0 -964
  188. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -294
  189. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -168
  190. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +0 -918
  191. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +0 -137
  192. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -158
  193. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +0 -130
  194. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +0 -1525
  195. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +0 -324
  196. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -179
  197. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +0 -659
  198. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -439
  199. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +0 -435
  200. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +0 -175
  201. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +0 -249
  202. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +0 -85
  203. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +0 -1280
  204. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +0 -269
  205. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -213
  206. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +0 -1305
  207. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +0 -1276
  208. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +0 -128
  209. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +0 -125
  210. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +0 -85
  211. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +0 -117
  212. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +0 -24
  213. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +0 -715
  214. data/bridge/sdk-core/core-api/Cargo.toml +0 -33
  215. data/bridge/sdk-core/core-api/LICENSE.txt +0 -23
  216. data/bridge/sdk-core/core-api/src/errors.rs +0 -62
  217. data/bridge/sdk-core/core-api/src/lib.rs +0 -113
  218. data/bridge/sdk-core/core-api/src/telemetry.rs +0 -141
  219. data/bridge/sdk-core/core-api/src/worker.rs +0 -161
  220. data/bridge/sdk-core/etc/deps.svg +0 -162
  221. data/bridge/sdk-core/etc/dynamic-config.yaml +0 -2
  222. data/bridge/sdk-core/etc/otel-collector-config.yaml +0 -36
  223. data/bridge/sdk-core/etc/prometheus.yaml +0 -6
  224. data/bridge/sdk-core/etc/regen-depgraph.sh +0 -5
  225. data/bridge/sdk-core/fsm/Cargo.toml +0 -18
  226. data/bridge/sdk-core/fsm/LICENSE.txt +0 -23
  227. data/bridge/sdk-core/fsm/README.md +0 -3
  228. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +0 -27
  229. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +0 -23
  230. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +0 -650
  231. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +0 -8
  232. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +0 -18
  233. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +0 -12
  234. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +0 -41
  235. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +0 -14
  236. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +0 -11
  237. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +0 -32
  238. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +0 -31
  239. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +0 -46
  240. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +0 -29
  241. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +0 -12
  242. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +0 -32
  243. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +0 -18
  244. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +0 -5
  245. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +0 -11
  246. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +0 -5
  247. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +0 -11
  248. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +0 -5
  249. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +0 -14
  250. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +0 -23
  251. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +0 -254
  252. data/bridge/sdk-core/fsm/src/lib.rs +0 -2
  253. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  254. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  255. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  256. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  257. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  258. data/bridge/sdk-core/integ-with-otel.sh +0 -7
  259. data/bridge/sdk-core/protos/api_upstream/README.md +0 -9
  260. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
  261. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -9
  262. data/bridge/sdk-core/protos/api_upstream/build/go.mod +0 -7
  263. data/bridge/sdk-core/protos/api_upstream/build/go.sum +0 -5
  264. data/bridge/sdk-core/protos/api_upstream/build/tools.go +0 -29
  265. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +0 -141
  266. data/bridge/sdk-core/protos/api_upstream/go.mod +0 -6
  267. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +0 -89
  268. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +0 -248
  269. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +0 -123
  270. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -47
  271. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +0 -52
  272. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +0 -56
  273. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +0 -170
  274. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +0 -123
  275. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +0 -51
  276. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +0 -50
  277. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +0 -41
  278. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +0 -60
  279. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -59
  280. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +0 -56
  281. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +0 -122
  282. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +0 -108
  283. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +0 -114
  284. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +0 -56
  285. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +0 -787
  286. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +0 -99
  287. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +0 -124
  288. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +0 -80
  289. data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +0 -57
  290. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +0 -61
  291. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +0 -55
  292. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +0 -379
  293. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +0 -63
  294. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +0 -108
  295. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +0 -111
  296. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +0 -59
  297. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +0 -146
  298. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +0 -1199
  299. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +0 -415
  300. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +0 -63
  301. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +0 -79
  302. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +0 -80
  303. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -78
  304. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +0 -16
  305. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +0 -31
  306. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +0 -31
  307. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +0 -270
  308. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +0 -305
  309. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -35
  310. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +0 -38
  311. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +0 -13
  312. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
  313. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -63
  314. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -90
  315. data/bridge/sdk-core/rustfmt.toml +0 -1
  316. data/bridge/sdk-core/sdk/Cargo.toml +0 -48
  317. data/bridge/sdk-core/sdk/LICENSE.txt +0 -23
  318. data/bridge/sdk-core/sdk/src/activity_context.rs +0 -230
  319. data/bridge/sdk-core/sdk/src/app_data.rs +0 -37
  320. data/bridge/sdk-core/sdk/src/interceptors.rs +0 -50
  321. data/bridge/sdk-core/sdk/src/lib.rs +0 -861
  322. data/bridge/sdk-core/sdk/src/payload_converter.rs +0 -11
  323. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +0 -295
  324. data/bridge/sdk-core/sdk/src/workflow_context.rs +0 -694
  325. data/bridge/sdk-core/sdk/src/workflow_future.rs +0 -500
  326. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +0 -33
  327. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +0 -23
  328. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -142
  329. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +0 -7
  330. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +0 -557
  331. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +0 -234
  332. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +0 -2088
  333. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +0 -48
  334. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +0 -14
  335. data/bridge/sdk-core/test-utils/Cargo.toml +0 -38
  336. data/bridge/sdk-core/test-utils/src/canned_histories.rs +0 -1389
  337. data/bridge/sdk-core/test-utils/src/histfetch.rs +0 -28
  338. data/bridge/sdk-core/test-utils/src/lib.rs +0 -709
  339. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +0 -50
  340. data/bridge/sdk-core/test-utils/src/workflows.rs +0 -29
  341. data/bridge/sdk-core/tests/fuzzy_workflow.rs +0 -130
  342. data/bridge/sdk-core/tests/heavy_tests.rs +0 -265
  343. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +0 -36
  344. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +0 -150
  345. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +0 -223
  346. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +0 -239
  347. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -90
  348. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +0 -314
  349. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +0 -151
  350. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +0 -902
  351. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
  352. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +0 -60
  353. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +0 -51
  354. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +0 -51
  355. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +0 -64
  356. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +0 -47
  357. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +0 -669
  358. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +0 -54
  359. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +0 -92
  360. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +0 -228
  361. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +0 -94
  362. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +0 -171
  363. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +0 -85
  364. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +0 -120
  365. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +0 -77
  366. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +0 -596
  367. data/bridge/sdk-core/tests/main.rs +0 -103
  368. data/bridge/sdk-core/tests/runner.rs +0 -132
  369. data/bridge/sdk-core/tests/wf_input_replay.rs +0 -32
  370. data/bridge/src/connection.rs +0 -202
  371. data/bridge/src/lib.rs +0 -494
  372. data/bridge/src/runtime.rs +0 -54
  373. data/bridge/src/test_server.rs +0 -153
  374. data/bridge/src/worker.rs +0 -197
  375. data/ext/Rakefile +0 -9
  376. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +0 -14
  377. data/lib/gen/temporal/api/batch/v1/message_pb.rb +0 -50
  378. data/lib/gen/temporal/api/command/v1/message_pb.rb +0 -160
  379. data/lib/gen/temporal/api/common/v1/message_pb.rb +0 -73
  380. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +0 -33
  381. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +0 -37
  382. data/lib/gen/temporal/api/enums/v1/common_pb.rb +0 -42
  383. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +0 -68
  384. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +0 -79
  385. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +0 -37
  386. data/lib/gen/temporal/api/enums/v1/query_pb.rb +0 -31
  387. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +0 -24
  388. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +0 -28
  389. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +0 -30
  390. data/lib/gen/temporal/api/enums/v1/update_pb.rb +0 -25
  391. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +0 -89
  392. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +0 -84
  393. data/lib/gen/temporal/api/failure/v1/message_pb.rb +0 -83
  394. data/lib/gen/temporal/api/filter/v1/message_pb.rb +0 -40
  395. data/lib/gen/temporal/api/history/v1/message_pb.rb +0 -498
  396. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +0 -64
  397. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +0 -88
  398. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +0 -20
  399. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +0 -30
  400. data/lib/gen/temporal/api/query/v1/message_pb.rb +0 -38
  401. data/lib/gen/temporal/api/replication/v1/message_pb.rb +0 -37
  402. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +0 -149
  403. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +0 -23
  404. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +0 -73
  405. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +0 -49
  406. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +0 -21
  407. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -72
  408. data/lib/gen/temporal/api/version/v1/message_pb.rb +0 -41
  409. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +0 -111
  410. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +0 -798
  411. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +0 -20
  412. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +0 -62
  413. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +0 -61
  414. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +0 -61
  415. data/lib/gen/temporal/sdk/core/common/common_pb.rb +0 -26
  416. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +0 -40
  417. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +0 -31
  418. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +0 -171
  419. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +0 -200
  420. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +0 -41
  421. data/lib/temporalio/bridge/connect_options.rb +0 -15
  422. data/lib/temporalio/bridge/error.rb +0 -8
  423. data/lib/temporalio/bridge/retry_config.rb +0 -24
  424. data/lib/temporalio/bridge/tls_options.rb +0 -19
  425. data/lib/temporalio/bridge.rb +0 -14
  426. data/lib/temporalio/client/implementation.rb +0 -340
  427. data/lib/temporalio/connection/retry_config.rb +0 -44
  428. data/lib/temporalio/connection/service.rb +0 -20
  429. data/lib/temporalio/connection/test_service.rb +0 -92
  430. data/lib/temporalio/connection/tls_options.rb +0 -51
  431. data/lib/temporalio/connection/workflow_service.rb +0 -731
  432. data/lib/temporalio/connection.rb +0 -86
  433. data/lib/temporalio/data_converter.rb +0 -191
  434. data/lib/temporalio/error/workflow_failure.rb +0 -19
  435. data/lib/temporalio/errors.rb +0 -40
  436. data/lib/temporalio/failure_converter/base.rb +0 -26
  437. data/lib/temporalio/failure_converter/basic.rb +0 -319
  438. data/lib/temporalio/failure_converter.rb +0 -7
  439. data/lib/temporalio/interceptor/activity_inbound.rb +0 -22
  440. data/lib/temporalio/interceptor/activity_outbound.rb +0 -24
  441. data/lib/temporalio/interceptor/chain.rb +0 -28
  442. data/lib/temporalio/interceptor/client.rb +0 -127
  443. data/lib/temporalio/interceptor.rb +0 -22
  444. data/lib/temporalio/payload_codec/base.rb +0 -32
  445. data/lib/temporalio/payload_converter/base.rb +0 -24
  446. data/lib/temporalio/payload_converter/bytes.rb +0 -27
  447. data/lib/temporalio/payload_converter/composite.rb +0 -49
  448. data/lib/temporalio/payload_converter/encoding_base.rb +0 -35
  449. data/lib/temporalio/payload_converter/json.rb +0 -26
  450. data/lib/temporalio/payload_converter/nil.rb +0 -26
  451. data/lib/temporalio/payload_converter.rb +0 -14
  452. data/lib/temporalio/retry_state.rb +0 -35
  453. data/lib/temporalio/testing/time_skipping_handle.rb +0 -32
  454. data/lib/temporalio/testing/time_skipping_interceptor.rb +0 -23
  455. data/lib/temporalio/timeout_type.rb +0 -29
  456. data/lib/temporalio/worker/activity_runner.rb +0 -114
  457. data/lib/temporalio/worker/activity_worker.rb +0 -164
  458. data/lib/temporalio/worker/reactor.rb +0 -46
  459. data/lib/temporalio/worker/runner.rb +0 -63
  460. data/lib/temporalio/worker/sync_worker.rb +0 -124
  461. data/lib/temporalio/worker/thread_pool_executor.rb +0 -51
  462. data/lib/temporalio/workflow/async.rb +0 -46
  463. data/lib/temporalio/workflow/execution_info.rb +0 -54
  464. data/lib/temporalio/workflow/execution_status.rb +0 -36
  465. data/lib/temporalio/workflow/future.rb +0 -138
  466. data/lib/temporalio/workflow/id_reuse_policy.rb +0 -36
  467. data/lib/temporalio/workflow/info.rb +0 -76
  468. data/lib/temporalio/workflow/query_reject_condition.rb +0 -33
  469. data/lib/thermite_patch.rb +0 -23
@@ -1,918 +0,0 @@
1
- use super::{
2
- workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
3
- OnEventWrapper, WFMachinesAdapter, WFMachinesError,
4
- };
5
- use crate::{
6
- internal_flags::CoreInternalFlags,
7
- worker::workflow::{machines::HistEventData, InternalFlagsRef},
8
- };
9
- use rustfsm::{fsm, MachineError, TransitionResult};
10
- use std::convert::{TryFrom, TryInto};
11
- use temporal_sdk_core_protos::{
12
- coresdk::{
13
- child_workflow::{
14
- self as wfr, child_workflow_result::Status as ChildWorkflowStatus,
15
- ChildWorkflowCancellationType, ChildWorkflowResult,
16
- },
17
- workflow_activation::{
18
- resolve_child_workflow_execution_start, ResolveChildWorkflowExecution,
19
- ResolveChildWorkflowExecutionStart, ResolveChildWorkflowExecutionStartCancelled,
20
- ResolveChildWorkflowExecutionStartFailure, ResolveChildWorkflowExecutionStartSuccess,
21
- },
22
- workflow_commands::StartChildWorkflowExecution,
23
- },
24
- temporal::api::{
25
- command::v1::{Command, RequestCancelExternalWorkflowExecutionCommandAttributes},
26
- common::v1::{Payload, Payloads, WorkflowExecution, WorkflowType},
27
- enums::v1::{
28
- CommandType, EventType, RetryState, StartChildWorkflowExecutionFailedCause, TimeoutType,
29
- },
30
- failure::v1::{self as failure, failure::FailureInfo, Failure},
31
- history::v1::{
32
- history_event, ChildWorkflowExecutionCompletedEventAttributes,
33
- ChildWorkflowExecutionFailedEventAttributes,
34
- ChildWorkflowExecutionStartedEventAttributes, HistoryEvent,
35
- StartChildWorkflowExecutionFailedEventAttributes,
36
- },
37
- },
38
- };
39
-
40
- fsm! {
41
- pub(super) name ChildWorkflowMachine;
42
- command ChildWorkflowCommand;
43
- error WFMachinesError;
44
- shared_state SharedState;
45
-
46
- Created --(Schedule, on_schedule) --> StartCommandCreated;
47
- StartCommandCreated --(CommandStartChildWorkflowExecution) --> StartCommandCreated;
48
- StartCommandCreated --(StartChildWorkflowExecutionInitiated(ChildWorkflowInitiatedData),
49
- shared on_start_child_workflow_execution_initiated) --> StartEventRecorded;
50
- StartCommandCreated --(Cancel, shared on_cancelled) --> Cancelled;
51
-
52
- StartEventRecorded --(ChildWorkflowExecutionStarted(ChildWorkflowExecutionStartedEvent),
53
- shared on_child_workflow_execution_started) --> Started;
54
- StartEventRecorded --(StartChildWorkflowExecutionFailed(StartChildWorkflowExecutionFailedCause),
55
- on_start_child_workflow_execution_failed) --> StartFailed;
56
-
57
- Started --(ChildWorkflowExecutionCompleted(Option<Payloads>),
58
- on_child_workflow_execution_completed) --> Completed;
59
- Started --(ChildWorkflowExecutionFailed(ChildWorkflowExecutionFailedEventAttributes),
60
- shared on_child_workflow_execution_failed) --> Failed;
61
- Started --(ChildWorkflowExecutionTimedOut(RetryState),
62
- shared on_child_workflow_execution_timed_out) --> TimedOut;
63
- Started --(ChildWorkflowExecutionCancelled,
64
- on_child_workflow_execution_cancelled) --> Cancelled;
65
- Started --(ChildWorkflowExecutionTerminated,
66
- shared on_child_workflow_execution_terminated) --> Terminated;
67
- // If cancelled after started, we need to issue a cancel external workflow command, and then
68
- // the child workflow will resolve somehow, so we want to go back to started and wait for that
69
- // resolution.
70
- Started --(Cancel, shared on_cancelled) --> Started;
71
- // Abandon & try cancel modes may immediately move to cancelled
72
- Started --(Cancel, shared on_cancelled) --> Cancelled;
73
- Started --(CommandRequestCancelExternalWorkflowExecution) --> Started;
74
-
75
- // Ignore any spurious cancellations after resolution
76
- Cancelled --(Cancel) --> Cancelled;
77
- Failed --(Cancel) --> Failed;
78
- StartFailed --(Cancel) --> StartFailed;
79
- TimedOut --(Cancel) --> TimedOut;
80
- Completed --(Cancel) --> Completed;
81
- }
82
-
83
- pub struct ChildWorkflowExecutionStartedEvent {
84
- workflow_execution: WorkflowExecution,
85
- started_event_id: i64,
86
- }
87
-
88
- #[derive(Debug, derive_more::Display)]
89
- pub(super) enum ChildWorkflowCommand {
90
- #[display(fmt = "Start")]
91
- Start(WorkflowExecution),
92
- #[display(fmt = "Complete")]
93
- Complete(Option<Payloads>),
94
- #[display(fmt = "Fail")]
95
- Fail(Failure),
96
- #[display(fmt = "Cancel")]
97
- Cancel,
98
- #[display(fmt = "StartFail")]
99
- StartFail(StartChildWorkflowExecutionFailedCause),
100
- #[display(fmt = "StartCancel")]
101
- StartCancel(Failure),
102
- #[display(fmt = "CancelAfterStarted")]
103
- IssueCancelAfterStarted { reason: String },
104
- }
105
-
106
- pub(super) struct ChildWorkflowInitiatedData {
107
- event_id: i64,
108
- wf_type: String,
109
- wf_id: String,
110
- last_task_in_history: bool,
111
- }
112
-
113
- #[derive(Default, Clone)]
114
- pub(super) struct Cancelled {}
115
-
116
- #[derive(Default, Clone)]
117
- pub(super) struct Completed {}
118
-
119
- #[derive(Default, Clone)]
120
- pub(super) struct Created {}
121
-
122
- impl Created {
123
- pub(super) fn on_schedule(self) -> ChildWorkflowMachineTransition<StartCommandCreated> {
124
- TransitionResult::default()
125
- }
126
- }
127
-
128
- #[derive(Default, Clone)]
129
- pub(super) struct Failed {}
130
-
131
- #[derive(Default, Clone)]
132
- pub(super) struct StartCommandCreated {}
133
-
134
- impl StartCommandCreated {
135
- pub(super) fn on_start_child_workflow_execution_initiated(
136
- self,
137
- state: SharedState,
138
- event_dat: ChildWorkflowInitiatedData,
139
- ) -> ChildWorkflowMachineTransition<StartEventRecorded> {
140
- if state.internal_flags.borrow_mut().try_use(
141
- CoreInternalFlags::IdAndTypeDeterminismChecks,
142
- event_dat.last_task_in_history,
143
- ) {
144
- if event_dat.wf_id != state.workflow_id {
145
- return TransitionResult::Err(WFMachinesError::Nondeterminism(format!(
146
- "Child workflow id of scheduled event '{}' does not \
147
- match child workflow id of activity command '{}'",
148
- event_dat.wf_id, state.workflow_id
149
- )));
150
- }
151
- if event_dat.wf_type != state.workflow_type {
152
- return TransitionResult::Err(WFMachinesError::Nondeterminism(format!(
153
- "Child workflow type of scheduled event '{}' does not \
154
- match child workflow type of activity command '{}'",
155
- event_dat.wf_type, state.workflow_type
156
- )));
157
- }
158
- }
159
- ChildWorkflowMachineTransition::ok_shared(
160
- vec![],
161
- StartEventRecorded::default(),
162
- SharedState {
163
- initiated_event_id: event_dat.event_id,
164
- ..state
165
- },
166
- )
167
- }
168
-
169
- pub(super) fn on_cancelled(
170
- self,
171
- state: SharedState,
172
- ) -> ChildWorkflowMachineTransition<Cancelled> {
173
- let state = SharedState {
174
- cancelled_before_sent: true,
175
- ..state
176
- };
177
- ChildWorkflowMachineTransition::ok_shared(
178
- vec![ChildWorkflowCommand::StartCancel(Failure {
179
- message: "Child Workflow execution cancelled before scheduled".to_owned(),
180
- cause: Some(Box::new(Failure {
181
- failure_info: Some(FailureInfo::CanceledFailureInfo(
182
- failure::CanceledFailureInfo {
183
- ..Default::default()
184
- },
185
- )),
186
- ..Default::default()
187
- })),
188
- failure_info: failure_info_from_state(&state, RetryState::NonRetryableFailure),
189
- ..Default::default()
190
- })],
191
- Cancelled::default(),
192
- state,
193
- )
194
- }
195
- }
196
-
197
- #[derive(Default, Clone)]
198
- pub(super) struct StartEventRecorded {}
199
-
200
- impl StartEventRecorded {
201
- pub(super) fn on_child_workflow_execution_started(
202
- self,
203
- state: SharedState,
204
- event: ChildWorkflowExecutionStartedEvent,
205
- ) -> ChildWorkflowMachineTransition<Started> {
206
- ChildWorkflowMachineTransition::ok_shared(
207
- vec![ChildWorkflowCommand::Start(
208
- event.workflow_execution.clone(),
209
- )],
210
- Started::default(),
211
- SharedState {
212
- started_event_id: event.started_event_id,
213
- run_id: event.workflow_execution.run_id,
214
- ..state
215
- },
216
- )
217
- }
218
- pub(super) fn on_start_child_workflow_execution_failed(
219
- self,
220
- cause: StartChildWorkflowExecutionFailedCause,
221
- ) -> ChildWorkflowMachineTransition<StartFailed> {
222
- ChildWorkflowMachineTransition::ok(
223
- vec![ChildWorkflowCommand::StartFail(cause)],
224
- StartFailed::default(),
225
- )
226
- }
227
- }
228
-
229
- #[derive(Default, Clone)]
230
- pub(super) struct StartFailed {}
231
-
232
- #[derive(Default, Clone)]
233
- pub(super) struct Started {}
234
-
235
- impl Started {
236
- fn on_child_workflow_execution_completed(
237
- self,
238
- result: Option<Payloads>,
239
- ) -> ChildWorkflowMachineTransition<Completed> {
240
- ChildWorkflowMachineTransition::ok(
241
- vec![ChildWorkflowCommand::Complete(result)],
242
- Completed::default(),
243
- )
244
- }
245
- fn on_child_workflow_execution_failed(
246
- self,
247
- state: SharedState,
248
- attrs: ChildWorkflowExecutionFailedEventAttributes,
249
- ) -> ChildWorkflowMachineTransition<Failed> {
250
- ChildWorkflowMachineTransition::ok(
251
- vec![ChildWorkflowCommand::Fail(Failure {
252
- message: "Child Workflow execution failed".to_owned(),
253
- failure_info: failure_info_from_state(&state, attrs.retry_state()),
254
- cause: attrs.failure.map(Box::new),
255
- ..Default::default()
256
- })],
257
- Failed::default(),
258
- )
259
- }
260
- fn on_child_workflow_execution_timed_out(
261
- self,
262
- state: SharedState,
263
- retry_state: RetryState,
264
- ) -> ChildWorkflowMachineTransition<TimedOut> {
265
- ChildWorkflowMachineTransition::ok(
266
- vec![ChildWorkflowCommand::Fail(Failure {
267
- message: "Child Workflow execution timed out".to_owned(),
268
- cause: Some(Box::new(Failure {
269
- message: "Timed out".to_owned(),
270
- failure_info: Some(FailureInfo::TimeoutFailureInfo(
271
- failure::TimeoutFailureInfo {
272
- last_heartbeat_details: None,
273
- timeout_type: TimeoutType::StartToClose as i32,
274
- },
275
- )),
276
- ..Default::default()
277
- })),
278
- failure_info: failure_info_from_state(&state, retry_state),
279
- ..Default::default()
280
- })],
281
- TimedOut::default(),
282
- )
283
- }
284
- fn on_child_workflow_execution_cancelled(self) -> ChildWorkflowMachineTransition<Cancelled> {
285
- ChildWorkflowMachineTransition::ok(vec![ChildWorkflowCommand::Cancel], Cancelled::default())
286
- }
287
- fn on_child_workflow_execution_terminated(
288
- self,
289
- state: SharedState,
290
- ) -> ChildWorkflowMachineTransition<Terminated> {
291
- ChildWorkflowMachineTransition::ok(
292
- vec![ChildWorkflowCommand::Fail(Failure {
293
- message: "Child Workflow execution terminated".to_owned(),
294
- cause: Some(Box::new(Failure {
295
- message: "Terminated".to_owned(),
296
- failure_info: Some(FailureInfo::TerminatedFailureInfo(
297
- failure::TerminatedFailureInfo {},
298
- )),
299
- ..Default::default()
300
- })),
301
- failure_info: failure_info_from_state(&state, RetryState::NonRetryableFailure),
302
- ..Default::default()
303
- })],
304
- Terminated::default(),
305
- )
306
- }
307
- fn on_cancelled(
308
- self,
309
- state: SharedState,
310
- ) -> ChildWorkflowMachineTransition<StartedOrCancelled> {
311
- let dest = match state.cancel_type {
312
- ChildWorkflowCancellationType::Abandon | ChildWorkflowCancellationType::TryCancel => {
313
- StartedOrCancelled::Cancelled(Default::default())
314
- }
315
- _ => StartedOrCancelled::Started(Default::default()),
316
- };
317
- TransitionResult::ok(
318
- [ChildWorkflowCommand::IssueCancelAfterStarted {
319
- reason: "Parent workflow requested cancel".to_string(),
320
- }],
321
- dest,
322
- )
323
- }
324
- }
325
-
326
- #[derive(Default, Clone)]
327
- pub(super) struct Terminated {}
328
-
329
- #[derive(Default, Clone)]
330
- pub(super) struct TimedOut {}
331
-
332
- #[derive(Clone, Debug)]
333
- pub(super) struct SharedState {
334
- initiated_event_id: i64,
335
- started_event_id: i64,
336
- lang_sequence_number: u32,
337
- namespace: String,
338
- workflow_id: String,
339
- run_id: String,
340
- workflow_type: String,
341
- cancelled_before_sent: bool,
342
- cancel_type: ChildWorkflowCancellationType,
343
- internal_flags: InternalFlagsRef,
344
- }
345
-
346
- impl ChildWorkflowMachine {
347
- /// Create a new child workflow and immediately schedule it.
348
- pub(super) fn new_scheduled(
349
- attribs: StartChildWorkflowExecution,
350
- internal_flags: InternalFlagsRef,
351
- ) -> NewMachineWithCommand {
352
- let mut s = Self {
353
- state: Created {}.into(),
354
- shared_state: SharedState {
355
- lang_sequence_number: attribs.seq,
356
- workflow_id: attribs.workflow_id.clone(),
357
- workflow_type: attribs.workflow_type.clone(),
358
- namespace: attribs.namespace.clone(),
359
- cancel_type: attribs.cancellation_type(),
360
- internal_flags,
361
- run_id: "".to_string(),
362
- initiated_event_id: 0,
363
- started_event_id: 0,
364
- cancelled_before_sent: false,
365
- },
366
- };
367
- OnEventWrapper::on_event_mut(&mut s, ChildWorkflowMachineEvents::Schedule)
368
- .expect("Scheduling child workflows doesn't fail");
369
- let cmd = Command {
370
- command_type: CommandType::StartChildWorkflowExecution as i32,
371
- attributes: Some(attribs.into()),
372
- };
373
- NewMachineWithCommand {
374
- command: cmd,
375
- machine: s.into(),
376
- }
377
- }
378
-
379
- fn resolve_cancelled_msg(&self) -> ResolveChildWorkflowExecution {
380
- let failure = Failure {
381
- message: "Child Workflow execution cancelled".to_owned(),
382
- cause: Some(Box::new(Failure {
383
- failure_info: Some(FailureInfo::CanceledFailureInfo(
384
- failure::CanceledFailureInfo {
385
- ..Default::default()
386
- },
387
- )),
388
- ..Default::default()
389
- })),
390
- failure_info: failure_info_from_state(
391
- &self.shared_state,
392
- RetryState::NonRetryableFailure,
393
- ),
394
- ..Default::default()
395
- };
396
- ResolveChildWorkflowExecution {
397
- seq: self.shared_state.lang_sequence_number,
398
- result: Some(ChildWorkflowResult {
399
- status: Some(ChildWorkflowStatus::Cancelled(wfr::Cancellation {
400
- failure: Some(failure),
401
- })),
402
- }),
403
- }
404
- }
405
- }
406
-
407
- impl TryFrom<HistEventData> for ChildWorkflowMachineEvents {
408
- type Error = WFMachinesError;
409
-
410
- fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
411
- let last_task_in_history = e.current_task_is_last_in_history;
412
- let e = e.event;
413
- Ok(match EventType::from_i32(e.event_type) {
414
- Some(EventType::StartChildWorkflowExecutionInitiated) => {
415
- if let Some(
416
- history_event::Attributes::StartChildWorkflowExecutionInitiatedEventAttributes(
417
- attrs,
418
- ),
419
- ) = e.attributes
420
- {
421
- Self::StartChildWorkflowExecutionInitiated(ChildWorkflowInitiatedData {
422
- event_id: e.event_id,
423
- wf_type: attrs.workflow_type.unwrap_or_default().name,
424
- wf_id: attrs.workflow_id,
425
- last_task_in_history,
426
- })
427
- } else {
428
- return Err(WFMachinesError::Fatal(
429
- "StartChildWorkflowExecutionInitiated attributes were unset".to_string(),
430
- ));
431
- }
432
- }
433
- Some(EventType::StartChildWorkflowExecutionFailed) => {
434
- if let Some(
435
- history_event::Attributes::StartChildWorkflowExecutionFailedEventAttributes(
436
- StartChildWorkflowExecutionFailedEventAttributes { cause, .. },
437
- ),
438
- ) = e.attributes
439
- {
440
- Self::StartChildWorkflowExecutionFailed(
441
- StartChildWorkflowExecutionFailedCause::from_i32(cause).ok_or_else(
442
- || {
443
- WFMachinesError::Fatal(
444
- "Invalid StartChildWorkflowExecutionFailedCause".to_string(),
445
- )
446
- },
447
- )?,
448
- )
449
- } else {
450
- return Err(WFMachinesError::Fatal(
451
- "StartChildWorkflowExecutionFailed attributes were unset".to_string(),
452
- ));
453
- }
454
- }
455
- Some(EventType::ChildWorkflowExecutionStarted) => {
456
- if let Some(
457
- history_event::Attributes::ChildWorkflowExecutionStartedEventAttributes(
458
- ChildWorkflowExecutionStartedEventAttributes {
459
- workflow_execution: Some(we),
460
- ..
461
- },
462
- ),
463
- ) = e.attributes
464
- {
465
- Self::ChildWorkflowExecutionStarted(ChildWorkflowExecutionStartedEvent {
466
- workflow_execution: we,
467
- started_event_id: e.event_id,
468
- })
469
- } else {
470
- return Err(WFMachinesError::Fatal(
471
- "ChildWorkflowExecutionStarted attributes were unset or malformed"
472
- .to_string(),
473
- ));
474
- }
475
- }
476
- Some(EventType::ChildWorkflowExecutionCompleted) => {
477
- if let Some(
478
- history_event::Attributes::ChildWorkflowExecutionCompletedEventAttributes(
479
- ChildWorkflowExecutionCompletedEventAttributes { result, .. },
480
- ),
481
- ) = e.attributes
482
- {
483
- Self::ChildWorkflowExecutionCompleted(result)
484
- } else {
485
- return Err(WFMachinesError::Fatal(
486
- "ChildWorkflowExecutionCompleted attributes were unset or malformed"
487
- .to_string(),
488
- ));
489
- }
490
- }
491
- Some(EventType::ChildWorkflowExecutionFailed) => {
492
- if let Some(
493
- history_event::Attributes::ChildWorkflowExecutionFailedEventAttributes(attrs),
494
- ) = e.attributes
495
- {
496
- Self::ChildWorkflowExecutionFailed(attrs)
497
- } else {
498
- return Err(WFMachinesError::Fatal(
499
- "ChildWorkflowExecutionFailed attributes were unset".to_string(),
500
- ));
501
- }
502
- }
503
- Some(EventType::ChildWorkflowExecutionTimedOut) => {
504
- if let Some(
505
- history_event::Attributes::ChildWorkflowExecutionTimedOutEventAttributes(atts),
506
- ) = e.attributes
507
- {
508
- Self::ChildWorkflowExecutionTimedOut(atts.retry_state())
509
- } else {
510
- return Err(WFMachinesError::Fatal(
511
- "ChildWorkflowExecutionTimedOut attributes were unset or malformed"
512
- .to_string(),
513
- ));
514
- }
515
- }
516
- Some(EventType::ChildWorkflowExecutionTerminated) => {
517
- Self::ChildWorkflowExecutionTerminated
518
- }
519
- Some(EventType::ChildWorkflowExecutionCanceled) => {
520
- Self::ChildWorkflowExecutionCancelled
521
- }
522
- _ => {
523
- return Err(WFMachinesError::Fatal(format!(
524
- "Child workflow machine does not handle this event: {e:?}"
525
- )))
526
- }
527
- })
528
- }
529
- }
530
-
531
- impl WFMachinesAdapter for ChildWorkflowMachine {
532
- fn adapt_response(
533
- &self,
534
- my_command: Self::Command,
535
- event_info: Option<EventInfo>,
536
- ) -> Result<Vec<MachineResponse>, WFMachinesError> {
537
- Ok(match my_command {
538
- ChildWorkflowCommand::Start(we) => {
539
- vec![ResolveChildWorkflowExecutionStart {
540
- seq: self.shared_state.lang_sequence_number,
541
- status: Some(resolve_child_workflow_execution_start::Status::Succeeded(
542
- ResolveChildWorkflowExecutionStartSuccess { run_id: we.run_id },
543
- )),
544
- }
545
- .into()]
546
- }
547
- ChildWorkflowCommand::StartFail(cause) => {
548
- vec![ResolveChildWorkflowExecutionStart {
549
- seq: self.shared_state.lang_sequence_number,
550
- status: Some(resolve_child_workflow_execution_start::Status::Failed(
551
- ResolveChildWorkflowExecutionStartFailure {
552
- workflow_id: self.shared_state.workflow_id.clone(),
553
- workflow_type: self.shared_state.workflow_type.clone(),
554
- cause: cause as i32,
555
- },
556
- )),
557
- }
558
- .into()]
559
- }
560
- ChildWorkflowCommand::StartCancel(failure) => {
561
- vec![ResolveChildWorkflowExecutionStart {
562
- seq: self.shared_state.lang_sequence_number,
563
- status: Some(resolve_child_workflow_execution_start::Status::Cancelled(
564
- ResolveChildWorkflowExecutionStartCancelled {
565
- failure: Some(failure),
566
- },
567
- )),
568
- }
569
- .into()]
570
- }
571
- ChildWorkflowCommand::Complete(result) => {
572
- vec![ResolveChildWorkflowExecution {
573
- seq: self.shared_state.lang_sequence_number,
574
- result: Some(ChildWorkflowResult {
575
- status: Some(ChildWorkflowStatus::Completed(wfr::Success {
576
- result: convert_payloads(event_info, result)?,
577
- })),
578
- }),
579
- }
580
- .into()]
581
- }
582
- ChildWorkflowCommand::Fail(failure) => {
583
- vec![ResolveChildWorkflowExecution {
584
- seq: self.shared_state.lang_sequence_number,
585
- result: Some(ChildWorkflowResult {
586
- status: Some(ChildWorkflowStatus::Failed(wfr::Failure {
587
- failure: Some(failure),
588
- })),
589
- }),
590
- }
591
- .into()]
592
- }
593
- ChildWorkflowCommand::Cancel => {
594
- vec![self.resolve_cancelled_msg().into()]
595
- }
596
- ChildWorkflowCommand::IssueCancelAfterStarted { reason } => {
597
- let mut resps = vec![];
598
- if self.shared_state.cancel_type != ChildWorkflowCancellationType::Abandon {
599
- resps.push(MachineResponse::NewCoreOriginatedCommand(
600
- RequestCancelExternalWorkflowExecutionCommandAttributes {
601
- namespace: self.shared_state.namespace.clone(),
602
- workflow_id: self.shared_state.workflow_id.clone(),
603
- run_id: self.shared_state.run_id.clone(),
604
- child_workflow_only: true,
605
- reason,
606
- control: "".to_string(),
607
- }
608
- .into(),
609
- ))
610
- }
611
- // Immediately resolve abandon/trycancel modes
612
- if matches!(
613
- self.shared_state.cancel_type,
614
- ChildWorkflowCancellationType::Abandon
615
- | ChildWorkflowCancellationType::TryCancel
616
- ) {
617
- resps.push(self.resolve_cancelled_msg().into())
618
- }
619
- resps
620
- }
621
- })
622
- }
623
-
624
- fn matches_event(&self, event: &HistoryEvent) -> bool {
625
- matches!(
626
- event.event_type(),
627
- EventType::StartChildWorkflowExecutionInitiated
628
- | EventType::StartChildWorkflowExecutionFailed
629
- | EventType::ChildWorkflowExecutionStarted
630
- | EventType::ChildWorkflowExecutionCompleted
631
- | EventType::ChildWorkflowExecutionFailed
632
- | EventType::ChildWorkflowExecutionTimedOut
633
- | EventType::ChildWorkflowExecutionTerminated
634
- | EventType::ChildWorkflowExecutionCanceled
635
- )
636
- }
637
- }
638
-
639
- impl TryFrom<CommandType> for ChildWorkflowMachineEvents {
640
- type Error = ();
641
-
642
- fn try_from(c: CommandType) -> Result<Self, Self::Error> {
643
- Ok(match c {
644
- CommandType::StartChildWorkflowExecution => Self::CommandStartChildWorkflowExecution,
645
- CommandType::RequestCancelExternalWorkflowExecution => {
646
- Self::CommandRequestCancelExternalWorkflowExecution
647
- }
648
- _ => return Err(()),
649
- })
650
- }
651
- }
652
-
653
- impl Cancellable for ChildWorkflowMachine {
654
- fn cancel(&mut self) -> Result<Vec<MachineResponse>, MachineError<Self::Error>> {
655
- let event = ChildWorkflowMachineEvents::Cancel;
656
- let vec = OnEventWrapper::on_event_mut(self, event)?;
657
- let res = vec
658
- .into_iter()
659
- .map(|mc| match mc {
660
- c @ ChildWorkflowCommand::StartCancel(_)
661
- | c @ ChildWorkflowCommand::IssueCancelAfterStarted { .. } => {
662
- self.adapt_response(c, None)
663
- }
664
- x => panic!("Invalid cancel event response {x:?}"),
665
- })
666
- .collect::<Result<Vec<_>, _>>()?
667
- .into_iter()
668
- .flatten()
669
- .collect();
670
- Ok(res)
671
- }
672
-
673
- fn was_cancelled_before_sent_to_server(&self) -> bool {
674
- self.shared_state.cancelled_before_sent
675
- }
676
- }
677
-
678
- fn failure_info_from_state(state: &SharedState, retry_state: RetryState) -> Option<FailureInfo> {
679
- Some(FailureInfo::ChildWorkflowExecutionFailureInfo(
680
- failure::ChildWorkflowExecutionFailureInfo {
681
- namespace: state.namespace.clone(),
682
- workflow_type: Some(WorkflowType {
683
- name: state.workflow_type.clone(),
684
- }),
685
- initiated_event_id: state.initiated_event_id,
686
- started_event_id: state.started_event_id,
687
- retry_state: retry_state as i32,
688
- workflow_execution: Some(WorkflowExecution {
689
- workflow_id: state.workflow_id.clone(),
690
- run_id: state.run_id.clone(),
691
- }),
692
- },
693
- ))
694
- }
695
-
696
- fn convert_payloads(
697
- event_info: Option<EventInfo>,
698
- result: Option<Payloads>,
699
- ) -> Result<Option<Payload>, WFMachinesError> {
700
- result.map(TryInto::try_into).transpose().map_err(|pe| {
701
- WFMachinesError::Fatal(format!(
702
- "Not exactly one payload in child workflow result ({pe}) for event: {event_info:?}"
703
- ))
704
- })
705
- }
706
-
707
- #[cfg(test)]
708
- mod test {
709
- use super::*;
710
- use crate::{
711
- internal_flags::InternalFlags, replay::TestHistoryBuilder, test_help::canned_histories,
712
- worker::workflow::ManagedWFFunc,
713
- };
714
- use anyhow::anyhow;
715
- use rstest::{fixture, rstest};
716
- use std::{cell::RefCell, mem::discriminant, rc::Rc};
717
- use temporal_sdk::{
718
- CancellableFuture, ChildWorkflowOptions, WfContext, WorkflowFunction, WorkflowResult,
719
- };
720
- use temporal_sdk_core_protos::coresdk::{
721
- child_workflow::child_workflow_result,
722
- workflow_activation::resolve_child_workflow_execution_start::Status as StartStatus,
723
- };
724
-
725
- #[derive(Clone, Copy)]
726
- enum Expectation {
727
- Success,
728
- Failure,
729
- StartFailure,
730
- }
731
-
732
- impl Expectation {
733
- const fn try_from_u8(x: u8) -> Option<Self> {
734
- Some(match x {
735
- 0 => Self::Success,
736
- 1 => Self::Failure,
737
- 2 => Self::StartFailure,
738
- _ => return None,
739
- })
740
- }
741
- }
742
-
743
- #[fixture]
744
- fn child_workflow_happy_hist() -> ManagedWFFunc {
745
- let func = WorkflowFunction::new(parent_wf);
746
- let t = canned_histories::single_child_workflow("child-id-1");
747
- assert_eq!(3, t.get_full_history_info().unwrap().wf_task_count());
748
- ManagedWFFunc::new(t, func, vec![[Expectation::Success as u8].into()])
749
- }
750
-
751
- #[fixture]
752
- fn child_workflow_fail_hist() -> ManagedWFFunc {
753
- let func = WorkflowFunction::new(parent_wf);
754
- let t = canned_histories::single_child_workflow_fail("child-id-1");
755
- assert_eq!(3, t.get_full_history_info().unwrap().wf_task_count());
756
- ManagedWFFunc::new(t, func, vec![[Expectation::Failure as u8].into()])
757
- }
758
-
759
- #[fixture]
760
- fn child_workflow_start_fail_hist() -> ManagedWFFunc {
761
- let func = WorkflowFunction::new(parent_wf);
762
- let t = canned_histories::single_child_workflow_start_fail("child-id-1");
763
- assert_eq!(2, t.get_full_history_info().unwrap().wf_task_count());
764
- ManagedWFFunc::new(t, func, vec![[Expectation::StartFailure as u8].into()])
765
- }
766
-
767
- async fn parent_wf(ctx: WfContext) -> WorkflowResult<()> {
768
- let expectation = Expectation::try_from_u8(ctx.get_args()[0].data[0]).unwrap();
769
- let child = ctx.child_workflow(ChildWorkflowOptions {
770
- workflow_id: "child-id-1".to_string(),
771
- workflow_type: "child".to_string(),
772
- ..Default::default()
773
- });
774
-
775
- let start_res = child.start(&ctx).await;
776
- match (expectation, &start_res.status) {
777
- (Expectation::Success | Expectation::Failure, StartStatus::Succeeded(_)) => {}
778
- (Expectation::StartFailure, StartStatus::Failed(_)) => return Ok(().into()),
779
- _ => return Err(anyhow!("Unexpected start status")),
780
- };
781
- match (
782
- expectation,
783
- start_res.into_started().unwrap().result().await.status,
784
- ) {
785
- (Expectation::Success, Some(child_workflow_result::Status::Completed(_))) => {
786
- Ok(().into())
787
- }
788
- (Expectation::Failure, _) => Ok(().into()),
789
- _ => Err(anyhow!("Unexpected child WF status")),
790
- }
791
- }
792
-
793
- #[rstest(
794
- wfm,
795
- case::success(child_workflow_happy_hist()),
796
- case::failure(child_workflow_fail_hist())
797
- )]
798
- #[tokio::test]
799
- async fn single_child_workflow_until_completion(mut wfm: ManagedWFFunc) {
800
- wfm.get_next_activation().await.unwrap();
801
- let commands = wfm.get_server_commands().commands;
802
- assert_eq!(commands.len(), 1);
803
- assert_eq!(
804
- commands[0].command_type,
805
- CommandType::StartChildWorkflowExecution as i32
806
- );
807
-
808
- wfm.get_next_activation().await.unwrap();
809
- let commands = wfm.get_server_commands().commands;
810
- // Workflow is activated because the child WF has started.
811
- // It does not generate any commands, just waits for completion.
812
- assert_eq!(commands.len(), 0);
813
-
814
- wfm.get_next_activation().await.unwrap();
815
- let commands = wfm.get_server_commands().commands;
816
- assert_eq!(commands.len(), 1);
817
- assert_eq!(
818
- commands[0].command_type,
819
- CommandType::CompleteWorkflowExecution as i32
820
- );
821
- wfm.shutdown().await.unwrap();
822
- }
823
-
824
- #[rstest(wfm, case::start_failure(child_workflow_start_fail_hist()))]
825
- #[tokio::test]
826
- async fn single_child_workflow_start_fail(mut wfm: ManagedWFFunc) {
827
- wfm.get_next_activation().await.unwrap();
828
- let commands = wfm.get_server_commands().commands;
829
- assert_eq!(commands.len(), 1);
830
- assert_eq!(
831
- commands[0].command_type,
832
- CommandType::StartChildWorkflowExecution as i32
833
- );
834
-
835
- wfm.get_next_activation().await.unwrap();
836
- let commands = wfm.get_server_commands().commands;
837
- assert_eq!(commands.len(), 1);
838
- assert_eq!(
839
- commands[0].command_type,
840
- CommandType::CompleteWorkflowExecution as i32
841
- );
842
- wfm.shutdown().await.unwrap();
843
- }
844
-
845
- async fn cancel_before_send_wf(ctx: WfContext) -> WorkflowResult<()> {
846
- let workflow_id = "child-id-1";
847
- let child = ctx.child_workflow(ChildWorkflowOptions {
848
- workflow_id: workflow_id.to_string(),
849
- workflow_type: "child".to_string(),
850
- ..Default::default()
851
- });
852
- let start = child.start(&ctx);
853
- start.cancel(&ctx);
854
- match start.await.status {
855
- StartStatus::Cancelled(_) => Ok(().into()),
856
- _ => Err(anyhow!("Unexpected start status")),
857
- }
858
- }
859
-
860
- #[fixture]
861
- fn child_workflow_cancel_before_sent() -> ManagedWFFunc {
862
- let func = WorkflowFunction::new(cancel_before_send_wf);
863
- let mut t = TestHistoryBuilder::default();
864
- t.add_by_type(EventType::WorkflowExecutionStarted);
865
- t.add_full_wf_task();
866
- t.add_workflow_task_scheduled_and_started();
867
- assert_eq!(2, t.get_full_history_info().unwrap().wf_task_count());
868
- ManagedWFFunc::new(t, func, vec![])
869
- }
870
-
871
- #[rstest(wfm, case::default(child_workflow_cancel_before_sent()))]
872
- #[tokio::test]
873
- async fn single_child_workflow_cancel_before_sent(mut wfm: ManagedWFFunc) {
874
- wfm.get_next_activation().await.unwrap();
875
- let commands = wfm.get_server_commands().commands;
876
- // Workflow starts and cancels the child workflow, no commands should be sent to server.
877
- assert_eq!(commands.len(), 0);
878
-
879
- wfm.get_next_activation().await.unwrap();
880
- let commands = wfm.get_server_commands().commands;
881
- assert_eq!(commands.len(), 1);
882
- assert_eq!(
883
- commands[0].command_type,
884
- CommandType::CompleteWorkflowExecution as i32
885
- );
886
- wfm.shutdown().await.unwrap();
887
- }
888
-
889
- #[test]
890
- fn cancels_ignored_terminal() {
891
- for state in [
892
- ChildWorkflowMachineState::Cancelled(Cancelled {}),
893
- Failed {}.into(),
894
- StartFailed {}.into(),
895
- TimedOut {}.into(),
896
- Completed {}.into(),
897
- ] {
898
- let mut s = ChildWorkflowMachine {
899
- state: state.clone(),
900
- shared_state: SharedState {
901
- initiated_event_id: 0,
902
- started_event_id: 0,
903
- lang_sequence_number: 0,
904
- namespace: "".to_string(),
905
- workflow_id: "".to_string(),
906
- run_id: "".to_string(),
907
- workflow_type: "".to_string(),
908
- cancelled_before_sent: false,
909
- cancel_type: Default::default(),
910
- internal_flags: Rc::new(RefCell::new(InternalFlags::new(&Default::default()))),
911
- },
912
- };
913
- let cmds = s.cancel().unwrap();
914
- assert_eq!(cmds.len(), 0);
915
- assert_eq!(discriminant(&state), discriminant(&s.state));
916
- }
917
- }
918
- }