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,19 +1,28 @@
1
1
  use anyhow::anyhow;
2
2
  use futures::future::join_all;
3
- use std::time::Duration;
3
+ use std::{
4
+ sync::atomic::{AtomicU8, Ordering},
5
+ time::Duration,
6
+ };
4
7
  use temporal_client::WorkflowOptions;
5
8
  use temporal_sdk::{
6
9
  interceptors::WorkerInterceptor, ActContext, ActivityCancelledError, CancellableFuture,
7
10
  LocalActivityOptions, WfContext, WorkflowResult,
8
11
  };
12
+ use temporal_sdk_core::replay::HistoryForReplay;
9
13
  use temporal_sdk_core_protos::{
10
14
  coresdk::{
11
- workflow_commands::ActivityCancellationType,
15
+ workflow_commands::workflow_command::Variant, workflow_commands::ActivityCancellationType,
16
+ workflow_completion, workflow_completion::workflow_activation_completion,
12
17
  workflow_completion::WorkflowActivationCompletion, AsJsonPayloadExt,
13
18
  },
14
- temporal::api::common::v1::RetryPolicy,
19
+ temporal::api::{common::v1::RetryPolicy, enums::v1::TimeoutType},
20
+ TestHistoryBuilder,
21
+ };
22
+ use temporal_sdk_core_test_utils::{
23
+ history_from_proto_binary, init_integ_telem, replay_sdk_worker, workflows::la_problem_workflow,
24
+ CoreWfStarter,
15
25
  };
16
- use temporal_sdk_core_test_utils::CoreWfStarter;
17
26
  use tokio_util::sync::CancellationToken;
18
27
 
