temporalio 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +130 -0
  3. data/bridge/Cargo.lock +2865 -0
  4. data/bridge/Cargo.toml +26 -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 +107 -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/bridge-ffi/Cargo.toml +24 -0
  15. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +23 -0
  16. data/bridge/sdk-core/bridge-ffi/build.rs +25 -0
  17. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +249 -0
  18. data/bridge/sdk-core/bridge-ffi/src/lib.rs +825 -0
  19. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +211 -0
  20. data/bridge/sdk-core/client/Cargo.toml +40 -0
  21. data/bridge/sdk-core/client/LICENSE.txt +23 -0
  22. data/bridge/sdk-core/client/src/lib.rs +1294 -0
  23. data/bridge/sdk-core/client/src/metrics.rs +165 -0
  24. data/bridge/sdk-core/client/src/raw.rs +931 -0
  25. data/bridge/sdk-core/client/src/retry.rs +674 -0
  26. data/bridge/sdk-core/client/src/workflow_handle/mod.rs +185 -0
  27. data/bridge/sdk-core/core/Cargo.toml +116 -0
  28. data/bridge/sdk-core/core/LICENSE.txt +23 -0
  29. data/bridge/sdk-core/core/benches/workflow_replay.rs +73 -0
  30. data/bridge/sdk-core/core/src/abstractions.rs +166 -0
  31. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +911 -0
  32. data/bridge/sdk-core/core/src/core_tests/child_workflows.rs +221 -0
  33. data/bridge/sdk-core/core/src/core_tests/determinism.rs +107 -0
  34. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +515 -0
  35. data/bridge/sdk-core/core/src/core_tests/mod.rs +100 -0
  36. data/bridge/sdk-core/core/src/core_tests/queries.rs +736 -0
  37. data/bridge/sdk-core/core/src/core_tests/replay_flag.rs +65 -0
  38. data/bridge/sdk-core/core/src/core_tests/workers.rs +259 -0
  39. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +124 -0
  40. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +2070 -0
  41. data/bridge/sdk-core/core/src/ephemeral_server/mod.rs +515 -0
  42. data/bridge/sdk-core/core/src/lib.rs +175 -0
  43. data/bridge/sdk-core/core/src/log_export.rs +62 -0
  44. data/bridge/sdk-core/core/src/pollers/mod.rs +54 -0
  45. data/bridge/sdk-core/core/src/pollers/poll_buffer.rs +297 -0
  46. data/bridge/sdk-core/core/src/protosext/mod.rs +428 -0
  47. data/bridge/sdk-core/core/src/replay/mod.rs +71 -0
  48. data/bridge/sdk-core/core/src/retry_logic.rs +202 -0
  49. data/bridge/sdk-core/core/src/telemetry/metrics.rs +383 -0
  50. data/bridge/sdk-core/core/src/telemetry/mod.rs +412 -0
  51. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +77 -0
  52. data/bridge/sdk-core/core/src/test_help/mod.rs +875 -0
  53. data/bridge/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +580 -0
  54. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +1042 -0
  55. data/bridge/sdk-core/core/src/worker/activities.rs +464 -0
  56. data/bridge/sdk-core/core/src/worker/client/mocks.rs +87 -0
  57. data/bridge/sdk-core/core/src/worker/client.rs +347 -0
  58. data/bridge/sdk-core/core/src/worker/mod.rs +566 -0
  59. data/bridge/sdk-core/core/src/worker/workflow/bridge.rs +37 -0
  60. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +110 -0
  61. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +458 -0
  62. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +911 -0
  63. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +298 -0
  64. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +171 -0
  65. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +860 -0
  66. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +140 -0
  67. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +161 -0
  68. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +133 -0
  69. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +1448 -0
  70. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +342 -0
  71. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +127 -0
  72. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +712 -0
  73. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +71 -0
  74. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +443 -0
  75. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +439 -0
  76. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +169 -0
  77. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +246 -0
  78. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +96 -0
  79. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +1184 -0
  80. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +277 -0
  81. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +198 -0
  82. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +647 -0
  83. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +1143 -0
  84. data/bridge/sdk-core/core/src/worker/workflow/run_cache.rs +145 -0
  85. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +88 -0
  86. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +940 -0
  87. data/bridge/sdk-core/core-api/Cargo.toml +31 -0
  88. data/bridge/sdk-core/core-api/LICENSE.txt +23 -0
  89. data/bridge/sdk-core/core-api/src/errors.rs +95 -0
  90. data/bridge/sdk-core/core-api/src/lib.rs +151 -0
  91. data/bridge/sdk-core/core-api/src/worker.rs +135 -0
  92. data/bridge/sdk-core/etc/deps.svg +187 -0
  93. data/bridge/sdk-core/etc/dynamic-config.yaml +2 -0
  94. data/bridge/sdk-core/etc/otel-collector-config.yaml +36 -0
  95. data/bridge/sdk-core/etc/prometheus.yaml +6 -0
  96. data/bridge/sdk-core/fsm/Cargo.toml +18 -0
  97. data/bridge/sdk-core/fsm/LICENSE.txt +23 -0
  98. data/bridge/sdk-core/fsm/README.md +3 -0
  99. data/bridge/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +27 -0
  100. data/bridge/sdk-core/fsm/rustfsm_procmacro/LICENSE.txt +23 -0
  101. data/bridge/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +647 -0
  102. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/progress.rs +8 -0
  103. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.rs +18 -0
  104. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +12 -0
  105. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dynamic_dest_pass.rs +41 -0
  106. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.rs +14 -0
  107. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/forgot_name_fail.stderr +11 -0
  108. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_arg_pass.rs +32 -0
  109. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/handler_pass.rs +31 -0
  110. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/medium_complex_pass.rs +46 -0
  111. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.rs +29 -0
  112. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +12 -0
  113. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/simple_pass.rs +32 -0
  114. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.rs +18 -0
  115. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/struct_event_variant_fail.stderr +5 -0
  116. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.rs +11 -0
  117. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_more_item_event_variant_fail.stderr +5 -0
  118. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.rs +11 -0
  119. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/tuple_zero_item_event_variant_fail.stderr +5 -0
  120. data/bridge/sdk-core/fsm/rustfsm_trait/Cargo.toml +14 -0
  121. data/bridge/sdk-core/fsm/rustfsm_trait/LICENSE.txt +23 -0
  122. data/bridge/sdk-core/fsm/rustfsm_trait/src/lib.rs +249 -0
  123. data/bridge/sdk-core/fsm/src/lib.rs +2 -0
  124. data/bridge/sdk-core/histories/fail_wf_task.bin +0 -0
  125. data/bridge/sdk-core/histories/timer_workflow_history.bin +0 -0
  126. data/bridge/sdk-core/integ-with-otel.sh +7 -0
  127. data/bridge/sdk-core/protos/api_upstream/README.md +9 -0
  128. data/bridge/sdk-core/protos/api_upstream/api-linter.yaml +40 -0
  129. data/bridge/sdk-core/protos/api_upstream/buf.yaml +12 -0
  130. data/bridge/sdk-core/protos/api_upstream/dependencies/gogoproto/gogo.proto +141 -0
  131. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +86 -0
  132. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +83 -0
  133. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +259 -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 +46 -0
  136. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/cluster.proto +40 -0
  137. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +57 -0
  138. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +55 -0
  139. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +168 -0
  140. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +97 -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 +51 -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 +751 -0
  152. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +97 -0
  153. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +161 -0
  154. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +99 -0
  155. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +61 -0
  156. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +55 -0
  157. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +300 -0
  158. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +108 -0
  159. data/bridge/sdk-core/protos/api_upstream/temporal/api/update/v1/message.proto +46 -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 +145 -0
  162. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +1124 -0
  163. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +401 -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/bridge/bridge.proto +210 -0
  168. data/bridge/sdk-core/protos/local/temporal/sdk/core/child_workflow/child_workflow.proto +77 -0
  169. data/bridge/sdk-core/protos/local/temporal/sdk/core/common/common.proto +15 -0
  170. data/bridge/sdk-core/protos/local/temporal/sdk/core/core_interface.proto +30 -0
  171. data/bridge/sdk-core/protos/local/temporal/sdk/core/external_data/external_data.proto +30 -0
  172. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +261 -0
  173. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +297 -0
  174. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +29 -0
  175. data/bridge/sdk-core/protos/testsrv_upstream/api-linter.yaml +38 -0
  176. data/bridge/sdk-core/protos/testsrv_upstream/buf.yaml +13 -0
  177. data/bridge/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +141 -0
  178. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +63 -0
  179. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +90 -0
  180. data/bridge/sdk-core/rustfmt.toml +1 -0
  181. data/bridge/sdk-core/sdk/Cargo.toml +47 -0
  182. data/bridge/sdk-core/sdk/LICENSE.txt +23 -0
  183. data/bridge/sdk-core/sdk/src/activity_context.rs +230 -0
  184. data/bridge/sdk-core/sdk/src/app_data.rs +37 -0
  185. data/bridge/sdk-core/sdk/src/conversions.rs +8 -0
  186. data/bridge/sdk-core/sdk/src/interceptors.rs +17 -0
  187. data/bridge/sdk-core/sdk/src/lib.rs +792 -0
  188. data/bridge/sdk-core/sdk/src/payload_converter.rs +11 -0
  189. data/bridge/sdk-core/sdk/src/workflow_context/options.rs +295 -0
  190. data/bridge/sdk-core/sdk/src/workflow_context.rs +683 -0
  191. data/bridge/sdk-core/sdk/src/workflow_future.rs +503 -0
  192. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +30 -0
  193. data/bridge/sdk-core/sdk-core-protos/LICENSE.txt +23 -0
  194. data/bridge/sdk-core/sdk-core-protos/build.rs +108 -0
  195. data/bridge/sdk-core/sdk-core-protos/src/constants.rs +7 -0
  196. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +497 -0
  197. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +230 -0
  198. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +1910 -0
  199. data/bridge/sdk-core/sdk-core-protos/src/task_token.rs +38 -0
  200. data/bridge/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  201. data/bridge/sdk-core/test-utils/Cargo.toml +35 -0
  202. data/bridge/sdk-core/test-utils/src/canned_histories.rs +1579 -0
  203. data/bridge/sdk-core/test-utils/src/histfetch.rs +28 -0
  204. data/bridge/sdk-core/test-utils/src/lib.rs +598 -0
  205. data/bridge/sdk-core/tests/integ_tests/client_tests.rs +36 -0
  206. data/bridge/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +128 -0
  207. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +218 -0
  208. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +146 -0
  209. data/bridge/sdk-core/tests/integ_tests/queries_tests.rs +437 -0
  210. data/bridge/sdk-core/tests/integ_tests/visibility_tests.rs +93 -0
  211. data/bridge/sdk-core/tests/integ_tests/workflow_tests/activities.rs +878 -0
  212. data/bridge/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +61 -0
  213. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +59 -0
  214. data/bridge/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +58 -0
  215. data/bridge/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +50 -0
  216. data/bridge/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +60 -0
  217. data/bridge/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +54 -0
  218. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +634 -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 +137 -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 +587 -0
  227. data/bridge/sdk-core/tests/load_tests.rs +191 -0
  228. data/bridge/sdk-core/tests/main.rs +111 -0
  229. data/bridge/sdk-core/tests/runner.rs +93 -0
  230. data/bridge/src/connection.rs +167 -0
  231. data/bridge/src/lib.rs +180 -0
  232. data/bridge/src/runtime.rs +47 -0
  233. data/bridge/src/worker.rs +73 -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 +48 -0
  238. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +67 -0
  239. data/lib/gen/temporal/api/command/v1/message_pb.rb +166 -0
  240. data/lib/gen/temporal/api/common/v1/message_pb.rb +69 -0
  241. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +32 -0
  242. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +26 -0
  243. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +37 -0
  244. data/lib/gen/temporal/api/enums/v1/common_pb.rb +41 -0
  245. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +67 -0
  246. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +71 -0
  247. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +37 -0
  248. data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
  249. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +24 -0
  250. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +28 -0
  251. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
  252. data/lib/gen/temporal/api/enums/v1/update_pb.rb +28 -0
  253. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +89 -0
  254. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +84 -0
  255. data/lib/gen/temporal/api/failure/v1/message_pb.rb +83 -0
  256. data/lib/gen/temporal/api/filter/v1/message_pb.rb +40 -0
  257. data/lib/gen/temporal/api/history/v1/message_pb.rb +489 -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 +125 -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 +128 -0
  264. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +73 -0
  265. data/lib/gen/temporal/api/update/v1/message_pb.rb +26 -0
  266. data/lib/gen/temporal/api/version/v1/message_pb.rb +41 -0
  267. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +110 -0
  268. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +771 -0
  269. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +20 -0
  270. data/lib/gen/temporal/sdk/core/activity_result/activity_result_pb.rb +58 -0
  271. data/lib/gen/temporal/sdk/core/activity_task/activity_task_pb.rb +57 -0
  272. data/lib/gen/temporal/sdk/core/bridge/bridge_pb.rb +222 -0
  273. data/lib/gen/temporal/sdk/core/child_workflow/child_workflow_pb.rb +57 -0
  274. data/lib/gen/temporal/sdk/core/common/common_pb.rb +22 -0
  275. data/lib/gen/temporal/sdk/core/core_interface_pb.rb +34 -0
  276. data/lib/gen/temporal/sdk/core/external_data/external_data_pb.rb +27 -0
  277. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +164 -0
  278. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +192 -0
  279. data/lib/gen/temporal/sdk/core/workflow_completion/workflow_completion_pb.rb +34 -0
  280. data/lib/temporal/bridge.rb +14 -0
  281. data/lib/temporal/client/implementation.rb +339 -0
  282. data/lib/temporal/client/workflow_handle.rb +243 -0
  283. data/lib/temporal/client.rb +144 -0
  284. data/lib/temporal/connection.rb +736 -0
  285. data/lib/temporal/data_converter.rb +150 -0
  286. data/lib/temporal/error/failure.rb +194 -0
  287. data/lib/temporal/error/workflow_failure.rb +17 -0
  288. data/lib/temporal/errors.rb +22 -0
  289. data/lib/temporal/failure_converter/base.rb +26 -0
  290. data/lib/temporal/failure_converter/basic.rb +313 -0
  291. data/lib/temporal/failure_converter.rb +8 -0
  292. data/lib/temporal/interceptor/chain.rb +27 -0
  293. data/lib/temporal/interceptor/client.rb +102 -0
  294. data/lib/temporal/payload_codec/base.rb +32 -0
  295. data/lib/temporal/payload_converter/base.rb +24 -0
  296. data/lib/temporal/payload_converter/bytes.rb +26 -0
  297. data/lib/temporal/payload_converter/composite.rb +47 -0
  298. data/lib/temporal/payload_converter/encoding_base.rb +35 -0
  299. data/lib/temporal/payload_converter/json.rb +25 -0
  300. data/lib/temporal/payload_converter/nil.rb +25 -0
  301. data/lib/temporal/payload_converter.rb +14 -0
  302. data/lib/temporal/retry_policy.rb +82 -0
  303. data/lib/temporal/retry_state.rb +35 -0
  304. data/lib/temporal/runtime.rb +22 -0
  305. data/lib/temporal/timeout_type.rb +29 -0
  306. data/lib/temporal/version.rb +1 -1
  307. data/lib/temporal/workflow/execution_info.rb +54 -0
  308. data/lib/temporal/workflow/execution_status.rb +36 -0
  309. data/lib/temporal/workflow/id_reuse_policy.rb +36 -0
  310. data/lib/temporal/workflow/query_reject_condition.rb +33 -0
  311. data/lib/temporal.rb +4 -0
  312. data/lib/temporalio.rb +3 -1
  313. data/lib/thermite_patch.rb +23 -0
  314. data/temporalio.gemspec +41 -0
  315. metadata +543 -9
  316. data/temporal.gemspec +0 -20
