temporalio 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +180 -7
  3. data/bridge/Cargo.lock +208 -76
  4. data/bridge/Cargo.toml +5 -2
  5. data/bridge/sdk-core/Cargo.toml +1 -1
  6. data/bridge/sdk-core/README.md +20 -10
  7. data/bridge/sdk-core/client/Cargo.toml +1 -1
  8. data/bridge/sdk-core/client/src/lib.rs +227 -59
  9. data/bridge/sdk-core/client/src/metrics.rs +17 -8
  10. data/bridge/sdk-core/client/src/raw.rs +13 -12
  11. data/bridge/sdk-core/client/src/retry.rs +132 -43
  12. data/bridge/sdk-core/core/Cargo.toml +28 -15
  13. data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
  14. data/bridge/sdk-core/core/src/abstractions.rs +225 -36
  15. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +217 -79
  16. data/bridge/sdk-core/core/src/core_tests/determinism.rs +165 -2
  17. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +565 -34
  18. data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -90
  19. data/bridge/sdk-core/core/src/core_tests/workers.rs +3 -5
  20. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  21. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +430 -67
  22. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +106 -12
  23. data/bridge/sdk-core/core/src/internal_flags.rs +136 -0
  24. data/bridge/sdk-core/core/src/lib.rs +148 -34
  25. data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
  26. data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
  27. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  28. data/bridge/sdk-core/core/src/telemetry/metrics.rs +219 -140
  29. data/bridge/sdk-core/core/src/telemetry/mod.rs +326 -315
  30. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +20 -14
  31. data/bridge/sdk-core/core/src/test_help/mod.rs +85 -21
  32. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +112 -156
  33. data/bridge/sdk-core/core/src/worker/activities/activity_task_poller_stream.rs +89 -0
  34. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +364 -128
  35. data/bridge/sdk-core/core/src/worker/activities.rs +263 -170
  36. data/bridge/sdk-core/core/src/worker/client/mocks.rs +23 -3
  37. data/bridge/sdk-core/core/src/worker/client.rs +48 -6
  38. data/bridge/sdk-core/core/src/worker/mod.rs +186 -75
  39. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +1 -3
  40. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +13 -24
  41. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +879 -226
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +101 -48
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +8 -12
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +6 -9
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +90 -32
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +6 -9
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +7 -10
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +6 -9
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +160 -83
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +36 -54
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +179 -0
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +104 -157
  53. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +8 -12
  54. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +9 -13
  55. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +10 -4
  56. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +14 -11
  57. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +6 -17
  58. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +395 -299
  59. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +12 -20
  60. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +33 -18
  61. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +1032 -374
  62. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +525 -392
  63. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +40 -57
  64. data/bridge/sdk-core/core/src/worker/workflow/wft_extraction.rs +125 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +3 -6
  66. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/saved_wf_inputs.rs +117 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream/tonic_status_serde.rs +24 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +456 -681
  69. data/bridge/sdk-core/core-api/Cargo.toml +6 -4
  70. data/bridge/sdk-core/core-api/src/errors.rs +1 -34
  71. data/bridge/sdk-core/core-api/src/lib.rs +7 -45
  72. data/bridge/sdk-core/core-api/src/telemetry.rs +141 -0
  73. data/bridge/sdk-core/core-api/src/worker.rs +27 -1
  74. data/bridge/sdk-core/etc/deps.svg +115 -140
  75. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  76. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +18 -15
  77. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  78. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +8 -3
  79. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-16_history.bin +0 -0
  80. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  81. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  82. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
  83. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  84. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  85. data/bridge/sdk-core/protos/api_upstream/{temporal/api/enums/v1/cluster.proto → build/tools.go} +7 -18
  86. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  87. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
  88. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +15 -26
  89. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +13 -2
  90. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  91. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -9
  92. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  93. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +10 -8
  94. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +28 -2
  95. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  96. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  97. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  98. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  99. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  100. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +24 -19
  101. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  102. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  103. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  104. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  105. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +62 -26
  106. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +4 -2
  107. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +24 -61
  108. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
  109. data/bridge/sdk-core/protos/api_upstream/temporal/api/protocol/v1/message.proto +57 -0
  110. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  111. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  112. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
  113. data/bridge/sdk-core/protos/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +63 -0
  114. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
  115. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +71 -6
  116. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  117. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
  118. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +111 -36
  119. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +19 -5
  120. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +1 -0
  121. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +1 -0
  122. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +1 -0
  123. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +1 -0
  124. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +1 -0
  125. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +1 -0
  126. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +9 -0
  127. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +9 -1
  128. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +6 -0
  129. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  130. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  131. data/bridge/sdk-core/sdk/Cargo.toml +4 -3
  132. data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
  133. data/bridge/sdk-core/sdk/src/lib.rs +94 -25
  134. data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
  135. data/bridge/sdk-core/sdk/src/workflow_future.rs +10 -13
  136. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +5 -2
  137. data/bridge/sdk-core/sdk-core-protos/build.rs +36 -2
  138. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +164 -104
  139. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +27 -23
  140. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +252 -74
  141. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +12 -2
  142. data/bridge/sdk-core/test-utils/Cargo.toml +4 -1
  143. data/bridge/sdk-core/test-utils/src/canned_histories.rs +106 -296
  144. data/bridge/sdk-core/test-utils/src/histfetch.rs +1 -1
  145. data/bridge/sdk-core/test-utils/src/lib.rs +161 -50
  146. data/bridge/sdk-core/test-utils/src/wf_input_saver.rs +50 -0
  147. data/bridge/sdk-core/test-utils/src/workflows.rs +29 -0
  148. data/bridge/sdk-core/tests/fuzzy_workflow.rs +130 -0
  149. data/bridge/sdk-core/tests/{load_tests.rs → heavy_tests.rs} +125 -51
  150. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +25 -3
  151. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +10 -5
  152. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +239 -0
  153. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +4 -60
  154. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +5 -128
  155. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +83 -25
  156. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +93 -69
  157. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -0
  158. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +6 -13
  159. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +1 -0
  160. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +6 -2
  161. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +3 -10
  162. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +151 -116
  163. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +54 -0
  164. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +7 -28
  165. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +115 -24
  166. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +1 -0
  167. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +18 -14
  168. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +6 -20
  169. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +10 -21
  170. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +6 -4
  171. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +27 -18
  172. data/bridge/sdk-core/tests/main.rs +8 -16
  173. data/bridge/sdk-core/tests/runner.rs +75 -36
  174. data/bridge/sdk-core/tests/wf_input_replay.rs +32 -0
  175. data/bridge/src/connection.rs +117 -82
  176. data/bridge/src/lib.rs +356 -42
  177. data/bridge/src/runtime.rs +10 -3
  178. data/bridge/src/test_server.rs +153 -0
  179. data/bridge/src/worker.rs +133 -9
  180. data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
  181. data/lib/gen/temporal/api/command/v1/message_pb.rb +10 -16
  182. data/lib/gen/temporal/api/common/v1/message_pb.rb +5 -1
  183. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
  184. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -3
  185. data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
  186. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +5 -4
  187. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +9 -1
  188. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
  189. data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
  190. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
  191. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
  192. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
  193. data/lib/gen/temporal/api/enums/v1/update_pb.rb +7 -10
  194. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
  195. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
  196. data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
  197. data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
  198. data/lib/gen/temporal/api/history/v1/message_pb.rb +34 -25
  199. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +2 -1
  200. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +14 -51
  201. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
  202. data/lib/gen/temporal/api/protocol/v1/message_pb.rb +30 -0
  203. data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
  204. data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
  205. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
  206. data/lib/gen/temporal/api/sdk/v1/task_complete_metadata_pb.rb +23 -0
  207. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
  208. data/lib/gen/temporal/api/testservice/v1/request_response_pb.rb +49 -0
  209. data/lib/gen/temporal/api/testservice/v1/service_pb.rb +21 -0
  210. data/lib/gen/temporal/api/update/v1/message_pb.rb +49 -3
  211. data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
  212. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
  213. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +47 -20
  214. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
  215. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +13 -9
  216. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +10 -6
  217. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +13 -9
  218. data/lib/gen/temporal/sdk/core/common/common_pb.rb +7 -3
  219. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +9 -3
  220. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +7 -3
  221. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +28 -21
  222. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +32 -24
  223. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +12 -5
  224. data/lib/temporalio/activity/context.rb +102 -0
  225. data/lib/temporalio/activity/info.rb +67 -0
  226. data/lib/temporalio/activity.rb +85 -0
  227. data/lib/temporalio/bridge/connect_options.rb +15 -0
  228. data/lib/temporalio/bridge/error.rb +8 -0
  229. data/lib/temporalio/bridge/retry_config.rb +24 -0
  230. data/lib/temporalio/bridge/tls_options.rb +19 -0
  231. data/lib/temporalio/bridge.rb +14 -0
  232. data/lib/{temporal → temporalio}/client/implementation.rb +57 -56
  233. data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
  234. data/lib/{temporal → temporalio}/client.rb +19 -32
  235. data/lib/temporalio/connection/retry_config.rb +44 -0
  236. data/lib/temporalio/connection/service.rb +20 -0
  237. data/lib/temporalio/connection/test_service.rb +92 -0
  238. data/lib/temporalio/connection/tls_options.rb +51 -0
  239. data/lib/temporalio/connection/workflow_service.rb +731 -0
  240. data/lib/temporalio/connection.rb +86 -0
  241. data/lib/{temporal → temporalio}/data_converter.rb +76 -35
  242. data/lib/{temporal → temporalio}/error/failure.rb +6 -6
  243. data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
  244. data/lib/{temporal → temporalio}/errors.rb +19 -1
  245. data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
  246. data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
  247. data/lib/temporalio/failure_converter.rb +7 -0
  248. data/lib/temporalio/interceptor/activity_inbound.rb +22 -0
  249. data/lib/temporalio/interceptor/activity_outbound.rb +24 -0
  250. data/lib/{temporal → temporalio}/interceptor/chain.rb +7 -6
  251. data/lib/{temporal → temporalio}/interceptor/client.rb +27 -2
  252. data/lib/temporalio/interceptor.rb +22 -0
  253. data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
  254. data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
  255. data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
  256. data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
  257. data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
  258. data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
  259. data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
  260. data/lib/temporalio/payload_converter.rb +14 -0
  261. data/lib/{temporal → temporalio}/retry_policy.rb +17 -7
  262. data/lib/{temporal → temporalio}/retry_state.rb +1 -1
  263. data/lib/temporalio/runtime.rb +25 -0
  264. data/lib/temporalio/testing/time_skipping_handle.rb +32 -0
  265. data/lib/temporalio/testing/time_skipping_interceptor.rb +23 -0
  266. data/lib/temporalio/testing/workflow_environment.rb +112 -0
  267. data/lib/temporalio/testing.rb +175 -0
  268. data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
  269. data/lib/temporalio/version.rb +3 -0
  270. data/lib/temporalio/worker/activity_runner.rb +114 -0
  271. data/lib/temporalio/worker/activity_worker.rb +164 -0
  272. data/lib/temporalio/worker/reactor.rb +46 -0
  273. data/lib/temporalio/worker/runner.rb +63 -0
  274. data/lib/temporalio/worker/sync_worker.rb +124 -0
  275. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  276. data/lib/temporalio/worker.rb +204 -0
  277. data/lib/temporalio/workflow/async.rb +46 -0
  278. data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
  279. data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
  280. data/lib/temporalio/workflow/future.rb +138 -0
  281. data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
  282. data/lib/temporalio/workflow/info.rb +76 -0
  283. data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
  284. data/lib/temporalio.rb +12 -3
  285. data/temporalio.gemspec +11 -6
  286. metadata +137 -64
  287. data/bridge/sdk-core/Cargo.lock +0 -2606
  288. data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
  289. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  290. data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
  291. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
  292. data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
  293. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
  294. data/bridge/sdk-core/core/src/log_export.rs +0 -62
  295. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
  296. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
  297. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
  298. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  299. data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
  300. data/lib/bridge.so +0 -0
  301. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
  302. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
  303. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +0 -222
  304. data/lib/temporal/bridge.rb +0 -14
  305. data/lib/temporal/connection.rb +0 -736
  306. data/lib/temporal/failure_converter.rb +0 -8
  307. data/lib/temporal/payload_converter.rb +0 -14
  308. data/lib/temporal/runtime.rb +0 -22
  309. data/lib/temporal/version.rb +0 -3
  310. data/lib/temporal.rb +0 -8