19
28
  pub async fn echo(_ctx: ActContext, e: String) -> anyhow::Result<String> {
@@ -41,15 +50,7 @@ async fn one_local_activity() {
41
50
  worker.register_wf(wf_name.to_owned(), one_local_activity_wf);
42
51
  worker.register_activity("echo_activity", echo);
43
52
 
44
- worker
45
- .submit_wf(
46
- wf_name.to_owned(),
47
- wf_name.to_owned(),
48
- vec![],
49
- WorkflowOptions::default(),
50
- )
51
- .await
52
- .unwrap();
53
+ starter.start_with_worker(wf_name, &mut worker).await;
53
54
  worker.run_until_done().await.unwrap();
54
55
  }
55
56
 
@@ -72,15 +73,7 @@ async fn local_act_concurrent_with_timer() {
72
73
  worker.register_wf(wf_name.to_owned(), local_act_concurrent_with_timer_wf);
73
74
  worker.register_activity("echo_activity", echo);
74
75
 
75
- worker
76
- .submit_wf(
77
- wf_name.to_owned(),
78
- wf_name.to_owned(),
79
- vec![],
80
- WorkflowOptions::default(),
81
- )
82
- .await
83
- .unwrap();
76
+ starter.start_with_worker(wf_name, &mut worker).await;
84
77
  worker.run_until_done().await.unwrap();
85
78
  }
86
79
 
@@ -104,15 +97,7 @@ async fn local_act_then_timer_then_wait_result() {
104
97
  worker.register_wf(wf_name.to_owned(), local_act_then_timer_then_wait);
105
98
  worker.register_activity("echo_activity", echo);
106
99
 
107
- worker
108
- .submit_wf(
109
- wf_name.to_owned(),
110
- wf_name.to_owned(),
111
- vec![],
112
- WorkflowOptions::default(),
113
- )
114
- .await
115
- .unwrap();
100
+ starter.start_with_worker(wf_name, &mut worker).await;
116
101
  worker.run_until_done().await.unwrap();
117
102
  }
118
103
 
@@ -120,7 +105,7 @@ async fn local_act_then_timer_then_wait_result() {
120
105
  async fn long_running_local_act_with_timer() {
121
106
  let wf_name = "long_running_local_act_with_timer";
122
107
  let mut starter = CoreWfStarter::new(wf_name);
123
- starter.wft_timeout(Duration::from_secs(1));
108
+ starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
124
109
  let mut worker = starter.worker().await;
125
110
  worker.register_wf(wf_name.to_owned(), local_act_then_timer_then_wait);
126
111
  worker.register_activity("echo_activity", |_ctx: ActContext, str: String| async {
@@ -128,15 +113,7 @@ async fn long_running_local_act_with_timer() {
128
113
  Ok(str)
129
114
  });
130
115
 
131
- worker
132
- .submit_wf(
133
- wf_name.to_owned(),
134
- wf_name.to_owned(),
135
- vec![],
136
- WorkflowOptions::default(),
137
- )
138
- .await
139
- .unwrap();
116
+ starter.start_with_worker(wf_name, &mut worker).await;
140
117
  worker.run_until_done().await.unwrap();
141
118
  }
142
119
 
@@ -145,7 +122,7 @@ pub async fn local_act_fanout_wf(ctx: WfContext) -> WorkflowResult<()> {
145
122
  .map(|i| {
146
123
  ctx.local_activity(LocalActivityOptions {
147
124
  activity_type: "echo_activity".to_string(),
148
- input: format!("Hi {}", i)
125
+ input: format!("Hi {i}")
149
126
  .as_json_payload()
150
127
  .expect("serializes fine"),
151
128
  ..Default::default()
@@ -166,15 +143,7 @@ async fn local_act_fanout() {
166
143
  worker.register_wf(wf_name.to_owned(), local_act_fanout_wf);
167
144
  worker.register_activity("echo_activity", echo);
168
145
 
169
- worker
170
- .submit_wf(
171
- wf_name.to_owned(),
172
- wf_name.to_owned(),
173
- vec![],
174
- WorkflowOptions::default(),
175
- )
176
- .await
177
- .unwrap();
146
+ starter.start_with_worker(wf_name, &mut worker).await;
178
147
  worker.run_until_done().await.unwrap();
179
148
  }
180
149
 
@@ -229,7 +198,7 @@ async fn local_act_retry_timer_backoff() {
229
198
  #[case::abandon(ActivityCancellationType::Abandon)]
230
199
  #[tokio::test]
231
200
  async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
232
- let wf_name = format!("cancel_immediate_{:?}", cancel_type);
201
+ let wf_name = format!("cancel_immediate_{cancel_type:?}");
233
202
  let mut starter = CoreWfStarter::new(&wf_name);
234
203
  let mut worker = starter.worker().await;
235
204
  worker.register_wf(&wf_name, move |ctx: WfContext| async move {
@@ -263,17 +232,10 @@ async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
263
232
  }
264
233
  });
265
234
 
266
- worker
267
- .submit_wf(
268
- wf_name.to_owned(),
269
- wf_name.to_owned(),
270
- vec![],
271
- WorkflowOptions::default(),
272
- )
273
- .await
274
- .unwrap();
235
+ starter.start_with_worker(wf_name, &mut worker).await;
275
236
  worker
276
237
  .run_until_done_intercepted(Some(LACancellerInterceptor {
238
+ cancel_on_workflow_completed: false,
277
239
  token: manual_cancel,
278
240
  }))
279
241
  .await
@@ -282,12 +244,29 @@ async fn cancel_immediate(#[case] cancel_type: ActivityCancellationType) {
282
244
 
283
245
  struct LACancellerInterceptor {
284
246
  token: CancellationToken,
247
+ cancel_on_workflow_completed: bool,
285
248
  }
286
249
  #[async_trait::async_trait(?Send)]
287
250
  impl WorkerInterceptor for LACancellerInterceptor {
288
- async fn on_workflow_activation_completion(&self, _: &WorkflowActivationCompletion) {}
251
+ async fn on_workflow_activation_completion(&self, completion: &WorkflowActivationCompletion) {
252
+ if !self.cancel_on_workflow_completed {
253
+ return;
254
+ }
255
+ if let Some(workflow_activation_completion::Status::Successful(
256
+ workflow_completion::Success { commands, .. },
257
+ )) = completion.status.as_ref()
258
+ {
259
+ if let Some(&Variant::CompleteWorkflowExecution(_)) =
260
+ commands.last().and_then(|v| v.variant.as_ref())
261
+ {
262
+ self.token.cancel();
263
+ }
264
+ }
265
+ }
289
266
  fn on_shutdown(&self, _: &temporal_sdk::Worker) {
290
- self.token.cancel()
267
+ if !self.cancel_on_workflow_completed {
268
+ self.token.cancel()
269
+ }
291
270
  }
292
271
  }
293
272
 
@@ -305,12 +284,9 @@ async fn cancel_after_act_starts(
305
284
  )]
306
285
  cancel_type: ActivityCancellationType,
307
286
  ) {
308
- let wf_name = format!(
309
- "cancel_after_act_starts_timer_{:?}_{:?}",
310
- cancel_on_backoff, cancel_type
311
- );
287
+ let wf_name = format!("cancel_after_act_starts_{cancel_on_backoff:?}_{cancel_type:?}");
312
288
  let mut starter = CoreWfStarter::new(&wf_name);
313
- starter.wft_timeout(Duration::from_secs(1));
289
+ starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
314
290
  let mut worker = starter.worker().await;
315
291
  let bo_dur = cancel_on_backoff.unwrap_or_else(|| Duration::from_secs(1));
316
292
  worker.register_wf(&wf_name, move |ctx: WfContext| async move {
@@ -370,21 +346,17 @@ async fn cancel_after_act_starts(
370
346
  }
371
347
  });
372
348
 
373
- worker
374
- .submit_wf(
375
- wf_name.to_owned(),
376
- wf_name.to_owned(),
377
- vec![],
378
- WorkflowOptions::default(),
379
- )
380
- .await
381
- .unwrap();
349
+ starter.start_with_worker(&wf_name, &mut worker).await;
382
350
  worker
383
351
  .run_until_done_intercepted(Some(LACancellerInterceptor {
384
352
  token: manual_cancel,
353
+ // Only needed for this one case since the activity is not drained and prevents worker from shutting down.
354
+ cancel_on_workflow_completed: matches!(cancel_type, ActivityCancellationType::Abandon)
355
+ && cancel_on_backoff.is_none(),
385
356
  }))
386
357
  .await
387
358
  .unwrap();
359
+ starter.shutdown().await;
388
360
  }
389
361
 
390
362
  #[rstest::rstest]
@@ -403,6 +375,11 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
403
375
  } else {
404
376
  (None, Some(Duration::from_secs(2)))
405
377
  };
378
+ let timeout_type = if is_schedule {
379
+ TimeoutType::ScheduleToClose
380
+ } else {
381
+ TimeoutType::StartToClose
382
+ };
406
383
 
407
384
  worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
408
385
  let res = ctx
@@ -422,7 +399,7 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
422
399
  ..Default::default()
423
400
  })
424
401
  .await;
425
- assert!(res.timed_out());
402
+ assert_eq!(res.timed_out(), Some(timeout_type));
426
403
  Ok(().into())
427
404
  });
428
405
  worker.register_activity("echo", |ctx: ActContext, _: String| async move {
@@ -435,15 +412,7 @@ async fn x_to_close_timeout(#[case] is_schedule: bool) {
435
412
  Ok(())
436
413
  });
437
414
 
438
- worker
439
- .submit_wf(
440
- wf_name.to_owned(),
441
- wf_name.to_owned(),
442
- vec![],
443
- WorkflowOptions::default(),
444
- )
445
- .await
446
- .unwrap();
415
+ starter.start_with_worker(wf_name, &mut worker).await;
447
416
  worker.run_until_done().await.unwrap();
448
417
  }
449
418
 
@@ -467,43 +436,37 @@ async fn schedule_to_close_timeout_across_timer_backoff(#[case] cached: bool) {
467
436
  activity_type: "echo".to_string(),
468
437
  input: "hi".as_json_payload().expect("serializes fine"),
469
438
  retry_policy: RetryPolicy {
470
- initial_interval: Some(prost_dur!(from_micros(15))),
439
+ initial_interval: Some(prost_dur!(from_millis(15))),
471
440
  backoff_coefficient: 1_000.,
472
- maximum_interval: Some(prost_dur!(from_millis(1500))),
441
+ maximum_interval: Some(prost_dur!(from_millis(1000))),
473
442
  maximum_attempts: 40,
474
443
  non_retryable_error_types: vec![],
475
444
  },
476
- timer_backoff_threshold: Some(Duration::from_secs(1)),
477
- schedule_to_close_timeout: Some(Duration::from_secs(3)),
445
+ timer_backoff_threshold: Some(Duration::from_millis(500)),
446
+ schedule_to_close_timeout: Some(Duration::from_secs(2)),
478
447
  ..Default::default()
479
448
  })
480
449
  .await;
481
- assert!(res.timed_out());
450
+ assert_eq!(res.timed_out(), Some(TimeoutType::ScheduleToClose));
482
451
  Ok(().into())
483
452
  });
