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
@@ -12,7 +12,10 @@ mod history_info;
12
12
  mod task_token;
13
13
 
14
14
  #[cfg(feature = "history_builders")]
15
- pub use history_builder::{default_wes_attribs, TestHistoryBuilder, DEFAULT_WORKFLOW_TYPE};
15
+ pub use history_builder::{
16
+ default_act_sched, default_wes_attribs, TestHistoryBuilder, DEFAULT_ACTIVITY_TYPE,
17
+ DEFAULT_WORKFLOW_TYPE,
18
+ };
16
19
  #[cfg(feature = "history_builders")]
17
20
  pub use history_info::HistoryInfo;
18
21
  pub use task_token::TaskToken;
@@ -26,7 +29,8 @@ pub mod coresdk {
26
29
  tonic::include_proto!("coresdk");
27
30
 
28
31
  use crate::temporal::api::{
29
- common::v1::{ActivityType, Payload, Payloads, WorkflowExecution},
32
+ common::v1::{Payload, Payloads, WorkflowExecution},
33
+ enums::v1::WorkflowTaskFailedCause,
30
34
  failure::v1::{failure::FailureInfo, ApplicationFailureInfo, Failure},
31
35
  workflowservice::v1::PollActivityTaskQueueResponse,
32
36
  };
@@ -66,8 +70,8 @@ pub mod coresdk {
66
70
  "ActivityTaskCompletion(token: {}",
67
71
  fmt_tt(&self.task_token),
68
72
  )?;
69
- if let Some(r) = self.result.as_ref() {
70
- write!(f, ", {}", r)?;
73
+ if let Some(r) = self.result.as_ref().and_then(|r| r.status.as_ref()) {
74
+ write!(f, ", {r}")?;
71
75
  } else {
72
76
  write!(f, ", missing result")?;
73
77
  }
@@ -120,21 +124,20 @@ pub mod coresdk {
120
124
  }
121
125
  }
122
126
 
123
- impl Display for ActivityExecutionResult {
127
+ impl Display for aer::Status {
124
128
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
125
129
  write!(f, "ActivityExecutionResult(")?;
126
- match self.status.as_ref() {
127
- None => write!(f, "missing result)"),
128
- Some(aer::Status::Completed(v)) => {
129
- write!(f, "{})", v)
130
+ match self {
131
+ aer::Status::Completed(v) => {
132
+ write!(f, "{v})")
130
133
  }
131
- Some(aer::Status::Failed(v)) => {
132
- write!(f, "{})", v)
134
+ aer::Status::Failed(v) => {
135
+ write!(f, "{v})")
133
136
  }
134
- Some(aer::Status::Cancelled(v)) => {
135
- write!(f, "{})", v)
137
+ aer::Status::Cancelled(v) => {
138
+ write!(f, "{v})")
136
139
  }
137
- Some(aer::Status::WillCompleteAsync(_)) => {
140
+ aer::Status::WillCompleteAsync(_) => {
138
141
  write!(f, "Will complete async)")
139
142
  }
140
143
  }
@@ -145,7 +148,7 @@ pub mod coresdk {
145
148
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
146
149
  write!(f, "Success(")?;
147
150
  if let Some(ref v) = self.result {
148
- write!(f, "{}", v)?;
151
+ write!(f, "{v}")?;
149
152
  }
150
153
  write!(f, ")")
151
154
  }
@@ -155,7 +158,7 @@ pub mod coresdk {
155
158
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
156
159
  write!(f, "Failure(")?;
157
160
  if let Some(ref v) = self.failure {
158
- write!(f, "{}", v)?;
161
+ write!(f, "{v}")?;
159
162
  }
160
163
  write!(f, ")")
161
164
  }
@@ -165,7 +168,7 @@ pub mod coresdk {
165
168
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
166
169
  write!(f, "Cancellation(")?;
167
170
  if let Some(ref v) = self.failure {
168
- write!(f, "{}", v)?;
171
+ write!(f, "{v}")?;
169
172
  }
170
173
  write!(f, ")")
171
174
  }
@@ -186,7 +189,7 @@ pub mod coresdk {
186
189
  pub fn unwrap_ok_payload(self) -> Payload {
187
190
  match self.status.unwrap() {
188
191
  activity_resolution::Status::Completed(c) => c.result.unwrap(),
189
- _ => panic!("Activity was not successful"),
192
+ e => panic!("Activity was not successful: {e:?}"),
190
193
  }
191
194
  }
192
195
 
@@ -198,11 +201,15 @@ pub mod coresdk {
198
201
  matches!(self.status, Some(activity_resolution::Status::Failed(_)))
199
202
  }
200
203
 
201
- pub fn timed_out(&self) -> bool {
202
- matches!(self.status, Some(activity_resolution::Status::Failed(Failure {
203
- failure: Some(ref f)
204
- })) if f.is_timeout()
205
- || f.cause.as_ref().map(|c| c.is_timeout()).unwrap_or_default())
204
+ pub fn timed_out(&self) -> Option<crate::temporal::api::enums::v1::TimeoutType> {
205
+ match self.status {
206
+ Some(activity_resolution::Status::Failed(Failure {
207
+ failure: Some(ref f),
208
+ })) => f
209
+ .is_timeout()
210
+ .or_else(|| f.cause.as_ref().and_then(|c| c.is_timeout())),
211
+ _ => None,
212
+ }
206
213
  }
207
214
 
208
215
  pub fn cancelled(&self) -> bool {
@@ -244,10 +251,6 @@ pub mod coresdk {
244
251
  }
245
252
  }
246
253
 
247
- pub mod bridge {
248
- tonic::include_proto!("coresdk.bridge");
249
- }
250
-
251
254
  pub mod common {
252
255
  tonic::include_proto!("coresdk.common");
253
256
  use super::external_data::LocalActivityMarkerData;
@@ -318,7 +321,7 @@ pub mod coresdk {
318
321
  }
319
322
 
320
323
  pub mod external_data {
321
- use prost_types::{Duration, Timestamp};
324
+ use prost_wkt_types::{Duration, Timestamp};
322
325
  use serde::{Deserialize, Deserializer, Serialize, Serializer};
323
326
  tonic::include_proto!("coresdk.external_data");
324
327
 
@@ -397,6 +400,7 @@ pub mod coresdk {
397
400
  },
398
401
  temporal::api::{
399
402
  common::v1::Header,
403
+ enums::v1::WorkflowTaskFailedCause,
400
404
  history::v1::{
401
405
  WorkflowExecutionCancelRequestedEventAttributes,
402
406
  WorkflowExecutionSignaledEventAttributes,
@@ -405,6 +409,7 @@ pub mod coresdk {
405
409
  query::v1::WorkflowQuery,
406
410
  },
407
411
  };
412
+ use prost_wkt_types::Timestamp;
408
413
  use std::{
409
414
  collections::HashMap,
410
415
  fmt::{Display, Formatter},
@@ -428,6 +433,7 @@ pub mod coresdk {
428
433
  reason: reason as i32,
429
434
  }),
430
435
  )],
436
+ available_internal_flags: vec![],
431
437
  }
432
438
  }
433
439
 
@@ -491,7 +497,18 @@ pub mod coresdk {
491
497
 
492
498
  impl Display for EvictionReason {
493
499
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
494
- write!(f, "{:?}", self)
500
+ write!(f, "{self:?}")
501
+ }
502
+ }
503
+
504
+ impl From<EvictionReason> for WorkflowTaskFailedCause {
505
+ fn from(value: EvictionReason) -> Self {
506
+ match value {
507
+ EvictionReason::Nondeterminism => {
508
+ WorkflowTaskFailedCause::NonDeterministicError
509
+ }
510
+ _ => WorkflowTaskFailedCause::Unspecified,
511
+ }
495
512
  }
496
513
  }
497
514
 
@@ -517,7 +534,7 @@ pub mod coresdk {
517
534
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
518
535
  match &self.variant {
519
536
  None => write!(f, "empty"),
520
- Some(v) => write!(f, "{}", v),
537
+ Some(v) => write!(f, "{v}"),
521
538
  }
522
539
  }
523
540
  }
@@ -600,6 +617,7 @@ pub mod coresdk {
600
617
  attrs: WorkflowExecutionStartedEventAttributes,
601
618
  workflow_id: String,
602
619
  randomness_seed: u64,
620
+ start_time: Timestamp,
603
621
  ) -> StartWorkflow {
604
622
  StartWorkflow {
605
623
  workflow_type: attrs.workflow_type.map(|wt| wt.name).unwrap_or_default(),
@@ -633,12 +651,13 @@ pub mod coresdk {
633
651
  cron_schedule_to_schedule_interval: attrs.first_workflow_task_backoff,
634
652
  memo: attrs.memo,
635
653
  search_attributes: attrs.search_attributes,
654
+ start_time: Some(start_time),
636
655
  }
637
656
  }
638
657
  }
639
658
 
640
659
  pub mod workflow_completion {
641
- use crate::temporal::api::failure;
660
+ use crate::temporal::api::{enums::v1::WorkflowTaskFailedCause, failure};
642
661
  tonic::include_proto!("coresdk.workflow_completion");
643
662
 
644
663
  impl workflow_activation_completion::Status {
@@ -652,7 +671,10 @@ pub mod coresdk {
652
671
 
653
672
  impl From<failure::v1::Failure> for Failure {
654
673
  fn from(f: failure::v1::Failure) -> Self {
655
- Failure { failure: Some(f) }
674
+ Failure {
675
+ failure: Some(f),
676
+ force_cause: WorkflowTaskFailedCause::Unspecified as i32,
677
+ }
656
678
  }
657
679
  }
658
680
  }
@@ -671,7 +693,7 @@ pub mod coresdk {
671
693
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
672
694
  match &self.variant {
673
695
  None => write!(f, "Empty"),
674
- Some(v) => write!(f, "{}", v),
696
+ Some(v) => write!(f, "{v}"),
675
697
  }
676
698
  }
677
699
  }
@@ -800,6 +822,16 @@ pub mod coresdk {
800
822
  }
801
823
  }
802
824
 
825
+ impl Display for ModifyWorkflowProperties {
826
+ fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
827
+ write!(
828
+ f,
829
+ "ModifyWorkflowProperties(upserted memo keys: {:?})",
830
+ self.upserted_memo.as_ref().map(|m| m.fields.keys())
831
+ )
832
+ }
833
+ }
834
+
803
835
  impl QueryResult {
804
836
  /// Helper to construct the Temporal API query result types.
805
837
  pub fn into_components(self) -> (String, QueryResultType, Option<Payloads>, String) {
@@ -841,7 +873,10 @@ pub mod coresdk {
841
873
 
842
874
  impl From<Vec<WorkflowCommand>> for workflow_completion::Success {
843
875
  fn from(v: Vec<WorkflowCommand>) -> Self {
844
- Self { commands: v }
876
+ Self {
877
+ commands: v,
878
+ used_internal_flags: vec![],
879
+ }
845
880
  }
846
881
  }
847
882
 
@@ -895,6 +930,7 @@ pub mod coresdk {
895
930
  status: Some(workflow_activation_completion::Status::Failed(
896
931
  workflow_completion::Failure {
897
932
  failure: Some(failure),
933
+ force_cause: WorkflowTaskFailedCause::Unspecified as i32,
898
934
  },
899
935
  )),
900
936
  }
@@ -978,6 +1014,12 @@ pub mod coresdk {
978
1014
  }
979
1015
  false
980
1016
  }
1017
+
1018
+ pub fn add_internal_flags(&mut self, patch: u32) {
1019
+ if let Some(workflow_activation_completion::Status::Successful(s)) = &mut self.status {
1020
+ s.used_internal_flags.push(patch);
1021
+ }
1022
+ }
981
1023
  }
982
1024
 
983
1025
  /// Makes converting outgoing lang commands into [WorkflowActivationCompletion]s easier
@@ -1015,7 +1057,7 @@ pub mod coresdk {
1015
1057
  )?;
1016
1058
  match &self.status {
1017
1059
  None => write!(f, "empty")?,
1018
- Some(s) => write!(f, "{}", s)?,
1060
+ Some(s) => write!(f, "{s}")?,
1019
1061
  };
1020
1062
  write!(f, ")")
1021
1063
  }
@@ -1025,12 +1067,12 @@ pub mod coresdk {
1025
1067
  fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
1026
1068
  match self {
1027
1069
  workflow_activation_completion::Status::Successful(
1028
- workflow_completion::Success { commands },
1070
+ workflow_completion::Success { commands, .. },
1029
1071
  ) => {
1030
1072
  write!(f, "Success(")?;
1031
1073
  let mut written = 0;
1032
1074
  for c in commands {
1033
- write!(f, "{} ", c)?;
1075
+ write!(f, "{c} ")?;
1034
1076
  written += 1;
1035
1077
  if written >= 10 && written < commands.len() {
1036
1078
  write!(f, "... {} more", commands.len() - written)?;
@@ -1082,21 +1124,12 @@ pub mod coresdk {
1082
1124
  }
1083
1125
  }
1084
1126
 
1085
- impl From<String> for ActivityType {
1086
- fn from(name: String) -> Self {
1087
- Self { name }
1088
- }
1089
- }
1090
-
1091
- impl From<ActivityType> for String {
1092
- fn from(at: ActivityType) -> Self {
1093
- at.name
1094
- }
1095
- }
1096
-
1097
1127
  impl Failure {
1098
- pub fn is_timeout(&self) -> bool {
1099
- matches!(self.failure_info, Some(FailureInfo::TimeoutFailureInfo(_)))
1128
+ pub fn is_timeout(&self) -> Option<crate::temporal::api::enums::v1::TimeoutType> {
1129
+ match &self.failure_info {
1130
+ Some(FailureInfo::TimeoutFailureInfo(ti)) => Some(ti.timeout_type()),
1131
+ _ => None,
1132
+ }
1100
1133
  }
1101
1134
 
1102
1135
  pub fn application_failure(message: String, non_retryable: bool) -> Self {
@@ -1112,6 +1145,26 @@ pub mod coresdk {
1112
1145
  }
1113
1146
  }
1114
1147
 
1148
+ pub fn application_failure_from_error(ae: anyhow::Error, non_retryable: bool) -> Self {
1149
+ Self {
1150
+ failure_info: Some(FailureInfo::ApplicationFailureInfo(
1151
+ ApplicationFailureInfo {
1152
+ non_retryable,
1153
+ ..Default::default()
1154
+ },
1155
+ )),
1156
+ ..ae.chain()
1157
+ .rfold(None, |cause, e| {
1158
+ Some(Self {
1159
+ message: e.to_string(),
1160
+ cause: cause.map(Box::new),
1161
+ ..Default::default()
1162
+ })
1163
+ })
1164
+ .unwrap_or_default()
1165
+ }
1166
+ }
1167
+
1115
1168
  /// Extracts an ApplicationFailureInfo from a Failure instance if it exists
1116
1169
  pub fn maybe_application_failure(&self) -> Option<&ApplicationFailureInfo> {
1117
1170
  if let Failure {
@@ -1182,7 +1235,7 @@ pub mod coresdk {
1182
1235
 
1183
1236
  impl From<anyhow::Error> for Failure {
1184
1237
  fn from(ae: anyhow::Error) -> Self {
1185
- Failure::application_failure(ae.to_string(), false)
1238
+ Failure::application_failure_from_error(ae, false)
1186
1239
  }
1187
1240
  }
1188
1241
 
@@ -1320,11 +1373,6 @@ pub mod coresdk {
1320
1373
  // This is disgusting, but unclear to me how to avoid it. TODO: Discuss w/ prost maintainer
1321
1374
  pub mod temporal {
1322
1375
  pub mod api {
1323
- pub mod cluster {
1324
- pub mod v1 {
1325
- tonic::include_proto!("temporal.api.cluster.v1");
1326
- }
1327
- }
1328
1376
  pub mod batch {
1329
1377
  pub mod v1 {
1330
1378
  tonic::include_proto!("temporal.api.batch.v1");
@@ -1414,6 +1462,16 @@ pub mod temporal {
1414
1462
  }
1415
1463
  }
1416
1464
 
1465
+ impl From<workflow_commands::ModifyWorkflowProperties> for command::Attributes {
1466
+ fn from(s: workflow_commands::ModifyWorkflowProperties) -> Self {
1467
+ Self::ModifyWorkflowPropertiesCommandAttributes(
1468
+ ModifyWorkflowPropertiesCommandAttributes {
1469
+ upserted_memo: s.upserted_memo.map(Into::into),
1470
+ },
1471
+ )
1472
+ }
1473
+ }
1474
+
1417
1475
  impl From<workflow_commands::CancelTimer> for command::Attributes {
1418
1476
  fn from(s: workflow_commands::CancelTimer) -> Self {
1419
1477
  Self::CancelTimerCommandAttributes(CancelTimerCommandAttributes {
@@ -1533,6 +1591,7 @@ pub mod temporal {
1533
1591
  }
1534
1592
  pub mod common {
1535
1593
  pub mod v1 {
1594
+ use base64::{prelude::BASE64_STANDARD, Engine};
1536
1595
  use std::{
1537
1596
  collections::HashMap,
1538
1597
  fmt::{Display, Formatter},
@@ -1569,11 +1628,11 @@ pub mod temporal {
1569
1628
  write!(
1570
1629
  f,
1571
1630
  "[{}..{}]",
1572
- base64::encode(windows.next().unwrap_or_default()),
1573
- base64::encode(windows.next_back().unwrap_or_default())
1631
+ BASE64_STANDARD.encode(windows.next().unwrap_or_default()),
1632
+ BASE64_STANDARD.encode(windows.next_back().unwrap_or_default())
1574
1633
  )
1575
1634
  } else {
1576
- write!(f, "[{}]", base64::encode(&self.data))
1635
+ write!(f, "[{}]", BASE64_STANDARD.encode(&self.data))
1577
1636
  }
1578
1637
  }
1579
1638
  }
@@ -1617,6 +1676,26 @@ pub mod temporal {
1617
1676
  }
1618
1677
  }
1619
1678
  }
1679
+
1680
+ impl From<String> for ActivityType {
1681
+ fn from(name: String) -> Self {
1682
+ Self { name }
1683
+ }
1684
+ }
1685
+
1686
+ impl From<&str> for ActivityType {
1687
+ fn from(name: &str) -> Self {
1688
+ Self {
1689
+ name: name.to_string(),
1690
+ }
1691
+ }
1692
+ }
1693
+
1694
+ impl From<ActivityType> for String {
1695
+ fn from(at: ActivityType) -> Self {
1696
+ at.name
1697
+ }
1698
+ }
1620
1699
  }
1621
1700
  }
1622
1701
  pub mod enums {
@@ -1647,14 +1726,7 @@ pub mod temporal {
1647
1726
 
1648
1727
  impl History {
1649
1728
  pub fn extract_run_id_from_start(&self) -> Result<&str, anyhow::Error> {
1650
- if let Some(
1651
- history_event::Attributes::WorkflowExecutionStartedEventAttributes(wes),
1652
- ) = self.events.get(0).and_then(|x| x.attributes.as_ref())
1653
- {
1654
- Ok(&wes.original_execution_run_id)
1655
- } else {
1656
- bail!("First event is not WorkflowExecutionStarted?!?")
1657
- }
1729
+ extract_original_run_id_from_events(&self.events)
1658
1730
  }
1659
1731
 
1660
1732
  /// Returns the event id of the final event in the history. Will return 0 if
@@ -1664,6 +1736,18 @@ pub mod temporal {
1664
1736
  }
1665
1737
  }
1666
1738
 
1739
+ pub fn extract_original_run_id_from_events(
1740
+ events: &[HistoryEvent],
1741
+ ) -> Result<&str, anyhow::Error> {
1742
+ if let Some(Attributes::WorkflowExecutionStartedEventAttributes(wes)) =
1743
+ events.get(0).and_then(|x| x.attributes.as_ref())
1744
+ {
1745
+ Ok(&wes.original_execution_run_id)
1746
+ } else {
1747
+ bail!("First event is not WorkflowExecutionStarted?!?")
1748
+ }
1749
+ }
1750
+
1667
1751
  impl HistoryEvent {
1668
1752
  /// Returns true if this is an event created to mirror a command
1669
1753
  pub fn is_command_event(&self) -> bool {
@@ -1677,6 +1761,7 @@ pub mod temporal {
1677
1761
  | EventType::TimerCanceled
1678
1762
  | EventType::TimerStarted
1679
1763
  | EventType::UpsertWorkflowSearchAttributes
1764
+ | EventType::WorkflowPropertiesModified
1680
1765
  | EventType::WorkflowExecutionCanceled
1681
1766
  | EventType::WorkflowExecutionCompleted
1682
1767
  | EventType::WorkflowExecutionContinuedAsNew
@@ -1735,6 +1820,15 @@ pub mod temporal {
1735
1820
  _ => false,
1736
1821
  }
1737
1822
  }
1823
+
1824
+ pub fn is_wft_closed_event(&self) -> bool {
1825
+ match self.event_type() {
1826
+ EventType::WorkflowTaskCompleted => true,
1827
+ EventType::WorkflowTaskFailed => true,
1828
+ EventType::WorkflowTaskTimedOut => true,
1829
+ _ => false,
1830
+ }
1831
+ }
1738
1832
  }
1739
1833
 
1740
1834
  impl Display for HistoryEvent {
@@ -1747,6 +1841,60 @@ pub mod temporal {
1747
1841
  )
1748
1842
  }
1749
1843
  }
1844
+
1845
+ impl Attributes {
1846
+ pub fn event_type(&self) -> EventType {
1847
+ // I just absolutely _love_ this
1848
+ match self {
1849
+ Attributes::WorkflowExecutionStartedEventAttributes(_) => {EventType::WorkflowExecutionStarted}
1850
+ Attributes::WorkflowExecutionCompletedEventAttributes(_) => {EventType::WorkflowExecutionCompleted}
1851
+ Attributes::WorkflowExecutionFailedEventAttributes(_) => {EventType::WorkflowExecutionFailed}
1852
+ Attributes::WorkflowExecutionTimedOutEventAttributes(_) => {EventType::WorkflowExecutionTimedOut}
1853
+ Attributes::WorkflowTaskScheduledEventAttributes(_) => {EventType::WorkflowTaskScheduled}
1854
+ Attributes::WorkflowTaskStartedEventAttributes(_) => {EventType::WorkflowTaskStarted}
1855
+ Attributes::WorkflowTaskCompletedEventAttributes(_) => {EventType::WorkflowTaskCompleted}
1856
+ Attributes::WorkflowTaskTimedOutEventAttributes(_) => {EventType::WorkflowTaskTimedOut}
1857
+ Attributes::WorkflowTaskFailedEventAttributes(_) => {EventType::WorkflowTaskFailed}
1858
+ Attributes::ActivityTaskScheduledEventAttributes(_) => {EventType::ActivityTaskScheduled}
1859
+ Attributes::ActivityTaskStartedEventAttributes(_) => {EventType::ActivityTaskStarted}
1860
+ Attributes::ActivityTaskCompletedEventAttributes(_) => {EventType::ActivityTaskCompleted}
1861
+ Attributes::ActivityTaskFailedEventAttributes(_) => {EventType::ActivityTaskFailed}
1862
+ Attributes::ActivityTaskTimedOutEventAttributes(_) => {EventType::ActivityTaskTimedOut}
1863
+ Attributes::TimerStartedEventAttributes(_) => {EventType::TimerStarted}
1864
+ Attributes::TimerFiredEventAttributes(_) => {EventType::TimerFired}
1865
+ Attributes::ActivityTaskCancelRequestedEventAttributes(_) => {EventType::ActivityTaskCancelRequested}
1866
+ Attributes::ActivityTaskCanceledEventAttributes(_) => {EventType::ActivityTaskCanceled}
1867
+ Attributes::TimerCanceledEventAttributes(_) => {EventType::TimerCanceled}
1868
+ Attributes::MarkerRecordedEventAttributes(_) => {EventType::MarkerRecorded}
1869
+ Attributes::WorkflowExecutionSignaledEventAttributes(_) => {EventType::WorkflowExecutionSignaled}
1870
+ Attributes::WorkflowExecutionTerminatedEventAttributes(_) => {EventType::WorkflowExecutionTerminated}
1871
+ Attributes::WorkflowExecutionCancelRequestedEventAttributes(_) => {EventType::WorkflowExecutionCancelRequested}
1872
+ Attributes::WorkflowExecutionCanceledEventAttributes(_) => {EventType::WorkflowExecutionCanceled}
1873
+ Attributes::RequestCancelExternalWorkflowExecutionInitiatedEventAttributes(_) => {EventType::RequestCancelExternalWorkflowExecutionInitiated}
1874
+ Attributes::RequestCancelExternalWorkflowExecutionFailedEventAttributes(_) => {EventType::RequestCancelExternalWorkflowExecutionFailed}
1875
+ Attributes::ExternalWorkflowExecutionCancelRequestedEventAttributes(_) => {EventType::ExternalWorkflowExecutionCancelRequested}
1876
+ Attributes::WorkflowExecutionContinuedAsNewEventAttributes(_) => {EventType::WorkflowExecutionContinuedAsNew}
1877
+ Attributes::StartChildWorkflowExecutionInitiatedEventAttributes(_) => {EventType::StartChildWorkflowExecutionInitiated}
1878
+ Attributes::StartChildWorkflowExecutionFailedEventAttributes(_) => {EventType::StartChildWorkflowExecutionFailed}
1879
+ Attributes::ChildWorkflowExecutionStartedEventAttributes(_) => {EventType::ChildWorkflowExecutionStarted}
1880
+ Attributes::ChildWorkflowExecutionCompletedEventAttributes(_) => {EventType::ChildWorkflowExecutionCompleted}
1881
+ Attributes::ChildWorkflowExecutionFailedEventAttributes(_) => {EventType::ChildWorkflowExecutionFailed}
1882
+ Attributes::ChildWorkflowExecutionCanceledEventAttributes(_) => {EventType::ChildWorkflowExecutionCanceled}
1883
+ Attributes::ChildWorkflowExecutionTimedOutEventAttributes(_) => {EventType::ChildWorkflowExecutionTimedOut}
1884
+ Attributes::ChildWorkflowExecutionTerminatedEventAttributes(_) => {EventType::ChildWorkflowExecutionTerminated}
1885
+ Attributes::SignalExternalWorkflowExecutionInitiatedEventAttributes(_) => {EventType::SignalExternalWorkflowExecutionInitiated}
1886
+ Attributes::SignalExternalWorkflowExecutionFailedEventAttributes(_) => {EventType::SignalExternalWorkflowExecutionFailed}
1887
+ Attributes::ExternalWorkflowExecutionSignaledEventAttributes(_) => {EventType::ExternalWorkflowExecutionSignaled}
1888
+ Attributes::UpsertWorkflowSearchAttributesEventAttributes(_) => {EventType::UpsertWorkflowSearchAttributes}
1889
+ Attributes::WorkflowExecutionUpdateRejectedEventAttributes(_) => {EventType::WorkflowExecutionUpdateRejected}
1890
+ Attributes::WorkflowExecutionUpdateAcceptedEventAttributes(_) => {EventType::WorkflowExecutionUpdateAccepted}
1891
+ Attributes::WorkflowExecutionUpdateCompletedEventAttributes(_) => {EventType::WorkflowExecutionUpdateCompleted}
1892
+ Attributes::WorkflowPropertiesModifiedExternallyEventAttributes(_) => {EventType::WorkflowPropertiesModifiedExternally}
1893
+ Attributes::ActivityPropertiesModifiedExternallyEventAttributes(_) => {EventType::ActivityPropertiesModifiedExternally}
1894
+ Attributes::WorkflowPropertiesModifiedEventAttributes(_) => {EventType::WorkflowPropertiesModified}
1895
+ }
1896
+ }
1897
+ }
1750
1898
  }
1751
1899
  }
1752
1900
  pub mod namespace {
@@ -1759,6 +1907,11 @@ pub mod temporal {
1759
1907
  tonic::include_proto!("temporal.api.operatorservice.v1");
1760
1908
  }
1761
1909
  }
1910
+ pub mod protocol {
1911
+ pub mod v1 {
1912
+ tonic::include_proto!("temporal.api.protocol.v1");
1913
+ }
1914
+ }
1762
1915
  pub mod query {
1763
1916
  pub mod v1 {
1764
1917
  tonic::include_proto!("temporal.api.query.v1");
@@ -1774,6 +1927,11 @@ pub mod temporal {
1774
1927
  tonic::include_proto!("temporal.api.schedule.v1");
1775
1928
  }
1776
1929
  }
1930
+ pub mod sdk {
1931
+ pub mod v1 {
1932
+ tonic::include_proto!("temporal.api.sdk.v1");
1933
+ }
1934
+ }
1777
1935
  pub mod taskqueue {
1778
1936
  pub mod v1 {
1779
1937
  use crate::temporal::api::enums::v1::TaskQueueKind;
@@ -1820,12 +1978,12 @@ pub mod temporal {
1820
1978
  tonic::include_proto!("temporal.api.workflowservice.v1");
1821
1979
 
1822
1980
  macro_rules! sched_to_start_impl {
1823
- () => {
1824
- /// Return the duration of the task schedule time to its start time if both
1825
- /// are set and time went forward.
1981
+ ($sched_field:ident) => {
1982
+ /// Return the duration of the task schedule time (current attempt) to its
1983
+ /// start time if both are set and time went forward.
1826
1984
  pub fn sched_to_start(&self) -> Option<Duration> {
1827
1985
  if let Some((sch, st)) =
1828
- self.scheduled_time.clone().zip(self.started_time.clone())
1986
+ self.$sched_field.clone().zip(self.started_time.clone())
1829
1987
  {
1830
1988
  let sch: Result<SystemTime, _> = sch.try_into();
1831
1989
  let st: Result<SystemTime, _> = st.try_into();
@@ -1839,7 +1997,7 @@ pub mod temporal {
1839
1997
  }
1840
1998
 
1841
1999
  impl PollWorkflowTaskQueueResponse {
1842
- sched_to_start_impl!();
2000
+ sched_to_start_impl!(scheduled_time);
1843
2001
  }
1844
2002
 
1845
2003
  impl Display for PollWorkflowTaskQueueResponse {
@@ -1881,7 +2039,7 @@ pub mod temporal {
1881
2039
  }
1882
2040
 
1883
2041
  impl PollActivityTaskQueueResponse {
1884
- sched_to_start_impl!();
2042
+ sched_to_start_impl!(current_attempt_scheduled_time);
1885
2043
  }
1886
2044
 
1887
2045
  impl QueryWorkflowResponse {
@@ -1908,3 +2066,23 @@ pub mod grpc {
1908
2066
  }
1909
2067
  }
1910
2068
  }
2069
+
2070
+ #[cfg(test)]
2071
+ mod tests {
2072
+ use crate::temporal::api::failure::v1::Failure;
2073
+ use anyhow::anyhow;
2074
+
2075
+ #[test]
2076
+ fn anyhow_to_failure_conversion() {
2077
+ let no_causes: Failure = anyhow!("no causes").into();
2078
+ assert_eq!(no_causes.cause, None);
2079
+ assert_eq!(no_causes.message, "no causes");
2080
+ let orig = anyhow!("fail 1");
2081
+ let mid = orig.context("fail 2");
2082
+ let top = mid.context("fail 3");
2083
+ let as_fail: Failure = top.into();
2084
+ assert_eq!(as_fail.message, "fail 3");
2085
+ assert_eq!(as_fail.cause.as_ref().unwrap().message, "fail 2");
2086
+ assert_eq!(as_fail.cause.unwrap().cause.unwrap().message, "fail 1");
2087
+ }
2088
+ }
@@ -1,8 +1,18 @@
1
+ use base64::{prelude::BASE64_STANDARD, Engine};
1
2
  use std::fmt::{Debug, Display, Formatter};
2
3
 
3
4
  static LOCAL_ACT_TASK_TOKEN_PREFIX: &[u8] = b"local_act_";
4
5
 
5
- #[derive(Hash, Eq, PartialEq, Clone, derive_more::From, derive_more::Into)]
6
+ #[derive(
7
+ Hash,
8
+ Eq,
9
+ PartialEq,
10
+ Clone,
11
+ derive_more::From,
12
+ derive_more::Into,
13
+ serde::Serialize,
14
+ serde::Deserialize,
15
+ )]
6
16
  /// Type-safe wrapper for task token bytes
7
17
  pub struct TaskToken(pub Vec<u8>);
8
18
 
@@ -34,5 +44,5 @@ impl Debug for TaskToken {
34
44
  }
35
45
 
36
46
  pub fn fmt_tt(tt: &[u8]) -> String {
37
- base64::encode(tt)
47
+ BASE64_STANDARD.encode(tt)
38
48
  }