temporalio 0.2.0-arm64-darwin

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +23 -0
  3. data/Rakefile +387 -0
  4. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  5. data/lib/temporalio/activity/context.rb +107 -0
  6. data/lib/temporalio/activity/definition.rb +77 -0
  7. data/lib/temporalio/activity/info.rb +63 -0
  8. data/lib/temporalio/activity.rb +69 -0
  9. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  10. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
  11. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  12. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  13. data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
  14. data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
  15. data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
  16. data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
  17. data/lib/temporalio/api/command/v1/message.rb +46 -0
  18. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  19. data/lib/temporalio/api/common/v1/message.rb +41 -0
  20. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  21. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  22. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  23. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  24. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  25. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  26. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  27. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  28. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  29. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  30. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  31. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  32. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  33. data/lib/temporalio/api/export/v1/message.rb +24 -0
  34. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  35. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  36. data/lib/temporalio/api/history/v1/message.rb +90 -0
  37. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  38. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  39. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  40. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  41. data/lib/temporalio/api/operatorservice.rb +3 -0
  42. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  43. data/lib/temporalio/api/query/v1/message.rb +27 -0
  44. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  45. data/lib/temporalio/api/schedule/v1/message.rb +42 -0
  46. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  47. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  48. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  49. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  50. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  51. data/lib/temporalio/api/update/v1/message.rb +33 -0
  52. data/lib/temporalio/api/version/v1/message.rb +26 -0
  53. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  54. data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
  55. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  56. data/lib/temporalio/api/workflowservice.rb +3 -0
  57. data/lib/temporalio/api.rb +13 -0
  58. data/lib/temporalio/cancellation.rb +150 -0
  59. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  60. data/lib/temporalio/client/async_activity_handle.rb +110 -0
  61. data/lib/temporalio/client/connection/cloud_service.rb +648 -0
  62. data/lib/temporalio/client/connection/operator_service.rb +249 -0
  63. data/lib/temporalio/client/connection/service.rb +41 -0
  64. data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
  65. data/lib/temporalio/client/connection.rb +270 -0
  66. data/lib/temporalio/client/interceptor.rb +316 -0
  67. data/lib/temporalio/client/workflow_execution.rb +103 -0
  68. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  69. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  70. data/lib/temporalio/client/workflow_handle.rb +446 -0
  71. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  72. data/lib/temporalio/client/workflow_update_handle.rb +67 -0
  73. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  74. data/lib/temporalio/client.rb +404 -0
  75. data/lib/temporalio/common_enums.rb +24 -0
  76. data/lib/temporalio/converters/data_converter.rb +102 -0
  77. data/lib/temporalio/converters/failure_converter.rb +200 -0
  78. data/lib/temporalio/converters/payload_codec.rb +26 -0
  79. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  80. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  81. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  82. data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
  83. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  84. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  85. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  86. data/lib/temporalio/converters/payload_converter.rb +73 -0
  87. data/lib/temporalio/converters.rb +9 -0
  88. data/lib/temporalio/error/failure.rb +219 -0
  89. data/lib/temporalio/error.rb +147 -0
  90. data/lib/temporalio/internal/bridge/3.1/temporalio_bridge.bundle +0 -0
  91. data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.bundle +0 -0
  92. data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.bundle +0 -0
  93. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  94. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  95. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  96. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  97. data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
  98. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  99. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
  100. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
  101. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  102. data/lib/temporalio/internal/bridge/api.rb +3 -0
  103. data/lib/temporalio/internal/bridge/client.rb +90 -0
  104. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  105. data/lib/temporalio/internal/bridge/testing.rb +46 -0
  106. data/lib/temporalio/internal/bridge/worker.rb +83 -0
  107. data/lib/temporalio/internal/bridge.rb +36 -0
  108. data/lib/temporalio/internal/client/implementation.rb +525 -0
  109. data/lib/temporalio/internal/proto_utils.rb +54 -0
  110. data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
  111. data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
  112. data/lib/temporalio/internal.rb +7 -0
  113. data/lib/temporalio/retry_policy.rb +51 -0
  114. data/lib/temporalio/runtime.rb +271 -0
  115. data/lib/temporalio/scoped_logger.rb +96 -0
  116. data/lib/temporalio/search_attributes.rb +300 -0
  117. data/lib/temporalio/testing/activity_environment.rb +132 -0
  118. data/lib/temporalio/testing/workflow_environment.rb +137 -0
  119. data/lib/temporalio/testing.rb +10 -0
  120. data/lib/temporalio/version.rb +5 -0
  121. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  122. data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
  123. data/lib/temporalio/worker/activity_executor.rb +55 -0
  124. data/lib/temporalio/worker/interceptor.rb +88 -0
  125. data/lib/temporalio/worker/tuner.rb +151 -0
  126. data/lib/temporalio/worker.rb +426 -0
  127. data/lib/temporalio/workflow_history.rb +22 -0
  128. data/lib/temporalio.rb +7 -0
  129. data/temporalio.gemspec +28 -0
  130. metadata +191 -0
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Temporalio
4
+ class Client
5
+ # Representation of a count from a count workflows call.
6
+ class WorkflowExecutionCount
7
+ # @return [Integer] Approximate number of workflows matching the original query. If the query had a group-by
8
+ # clause, this is simply the sum of all the counts in {groups}.
9
+ attr_reader :count
10
+
11
+ # @return [Array<AggregationGroup>] Groups if the query had a group-by clause, or empty if not.
12
+ attr_reader :groups
13
+
14
+ # @!visibility private
15
+ def initialize(count, groups)
16
+ @count = count
17
+ @groups = groups
18
+ end
19
+
20
+ # Aggregation group if the workflow count query had a group-by clause.
21
+ class AggregationGroup
22
+ # @return [Integer] Approximate number of workflows matching the original query for this group.
23
+ attr_reader :count
24
+
25
+ # @return [Array<Object>] Search attribute values for this group.
26
+ attr_reader :group_values
27
+
28
+ # @!visibility private
29
+ def initialize(count, group_values)
30
+ @count = count
31
+ @group_values = group_values
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/api'
4
+
5
+ module Temporalio
6
+ class Client
7
+ # Status of a workflow execution.
8
+ module WorkflowExecutionStatus
9
+ RUNNING = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_RUNNING
10
+ COMPLETED = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_COMPLETED
11
+ FAILED = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_FAILED
12
+ CANCELED = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_CANCELED
13
+ TERMINATED = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_TERMINATED
14
+ CONTINUED_AS_NEW = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_CONTINUED_AS_NEW
15
+ TIMED_OUT = Api::Enums::V1::WorkflowExecutionStatus::WORKFLOW_EXECUTION_STATUS_TIMED_OUT
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,446 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'temporalio/api'
5
+ require 'temporalio/client/interceptor'
6
+ require 'temporalio/client/workflow_update_handle'
7
+ require 'temporalio/client/workflow_update_wait_stage'
8
+ require 'temporalio/error'
9
+ require 'temporalio/workflow_history'
10
+
11
+ module Temporalio
12
+ class Client
13
+ # Handle for interacting with a workflow. This is usually created via {Client.start_workflow} or
14
+ # {Client.workflow_handle}.
15
+ class WorkflowHandle
16
+ # @return [String] ID for the workflow.
17
+ attr_reader :id
18
+
19
+ # Run ID used for {signal}, {query}, and {start_update}/{execute_update} calls if present to ensure the
20
+ # signal/query/update happen on this exact run.
21
+ #
22
+ # This is only created via {Client.workflow_handle}. {Client.start_workflow} will not set this value.
23
+ #
24
+ # This cannot be mutated. If a different run ID is needed, {Client.workflow_handle} must be used instead.
25
+ #
26
+ # @return [String, nil] Run ID.
27
+ attr_reader :run_id
28
+
29
+ # Run ID used for {result} calls if present to ensure result is for a workflow starting from this run.
30
+ #
31
+ # When this handle is created via {Client.workflow_handle}, this is the same as {run_id}. When this handle is
32
+ # created via {Client.start_workflow}, this value will be the resulting run ID.
33
+ #
34
+ # This cannot be mutated. If a different run ID is needed, {Client.workflow_handle} must be used instead.
35
+ #
36
+ # @return [String, nil] Result run ID.
37
+ attr_reader :result_run_id
38
+
39
+ # Run ID used for some calls like {cancel} and {terminate} to ensure the cancel and terminate happen for a
40
+ # workflow ID on a chain started with this run ID.
41
+ #
42
+ # This can be set when using {Client.workflow_handle}. When {Client.start_workflow} is called without a start
43
+ # signal, this is set to the resulting run.
44
+ #
45
+ # This cannot be mutated. If a different first execution run ID is needed, {Client.workflow_handle} must be used
46
+ # instead.
47
+ #
48
+ # @return [String, nil] First execution run ID.
49
+ attr_reader :first_execution_run_id
50
+
51
+ # @!visibility private
52
+ def initialize(client:, id:, run_id:, result_run_id:, first_execution_run_id:)
53
+ @client = client
54
+ @id = id
55
+ @run_id = run_id
56
+ @result_run_id = result_run_id
57
+ @first_execution_run_id = first_execution_run_id
58
+ end
59
+
60
+ # Wait for the result of the workflow.
61
+ #
62
+ # This will use {result_run_id} if present to base the result on. To use another run ID, a new handle must be
63
+ # created via {Client.workflow_handle}.
64
+ #
65
+ # @param follow_runs [Boolean] If +true+, workflow runs will be continually fetched across retries and continue as
66
+ # new until the latest one is found. If +false+, the first result is used.
67
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
68
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
69
+ #
70
+ # @return [Object] Result of the workflow after being converted by the data converter.
71
+ #
72
+ # @raise [Error::WorkflowFailedError] Workflow failed with +cause+ as the cause.
73
+ # @raise [Error::WorkflowContinuedAsNewError] Workflow continued as new and +follow_runs+ is +false+.
74
+ # @raise [Error::RPCError] RPC error from call.
75
+ def result(
76
+ follow_runs: true,
77
+ rpc_metadata: nil,
78
+ rpc_timeout: nil
79
+ )
80
+ # Wait on the close event, following as needed
81
+ hist_run_id = result_run_id
82
+ loop do
83
+ # Get close event
84
+ event = fetch_history_events(
85
+ wait_new_event: true,
86
+ event_filter_type: Api::Enums::V1::HistoryEventFilterType::HISTORY_EVENT_FILTER_TYPE_CLOSE_EVENT,
87
+ skip_archival: true,
88
+ specific_run_id: hist_run_id,
89
+ rpc_metadata:,
90
+ rpc_timeout:
91
+ ).next
92
+
93
+ # Check each close type'
94
+ case event.event_type
95
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED
96
+ attrs = event.workflow_execution_completed_event_attributes
97
+ hist_run_id = attrs.new_execution_run_id
98
+ next if follow_runs && hist_run_id && !hist_run_id.empty?
99
+
100
+ return @client.data_converter.from_payloads(attrs.result).first
101
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_FAILED
102
+ attrs = event.workflow_execution_failed_event_attributes
103
+ hist_run_id = attrs.new_execution_run_id
104
+ next if follow_runs && hist_run_id && !hist_run_id.empty?
105
+
106
+ raise Error::WorkflowFailedError.new, cause: @client.data_converter.from_failure(attrs.failure)
107
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED
108
+ attrs = event.workflow_execution_canceled_event_attributes
109
+ raise Error::WorkflowFailedError.new, cause: Error::CanceledError.new(
110
+ 'Workflow execution canceled',
111
+ details: @client.data_converter.from_payloads(attrs&.details)
112
+ )
113
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED
114
+ attrs = event.workflow_execution_terminated_event_attributes
115
+ raise Error::WorkflowFailedError.new, cause: Error::TerminatedError.new(
116
+ Internal::ProtoUtils.string_or(attrs.reason, 'Workflow execution terminated'),
117
+ details: @client.data_converter.from_payloads(attrs&.details)
118
+ )
119
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT
120
+ attrs = event.workflow_execution_timed_out_event_attributes
121
+ hist_run_id = attrs.new_execution_run_id
122
+ next if follow_runs && hist_run_id && !hist_run_id.empty?
123
+
124
+ raise Error::WorkflowFailedError.new, cause: Error::TimeoutError.new(
125
+ 'Workflow execution timed out',
126
+ type: Api::Enums::V1::TimeoutType::TIMEOUT_TYPE_START_TO_CLOSE,
127
+ last_heartbeat_details: []
128
+ )
129
+ when :EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW
130
+ attrs = event.workflow_execution_continued_as_new_event_attributes
131
+ hist_run_id = attrs.new_execution_run_id
132
+ next if follow_runs && hist_run_id && !hist_run_id.empty?
133
+
134
+ # TODO: Use more specific error and decode failure
135
+ raise Error::WorkflowContinuedAsNewError.new(new_run_id: attrs.new_execution_run_id)
136
+ else
137
+ raise Error, "Unknown close event type: #{event.event_type}"
138
+ end
139
+ end
140
+ end
141
+
142
+ # Get workflow details. This will get details for the {run_id} if present. To use a different run ID, create a new
143
+ # handle via {Client.workflow_handle}.
144
+ #
145
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
146
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
147
+ #
148
+ # @return [WorkflowExecution::Description] Workflow description.
149
+ #
150
+ # @raise [Error::RPCError] RPC error from call.
151
+ #
152
+ # @note Handles created as a result of {Client.start_workflow} will describe the latest workflow with the same
153
+ # workflow ID even if it is unrelated to the started workflow.
154
+ def describe(
155
+ rpc_metadata: nil,
156
+ rpc_timeout: nil
157
+ )
158
+ @client._impl.describe_workflow(Interceptor::DescribeWorkflowInput.new(
159
+ workflow_id: id,
160
+ run_id:,
161
+ rpc_metadata:,
162
+ rpc_timeout:
163
+ ))
164
+ end
165
+
166
+ # Get workflow history. This is a helper on top of {fetch_history_events}.
167
+ #
168
+ # @param event_filter_type [Api::Enums::V1::HistoryEventFilterType] Types of events to fetch.
169
+ # @param skip_archival [Boolean] Whether to skip archival.
170
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
171
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
172
+ #
173
+ # @return [WorkflowHistory] Workflow history.
174
+ #
175
+ # @raise [Error::RPCError] RPC error from call.
176
+ def fetch_history(
177
+ event_filter_type: Api::Enums::V1::HistoryEventFilterType::HISTORY_EVENT_FILTER_TYPE_ALL_EVENT,
178
+ skip_archival: false,
179
+ rpc_metadata: nil,
180
+ rpc_timeout: nil
181
+ )
182
+ WorkflowHistory.new(
183
+ fetch_history_events(
184
+ event_filter_type:,
185
+ skip_archival:,
186
+ rpc_metadata:,
187
+ rpc_timeout:
188
+ ).to_a
189
+ )
190
+ end
191
+
192
+ # Fetch an enumerator of history events for this workflow. Internally this is done in paginated form, but it is
193
+ # presented as an enumerator.
194
+ #
195
+ # @param wait_new_event [Boolean] If +true+, when the end of the current set of events is reached but the workflow
196
+ # is not complete, this will wait for the next event. If +false+, the enumerable completes at the end of current
197
+ # history.
198
+ # @param event_filter_type [Api::Enums::V1::HistoryEventFilterType] Types of events to fetch.
199
+ # @param skip_archival [Boolean] Whether to skip archival.
200
+ # @param specific_run_id [String, nil] Run ID to fetch events for. Default is the {run_id}. Most users will not
201
+ # need to set this and instead use the one on the class.
202
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
203
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
204
+ #
205
+ # @return [Enumerator<Api::History::V1::HistoryEvent>] Enumerable events.
206
+ #
207
+ # @raise [Error::RPCError] RPC error from call.
208
+ def fetch_history_events(
209
+ wait_new_event: false,
210
+ event_filter_type: Api::Enums::V1::HistoryEventFilterType::HISTORY_EVENT_FILTER_TYPE_ALL_EVENT,
211
+ skip_archival: false,
212
+ specific_run_id: run_id,
213
+ rpc_metadata: nil,
214
+ rpc_timeout: nil
215
+ )
216
+ @client._impl.fetch_workflow_history_events(Interceptor::FetchWorkflowHistoryEventsInput.new(
217
+ workflow_id: id,
218
+ run_id: specific_run_id,
219
+ wait_new_event:,
220
+ event_filter_type:,
221
+ skip_archival:,
222
+ rpc_metadata:,
223
+ rpc_timeout:
224
+ ))
225
+ end
226
+
227
+ # Send a signal to the workflow. This will signal for {run_id} if present. To use a different run ID, create a new
228
+ # handle via {Client.workflow_handle}.
229
+ #
230
+ # @param signal [String] Signal name.
231
+ # @param args [Array<Object>] Signal arguments.
232
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
233
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
234
+ #
235
+ # @raise [Error::RPCError] RPC error from call.
236
+ #
237
+ # @note Handles created as a result of {Client.start_workflow} will signal the latest workflow with the same
238
+ # workflow ID even if it is unrelated to the started workflow.
239
+ def signal(
240
+ signal,
241
+ *args,
242
+ rpc_metadata: nil,
243
+ rpc_timeout: nil
244
+ )
245
+ @client._impl.signal_workflow(Interceptor::SignalWorkflowInput.new(
246
+ workflow_id: id,
247
+ run_id:,
248
+ signal:,
249
+ args:,
250
+ headers: {},
251
+ rpc_metadata:,
252
+ rpc_timeout:
253
+ ))
254
+ end
255
+
256
+ # Query the workflow. This will query for {run_id} if present. To use a different run ID, create a new handle via
257
+ # {Client.workflow_handle}.
258
+ #
259
+ # @param query [String] Query name.
260
+ # @param args [Array<Object>] Query arguments.
261
+ # @param reject_condition [WorkflowQueryRejectCondition, nil] Condition for rejecting the query.
262
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
263
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
264
+ #
265
+ # @return [Object, nil] Query result.
266
+ #
267
+ # @raise [Error::WorkflowQueryFailedError] The query on the workflow returned a failure.
268
+ # @raise [Error::WorkflowQueryRejectedError] A query reject condition was satisfied.
269
+ # @raise [Error::RPCError] RPC error from call.
270
+ #
271
+ # @note Handles created as a result of {Client.start_workflow} will query the latest workflow with the same
272
+ # workflow ID even if it is unrelated to the started workflow.
273
+ def query(
274
+ query,
275
+ *args,
276
+ reject_condition: @client.options.default_workflow_query_reject_condition,
277
+ rpc_metadata: nil,
278
+ rpc_timeout: nil
279
+ )
280
+ @client._impl.query_workflow(Interceptor::QueryWorkflowInput.new(
281
+ workflow_id: id,
282
+ run_id:,
283
+ query:,
284
+ args:,
285
+ reject_condition:,
286
+ headers: {},
287
+ rpc_metadata:,
288
+ rpc_timeout:
289
+ ))
290
+ end
291
+
292
+ # Send an update request to the workflow and return a handle to it. This will target the workflow with {run_id} if
293
+ # present. To use a different run ID, create a new handle via {Client.workflow_handle}.
294
+ #
295
+ # @param update [String] Update name.
296
+ # @param args [Array<Object>] Update arguments.
297
+ # @param wait_for_stage [WorkflowUpdateWaitStage] Required stage to wait until returning. ADMITTED is not
298
+ # currently supported. See https://docs.temporal.io/workflows#update for more details.
299
+ # @param id [String] ID of the update.
300
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
301
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
302
+ #
303
+ # @return [WorkflowUpdateHandle] The update handle.
304
+ #
305
+ # @raise [Error::WorkflowUpdateRPCTimeoutOrCanceledError] This update call timed out or was canceled. This doesn't
306
+ # mean the update itself was timed out or canceled.
307
+ # @raise [Error::RPCError] RPC error from call.
308
+ #
309
+ # @note Handles created as a result of {Client.start_workflow} will send updates the latest workflow with the same
310
+ # workflow ID even if it is unrelated to the started workflow.
311
+ # @note WARNING: This API is experimental.
312
+ def start_update(
313
+ update,
314
+ *args,
315
+ wait_for_stage:,
316
+ id: SecureRandom.uuid,
317
+ rpc_metadata: nil,
318
+ rpc_timeout: nil
319
+ )
320
+ @client._impl.start_workflow_update(Interceptor::StartWorkflowUpdateInput.new(
321
+ workflow_id: self.id,
322
+ run_id:,
323
+ update_id: id,
324
+ update:,
325
+ args:,
326
+ wait_for_stage:,
327
+ headers: {},
328
+ rpc_metadata:,
329
+ rpc_timeout:
330
+ ))
331
+ end
332
+
333
+ # Send an update request to the workflow and wait for it to complete. This will target the workflow with {run_id}
334
+ # if present. To use a different run ID, create a new handle via {Client.workflow_handle}.
335
+ #
336
+ # @param update [String] Update name.
337
+ # @param args [Array<Object>] Update arguments.
338
+ # @param id [String] ID of the update.
339
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
340
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
341
+ #
342
+ # @return [Object, nil] Update result.
343
+ #
344
+ # @raise [Error::WorkflowUpdateFailedError] If the update failed.
345
+ # @raise [Error::WorkflowUpdateRPCTimeoutOrCanceledError] This update call timed out or was canceled. This doesn't
346
+ # mean the update itself was timed out or canceled.
347
+ # @raise [Error::RPCError] RPC error from call.
348
+ #
349
+ # @note Handles created as a result of {Client.start_workflow} will send updates the latest workflow with the same
350
+ # workflow ID even if it is unrelated to the started workflow.
351
+ # @note WARNING: This API is experimental.
352
+ def execute_update(
353
+ update,
354
+ *args,
355
+ id: SecureRandom.uuid,
356
+ rpc_metadata: nil,
357
+ rpc_timeout: nil
358
+ )
359
+ start_update(
360
+ update,
361
+ *args,
362
+ wait_for_stage: WorkflowUpdateWaitStage::COMPLETED,
363
+ id:,
364
+ rpc_metadata:,
365
+ rpc_timeout:
366
+ ).result
367
+ end
368
+
369
+ # Get a handle for an update. The handle can be used to wait on the update result.
370
+ #
371
+ # @param id [String] ID of the update.
372
+ # @param specific_run_id [String, nil] Workflow run ID to get update handle for. Default is the {run_id}. Most
373
+ # users will not need to set this and instead use the one on the class.
374
+ #
375
+ # @return [WorkflowUpdateHandle] The update handle.
376
+ #
377
+ # @note WARNING: This API is experimental.
378
+ def update_handle(
379
+ id,
380
+ specific_run_id: run_id
381
+ )
382
+ WorkflowUpdateHandle.new(
383
+ client: @client,
384
+ id:,
385
+ workflow_id: self.id,
386
+ workflow_run_id: specific_run_id,
387
+ known_outcome: nil
388
+ )
389
+ end
390
+
391
+ # Cancel the workflow. This will issue a cancellation for {run_id} if present. This call will make sure to use the
392
+ # run chain starting from {first_execution_run_id} if present. To create handles with these values, use
393
+ # {Client.workflow_handle}.
394
+ #
395
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
396
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
397
+ #
398
+ # @raise [Error::RPCError] RPC error from call.
399
+ #
400
+ # @note Handles created as a result of signal with start will cancel the latest workflow with the same workflow ID
401
+ # even if it is unrelated to the started workflow.
402
+ def cancel(
403
+ rpc_metadata: nil,
404
+ rpc_timeout: nil
405
+ )
406
+ @client._impl.cancel_workflow(Interceptor::CancelWorkflowInput.new(
407
+ workflow_id: id,
408
+ run_id:,
409
+ first_execution_run_id:,
410
+ rpc_metadata:,
411
+ rpc_timeout:
412
+ ))
413
+ end
414
+
415
+ # Terminate the workflow. This will issue a termination for {run_id} if present. This call will make sure to use
416
+ # the run chain starting from {first_execution_run_id} if present. To create handles with these values, use
417
+ # {Client.workflow_handle}.
418
+ #
419
+ # @param reason [String, nil] Reason for the termination.
420
+ # @param details [Array<Object>] Details to store on the termination.
421
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
422
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
423
+ #
424
+ # @raise [Error::RPCError] RPC error from call.
425
+ #
426
+ # @note Handles created as a result of signal with start will terminate the latest workflow with the same workflow
427
+ # ID even if it is unrelated to the started workflow.
428
+ def terminate(
429
+ reason = nil,
430
+ details: [],
431
+ rpc_metadata: nil,
432
+ rpc_timeout: nil
433
+ )
434
+ @client._impl.terminate_workflow(Interceptor::TerminateWorkflowInput.new(
435
+ workflow_id: id,
436
+ run_id:,
437
+ first_execution_run_id:,
438
+ reason:,
439
+ details:,
440
+ rpc_metadata:,
441
+ rpc_timeout:
442
+ ))
443
+ end
444
+ end
445
+ end
446
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/api'
4
+
5
+ module Temporalio
6
+ class Client
7
+ # Whether a query should be rejected in certain conditions.
8
+ module WorkflowQueryRejectCondition
9
+ NONE = Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NONE
10
+ NOT_OPEN = Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_OPEN
11
+ NOT_COMPLETED_CLEANLY = Api::Enums::V1::QueryRejectCondition::QUERY_REJECT_CONDITION_NOT_COMPLETED_CLEANLY
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/api'
4
+ require 'temporalio/client/interceptor'
5
+ require 'temporalio/error'
6
+
7
+ module Temporalio
8
+ class Client
9
+ # Handle for a workflow update execution request. This is usually created via {WorkflowHandle.start_update} or
10
+ # {WorkflowHandle.update_handle}.
11
+ class WorkflowUpdateHandle
12
+ # @return [String] ID for the workflow update.
13
+ attr_reader :id
14
+
15
+ # @return [String] ID for the workflow.
16
+ attr_reader :workflow_id
17
+
18
+ # @return [String, nil] Run ID for the workflow.
19
+ attr_reader :workflow_run_id
20
+
21
+ # @!visibility private
22
+ def initialize(client:, id:, workflow_id:, workflow_run_id:, known_outcome:)
23
+ @client = client
24
+ @id = id
25
+ @workflow_id = workflow_id
26
+ @workflow_run_id = workflow_run_id
27
+ @known_outcome = known_outcome
28
+ end
29
+
30
+ # @return [Boolean] True if the result is already known and {result} will not make a blocking call, false if
31
+ # {result} will make a blocking call because the result is not yet known.
32
+ def result_obtained?
33
+ !@known_outcome.nil?
34
+ end
35
+
36
+ # Wait for and return the result of the update. The result may already be known in which case no network call is
37
+ # made. Otherwise the result will be polled for until it is returned.
38
+ #
39
+ # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
40
+ # @param rpc_timeout [Float, nil] Number of seconds before timeout.
41
+ #
42
+ # @return [Object, nil] Update result.
43
+ #
44
+ # @raise [Error::WorkflowUpdateFailedError] If the update failed.
45
+ # @raise [Error::WorkflowUpdateRPCTimeoutOrCanceledError] This update call timed out or was canceled. This doesn't
46
+ # mean the update itself was timed out or canceled.
47
+ # @raise [Error::RPCError] RPC error from call.
48
+ def result(rpc_metadata: nil, rpc_timeout: nil)
49
+ @known_outcome ||= @client._impl.poll_workflow_update(Interceptor::PollWorkflowUpdateInput.new(
50
+ workflow_id:,
51
+ run_id: workflow_run_id,
52
+ update_id: id,
53
+ rpc_metadata:,
54
+ rpc_timeout:
55
+ ))
56
+
57
+ if @known_outcome.failure
58
+ raise Error::WorkflowUpdateFailedError.new, cause: @client.data_converter.from_failure(@known_outcome.failure)
59
+ end
60
+
61
+ results = @client.data_converter.from_payloads(@known_outcome.success)
62
+ warn("Expected 0 or 1 update result, got #{results.size}") if results.size > 1
63
+ results.first
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/api'
4
+
5
+ module Temporalio
6
+ class Client
7
+ # Stage to wait for workflow update to reach before returning from {WorkflowHandle.start_update}.
8
+ module WorkflowUpdateWaitStage
9
+ ADMITTED =
10
+ Api::Enums::V1::UpdateWorkflowExecutionLifecycleStage::UPDATE_WORKFLOW_EXECUTION_LIFECYCLE_STAGE_ADMITTED
11
+ ACCEPTED =
12
+ Api::Enums::V1::UpdateWorkflowExecutionLifecycleStage::UPDATE_WORKFLOW_EXECUTION_LIFECYCLE_STAGE_ACCEPTED
13
+ COMPLETED =
14
+ Api::Enums::V1::UpdateWorkflowExecutionLifecycleStage::UPDATE_WORKFLOW_EXECUTION_LIFECYCLE_STAGE_COMPLETED
15
+ end
16
+ end
17
+ end