@@ -18,10 +18,10 @@
18
18
  //! | replaying, no marker | deprecate_patch | Call allowed |
19
19
 
20
20
  use super::{
21
- workflow_machines::MachineResponse, Cancellable, EventInfo, MachineKind, NewMachineWithCommand,
21
+ workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
22
22
  OnEventWrapper, WFMachinesAdapter, WFMachinesError,
23
23
  };
24
- use crate::protosext::HistoryEventExt;
24
+ use crate::{protosext::HistoryEventExt, worker::workflow::machines::HistEventData};
25
25
  use rustfsm::{fsm, TransitionResult};
26
26
  use std::convert::TryFrom;
27
27
  use temporal_sdk_core_protos::{
@@ -186,10 +186,6 @@ impl WFMachinesAdapter for PatchMachine {
186
186
  fn matches_event(&self, event: &HistoryEvent) -> bool {
187
187
  event.get_patch_marker_details().is_some()
188
188
  }
189
-
190
- fn kind(&self) -> MachineKind {
191
- MachineKind::Patch
192
- }
193
189
  }
194
190
 
195
191
  impl Cancellable for PatchMachine {}
@@ -205,15 +201,15 @@ impl TryFrom<CommandType> for PatchMachineEvents {
205
201
  }
206
202
  }
