temporalio 0.0.0 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (327) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +301 -0
  3. data/bridge/Cargo.lock +2888 -0
  4. data/bridge/Cargo.toml +27 -0
  5. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  6. data/bridge/sdk-core/Cargo.lock +2606 -0
  7. data/bridge/sdk-core/Cargo.toml +2 -0
  8. data/bridge/sdk-core/LICENSE.txt +23 -0
  9. data/bridge/sdk-core/README.md +104 -0
  10. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  11. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  13. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  14. data/bridge/sdk-core/client/Cargo.toml +40 -0
  15. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  16. data/bridge/sdk-core/client/src/lib.rs +1286 -0
  17. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  18. data/bridge/sdk-core/client/src/raw.rs +932 -0
  19. data/bridge/sdk-core/client/src/retry.rs +751 -0
  20. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  21. data/bridge/sdk-core/core/Cargo.toml +116 -0
  22. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  23. data/bridge/sdk-core/core/benches/workflow_replay.rs +76 -0
  24. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  25. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +1014 -0
  26. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  27. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  28. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +925 -0
  29. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  30. data/bridge/sdk-core/core/src/core_tests/queries.rs +894 -0
  31. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  32. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  33. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  34. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2090 -0
  35. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  36. data/bridge/sdk-core/core/src/lib.rs +282 -0
  37. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  38. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  39. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  40. data/bridge/sdk-core/core/src/replay/mod.rs +215 -0
  41. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  42. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  43. data/bridge/sdk-core/core/src/telemetry/metrics.rs +428 -0
  44. data/bridge/sdk-core/core/src/telemetry/mod.rs +407 -0
  45. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +78 -0
  46. data/bridge/sdk-core/core/src/test_help/mod.rs +889 -0
  47. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  48. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1048 -0
  49. data/bridge/sdk-core/core/src/worker/activities.rs +481 -0
  50. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  51. data/bridge/sdk-core/core/src/worker/client.rs +373 -0
  52. data/bridge/sdk-core/core/src/worker/mod.rs +570 -0
  53. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  54. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +101 -0
  55. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +532 -0
  56. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +907 -0
  57. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +294 -0
  58. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +167 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +858 -0
  60. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +136 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +157 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +129 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1450 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +316 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +708 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +439 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +435 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +175 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +242 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1200 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +272 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +655 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1200 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +985 -0
  80. data/bridge/sdk-core/core-api/Cargo.toml +32 -0
  81. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  82. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  83. data/bridge/sdk-core/core-api/src/lib.rs +109 -0
  84. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  85. data/bridge/sdk-core/core-api/src/worker.rs +148 -0
  86. data/bridge/sdk-core/etc/deps.svg +162 -0
  87. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  88. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  89. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  90. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  91. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  92. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  93. data/bridge/sdk-core/fsm/README.md +3 -0
  94. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  95. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  96. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  97. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  98. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  99. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  100. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  115. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  116. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  117. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  118. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  119. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  120. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  121. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  122. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  123. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  124. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  125. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  126. data/bridge/sdk-core/protos/api_upstream/buf.yaml +9 -0
  127. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  128. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  129. data/bridge/sdk-core/protos/api_upstream/build/tools.go +29 -0
  130. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  131. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  132. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +89 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +260 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +47 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +56 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +170 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +118 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/interaction_type.proto +39 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +40 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +758 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +121 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +80 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +379 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +146 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1168 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +415 -0
  164. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  165. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  166. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +263 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +304 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  174. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  175. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  176. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  179. data/bridge/sdk-core/rustfmt.toml +1 -0
  180. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  181. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  182. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  183. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  184. data/bridge/sdk-core/sdk/src/interceptors.rs +50 -0
  185. data/bridge/sdk-core/sdk/src/lib.rs +794 -0
  186. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  187. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  188. data/bridge/sdk-core/sdk/src/workflow_context.rs +694 -0
  189. data/bridge/sdk-core/sdk/src/workflow_future.rs +499 -0
  190. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  191. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  192. data/bridge/sdk-core/sdk-core-protos/build.rs +107 -0
  193. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  194. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +544 -0
  195. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  196. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1970 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  199. data/bridge/sdk-core/test-utils/Cargo.toml +36 -0
  200. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  201. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  202. data/bridge/sdk-core/test-utils/src/lib.rs +650 -0
  203. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  204. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  205. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +221 -0
  206. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  207. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +133 -0
  208. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  209. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  210. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  211. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  212. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +788 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +223 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +597 -0
  227. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  228. data/bridge/sdk-core/tests/main.rs +113 -0
  229. data/bridge/sdk-core/tests/runner.rs +93 -0
  230. data/bridge/src/connection.rs +186 -0
  231. data/bridge/src/lib.rs +239 -0
  232. data/bridge/src/runtime.rs +54 -0
  233. data/bridge/src/worker.rs +124 -0
  234. data/ext/Rakefile +9 -0
  235. data/lib/bridge.so +0 -0
  236. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  237. data/lib/gen/temporal/api/batch/v1/message_pb.rb +50 -0
  238. data/lib/gen/temporal/api/command/v1/message_pb.rb +174 -0
  239. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  240. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +33 -0
  241. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +39 -0
  242. data/lib/gen/temporal/api/enums/v1/common_pb.rb +42 -0
  243. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +68 -0
  244. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +77 -0
  245. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  246. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  247. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  248. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  249. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  250. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  251. data/lib/gen/temporal/api/enums/v1/update_pb.rb +23 -0
  252. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  253. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  254. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  255. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  256. data/lib/gen/temporal/api/history/v1/message_pb.rb +490 -0
  257. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  258. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  259. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +85 -0
  260. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  261. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  262. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  263. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +149 -0
  264. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  265. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  266. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +111 -0
  267. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +788 -0
  268. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  269. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  270. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  271. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  272. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  273. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  274. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  275. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  276. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +165 -0
  277. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +196 -0
  278. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  279. data/lib/temporalio/activity/context.rb +97 -0
  280. data/lib/temporalio/activity/info.rb +67 -0
  281. data/lib/temporalio/activity.rb +85 -0
  282. data/lib/temporalio/bridge/error.rb +8 -0
  283. data/lib/temporalio/bridge.rb +14 -0
  284. data/lib/temporalio/client/implementation.rb +340 -0
  285. data/lib/temporalio/client/workflow_handle.rb +243 -0
  286. data/lib/temporalio/client.rb +131 -0
  287. data/lib/temporalio/connection.rb +751 -0
  288. data/lib/temporalio/data_converter.rb +191 -0
  289. data/lib/temporalio/error/failure.rb +194 -0
  290. data/lib/temporalio/error/workflow_failure.rb +19 -0
  291. data/lib/temporalio/errors.rb +40 -0
  292. data/lib/temporalio/failure_converter/base.rb +26 -0
  293. data/lib/temporalio/failure_converter/basic.rb +319 -0
  294. data/lib/temporalio/failure_converter.rb +7 -0
  295. data/lib/temporalio/interceptor/chain.rb +28 -0
  296. data/lib/temporalio/interceptor/client.rb +123 -0
  297. data/lib/temporalio/payload_codec/base.rb +32 -0
  298. data/lib/temporalio/payload_converter/base.rb +24 -0
  299. data/lib/temporalio/payload_converter/bytes.rb +27 -0
  300. data/lib/temporalio/payload_converter/composite.rb +49 -0
  301. data/lib/temporalio/payload_converter/encoding_base.rb +35 -0
  302. data/lib/temporalio/payload_converter/json.rb +26 -0
  303. data/lib/temporalio/payload_converter/nil.rb +26 -0
  304. data/lib/temporalio/payload_converter.rb +14 -0
  305. data/lib/temporalio/retry_policy.rb +82 -0
  306. data/lib/temporalio/retry_state.rb +35 -0
  307. data/lib/temporalio/runtime.rb +25 -0
  308. data/lib/temporalio/timeout_type.rb +29 -0
  309. data/lib/temporalio/version.rb +3 -0
  310. data/lib/temporalio/worker/activity_runner.rb +92 -0
  311. data/lib/temporalio/worker/activity_worker.rb +138 -0
  312. data/lib/temporalio/worker/reactor.rb +46 -0
  313. data/lib/temporalio/worker/runner.rb +63 -0
  314. data/lib/temporalio/worker/sync_worker.rb +88 -0
  315. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  316. data/lib/temporalio/worker.rb +198 -0
  317. data/lib/temporalio/workflow/execution_info.rb +54 -0
  318. data/lib/temporalio/workflow/execution_status.rb +36 -0
  319. data/lib/temporalio/workflow/id_reuse_policy.rb +36 -0
  320. data/lib/temporalio/workflow/query_reject_condition.rb +33 -0
  321. data/lib/temporalio.rb +12 -1
  322. data/lib/thermite_patch.rb +23 -0
  323. data/temporalio.gemspec +45 -0
  324. metadata +566 -9
  325. data/lib/temporal/version.rb +0 -3
  326. data/lib/temporal.rb +0 -4
  327. data/temporal.gemspec +0 -20