484
- worker.register_activity("echo", |_: ActContext, _: String| async {
453
+ let num_attempts: &'static _ = Box::leak(Box::new(AtomicU8::new(0)));
454
+ worker.register_activity("echo", move |_: ActContext, _: String| async {
455
+ num_attempts.fetch_add(1, Ordering::Relaxed);
485
456
  Result::<(), _>::Err(anyhow!("Oh no I failed!"))
486
457
  });
487
458
 
488
- worker
489
- .submit_wf(
490
- wf_name.to_owned(),
491
- wf_name.to_owned(),
492
- vec![],
493
- WorkflowOptions::default(),
494
- )
495
- .await
496
- .unwrap();
459
+ starter.start_with_worker(wf_name, &mut worker).await;
497
460
  worker.run_until_done().await.unwrap();
461
+ // 3 attempts b/c first backoff is very small, then the next 2 attempts take at least 2 seconds
462
+ // b/c of timer backoff.
463
+ assert_eq!(3, num_attempts.load(Ordering::Relaxed));
498
464
  }
499
465
 
500
466
  #[rstest::rstest]
501
467
  #[tokio::test]
502
468
  async fn eviction_wont_make_local_act_get_dropped(#[values(true, false)] short_wft_timeout: bool) {
503
- let wf_name = format!(
504
- "eviction_wont_make_local_act_get_dropped_{}",
505
- short_wft_timeout
506
- );
469
+ let wf_name = format!("eviction_wont_make_local_act_get_dropped_{short_wft_timeout}");
507
470
  let mut starter = CoreWfStarter::new(&wf_name);
508
471
  starter.max_cached_workflows(0);
509
472
  let mut worker = starter.worker().await;
@@ -569,15 +532,7 @@ async fn timer_backoff_concurrent_with_non_timer_backoff() {
569
532
  Result::<(), _>::Err(anyhow!("Oh no I failed!"))
570
533
  });
571
534
 
572
- worker
573
- .submit_wf(
574
- wf_name.to_owned(),
575
- wf_name.to_owned(),
576
- vec![],
577
- WorkflowOptions::default(),
578
- )
579
- .await
580
- .unwrap();
535
+ starter.start_with_worker(wf_name, &mut worker).await;
581
536
  worker.run_until_done().await.unwrap();
582
537
  }