207
203
 
208
- impl TryFrom<HistoryEvent> for PatchMachineEvents {
204
+ impl TryFrom<HistEventData> for PatchMachineEvents {
209
205
  type Error = WFMachinesError;
210
206
 
211
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
207
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
208
+ let e = e.event;
212
209
  match e.get_patch_marker_details() {
213
210
  Some((id, _)) => Ok(Self::MarkerRecorded(id)),
214
211
  _ => Err(WFMachinesError::Nondeterminism(format!(
215
- "Change machine cannot handle this event: {}",
216
- e
212
+ "Change machine cannot handle this event: {e}"
217
213
  ))),
218
214
  }
219
215
  }
@@ -242,15 +238,14 @@ mod tests {
242
238
  common::v1::ActivityType,
243
239
  enums::v1::{CommandType, EventType},
244
240
  history::v1::{
245
- history_event, ActivityTaskCompletedEventAttributes,
246
- ActivityTaskScheduledEventAttributes, ActivityTaskStartedEventAttributes,
247
- TimerFiredEventAttributes,
241
+ ActivityTaskCompletedEventAttributes, ActivityTaskScheduledEventAttributes,
242
+ ActivityTaskStartedEventAttributes, TimerFiredEventAttributes,
248
243
  },
249
244
  },
250
245
  };
