temporalio 0.0.0 → 0.0.2

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 (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,51 @@
1
+ module Temporalio
2
+ class Worker
3
+ # A generic fixed thread pool.
4
+ #
5
+ # This is used to execute multiple activities concurrently and independenty of each other.
6
+ #
7
+ # @note This is a fixed thread pool that allocated threads eagerly and has an infinite buffer.
8
+ class ThreadPoolExecutor
9
+ # Generate new thread pool executor.
10
+ #
11
+ # @param size [Integer] Number of concurrently executing threads.
12
+ def initialize(size)
13
+ @queue = Queue.new
14
+ @pool = Array.new(size) do
15
+ Thread.new { poll }
16
+ end
17
+ end
18
+
19
+ # Execute a block of code inside of the threads.
20
+ #
21
+ # @yield Block of code to be executed.
22
+ def schedule(&block)
23
+ queue << block
24
+ end
25
+
26
+ # Stop the thread pool and wait for all threads to finish work.
27
+ def shutdown
28
+ pool.size.times do
29
+ schedule { throw EXIT_SYMBOL }
30
+ end
31
+
32
+ pool.each(&:join)
33
+ end
34
+
35
+ private
36
+
37
+ attr_reader :queue, :pool
38
+
39
+ EXIT_SYMBOL = :exit
40
+
41
+ def poll
42
+ catch(EXIT_SYMBOL) do
43
+ loop do
44
+ job = queue.pop
45
+ job.call
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,198 @@
1
+ require 'async'
2
+ require 'temporalio/bridge'
3
+ require 'temporalio/data_converter'
4
+ require 'temporalio/runtime'
5
+ require 'temporalio/worker/activity_worker'
6
+ require 'temporalio/worker/runner'
7
+ require 'temporalio/worker/thread_pool_executor'
8
+
9
+ module Temporalio
10
+ # Worker to process workflows and/or activities.
11
+ #
12
+ # Once created, workers can be run and shutdown explicitly via {#run} and {#shutdown}.
13
+ class Worker
14
+ # Run multiple workers and wait for them to be shut down.
15
+ #
16
+ # This will not return until shutdown is complete (and all running activities in all workers
17
+ # finished) and will raise if any of the workers raises a fatal error.
18
+ #
19
+ # @param workers [Array<Temporalio::Worker>] A list of the workers to be run.
20
+ # @param shutdown_signals [Array<String>] A list of process signals for the worker to stop on.
21
+ # This argument can not be used with a custom block.
22
+ #
23
+ # @yield Optionally you can provide a block by the end of which all the workers will be shut
24
+ # down. Any errors raised from this block will be re-raised by this method.
25
+ def self.run(*workers, shutdown_signals: [], &block)
26
+ unless shutdown_signals.empty?
27
+ if block
28
+ raise ArgumentError, 'Temporalio::Worker.run accepts :shutdown_signals or a block, but not both'
29
+ end
30
+
31
+ signal_queue = Queue.new
32
+
33
+ shutdown_signals.each do |signal|
34
+ Signal.trap(signal) { signal_queue.close }
35
+ end
36
+
37
+ block = -> { signal_queue.pop }
38
+ end
39
+
40
+ Runner.new(*workers).run(&block)
41
+ end
42
+
43
+ # Create a worker to process workflows and/or activities.
44
+ #
45
+ # @param connection [Temporalio::Connection] A connection to be used for this worker.
46
+ # @param namespace [String] A namespace.
47
+ # @param task_queue [String] A task queue.
48
+ # @param activities [Array<Class>] A list of activities (subclasses of {Temporalio::Activity}).
49
+ # @param data_converter [Temporalio::DataConverter] Data converter to use for all data conversions
50
+ # to/from payloads.
51
+ # @param activity_executor [ThreadPoolExecutor] Concurrent executor for all activities. Defaults
52
+ # to a {ThreadPoolExecutor} with `:max_concurrent_activities` available threads.
53
+ # @param max_concurrent_activities [Integer] Number of concurrently running activities.
54
+ # @param graceful_shutdown_timeout [Integer] Amount of time (in seconds) activities are given
55
+ # after a shutdown to complete before they are cancelled. A default value of `nil` means that
56
+ # activities are never cancelled when handling a shutdown.
57
+ #
58
+ # @raise [ArgumentError] When no activities or workflows have been provided.
59
+ def initialize(
60
+ connection,
61
+ namespace,
62
+ task_queue,
63
+ activities: [],
64
+ data_converter: Temporalio::DataConverter.new,
65
+ activity_executor: nil,
66
+ max_concurrent_activities: 100,
67
+ graceful_shutdown_timeout: nil
68
+ )
69
+ # TODO: Add worker interceptors
70
+ @started = false
71
+ @shutdown = false
72
+ @mutex = Mutex.new
73
+ @runtime = Temporalio::Runtime.instance
74
+ @activity_executor = activity_executor || ThreadPoolExecutor.new(max_concurrent_activities)
75
+ @core_worker = Temporalio::Bridge::Worker.create(
76
+ @runtime.core_runtime,
77
+ connection.core_connection,
78
+ namespace,
79
+ task_queue,
80
+ )
81
+ @activity_worker =
82
+ unless activities.empty?
83
+ Worker::ActivityWorker.new(
84
+ task_queue,
85
+ @core_worker,
86
+ activities,
87
+ data_converter,
88
+ @activity_executor,
89
+ graceful_shutdown_timeout,
90
+ )
91
+ end
92
+ @workflow_worker = nil
93
+
94
+ if !@activity_worker && !@workflow_worker
95
+ raise ArgumentError, 'At least one activity or workflow must be specified'
96
+ end
97
+ end
98
+
99
+ # Run the worker and wait on it to be shut down.
100
+ #
101
+ # This will not return until shutdown is complete (and all running activities finished) and will
102
+ # raise if there is a worker fatal error. To run multiple workers use the class method {.run}.
103
+ #
104
+ # @note A worker is only intended to be started once. Initialize a new worker should you need to
105
+ # run it again.
106
+ #
107
+ # @yield Optionally you can provide a block by the end of which the worker will shut itself
108
+ # down. You can use this to stop a worker after some time has passed, your workflow has
109
+ # finished or any other arbitrary implementation has completed. Any errors raised from this
110
+ # block will be re-raised by this method.
111
+ def run(&block)
112
+ Runner.new(self).run(&block)
113
+ end
114
+
115
+ # Start the worker asynchronously in a shared runtime.
116
+ #
117
+ # This is an internal method for advanced use-cases for those intended to implement their own
118
+ # worker runner.
119
+ #
120
+ # @note A worker is only intended to be started once. Initialize a new worker should you need to
121
+ # start it again.
122
+ #
123
+ # @api private
124
+ #
125
+ # @param runner [Temporalio::Worker::Runner] A runner to notify when the worker is shutting down.
126
+ def start(runner = nil)
127
+ mutex.synchronize do
128
+ raise 'Worker is already started' if started?
129
+
130
+ @started = true
131
+ end
132
+
133
+ @runner = runner
134
+ runtime.ensure_callback_loop
135
+
136
+ runtime.reactor.async do |task|
137
+ if activity_worker
138
+ task.async do |task|
139
+ activity_worker.run(task)
140
+ rescue StandardError => e
141
+ shutdown(e) # initiate shutdown because of a fatal error
142
+ end
143
+ end
144
+
145
+ # TODO: Pending implementation
146
+ task.async { |task| workflow_worker.run(task) } if workflow_worker
147
+ end
148
+ end
149
+
150
+ # Initiate a worker shutdown and wait until complete.
151
+ #
152
+ # This can be called before the worker has even started and is safe for repeated invocations.
153
+ # This method will not return until the worker has completed shutting down.
154
+ #
155
+ # @param exception [Exception] An exception to be raised from {#run} or {.run} methods after a
156
+ # shutdown procedure has completed.
157
+ def shutdown(exception = Temporalio::Error::WorkerShutdown.new('Manual shutdown'))
158
+ mutex.synchronize do
159
+ return unless running?
160
+
161
+ # First initiate Core shutdown, which will start dropping poll requests
162
+ core_worker.initiate_shutdown
163
+ # Then let the runner know we're shutting down, so it can stop other workers
164
+ runner&.shutdown(exception)
165
+ # Wait for workers to drain any outstanding tasks
166
+ activity_worker&.drain
167
+ workflow_worker&.drain
168
+ # Stop the executor (at this point there should already be nothing in it)
169
+ activity_executor.shutdown
170
+ # Finalize the shutdown by stopping the Core
171
+ core_worker.shutdown
172
+
173
+ @shutdown = true
174
+ end
175
+ end
176
+
177
+ # Whether the worker has been started.
178
+ #
179
+ # @return [Boolean]
180
+ def started?
181
+ @started
182
+ end
183
+
184
+ # Whether the worker is running.
185
+ #
186
+ # This is only `true` if the worker has been started and not yet shut down.
187
+ #
188
+ # @return [Boolean]
189
+ def running?
190
+ @started && !@shutdown
191
+ end
192
+
193
+ private
194
+
195
+ attr_reader :mutex, :runtime, :activity_executor, :core_worker, :activity_worker,
196
+ :workflow_worker, :runner
197
+ end
198
+ end
@@ -0,0 +1,54 @@
1
+ require 'temporalio/errors'
2
+ require 'temporalio/workflow/execution_status'
3
+ require 'google/protobuf/well_known_types'
4
+
5
+ module Temporalio
6
+ class Workflow
7
+ class ExecutionInfo < Struct.new(
8
+ :raw,
9
+ :workflow,
10
+ :id,
11
+ :run_id,
12
+ :task_queue,
13
+ :status,
14
+ :parent_id,
15
+ :parent_run_id,
16
+ :start_time,
17
+ :close_time,
18
+ :execution_time,
19
+ :history_length,
20
+ :memo,
21
+ :search_attributes,
22
+ keyword_init: true,
23
+ )
24
+ def self.from_raw(response, converter)
25
+ raw_info = response.workflow_execution_info
26
+ raise Temporalio::Error::UnexpectedResponse, 'missing workflow_execution_info' unless raw_info
27
+
28
+ new(
29
+ raw: response,
30
+ workflow: raw_info.type&.name,
31
+ id: raw_info.execution&.workflow_id,
32
+ run_id: raw_info.execution&.run_id,
33
+ task_queue: raw_info.task_queue,
34
+ status: Workflow::ExecutionStatus.from_raw(raw_info.status),
35
+ parent_id: raw_info.parent_execution&.workflow_id,
36
+ parent_run_id: raw_info.parent_execution&.run_id,
37
+ start_time: raw_info.start_time&.to_time,
38
+ close_time: raw_info.close_time&.to_time,
39
+ execution_time: raw_info.execution_time&.to_time,
40
+ history_length: raw_info.history_length,
41
+ memo: converter.from_payload_map(raw_info.memo&.fields),
42
+ search_attributes: converter.from_payload_map(raw_info.search_attributes&.indexed_fields),
43
+ ).freeze
44
+ end
45
+
46
+ # Helper methods for checking execution status
47
+ Workflow::ExecutionStatus::STATUSES.each do |status|
48
+ define_method("#{status.downcase}?") do
49
+ self.status == status
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,36 @@
1
+ module Temporalio
2
+ class Workflow
3
+ module ExecutionStatus
4
+ STATUSES = [
5
+ RUNNING = :RUNNING,
6
+ COMPLETED = :COMPLETED,
7
+ FAILED = :FAILED,
8
+ CANCELED = :CANCELED,
9
+ TERMINATED = :TERMINATED,
10
+ CONTINUED_AS_NEW = :CONTINUED_AS_NEW,
11
+ TIMED_OUT = :TIMED_OUT,
12
+ ].freeze
13
+
14
+ # RBS screws up style definitions when using .freeze
15
+ # rubocop:disable Style/MutableConstant
16
+ API_MAP = {
17
+ WORKFLOW_EXECUTION_STATUS_RUNNING: RUNNING,
18
+ WORKFLOW_EXECUTION_STATUS_COMPLETED: COMPLETED,
19
+ WORKFLOW_EXECUTION_STATUS_FAILED: FAILED,
20
+ WORKFLOW_EXECUTION_STATUS_CANCELED: CANCELED,
21
+ WORKFLOW_EXECUTION_STATUS_TERMINATED: TERMINATED,
22
+ WORKFLOW_EXECUTION_STATUS_CONTINUED_AS_NEW: CONTINUED_AS_NEW,
23
+ WORKFLOW_EXECUTION_STATUS_TIMED_OUT: TIMED_OUT,
24
+ }
25
+ # rubocop:enable Style/MutableConstant
26
+
27
+ def self.to_raw(status)
28
+ API_MAP.invert[status]
29
+ end
30
+
31
+ def self.from_raw(raw_status)
32
+ API_MAP[raw_status]
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'temporal/api/enums/v1/workflow_pb'
2
+
3
+ module Temporalio
4
+ class Workflow
5
+ # How already-in-use workflow IDs are handled on start.
6
+ #
7
+ # @see Temporalio::Api::Enums::V1::WorkflowIdReusePolicy
8
+ class IDReusePolicy
9
+ POLICIES = [
10
+ ALLOW_DUPLICATE = :ALLOW_DUPLICATE,
11
+ ALLOW_DUPLICATE_FAILED_ONLY = :ALLOW_DUPLICATE_FAILED_ONLY,
12
+ REJECT_DUPLICATE = :REJECT_DUPLICATE,
13
+ TERMINATE_IF_RUNNING = :TERMINATE_IF_RUNNING,
14
+ ].freeze
15
+
16
+ API_MAP = {
17
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE =>
18
+ ALLOW_DUPLICATE,
19
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE_FAILED_ONLY =>
20
+ ALLOW_DUPLICATE_FAILED_ONLY,
21
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE =>
22
+ REJECT_DUPLICATE,
23
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING =>
24
+ TERMINATE_IF_RUNNING,
25
+ }.freeze
26
+
27
+ def self.to_raw(policy)
28
+ API_MAP.invert[policy]
29
+ end
30
+
31
+ def self.from_raw(raw_policy)
32
+ API_MAP[raw_policy]
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,33 @@
1
+ require 'temporal/api/enums/v1/query_pb'
2
+
3
+ module Temporalio
4
+ class Workflow
5
+ # Whether a query should be rejected in certain conditions.
6
+ #
7
+ # @see Temporalio::Api::Enums::V1::QueryRejectCondition
8
+ module QueryRejectCondition
9
+ CONDITIONS = [
10
+ NONE = :NONE,
11
+ NOT_OPEN = :NOT_OPEN,
12
+ NOT_COMPLETED_CLEANLY = :NOT_COMPLETED_CLEANLY,
13
+ ].freeze
14
+
15
+ API_MAP = {
16
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NONE =>
17
+ NONE,
18
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_OPEN =>
19
+ NOT_OPEN,
20
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_COMPLETED_CLEANLY =>
21
+ NOT_COMPLETED_CLEANLY,
22
+ }.freeze
23
+
24
+ def self.to_raw(condition)
25
+ API_MAP.invert[condition]
26
+ end
27
+
28
+ def self.from_raw(raw_condition)
29
+ API_MAP[raw_condition]
30
+ end
31
+ end
32
+ end
33
+ end
data/lib/temporalio.rb CHANGED
@@ -1 +1,12 @@
1
- require 'temporal'
1
+ # Protoc wants all of its generated files on the LOAD_PATH
2
+ $LOAD_PATH << File.expand_path('./gen', File.dirname(__FILE__))
3
+
4
+ require 'temporalio/activity'
5
+ require 'temporalio/bridge'
6
+ require 'temporalio/client'
7
+ require 'temporalio/connection'
8
+ require 'temporalio/version'
9
+ require 'temporalio/worker'
10
+
11
+ module Temporalio
12
+ end
@@ -0,0 +1,23 @@
1
+ require 'rbconfig'
2
+
3
+ module Thermite
4
+ class Config
5
+ # Thermite doesn't support cross-compilation so it always assumes the binary is being
6
+ # built for the current architecture. It only really affects the name of the tarball.
7
+ def target_arch
8
+ @target_arch ||= ENV.fetch('TARGET_ARCH', RbConfig::CONFIG['target_cpu'])
9
+ end
10
+
11
+ # Use the same target for all darwin versions
12
+ def target_os
13
+ @target_os ||= RbConfig::CONFIG['target_os'].sub(/darwin\d+/, 'darwin')
14
+ end
15
+
16
+ # Due to the lack of cross-compilation support, thermite assumes the resulting binary
17
+ # is placed in target/<profile>, however it's actually in target/<target_arch>/<profile>
18
+ def cargo_target_path(profile, *path_components)
19
+ target_base = ENV.fetch('CARGO_TARGET_DIR', File.join(rust_toplevel_dir, 'target'))
20
+ File.join(target_base, ENV.fetch('CARGO_BUILD_TARGET', ''), profile, *path_components)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,45 @@
1
+ require_relative './lib/temporalio/version'
2
+
3
+ Gem::Specification.new do |spec|
4
+ spec.name = 'temporalio'
5
+ spec.version = Temporalio::VERSION
6
+ spec.summary = 'Temporal.io Ruby SDK'
7
+ spec.description = 'An SDK for implementing Temporal.io workflows and activities in Ruby'
8
+ spec.homepage = 'https://github.com/temporalio/sdk-ruby'
9
+ spec.licenses = ['MIT']
10
+
11
+ spec.authors = ['Anthony D']
12
+ spec.email = ['anthony@temporal.io']
13
+
14
+ spec.require_paths = ['lib']
15
+ spec.extensions = ['ext/Rakefile']
16
+
17
+ spec.files =
18
+ Dir['lib/**/*.*'] +
19
+ Dir['bridge/**/*.*'].reject { |x| x.include?('/target/') } +
20
+ %w[ext/Rakefile temporalio.gemspec Gemfile LICENSE README.md]
21
+
22
+ # Limited by async. While we support both v1 and v2, we only allow Ruby >= 3
23
+ # since async v1 with Ruby 2 has a blocking behaviour (despite identical interface):
24
+ # https://github.com/socketry/async/discussions/108#discussioncomment-541788
25
+ spec.required_ruby_version = '>= 3.0.2'
26
+
27
+ spec.add_dependency 'async' # Fiber-based reactor. Open-ended to allow Ruby 3.1+ to use v2
28
+ spec.add_dependency 'google-protobuf', '~> 3.21.1' # Protobuf
29
+ spec.add_dependency 'rexml', '~> 3.2.5' # Implicitly required by thermite
30
+ spec.add_dependency 'rutie', '~> 0.0.4' # Rust bindings
31
+ spec.add_dependency 'thermite', '~> 0.13.0' # For compiling Rust ext
32
+
33
+ spec.add_development_dependency 'grpc' # Ruby GRPC for the mock server
34
+ spec.add_development_dependency 'grpc-tools' # GRPC generator for the mock server
35
+ spec.add_development_dependency 'protobuf' # Ruby implementation of protobufs (for rbs_protobuf)
36
+ spec.add_development_dependency 'pry' # Debugger
37
+ spec.add_development_dependency 'rake' # rake tasks
38
+ spec.add_development_dependency 'rbs_protobuf' # RBS generator for protobufs
39
+ spec.add_development_dependency 'rspec' # specs
40
+ spec.add_development_dependency 'rubocop' # linter
41
+ spec.add_development_dependency 'rubocop-rspec' # spec linter
42
+ spec.add_development_dependency 'steep' # type checker
43
+ spec.add_development_dependency 'typeprof' # type generator
44
+ spec.add_development_dependency 'yard' # docs
45
+ end