@@ -0,0 +1,36 @@
1
+ use std::time::Duration;
2
+ use temporal_client::{RetryClient, WorkflowClientTrait, WorkflowService};
3
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::DescribeNamespaceRequest;
4
+ use temporal_sdk_core_test_utils::{get_integ_server_options, CoreWfStarter, NAMESPACE};
5
+
6
+ #[tokio::test]
7
+ async fn can_use_retry_client() {
8
+ // Not terribly interesting by itself but can be useful for manually inspecting metrics etc
9
+ let mut core = CoreWfStarter::new("retry_client");
10
+ let retry_client = core.get_client().await;
11
+ for _ in 0..10 {
12
+ retry_client.list_namespaces().await.unwrap();
13
+ tokio::time::sleep(Duration::from_millis(10)).await;
14
+ }
15
+ }
16
+
17
+ #[tokio::test]
18
+ async fn can_use_retry_raw_client() {
19
+ let opts = get_integ_server_options();
20
+ let raw_client = opts.connect_no_namespace(None, None).await.unwrap();
21
+ let mut retry_client = RetryClient::new(raw_client, opts.retry_config);
22
+ retry_client
23
+ .describe_namespace(DescribeNamespaceRequest {
24
+ namespace: NAMESPACE.to_string(),
25
+ ..Default::default()
26
+ })
27
+ .await
28
+ .unwrap();
29
+ }
30
+
31
+ #[tokio::test]
32
+ async fn calls_get_system_info() {
33
+ let opts = get_integ_server_options();
34
+ let raw_client = opts.connect_no_namespace(None, None).await.unwrap();
35
+ assert!(raw_client.get_client().capabilities().is_some());
36
+ }
@@ -0,0 +1,128 @@
1
+ use std::time::{SystemTime, UNIX_EPOCH};
2
+ use temporal_client::{ClientOptionsBuilder, TestService, WorkflowService};
3
+ use temporal_sdk_core::ephemeral_server::{
4
+ EphemeralExe, EphemeralExeVersion, EphemeralServer, TemporaliteConfigBuilder,
5
+ TestServerConfigBuilder,
6
+ };
7
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::DescribeNamespaceRequest;
8
+ use temporal_sdk_core_test_utils::{default_cached_download, NAMESPACE};
9
+ use url::Url;
10
+
11
+ #[tokio::test]
12
+ async fn temporalite_default() {
13
+ let config = TemporaliteConfigBuilder::default()
14
+ .exe(default_cached_download())
15
+ .build()
16
+ .unwrap();
17
+ let mut server = config.start_server().await.unwrap();
18
+ assert_ephemeral_server(&server).await;
19
+ server.shutdown().await.unwrap();
20
+ }
21
+
22
+ #[tokio::test]
23
+ async fn temporalite_fixed() {
24
+ let config = TemporaliteConfigBuilder::default()
25
+ .exe(fixed_cached_download("v0.1.1"))
26
+ .build()
27
+ .unwrap();
28
+ let mut server = config.start_server().await.unwrap();
29
+ assert_ephemeral_server(&server).await;
30
+ server.shutdown().await.unwrap();
31
+ }
32
+
33
+ #[tokio::test]
34
+ async fn temporalite_shutdown_port_reuse() {
35
+ // Start, test shutdown, do again immediately on same port to ensure we can
36
+ // reuse after shutdown
37
+ let config = TemporaliteConfigBuilder::default()
38
+ .exe(default_cached_download())
39
+ .port(Some(10123))
40
+ .build()
41
+ .unwrap();
42
+ let mut server = config.start_server().await.unwrap();
43
+ assert_ephemeral_server(&server).await;
44
+ server.shutdown().await.unwrap();
45
+ let mut server = config.start_server().await.unwrap();
46
+ assert_ephemeral_server(&server).await;
47
+ server.shutdown().await.unwrap();
48
+ }
49
+
50
+ #[tokio::test]
51
+ async fn test_server_default() {
52
+ let config = TestServerConfigBuilder::default()
53
+ .exe(default_cached_download())
54
+ .build()
55
+ .unwrap();
56
+ let mut server = config.start_server().await.unwrap();
57
+ assert_ephemeral_server(&server).await;
58
+ server.shutdown().await.unwrap();
59
+ }
60
+
61
+ #[tokio::test]
62
+ async fn test_server_fixed() {
63
+ let config = TestServerConfigBuilder::default()
64
+ .exe(fixed_cached_download("v1.16.0"))
65
+ .build()
66
+ .unwrap();
67
+ let mut server = config.start_server().await.unwrap();
68
+ assert_ephemeral_server(&server).await;
69
+ server.shutdown().await.unwrap();
70
+ }
71
+
72
+ #[tokio::test]
73
+ async fn test_server_shutdown_port_reuse() {
74
+ // Start, test shutdown, do again immediately on same port to ensure we can
75
+ // reuse after shutdown
76
+ let config = TestServerConfigBuilder::default()
77
+ .exe(default_cached_download())
78
+ .port(Some(10124))
79
+ .build()
80
+ .unwrap();
81
+ let mut server = config.start_server().await.unwrap();
82
+ assert_ephemeral_server(&server).await;
83
+ server.shutdown().await.unwrap();
84
+ let mut server = config.start_server().await.unwrap();
85
+ assert_ephemeral_server(&server).await;
86
+ server.shutdown().await.unwrap();
87
+ }
88
+
89
+ fn fixed_cached_download(version: &str) -> EphemeralExe {
90
+ EphemeralExe::CachedDownload {
91
+ version: EphemeralExeVersion::Fixed(version.to_string()),
92
+ dest_dir: None,
93
+ }
94
+ }
95
+
96
+ async fn assert_ephemeral_server(server: &EphemeralServer) {
97
+ // Connect and describe namespace
98
+ let mut client = ClientOptionsBuilder::default()
99
+ .identity("integ_tester".to_string())
100
+ .target_url(Url::try_from(&*format!("http://{}", server.target)).unwrap())
101
+ .client_name("temporal-core".to_string())
102
+ .client_version("0.1.0".to_string())
103
+ .build()
104
+ .unwrap()
105
+ .connect_no_namespace(None, None)
106
+ .await
107
+ .unwrap();
108
+ let resp = client
109
+ .describe_namespace(DescribeNamespaceRequest {
110
+ namespace: NAMESPACE.to_string(),
111
+ ..Default::default()
112
+ })
113
+ .await
114
+ .unwrap();
115
+ assert!(resp.into_inner().namespace_info.unwrap().name == "default");
116
+
117
+ // If it has test service, make sure we can use it too
118
+ if server.has_test_service {
119
+ let resp = client.get_current_time(()).await.unwrap();
120
+ // Make sure it's within 5 mins of now
121
+ let resp_seconds = resp.get_ref().time.as_ref().unwrap().seconds as u64;
122
+ let curr_seconds = SystemTime::now()
123
+ .duration_since(UNIX_EPOCH)
124
+ .unwrap()
125
+ .as_secs();
126
+ assert!(curr_seconds - 300 < resp_seconds && curr_seconds + 300 > resp_seconds);
127
+ }
128
+ }
@@ -0,0 +1,221 @@
1
+ use assert_matches::assert_matches;
2
+ use std::time::Duration;
3
+ use temporal_client::{WfClientExt, WorkflowOptions};
4
+ use temporal_sdk::{ActContext, ActivityOptions, WfContext};
5
+ use temporal_sdk_core_protos::{
6
+ coresdk::{
7
+ activity_result::{
8
+ self, activity_resolution as act_res, ActivityExecutionResult, ActivityResolution,
9
+ },
10
+ activity_task::activity_task,
11
+ workflow_activation::{workflow_activation_job, ResolveActivity, WorkflowActivationJob},
12
+ workflow_commands::{ActivityCancellationType, ScheduleActivity},
13
+ workflow_completion::WorkflowActivationCompletion,
14
+ ActivityHeartbeat, ActivityTaskCompletion, AsJsonPayloadExt, IntoCompletion,
15
+ },
16
+ temporal::api::{
17
+ common::v1::{Payload, RetryPolicy},
18
+ enums::v1::TimeoutType,
19
+ },
20
+ };
21
+ use temporal_sdk_core_test_utils::{
22
+ init_core_and_create_wf, schedule_activity_cmd, CoreWfStarter, WorkerTestHelpers,
23
+ };
24
+ use tokio::time::sleep;
25
+
26
+ #[tokio::test]
27
+ async fn activity_heartbeat() {
28
+ let mut starter = init_core_and_create_wf("activity_heartbeat").await;
29
+ let core = starter.get_worker().await;
30
+ let task_q = starter.get_task_queue();
31
+ let activity_id = "act-1";
32
+ let task = core.poll_workflow_activation().await.unwrap();
33
+ // Complete workflow task and schedule activity
34
+ core.complete_workflow_activation(
35
+ schedule_activity_cmd(
36
+ 0,
37
+ task_q,
38
+ activity_id,
39
+ ActivityCancellationType::TryCancel,
40
+ Duration::from_secs(60),
41
+ Duration::from_secs(1),
42
+ )
43
+ .into_completion(task.run_id),
44
+ )
45
+ .await
46
+ .unwrap();
47
+ // Poll activity and verify that it's been scheduled with correct parameters
48
+ let task = core.poll_activity_task().await.unwrap();
49
+ assert_matches!(
50
+ task.variant,
51
+ Some(activity_task::Variant::Start(start_activity)) => {
52
+ assert_eq!(start_activity.activity_type, "test_activity".to_string())
53
+ }
54
+ );
55
+ // Heartbeat timeout is set to 1 second, this loop is going to send heartbeat every 100ms.
56
+ // Activity shouldn't timeout since we are sending heartbeats regularly, however if we didn't
57
+ // send heartbeats activity would have timed out as it takes 2 sec to execute this loop.
58
+ for _ in 0u8..20 {
59
+ sleep(Duration::from_millis(100)).await;
60
+ core.record_activity_heartbeat(ActivityHeartbeat {
61
+ task_token: task.task_token.clone(),
62
+ details: vec![],
63
+ });
64
+ }
65
+
66
+ let response_payload = Payload {
67
+ data: b"hello ".to_vec(),
68
+ metadata: Default::default(),
69
+ };
70
+ // Complete activity successfully.
71
+ core.complete_activity_task(ActivityTaskCompletion {
72
+ task_token: task.task_token,
73
+ result: Some(ActivityExecutionResult::ok(response_payload.clone())),
74
+ })
75
+ .await
76
+ .unwrap();
77
+ // Poll workflow task and verify that activity has succeeded.
78
+ let task = core.poll_workflow_activation().await.unwrap();
79
+ assert_matches!(
80
+ task.jobs.as_slice(),
81
+ [
82
+ WorkflowActivationJob {
83
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(
84
+ ResolveActivity {seq, result: Some(ActivityResolution {
85
+ status: Some(act_res::Status::Completed(activity_result::Success{result: Some(r)})),
86
+ ..})}
87
+ )),
88
+ },
89
+ ] => {
90
+ assert_eq!(*seq, 0);
91
+ assert_eq!(r, &response_payload);
92
+ }
93
+ );
94
+ core.complete_execution(&task.run_id).await;
95
+ }
96
+
97
+ #[tokio::test]
98
+ async fn many_act_fails_with_heartbeats() {
99
+ let mut starter = init_core_and_create_wf("many_act_fails_with_heartbeats").await;
100
+ let core = starter.get_worker().await;
101
+ let activity_id = "act-1";
102
+ let task = core.poll_workflow_activation().await.unwrap();
103
+ // Complete workflow task and schedule activity
104
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmd(
105
+ task.run_id,
106
+ ScheduleActivity {
107
+ seq: 0,
108
+ activity_id: activity_id.to_string(),
109
+ activity_type: "test_act".to_string(),
110
+ task_queue: starter.get_task_queue().to_string(),
111
+ start_to_close_timeout: Some(prost_dur!(from_secs(30))),
112
+ retry_policy: Some(RetryPolicy {
113
+ initial_interval: Some(prost_dur!(from_millis(10))),
114
+ backoff_coefficient: 1.0,
115
+ maximum_attempts: 4,
116
+ ..Default::default()
117
+ }),
118
+ heartbeat_timeout: Some(prost_dur!(from_secs(1))),
119
+ ..Default::default()
120
+ }
121
+ .into(),
122
+ ))
123
+ .await
124
+ .unwrap();
125
+
126
+ // Multiple times, poll for the activity, heartbeat, and then immediately fail
127
+ // Poll activity and verify that it's been scheduled with correct parameters
128
+ for i in 0u8..=3 {
129
+ let task = core.poll_activity_task().await.unwrap();
130
+ let start_t = assert_matches!(task.variant, Some(activity_task::Variant::Start(s)) => s);
131
+
132
+ core.record_activity_heartbeat(ActivityHeartbeat {
133
+ task_token: task.task_token.clone(),
134
+ details: vec![[i].into()],
135
+ });
136
+
137
+ let compl = if i == 3 {
138
+ // Verify last hb was recorded
139
+ assert_eq!(start_t.heartbeat_details, [[2].into()]);
140
+ ActivityTaskCompletion {
141
+ task_token: task.task_token,
142
+ result: Some(ActivityExecutionResult::ok("passed".into())),
143
+ }
144
+ } else {
145
+ if i != 0 {
146
+ assert_eq!(start_t.heartbeat_details, [[i - 1].into()]);
147
+ }
148
+ ActivityTaskCompletion {
149
+ task_token: task.task_token,
150
+ result: Some(ActivityExecutionResult::fail(format!("Die on {i}").into())),
151
+ }
152
+ };
153
+ core.complete_activity_task(compl).await.unwrap();
154
+ }
155
+ let task = core.poll_workflow_activation().await.unwrap();
156
+
157
+ assert_matches!(
158
+ task.jobs.as_slice(),
159
+ [WorkflowActivationJob {
160
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(
161
+ ResolveActivity {
162
+ result: Some(ActivityResolution {
163
+ status: Some(act_res::Status::Completed(activity_result::Success { .. })),
164
+ ..
165
+ }),
166
+ ..
167
+ }
168
+ )),
169
+ },]
170
+ );
171
+ core.complete_execution(&task.run_id).await;
172
+ core.shutdown().await;
173
+ }
174
+
175
+ #[tokio::test]
176
+ async fn activity_doesnt_heartbeat_hits_timeout_then_completes() {
177
+ let wf_name = "activity_doesnt_heartbeat_hits_timeout_then_completes";
178
+ let mut starter = CoreWfStarter::new(wf_name);
179
+ let mut worker = starter.worker().await;
180
+ let client = starter.get_client().await;
181
+ worker.register_activity(
182
+ "echo_activity",
183
+ |_ctx: ActContext, echo_me: String| async move {
184
+ sleep(Duration::from_secs(4)).await;
185
+ Ok(echo_me)
186
+ },
187
+ );
188
+ worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
189
+ let res = ctx
190
+ .activity(ActivityOptions {
191
+ activity_type: "echo_activity".to_string(),
192
+ input: "hi!".as_json_payload().expect("serializes fine"),
193
+ start_to_close_timeout: Some(Duration::from_secs(10)),
194
+ heartbeat_timeout: Some(Duration::from_secs(2)),
195
+ retry_policy: Some(RetryPolicy {
196
+ maximum_attempts: 1,
197
+ ..Default::default()
198
+ }),
199
+ ..Default::default()
200
+ })
201
+ .await;
202
+ assert_eq!(res.timed_out(), Some(TimeoutType::Heartbeat));
203
+ Ok(().into())
204
+ });
205
+
206
+ let run_id = worker
207
+ .submit_wf(
208
+ wf_name.to_owned(),
209
+ wf_name.to_owned(),
210
+ vec![],
211
+ WorkflowOptions::default(),
212
+ )
213
+ .await
214
+ .unwrap();
215
+ worker.run_until_done().await.unwrap();
216
+ let handle = client.get_untyped_workflow_handle(wf_name, run_id);
217
+ handle
218
+ .get_workflow_result(Default::default())
219
+ .await
220
+ .unwrap();
221
+ }
@@ -0,0 +1,37 @@
1
+ use temporal_client::WorkflowService;
2
+ use temporal_sdk_core::CoreRuntime;
3
+ use temporal_sdk_core_api::telemetry::MetricsExporter;
4
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::ListNamespacesRequest;
5
+ use temporal_sdk_core_test_utils::{get_integ_server_options, get_integ_telem_options};
6
+
7
+ #[tokio::test]
8
+ async fn prometheus_metrics_exported() {
9
+ let mut telemopts = get_integ_telem_options();
10
+ let addr = "127.0.0.1:10919";
11
+ telemopts.metrics = Some(MetricsExporter::Prometheus(addr.parse().unwrap()));
12
+ let rt = CoreRuntime::new_assume_tokio(telemopts).unwrap();
13
+ let opts = get_integ_server_options();
14
+ let mut raw_client = opts
15
+ .connect_no_namespace(rt.metric_meter(), None)
16
+ .await
17
+ .unwrap();
18
+ assert!(raw_client.get_client().capabilities().is_some());
19
+
20
+ let _ = raw_client
21
+ .list_namespaces(ListNamespacesRequest::default())
22
+ .await
23
+ .unwrap();
24
+
25
+ let body = reqwest::get(format!("http://{}/metrics", addr))
26
+ .await
27
+ .unwrap()
28
+ .text()
29
+ .await
30
+ .unwrap();
31
+ assert!(body.contains(
32
+ "request_latency_count{operation=\"ListNamespaces\",service_name=\"temporal-core-sdk\"} 1"
33
+ ));
34
+ assert!(body.contains(
35
+ "request_latency_count{operation=\"GetSystemInfo\",service_name=\"temporal-core-sdk\"} 1"
36
+ ));
37
+ }
@@ -0,0 +1,133 @@
1
+ use assert_matches::assert_matches;
2
+ use futures::future::join_all;
3
+ use std::time::Duration;
4
+ use temporal_client::WorkflowOptions;
5
+ use temporal_sdk::{WfContext, WorkflowResult};
6
+ use temporal_sdk_core_protos::coresdk::{
7
+ activity_task::activity_task as act_task,
8
+ workflow_activation::{workflow_activation_job, FireTimer, WorkflowActivationJob},
9
+ workflow_commands::{ActivityCancellationType, RequestCancelActivity, StartTimer},
10
+ workflow_completion::WorkflowActivationCompletion,
11
+ IntoCompletion,
12
+ };
13
+ use temporal_sdk_core_test_utils::{
14
+ init_core_and_create_wf, schedule_activity_cmd, CoreWfStarter, WorkerTestHelpers,
15
+ };
16
+ use tokio::time::timeout;
17
+
18
+ #[tokio::test]
19
+ async fn out_of_order_completion_doesnt_hang() {
20
+ let mut starter = init_core_and_create_wf("out_of_order_completion_doesnt_hang").await;
21
+ let core = starter.get_worker().await;
22
+ let task_q = starter.get_task_queue();
23
+ let activity_id = "act-1";
24
+ let task = core.poll_workflow_activation().await.unwrap();
25
+ // Complete workflow task and schedule activity and a timer that fires immediately
26
+ core.complete_workflow_activation(
27
+ vec![
28
+ schedule_activity_cmd(
29
+ 0,
30
+ task_q,
31
+ activity_id,
32
+ ActivityCancellationType::TryCancel,
33
+ Duration::from_secs(60),
34
+ Duration::from_secs(60),
35
+ ),
36
+ StartTimer {
37
+ seq: 1,
38
+ start_to_fire_timeout: Some(prost_dur!(from_millis(50))),
39
+ }
40
+ .into(),
41
+ ]
42
+ .into_completion(task.run_id),
43
+ )
44
+ .await
45
+ .unwrap();
46
+ // Poll activity and verify that it's been scheduled with correct parameters, we don't expect to
47
+ // complete it in this test as activity is try-cancelled.
48
+ let activity_task = core.poll_activity_task().await.unwrap();
49
+ assert_matches!(
50
+ activity_task.variant,
51
+ Some(act_task::Variant::Start(start_activity)) => {
52
+ assert_eq!(start_activity.activity_type, "test_activity".to_string())
53
+ }
54
+ );
55
+ // Poll workflow task and verify that activity has failed.
56
+ let task = core.poll_workflow_activation().await.unwrap();
57
+ assert_matches!(
58
+ task.jobs.as_slice(),
59
+ [
60
+ WorkflowActivationJob {
61
+ variant: Some(workflow_activation_job::Variant::FireTimer(
62
+ FireTimer { seq: t_seq }
63
+ )),
64
+ },
65
+ ] => {
66
+ assert_eq!(*t_seq, 1);
67
+ }
68
+ );
69
+
70
+ // Start polling again *before* we complete the WFT
71
+ let cc = core.clone();
72
+ let jh = tokio::spawn(async move {
73
+ // We want to fail the test if this takes too long -- we should not hit long poll timeout
74
+ let task = timeout(Duration::from_secs(1), cc.poll_workflow_activation())
75
+ .await
76
+ .expect("Poll should come back right away")
77
+ .unwrap();
78
+ assert_matches!(
79
+ task.jobs.as_slice(),
80
+ [WorkflowActivationJob {
81
+ variant: Some(workflow_activation_job::Variant::ResolveActivity(_)),
82
+ }]
83
+ );
84
+ cc.complete_execution(&task.run_id).await;
85
+ });
86
+
87
+ tokio::time::sleep(Duration::from_millis(100)).await;
88
+ // Then complete the (last) WFT with a request to cancel the AT, which should produce a
89
+ // pending activation, unblocking the (already started) poll
90
+ core.complete_workflow_activation(WorkflowActivationCompletion::from_cmds(
91
+ task.run_id,
92
+ vec![RequestCancelActivity { seq: 0 }.into()],
93
+ ))
94
+ .await
95
+ .unwrap();
96
+
97
+ jh.await.unwrap();
98
+ }
99
+
100
+ pub async fn many_parallel_timers_longhist(ctx: WfContext) -> WorkflowResult<()> {
101
+ for _ in 0..20 {
102
+ let mut futs = vec![];
103
+ for _ in 0..1000 {
104
+ futs.push(ctx.timer(Duration::from_millis(100)));
105
+ }
106
+ join_all(futs).await;
107
+ }
108
+ Ok(().into())
109
+ }
110
+
111
+ // Ignored for now because I can't actually get this to produce pages. Need to generate some
112
+ // large payloads I think.
113
+ #[tokio::test]
114
+ #[ignore]
115
+ async fn can_paginate_long_history() {
116
+ let wf_name = "can_paginate_long_history";
117
+ let mut starter = CoreWfStarter::new(wf_name);
118
+ // Do not use sticky queues so we are forced to paginate once history gets long
119
+ starter.max_cached_workflows(0);
120
+
121
+ let mut worker = starter.worker().await;
122
+ worker.register_wf(wf_name.to_owned(), many_parallel_timers_longhist);
123
+ worker
124
+ .submit_wf(
125
+ wf_name.to_owned(),
126
+ wf_name.to_owned(),
127
+ vec![],
128
+ WorkflowOptions::default(),
129
+ )
130
+ .await
131
+ .unwrap();
132
+ worker.run_until_done().await.unwrap();
133
+ }