clara-temporalio 0.4.3-x86_64-linux

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 (190) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +2 -0
  3. data/Gemfile +27 -0
  4. data/Rakefile +101 -0
  5. data/lib/temporalio/activity/cancellation_details.rb +58 -0
  6. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  7. data/lib/temporalio/activity/context.rb +131 -0
  8. data/lib/temporalio/activity/definition.rb +197 -0
  9. data/lib/temporalio/activity/info.rb +70 -0
  10. data/lib/temporalio/activity.rb +14 -0
  11. data/lib/temporalio/api/activity/v1/message.rb +25 -0
  12. data/lib/temporalio/api/batch/v1/message.rb +38 -0
  13. data/lib/temporalio/api/cloud/account/v1/message.rb +28 -0
  14. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +135 -0
  15. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  16. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  17. data/lib/temporalio/api/cloud/identity/v1/message.rb +46 -0
  18. data/lib/temporalio/api/cloud/namespace/v1/message.rb +46 -0
  19. data/lib/temporalio/api/cloud/nexus/v1/message.rb +32 -0
  20. data/lib/temporalio/api/cloud/operation/v1/message.rb +28 -0
  21. data/lib/temporalio/api/cloud/region/v1/message.rb +24 -0
  22. data/lib/temporalio/api/cloud/resource/v1/message.rb +23 -0
  23. data/lib/temporalio/api/cloud/sink/v1/message.rb +24 -0
  24. data/lib/temporalio/api/cloud/usage/v1/message.rb +31 -0
  25. data/lib/temporalio/api/command/v1/message.rb +46 -0
  26. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  27. data/lib/temporalio/api/common/v1/message.rb +49 -0
  28. data/lib/temporalio/api/deployment/v1/message.rb +39 -0
  29. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  30. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  31. data/lib/temporalio/api/enums/v1/common.rb +28 -0
  32. data/lib/temporalio/api/enums/v1/deployment.rb +23 -0
  33. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  34. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  35. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  36. data/lib/temporalio/api/enums/v1/nexus.rb +21 -0
  37. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  38. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  39. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  40. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  41. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  42. data/lib/temporalio/api/enums/v1/workflow.rb +31 -0
  43. data/lib/temporalio/api/errordetails/v1/message.rb +44 -0
  44. data/lib/temporalio/api/export/v1/message.rb +24 -0
  45. data/lib/temporalio/api/failure/v1/message.rb +38 -0
  46. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  47. data/lib/temporalio/api/history/v1/message.rb +94 -0
  48. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  49. data/lib/temporalio/api/nexus/v1/message.rb +41 -0
  50. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  51. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  52. data/lib/temporalio/api/operatorservice.rb +3 -0
  53. data/lib/temporalio/api/payload_visitor.rb +1668 -0
  54. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  55. data/lib/temporalio/api/query/v1/message.rb +28 -0
  56. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  57. data/lib/temporalio/api/rules/v1/message.rb +27 -0
  58. data/lib/temporalio/api/schedule/v1/message.rb +43 -0
  59. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  60. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  61. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  62. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  63. data/lib/temporalio/api/taskqueue/v1/message.rb +48 -0
  64. data/lib/temporalio/api/testservice/v1/request_response.rb +31 -0
  65. data/lib/temporalio/api/testservice/v1/service.rb +23 -0
  66. data/lib/temporalio/api/update/v1/message.rb +33 -0
  67. data/lib/temporalio/api/version/v1/message.rb +26 -0
  68. data/lib/temporalio/api/workflow/v1/message.rb +63 -0
  69. data/lib/temporalio/api/workflowservice/v1/request_response.rb +244 -0
  70. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  71. data/lib/temporalio/api/workflowservice.rb +3 -0
  72. data/lib/temporalio/api.rb +15 -0
  73. data/lib/temporalio/cancellation.rb +170 -0
  74. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  75. data/lib/temporalio/client/async_activity_handle.rb +85 -0
  76. data/lib/temporalio/client/connection/cloud_service.rb +786 -0
  77. data/lib/temporalio/client/connection/operator_service.rb +201 -0
  78. data/lib/temporalio/client/connection/service.rb +42 -0
  79. data/lib/temporalio/client/connection/test_service.rb +111 -0
  80. data/lib/temporalio/client/connection/workflow_service.rb +1326 -0
  81. data/lib/temporalio/client/connection.rb +316 -0
  82. data/lib/temporalio/client/interceptor.rb +457 -0
  83. data/lib/temporalio/client/schedule.rb +991 -0
  84. data/lib/temporalio/client/schedule_handle.rb +126 -0
  85. data/lib/temporalio/client/with_start_workflow_operation.rb +115 -0
  86. data/lib/temporalio/client/workflow_execution.rb +119 -0
  87. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  88. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  89. data/lib/temporalio/client/workflow_handle.rb +389 -0
  90. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  91. data/lib/temporalio/client/workflow_update_handle.rb +65 -0
  92. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  93. data/lib/temporalio/client.rb +625 -0
  94. data/lib/temporalio/common_enums.rb +55 -0
  95. data/lib/temporalio/contrib/open_telemetry.rb +469 -0
  96. data/lib/temporalio/converters/data_converter.rb +99 -0
  97. data/lib/temporalio/converters/failure_converter.rb +205 -0
  98. data/lib/temporalio/converters/payload_codec.rb +26 -0
  99. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  100. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  101. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  102. data/lib/temporalio/converters/payload_converter/composite.rb +66 -0
  103. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  104. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  105. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  106. data/lib/temporalio/converters/payload_converter.rb +71 -0
  107. data/lib/temporalio/converters/raw_value.rb +20 -0
  108. data/lib/temporalio/converters.rb +9 -0
  109. data/lib/temporalio/error/failure.rb +237 -0
  110. data/lib/temporalio/error.rb +156 -0
  111. data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.so +0 -0
  112. data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.so +0 -0
  113. data/lib/temporalio/internal/bridge/3.4/temporalio_bridge.so +0 -0
  114. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  115. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +32 -0
  116. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  117. data/lib/temporalio/internal/bridge/api/common/common.rb +27 -0
  118. data/lib/temporalio/internal/bridge/api/core_interface.rb +40 -0
  119. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  120. data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +34 -0
  121. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +56 -0
  122. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +58 -0
  123. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +31 -0
  124. data/lib/temporalio/internal/bridge/api.rb +3 -0
  125. data/lib/temporalio/internal/bridge/client.rb +95 -0
  126. data/lib/temporalio/internal/bridge/runtime.rb +56 -0
  127. data/lib/temporalio/internal/bridge/testing.rb +69 -0
  128. data/lib/temporalio/internal/bridge/worker.rb +109 -0
  129. data/lib/temporalio/internal/bridge.rb +36 -0
  130. data/lib/temporalio/internal/client/implementation.rb +926 -0
  131. data/lib/temporalio/internal/metric.rb +122 -0
  132. data/lib/temporalio/internal/proto_utils.rb +165 -0
  133. data/lib/temporalio/internal/worker/activity_worker.rb +448 -0
  134. data/lib/temporalio/internal/worker/multi_runner.rb +213 -0
  135. data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +54 -0
  136. data/lib/temporalio/internal/worker/workflow_instance/context.rb +391 -0
  137. data/lib/temporalio/internal/worker/workflow_instance/details.rb +49 -0
  138. data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +32 -0
  139. data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +22 -0
  140. data/lib/temporalio/internal/worker/workflow_instance/handler_execution.rb +25 -0
  141. data/lib/temporalio/internal/worker/workflow_instance/handler_hash.rb +41 -0
  142. data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +97 -0
  143. data/lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb +62 -0
  144. data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +404 -0
  145. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +37 -0
  146. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_metric.rb +40 -0
  147. data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +183 -0
  148. data/lib/temporalio/internal/worker/workflow_instance.rb +800 -0
  149. data/lib/temporalio/internal/worker/workflow_worker.rb +249 -0
  150. data/lib/temporalio/internal.rb +7 -0
  151. data/lib/temporalio/metric.rb +109 -0
  152. data/lib/temporalio/priority.rb +59 -0
  153. data/lib/temporalio/retry_policy.rb +74 -0
  154. data/lib/temporalio/runtime/metric_buffer.rb +94 -0
  155. data/lib/temporalio/runtime.rb +352 -0
  156. data/lib/temporalio/scoped_logger.rb +96 -0
  157. data/lib/temporalio/search_attributes.rb +356 -0
  158. data/lib/temporalio/testing/activity_environment.rb +175 -0
  159. data/lib/temporalio/testing/workflow_environment.rb +406 -0
  160. data/lib/temporalio/testing.rb +10 -0
  161. data/lib/temporalio/version.rb +5 -0
  162. data/lib/temporalio/versioning_override.rb +55 -0
  163. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  164. data/lib/temporalio/worker/activity_executor/thread_pool.rb +46 -0
  165. data/lib/temporalio/worker/activity_executor.rb +55 -0
  166. data/lib/temporalio/worker/deployment_options.rb +45 -0
  167. data/lib/temporalio/worker/interceptor.rb +367 -0
  168. data/lib/temporalio/worker/poller_behavior.rb +61 -0
  169. data/lib/temporalio/worker/thread_pool.rb +237 -0
  170. data/lib/temporalio/worker/tuner.rb +189 -0
  171. data/lib/temporalio/worker/workflow_executor/thread_pool.rb +236 -0
  172. data/lib/temporalio/worker/workflow_executor.rb +26 -0
  173. data/lib/temporalio/worker/workflow_replayer.rb +349 -0
  174. data/lib/temporalio/worker.rb +633 -0
  175. data/lib/temporalio/worker_deployment_version.rb +67 -0
  176. data/lib/temporalio/workflow/activity_cancellation_type.rb +20 -0
  177. data/lib/temporalio/workflow/child_workflow_cancellation_type.rb +21 -0
  178. data/lib/temporalio/workflow/child_workflow_handle.rb +43 -0
  179. data/lib/temporalio/workflow/definition.rb +680 -0
  180. data/lib/temporalio/workflow/external_workflow_handle.rb +41 -0
  181. data/lib/temporalio/workflow/future.rb +151 -0
  182. data/lib/temporalio/workflow/handler_unfinished_policy.rb +13 -0
  183. data/lib/temporalio/workflow/info.rb +107 -0
  184. data/lib/temporalio/workflow/parent_close_policy.rb +19 -0
  185. data/lib/temporalio/workflow/update_info.rb +20 -0
  186. data/lib/temporalio/workflow.rb +594 -0
  187. data/lib/temporalio/workflow_history.rb +47 -0
  188. data/lib/temporalio.rb +12 -0
  189. data/temporalio.gemspec +31 -0
  190. metadata +267 -0