583
538
 
@@ -608,7 +563,7 @@ async fn repro_nondeterminism_with_timer_bug() {
608
563
  _ = r1 => {
609
564
  t1.cancel(&ctx);
610
565
  },
611
- };
566
+ }
612
567
  ctx.timer(Duration::from_secs(1)).await;
613
568
  Ok(().into())
614
569
  });
@@ -632,3 +587,83 @@ async fn repro_nondeterminism_with_timer_bug() {
632
587
  .await
633
588
  .unwrap();
634
589
  }
590
+
591
+ #[rstest::rstest]
592
+ #[tokio::test]
593
+ async fn weird_la_nondeterminism_repro(#[values(true, false)] fix_hist: bool) {
594
+ init_integ_telem();
595
+ let mut hist = history_from_proto_binary(
596
+ "histories/evict_while_la_running_no_interference-85_history.bin",
597
+ )
598
+ .await
599
+ .unwrap();
600
+ if fix_hist {
601
+ // Replace broken ending with accurate ending
602
+ hist.events.truncate(20);
603
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
604
+ thb.add_workflow_task_completed();
605
+ thb.add_workflow_execution_completed();
606
+ hist = thb.get_full_history_info().unwrap().into();
607
+ }
608
+
609
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
610
+ worker.register_wf(
611
+ "evict_while_la_running_no_interference",
612
+ la_problem_workflow,
613
+ );
614
+ worker.register_activity("delay", |_: ActContext, _: String| async {
615
+ tokio::time::sleep(Duration::from_secs(15)).await;
616
+ Ok(())
617
+ });
618
+ worker.run().await.unwrap();
619
+ }
620
+
621
+ #[tokio::test]
622
+ async fn second_weird_la_nondeterminism_repro() {
623
+ init_integ_telem();
624
+ let mut hist = history_from_proto_binary(
625
+ "histories/evict_while_la_running_no_interference-23_history.bin",
626
+ )
627
+ .await
628
+ .unwrap();
629
+ // Chop off uninteresting ending
630
+ hist.events.truncate(24);
631
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
632
+ thb.add_workflow_execution_completed();
633
+ hist = thb.get_full_history_info().unwrap().into();
634
+
635
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
636
+ worker.register_wf(
637
+ "evict_while_la_running_no_interference",
638
+ la_problem_workflow,
639
+ );
640
+ worker.register_activity("delay", |_: ActContext, _: String| async {
641
+ tokio::time::sleep(Duration::from_secs(15)).await;
642
+ Ok(())
643
+ });
644
+ worker.run().await.unwrap();
645
+ }
646
+
647
+ #[tokio::test]
648
+ async fn third_weird_la_nondeterminism_repro() {
649
+ init_integ_telem();
650
+ let mut hist = history_from_proto_binary(
651
+ "histories/evict_while_la_running_no_interference-16_history.bin",
652
+ )
653
+ .await
654
+ .unwrap();
655
+ let mut thb = TestHistoryBuilder::from_history(hist.events);
656
+ thb.add_workflow_task_scheduled_and_started();
657
+ hist = thb.get_full_history_info().unwrap().into();
658
+
659
+ let mut worker = replay_sdk_worker([HistoryForReplay::new(hist, "fake".to_owned())]);
660
+ worker.register_wf(
661
+ "evict_while_la_running_no_interference",
662
+ la_problem_workflow,
663
+ );
664
+ worker.register_activity("delay", |_: ActContext, _: String| async {
665
+ tokio::time::sleep(Duration::from_secs(15)).await;
666
+ Ok(())
667
+ });
668
+ worker.run().await.unwrap();
669
+ }
@@ -0,0 +1,54 @@
1
+ use temporal_client::WorkflowClientTrait;
2
+ use temporal_sdk::{WfContext, WorkflowResult};
3
+ use temporal_sdk_core_protos::coresdk::{AsJsonPayloadExt, FromJsonPayloadExt};
4
+ use temporal_sdk_core_test_utils::CoreWfStarter;
5
+ use uuid::Uuid;
6
+
7
+ static FIELD_A: &str = "cat_name";
8
+ static FIELD_B: &str = "cute_level";
9
+
10
+ async fn memo_upserter(ctx: WfContext) -> WorkflowResult<()> {
11
+ ctx.upsert_memo([
12
+ (FIELD_A.to_string(), "enchi".as_json_payload().unwrap()),
13
+ (FIELD_B.to_string(), 9001.as_json_payload().unwrap()),
14
+ ]);
15
+ Ok(().into())
16
+ }
17
+
18
+ #[tokio::test]
19
+ async fn sends_modify_wf_props() {
20
+ let wf_name = "can_upsert_memo";
21
+ let wf_id = Uuid::new_v4();
22
+ let mut starter = CoreWfStarter::new(wf_name);
23
+ starter.no_remote_activities();
24
+ let mut worker = starter.worker().await;
25
+
26
+ worker.register_wf(wf_name, memo_upserter);
27
+ let run_id = worker
28
+ .submit_wf(wf_id.to_string(), wf_name, vec![], Default::default())
29
+ .await
30
+ .unwrap();
31
+ worker.run_until_done().await.unwrap();
32
+
33
+ let memo = starter
34
+ .get_client()
35
+ .await
36
+ .describe_workflow_execution(wf_id.to_string(), Some(run_id))
37
+ .await
38
+ .unwrap()
39
+ .workflow_execution_info
40
+ .unwrap()
41
+ .memo
42
+ .unwrap()
43
+ .fields;
44
+ let catname = memo.get(FIELD_A).unwrap();
45
+ let cuteness = memo.get(FIELD_B).unwrap();
46
+ for payload in [catname, cuteness] {
47
+ assert_eq!(
48
+ &b"json/plain".to_vec(),
49
+ payload.metadata.get("encoding").unwrap()
50
+ );
51
+ }
52
+ assert_eq!("enchi", String::from_json_payload(catname).unwrap());
53
+ assert_eq!(9001, usize::from_json_payload(cuteness).unwrap());
54
+ }
@@ -2,7 +2,7 @@ use std::{
2
2
  sync::atomic::{AtomicBool, Ordering},
3
3
  time::Duration,
4
4
  };
