temporalio 0.0.1 → 0.1.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 (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
@@ -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, TransitionResult};
6
7
  use std::convert::TryFrom;
7
8
  use temporal_sdk_core_protos::{
@@ -61,16 +62,16 @@ impl CompleteWorkflowMachine {
61
62
  }
62
63
  }
63
64
 
64
- impl TryFrom<HistoryEvent> for CompleteWorkflowMachineEvents {
65
+ impl TryFrom<HistEventData> for CompleteWorkflowMachineEvents {
65
66
  type Error = WFMachinesError;
66
67
 
67
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
68
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
69
+ let e = e.event;
68
70
  Ok(match e.event_type() {
69
71
  EventType::WorkflowExecutionCompleted => Self::WorkflowExecutionCompleted,
70
72
  _ => {
71
73
  return Err(WFMachinesError::Nondeterminism(format!(
72
- "Complete workflow machine does not handle this event: {}",
73
- e
74
+ "Complete workflow machine does not handle this event: {e}"
74
75
  )))
75
76
  }
76
77
  })
@@ -131,10 +132,6 @@ impl WFMachinesAdapter for CompleteWorkflowMachine {
131
132
  fn matches_event(&self, event: &HistoryEvent) -> bool {
132
133
  event.event_type() == EventType::WorkflowExecutionCompleted
133
134
  }
134
-
135
- fn kind(&self) -> MachineKind {
136
- MachineKind::CompleteWorkflow
137
- }
138
135
  }
139
136
 
140
137
  impl Cancellable for CompleteWorkflowMachine {}
@@ -1,7 +1,8 @@
1
1
  use super::{
2
- Cancellable, EventInfo, HistoryEvent, MachineKind, MachineResponse, NewMachineWithCommand,
3
- OnEventWrapper, WFMachinesAdapter, WFMachinesError,
2
+ Cancellable, EventInfo, HistoryEvent, MachineResponse, NewMachineWithCommand, OnEventWrapper,
3
+ WFMachinesAdapter, WFMachinesError,
4
4
  };
5
+ use crate::worker::workflow::machines::HistEventData;
5
6
  use rustfsm::{fsm, TransitionResult};
6
7
  use std::convert::TryFrom;
7
8
  use temporal_sdk_core_protos::{
@@ -69,16 +70,16 @@ impl From<ContinueAsNewWorkflowCommandCreated> for ContinueAsNewWorkflowCommandR
69
70
  }
70
71
  }
71
72
 
72
- impl TryFrom<HistoryEvent> for ContinueAsNewWorkflowMachineEvents {
73
+ impl TryFrom<HistEventData> for ContinueAsNewWorkflowMachineEvents {
73
74
  type Error = WFMachinesError;
74
75
 
75
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
76
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
77
+ let e = e.event;
76
78
  Ok(match e.event_type() {
77
79
  EventType::WorkflowExecutionContinuedAsNew => Self::WorkflowExecutionContinuedAsNew,
78
80
  _ => {
79
81
  return Err(WFMachinesError::Nondeterminism(format!(
80
- "Continue as new workflow machine does not handle this event: {}",
81
- e
82
+ "Continue as new workflow machine does not handle this event: {e}"
82
83
  )))
83
84
  }
84
85
  })
@@ -110,10 +111,6 @@ impl WFMachinesAdapter for ContinueAsNewWorkflowMachine {
110
111
  fn matches_event(&self, event: &HistoryEvent) -> bool {
111
112
  event.event_type() == EventType::WorkflowExecutionContinuedAsNew
112
113
  }
113
-
114
- fn kind(&self) -> MachineKind {
115
- MachineKind::ContinueAsNewWorkflow
116
- }
117
114
  }
118
115
 
119
116
  impl Cancellable for ContinueAsNewWorkflowMachine {}
@@ -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, TransitionResult};
6
7
  use std::convert::TryFrom;
7
8
  use temporal_sdk_core_protos::{
@@ -85,16 +86,16 @@ impl From<FailWorkflowCommandCreated> for FailWorkflowCommandRecorded {
85
86
  }
86
87
  }
87
88
 
88
- impl TryFrom<HistoryEvent> for FailWorkflowMachineEvents {
89
+ impl TryFrom<HistEventData> for FailWorkflowMachineEvents {
89
90
  type Error = WFMachinesError;
90
91
 
91
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
92
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
93
+ let e = e.event;
92
94
  Ok(match e.event_type() {
93
95
  EventType::WorkflowExecutionFailed => Self::WorkflowExecutionFailed,
94
96
  _ => {
95
97
  return Err(WFMachinesError::Nondeterminism(format!(
96
- "Fail workflow machine does not handle this event: {}",
97
- e
98
+ "Fail workflow machine does not handle this event: {e}"
98
99
  )))
99
100
  }
100
101
  })
@@ -124,10 +125,6 @@ impl WFMachinesAdapter for FailWorkflowMachine {
124
125
  fn matches_event(&self, event: &HistoryEvent) -> bool {
125
126
  event.event_type() == EventType::WorkflowExecutionFailed
126
127
  }
127
-
128
- fn kind(&self) -> MachineKind {
129
- MachineKind::FailWorkflow
130
- }
131
128
  }
132
129
 
133
130
  impl Cancellable for FailWorkflowMachine {}
@@ -1,10 +1,14 @@
1
1
  use super::{
2
- workflow_machines::MachineResponse, Cancellable, EventInfo, MachineKind, OnEventWrapper,
3
- WFMachinesAdapter, WFMachinesError,
2
+ workflow_machines::MachineResponse, Cancellable, EventInfo, OnEventWrapper, WFMachinesAdapter,
3
+ WFMachinesError,
4
4
  };
5
5
  use crate::{
6
+ internal_flags::CoreInternalFlags,
6
7
  protosext::{CompleteLocalActivityData, HistoryEventExt, ValidScheduleLA},
7
- worker::LocalActivityExecutionResult,
8
+ worker::{
9
+ workflow::{machines::HistEventData, InternalFlagsRef, OutgoingJob},
10
+ LocalActivityExecutionResult,
11
+ },
8
12
  };
9
13
  use rustfsm::{fsm, MachineError, StateMachine, TransitionResult};
10
14
  use std::{
@@ -59,15 +63,17 @@ fsm! {
59
63
  --> MarkerCommandRecorded;
60
64
 
61
65
  // Replay path ================================================================================
62
- // LAs on the replay path should never have handle result explicitly called on them, but do need
63
- // to eventually see the marker
66
+ // LAs on the replay path always need to eventually see the marker
64
67
  WaitingMarkerEvent --(MarkerRecorded(CompleteLocalActivityData), shared on_marker_recorded)
65
68
  --> MarkerCommandRecorded;
66
69
  // If we are told to cancel while waiting for the marker, we still need to wait for the marker.
67
- WaitingMarkerEvent --(Cancel, on_cancel_requested) --> WaitingMarkerEventCancelled;
70
+ WaitingMarkerEvent --(Cancel, on_cancel_requested) --> WaitingMarkerEvent;
71
+ // Because there could be non-heartbeat WFTs (ex: signals being received) between scheduling
72
+ // the LA and the marker being recorded, peekahead might not always resolve the LA *before*
73
+ // scheduling it. This transition accounts for that.
74
+ WaitingMarkerEvent --(HandleKnownResult(ResolveDat), on_handle_result) --> WaitingMarkerEvent;
68
75
  WaitingMarkerEvent --(NoWaitCancel(ActivityCancellationType),
69
- on_no_wait_cancel) --> WaitingMarkerEventCancelled;
70
- WaitingMarkerEventCancelled --(HandleResult(ResolveDat), on_handle_result) --> WaitingMarkerEvent;
76
+ on_no_wait_cancel) --> WaitingMarkerEvent;
71
77
 
72
78
  // It is entirely possible to have started the LA while replaying, only to find that we have
73
79
  // reached a new WFT and there still was no marker. In such cases we need to execute the LA.
@@ -79,6 +85,10 @@ fsm! {
79
85
  // even though we already resolved the activity.
80
86
  WaitingMarkerEventPreResolved --(MarkerRecorded(CompleteLocalActivityData),
81
87
  shared on_marker_recorded) --> MarkerCommandRecorded;
88
+ // Ignore cancellations when waiting for the marker after being pre-resolved
89
+ WaitingMarkerEventPreResolved --(Cancel) --> WaitingMarkerEventPreResolved;
90
+ WaitingMarkerEventPreResolved --(NoWaitCancel(ActivityCancellationType))
91
+ --> WaitingMarkerEventPreResolved;
82
92
 
83
93
  // Ignore cancellation in final state
84
94
  MarkerCommandRecorded --(Cancel, on_cancel_requested) --> MarkerCommandRecorded;
@@ -131,10 +141,11 @@ impl From<CompleteLocalActivityData> for ResolveDat {
131
141
  /// must resolve before we send a record marker command. A [MachineResponse] may be produced,
132
142
  /// to queue the LA for execution if it needs to be.
133
143
  pub(super) fn new_local_activity(
134
- attrs: ValidScheduleLA,
144
+ mut attrs: ValidScheduleLA,
135
145
  replaying_when_invoked: bool,
136
146
  maybe_pre_resolved: Option<ResolveDat>,
137
147
  wf_time: Option<SystemTime>,
148
+ internal_flags: InternalFlagsRef,
138
149
  ) -> Result<(LocalActivityMachine, Vec<MachineResponse>), WFMachinesError> {
139
150
  let initial_state = if replaying_when_invoked {
140
151
  if let Some(dat) = maybe_pre_resolved {
@@ -151,12 +162,18 @@ pub(super) fn new_local_activity(
151
162
  Executing {}.into()
152
163
  };
153
164
 
165
+ // If the scheduled LA doesn't already have an "original" schedule time, assign one.
166
+ attrs
167
+ .original_schedule_time
168
+ .get_or_insert(SystemTime::now());
169
+
154
170
  let mut machine = LocalActivityMachine {
155
171
  state: initial_state,
156
172
  shared_state: SharedState {
157
173
  attrs,
158
174
  replaying_when_invoked,
159
175
  wf_time_when_started: wf_time,
176
+ internal_flags,
160
177
  },
161
178
  };
162
179
 
@@ -193,6 +210,12 @@ impl LocalActivityMachine {
193
210
  }
194
211
  }
195
212
 
213
+ /// Returns true if the machine will willingly accept data from a marker in its current state.
214
+ /// IE: Calling [Self::try_resolve_with_dat] makes sense.
215
+ pub(super) fn will_accept_resolve_marker(&self) -> bool {
216
+ matches!(self.state, LocalActivityMachineState::WaitingMarkerEvent(_))
217
+ }
218
+
196
219
  /// Must be called if the workflow encounters a non-replay workflow task
197
220
  pub(super) fn encountered_non_replay_wft(
198
221
  &mut self,
@@ -231,28 +254,45 @@ impl LocalActivityMachine {
231
254
  backoff: Option<prost_types::Duration>,
232
255
  original_schedule_time: Option<SystemTime>,
233
256
  ) -> Result<Vec<MachineResponse>, WFMachinesError> {
234
- self.try_resolve_with_dat(ResolveDat {
235
- result,
236
- complete_time: self.shared_state.wf_time_when_started.map(|t| t + runtime),
237
- attempt,
238
- backoff,
239
- original_schedule_time,
240
- })
257
+ self._try_resolve(
258
+ ResolveDat {
259
+ result,
260
+ complete_time: self.shared_state.wf_time_when_started.map(|t| t + runtime),
261
+ attempt,
262
+ backoff,
263
+ original_schedule_time,
264
+ },
265
+ false,
266
+ )
241
267
  }
268
+
242
269
  /// Attempt to resolve the local activity with already known data, ex pre-resolved data
243
270
  pub(super) fn try_resolve_with_dat(
244
271
  &mut self,
245
272
  dat: ResolveDat,
246
273
  ) -> Result<Vec<MachineResponse>, WFMachinesError> {
247
- let res = OnEventWrapper::on_event_mut(self, LocalActivityMachineEvents::HandleResult(dat))
248
- .map_err(|e| match e {
249
- MachineError::InvalidTransition => WFMachinesError::Fatal(format!(
250
- "Invalid transition resolving local activity (seq {}) in {}",
251
- self.shared_state.attrs.seq,
252
- self.state(),
253
- )),
254
- MachineError::Underlying(e) => e,
255
- })?;
274
+ self._try_resolve(dat, true)
275
+ }
276
+
277
+ fn _try_resolve(
278
+ &mut self,
279
+ dat: ResolveDat,
280
+ from_marker: bool,
281
+ ) -> Result<Vec<MachineResponse>, WFMachinesError> {
282
+ let evt = if from_marker {
283
+ LocalActivityMachineEvents::HandleKnownResult(dat)
284
+ } else {
285
+ LocalActivityMachineEvents::HandleResult(dat)
286
+ };
287
+ let res = OnEventWrapper::on_event_mut(self, evt).map_err(|e| match e {
288
+ MachineError::InvalidTransition => WFMachinesError::Fatal(format!(
289
+ "Invalid transition resolving local activity (seq {}, from marker: {}) in {}",
290
+ self.shared_state.attrs.seq,
291
+ from_marker,
292
+ self.state(),
293
+ )),
294
+ MachineError::Underlying(e) => e,
295
+ })?;
256
296
 
257
297
  Ok(res
258
298
  .into_iter()
@@ -269,6 +309,7 @@ pub(super) struct SharedState {
269
309
  attrs: ValidScheduleLA,
270
310
  replaying_when_invoked: bool,
271
311
  wf_time_when_started: Option<SystemTime>,
312
+ internal_flags: InternalFlagsRef,
272
313
  }
273
314
 
274
315
  impl SharedState {
@@ -286,6 +327,7 @@ impl SharedState {
286
327
  }
287
328
  }
288
329
 
330
+ #[allow(clippy::large_enum_variant)]
289
331
  #[derive(Debug, derive_more::Display)]
290
332
  pub(super) enum LocalActivityCommand {
291
333
  RequestActivityExecution(ValidScheduleLA),
@@ -500,6 +542,17 @@ impl WaitingMarkerEvent {
500
542
  })
501
543
  )
502
544
  }
545
+ fn on_handle_result(
546
+ self,
547
+ dat: ResolveDat,
548
+ ) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
549
+ TransitionResult::ok(
550
+ [LocalActivityCommand::Resolved(dat)],
551
+ WaitingMarkerEvent {
552
+ already_resolved: true,
553
+ },
554
+ )
555
+ }
503
556
  pub(super) fn on_started_non_replay_wft(
504
557
  self,
505
558
  mut dat: SharedState,
@@ -515,41 +568,22 @@ impl WaitingMarkerEvent {
515
568
  )
516
569
  }
517
570
 
518
- fn on_cancel_requested(self) -> LocalActivityMachineTransition<WaitingMarkerEventCancelled> {
571
+ fn on_cancel_requested(self) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
519
572
  // We still "request a cancel" even though we know the local activity should not be running
520
573
  // because the data might be in the pre-resolved list.
521
- TransitionResult::ok(
522
- [LocalActivityCommand::RequestCancel],
523
- WaitingMarkerEventCancelled {},
524
- )
574
+ TransitionResult::ok([LocalActivityCommand::RequestCancel], self)
525
575
  }
526
576
 
527
577
  fn on_no_wait_cancel(
528
578
  self,
529
579
  _: ActivityCancellationType,
530
- ) -> LocalActivityMachineTransition<WaitingMarkerEventCancelled> {
580
+ ) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
531
581
  // Markers are always recorded when cancelling, so this is the same as a normal cancel on
532
582
  // the replay path
533
583
  self.on_cancel_requested()
534
584
  }
535
585
  }
536
586
 
537
- #[derive(Default, Clone)]
538
- pub(super) struct WaitingMarkerEventCancelled {}
539
- impl WaitingMarkerEventCancelled {
540
- fn on_handle_result(
541
- self,
542
- dat: ResolveDat,
543
- ) -> LocalActivityMachineTransition<WaitingMarkerEvent> {
544
- TransitionResult::ok(
545
- [LocalActivityCommand::Resolved(dat)],
546
- WaitingMarkerEvent {
547
- already_resolved: true,
548
- },
549
- )
550
- }
551
- }
552
-
553
587
  #[derive(Default, Clone)]
554
588
  pub(super) struct WaitingMarkerEventPreResolved {}
555
589
  impl WaitingMarkerEventPreResolved {
@@ -643,13 +677,14 @@ impl WFMachinesAdapter for LocalActivityMachine {
643
677
  result.into()
644
678
  };
645
679
  let mut responses = vec![
646
- MachineResponse::PushWFJob(
647
- ResolveActivity {
680
+ MachineResponse::PushWFJob(OutgoingJob {
681
+ variant: ResolveActivity {
648
682
  seq: self.shared_state.attrs.seq,
649
683
  result: Some(resolution),
650
684
  }
651
685
  .into(),
652
- ),
686
+ is_la_resolution: true,
687
+ }),
653
688
  MachineResponse::UpdateWFTime(complete_time),
654
689
  ];
655
690
 
@@ -708,10 +743,6 @@ impl WFMachinesAdapter for LocalActivityMachine {
708
743
  fn matches_event(&self, event: &HistoryEvent) -> bool {
709
744
  event.is_local_activity_marker()
710
745
  }
711
-
712
- fn kind(&self) -> MachineKind {
713
- MachineKind::LocalActivity
714
- }
715
746
  }
716
747
 
717
748
  impl TryFrom<CommandType> for LocalActivityMachineEvents {
@@ -725,14 +756,14 @@ impl TryFrom<CommandType> for LocalActivityMachineEvents {
725
756
  }
726
757
  }
727
758
 
728
- impl TryFrom<HistoryEvent> for LocalActivityMachineEvents {
759
+ impl TryFrom<HistEventData> for LocalActivityMachineEvents {
729
760
  type Error = WFMachinesError;
730
761
 
731
- fn try_from(e: HistoryEvent) -> Result<Self, Self::Error> {
762
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
763
+ let e = e.event;
732
764
  if e.event_type() != EventType::MarkerRecorded {
733
765
  return Err(WFMachinesError::Nondeterminism(format!(
734
- "Local activity machine cannot handle this event: {}",
735
- e
766
+ "Local activity machine cannot handle this event: {e}"
736
767
  )));
737
768
  }
738
769
 
@@ -756,6 +787,28 @@ fn verify_marker_data_matches(
756
787
  dat.marker_dat.seq, shared.attrs.seq
757
788
  )));
758
789
  }
790
+ // Here we use whether or not we were replaying when we _first invoked_ the LA, because we
791
+ // are always replaying when we see the marker recorded event, and that would make this check
792
+ // a bit pointless.
793
+ if shared.internal_flags.borrow_mut().try_use(
794
+ CoreInternalFlags::IdAndTypeDeterminismChecks,
795
+ !shared.replaying_when_invoked,
796
+ ) {
797
+ if dat.marker_dat.activity_id != shared.attrs.activity_id {
798
+ return Err(WFMachinesError::Nondeterminism(format!(
799
+ "Activity id of recorded marker '{}' does not \
800
+ match activity id of local activity command '{}'",
801
+ dat.marker_dat.activity_id, shared.attrs.activity_id
802
+ )));
803
+ }
804
+ if dat.marker_dat.activity_type != shared.attrs.activity_type {
805
+ return Err(WFMachinesError::Nondeterminism(format!(
806
+ "Activity type of recorded marker '{}' does not \
807
+ match activity type of local activity command '{}'",
808
+ dat.marker_dat.activity_type, shared.attrs.activity_type
809
+ )));
810
+ }
811
+ }
759
812
 
760
813
  Ok(())
761
814
  }
@@ -798,10 +851,15 @@ mod tests {
798
851
  temporal::api::{
799
852
  command::v1::command, enums::v1::WorkflowTaskFailedCause, failure::v1::Failure,
800
853
  },
854
+ DEFAULT_ACTIVITY_TYPE,
801
855
  };
802
856
 
803
857
  async fn la_wf(ctx: WfContext) -> WorkflowResult<()> {
804
- ctx.local_activity(LocalActivityOptions::default()).await;
858
+ ctx.local_activity(LocalActivityOptions {
859
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
860
+ ..Default::default()
861
+ })
862
+ .await;
805
863
  Ok(().into())
806
864
  }
807
865
 
@@ -914,8 +972,16 @@ mod tests {
914
972
  }
915
973
 
916
974
  async fn two_la_wf(ctx: WfContext) -> WorkflowResult<()> {
917
- ctx.local_activity(LocalActivityOptions::default()).await;
918
- ctx.local_activity(LocalActivityOptions::default()).await;
975
+ ctx.local_activity(LocalActivityOptions {
976
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
977
+ ..Default::default()
978
+ })
979
+ .await;
980
+ ctx.local_activity(LocalActivityOptions {
981
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
982
+ ..Default::default()
983
+ })
984
+ .await;
919
985
  Ok(().into())
920
986
  }
921
987
 
@@ -940,7 +1006,7 @@ mod tests {
940
1006
  let commands = wfm.get_server_commands().commands;
941
1007
  assert_eq!(commands.len(), 0);
942
1008
  let ready_to_execute_las = wfm.drain_queued_local_activities();
943
- let num_queued = if !replay { 1 } else { 0 };
1009
+ let num_queued = usize::from(!replay);
944
1010
  assert_eq!(ready_to_execute_las.len(), num_queued);
945
1011
 
946
1012
  if !replay {
@@ -1008,8 +1074,14 @@ mod tests {
1008
1074
 
1009
1075
  async fn two_la_wf_parallel(ctx: WfContext) -> WorkflowResult<()> {
1010
1076
  tokio::join!(
1011
- ctx.local_activity(LocalActivityOptions::default()),
1012
- ctx.local_activity(LocalActivityOptions::default())
1077
+ ctx.local_activity(LocalActivityOptions {
1078
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1079
+ ..Default::default()
1080
+ }),
1081
+ ctx.local_activity(LocalActivityOptions {
1082
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1083
+ ..Default::default()
1084
+ })
1013
1085
  );
1014
1086
  Ok(().into())
1015
1087
  }
@@ -1092,9 +1164,17 @@ mod tests {
1092
1164
  }
1093
1165
 
1094
1166
  async fn la_timer_la(ctx: WfContext) -> WorkflowResult<()> {
1095
- ctx.local_activity(LocalActivityOptions::default()).await;
1167
+ ctx.local_activity(LocalActivityOptions {
1168
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1169
+ ..Default::default()
1170
+ })
1171
+ .await;
1096
1172
  ctx.timer(Duration::from_secs(5)).await;
1097
- ctx.local_activity(LocalActivityOptions::default()).await;
1173
+ ctx.local_activity(LocalActivityOptions {
1174
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1175
+ ..Default::default()
1176
+ })
1177
+ .await;
1098
1178
  Ok(().into())
1099
1179
  }
1100
1180
 
@@ -1116,7 +1196,7 @@ mod tests {
1116
1196
  let commands = wfm.get_server_commands().commands;
1117
1197
  assert_eq!(commands.len(), 0);
1118
1198
  let ready_to_execute_las = wfm.drain_queued_local_activities();
1119
- let num_queued = if !replay { 1 } else { 0 };
1199
+ let num_queued = usize::from(!replay);
1120
1200
  assert_eq!(ready_to_execute_las.len(), num_queued);
1121
1201
 
1122
1202
  if !replay {
@@ -1158,7 +1238,7 @@ mod tests {
1158
1238
  }]
1159
1239
  );
1160
1240
  let ready_to_execute_las = wfm.drain_queued_local_activities();
1161
- let num_queued = if !replay { 1 } else { 0 };
1241
+ let num_queued = usize::from(!replay);
1162
1242
  assert_eq!(ready_to_execute_las.len(), num_queued);
1163
1243
  if !replay {
1164
1244
  wfm.complete_local_activity(2, ActivityExecutionResult::ok(b"Resolved".into()))
@@ -1210,17 +1290,12 @@ mod tests {
1210
1290
  let histinfo = t.get_full_history_info().unwrap().into();
1211
1291
  let mut wfm = ManagedWFFunc::new_from_update(histinfo, func, vec![]);
1212
1292
 
1213
- // First activation will request to run the LA, but it will *not* be queued for execution
1214
- // yet as we're still replaying.
1293
+ // First activation will request to run the LA since the heartbeat & wft failure are skipped
1294
+ // over
1215
1295
  wfm.get_next_activation().await.unwrap();
1216
1296
  let commands = wfm.get_server_commands().commands;
1217
1297
  assert_eq!(commands.len(), 0);
1218
1298
  let ready_to_execute_las = wfm.drain_queued_local_activities();
1219
- assert_eq!(ready_to_execute_las.len(), 0);
1220
-
1221
- // On the *next* activation, we are no longer replaying and the activity should be queued
1222
- wfm.get_next_activation().await.unwrap();
1223
- let ready_to_execute_las = wfm.drain_queued_local_activities();
1224
1299
  assert_eq!(ready_to_execute_las.len(), 1);
1225
1300
  // We can happily complete it now
1226
1301
  wfm.complete_local_activity(1, ActivityExecutionResult::ok(b"hi".into()))
@@ -1340,6 +1415,7 @@ mod tests {
1340
1415
  let func = WorkflowFunction::new(move |ctx| async move {
1341
1416
  let la = ctx.local_activity(LocalActivityOptions {
1342
1417
  cancel_type,
1418
+ activity_type: DEFAULT_ACTIVITY_TYPE.to_string(),
1343
1419
  ..Default::default()
1344
1420
  });
1345
1421
  ctx.timer(Duration::from_secs(1)).await;
@@ -1355,14 +1431,14 @@ mod tests {
1355
1431
  let mut t = TestHistoryBuilder::default();
1356
1432
  t.add_by_type(EventType::WorkflowExecutionStarted);
1357
1433
  t.add_full_wf_task();
1358
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
1434
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
1359
1435
  t.add_timer_fired(timer_started_event_id, "1".to_string());
1360
1436
  t.add_full_wf_task();
1361
1437
  if cancel_type != ActivityCancellationType::WaitCancellationCompleted {
1362
1438
  // With non-wait cancels, the cancel is immediate
1363
1439
  t.add_local_activity_cancel_marker(1, "1");
1364
1440
  }
1365
- let timer_started_event_id = t.add_get_event_id(EventType::TimerStarted, None);
1441
+ let timer_started_event_id = t.add_by_type(EventType::TimerStarted);
1366
1442
  if cancel_type == ActivityCancellationType::WaitCancellationCompleted {
1367
1443
  // With wait cancels, the cancel marker is not recorded until activity reports.
1368
1444
  t.add_local_activity_cancel_marker(1, "1");
@@ -1383,7 +1459,7 @@ mod tests {
1383
1459
  assert_eq!(commands.len(), 1);
1384
1460
  assert_eq!(commands[0].command_type, CommandType::StartTimer as i32);
1385
1461
  let ready_to_execute_las = wfm.drain_queued_local_activities();
1386
- let num_queued = if !replay { 1 } else { 0 };
1462
+ let num_queued = usize::from(!replay);
1387
1463
  assert_eq!(ready_to_execute_las.len(), num_queued);
1388
1464
 
1389
1465
  // Next activation timer fires and activity cancel will be requested
@@ -1406,8 +1482,9 @@ mod tests {
1406
1482
  assert_eq!(commands[1].command_type, CommandType::StartTimer as i32);
1407
1483
  }
1408
1484
 
1409
- if replay {
1410
- wfm.get_next_activation().await.unwrap()
1485
+ let commands = if replay {
1486
+ wfm.get_next_activation().await.unwrap();
1487
+ wfm.get_server_commands().commands
1411
1488
  } else {
1412
1489
  // On non replay, there's an additional activation, because completing with the cancel
1413
1490
  // wants to wake up the workflow to see if resolving the LA as cancelled did anything.
@@ -1432,11 +1509,11 @@ mod tests {
1432
1509
 
1433
1510
  wfm.new_history(t.get_history_info(3).unwrap().into())
1434
1511
  .await
1435
- .unwrap()
1512
+ .unwrap();
1513
+ wfm.get_next_activation().await.unwrap();
1514
+ wfm.get_server_commands().commands
1436
1515
  };
1437
1516
 
1438
- wfm.get_next_activation().await.unwrap();
1439
- let commands = wfm.get_server_commands().commands;
1440
1517
  assert_eq!(commands.len(), 1);
1441
1518
  assert_eq!(
1442
1519
  commands[0].command_type,