@@ -0,0 +1,931 @@
1
+ //! We need a way to trait-ify the raw grpc client because there is no other way to get the
2
+ //! information we need via interceptors. This module contains the necessary stuff to make that
3
+ //! happen.
4
+
5
+ use crate::{
6
+ metrics::{namespace_kv, task_queue_kv},
7
+ raw::sealed::RawClientLike,
8
+ Client, ConfiguredClient, InterceptedMetricsSvc, RetryClient, TemporalServiceClient,
9
+ LONG_POLL_TIMEOUT,
10
+ };
11
+ use futures::{future::BoxFuture, FutureExt, TryFutureExt};
12
+ use temporal_sdk_core_protos::{
13
+ grpc::health::v1::{health_client::HealthClient, *},
14
+ temporal::api::{
15
+ operatorservice::v1::{operator_service_client::OperatorServiceClient, *},
16
+ taskqueue::v1::TaskQueue,
17
+ testservice::v1::{test_service_client::TestServiceClient, *},
18
+ workflowservice::v1::{workflow_service_client::WorkflowServiceClient, *},
19
+ },
20
+ };
21
+ use tonic::{
22
+ body::BoxBody, client::GrpcService, metadata::KeyAndValueRef, Request, Response, Status,
23
+ };
24
+
25
+ pub(super) mod sealed {
26
+ use super::*;
27
+
28
+ /// Something that has a workflow service client
29
+ #[async_trait::async_trait]
30
+ pub trait RawClientLike: Send {
31
+ type SvcType: Send + Sync + Clone + 'static;
32
+
33
+ /// Return the workflow service client instance
34
+ fn workflow_client(&mut self) -> &mut WorkflowServiceClient<Self::SvcType>;
35
+
36
+ /// Return the operator service client instance
37
+ fn operator_client(&mut self) -> &mut OperatorServiceClient<Self::SvcType>;
38
+
39
+ /// Return the test service client instance
40
+ fn test_client(&mut self) -> &mut TestServiceClient<Self::SvcType>;
41
+
42
+ /// Return the health service client instance
43
+ fn health_client(&mut self) -> &mut HealthClient<Self::SvcType>;
44
+
45
+ async fn call<F, Req, Resp>(
46
+ &mut self,
47
+ _call_name: &'static str,
48
+ mut callfn: F,
49
+ req: Request<Req>,
50
+ ) -> Result<Response<Resp>, Status>
51
+ where
52
+ Req: Clone + Unpin + Send + Sync + 'static,
53
+ F: FnMut(&mut Self, Request<Req>) -> BoxFuture<'static, Result<Response<Resp>, Status>>,
54
+ F: Send + Sync + Unpin + 'static,
55
+ {
56
+ callfn(self, req).await
57
+ }
58
+ }
59
+ }
60
+
61
+ // Here we implement retry on anything that is already RawClientLike
62
+ #[async_trait::async_trait]
63
+ impl<RC, T> RawClientLike for RetryClient<RC>
64
+ where
65
+ RC: RawClientLike<SvcType = T> + 'static,
66
+ T: Send + Sync + Clone + 'static,
67
+ {
68
+ type SvcType = T;
69
+
70
+ fn workflow_client(&mut self) -> &mut WorkflowServiceClient<Self::SvcType> {
71
+ self.get_client_mut().workflow_client()
72
+ }
73
+
74
+ fn operator_client(&mut self) -> &mut OperatorServiceClient<Self::SvcType> {
75
+ self.get_client_mut().operator_client()
76
+ }
77
+
78
+ fn test_client(&mut self) -> &mut TestServiceClient<Self::SvcType> {
79
+ self.get_client_mut().test_client()
80
+ }
81
+
82
+ fn health_client(&mut self) -> &mut HealthClient<Self::SvcType> {
83
+ self.get_client_mut().health_client()
84
+ }
85
+
86
+ async fn call<F, Req, Resp>(
87
+ &mut self,
88
+ call_name: &'static str,
89
+ mut callfn: F,
90
+ req: Request<Req>,
91
+ ) -> Result<Response<Resp>, Status>
92
+ where
93
+ Req: Clone + Unpin + Send + Sync + 'static,
94
+ F: FnMut(&mut Self, Request<Req>) -> BoxFuture<'static, Result<Response<Resp>, Status>>,
95
+ F: Send + Sync + Unpin + 'static,
96
+ {
97
+ let rtc = self.get_retry_config(call_name);
98
+ let fact = || {
99
+ let req_clone = req_cloner(&req);
100
+ callfn(self, req_clone)
101
+ };
102
+ let res = Self::make_future_retry(rtc, fact, call_name);
103
+ res.map_err(|(e, _attempt)| e).map_ok(|x| x.0).await
104
+ }
105
+ }
106
+
107
+ impl<T> RawClientLike for TemporalServiceClient<T>
108
+ where
109
+ T: Send + Sync + Clone + 'static,
110
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
111
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
112
+ T::Error: Into<tonic::codegen::StdError>,
113
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
114
+ {
115
+ type SvcType = T;
116
+
117
+ fn workflow_client(&mut self) -> &mut WorkflowServiceClient<Self::SvcType> {
118
+ self.workflow_svc_mut()
119
+ }
120
+
121
+ fn operator_client(&mut self) -> &mut OperatorServiceClient<Self::SvcType> {
122
+ self.operator_svc_mut()
123
+ }
124
+
125
+ fn test_client(&mut self) -> &mut TestServiceClient<Self::SvcType> {
126
+ self.test_svc_mut()
127
+ }
128
+
129
+ fn health_client(&mut self) -> &mut HealthClient<Self::SvcType> {
130
+ self.health_svc_mut()
131
+ }
132
+ }
133
+
134
+ impl<T> RawClientLike for ConfiguredClient<TemporalServiceClient<T>>
135
+ where
136
+ T: Send + Sync + Clone + 'static,
137
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
138
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
139
+ T::Error: Into<tonic::codegen::StdError>,
140
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
141
+ {
142
+ type SvcType = T;
143
+
144
+ fn workflow_client(&mut self) -> &mut WorkflowServiceClient<Self::SvcType> {
145
+ self.client.workflow_client()
146
+ }
147
+
148
+ fn operator_client(&mut self) -> &mut OperatorServiceClient<Self::SvcType> {
149
+ self.client.operator_client()
150
+ }
151
+
152
+ fn test_client(&mut self) -> &mut TestServiceClient<Self::SvcType> {
153
+ self.client.test_client()
154
+ }
155
+
156
+ fn health_client(&mut self) -> &mut HealthClient<Self::SvcType> {
157
+ self.client.health_client()
158
+ }
159
+ }
160
+
161
+ impl RawClientLike for Client {
162
+ type SvcType = InterceptedMetricsSvc;
163
+
164
+ fn workflow_client(&mut self) -> &mut WorkflowServiceClient<Self::SvcType> {
165
+ self.inner.workflow_client()
166
+ }
167
+
168
+ fn operator_client(&mut self) -> &mut OperatorServiceClient<Self::SvcType> {
169
+ self.inner.operator_client()
170
+ }
171
+
172
+ fn test_client(&mut self) -> &mut TestServiceClient<Self::SvcType> {
173
+ self.inner.test_client()
174
+ }
175
+
176
+ fn health_client(&mut self) -> &mut HealthClient<Self::SvcType> {
177
+ self.inner.health_client()
178
+ }
179
+ }
180
+
181
+ /// Helper for cloning a tonic request as long as the inner message may be cloned.
182
+ /// We drop extensions, so, lang bridges can't pass those in :shrug:
183
+ fn req_cloner<T: Clone>(cloneme: &Request<T>) -> Request<T> {
184
+ let msg = cloneme.get_ref().clone();
185
+ let mut new_req = Request::new(msg);
186
+ let new_met = new_req.metadata_mut();
187
+ for kv in cloneme.metadata().iter() {
188
+ match kv {
189
+ KeyAndValueRef::Ascii(k, v) => {
190
+ new_met.insert(k, v.clone());
191
+ }
192
+ KeyAndValueRef::Binary(k, v) => {
193
+ new_met.insert_bin(k, v.clone());
194
+ }
195
+ }
196
+ }
197
+ new_req
198
+ }
199
+
200
+ #[derive(Debug)]
201
+ pub(super) struct AttachMetricLabels {
202
+ pub(super) labels: Vec<opentelemetry::KeyValue>,
203
+ }
204
+ impl AttachMetricLabels {
205
+ pub fn new(kvs: impl Into<Vec<opentelemetry::KeyValue>>) -> Self {
206
+ Self { labels: kvs.into() }
207
+ }
208
+ pub fn namespace(ns: impl Into<String>) -> Self {
209
+ AttachMetricLabels::new(vec![namespace_kv(ns.into())])
210
+ }
211
+ pub fn task_q(&mut self, tq: Option<TaskQueue>) -> &mut Self {
212
+ if let Some(tq) = tq {
213
+ self.task_q_str(tq.name);
214
+ }
215
+ self
216
+ }
217
+ pub fn task_q_str(&mut self, tq: impl Into<String>) -> &mut Self {
218
+ self.labels.push(task_queue_kv(tq.into()));
219
+ self
220
+ }
221
+ }
222
+
223
+ // Blanket impl the trait for all raw-client-like things. Since the trait default-implements
224
+ // everything, there's nothing to actually implement.
225
+ impl<RC, T> WorkflowService for RC
226
+ where
227
+ RC: RawClientLike<SvcType = T>,
228
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
229
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
230
+ T::Error: Into<tonic::codegen::StdError>,
231
+ T::Future: Send,
232
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
233
+ {
234
+ }
235
+ impl<RC, T> OperatorService for RC
236
+ where
237
+ RC: RawClientLike<SvcType = T>,
238
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
239
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
240
+ T::Error: Into<tonic::codegen::StdError>,
241
+ T::Future: Send,
242
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
243
+ {
244
+ }
245
+ impl<RC, T> TestService for RC
246
+ where
247
+ RC: RawClientLike<SvcType = T>,
248
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
249
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
250
+ T::Error: Into<tonic::codegen::StdError>,
251
+ T::Future: Send,
252
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
253
+ {
254
+ }
255
+ impl<RC, T> HealthService for RC
256
+ where
257
+ RC: RawClientLike<SvcType = T>,
258
+ T: GrpcService<BoxBody> + Send + Clone + 'static,
259
+ T::ResponseBody: tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
260
+ T::Error: Into<tonic::codegen::StdError>,
261
+ T::Future: Send,
262
+ <T::ResponseBody as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
263
+ {
264
+ }
265
+
266
+ /// Helps re-declare gRPC client methods
267
+ macro_rules! proxy {
268
+ ($client_type:tt, $client_meth:ident, $method:ident, $req:ty, $resp:ty $(, $closure:expr)?) => {
269
+ #[doc = concat!("See [", stringify!($client_type), "::", stringify!($method), "]")]
270
+ fn $method(
271
+ &mut self,
272
+ request: impl tonic::IntoRequest<$req>,
273
+ ) -> BoxFuture<Result<tonic::Response<$resp>, tonic::Status>> {
274
+ #[allow(unused_mut)]
275
+ let fact = |c: &mut Self, mut req: tonic::Request<$req>| {
276
+ $( type_closure_arg(&mut req, $closure); )*
277
+ let mut c = c.$client_meth().clone();
278
+ async move { c.$method(req).await }.boxed()
279
+ };
280
+ self.call(stringify!($method), fact, request.into_request())
281
+ }
282
+ };
283
+ }
284
+ macro_rules! proxier {
285
+ ( $trait_name:ident; $impl_list_name:ident; $client_type:tt; $client_meth:ident;
286
+ $(($method:ident, $req:ty, $resp:ty $(, $closure:expr)? );)* ) => {
287
+ #[cfg(test)]
288
+ const $impl_list_name: &'static [&'static str] = &[$(stringify!($method)),*];
289
+ /// Trait version of the generated client with modifications to attach appropriate metric
290
+ /// labels or whatever else to requests
291
+ pub trait $trait_name: RawClientLike
292
+ where
293
+ // Yo this is wild
294
+ <Self as RawClientLike>::SvcType: GrpcService<BoxBody> + Send + Clone + 'static,
295
+ <<Self as RawClientLike>::SvcType as GrpcService<BoxBody>>::ResponseBody:
296
+ tonic::codegen::Body<Data = tonic::codegen::Bytes> + Send + 'static,
297
+ <<Self as RawClientLike>::SvcType as GrpcService<BoxBody>>::Error:
298
+ Into<tonic::codegen::StdError>,
299
+ <<Self as RawClientLike>::SvcType as GrpcService<BoxBody>>::Future: Send,
300
+ <<<Self as RawClientLike>::SvcType as GrpcService<BoxBody>>::ResponseBody
301
+ as tonic::codegen::Body>::Error: Into<tonic::codegen::StdError> + Send,
302
+ {
303
+ $(
304
+ proxy!($client_type, $client_meth, $method, $req, $resp $(,$closure)*);
305
+ )*
306
+ }
307
+ };
308
+ }
309
+
310
+ // Nice little trick to avoid the callsite asking to type the closure parameter
311
+ fn type_closure_arg<T, R>(arg: T, f: impl FnOnce(T) -> R) -> R {
312
+ f(arg)
313
+ }
314
+
315
+ proxier! {
316
+ WorkflowService; ALL_IMPLEMENTED_WORKFLOW_SERVICE_RPCS; WorkflowServiceClient; workflow_client;
317
+ (
318
+ register_namespace,
319
+ RegisterNamespaceRequest,
320
+ RegisterNamespaceResponse,
321
+ |r| {
322
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
323
+ r.extensions_mut().insert(labels);
324
+ }
325
+ );
326
+ (
327
+ describe_namespace,
328
+ DescribeNamespaceRequest,
329
+ DescribeNamespaceResponse,
330
+ |r| {
331
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
332
+ r.extensions_mut().insert(labels);
333
+ }
334
+ );
335
+ (
336
+ list_namespaces,
337
+ ListNamespacesRequest,
338
+ ListNamespacesResponse
339
+ );
340
+ (
341
+ update_namespace,
342
+ UpdateNamespaceRequest,
343
+ UpdateNamespaceResponse,
344
+ |r| {
345
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
346
+ r.extensions_mut().insert(labels);
347
+ }
348
+ );
349
+ (
350
+ deprecate_namespace,
351
+ DeprecateNamespaceRequest,
352
+ DeprecateNamespaceResponse,
353
+ |r| {
354
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
355
+ r.extensions_mut().insert(labels);
356
+ }
357
+ );
358
+ (
359
+ start_workflow_execution,
360
+ StartWorkflowExecutionRequest,
361
+ StartWorkflowExecutionResponse,
362
+ |r| {
363
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
364
+ labels.task_q(r.get_ref().task_queue.clone());
365
+ r.extensions_mut().insert(labels);
366
+ }
367
+ );
368
+ (
369
+ get_workflow_execution_history,
370
+ GetWorkflowExecutionHistoryRequest,
371
+ GetWorkflowExecutionHistoryResponse,
372
+ |r| {
373
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
374
+ r.extensions_mut().insert(labels);
375
+ }
376
+ );
377
+ (
378
+ get_workflow_execution_history_reverse,
379
+ GetWorkflowExecutionHistoryReverseRequest,
380
+ GetWorkflowExecutionHistoryReverseResponse,
381
+ |r| {
382
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
383
+ r.extensions_mut().insert(labels);
384
+ }
385
+ );
386
+ (
387
+ poll_workflow_task_queue,
388
+ PollWorkflowTaskQueueRequest,
389
+ PollWorkflowTaskQueueResponse,
390
+ |r| {
391
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
392
+ labels.task_q(r.get_ref().task_queue.clone());
393
+ r.extensions_mut().insert(labels);
394
+ r.set_timeout(LONG_POLL_TIMEOUT);
395
+ }
396
+ );
397
+ (
398
+ respond_workflow_task_completed,
399
+ RespondWorkflowTaskCompletedRequest,
400
+ RespondWorkflowTaskCompletedResponse,
401
+ |r| {
402
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
403
+ r.extensions_mut().insert(labels);
404
+ }
405
+ );
406
+ (
407
+ respond_workflow_task_failed,
408
+ RespondWorkflowTaskFailedRequest,
409
+ RespondWorkflowTaskFailedResponse,
410
+ |r| {
411
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
412
+ r.extensions_mut().insert(labels);
413
+ }
414
+ );
415
+ (
416
+ poll_activity_task_queue,
417
+ PollActivityTaskQueueRequest,
418
+ PollActivityTaskQueueResponse,
419
+ |r| {
420
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
421
+ labels.task_q(r.get_ref().task_queue.clone());
422
+ r.extensions_mut().insert(labels);
423
+ r.set_timeout(LONG_POLL_TIMEOUT);
424
+ }
425
+ );
426
+ (
427
+ record_activity_task_heartbeat,
428
+ RecordActivityTaskHeartbeatRequest,
429
+ RecordActivityTaskHeartbeatResponse,
430
+ |r| {
431
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
432
+ r.extensions_mut().insert(labels);
433
+ }
434
+ );
435
+ (
436
+ record_activity_task_heartbeat_by_id,
437
+ RecordActivityTaskHeartbeatByIdRequest,
438
+ RecordActivityTaskHeartbeatByIdResponse,
439
+ |r| {
440
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
441
+ r.extensions_mut().insert(labels);
442
+ }
443
+ );
444
+ (
445
+ respond_activity_task_completed,
446
+ RespondActivityTaskCompletedRequest,
447
+ RespondActivityTaskCompletedResponse,
448
+ |r| {
449
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
450
+ r.extensions_mut().insert(labels);
451
+ }
452
+ );
453
+ (
454
+ respond_activity_task_completed_by_id,
455
+ RespondActivityTaskCompletedByIdRequest,
456
+ RespondActivityTaskCompletedByIdResponse,
457
+ |r| {
458
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
459
+ r.extensions_mut().insert(labels);
460
+ }
461
+ );
462
+
463
+ (
464
+ respond_activity_task_failed,
465
+ RespondActivityTaskFailedRequest,
466
+ RespondActivityTaskFailedResponse,
467
+ |r| {
468
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
469
+ r.extensions_mut().insert(labels);
470
+ }
471
+ );
472
+ (
473
+ respond_activity_task_failed_by_id,
474
+ RespondActivityTaskFailedByIdRequest,
475
+ RespondActivityTaskFailedByIdResponse,
476
+ |r| {
477
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
478
+ r.extensions_mut().insert(labels);
479
+ }
480
+ );
481
+ (
482
+ respond_activity_task_canceled,
483
+ RespondActivityTaskCanceledRequest,
484
+ RespondActivityTaskCanceledResponse,
485
+ |r| {
486
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
487
+ r.extensions_mut().insert(labels);
488
+ }
489
+ );
490
+ (
491
+ respond_activity_task_canceled_by_id,
492
+ RespondActivityTaskCanceledByIdRequest,
493
+ RespondActivityTaskCanceledByIdResponse,
494
+ |r| {
495
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
496
+ r.extensions_mut().insert(labels);
497
+ }
498
+ );
499
+ (
500
+ request_cancel_workflow_execution,
501
+ RequestCancelWorkflowExecutionRequest,
502
+ RequestCancelWorkflowExecutionResponse,
503
+ |r| {
504
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
505
+ r.extensions_mut().insert(labels);
506
+ }
507
+ );
508
+ (
509
+ signal_workflow_execution,
510
+ SignalWorkflowExecutionRequest,
511
+ SignalWorkflowExecutionResponse,
512
+ |r| {
513
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
514
+ r.extensions_mut().insert(labels);
515
+ }
516
+ );
517
+ (
518
+ signal_with_start_workflow_execution,
519
+ SignalWithStartWorkflowExecutionRequest,
520
+ SignalWithStartWorkflowExecutionResponse,
521
+ |r| {
522
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
523
+ labels.task_q(r.get_ref().task_queue.clone());
524
+ r.extensions_mut().insert(labels);
525
+ }
526
+ );
527
+ (
528
+ reset_workflow_execution,
529
+ ResetWorkflowExecutionRequest,
530
+ ResetWorkflowExecutionResponse,
531
+ |r| {
532
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
533
+ r.extensions_mut().insert(labels);
534
+ }
535
+ );
536
+ (
537
+ terminate_workflow_execution,
538
+ TerminateWorkflowExecutionRequest,
539
+ TerminateWorkflowExecutionResponse,
540
+ |r| {
541
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
542
+ r.extensions_mut().insert(labels);
543
+ }
544
+ );
545
+ (
546
+ list_open_workflow_executions,
547
+ ListOpenWorkflowExecutionsRequest,
548
+ ListOpenWorkflowExecutionsResponse,
549
+ |r| {
550
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
551
+ r.extensions_mut().insert(labels);
552
+ }
553
+ );
554
+ (
555
+ list_closed_workflow_executions,
556
+ ListClosedWorkflowExecutionsRequest,
557
+ ListClosedWorkflowExecutionsResponse,
558
+ |r| {
559
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
560
+ r.extensions_mut().insert(labels);
561
+ }
562
+ );
563
+ (
564
+ list_workflow_executions,
565
+ ListWorkflowExecutionsRequest,
566
+ ListWorkflowExecutionsResponse,
567
+ |r| {
568
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
569
+ r.extensions_mut().insert(labels);
570
+ }
571
+ );
572
+ (
573
+ list_archived_workflow_executions,
574
+ ListArchivedWorkflowExecutionsRequest,
575
+ ListArchivedWorkflowExecutionsResponse,
576
+ |r| {
577
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
578
+ r.extensions_mut().insert(labels);
579
+ }
580
+ );
581
+ (
582
+ scan_workflow_executions,
583
+ ScanWorkflowExecutionsRequest,
584
+ ScanWorkflowExecutionsResponse,
585
+ |r| {
586
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
587
+ r.extensions_mut().insert(labels);
588
+ }
589
+ );
590
+ (
591
+ count_workflow_executions,
592
+ CountWorkflowExecutionsRequest,
593
+ CountWorkflowExecutionsResponse,
594
+ |r| {
595
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
596
+ r.extensions_mut().insert(labels);
597
+ }
598
+ );
599
+ (
600
+ get_search_attributes,
601
+ GetSearchAttributesRequest,
602
+ GetSearchAttributesResponse
603
+ );
604
+ (
605
+ respond_query_task_completed,
606
+ RespondQueryTaskCompletedRequest,
607
+ RespondQueryTaskCompletedResponse,
608
+ |r| {
609
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
610
+ r.extensions_mut().insert(labels);
611
+ }
612
+ );
613
+ (
614
+ reset_sticky_task_queue,
615
+ ResetStickyTaskQueueRequest,
616
+ ResetStickyTaskQueueResponse,
617
+ |r| {
618
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
619
+ r.extensions_mut().insert(labels);
620
+ }
621
+ );
622
+ (
623
+ query_workflow,
624
+ QueryWorkflowRequest,
625
+ QueryWorkflowResponse,
626
+ |r| {
627
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
628
+ r.extensions_mut().insert(labels);
629
+ }
630
+ );
631
+ (
632
+ describe_workflow_execution,
633
+ DescribeWorkflowExecutionRequest,
634
+ DescribeWorkflowExecutionResponse,
635
+ |r| {
636
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
637
+ r.extensions_mut().insert(labels);
638
+ }
639
+ );
640
+ (
641
+ describe_task_queue,
642
+ DescribeTaskQueueRequest,
643
+ DescribeTaskQueueResponse,
644
+ |r| {
645
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
646
+ labels.task_q(r.get_ref().task_queue.clone());
647
+ r.extensions_mut().insert(labels);
648
+ }
649
+ );
650
+ (
651
+ get_cluster_info,
652
+ GetClusterInfoRequest,
653
+ GetClusterInfoResponse
654
+ );
655
+ (
656
+ get_system_info,
657
+ GetSystemInfoRequest,
658
+ GetSystemInfoResponse
659
+ );
660
+ (
661
+ list_task_queue_partitions,
662
+ ListTaskQueuePartitionsRequest,
663
+ ListTaskQueuePartitionsResponse,
664
+ |r| {
665
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
666
+ labels.task_q(r.get_ref().task_queue.clone());
667
+ r.extensions_mut().insert(labels);
668
+ }
669
+ );
670
+ (
671
+ create_schedule,
672
+ CreateScheduleRequest,
673
+ CreateScheduleResponse,
674
+ |r| {
675
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
676
+ r.extensions_mut().insert(labels);
677
+ }
678
+ );
679
+ (
680
+ describe_schedule,
681
+ DescribeScheduleRequest,
682
+ DescribeScheduleResponse,
683
+ |r| {
684
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
685
+ r.extensions_mut().insert(labels);
686
+ }
687
+ );
688
+ (
689
+ update_schedule,
690
+ UpdateScheduleRequest,
691
+ UpdateScheduleResponse,
692
+ |r| {
693
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
694
+ r.extensions_mut().insert(labels);
695
+ }
696
+ );
697
+ (
698
+ patch_schedule,
699
+ PatchScheduleRequest,
700
+ PatchScheduleResponse,
701
+ |r| {
702
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
703
+ r.extensions_mut().insert(labels);
704
+ }
705
+ );
706
+ (
707
+ list_schedule_matching_times,
708
+ ListScheduleMatchingTimesRequest,
709
+ ListScheduleMatchingTimesResponse,
710
+ |r| {
711
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
712
+ r.extensions_mut().insert(labels);
713
+ }
714
+ );
715
+ (
716
+ delete_schedule,
717
+ DeleteScheduleRequest,
718
+ DeleteScheduleResponse,
719
+ |r| {
720
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
721
+ r.extensions_mut().insert(labels);
722
+ }
723
+ );
724
+ (
725
+ list_schedules,
726
+ ListSchedulesRequest,
727
+ ListSchedulesResponse,
728
+ |r| {
729
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
730
+ r.extensions_mut().insert(labels);
731
+ }
732
+ );
733
+ (
734
+ update_worker_build_id_ordering,
735
+ UpdateWorkerBuildIdOrderingRequest,
736
+ UpdateWorkerBuildIdOrderingResponse,
737
+ |r| {
738
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
739
+ labels.task_q_str(r.get_ref().task_queue.clone());
740
+ r.extensions_mut().insert(labels);
741
+ }
742
+ );
743
+ (
744
+ get_worker_build_id_ordering,
745
+ GetWorkerBuildIdOrderingRequest,
746
+ GetWorkerBuildIdOrderingResponse,
747
+ |r| {
748
+ let mut labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
749
+ labels.task_q_str(r.get_ref().task_queue.clone());
750
+ r.extensions_mut().insert(labels);
751
+ }
752
+ );
753
+ (
754
+ update_workflow,
755
+ UpdateWorkflowRequest,
756
+ UpdateWorkflowResponse,
757
+ |r| {
758
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
759
+ r.extensions_mut().insert(labels);
760
+ }
761
+ );
762
+ (
763
+ start_batch_operation,
764
+ StartBatchOperationRequest,
765
+ StartBatchOperationResponse,
766
+ |r| {
767
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
768
+ r.extensions_mut().insert(labels);
769
+ }
770
+ );
771
+ (
772
+ stop_batch_operation,
773
+ StopBatchOperationRequest,
774
+ StopBatchOperationResponse,
775
+ |r| {
776
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
777
+ r.extensions_mut().insert(labels);
778
+ }
779
+ );
780
+ (
781
+ describe_batch_operation,
782
+ DescribeBatchOperationRequest,
783
+ DescribeBatchOperationResponse,
784
+ |r| {
785
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
786
+ r.extensions_mut().insert(labels);
787
+ }
788
+ );
789
+ (
790
+ list_batch_operations,
791
+ ListBatchOperationsRequest,
792
+ ListBatchOperationsResponse,
793
+ |r| {
794
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
795
+ r.extensions_mut().insert(labels);
796
+ }
797
+ );
798
+ }
799
+
800
+ proxier! {
801
+ OperatorService; ALL_IMPLEMENTED_OPERATOR_SERVICE_RPCS; OperatorServiceClient; operator_client;
802
+ (add_search_attributes, AddSearchAttributesRequest, AddSearchAttributesResponse);
803
+ (remove_search_attributes, RemoveSearchAttributesRequest, RemoveSearchAttributesResponse);
804
+ (list_search_attributes, ListSearchAttributesRequest, ListSearchAttributesResponse);
805
+ (delete_namespace, DeleteNamespaceRequest, DeleteNamespaceResponse,
806
+ |r| {
807
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
808
+ r.extensions_mut().insert(labels);
809
+ }
810
+ );
811
+ (delete_workflow_execution, DeleteWorkflowExecutionRequest, DeleteWorkflowExecutionResponse,
812
+ |r| {
813
+ let labels = AttachMetricLabels::namespace(r.get_ref().namespace.clone());
814
+ r.extensions_mut().insert(labels);
815
+ }
816
+ );
817
+ (add_or_update_remote_cluster, AddOrUpdateRemoteClusterRequest, AddOrUpdateRemoteClusterResponse);
818
+ (remove_remote_cluster, RemoveRemoteClusterRequest, RemoveRemoteClusterResponse);
819
+ (describe_cluster, DescribeClusterRequest, DescribeClusterResponse);
820
+ (list_clusters, ListClustersRequest, ListClustersResponse);
821
+ (list_cluster_members, ListClusterMembersRequest, ListClusterMembersResponse);
822
+ }
823
+
824
+ proxier! {
825
+ TestService; ALL_IMPLEMENTED_TEST_SERVICE_RPCS; TestServiceClient; test_client;
826
+ (lock_time_skipping, LockTimeSkippingRequest, LockTimeSkippingResponse);
827
+ (unlock_time_skipping, UnlockTimeSkippingRequest, UnlockTimeSkippingResponse);
828
+ (sleep, SleepRequest, SleepResponse);
829
+ (sleep_until, SleepUntilRequest, SleepResponse);
830
+ (unlock_time_skipping_with_sleep, SleepRequest, SleepResponse);
831
+ (get_current_time, (), GetCurrentTimeResponse);
832
+ }
833
+
834
+ proxier! {
835
+ HealthService; ALL_IMPLEMENTED_HEALTH_SERVICE_RPCS; HealthClient; health_client;
836
+ (check, HealthCheckRequest, HealthCheckResponse);
837
+ (watch, HealthCheckRequest, tonic::codec::Streaming<HealthCheckResponse>);
838
+ }
839
+
840
+ #[cfg(test)]
841
+ mod tests {
842
+ use super::*;
843
+ use crate::{ClientOptionsBuilder, RetryClient};
844
+ use std::collections::HashSet;
845
+ use temporal_sdk_core_protos::temporal::api::{
846
+ operatorservice::v1::DeleteNamespaceRequest, workflowservice::v1::ListNamespacesRequest,
847
+ };
848
+
849
+ // Just to help make sure some stuff compiles. Not run.
850
+ #[allow(dead_code)]
851
+ async fn raw_client_retry_compiles() {
852
+ let opts = ClientOptionsBuilder::default().build().unwrap();
853
+ let raw_client = opts.connect_no_namespace(None, None).await.unwrap();
854
+ let mut retry_client = RetryClient::new(raw_client, opts.retry_config);
855
+
856
+ let list_ns_req = ListNamespacesRequest::default();
857
+ let fact = |c: &mut RetryClient<_>, req| {
858
+ let mut c = c.workflow_client().clone();
859
+ async move { c.list_namespaces(req).await }.boxed()
860
+ };
861
+ retry_client
862
+ .call("whatever", fact, Request::new(list_ns_req.clone()))
863
+ .await
864
+ .unwrap();
865
+
866
+ // Operator svc method
867
+ let del_ns_req = DeleteNamespaceRequest::default();
868
+ let fact = |c: &mut RetryClient<_>, req| {
869
+ let mut c = c.operator_client().clone();
870
+ async move { c.delete_namespace(req).await }.boxed()
871
+ };
872
+ retry_client
873
+ .call("whatever", fact, Request::new(del_ns_req.clone()))
874
+ .await
875
+ .unwrap();
876
+
877
+ // Verify calling through traits works
878
+ retry_client.list_namespaces(list_ns_req).await.unwrap();
879
+ retry_client.delete_namespace(del_ns_req).await.unwrap();
880
+ retry_client.get_current_time(()).await.unwrap();
881
+ retry_client
882
+ .check(HealthCheckRequest::default())
883
+ .await
884
+ .unwrap();
885
+ }
886
+
887
+ fn verify_methods(proto_def_str: &str, impl_list: &[&str]) {
888
+ let methods: Vec<_> = proto_def_str
889
+ .lines()
890
+ .map(|l| l.trim())
891
+ .filter(|l| l.starts_with("rpc"))
892
+ .map(|l| {
893
+ let stripped = l.strip_prefix("rpc ").unwrap();
894
+ (stripped[..stripped.find('(').unwrap()]).trim()
895
+ })
896
+ .collect();
897
+ let no_underscores: HashSet<_> = impl_list.iter().map(|x| x.replace('_', "")).collect();
898
+ for method in methods {
899
+ if !no_underscores.contains(&method.to_lowercase()) {
900
+ panic!("RPC method {} is not implemented by raw client", method)
901
+ }
902
+ }
903
+ }
904
+ #[test]
905
+ fn verify_all_workflow_service_methods_implemented() {
906
+ // This is less work than trying to hook into the codegen process
907
+ let proto_def =
908
+ include_str!("../../protos/api_upstream/temporal/api/workflowservice/v1/service.proto");
909
+ verify_methods(proto_def, ALL_IMPLEMENTED_WORKFLOW_SERVICE_RPCS);
910
+ }
911
+
912
+ #[test]
913
+ fn verify_all_operator_service_methods_implemented() {
914
+ let proto_def =
915
+ include_str!("../../protos/api_upstream/temporal/api/operatorservice/v1/service.proto");
916
+ verify_methods(proto_def, ALL_IMPLEMENTED_OPERATOR_SERVICE_RPCS);
917
+ }
918
+
919
+ #[test]
920
+ fn verify_all_test_service_methods_implemented() {
921
+ let proto_def =
922
+ include_str!("../../protos/testsrv_upstream/temporal/api/testservice/v1/service.proto");
923
+ verify_methods(proto_def, ALL_IMPLEMENTED_TEST_SERVICE_RPCS);
924
+ }
925
+
926
+ #[test]
927
+ fn verify_all_health_service_methods_implemented() {
928
+ let proto_def = include_str!("../../protos/grpc/health/v1/health.proto");
929
+ verify_methods(proto_def, ALL_IMPLEMENTED_HEALTH_SERVICE_RPCS);
930
+ }
931
+ }