251
246
 
252
247
  const MY_PATCH_ID: &str = "test_patch_id";
253
- #[derive(Eq, PartialEq, Copy, Clone)]
248
+ #[derive(Eq, PartialEq, Copy, Clone, Debug)]
254
249
  enum MarkerType {
255
250
  Deprecated,
256
251
  NotDeprecated,
@@ -271,7 +266,11 @@ mod tests {
271
266
  /// EVENT_TYPE_WORKFLOW_TASK_STARTED
272
267
  /// EVENT_TYPE_WORKFLOW_TASK_COMPLETED
273
268
  /// EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED
274
- fn patch_marker_single_activity(marker_type: MarkerType) -> TestHistoryBuilder {
269
+ fn patch_marker_single_activity(
270
+ marker_type: MarkerType,
271
+ version: usize,
272
+ replay: bool,
273
+ ) -> TestHistoryBuilder {
275
274
  let mut t = TestHistoryBuilder::default();
276
275
  t.add_by_type(EventType::WorkflowExecutionStarted);
277
276
  t.add_full_wf_task();
@@ -281,41 +280,41 @@ mod tests {
281
280
  MarkerType::NoMarker => {}
282
281
  };
283
282
 
284
- let scheduled_event_id = t.add_get_event_id(
285
- EventType::ActivityTaskScheduled,
286
- Some(
287
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
288
- ActivityTaskScheduledEventAttributes {
289
- activity_id: "0".to_string(),
290
- activity_type: Some(ActivityType {
291
- name: "".to_string(),
292
- }),
293
- ..Default::default()
294
- },
295
- ),
296
- ),
297
- );
298
- let started_event_id = t.add_get_event_id(
299
- EventType::ActivityTaskStarted,
300
- Some(
301
- history_event::Attributes::ActivityTaskStartedEventAttributes(
302
- ActivityTaskStartedEventAttributes {
303
- scheduled_event_id,
304
- ..Default::default()
305
- },
306
- ),
307
- ),
308
- );
309
- t.add(
310
- EventType::ActivityTaskCompleted,
311
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
312
- ActivityTaskCompletedEventAttributes {
313
- scheduled_event_id,
314
- started_event_id,
315
- ..Default::default()
316
- },
317
- ),
318
- );
283
+ let activity_id = if replay {
284
+ match (marker_type, version) {
285
+ (_, 1) => "no_change",
286
+ (MarkerType::NotDeprecated, 2) => "had_change",
287
+ (MarkerType::Deprecated, 2) => "had_change",
288
+ (MarkerType::NoMarker, 2) => "no_change",
289
+ (_, 3) => "had_change",
290
+ (_, 4) => "had_change",
291
+ v => panic!("Nonsense marker / version combo {v:?}"),
292
+ }
293
+ } else {
294
+ // If the workflow isn't replaying (we're creating history here for a workflow which
295
+ // wasn't replaying at the time of scheduling the activity, and has done that, and now
296
+ // we're feeding back the history it would have produced) then it always has the change,
297
+ // except in v1.
298
+ if version > 1 {
299
+ "had_change"
300
+ } else {
301
+ "no_change"
302
+ }
303
+ };
304
+
305
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
306
+ activity_id: activity_id.to_string(),
307
+ ..Default::default()
308
+ });
309
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
310
+ scheduled_event_id,
311
+ ..Default::default()
312
+ });
313
+ t.add(ActivityTaskCompletedEventAttributes {
314
+ scheduled_event_id,
315
+ started_event_id,
316
+ ..Default::default()
317
+ });
319
318
  t.add_full_wf_task();
320
319
  t.add_workflow_execution_completed();
321
320
  t
@@ -388,7 +387,7 @@ mod tests {
388
387
  Ok(().into())
389
388
  });
390
389
 