@@ -0,0 +1,349 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/api'
4
+ require 'temporalio/converters'
5
+ require 'temporalio/internal/bridge'
6
+ require 'temporalio/internal/bridge/worker'
7
+ require 'temporalio/internal/worker/multi_runner'
8
+ require 'temporalio/internal/worker/workflow_worker'
9
+ require 'temporalio/worker/interceptor'
10
+ require 'temporalio/worker/poller_behavior'
11
+ require 'temporalio/worker/thread_pool'
12
+ require 'temporalio/worker/tuner'
13
+ require 'temporalio/worker/workflow_executor'
14
+ require 'temporalio/workflow'
15
+ require 'temporalio/workflow_history'
16
+
17
+ module Temporalio
18
+ class Worker
19
+ # Replayer to replay workflows from existing history.
20
+ class WorkflowReplayer
21
+ Options = Data.define(
22
+ :workflows,
23
+ :namespace,
24
+ :task_queue,
25
+ :data_converter,
26
+ :workflow_executor,
27
+ :interceptors,
28
+ :identity,
29
+ :logger,
30
+ :illegal_workflow_calls,
31
+ :workflow_failure_exception_types,
32
+ :workflow_payload_codec_thread_pool,
33
+ :unsafe_workflow_io_enabled,
34
+ :debug_mode,
35
+ :runtime
36
+ )
37
+
38
+ # Options as returned from {options} representing the options passed to the constructor.
39
+ class Options; end # rubocop:disable Lint/EmptyClass
40
+
41
+ # @return [Options] Options for this replayer which has the same attributes as {initialize}.
42
+ attr_reader :options
43
+
44
+ # Create a new replayer. This combines some options from both {Worker.initialize} and {Client.initialize}.
45
+ #
46
+ # @param workflows [Array<Class<Workflow::Definition>>] Workflows for this replayer.
47
+ # @param namespace [String] Namespace as set in the workflow info.
48
+ # @param task_queue [String] Task queue as set in the workflow info.
49
+ # @param data_converter [Converters::DataConverter] Data converter to use for all data conversions to/from
50
+ # payloads.
51
+ # @param workflow_executor [WorkflowExecutor] Workflow executor that workflow tasks run within. This must be a
52
+ # {WorkflowExecutor::ThreadPool} currently.
53
+ # @param interceptors [Array<Interceptor::Workflow>] Workflow interceptors.
54
+ # @param identity [String, nil] Override the identity for this replater.
55
+ # @param logger [Logger] Logger to use. Defaults to stdout with warn level. Callers setting this logger are
56
+ # responsible for closing it.
57
+ # @param illegal_workflow_calls [Hash<String, [:all, Array<Symbol>]>] Set of illegal workflow calls that are
58
+ # considered unsafe/non-deterministic and will raise if seen. The key of the hash is the fully qualified string
59
+ # class name (no leading `::`). The value is either `:all` which means any use of the class, or an array of
60
+ # symbols for methods on the class that cannot be used. The methods refer to either instance or class methods,
61
+ # there is no way to differentiate at this time.
62
+ # @param workflow_failure_exception_types [Array<Class<Exception>>] Workflow failure exception types. This is the
63
+ # set of exception types that, if a workflow-thrown exception extends, will cause the workflow/update to fail
64
+ # instead of suspending the workflow via task failure. These are applied in addition to the
65
+ # `workflow_failure_exception_type` on the workflow definition class itself. If {::Exception} is set, it
66
+ # effectively will fail a workflow/update in all user exception cases.
67
+ # @param workflow_payload_codec_thread_pool [ThreadPool, nil] Thread pool to run payload codec encode/decode
68
+ # within. This is required if a payload codec exists and the worker is not fiber based. Codecs can potentially
69
+ # block execution which is why they need to be run in the background.
70
+ # @param unsafe_workflow_io_enabled [Boolean] If false, the default, workflow code that invokes io_wait on the
71
+ # fiber scheduler will fail. Instead of setting this to true, users are encouraged to use
72
+ # {Workflow::Unsafe.io_enabled} with a block for narrower enabling of IO.
73
+ # @param debug_mode [Boolean] If true, deadlock detection is disabled. Deadlock detection will fail workflow tasks
74
+ # if they block the thread for too long. This defaults to true if the `TEMPORAL_DEBUG` environment variable is
75
+ # `true` or `1`.
76
+ # @param runtime [Runtime] Runtime for this replayer.
77
+ #
78
+ # @yield If a block is present, this is the equivalent of calling {with_replay_worker} with the block and
79
+ # discarding the result.
80
+ def initialize(
81
+ workflows:,
82
+ namespace: 'ReplayNamespace',
83
+ task_queue: 'ReplayTaskQueue',
84
+ data_converter: Converters::DataConverter.default,
85
+ workflow_executor: WorkflowExecutor::ThreadPool.default,
86
+ interceptors: [],
87
+ identity: nil,
88
+ logger: Logger.new($stdout, level: Logger::WARN),
89
+ illegal_workflow_calls: Worker.default_illegal_workflow_calls,
90
+ workflow_failure_exception_types: [],
91
+ workflow_payload_codec_thread_pool: nil,
92
+ unsafe_workflow_io_enabled: false,
93
+ debug_mode: %w[true 1].include?(ENV['TEMPORAL_DEBUG'].to_s.downcase),
94
+ runtime: Runtime.default,
95
+ &
96
+ )
97
+ @options = Options.new(
98
+ workflows:,
99
+ namespace:,
100
+ task_queue:,
101
+ data_converter:,
102
+ workflow_executor:,
103
+ interceptors:,
104
+ identity:,
105
+ logger:,
106
+ illegal_workflow_calls:,
107
+ workflow_failure_exception_types:,
108
+ workflow_payload_codec_thread_pool:,
109
+ unsafe_workflow_io_enabled:,
110
+ debug_mode:,
111
+ runtime:
112
+ ).freeze
113
+ # Preload definitions and other settings
114
+ @workflow_definitions = Internal::Worker::WorkflowWorker.workflow_definitions(
115
+ workflows, should_enforce_versioning_behavior: false
116
+ )
117
+ @nondeterminism_as_workflow_fail, @nondeterminism_as_workflow_fail_for_types =
118
+ Internal::Worker::WorkflowWorker.bridge_workflow_failure_exception_type_options(
119
+ workflow_failure_exception_types:, workflow_definitions: @workflow_definitions
120
+ )
121
+ # If there is a block, we'll go ahead and assume it's for with_replay_worker
122
+ with_replay_worker(&) if block_given? # steep:ignore
123
+ end
124
+
125
+ # Replay a workflow history.
126
+ #
127
+ # If doing multiple histories, it is better to use {replay_workflows} or {with_replay_worker} since they create
128
+ # a replay worker just once instead of each time like this call does.
129
+ #
130
+ # @param history [WorkflowHistory] History to replay.
131
+ # @param raise_on_replay_failure [Boolean] If true, the default, this will raise an exception on any replay
132
+ # failure. If false and the replay fails, the failure will be available in {ReplayResult.replay_failure}.
133
+ #
134
+ # @return [ReplayResult] Result of the replay.
135
+ def replay_workflow(history, raise_on_replay_failure: true)
136
+ with_replay_worker { |worker| worker.replay_workflow(history, raise_on_replay_failure:) }
137
+ end
138
+
139
+ # Replay multiple workflow histories.
140
+ #
141
+ # @param histories [Enumerable<WorkflowHistory>] Histories to replay.
142
+ # @param raise_on_replay_failure [Boolean] If true, this will raise an exception on any replay failure. If false,
143
+ # the default, and the replay fails, the failure will be available in {ReplayResult.replay_failure}.
144
+ #
145
+ # @return [Array<ReplayResult>] Results of the replay.
146
+ def replay_workflows(histories, raise_on_replay_failure: false)
147
+ with_replay_worker do |worker|
148
+ histories.map { |h| worker.replay_workflow(h, raise_on_replay_failure:) }
149
+ end
150
+ end
151
+
152
+ # Run a block of code with a {ReplayWorker} to execute replays.
153
+ #
154
+ # @yield Block of code to run with a replay worker.
155
+ # @yieldparam [ReplayWorker] Worker to run replays on. Note, only one workflow can replay at a time.
156
+ # @yieldreturn [Object] Result of the block.
157
+ def with_replay_worker(&)
158
+ worker = ReplayWorker.new(
159
+ options:,
160
+ workflow_definitions: @workflow_definitions,
161
+ nondeterminism_as_workflow_fail: @nondeterminism_as_workflow_fail,
162
+ nondeterminism_as_workflow_fail_for_types: @nondeterminism_as_workflow_fail_for_types
163
+ )
164
+ begin
165
+ yield worker
166
+ ensure
167
+ worker._shutdown
168
+ end
169
+ end
170
+
171
+ # Result of a single workflow replay run.
172
+ class ReplayResult
173
+ # @return [WorkflowHistory] History originally passed in to the replayer.
174
+ attr_reader :history
175
+
176
+ # @return [Exception, nil] Failure during replay if any.
177
+ attr_reader :replay_failure
178
+
179
+ # @!visibility private
180
+ def initialize(history:, replay_failure:)
181
+ @history = history
182
+ @replay_failure = replay_failure
183
+ end
184
+ end
185
+
186
+ # Replay worker that can be used to replay individual workflow runs. Only one call to {replay_workflow} can be
187
+ # made at a time.
188
+ class ReplayWorker
189
+ # @!visibility private
190
+ def initialize(
191
+ options:,
192
+ workflow_definitions:,
193
+ nondeterminism_as_workflow_fail:,
194
+ nondeterminism_as_workflow_fail_for_types:
195
+ )
196
+ # Create the bridge worker and the replayer
197
+ @bridge_replayer, @bridge_worker = Internal::Bridge::Worker::WorkflowReplayer.new(
198
+ options.runtime._core_runtime,
199
+ Internal::Bridge::Worker::Options.new(
200
+ activity: false,
201
+ workflow: true,
202
+ namespace: options.namespace,
203
+ task_queue: options.task_queue,
204
+ tuner: Tuner.create_fixed(
205
+ workflow_slots: 2, activity_slots: 1, local_activity_slots: 1
206
+ )._to_bridge_options,
207
+ identity_override: options.identity,
208
+ max_cached_workflows: 2,
209
+ workflow_task_poller_behavior:
210
+ Temporalio::Worker::PollerBehavior::SimpleMaximum.new(2)._to_bridge_options,
211
+ nonsticky_to_sticky_poll_ratio: 1.0,
212
+ activity_task_poller_behavior:
213
+ Temporalio::Worker::PollerBehavior::SimpleMaximum.new(1)._to_bridge_options,
214
+ no_remote_activities: true,
215
+ sticky_queue_schedule_to_start_timeout: 1.0,
216
+ max_heartbeat_throttle_interval: 1.0,
217
+ default_heartbeat_throttle_interval: 1.0,
218
+ max_worker_activities_per_second: nil,
219
+ max_task_queue_activities_per_second: nil,
220
+ graceful_shutdown_period: 0.0,
221
+ nondeterminism_as_workflow_fail:,
222
+ nondeterminism_as_workflow_fail_for_types:,
223
+ deployment_options: Worker.default_deployment_options._to_bridge_options
224
+ )
225
+ )
226
+
227
+ # Create the workflow worker
228
+ @workflow_worker = Internal::Worker::WorkflowWorker.new(
229
+ bridge_worker: @bridge_worker,
230
+ namespace: options.namespace,
231
+ task_queue: options.task_queue,
232
+ workflow_definitions:,
233
+ workflow_executor: options.workflow_executor,
234
+ logger: options.logger,
235
+ data_converter: options.data_converter,
236
+ metric_meter: options.runtime.metric_meter,
237
+ workflow_interceptors: options.interceptors.select do |i|
238
+ i.is_a?(Interceptor::Workflow)
239
+ end,
240
+ disable_eager_activity_execution: false,
241
+ illegal_workflow_calls: options.illegal_workflow_calls,
242
+ workflow_failure_exception_types: options.workflow_failure_exception_types,
243
+ workflow_payload_codec_thread_pool: options.workflow_payload_codec_thread_pool,
244
+ unsafe_workflow_io_enabled: options.unsafe_workflow_io_enabled,
245
+ debug_mode: options.debug_mode,
246
+ on_eviction: proc { |_, remove_job| @last_workflow_remove_job = remove_job }, # steep:ignore
247
+ assert_valid_local_activity: ->(_) {}
248
+ )
249
+
250
+ # Create the runner
251
+ @runner = Internal::Worker::MultiRunner.new(workers: [self], shutdown_signals: [])
252
+ end
253
+
254
+ # Replay a workflow history.
255
+ #
256
+ # @param history [WorkflowHistory] History to replay.
257
+ # @param raise_on_replay_failure [Boolean] If true, the default, this will raise an exception on any replay
258
+ # failure. If false and the replay fails, the failure will be available in {ReplayResult.replay_failure}.
259
+ #
260
+ # @return [ReplayResult] Result of the replay.
261
+ def replay_workflow(history, raise_on_replay_failure: true)
262
+ raise ArgumentError, 'Expected history as WorkflowHistory' unless history.is_a?(WorkflowHistory)
263
+ # Due to our event processing model, only one can run at a time
264
+ raise 'Already running' if @running
265
+ raise 'Replayer shutdown' if @shutdown
266
+
267
+ # Push history proto
268
+ # TODO(cretz): Unset this
269
+ @running = true
270
+ @last_workflow_remove_job = nil
271
+ begin
272
+ @bridge_replayer.push_history(
273
+ history.workflow_id, Api::History::V1::History.new(events: history.events).to_proto
274
+ )
275
+
276
+ # Process events until workflow complete
277
+ until @last_workflow_remove_job
278
+ event = @runner.next_event
279
+ case event
280
+ when Internal::Worker::MultiRunner::Event::PollSuccess
281
+ @workflow_worker.handle_activation(
282
+ runner: @runner,
283
+ activation: Internal::Bridge::Api::WorkflowActivation::WorkflowActivation.decode(event.bytes),
284
+ decoded: false
285
+ )
286
+ when Internal::Worker::MultiRunner::Event::WorkflowActivationDecoded
287
+ @workflow_worker.handle_activation(runner: @runner, activation: event.activation, decoded: true)
288
+ when Internal::Worker::MultiRunner::Event::WorkflowActivationComplete
289
+ @workflow_worker.handle_activation_complete(
290
+ runner: @runner,
291
+ activation_completion: event.activation_completion,
292
+ encoded: event.encoded,
293
+ completion_complete_queue: event.completion_complete_queue
294
+ )
295
+ when Internal::Worker::MultiRunner::Event::WorkflowActivationCompletionComplete
296
+ # Ignore
297
+ else
298
+ raise "Unexpected event: #{event}"
299
+ end
300
+ end
301
+
302
+ # Create exception if removal is due to error
303
+ err = if @last_workflow_remove_job.reason == :NONDETERMINISM
304
+ Workflow::NondeterminismError.new(
305
+ "#{@last_workflow_remove_job.reason}: #{@last_workflow_remove_job.message}"
306
+ )
307
+ elsif !%i[CACHE_FULL LANG_REQUESTED].include?(@last_workflow_remove_job.reason)
308
+ Workflow::InvalidWorkflowStateError.new(
309
+ "#{@last_workflow_remove_job.reason}: #{@last_workflow_remove_job.message}"
310
+ )
311
+ end
312
+ # Raise if wanting to raise, otherwise return result
313
+ raise err if raise_on_replay_failure && err
314
+
315
+ ReplayResult.new(history:, replay_failure: err)
316
+ ensure
317
+ @running = false
318
+ end
319
+ end
320
+
321
+ # @!visibility private
322
+ def _shutdown
323
+ @shutdown = true
324
+ @runner.initiate_shutdown
325
+ # Wait for all-pollers-shutdown before finalizing
326
+ until @runner.next_event.is_a?(Internal::Worker::MultiRunner::Event::AllPollersShutDown); end
327
+ @runner.wait_complete_and_finalize_shutdown
328
+ @workflow_worker.on_shutdown_complete
329
+ @workflow_worker = nil
330
+ end
331
+
332
+ # @!visibility private
333
+ def _bridge_worker
334
+ @bridge_worker
335
+ end
336
+
337
+ # @!visibility private
338
+ def _initiate_shutdown
339
+ _bridge_worker.initiate_shutdown
340
+ end
341
+
342
+ # @!visibility private
343
+ def _wait_all_complete
344
+ # Do nothing
345
+ end
346
+ end
347
+ end
348
+ end
349
+ end