temporalio 0.2.0-x86_64-darwin
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.
- checksums.yaml +7 -0
- data/Gemfile +23 -0
- data/Rakefile +387 -0
- data/lib/temporalio/activity/complete_async_error.rb +11 -0
- data/lib/temporalio/activity/context.rb +107 -0
- data/lib/temporalio/activity/definition.rb +77 -0
- data/lib/temporalio/activity/info.rb +63 -0
- data/lib/temporalio/activity.rb +69 -0
- data/lib/temporalio/api/batch/v1/message.rb +31 -0
- data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +93 -0
- data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
- data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
- data/lib/temporalio/api/cloud/identity/v1/message.rb +36 -0
- data/lib/temporalio/api/cloud/namespace/v1/message.rb +35 -0
- data/lib/temporalio/api/cloud/operation/v1/message.rb +27 -0
- data/lib/temporalio/api/cloud/region/v1/message.rb +23 -0
- data/lib/temporalio/api/command/v1/message.rb +46 -0
- data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
- data/lib/temporalio/api/common/v1/message.rb +41 -0
- data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
- data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
- data/lib/temporalio/api/enums/v1/common.rb +26 -0
- data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
- data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
- data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
- data/lib/temporalio/api/enums/v1/query.rb +22 -0
- data/lib/temporalio/api/enums/v1/reset.rb +23 -0
- data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
- data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
- data/lib/temporalio/api/enums/v1/update.rb +22 -0
- data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
- data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
- data/lib/temporalio/api/export/v1/message.rb +24 -0
- data/lib/temporalio/api/failure/v1/message.rb +35 -0
- data/lib/temporalio/api/filter/v1/message.rb +27 -0
- data/lib/temporalio/api/history/v1/message.rb +90 -0
- data/lib/temporalio/api/namespace/v1/message.rb +31 -0
- data/lib/temporalio/api/nexus/v1/message.rb +40 -0
- data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
- data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
- data/lib/temporalio/api/operatorservice.rb +3 -0
- data/lib/temporalio/api/protocol/v1/message.rb +23 -0
- data/lib/temporalio/api/query/v1/message.rb +27 -0
- data/lib/temporalio/api/replication/v1/message.rb +26 -0
- data/lib/temporalio/api/schedule/v1/message.rb +42 -0
- data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
- data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
- data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
- data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
- data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
- data/lib/temporalio/api/update/v1/message.rb +33 -0
- data/lib/temporalio/api/version/v1/message.rb +26 -0
- data/lib/temporalio/api/workflow/v1/message.rb +43 -0
- data/lib/temporalio/api/workflowservice/v1/request_response.rb +189 -0
- data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
- data/lib/temporalio/api/workflowservice.rb +3 -0
- data/lib/temporalio/api.rb +13 -0
- data/lib/temporalio/cancellation.rb +150 -0
- data/lib/temporalio/client/activity_id_reference.rb +32 -0
- data/lib/temporalio/client/async_activity_handle.rb +110 -0
- data/lib/temporalio/client/connection/cloud_service.rb +648 -0
- data/lib/temporalio/client/connection/operator_service.rb +249 -0
- data/lib/temporalio/client/connection/service.rb +41 -0
- data/lib/temporalio/client/connection/workflow_service.rb +1218 -0
- data/lib/temporalio/client/connection.rb +270 -0
- data/lib/temporalio/client/interceptor.rb +316 -0
- data/lib/temporalio/client/workflow_execution.rb +103 -0
- data/lib/temporalio/client/workflow_execution_count.rb +36 -0
- data/lib/temporalio/client/workflow_execution_status.rb +18 -0
- data/lib/temporalio/client/workflow_handle.rb +446 -0
- data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
- data/lib/temporalio/client/workflow_update_handle.rb +67 -0
- data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
- data/lib/temporalio/client.rb +404 -0
- data/lib/temporalio/common_enums.rb +24 -0
- data/lib/temporalio/converters/data_converter.rb +102 -0
- data/lib/temporalio/converters/failure_converter.rb +200 -0
- data/lib/temporalio/converters/payload_codec.rb +26 -0
- data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
- data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
- data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
- data/lib/temporalio/converters/payload_converter/composite.rb +62 -0
- data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
- data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
- data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
- data/lib/temporalio/converters/payload_converter.rb +73 -0
- data/lib/temporalio/converters.rb +9 -0
- data/lib/temporalio/error/failure.rb +219 -0
- data/lib/temporalio/error.rb +147 -0
- data/lib/temporalio/internal/bridge/3.1/temporalio_bridge.bundle +0 -0
- data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.bundle +0 -0
- data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.bundle +0 -0
- data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
- data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
- data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
- data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
- data/lib/temporalio/internal/bridge/api/core_interface.rb +36 -0
- data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
- data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +52 -0
- data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +54 -0
- data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
- data/lib/temporalio/internal/bridge/api.rb +3 -0
- data/lib/temporalio/internal/bridge/client.rb +90 -0
- data/lib/temporalio/internal/bridge/runtime.rb +53 -0
- data/lib/temporalio/internal/bridge/testing.rb +46 -0
- data/lib/temporalio/internal/bridge/worker.rb +83 -0
- data/lib/temporalio/internal/bridge.rb +36 -0
- data/lib/temporalio/internal/client/implementation.rb +525 -0
- data/lib/temporalio/internal/proto_utils.rb +54 -0
- data/lib/temporalio/internal/worker/activity_worker.rb +345 -0
- data/lib/temporalio/internal/worker/multi_runner.rb +169 -0
- data/lib/temporalio/internal.rb +7 -0
- data/lib/temporalio/retry_policy.rb +51 -0
- data/lib/temporalio/runtime.rb +271 -0
- data/lib/temporalio/scoped_logger.rb +96 -0
- data/lib/temporalio/search_attributes.rb +300 -0
- data/lib/temporalio/testing/activity_environment.rb +132 -0
- data/lib/temporalio/testing/workflow_environment.rb +137 -0
- data/lib/temporalio/testing.rb +10 -0
- data/lib/temporalio/version.rb +5 -0
- data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
- data/lib/temporalio/worker/activity_executor/thread_pool.rb +254 -0
- data/lib/temporalio/worker/activity_executor.rb +55 -0
- data/lib/temporalio/worker/interceptor.rb +88 -0
- data/lib/temporalio/worker/tuner.rb +151 -0
- data/lib/temporalio/worker.rb +426 -0
- data/lib/temporalio/workflow_history.rb +22 -0
- data/lib/temporalio.rb +7 -0
- data/temporalio.gemspec +28 -0
- 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
|