391
- let t = patch_marker_single_activity(marker_type);
390
+ let t = patch_marker_single_activity(marker_type, workflow_version, replaying);
392
391
  let histinfo = if replaying {
393
392
  t.get_full_history_info()
394
393
  } else {
@@ -426,7 +425,7 @@ mod tests {
426
425
  } else {
427
426
  // Feed more history
428
427
  wfm.new_history(
429
- patch_marker_single_activity(marker_type)
428
+ patch_marker_single_activity(marker_type, wf_version, replaying)
430
429
  .get_full_history_info()
431
430
  .unwrap()
432
431
  .into(),
@@ -520,7 +519,7 @@ mod tests {
520
519
  // and the history should have the has-change timer. v3 of course always has the change
521
520
  // regardless.
522
521
  wfm.new_history(
523
- patch_marker_single_activity(marker_type)
522
+ patch_marker_single_activity(marker_type, wf_version, replaying)
524
523
  .get_full_history_info()
525
524
  .unwrap()
526
525
  .into(),
@@ -569,118 +568,66 @@ mod tests {
569
568
  t.add_full_wf_task();
570
569
  if have_marker_in_hist {
571
570
  t.add_has_change_marker(MY_PATCH_ID, false);
572
- let scheduled_event_id = t.add_get_event_id(
573
- EventType::ActivityTaskScheduled,
574
- Some(
575
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
576
- ActivityTaskScheduledEventAttributes {
577
- activity_id: "1".to_owned(),
578
- activity_type: Some(ActivityType {
579
- name: "".to_string(),
580
- }),
581
- ..Default::default()
582
- },
583
- ),
584
- ),
585
- );
586
- let started_event_id = t.add_get_event_id(
587
- EventType::ActivityTaskStarted,
588
- Some(
589
- history_event::Attributes::ActivityTaskStartedEventAttributes(
590
- ActivityTaskStartedEventAttributes {
591
- scheduled_event_id,
592
- ..Default::default()
593
- },
594
- ),
595
- ),
596
- );
597
- t.add(
598
- EventType::ActivityTaskCompleted,
599
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
600
- ActivityTaskCompletedEventAttributes {
601
- scheduled_event_id,
602
- started_event_id,
603
- // TODO result: Some(Payloads { payloads: vec![Payload{ metadata: Default::default(), data: vec![] }] }),
604
- ..Default::default()
605
- },
606
- ),
607
- );
608
- t.add_full_wf_task();
609
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
610
- t.add(
611
- EventType::TimerFired,
612
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
613
- started_event_id: timer_started_event_id,
614
- timer_id: "1".to_owned(),
571
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
572
+ activity_id: "1".to_owned(),
573
+ activity_type: Some(ActivityType {
574
+ name: "".to_string(),
615
575
  }),
616
- );
576
+ ..Default::default()
577
+ });
578
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
579
+ scheduled_event_id,
580
+ ..Default::default()
581
+ });
582
+ t.add(ActivityTaskCompletedEventAttributes {
583
+ scheduled_event_id,
584
+ started_event_id,
585
+ ..Default::default()
586
+ });
587
+ t.add_full_wf_task();
588
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
589
+ t.add(TimerFiredEventAttributes {
590
+ started_event_id: timer_started_event_id,
591
+ timer_id: "1".to_owned(),
592
+ });
617
593
  } else {
618
- let started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
619
- t.add(
620
- EventType::TimerFired,
621
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
622
- started_event_id,
623
- timer_id: "1".to_owned(),
624
- }),
625
- );
594
+ let started_event_id = t.add_by_type(EventType::TimerStarted);
595
+ t.add(TimerFiredEventAttributes {
596
+ started_event_id,
597
+ timer_id: "1".to_owned(),
598
+ });
626
599
  t.add_full_wf_task();
627
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
628
- t.add(
629
- EventType::TimerFired,
630
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
631
- started_event_id: timer_started_event_id,
632
- timer_id: "2".to_owned(),
633
- }),
634
- );
600
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
601
+ t.add(TimerFiredEventAttributes {
602
+ started_event_id: timer_started_event_id,
603
+ timer_id: "2".to_owned(),
604
+ });
635
605
  }
636
606
  t.add_full_wf_task();
637
607
 
