temporalio 0.0.1

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 (317) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/LICENSE +20 -0
  4. data/README.md +130 -0
  5. data/bridge/Cargo.lock +2865 -0
  6. data/bridge/Cargo.toml +26 -0
  7. data/bridge/sdk-core/ARCHITECTURE.md +76 -0
  8. data/bridge/sdk-core/Cargo.lock +2606 -0
  9. data/bridge/sdk-core/Cargo.toml +2 -0
  10. data/bridge/sdk-core/LICENSE.txt +23 -0
  11. data/bridge/sdk-core/README.md +107 -0
  12. data/bridge/sdk-core/arch_docs/diagrams/README.md +10 -0
  13. data/bridge/sdk-core/arch_docs/diagrams/sticky_queues.puml +40 -0
  14. data/bridge/sdk-core/arch_docs/diagrams/workflow_internals.svg +1 -0
  15. data/bridge/sdk-core/arch_docs/sticky_queues.md +51 -0
  16. data/bridge/sdk-core/bridge-ffi/Cargo.toml +24 -0
  17. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +23 -0
  18. data/bridge/sdk-core/bridge-ffi/build.rs +25 -0
  19. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +249 -0
  20. data/bridge/sdk-core/bridge-ffi/src/lib.rs +825 -0
  21. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +211 -0
  22. data/bridge/sdk-core/client/Cargo.toml +40 -0
  23. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  24. data/bridge/sdk-core/client/src/lib.rs +1294 -0
  25. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  26. data/bridge/sdk-core/client/src/raw.rs +931 -0
  27. data/bridge/sdk-core/client/src/retry.rs +674 -0
  28. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  29. data/bridge/sdk-core/core/Cargo.toml +116 -0
  30. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  31. data/bridge/sdk-core/core/benches/workflow_replay.rs +73 -0
  32. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  33. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +911 -0
  34. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  35. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  36. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +515 -0
  37. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  38. data/bridge/sdk-core/core/src/core_tests/queries.rs +736 -0
  39. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  40. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  41. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  42. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2070 -0
  43. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  44. data/bridge/sdk-core/core/src/lib.rs +175 -0
  45. data/bridge/sdk-core/core/src/log_export.rs +62 -0
  46. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  47. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  48. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  49. data/bridge/sdk-core/core/src/replay/mod.rs +71 -0
  50. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  51. data/bridge/sdk-core/core/src/telemetry/metrics.rs +383 -0
  52. data/bridge/sdk-core/core/src/telemetry/mod.rs +412 -0
  53. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +77 -0
  54. data/bridge/sdk-core/core/src/test_help/mod.rs +875 -0
  55. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  56. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1042 -0
  57. data/bridge/sdk-core/core/src/worker/activities.rs +464 -0
  58. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  59. data/bridge/sdk-core/core/src/worker/client.rs +347 -0
  60. data/bridge/sdk-core/core/src/worker/mod.rs +566 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +110 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +458 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +911 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +298 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +171 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +860 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +140 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +161 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +133 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1448 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +342 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +127 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +712 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +71 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +443 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +439 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +169 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +246 -0
  80. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  81. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1184 -0
  82. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +277 -0
  83. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  84. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +647 -0
  85. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1143 -0
  86. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  87. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  88. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +940 -0
  89. data/bridge/sdk-core/core-api/Cargo.toml +31 -0
  90. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  91. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  92. data/bridge/sdk-core/core-api/src/lib.rs +151 -0
  93. data/bridge/sdk-core/core-api/src/worker.rs +135 -0
  94. data/bridge/sdk-core/etc/deps.svg +187 -0
  95. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  96. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  97. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  98. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  99. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  100. data/bridge/sdk-core/fsm/README.md +3 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  115. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  116. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  117. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  118. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  119. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  120. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  121. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  122. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  123. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  124. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  125. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  126. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  127. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  128. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  129. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  130. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  131. data/bridge/sdk-core/protos/api_upstream/buf.yaml +12 -0
  132. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +86 -0
  134. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
  135. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +259 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +112 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +46 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +55 -0
  141. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +168 -0
  142. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +97 -0
  143. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +51 -0
  144. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +50 -0
  145. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +41 -0
  146. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +60 -0
  147. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +59 -0
  148. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +51 -0
  149. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +122 -0
  150. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +108 -0
  151. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +114 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +56 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +751 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +161 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +99 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
  160. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  161. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +46 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +59 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +145 -0
  164. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1124 -0
  165. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +401 -0
  166. data/bridge/sdk-core/protos/grpc/health/v1/health.proto +63 -0
  167. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_result/activity_result.proto +78 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/activity_task/activity_task.proto +79 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +210 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  174. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +261 -0
  175. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +297 -0
  176. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  179. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  180. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  181. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  182. data/bridge/sdk-core/rustfmt.toml +1 -0
  183. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  184. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  185. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  186. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  187. data/bridge/sdk-core/sdk/src/conversions.rs +8 -0
  188. data/bridge/sdk-core/sdk/src/interceptors.rs +17 -0
  189. data/bridge/sdk-core/sdk/src/lib.rs +792 -0
  190. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  191. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  192. data/bridge/sdk-core/sdk/src/workflow_context.rs +683 -0
  193. data/bridge/sdk-core/sdk/src/workflow_future.rs +503 -0
  194. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  195. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  196. data/bridge/sdk-core/sdk-core-protos/build.rs +108 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +497 -0
  199. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  200. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1910 -0
  201. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  202. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  203. data/bridge/sdk-core/test-utils/Cargo.toml +35 -0
  204. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  205. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  206. data/bridge/sdk-core/test-utils/src/lib.rs +598 -0
  207. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  208. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  209. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +218 -0
  210. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +146 -0
  211. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  212. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  219. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  220. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +634 -0
  221. data/bridge/sdk-core/tests/integ_tests/workflow_tests/patches.rs +113 -0
  222. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +137 -0
  223. data/bridge/sdk-core/tests/integ_tests/workflow_tests/resets.rs +93 -0
  224. data/bridge/sdk-core/tests/integ_tests/workflow_tests/signals.rs +167 -0
  225. data/bridge/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +99 -0
  226. data/bridge/sdk-core/tests/integ_tests/workflow_tests/timers.rs +131 -0
  227. data/bridge/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +75 -0
  228. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +587 -0
  229. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  230. data/bridge/sdk-core/tests/main.rs +111 -0
  231. data/bridge/sdk-core/tests/runner.rs +93 -0
  232. data/bridge/src/connection.rs +167 -0
  233. data/bridge/src/lib.rs +180 -0
  234. data/bridge/src/runtime.rs +47 -0
  235. data/bridge/src/worker.rs +73 -0
  236. data/ext/Rakefile +9 -0
  237. data/lib/bridge.so +0 -0
  238. data/lib/gen/dependencies/gogoproto/gogo_pb.rb +14 -0
  239. data/lib/gen/temporal/api/batch/v1/message_pb.rb +48 -0
  240. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +67 -0
  241. data/lib/gen/temporal/api/command/v1/message_pb.rb +166 -0
  242. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  243. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +32 -0
  244. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +26 -0
  245. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +37 -0
  246. data/lib/gen/temporal/api/enums/v1/common_pb.rb +41 -0
  247. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +67 -0
  248. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +71 -0
  249. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  250. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  251. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  252. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  253. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  254. data/lib/gen/temporal/api/enums/v1/update_pb.rb +28 -0
  255. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  256. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  257. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  258. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  259. data/lib/gen/temporal/api/history/v1/message_pb.rb +489 -0
  260. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +63 -0
  261. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +125 -0
  262. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +20 -0
  263. data/lib/gen/temporal/api/query/v1/message_pb.rb +38 -0
  264. data/lib/gen/temporal/api/replication/v1/message_pb.rb +37 -0
  265. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +128 -0
  266. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  267. data/lib/gen/temporal/api/update/v1/message_pb.rb +26 -0
  268. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  269. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +110 -0
  270. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +771 -0
  271. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  272. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  273. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  274. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  275. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  276. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  277. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  278. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  279. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +164 -0
  280. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +192 -0
  281. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  282. data/lib/temporal/bridge.rb +14 -0
  283. data/lib/temporal/client/implementation.rb +339 -0
  284. data/lib/temporal/client/workflow_handle.rb +243 -0
  285. data/lib/temporal/client.rb +144 -0
  286. data/lib/temporal/connection.rb +736 -0
  287. data/lib/temporal/data_converter.rb +150 -0
  288. data/lib/temporal/error/failure.rb +194 -0
  289. data/lib/temporal/error/workflow_failure.rb +17 -0
  290. data/lib/temporal/errors.rb +22 -0
  291. data/lib/temporal/failure_converter/base.rb +26 -0
  292. data/lib/temporal/failure_converter/basic.rb +313 -0
  293. data/lib/temporal/failure_converter.rb +8 -0
  294. data/lib/temporal/interceptor/chain.rb +27 -0
  295. data/lib/temporal/interceptor/client.rb +102 -0
  296. data/lib/temporal/payload_codec/base.rb +32 -0
  297. data/lib/temporal/payload_converter/base.rb +24 -0
  298. data/lib/temporal/payload_converter/bytes.rb +26 -0
  299. data/lib/temporal/payload_converter/composite.rb +47 -0
  300. data/lib/temporal/payload_converter/encoding_base.rb +35 -0
  301. data/lib/temporal/payload_converter/json.rb +25 -0
  302. data/lib/temporal/payload_converter/nil.rb +25 -0
  303. data/lib/temporal/payload_converter.rb +14 -0
  304. data/lib/temporal/retry_policy.rb +82 -0
  305. data/lib/temporal/retry_state.rb +35 -0
  306. data/lib/temporal/runtime.rb +22 -0
  307. data/lib/temporal/timeout_type.rb +29 -0
  308. data/lib/temporal/version.rb +3 -0
  309. data/lib/temporal/workflow/execution_info.rb +54 -0
  310. data/lib/temporal/workflow/execution_status.rb +36 -0
  311. data/lib/temporal/workflow/id_reuse_policy.rb +36 -0
  312. data/lib/temporal/workflow/query_reject_condition.rb +33 -0
  313. data/lib/temporal.rb +8 -0
  314. data/lib/temporalio.rb +3 -0
  315. data/lib/thermite_patch.rb +23 -0
  316. data/temporalio.gemspec +41 -0
  317. metadata +583 -0
