clara-temporalio 0.4.3

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 (192) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +2 -0
  3. data/Cargo.lock +4429 -0
  4. data/Cargo.toml +31 -0
  5. data/Gemfile +27 -0
  6. data/LICENSE +21 -0
  7. data/README.md +1311 -0
  8. data/Rakefile +101 -0
  9. data/ext/Cargo.toml +27 -0
  10. data/lib/temporalio/activity/cancellation_details.rb +58 -0
  11. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  12. data/lib/temporalio/activity/context.rb +131 -0
  13. data/lib/temporalio/activity/definition.rb +197 -0
  14. data/lib/temporalio/activity/info.rb +70 -0
  15. data/lib/temporalio/activity.rb +14 -0
  16. data/lib/temporalio/api/activity/v1/message.rb +25 -0
  17. data/lib/temporalio/api/batch/v1/message.rb +38 -0
  18. data/lib/temporalio/api/cloud/account/v1/message.rb +28 -0
  19. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +135 -0
  20. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  21. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  22. data/lib/temporalio/api/cloud/identity/v1/message.rb +46 -0
  23. data/lib/temporalio/api/cloud/namespace/v1/message.rb +46 -0
  24. data/lib/temporalio/api/cloud/nexus/v1/message.rb +32 -0
  25. data/lib/temporalio/api/cloud/operation/v1/message.rb +28 -0
  26. data/lib/temporalio/api/cloud/region/v1/message.rb +24 -0
  27. data/lib/temporalio/api/cloud/resource/v1/message.rb +23 -0
  28. data/lib/temporalio/api/cloud/sink/v1/message.rb +24 -0
  29. data/lib/temporalio/api/cloud/usage/v1/message.rb +31 -0
  30. data/lib/temporalio/api/command/v1/message.rb +46 -0
  31. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  32. data/lib/temporalio/api/common/v1/message.rb +49 -0
  33. data/lib/temporalio/api/deployment/v1/message.rb +39 -0
  34. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  35. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  36. data/lib/temporalio/api/enums/v1/common.rb +28 -0
  37. data/lib/temporalio/api/enums/v1/deployment.rb +23 -0
  38. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  39. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  40. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  41. data/lib/temporalio/api/enums/v1/nexus.rb +21 -0
  42. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  43. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  44. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  45. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  46. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  47. data/lib/temporalio/api/enums/v1/workflow.rb +31 -0
  48. data/lib/temporalio/api/errordetails/v1/message.rb +44 -0
  49. data/lib/temporalio/api/export/v1/message.rb +24 -0
  50. data/lib/temporalio/api/failure/v1/message.rb +38 -0
  51. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  52. data/lib/temporalio/api/history/v1/message.rb +94 -0
  53. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  54. data/lib/temporalio/api/nexus/v1/message.rb +41 -0
  55. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  56. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  57. data/lib/temporalio/api/operatorservice.rb +3 -0
  58. data/lib/temporalio/api/payload_visitor.rb +1668 -0
  59. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  60. data/lib/temporalio/api/query/v1/message.rb +28 -0
  61. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  62. data/lib/temporalio/api/rules/v1/message.rb +27 -0
  63. data/lib/temporalio/api/schedule/v1/message.rb +43 -0
  64. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  65. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  66. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  67. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  68. data/lib/temporalio/api/taskqueue/v1/message.rb +48 -0
  69. data/lib/temporalio/api/testservice/v1/request_response.rb +31 -0
  70. data/lib/temporalio/api/testservice/v1/service.rb +23 -0
  71. data/lib/temporalio/api/update/v1/message.rb +33 -0
  72. data/lib/temporalio/api/version/v1/message.rb +26 -0
  73. data/lib/temporalio/api/workflow/v1/message.rb +63 -0
  74. data/lib/temporalio/api/workflowservice/v1/request_response.rb +244 -0
  75. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  76. data/lib/temporalio/api/workflowservice.rb +3 -0
  77. data/lib/temporalio/api.rb +15 -0
  78. data/lib/temporalio/cancellation.rb +170 -0
  79. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  80. data/lib/temporalio/client/async_activity_handle.rb +85 -0
  81. data/lib/temporalio/client/connection/cloud_service.rb +786 -0
  82. data/lib/temporalio/client/connection/operator_service.rb +201 -0
  83. data/lib/temporalio/client/connection/service.rb +42 -0
  84. data/lib/temporalio/client/connection/test_service.rb +111 -0
  85. data/lib/temporalio/client/connection/workflow_service.rb +1326 -0
  86. data/lib/temporalio/client/connection.rb +316 -0
  87. data/lib/temporalio/client/interceptor.rb +457 -0
  88. data/lib/temporalio/client/schedule.rb +991 -0
  89. data/lib/temporalio/client/schedule_handle.rb +126 -0
  90. data/lib/temporalio/client/with_start_workflow_operation.rb +115 -0
  91. data/lib/temporalio/client/workflow_execution.rb +119 -0
  92. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  93. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  94. data/lib/temporalio/client/workflow_handle.rb +389 -0
  95. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  96. data/lib/temporalio/client/workflow_update_handle.rb +65 -0
  97. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  98. data/lib/temporalio/client.rb +625 -0
  99. data/lib/temporalio/common_enums.rb +55 -0
  100. data/lib/temporalio/contrib/open_telemetry.rb +469 -0
  101. data/lib/temporalio/converters/data_converter.rb +99 -0
  102. data/lib/temporalio/converters/failure_converter.rb +205 -0
  103. data/lib/temporalio/converters/payload_codec.rb +26 -0
  104. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  105. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  106. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  107. data/lib/temporalio/converters/payload_converter/composite.rb +66 -0
  108. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  109. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  110. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  111. data/lib/temporalio/converters/payload_converter.rb +71 -0
  112. data/lib/temporalio/converters/raw_value.rb +20 -0
  113. data/lib/temporalio/converters.rb +9 -0
  114. data/lib/temporalio/error/failure.rb +237 -0
  115. data/lib/temporalio/error.rb +156 -0
  116. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  117. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +32 -0
  118. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  119. data/lib/temporalio/internal/bridge/api/common/common.rb +27 -0
  120. data/lib/temporalio/internal/bridge/api/core_interface.rb +40 -0
  121. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  122. data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +34 -0
  123. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +56 -0
  124. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +58 -0
  125. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +31 -0
  126. data/lib/temporalio/internal/bridge/api.rb +3 -0
  127. data/lib/temporalio/internal/bridge/client.rb +95 -0
  128. data/lib/temporalio/internal/bridge/runtime.rb +56 -0
  129. data/lib/temporalio/internal/bridge/testing.rb +69 -0
  130. data/lib/temporalio/internal/bridge/worker.rb +109 -0
  131. data/lib/temporalio/internal/bridge.rb +36 -0
  132. data/lib/temporalio/internal/client/implementation.rb +926 -0
  133. data/lib/temporalio/internal/metric.rb +122 -0
  134. data/lib/temporalio/internal/proto_utils.rb +165 -0
  135. data/lib/temporalio/internal/worker/activity_worker.rb +448 -0
  136. data/lib/temporalio/internal/worker/multi_runner.rb +213 -0
  137. data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +54 -0
  138. data/lib/temporalio/internal/worker/workflow_instance/context.rb +391 -0
  139. data/lib/temporalio/internal/worker/workflow_instance/details.rb +49 -0
  140. data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +32 -0
  141. data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +22 -0
  142. data/lib/temporalio/internal/worker/workflow_instance/handler_execution.rb +25 -0
  143. data/lib/temporalio/internal/worker/workflow_instance/handler_hash.rb +41 -0
  144. data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +97 -0
  145. data/lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb +62 -0
  146. data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +404 -0
  147. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +37 -0
  148. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_metric.rb +40 -0
  149. data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +183 -0
  150. data/lib/temporalio/internal/worker/workflow_instance.rb +800 -0
  151. data/lib/temporalio/internal/worker/workflow_worker.rb +249 -0
  152. data/lib/temporalio/internal.rb +7 -0
  153. data/lib/temporalio/metric.rb +109 -0
  154. data/lib/temporalio/priority.rb +59 -0
  155. data/lib/temporalio/retry_policy.rb +74 -0
  156. data/lib/temporalio/runtime/metric_buffer.rb +94 -0
  157. data/lib/temporalio/runtime.rb +352 -0
  158. data/lib/temporalio/scoped_logger.rb +96 -0
  159. data/lib/temporalio/search_attributes.rb +356 -0
  160. data/lib/temporalio/testing/activity_environment.rb +175 -0
  161. data/lib/temporalio/testing/workflow_environment.rb +406 -0
  162. data/lib/temporalio/testing.rb +10 -0
  163. data/lib/temporalio/version.rb +5 -0
  164. data/lib/temporalio/versioning_override.rb +55 -0
  165. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  166. data/lib/temporalio/worker/activity_executor/thread_pool.rb +46 -0
  167. data/lib/temporalio/worker/activity_executor.rb +55 -0
  168. data/lib/temporalio/worker/deployment_options.rb +45 -0
  169. data/lib/temporalio/worker/interceptor.rb +367 -0
  170. data/lib/temporalio/worker/poller_behavior.rb +61 -0
  171. data/lib/temporalio/worker/thread_pool.rb +237 -0
  172. data/lib/temporalio/worker/tuner.rb +189 -0
  173. data/lib/temporalio/worker/workflow_executor/thread_pool.rb +236 -0
  174. data/lib/temporalio/worker/workflow_executor.rb +26 -0
  175. data/lib/temporalio/worker/workflow_replayer.rb +349 -0
  176. data/lib/temporalio/worker.rb +633 -0
  177. data/lib/temporalio/worker_deployment_version.rb +67 -0
  178. data/lib/temporalio/workflow/activity_cancellation_type.rb +20 -0
  179. data/lib/temporalio/workflow/child_workflow_cancellation_type.rb +21 -0
  180. data/lib/temporalio/workflow/child_workflow_handle.rb +43 -0
  181. data/lib/temporalio/workflow/definition.rb +680 -0
  182. data/lib/temporalio/workflow/external_workflow_handle.rb +41 -0
  183. data/lib/temporalio/workflow/future.rb +151 -0
  184. data/lib/temporalio/workflow/handler_unfinished_policy.rb +13 -0
  185. data/lib/temporalio/workflow/info.rb +107 -0
  186. data/lib/temporalio/workflow/parent_close_policy.rb +19 -0
  187. data/lib/temporalio/workflow/update_info.rb +20 -0
  188. data/lib/temporalio/workflow.rb +594 -0
  189. data/lib/temporalio/workflow_history.rb +47 -0
  190. data/lib/temporalio.rb +12 -0
  191. data/temporalio.gemspec +31 -0
  192. metadata +263 -0
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/cancellation'
4
+ require 'temporalio/workflow'
5
+ require 'temporalio/workflow/child_workflow_handle'
6
+
7
+ module Temporalio
8
+ module Internal
9
+ module Worker
10
+ class WorkflowInstance
11
+ # Implementation of the child workflow handle.
12
+ class ChildWorkflowHandle < Workflow::ChildWorkflowHandle
13
+ attr_reader :id, :first_execution_run_id
14
+
15
+ def initialize(id:, first_execution_run_id:, instance:, cancellation:, cancel_callback_key:) # rubocop:disable Lint/MissingSuper
16
+ @id = id
17
+ @first_execution_run_id = first_execution_run_id
18
+ @instance = instance
19
+ @cancellation = cancellation
20
+ @cancel_callback_key = cancel_callback_key
21
+ @resolution = nil
22
+ end
23
+
24
+ def result
25
+ # Notice that we actually provide a detached cancellation here instead of defaulting to workflow
26
+ # cancellation because we don't want workflow cancellation (or a user-provided cancellation to this result
27
+ # call) to be able to interrupt waiting on a child that may be processing the cancellation.
28
+ Workflow.wait_condition(cancellation: Cancellation.new) { @resolution }
29
+
30
+ case @resolution.status
31
+ when :completed
32
+ @instance.payload_converter.from_payload(@resolution.completed.result)
33
+ when :failed
34
+ raise @instance.failure_converter.from_failure(@resolution.failed.failure, @instance.payload_converter)
35
+ when :cancelled
36
+ raise @instance.failure_converter.from_failure(@resolution.cancelled.failure, @instance.payload_converter)
37
+ else
38
+ raise "Unrecognized resolution status: #{@resolution.status}"
39
+ end
40
+ end
41
+
42
+ def _resolve(resolution)
43
+ @cancellation.remove_cancel_callback(@cancel_callback_key)
44
+ @resolution = resolution
45
+ end
46
+
47
+ def signal(signal, *args, cancellation: Workflow.cancellation)
48
+ @instance.context._signal_child_workflow(id:, signal:, args:, cancellation:)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,391 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/cancellation'
4
+ require 'temporalio/error'
5
+ require 'temporalio/internal/bridge/api'
6
+ require 'temporalio/internal/proto_utils'
7
+ require 'temporalio/internal/worker/workflow_instance'
8
+ require 'temporalio/internal/worker/workflow_instance/external_workflow_handle'
9
+ require 'temporalio/worker/interceptor'
10
+ require 'temporalio/workflow'
11
+
12
+ module Temporalio
13
+ module Internal
14
+ module Worker
15
+ class WorkflowInstance
16
+ # Context for all workflow calls. All calls in the {Workflow} class should call a method on this class and then
17
+ # this class can delegate the call as needed to other parts of the workflow instance system.
18
+ class Context
19
+ def initialize(instance)
20
+ @instance = instance
21
+ end
22
+
23
+ def all_handlers_finished?
24
+ @instance.in_progress_handlers.empty?
25
+ end
26
+
27
+ def cancellation
28
+ @instance.cancellation
29
+ end
30
+
31
+ def continue_as_new_suggested
32
+ @instance.continue_as_new_suggested
33
+ end
34
+
35
+ def current_details
36
+ @instance.current_details || ''
37
+ end
38
+
39
+ def current_details=(details)
40
+ raise 'Details must be a String' unless details.nil? || details.is_a?(String)
41
+
42
+ @instance.current_details = (details || '')
43
+ end
44
+
45
+ def current_deployment_version
46
+ @instance.current_deployment_version
47
+ end
48
+
49
+ def current_history_length
50
+ @instance.current_history_length
51
+ end
52
+
53
+ def current_history_size
54
+ @instance.current_history_size
55
+ end
56
+
57
+ def current_update_info
58
+ Fiber[:__temporal_update_info]
59
+ end
60
+
61
+ def deprecate_patch(patch_id)
62
+ @instance.patch(patch_id:, deprecated: true)
63
+ end
64
+
65
+ def execute_activity(
66
+ activity,
67
+ *args,
68
+ task_queue:,
69
+ summary:,
70
+ schedule_to_close_timeout:,
71
+ schedule_to_start_timeout:,
72
+ start_to_close_timeout:,
73
+ heartbeat_timeout:,
74
+ retry_policy:,
75
+ cancellation:,
76
+ cancellation_type:,
77
+ activity_id:,
78
+ disable_eager_execution:,
79
+ priority:
80
+ )
81
+ activity = case activity
82
+ when Class
83
+ Activity::Definition::Info.from_activity(activity).name&.to_s
84
+ when Symbol, String
85
+ activity.to_s
86
+ else
87
+ raise ArgumentError, 'Activity must be a definition class, or a symbol/string'
88
+ end
89
+ raise 'Cannot invoke dynamic activities' unless activity
90
+
91
+ @outbound.execute_activity(
92
+ Temporalio::Worker::Interceptor::Workflow::ExecuteActivityInput.new(
93
+ activity:,
94
+ args:,
95
+ task_queue: task_queue || info.task_queue,
96
+ summary:,
97
+ schedule_to_close_timeout:,
98
+ schedule_to_start_timeout:,
99
+ start_to_close_timeout:,
100
+ heartbeat_timeout:,
101
+ retry_policy:,
102
+ cancellation:,
103
+ cancellation_type:,
104
+ activity_id:,
105
+ disable_eager_execution: disable_eager_execution || @instance.disable_eager_activity_execution,
106
+ priority:,
107
+ headers: {}
108
+ )
109
+ )
110
+ end
111
+
112
+ def execute_local_activity(
113
+ activity,
114
+ *args,
115
+ schedule_to_close_timeout:,
116
+ schedule_to_start_timeout:,
117
+ start_to_close_timeout:,
118
+ retry_policy:,
119
+ local_retry_threshold:,
120
+ cancellation:,
121
+ cancellation_type:,
122
+ activity_id:
123
+ )
124
+ activity = case activity
125
+ when Class
126
+ Activity::Definition::Info.from_activity(activity).name&.to_s
127
+ when Symbol, String
128
+ activity.to_s
129
+ else
130
+ raise ArgumentError, 'Activity must be a definition class, or a symbol/string'
131
+ end
132
+ raise 'Cannot invoke dynamic activities' unless activity
133
+
134
+ @outbound.execute_local_activity(
135
+ Temporalio::Worker::Interceptor::Workflow::ExecuteLocalActivityInput.new(
136
+ activity:,
137
+ args:,
138
+ schedule_to_close_timeout:,
139
+ schedule_to_start_timeout:,
140
+ start_to_close_timeout:,
141
+ retry_policy:,
142
+ local_retry_threshold:,
143
+ cancellation:,
144
+ cancellation_type:,
145
+ activity_id:,
146
+ headers: {}
147
+ )
148
+ )
149
+ end
150
+
151
+ def external_workflow_handle(workflow_id, run_id: nil)
152
+ ExternalWorkflowHandle.new(id: workflow_id, run_id:, instance: @instance)
153
+ end
154
+
155
+ def illegal_call_tracing_disabled(&)
156
+ @instance.illegal_call_tracing_disabled(&)
157
+ end
158
+
159
+ def info
160
+ @instance.info
161
+ end
162
+
163
+ def instance
164
+ @instance.instance
165
+ end
166
+
167
+ def initialize_continue_as_new_error(error)
168
+ @outbound.initialize_continue_as_new_error(
169
+ Temporalio::Worker::Interceptor::Workflow::InitializeContinueAsNewErrorInput.new(error:)
170
+ )
171
+ end
172
+
173
+ def io_enabled(&)
174
+ prev = @instance.io_enabled
175
+ @instance.io_enabled = true
176
+ begin
177
+ yield
178
+ ensure
179
+ @instance.io_enabled = prev
180
+ end
181
+ end
182
+
183
+ def logger
184
+ @instance.logger
185
+ end
186
+
187
+ def memo
188
+ @instance.memo
189
+ end
190
+
191
+ def metric_meter
192
+ @instance.metric_meter
193
+ end
194
+
195
+ def now
196
+ @instance.now
197
+ end
198
+
199
+ def patched(patch_id)
200
+ @instance.patch(patch_id:, deprecated: false)
201
+ end
202
+
203
+ def payload_converter
204
+ @instance.payload_converter
205
+ end
206
+
207
+ def query_handlers
208
+ @instance.query_handlers
209
+ end
210
+
211
+ def random
212
+ @instance.random
213
+ end
214
+
215
+ def replaying?
216
+ @instance.replaying
217
+ end
218
+
219
+ def search_attributes
220
+ @instance.search_attributes
221
+ end
222
+
223
+ def signal_handlers
224
+ @instance.signal_handlers
225
+ end
226
+
227
+ def sleep(duration, summary:, cancellation:)
228
+ @outbound.sleep(
229
+ Temporalio::Worker::Interceptor::Workflow::SleepInput.new(
230
+ duration:,
231
+ summary:,
232
+ cancellation:
233
+ )
234
+ )
235
+ end
236
+
237
+ def start_child_workflow(
238
+ workflow,
239
+ *args,
240
+ id:,
241
+ task_queue:,
242
+ static_summary:,
243
+ static_details:,
244
+ cancellation:,
245
+ cancellation_type:,
246
+ parent_close_policy:,
247
+ execution_timeout:,
248
+ run_timeout:,
249
+ task_timeout:,
250
+ id_reuse_policy:,
251
+ retry_policy:,
252
+ cron_schedule:,
253
+ memo:,
254
+ search_attributes:,
255
+ priority:
256
+ )
257
+ @outbound.start_child_workflow(
258
+ Temporalio::Worker::Interceptor::Workflow::StartChildWorkflowInput.new(
259
+ workflow: Workflow::Definition._workflow_type_from_workflow_parameter(workflow),
260
+ args:,
261
+ id:,
262
+ task_queue:,
263
+ static_summary:,
264
+ static_details:,
265
+ cancellation:,
266
+ cancellation_type:,
267
+ parent_close_policy:,
268
+ execution_timeout:,
269
+ run_timeout:,
270
+ task_timeout:,
271
+ id_reuse_policy:,
272
+ retry_policy:,
273
+ cron_schedule:,
274
+ memo:,
275
+ search_attributes:,
276
+ priority:,
277
+ headers: {}
278
+ )
279
+ )
280
+ end
281
+
282
+ def storage
283
+ @storage ||= {}
284
+ end
285
+
286
+ def timeout(duration, exception_class, *exception_args, summary:, &)
287
+ raise 'Block required for timeout' unless block_given?
288
+
289
+ # Run timer in background and block in foreground. This gives better stack traces than a future any-of race.
290
+ # We make a detached cancellation because we don't want to link to workflow cancellation.
291
+ sleep_cancel, sleep_cancel_proc = Cancellation.new
292
+ fiber = Fiber.current
293
+ Workflow::Future.new do
294
+ Workflow.sleep(duration, summary:, cancellation: sleep_cancel)
295
+ fiber.raise(exception_class, *exception_args) if fiber.alive? # steep:ignore
296
+ rescue Exception => e # rubocop:disable Lint/RescueException
297
+ # Re-raise in fiber
298
+ fiber.raise(e) if fiber.alive?
299
+ end
300
+
301
+ begin
302
+ yield
303
+ ensure
304
+ sleep_cancel_proc.call
305
+ end
306
+ end
307
+
308
+ def update_handlers
309
+ @instance.update_handlers
310
+ end
311
+
312
+ def upsert_memo(hash)
313
+ # Convert to memo, apply updates, then add the command (so command adding is post validation)
314
+ upserted_memo = ProtoUtils.memo_to_proto(hash, payload_converter)
315
+ memo._update do |new_hash|
316
+ hash.each do |key, val|
317
+ # Nil means delete
318
+ if val.nil?
319
+ new_hash.delete(key.to_s)
320
+ else
321
+ new_hash[key.to_s] = val
322
+ end
323
+ end
324
+ end
325
+ @instance.add_command(
326
+ Bridge::Api::WorkflowCommands::WorkflowCommand.new(
327
+ modify_workflow_properties: Bridge::Api::WorkflowCommands::ModifyWorkflowProperties.new(
328
+ upserted_memo:
329
+ )
330
+ )
331
+ )
332
+ end
333
+
334
+ def upsert_search_attributes(*updates)
335
+ # Apply updates then add the command (so command adding is post validation)
336
+ search_attributes._disable_mutations = false
337
+ search_attributes.update!(*updates)
338
+ @instance.add_command(
339
+ Bridge::Api::WorkflowCommands::WorkflowCommand.new(
340
+ upsert_workflow_search_attributes: Bridge::Api::WorkflowCommands::UpsertWorkflowSearchAttributes.new(
341
+ search_attributes: updates.to_h(&:_to_proto_pair)
342
+ )
343
+ )
344
+ )
345
+ ensure
346
+ search_attributes._disable_mutations = true
347
+ end
348
+
349
+ def wait_condition(cancellation:, &)
350
+ @instance.scheduler.wait_condition(cancellation:, &)
351
+ end
352
+
353
+ def _cancel_external_workflow(id:, run_id:)
354
+ @outbound.cancel_external_workflow(
355
+ Temporalio::Worker::Interceptor::Workflow::CancelExternalWorkflowInput.new(id:, run_id:)
356
+ )
357
+ end
358
+
359
+ def _outbound=(outbound)
360
+ @outbound = outbound
361
+ end
362
+
363
+ def _signal_child_workflow(id:, signal:, args:, cancellation:)
364
+ @outbound.signal_child_workflow(
365
+ Temporalio::Worker::Interceptor::Workflow::SignalChildWorkflowInput.new(
366
+ id:,
367
+ signal: Workflow::Definition::Signal._name_from_parameter(signal),
368
+ args:,
369
+ cancellation:,
370
+ headers: {}
371
+ )
372
+ )
373
+ end
374
+
375
+ def _signal_external_workflow(id:, run_id:, signal:, args:, cancellation:)
376
+ @outbound.signal_external_workflow(
377
+ Temporalio::Worker::Interceptor::Workflow::SignalExternalWorkflowInput.new(
378
+ id:,
379
+ run_id:,
380
+ signal: Workflow::Definition::Signal._name_from_parameter(signal),
381
+ args:,
382
+ cancellation:,
383
+ headers: {}
384
+ )
385
+ )
386
+ end
387
+ end
388
+ end
389
+ end
390
+ end
391
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Temporalio
4
+ module Internal
5
+ module Worker
6
+ class WorkflowInstance
7
+ # Details needed to instantiate a {WorkflowInstance}.
8
+ class Details
9
+ attr_reader :namespace, :task_queue, :definition, :initial_activation, :logger, :metric_meter,
10
+ :payload_converter, :failure_converter, :interceptors, :disable_eager_activity_execution,
11
+ :illegal_calls, :workflow_failure_exception_types, :unsafe_workflow_io_enabled,
12
+ :assert_valid_local_activity
13
+
14
+ def initialize(
15
+ namespace:,
16
+ task_queue:,
17
+ definition:,
18
+ initial_activation:,
19
+ logger:,
20
+ metric_meter:,
21
+ payload_converter:,
22
+ failure_converter:,
23
+ interceptors:,
24
+ disable_eager_activity_execution:,
25
+ illegal_calls:,
26
+ workflow_failure_exception_types:,
27
+ unsafe_workflow_io_enabled:,
28
+ assert_valid_local_activity:
29
+ )
30
+ @namespace = namespace
31
+ @task_queue = task_queue
32
+ @definition = definition
33
+ @initial_activation = initial_activation
34
+ @logger = logger
35
+ @metric_meter = metric_meter
36
+ @payload_converter = payload_converter
37
+ @failure_converter = failure_converter
38
+ @interceptors = interceptors
39
+ @disable_eager_activity_execution = disable_eager_activity_execution
40
+ @illegal_calls = illegal_calls
41
+ @workflow_failure_exception_types = workflow_failure_exception_types
42
+ @unsafe_workflow_io_enabled = unsafe_workflow_io_enabled
43
+ @assert_valid_local_activity = assert_valid_local_activity
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/cancellation'
4
+ require 'temporalio/workflow'
5
+ require 'temporalio/workflow/external_workflow_handle'
6
+
7
+ module Temporalio
8
+ module Internal
9
+ module Worker
10
+ class WorkflowInstance
11
+ # Implementation of the external workflow handle.
12
+ class ExternalWorkflowHandle < Workflow::ExternalWorkflowHandle
13
+ attr_reader :id, :run_id
14
+
15
+ def initialize(id:, run_id:, instance:) # rubocop:disable Lint/MissingSuper
16
+ @id = id
17
+ @run_id = run_id
18
+ @instance = instance
19
+ end
20
+
21
+ def signal(signal, *args, cancellation: Workflow.cancellation)
22
+ @instance.context._signal_external_workflow(id:, run_id:, signal:, args:, cancellation:)
23
+ end
24
+
25
+ def cancel
26
+ @instance.context._cancel_external_workflow(id:, run_id:)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Temporalio
4
+ module Internal
5
+ module Worker
6
+ class WorkflowInstance
7
+ # Delegator to a hash that does not allow external mutations. Used for memo.
8
+ class ExternallyImmutableHash < SimpleDelegator
9
+ def initialize(initial_hash)
10
+ super(initial_hash.freeze)
11
+ end
12
+
13
+ def _update(&)
14
+ new_hash = __getobj__.dup
15
+ yield new_hash
16
+ __setobj__(new_hash.freeze)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Temporalio
4
+ module Internal
5
+ module Worker
6
+ class WorkflowInstance
7
+ # Representation of a currently-executing handler. Used to track whether any handlers are still running and warn
8
+ # on workflow complete as needed.
9
+ class HandlerExecution
10
+ attr_reader :name, :update_id, :unfinished_policy
11
+
12
+ def initialize(
13
+ name:,
14
+ update_id:,
15
+ unfinished_policy:
16
+ )
17
+ @name = name
18
+ @update_id = update_id
19
+ @unfinished_policy = unfinished_policy
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Temporalio
4
+ module Internal
5
+ module Worker
6
+ class WorkflowInstance
7
+ # Hash for handlers that notifies when one is added. Only `[]=` and `store` can be used to mutate it.
8
+ class HandlerHash < SimpleDelegator
9
+ def initialize(initial_frozen_hash, definition_class, &on_new_definition)
10
+ super(initial_frozen_hash)
11
+ @definition_class = definition_class
12
+ @on_new_definition = on_new_definition
13
+ end
14
+
15
+ def []=(name, definition)
16
+ store(name, definition)
17
+ end
18
+
19
+ # steep:ignore:start
20
+ def store(name, definition)
21
+ raise ArgumentError, 'Name must be a string or nil' unless name.nil? || name.is_a?(String)
22
+
23
+ unless definition.nil? || definition.is_a?(@definition_class)
24
+ raise ArgumentError,
25
+ "Value must be a #{@definition_class.name} or nil"
26
+ end
27
+ raise ArgumentError, 'Name does not match one in definition' if definition && name != definition.name
28
+
29
+ # Do a copy-on-write op on the underlying frozen hash
30
+ new_hash = __getobj__.dup
31
+ new_hash[name] = definition
32
+ __setobj__(new_hash.freeze)
33
+ @on_new_definition&.call(definition) unless definition.nil?
34
+ definition
35
+ end
36
+ # steep:ignore:end
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end