638
608
  if have_marker_in_hist {
639
- let scheduled_event_id = t.add_get_event_id(
640
- EventType::ActivityTaskScheduled,
641
- Some(
642
- history_event::Attributes::ActivityTaskScheduledEventAttributes(
643
- ActivityTaskScheduledEventAttributes {
644
- activity_id: "2".to_string(),
645
- activity_type: Some(ActivityType {
646
- name: "".to_string(),
647
- }),
648
- ..Default::default()
649
- },
650
- ),
651
- ),
652
- );
653
- let started_event_id = t.add_get_event_id(
654
- EventType::ActivityTaskStarted,
655
- Some(
656
- history_event::Attributes::ActivityTaskStartedEventAttributes(
657
- ActivityTaskStartedEventAttributes {
658
- scheduled_event_id,
659
- ..Default::default()
660
- },
661
- ),
662
- ),
663
- );
664
- t.add(
665
- EventType::ActivityTaskCompleted,
666
- history_event::Attributes::ActivityTaskCompletedEventAttributes(
667
- ActivityTaskCompletedEventAttributes {
668
- scheduled_event_id,
669
- started_event_id,
670
- // TODO result: Some(Payloads { payloads: vec![Payload{ metadata: Default::default(), data: vec![] }] }),
671
- ..Default::default()
672
- },
673
- ),
674
- );
675
- } else {
676
- let started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
677
- t.add(
678
- EventType::TimerFired,
679
- history_event::Attributes::TimerFiredEventAttributes(TimerFiredEventAttributes {
680
- started_event_id,
681
- timer_id: "3".to_owned(),
609
+ let scheduled_event_id = t.add(ActivityTaskScheduledEventAttributes {
610
+ activity_id: "2".to_string(),
611
+ activity_type: Some(ActivityType {
612
+ name: "".to_string(),
682
613
  }),
683
- );
614
+ ..Default::default()
615
+ });
616
+ let started_event_id = t.add(ActivityTaskStartedEventAttributes {
617
+ scheduled_event_id,
618
+ ..Default::default()
619
+ });
620
+ t.add(ActivityTaskCompletedEventAttributes {
621
+ scheduled_event_id,
622
+ started_event_id,
623
+ ..Default::default()
624
+ });
625
+ } else {
626
+ let started_event_id = t.add_by_type(EventType::TimerStarted);
627
+ t.add(TimerFiredEventAttributes {
628
+ started_event_id,
629
+ timer_id: "3".to_owned(),
630
+ });
684
631
  }
685
632
  t.add_full_wf_task();
686
633
  t.add_workflow_execution_completed();
@@ -1,7 +1,8 @@
1
1
  use super::{
2
- workflow_machines::MachineResponse, Cancellable, EventInfo, MachineKind, NewMachineWithCommand,
2
+ workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
3
3
  OnEventWrapper, WFMachinesAdapter, WFMachinesError,
4
4
  };
5
+ use crate::worker::workflow::machines::HistEventData;
5
6
  use rustfsm::{fsm, MachineError, TransitionResult};
6
7
  use std::convert::TryFrom;
7
8
  use temporal_sdk_core_protos::{
@@ -183,10 +184,11 @@ impl TryFrom<CommandType> for SignalExternalMachineEvents {
183
184
  })
184
185
  }
185
186
  }
