temporalio 0.4.0-aarch64-linux-musl

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