5
- use temporal_client::WorkflowOptions;
5
+
6
6
  use temporal_sdk::{WfContext, WorkflowResult};
7
7
  use temporal_sdk_core_test_utils::CoreWfStarter;
8
8
 
@@ -27,18 +27,11 @@ pub async fn changes_wf(ctx: WfContext) -> WorkflowResult<()> {
27
27
  async fn writes_change_markers() {
28
28
  let wf_name = "writes_change_markers";
29
29
  let mut starter = CoreWfStarter::new(wf_name);
30
+ starter.no_remote_activities();
30
31
  let mut worker = starter.worker().await;
31
32
  worker.register_wf(wf_name.to_owned(), changes_wf);
32
33
 
33
- worker
34
- .submit_wf(
35
- wf_name.to_owned(),
36
- wf_name.to_owned(),
37
- vec![],
38
- WorkflowOptions::default(),
39
- )
40
- .await
41
- .unwrap();
34
+ starter.start_with_worker(wf_name, &mut worker).await;
42
35
  worker.run_until_done().await.unwrap();
43
36
  }
44
37
 
@@ -67,18 +60,11 @@ pub async fn no_change_then_change_wf(ctx: WfContext) -> WorkflowResult<()> {
67
60
  async fn can_add_change_markers() {
68
61
  let wf_name = "can_add_change_markers";
69
62
  let mut starter = CoreWfStarter::new(wf_name);
63
+ starter.no_remote_activities();
70
64
  let mut worker = starter.worker().await;
71
65
  worker.register_wf(wf_name.to_owned(), no_change_then_change_wf);
72
66
 
73
- worker
74
- .submit_wf(
75
- wf_name.to_owned(),
76
- wf_name.to_owned(),
77
- vec![],
78
- WorkflowOptions::default(),
79
- )
80
- .await
81
- .unwrap();
67
+ starter.start_with_worker(wf_name, &mut worker).await;
82
68
  worker.run_until_done().await.unwrap();
83
69
  }
84
70
 
@@ -97,17 +83,10 @@ pub async fn replay_with_change_marker_wf(ctx: WfContext) -> WorkflowResult<()>
97
83
  async fn replaying_with_patch_marker() {
98
84
  let wf_name = "replaying_with_patch_marker";
99
85
  let mut starter = CoreWfStarter::new(wf_name);
86
+ starter.no_remote_activities();
100
87
  let mut worker = starter.worker().await;
101
88
  worker.register_wf(wf_name.to_owned(), replay_with_change_marker_wf);
102
89
 
103
- worker
104
- .submit_wf(
105
- wf_name.to_owned(),
106
- wf_name.to_owned(),
107
- vec![],
108
- WorkflowOptions::default(),
109
- )
110
- .await
111
- .unwrap();
90
+ starter.start_with_worker(wf_name, &mut worker).await;
112
91
  worker.run_until_done().await.unwrap();
113
92
  }