@@ -0,0 +1,62 @@
1
+ use log::{LevelFilter, Log, Metadata, Record};
2
+ use ringbuf::{Consumer, Producer, RingBuffer};
3
+ use std::{sync::Mutex, time::SystemTime};
4
+ use temporal_sdk_core_api::CoreLog;
5
+
6
+ pub(crate) struct CoreExportLogger {
7
+ logs_in: Mutex<Producer<CoreLog>>,
8
+ logs_out: Mutex<Consumer<CoreLog>>,
9
+ level_filter: LevelFilter,
10
+ }
11
+
12
+ impl CoreExportLogger {
13
+ pub(crate) fn new(level: LevelFilter) -> Self {
14
+ let (lin, lout) = RingBuffer::new(2048).split();
15
+ Self {
16
+ logs_in: Mutex::new(lin),
17
+ logs_out: Mutex::new(lout),
18
+ level_filter: level,
19
+ }
20
+ }
21
+
22
+ pub(crate) fn drain(&self) -> Vec<CoreLog> {
23
+ let mut lout = self
24
+ .logs_out
25
+ .lock()
26
+ .expect("Logging output mutex must be acquired");
27
+ let mut retme = Vec::with_capacity(lout.len());
28
+ lout.pop_each(
29
+ |el| {
30
+ retme.push(el);
31
+ true
32
+ },
33
+ None,
34
+ );
35
+ retme
36
+ }
37
+ }
38
+
39
+ impl Log for CoreExportLogger {
40
+ fn enabled(&self, metadata: &Metadata) -> bool {
41
+ // Never forward logging from other crates
42
+ if !metadata.target().contains("temporal_sdk_core") {
43
+ return false;
44
+ }
45
+ metadata.level() <= self.level_filter
46
+ }
47
+
48
+ fn log(&self, record: &Record) {
49
+ let clog = CoreLog {
50
+ message: format!("[{}] {}", record.target(), record.args()),
51
+ timestamp: SystemTime::now(),
52
+ level: record.level(),
53
+ };
54
+ let _ = self
55
+ .logs_in
56
+ .lock()
57
+ .expect("Logging mutex must be acquired")
58
+ .push(clog);
59
+ }
60
+
61
+ fn flush(&self) {}
62
+ }
@@ -0,0 +1,54 @@
1
+ mod poll_buffer;
2
+
3
+ pub(crate) use poll_buffer::{
4
+ new_activity_task_buffer, new_workflow_task_buffer, WorkflowTaskPoller,
5
+ };
6
+ pub use temporal_client::{
7
+ Client, ClientOptions, ClientOptionsBuilder, ClientTlsConfig, RetryClient, RetryConfig,
8
+ TlsConfig, WorkflowClientTrait,
9
+ };
10
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::{
11
+ PollActivityTaskQueueResponse, PollWorkflowTaskQueueResponse,
12
+ };
13
+
14
+ #[cfg(test)]
15
+ use futures::Future;
16
+
17
+ pub type Result<T, E = tonic::Status> = std::result::Result<T, E>;
18
+
19
+ /// A trait for things that poll the server. Hides complexity of concurrent polling or polling
20
+ /// on sticky/nonsticky queues simultaneously.
21
+ #[cfg_attr(test, mockall::automock)]
22
+ #[cfg_attr(test, allow(unused))]
23
+ #[async_trait::async_trait]
24
+ pub trait Poller<PollResult>
25
+ where
26
+ PollResult: Send + Sync + 'static,
27
+ {
28
+ async fn poll(&self) -> Option<Result<PollResult>>;
29
+ fn notify_shutdown(&self);
30
+ async fn shutdown(self);
31
+ /// Need a separate shutdown to be able to consume boxes :(
32
+ async fn shutdown_box(self: Box<Self>);
33
+ }
34
+ pub type BoxedPoller<T> = Box<dyn Poller<T> + Send + Sync + 'static>;
35
+ pub type BoxedWFPoller = BoxedPoller<PollWorkflowTaskQueueResponse>;
36
+ pub type BoxedActPoller = BoxedPoller<PollActivityTaskQueueResponse>;
37
+
38
+ #[cfg(test)]
39
+ mockall::mock! {
40
+ pub ManualPoller<T: Send + Sync + 'static> {}
41
+ #[allow(unused)]
42
+ impl<T: Send + Sync + 'static> Poller<T> for ManualPoller<T> {
43
+ fn poll<'a, 'b>(&self)
44
+ -> impl Future<Output = Option<Result<T>>> + Send + 'b
45
+ where 'a: 'b, Self: 'b;
46
+ fn notify_shutdown(&self);
47
+ fn shutdown<'a>(self)
48
+ -> impl Future<Output = ()> + Send + 'a
49
+ where Self: 'a;
50
+ fn shutdown_box<'a>(self: Box<Self>)
51
+ -> impl Future<Output = ()> + Send + 'a
52
+ where Self: 'a;
53
+ }
54
+ }
@@ -0,0 +1,297 @@
1
+ use crate::{
2
+ pollers::{self, Poller},
3
+ worker::client::WorkerClient,
4
+ };
5
+ use futures::{prelude::stream::FuturesUnordered, StreamExt};
6
+ use std::{
7
+ fmt::Debug,
8
+ future::Future,
9
+ sync::{
10
+ atomic::{AtomicUsize, Ordering},
11
+ Arc,
12
+ },
13
+ };
14
+ use temporal_sdk_core_protos::temporal::api::workflowservice::v1::{
15
+ PollActivityTaskQueueResponse, PollWorkflowTaskQueueResponse,
16
+ };
17
+ use tokio::{
18
+ sync::{
19
+ mpsc::{channel, Receiver},
20
+ Mutex, Semaphore,
21
+ },
22
+ task::JoinHandle,
23
+ };
24
+ use tokio_util::sync::CancellationToken;
25
+
26
+ pub struct LongPollBuffer<T> {
27
+ buffered_polls: Mutex<Receiver<pollers::Result<T>>>,
28
+ shutdown: CancellationToken,
29
+ /// This semaphore exists to ensure that we only poll server as many times as core actually
30
+ /// *asked* it to be polled - otherwise we might spin and buffer polls constantly. This also
31
+ /// means unit tests can continue to function in a predictable manner when calling mocks.
32
+ polls_requested: Arc<Semaphore>,
33
+ join_handles: FuturesUnordered<JoinHandle<()>>,
34
+ /// Called every time the number of pollers is changed
35
+ num_pollers_changed: Option<Box<dyn Fn(usize) + Send + Sync>>,
36
+ active_pollers: Arc<AtomicUsize>,
37
+ }
38
+
39
+ struct ActiveCounter<'a>(&'a AtomicUsize);
40
+ impl<'a> ActiveCounter<'a> {
41
+ fn new(a: &'a AtomicUsize) -> Self {
42
+ a.fetch_add(1, Ordering::Relaxed);
43
+ Self(a)
44
+ }
45
+ }
46
+ impl Drop for ActiveCounter<'_> {
47
+ fn drop(&mut self) {
48
+ self.0.fetch_sub(1, Ordering::Relaxed);
49
+ }
50
+ }
51
+
52
+ impl<T> LongPollBuffer<T>
53
+ where
54
+ T: Send + Debug + 'static,
55
+ {
56
+ pub fn new<FT>(
57
+ poll_fn: impl Fn() -> FT + Send + Sync + 'static,
58
+ max_pollers: usize,
59
+ buffer_size: usize,
60
+ shutdown: CancellationToken,
61
+ ) -> Self
62
+ where
63
+ FT: Future<Output = pollers::Result<T>> + Send,
64
+ {
65
+ let (tx, rx) = channel(buffer_size);
66
+ let polls_requested = Arc::new(Semaphore::new(0));
67
+ let active_pollers = Arc::new(AtomicUsize::new(0));
68
+ let join_handles = FuturesUnordered::new();
69
+ let pf = Arc::new(poll_fn);
70
+ for _ in 0..max_pollers {
71
+ let tx = tx.clone();
72
+ let pf = pf.clone();
73
+ let shutdown = shutdown.clone();
74
+ let polls_requested = polls_requested.clone();
75
+ let ap = active_pollers.clone();
76
+ let jh = tokio::spawn(async move {
77
+ loop {
78
+ if shutdown.is_cancelled() {
79
+ break;
80
+ }
81
+ let sp = tokio::select! {
82
+ sp = polls_requested.acquire() => sp.expect("Polls semaphore not dropped"),
83
+ _ = shutdown.cancelled() => continue,
84
+ };
85
+ let _active_guard = ActiveCounter::new(ap.as_ref());
86
+ let r = tokio::select! {
87
+ r = pf() => r,
88
+ _ = shutdown.cancelled() => continue,
89
+ };
90
+ sp.forget();
91
+ let _ = tx.send(r).await;
92
+ }
93
+ });
94
+ join_handles.push(jh);
95
+ }
96
+ Self {
97
+ buffered_polls: Mutex::new(rx),
98
+ shutdown,
99
+ polls_requested,
100
+ join_handles,
101
+ num_pollers_changed: None,
102
+ active_pollers,
103
+ }
104
+ }
105
+
106
+ /// Set a function that will be called every time the number of pollers changes.
107
+ /// TODO: Currently a bit weird, will make more sense once we implement dynamic poller scaling.
108
+ pub fn set_num_pollers_handler(&mut self, handler: impl Fn(usize) + Send + Sync + 'static) {
109
+ self.num_pollers_changed = Some(Box::new(handler));
110
+ }
111
+ }
112
+
113
+ #[async_trait::async_trait]
114
+ impl<T> Poller<T> for LongPollBuffer<T>
115
+ where
116
+ T: Send + Sync + Debug + 'static,
117
+ {
118
+ /// Poll the buffer. Adds one permit to the polling pool - the point of this being that the
119
+ /// buffer may support many concurrent pollers, but there is no reason to have them poll unless
120
+ /// enough polls have actually been requested. Calling this function adds a permit that any
121
+ /// concurrent poller may fulfill.
122
+ ///
123
+ /// EX: If this function is only ever called serially and always `await`ed, there will be no
124
+ /// concurrent polling. If it is called many times and the futures are awaited concurrently,
125
+ /// then polling will happen concurrently.
126
+ ///
127
+ /// Returns `None` if the poll buffer has been shut down
128
+ #[instrument(name = "long_poll", level = "trace", skip(self))]
129
+ async fn poll(&self) -> Option<pollers::Result<T>> {
130
+ self.polls_requested.add_permits(1);
131
+ if let Some(fun) = self.num_pollers_changed.as_ref() {
132
+ fun(self.active_pollers.load(Ordering::Relaxed));
133
+ }
134
+
135
+ let mut locked = self.buffered_polls.lock().await;
136
+ let res = (*locked).recv().await;
137
+
138
+ if let Some(fun) = self.num_pollers_changed.as_ref() {
139
+ fun(self.active_pollers.load(Ordering::Relaxed));
140
+ }
141
+
142
+ res
143
+ }
144
+
145
+ fn notify_shutdown(&self) {
146
+ self.shutdown.cancel();
147
+ }
148
+
149
+ async fn shutdown(mut self) {
150
+ self.notify_shutdown();
151
+ while self.join_handles.next().await.is_some() {}
152
+ }
153
+
154
+ async fn shutdown_box(self: Box<Self>) {
155
+ let this = *self;
156
+ this.shutdown().await;
157
+ }
158
+ }
159
+
160
+ /// A poller capable of polling on a sticky and a nonsticky queue simultaneously for workflow tasks.
161
+ #[derive(derive_more::Constructor)]
162
+ pub struct WorkflowTaskPoller {
163
+ normal_poller: PollWorkflowTaskBuffer,
164
+ sticky_poller: Option<PollWorkflowTaskBuffer>,
165
+ }
166
+
167
+ #[async_trait::async_trait]
168
+ impl Poller<PollWorkflowTaskQueueResponse> for WorkflowTaskPoller {
169
+ async fn poll(&self) -> Option<pollers::Result<PollWorkflowTaskQueueResponse>> {
170
+ if let Some(sq) = self.sticky_poller.as_ref() {
171
+ tokio::select! {
172
+ r = self.normal_poller.poll() => r,
173
+ r = sq.poll() => r,
174
+ }
175
+ } else {
176
+ self.normal_poller.poll().await
177
+ }
178
+ }
179
+
180
+ fn notify_shutdown(&self) {
181
+ self.normal_poller.notify_shutdown();
182
+ if let Some(sq) = self.sticky_poller.as_ref() {
183
+ sq.notify_shutdown();
184
+ }
185
+ }
186
+
187
+ async fn shutdown(mut self) {
188
+ self.normal_poller.shutdown().await;
189
+ if let Some(sq) = self.sticky_poller {
190
+ sq.shutdown().await;
191
+ }
192
+ }
193
+
194
+ async fn shutdown_box(self: Box<Self>) {
195
+ let this = *self;
196
+ this.shutdown().await;
197
+ }
198
+ }
199
+
200
+ pub type PollWorkflowTaskBuffer = LongPollBuffer<PollWorkflowTaskQueueResponse>;
201
+ pub(crate) fn new_workflow_task_buffer(
202
+ client: Arc<dyn WorkerClient>,
203
+ task_queue: String,
204
+ is_sticky: bool,
205
+ concurrent_pollers: usize,
206
+ buffer_size: usize,
207
+ shutdown: CancellationToken,
208
+ ) -> PollWorkflowTaskBuffer {
209
+ LongPollBuffer::new(
210
+ move || {
211
+ let client = client.clone();
212
+ let task_queue = task_queue.clone();
213
+ async move { client.poll_workflow_task(task_queue, is_sticky).await }
214
+ },
215
+ concurrent_pollers,
216
+ buffer_size,
217
+ shutdown,
218
+ )
219
+ }
220
+
221
+ pub type PollActivityTaskBuffer = LongPollBuffer<PollActivityTaskQueueResponse>;
222
+ pub(crate) fn new_activity_task_buffer(
223
+ client: Arc<dyn WorkerClient>,
224
+ task_queue: String,
225
+ concurrent_pollers: usize,
226
+ buffer_size: usize,
227
+ max_tps: Option<f64>,
228
+ shutdown: CancellationToken,
229
+ ) -> PollActivityTaskBuffer {
230
+ LongPollBuffer::new(
231
+ move || {
232
+ let client = client.clone();
233
+ let task_queue = task_queue.clone();
234
+ async move { client.poll_activity_task(task_queue, max_tps).await }
235
+ },
236
+ concurrent_pollers,
237
+ buffer_size,
238
+ shutdown,
239
+ )
240
+ }
241
+
242
+ #[cfg(test)]
243
+ mod tests {
244
+ use super::*;
245
+ use crate::worker::client::mocks::mock_manual_workflow_client;
246
+ use futures::FutureExt;
247
+ use std::time::Duration;
248
+ use tokio::{select, sync::mpsc::channel};
249
+
250
+ #[tokio::test]
251
+ async fn only_polls_once_with_1_poller() {
252
+ let mut mock_client = mock_manual_workflow_client();
253
+ mock_client
254
+ .expect_poll_workflow_task()
255
+ .times(2)
256
+ .returning(move |_, _| {
257
+ async {
258
+ tokio::time::sleep(Duration::from_millis(100)).await;
259
+ Ok(Default::default())
260
+ }
261
+ .boxed()
262
+ });
263
+
264
+ let pb = new_workflow_task_buffer(
265
+ Arc::new(mock_client),
266
+ "someq".to_string(),
267
+ false,
268
+ 1,
269
+ 1,
270
+ CancellationToken::new(),
271
+ );
272
+
273
+ // Poll a bunch of times, "interrupting" it each time, we should only actually have polled
274
+ // once since the poll takes a while
275
+ let (interrupter_tx, mut interrupter_rx) = channel(50);
276
+ for _ in 0..10 {
277
+ interrupter_tx.send(()).await.unwrap();
278
+ }
279
+
280
+ // We should never get anything out since we interrupted 100% of polls
281
+ let mut last_val = false;
282
+ for _ in 0..10 {
283
+ select! {
284
+ _ = interrupter_rx.recv() => {
285
+ last_val = true;
286
+ }
287
+ _ = pb.poll() => {
288
+ }
289
+ }
290
+ }
291
+ assert!(last_val);
292
+ // Now we grab the buffered poll response, the poll task will go again but we don't grab it,
293
+ // therefore we will have only polled twice.
294
+ pb.poll().await.unwrap().unwrap();
295
+ pb.shutdown().await;
296
+ }
297
+ }