temporalio 0.2.0-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 (128) hide show
  1. checksums.yaml +7 -0
  2. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  3. data/lib/temporalio/activity/context.rb +107 -0
  4. data/lib/temporalio/activity/definition.rb +77 -0
  5. data/lib/temporalio/activity/info.rb +63 -0
  6. data/lib/temporalio/activity.rb +69 -0
  7. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  8. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
  9. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  10. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  11. data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
  12. data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
  13. data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
  14. data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
  15. data/lib/temporalio/api/command/v1/message.rb +46 -0
  16. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  17. data/lib/temporalio/api/common/v1/message.rb +41 -0
  18. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  19. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  20. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  21. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  22. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  23. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  24. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  25. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  26. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  27. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  28. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  29. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  30. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  31. data/lib/temporalio/api/export/v1/message.rb +24 -0
  32. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  33. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  34. data/lib/temporalio/api/history/v1/message.rb +90 -0
  35. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  36. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  37. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  38. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  39. data/lib/temporalio/api/operatorservice.rb +3 -0
  40. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  41. data/lib/temporalio/api/query/v1/message.rb +27 -0
  42. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  43. data/lib/temporalio/api/schedule/v1/message.rb +42 -0
  44. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  45. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  46. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  47. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  48. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  49. data/lib/temporalio/api/update/v1/message.rb +33 -0
  50. data/lib/temporalio/api/version/v1/message.rb +26 -0
  51. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  52. data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
  53. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  54. data/lib/temporalio/api/workflowservice.rb +3 -0
  55. data/lib/temporalio/api.rb +13 -0
  56. data/lib/temporalio/cancellation.rb +150 -0
  57. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  58. data/lib/temporalio/client/async_activity_handle.rb +110 -0
  59. data/lib/temporalio/client/connection/cloud_service.rb +648 -0
  60. data/lib/temporalio/client/connection/operator_service.rb +249 -0
  61. data/lib/temporalio/client/connection/service.rb +41 -0
  62. data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
  63. data/lib/temporalio/client/connection.rb +270 -0
  64. data/lib/temporalio/client/interceptor.rb +316 -0
  65. data/lib/temporalio/client/workflow_execution.rb +103 -0
  66. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  67. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  68. data/lib/temporalio/client/workflow_handle.rb +446 -0
  69. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  70. data/lib/temporalio/client/workflow_update_handle.rb +67 -0
  71. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  72. data/lib/temporalio/client.rb +404 -0
  73. data/lib/temporalio/common_enums.rb +24 -0
  74. data/lib/temporalio/converters/data_converter.rb +102 -0
  75. data/lib/temporalio/converters/failure_converter.rb +200 -0
  76. data/lib/temporalio/converters/payload_codec.rb +26 -0
  77. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  78. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  79. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  80. data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
  81. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  82. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  83. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  84. data/lib/temporalio/converters/payload_converter.rb +73 -0
  85. data/lib/temporalio/converters.rb +9 -0
  86. data/lib/temporalio/error/failure.rb +219 -0
  87. data/lib/temporalio/error.rb +147 -0
  88. data/lib/temporalio/internal/bridge/3.1/temporalio_bridge.so +0 -0
  89. data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.so +0 -0
  90. data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.so +0 -0
  91. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  92. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  93. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  94. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  95. data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
  96. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  97. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
  98. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
  99. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  100. data/lib/temporalio/internal/bridge/api.rb +3 -0
  101. data/lib/temporalio/internal/bridge/client.rb +90 -0
  102. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  103. data/lib/temporalio/internal/bridge/testing.rb +46 -0
  104. data/lib/temporalio/internal/bridge/worker.rb +83 -0
  105. data/lib/temporalio/internal/bridge.rb +36 -0
  106. data/lib/temporalio/internal/client/implementation.rb +525 -0
  107. data/lib/temporalio/internal/proto_utils.rb +54 -0
  108. data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
  109. data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
  110. data/lib/temporalio/internal.rb +7 -0
  111. data/lib/temporalio/retry_policy.rb +51 -0
  112. data/lib/temporalio/runtime.rb +271 -0
  113. data/lib/temporalio/scoped_logger.rb +96 -0
  114. data/lib/temporalio/search_attributes.rb +300 -0
  115. data/lib/temporalio/testing/activity_environment.rb +132 -0
  116. data/lib/temporalio/testing/workflow_environment.rb +137 -0
  117. data/lib/temporalio/testing.rb +10 -0
  118. data/lib/temporalio/version.rb +5 -0
  119. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  120. data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
  121. data/lib/temporalio/worker/activity_executor.rb +55 -0
  122. data/lib/temporalio/worker/interceptor.rb +88 -0
  123. data/lib/temporalio/worker/tuner.rb +151 -0
  124. data/lib/temporalio/worker.rb +426 -0
  125. data/lib/temporalio/workflow_history.rb +22 -0
  126. data/lib/temporalio.rb +7 -0
  127. data/temporalio.gemspec +28 -0
  128. metadata +189 -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