186
- impl TryFrom<HistoryEvent> for SignalExternalMachineEvents {
187
+ impl TryFrom<HistEventData> for SignalExternalMachineEvents {
187
188
  type Error = WFMachinesError;
188
189
 
189
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
190
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
191
+ let e = e.event;
190
192
  Ok(match e.event_type() {
191
193
  EventType::ExternalWorkflowExecutionSignaled => Self::ExternalWorkflowExecutionSignaled,
192
194
  EventType::SignalExternalWorkflowExecutionInitiated => {
@@ -202,15 +204,13 @@ impl TryFrom<HistoryEvent> for SignalExternalMachineEvents {
202
204
  Self::SignalExternalWorkflowExecutionFailed(attrs.cause())
203
205
  } else {
204
206
  return Err(WFMachinesError::Fatal(format!(
205
- "Signal workflow failed attributes were unset: {}",
206
- e
207
+ "Signal workflow failed attributes were unset: {e}"
207
208
  )));
208
209
  }
209
210
  }
210
211
  _ => {
211
212
  return Err(WFMachinesError::Nondeterminism(format!(
212
- "Signal external WF machine does not handle this event: {}",
213
- e
213
+ "Signal external WF machine does not handle this event: {e}"
214
214
  )))
215
215
  }
216
216
  })
@@ -242,7 +242,7 @@ impl WFMachinesAdapter for SignalExternalMachine {
242
242
  seq: self.shared_state.seq,
243
243
  // TODO: Create new failure type upstream for this
244
244
  failure: Some(Failure {
245
- message: format!("Unable to signal external workflow because {}", reason),
245
+ message: format!("Unable to signal external workflow because {reason}"),
246
246
  failure_info: Some(FailureInfo::ApplicationFailureInfo(
247
247
  ApplicationFailureInfo {
248
248
  r#type: f.to_string(),
@@ -268,10 +268,6 @@ impl WFMachinesAdapter for SignalExternalMachine {
268
268
  | EventType::SignalExternalWorkflowExecutionFailed
269
269
  )
270
270
  }
271
-
272
- fn kind(&self) -> MachineKind {
273
- MachineKind::SignalExternalWorkflow
274
- }
275
271
  }
276
272
 
277
273
  impl Cancellable for SignalExternalMachine {
@@ -1,9 +1,10 @@
1
1
  #![allow(clippy::large_enum_variant)]
2
2
 
3
3
  use super::{
4
- workflow_machines::{MachineResponse, WFMachinesError},
5
- Cancellable, EventInfo, MachineKind, NewMachineWithCommand, OnEventWrapper, WFMachinesAdapter,
4
+ workflow_machines::MachineResponse, Cancellable, EventInfo, NewMachineWithCommand,
5
+ OnEventWrapper, WFMachinesAdapter,
6
6
  };
7
+ use crate::worker::workflow::{machines::HistEventData, WFMachinesError};
7
8
  use rustfsm::{fsm, MachineError, StateMachine, TransitionResult};
8
9
  use std::convert::TryFrom;
9
10
  use temporal_sdk_core_protos::{
@@ -93,10 +94,11 @@ impl TimerMachine {
93
94
  }
94
95
  }
95
96
 
96
- impl TryFrom<HistoryEvent> for TimerMachineEvents {
97
+ impl TryFrom<HistEventData> for TimerMachineEvents {
97
98
  type Error = WFMachinesError;
98
99
 
99
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
100
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
101
+ let e = e.event;
100
102
  Ok(match e.event_type() {
101
103
  EventType::TimerStarted => Self::TimerStarted(e.event_id),
102
104
  EventType::TimerCanceled => Self::TimerCanceled,
@@ -107,15 +109,13 @@ impl TryFrom<HistoryEvent> for TimerMachineEvents {
107
109
  Self::TimerFired(attrs)
108
110
  } else {
109
111
  return Err(WFMachinesError::Fatal(format!(
110
- "Timer fired attribs were unset: {}",
111
- e
112
+ "Timer fired attribs were unset: {e}"
112
113
  )));
113
114
  }
114
115
  }
115
116
  _ => {
116
117
  return Err(WFMachinesError::Nondeterminism(format!(
117
- "Timer machine does not handle this event: {}",
118
- e
118
+ "Timer machine does not handle this event: {e}"
119
119
  )))
120
120
  }
121
121
  })
@@ -246,10 +246,6 @@ impl WFMachinesAdapter for TimerMachine {
246
246
  EventType::TimerStarted | EventType::TimerCanceled | EventType::TimerFired
247
247
  )
248
248
  }
249
-
250
- fn kind(&self) -> MachineKind {
251
- MachineKind::Timer
252
- }
253
249
  }
254
250
 
255
251
  impl Cancellable for TimerMachine {
@@ -260,7 +256,7 @@ impl Cancellable for TimerMachine {
260
256
  vec![MachineResponse::IssueNewCommand(cmd)]
261
257
  }
262
258
  None => vec![],
263
- x => panic!("Invalid cancel event response {:?}", x),
259
+ x => panic!("Invalid cancel event response {x:?}"),
264
260
  },
265
261
  )
266
262
  }
@@ -75,8 +75,10 @@ mod machine_coverage_report {
75
75
  complete_workflow_state_machine::CompleteWorkflowMachine,
76
76
  continue_as_new_workflow_state_machine::ContinueAsNewWorkflowMachine,
77
77
  fail_workflow_state_machine::FailWorkflowMachine,
78
- local_activity_state_machine::LocalActivityMachine, patch_state_machine::PatchMachine,
79
- signal_external_state_machine::SignalExternalMachine, timer_state_machine::TimerMachine,
78
+ local_activity_state_machine::LocalActivityMachine,
79
+ modify_workflow_properties_state_machine::ModifyWorkflowPropertiesMachine,
80
+ patch_state_machine::PatchMachine, signal_external_state_machine::SignalExternalMachine,
81
+ timer_state_machine::TimerMachine,
80
82
  upsert_search_attributes_state_machine::UpsertSearchAttributesMachine,
81
83
  workflow_task_state_machine::WorkflowTaskMachine,
82
84
  };
@@ -115,6 +117,7 @@ mod machine_coverage_report {
115
117
  let mut cancel_ext = CancelExternalMachine::visualizer().to_owned();
116
118
  let mut la_mach = LocalActivityMachine::visualizer().to_owned();
117
119
  let mut upsert_search_attr = UpsertSearchAttributesMachine::visualizer().to_owned();
120
+ let mut modify_wf_props = ModifyWorkflowPropertiesMachine::visualizer().to_owned();
118
121
 
119
122
  // This isn't at all efficient but doesn't need to be.
120
123
  // Replace transitions in the vizzes with green color if they are covered.
@@ -138,7 +141,10 @@ mod machine_coverage_report {
138
141
  m @ "UpsertSearchAttributesMachine" => {
139
142
  cover_transitions(m, &mut upsert_search_attr, coverage)
140
143
  }
141
- m => panic!("Unknown machine {}", m),
144
+ m @ "ModifyWorkflowPropertiesMachine" => {
145
+ cover_transitions(m, &mut modify_wf_props, coverage)
146
+ }
147
+ m => panic!("Unknown machine {m}"),
142
148
  }
143
149
  }
144
150
  }
@@ -162,7 +168,7 @@ mod machine_coverage_report {
162
168
  let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
163
169
  d.push("machine_coverage");
164
170
  std::fs::create_dir_all(&d).unwrap();
165
- d.push(format!("{}_Coverage.puml", machine));
171
+ d.push(format!("{machine}_Coverage.puml"));
166
172
  let mut file = File::create(d).unwrap();
167
173
  file.write_all(viz.as_bytes()).unwrap();
168
174
  }
@@ -1,8 +1,8 @@
1
- use super::{
2
- workflow_machines::{MachineResponse, WFMachinesError},
3
- NewMachineWithCommand,
1
+ use super::{workflow_machines::MachineResponse, NewMachineWithCommand};
2
+ use crate::worker::workflow::{
3
+ machines::{Cancellable, EventInfo, HistEventData, WFMachinesAdapter},
4
+ WFMachinesError,
4
5
  };
5
- use crate::worker::workflow::machines::{Cancellable, EventInfo, MachineKind, WFMachinesAdapter};
6
6
  use rustfsm::{fsm, TransitionResult};
7
7
  use temporal_sdk_core_protos::{
8
8
  coresdk::workflow_commands::UpsertWorkflowSearchAttributes,
@@ -102,10 +102,6 @@ impl WFMachinesAdapter for UpsertSearchAttributesMachine {
102
102
  EventType::UpsertWorkflowSearchAttributes
103
103
  )
104
104
  }
105
-
106
- fn kind(&self) -> MachineKind {
107
- MachineKind::UpsertSearchAttributes
108
- }
109
105
  }
110
106
 
111
107
  impl Cancellable for UpsertSearchAttributesMachine {}
@@ -113,10 +109,11 @@ impl Cancellable for UpsertSearchAttributesMachine {}
113
109
  // Converts the generic history event with type EventType::UpsertWorkflowSearchAttributes into the
114
110
  // UpsertSearchAttributesMachine-specific event type
115
111
  // UpsertSearchAttributesMachineEvents::CommandRecorded.
116
- impl TryFrom<HistoryEvent> for UpsertSearchAttributesMachineEvents {
112
+ impl TryFrom<HistEventData> for UpsertSearchAttributesMachineEvents {
117
113
  type Error = WFMachinesError;
118
114
 
119
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
115
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
116
+ let e = e.event;
120
117
  match e.event_type() {
121
118
  EventType::UpsertWorkflowSearchAttributes => {
122
119
  Ok(UpsertSearchAttributesMachineEvents::CommandRecorded)
@@ -233,7 +230,13 @@ mod tests {
233
230
  ..Default::default()
234
231
  };
235
232
  assert!(sm.matches_event(&recorded_history_event));
236
- let cmd_recorded_sm_event = recorded_history_event.try_into().unwrap();
233
+ let cmd_recorded_sm_event = HistEventData {
234
+ event: recorded_history_event,
235
+ replaying: false,
236
+ current_task_is_last_in_history: true,
237
+ }
238
+ .try_into()
239
+ .unwrap();
237
240
 
238
241
  OnEventWrapper::on_event_mut(&mut sm, cmd_scheduled_sm_event)
239
242
  .expect("CommandScheduled should transition Created -> CommandIssued");
@@ -1,15 +1,13 @@
1
- use super::super::{local_activity_state_machine::ResolveDat, WFMachinesError};
1
+ use super::super::local_activity_state_machine::ResolveDat;
2
2
  use crate::{
3
- protosext::{HistoryEventExt, ValidScheduleLA},
3
+ protosext::{CompleteLocalActivityData, ValidScheduleLA},
4
4
  worker::{ExecutingLAId, LocalActRequest, NewLocalAct},
5
5
  };
6
6
  use std::{
7
7
  collections::{HashMap, HashSet},
8
8
  time::SystemTime,
9
9
  };
10
- use temporal_sdk_core_protos::temporal::api::{
11
- common::v1::WorkflowExecution, history::v1::HistoryEvent,
12
- };
10
+ use temporal_sdk_core_protos::temporal::api::common::v1::WorkflowExecution;
13
11
 
14
12
  #[derive(Default)]
15
13
  pub(super) struct LocalActivityData {
@@ -53,7 +51,7 @@ impl LocalActivityData {
53
51
  .chain(self.new_requests.drain(..).map(|sa| {
54
52
  self.executing.insert(sa.seq);
55
53
  LocalActRequest::New(NewLocalAct {
56
- schedule_time: sa.original_schedule_time.unwrap_or_else(SystemTime::now),
54
+ schedule_time: SystemTime::now(),
57
55
  schedule_cmd: sa,
58
56
  workflow_type: wf_type.to_string(),
59
57
  workflow_exec_info: WorkflowExecution {
@@ -70,17 +68,8 @@ impl LocalActivityData {
70
68
  self.executing.len() + self.new_requests.len()
71
69
  }
72
70
 
73
- pub(super) fn process_peekahead_marker(&mut self, e: &HistoryEvent) -> super::Result<()> {
74
- if let Some(la_dat) = e.clone().into_local_activity_marker_details() {
75
- self.preresolutions
76
- .insert(la_dat.marker_dat.seq, la_dat.into());
77
- } else {
78
- return Err(WFMachinesError::Fatal(format!(
79
- "Local activity marker was unparsable: {:?}",
80
- e
81
- )));
82
- }
83
- Ok(())
71
+ pub(super) fn insert_peeked_marker(&mut self, dat: CompleteLocalActivityData) {
72
+ self.preresolutions.insert(dat.marker_dat.seq, dat.into());
84
73
  }
85
74
 
86
75
  pub(super) fn take_preresolution(&mut self, seq: u32) -> Option<ResolveDat> {