temporalio 0.0.1 → 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 (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +175 -4
  3. data/bridge/Cargo.lock +44 -21
  4. data/bridge/Cargo.toml +1 -0
  5. data/bridge/sdk-core/Cargo.toml +1 -1
  6. data/bridge/sdk-core/README.md +1 -4
  7. data/bridge/sdk-core/client/Cargo.toml +1 -1
  8. data/bridge/sdk-core/client/src/lib.rs +12 -20
  9. data/bridge/sdk-core/client/src/raw.rs +9 -8
  10. data/bridge/sdk-core/client/src/retry.rs +100 -23
  11. data/bridge/sdk-core/core/Cargo.toml +7 -7
  12. data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
  13. data/bridge/sdk-core/core/src/abstractions.rs +22 -22
  14. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +146 -43
  15. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +419 -9
  16. data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -89
  17. data/bridge/sdk-core/core/src/core_tests/workers.rs +2 -2
  18. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  19. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +47 -27
  20. data/bridge/sdk-core/core/src/lib.rs +139 -32
  21. data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
  22. data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
  23. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  24. data/bridge/sdk-core/core/src/telemetry/metrics.rs +184 -139
  25. data/bridge/sdk-core/core/src/telemetry/mod.rs +310 -315
  26. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +4 -3
  27. data/bridge/sdk-core/core/src/test_help/mod.rs +23 -9
  28. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +12 -6
  29. data/bridge/sdk-core/core/src/worker/activities.rs +40 -23
  30. data/bridge/sdk-core/core/src/worker/client/mocks.rs +1 -1
  31. data/bridge/sdk-core/core/src/worker/client.rs +30 -4
  32. data/bridge/sdk-core/core/src/worker/mod.rs +23 -19
  33. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +10 -19
  34. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +99 -25
  35. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -5
  36. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -5
  37. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +1 -5
  38. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +3 -5
  39. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +1 -5
  40. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +2 -6
  41. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +1 -5
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +24 -22
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -38
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +1 -5
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -5
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -5
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +8 -2
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +1 -5
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +1 -1
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +233 -217
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +1 -6
  53. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +4 -4
  54. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +13 -5
  55. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +86 -29
  56. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +2 -2
  57. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +56 -11
  58. data/bridge/sdk-core/core-api/Cargo.toml +4 -3
  59. data/bridge/sdk-core/core-api/src/lib.rs +1 -43
  60. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  61. data/bridge/sdk-core/core-api/src/worker.rs +13 -0
  62. data/bridge/sdk-core/etc/deps.svg +115 -140
  63. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  64. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  65. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  66. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  67. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
  68. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  69. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  70. data/bridge/sdk-core/protos/api_upstream/{temporal/api/update/v1/message.proto → build/tools.go} +6 -23
  71. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  72. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
  73. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +20 -19
  74. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
  75. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  76. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -4
  77. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  78. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +5 -3
  79. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +23 -2
  80. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/{cluster.proto → interaction_type.proto} +10 -11
  81. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  82. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  83. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  84. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  85. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  86. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +2 -13
  87. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  88. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  89. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  90. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  91. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +26 -19
  92. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  93. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +2 -2
  94. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +21 -61
  95. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
  96. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  97. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  98. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
  99. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
  100. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  101. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
  102. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -16
  103. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +17 -3
  104. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
  105. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +8 -1
  106. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  107. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  108. data/bridge/sdk-core/sdk/Cargo.toml +2 -2
  109. data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
  110. data/bridge/sdk-core/sdk/src/lib.rs +7 -5
  111. data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
  112. data/bridge/sdk-core/sdk/src/workflow_future.rs +3 -7
  113. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +1 -1
  114. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -1
  115. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +65 -18
  116. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +22 -22
  117. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +104 -44
  118. data/bridge/sdk-core/test-utils/Cargo.toml +2 -1
  119. data/bridge/sdk-core/test-utils/src/lib.rs +81 -29
  120. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +5 -2
  121. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  122. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -13
  123. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +167 -13
  124. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  125. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +106 -20
  126. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +18 -8
  127. data/bridge/sdk-core/tests/main.rs +6 -4
  128. data/bridge/src/connection.rs +81 -62
  129. data/bridge/src/lib.rs +92 -33
  130. data/bridge/src/runtime.rs +9 -2
  131. data/bridge/src/worker.rs +53 -2
  132. data/lib/bridge.so +0 -0
  133. data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
  134. data/lib/gen/temporal/api/command/v1/message_pb.rb +17 -9
  135. data/lib/gen/temporal/api/common/v1/message_pb.rb +1 -1
  136. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
  137. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -1
  138. data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
  139. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +3 -2
  140. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +7 -1
  141. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  142. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
  143. data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
  144. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
  145. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
  146. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
  147. data/lib/gen/temporal/api/enums/v1/update_pb.rb +1 -6
  148. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
  149. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
  150. data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
  151. data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
  152. data/lib/gen/temporal/api/history/v1/message_pb.rb +19 -18
  153. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  154. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +1 -1
  155. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +11 -51
  156. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
  157. data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
  158. data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
  159. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
  160. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
  161. data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
  162. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
  163. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +27 -10
  164. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
  165. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +1 -0
  166. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +5 -1
  167. data/lib/temporalio/activity/context.rb +97 -0
  168. data/lib/temporalio/activity/info.rb +67 -0
  169. data/lib/temporalio/activity.rb +85 -0
  170. data/lib/temporalio/bridge/error.rb +8 -0
  171. data/lib/temporalio/bridge.rb +14 -0
  172. data/lib/{temporal → temporalio}/client/implementation.rb +49 -48
  173. data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
  174. data/lib/{temporal → temporalio}/client.rb +19 -32
  175. data/lib/{temporal → temporalio}/connection.rb +238 -223
  176. data/lib/{temporal → temporalio}/data_converter.rb +76 -35
  177. data/lib/{temporal → temporalio}/error/failure.rb +6 -6
  178. data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
  179. data/lib/{temporal → temporalio}/errors.rb +19 -1
  180. data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
  181. data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
  182. data/lib/temporalio/failure_converter.rb +7 -0
  183. data/lib/{temporal → temporalio}/interceptor/chain.rb +2 -1
  184. data/lib/{temporal → temporalio}/interceptor/client.rb +22 -1
  185. data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
  186. data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
  187. data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
  188. data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
  189. data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
  190. data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
  191. data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
  192. data/lib/temporalio/payload_converter.rb +14 -0
  193. data/lib/{temporal → temporalio}/retry_policy.rb +4 -4
  194. data/lib/{temporal → temporalio}/retry_state.rb +1 -1
  195. data/lib/temporalio/runtime.rb +25 -0
  196. data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
  197. data/lib/temporalio/version.rb +3 -0
  198. data/lib/temporalio/worker/activity_runner.rb +92 -0
  199. data/lib/temporalio/worker/activity_worker.rb +138 -0
  200. data/lib/temporalio/worker/reactor.rb +46 -0
  201. data/lib/temporalio/worker/runner.rb +63 -0
  202. data/lib/temporalio/worker/sync_worker.rb +88 -0
  203. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  204. data/lib/temporalio/worker.rb +198 -0
  205. data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
  206. data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
  207. data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
  208. data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
  209. data/lib/temporalio.rb +12 -3
  210. data/temporalio.gemspec +7 -3
  211. metadata +79 -56
  212. data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
  213. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  214. data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
  215. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
  216. data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
  217. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
  218. data/bridge/sdk-core/core/src/log_export.rs +0 -62
  219. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
  220. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
  221. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
  222. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  223. data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
  224. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
  225. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
  226. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -26
  227. data/lib/temporal/bridge.rb +0 -14
  228. data/lib/temporal/failure_converter.rb +0 -8
  229. data/lib/temporal/payload_converter.rb +0 -14
  230. data/lib/temporal/runtime.rb +0 -22
  231. data/lib/temporal/version.rb +0 -3
  232. data/lib/temporal.rb +0 -8
@@ -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
@@ -1,8 +1,8 @@
1
- require 'temporal/errors'
2
- require 'temporal/workflow/execution_status'
1
+ require 'temporalio/errors'
2
+ require 'temporalio/workflow/execution_status'
3
3
  require 'google/protobuf/well_known_types'
4
4
 
5
- module Temporal
5
+ module Temporalio
6
6
  class Workflow
7
7
  class ExecutionInfo < Struct.new(
8
8
  :raw,
@@ -23,7 +23,7 @@ module Temporal
23
23
  )
24
24
  def self.from_raw(response, converter)
25
25
  raw_info = response.workflow_execution_info
26
- raise Temporal::Error::UnexpectedResponse, 'missing workflow_execution_info' unless raw_info
26
+ raise Temporalio::Error::UnexpectedResponse, 'missing workflow_execution_info' unless raw_info
27
27
 
28
28
  new(
29
29
  raw: response,
@@ -1,4 +1,4 @@
1
- module Temporal
1
+ module Temporalio
2
2
  class Workflow
3
3
  module ExecutionStatus
4
4
  STATUSES = [
@@ -1,10 +1,10 @@
1
1
  require 'temporal/api/enums/v1/workflow_pb'
2
2
 
3
- module Temporal
3
+ module Temporalio
4
4
  class Workflow
5
5
  # How already-in-use workflow IDs are handled on start.
6
6
  #
7
- # @see Temporal::Api::Enums::V1::WorkflowIdReusePolicy
7
+ # @see Temporalio::Api::Enums::V1::WorkflowIdReusePolicy
8
8
  class IDReusePolicy
9
9
  POLICIES = [
10
10
  ALLOW_DUPLICATE = :ALLOW_DUPLICATE,
@@ -14,13 +14,13 @@ module Temporal
14
14
  ].freeze
15
15
 
16
16
  API_MAP = {
17
- Temporal::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE =>
17
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE =>
18
18
  ALLOW_DUPLICATE,
19
- Temporal::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE_FAILED_ONLY =>
19
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE_FAILED_ONLY =>
20
20
  ALLOW_DUPLICATE_FAILED_ONLY,
21
- Temporal::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE =>
21
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE =>
22
22
  REJECT_DUPLICATE,
23
- Temporal::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING =>
23
+ Temporalio::Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING =>
24
24
  TERMINATE_IF_RUNNING,
25
25
  }.freeze
26
26
 
@@ -1,10 +1,10 @@
1
1
  require 'temporal/api/enums/v1/query_pb'
2
2
 
3
- module Temporal
3
+ module Temporalio
4
4
  class Workflow
5
5
  # Whether a query should be rejected in certain conditions.
6
6
  #
7
- # @see Temporal::Api::Enums::V1::QueryRejectCondition
7
+ # @see Temporalio::Api::Enums::V1::QueryRejectCondition
8
8
  module QueryRejectCondition
9
9
  CONDITIONS = [
10
10
  NONE = :NONE,
@@ -13,11 +13,11 @@ module Temporal
13
13
  ].freeze
14
14
 
15
15
  API_MAP = {
16
- Temporal::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NONE =>
16
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NONE =>
17
17
  NONE,
18
- Temporal::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_OPEN =>
18
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_OPEN =>
19
19
  NOT_OPEN,
20
- Temporal::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_COMPLETED_CLEANLY =>
20
+ Temporalio::Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_COMPLETED_CLEANLY =>
21
21
  NOT_COMPLETED_CLEANLY,
22
22
  }.freeze
23
23
 
data/lib/temporalio.rb CHANGED
@@ -1,3 +1,12 @@
1
- # This file provides the main entry-point for the gem (based on the name).
2
- # All the gem internals are namespaced Temporal, temporalio is onle the name of the gem.
3
- require_relative './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
data/temporalio.gemspec CHANGED
@@ -1,8 +1,8 @@
1
- require_relative './lib/temporal/version'
1
+ require_relative './lib/temporalio/version'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'temporalio'
5
- spec.version = Temporal::VERSION
5
+ spec.version = Temporalio::VERSION
6
6
  spec.summary = 'Temporal.io Ruby SDK'
7
7
  spec.description = 'An SDK for implementing Temporal.io workflows and activities in Ruby'
8
8
  spec.homepage = 'https://github.com/temporalio/sdk-ruby'
@@ -19,8 +19,12 @@ Gem::Specification.new do |spec|
19
19
  Dir['bridge/**/*.*'].reject { |x| x.include?('/target/') } +
20
20
  %w[ext/Rakefile temporalio.gemspec Gemfile LICENSE README.md]
21
21
 
22
- spec.required_ruby_version = '>= 2.7.0'
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'
23
26
 
27
+ spec.add_dependency 'async' # Fiber-based reactor. Open-ended to allow Ruby 3.1+ to use v2
24
28
  spec.add_dependency 'google-protobuf', '~> 3.21.1' # Protobuf
25
29
  spec.add_dependency 'rexml', '~> 3.2.5' # Implicitly required by thermite
26
30
  spec.add_dependency 'rutie', '~> 0.0.4' # Rust bindings