amit-temporalio 0.3.1-x86_64-linux-musl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.yardopts +2 -0
- data/Gemfile +23 -0
- data/Rakefile +101 -0
- data/lib/temporalio/activity/complete_async_error.rb +11 -0
- data/lib/temporalio/activity/context.rb +116 -0
- data/lib/temporalio/activity/definition.rb +189 -0
- data/lib/temporalio/activity/info.rb +64 -0
- data/lib/temporalio/activity.rb +12 -0
- data/lib/temporalio/api/activity/v1/message.rb +25 -0
- data/lib/temporalio/api/batch/v1/message.rb +31 -0
- data/lib/temporalio/api/cloud/account/v1/message.rb +28 -0
- data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +126 -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 +41 -0
- data/lib/temporalio/api/cloud/namespace/v1/message.rb +42 -0
- data/lib/temporalio/api/cloud/nexus/v1/message.rb +31 -0
- data/lib/temporalio/api/cloud/operation/v1/message.rb +28 -0
- data/lib/temporalio/api/cloud/region/v1/message.rb +24 -0
- data/lib/temporalio/api/cloud/resource/v1/message.rb +23 -0
- data/lib/temporalio/api/cloud/sink/v1/message.rb +24 -0
- data/lib/temporalio/api/cloud/usage/v1/message.rb +31 -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 +47 -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/payload_visitor.rb +1513 -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 +43 -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/testservice/v1/request_response.rb +31 -0
- data/lib/temporalio/api/testservice/v1/service.rb +23 -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 +204 -0
- data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
- data/lib/temporalio/api/workflowservice.rb +3 -0
- data/lib/temporalio/api.rb +14 -0
- data/lib/temporalio/cancellation.rb +170 -0
- data/lib/temporalio/client/activity_id_reference.rb +32 -0
- data/lib/temporalio/client/async_activity_handle.rb +85 -0
- data/lib/temporalio/client/connection/cloud_service.rb +726 -0
- data/lib/temporalio/client/connection/operator_service.rb +201 -0
- data/lib/temporalio/client/connection/service.rb +42 -0
- data/lib/temporalio/client/connection/test_service.rb +111 -0
- data/lib/temporalio/client/connection/workflow_service.rb +1041 -0
- data/lib/temporalio/client/connection.rb +316 -0
- data/lib/temporalio/client/interceptor.rb +416 -0
- data/lib/temporalio/client/schedule.rb +967 -0
- data/lib/temporalio/client/schedule_handle.rb +126 -0
- data/lib/temporalio/client/workflow_execution.rb +100 -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 +389 -0
- data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
- data/lib/temporalio/client/workflow_update_handle.rb +65 -0
- data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
- data/lib/temporalio/client.rb +484 -0
- data/lib/temporalio/common_enums.rb +41 -0
- data/lib/temporalio/converters/data_converter.rb +99 -0
- data/lib/temporalio/converters/failure_converter.rb +202 -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 +66 -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 +71 -0
- data/lib/temporalio/converters/raw_value.rb +20 -0
- data/lib/temporalio/converters.rb +9 -0
- data/lib/temporalio/error/failure.rb +219 -0
- data/lib/temporalio/error.rb +155 -0
- data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.so +0 -0
- data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.so +0 -0
- data/lib/temporalio/internal/bridge/3.4/temporalio_bridge.so +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 +40 -0
- data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
- data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +33 -0
- data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +56 -0
- data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +57 -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 +95 -0
- data/lib/temporalio/internal/bridge/runtime.rb +53 -0
- data/lib/temporalio/internal/bridge/testing.rb +66 -0
- data/lib/temporalio/internal/bridge/worker.rb +85 -0
- data/lib/temporalio/internal/bridge.rb +36 -0
- data/lib/temporalio/internal/client/implementation.rb +700 -0
- data/lib/temporalio/internal/metric.rb +122 -0
- data/lib/temporalio/internal/proto_utils.rb +133 -0
- data/lib/temporalio/internal/worker/activity_worker.rb +376 -0
- data/lib/temporalio/internal/worker/multi_runner.rb +213 -0
- data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +54 -0
- data/lib/temporalio/internal/worker/workflow_instance/context.rb +333 -0
- data/lib/temporalio/internal/worker/workflow_instance/details.rb +44 -0
- data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +32 -0
- data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +22 -0
- data/lib/temporalio/internal/worker/workflow_instance/handler_execution.rb +25 -0
- data/lib/temporalio/internal/worker/workflow_instance/handler_hash.rb +41 -0
- data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +97 -0
- data/lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb +62 -0
- data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +415 -0
- data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +37 -0
- data/lib/temporalio/internal/worker/workflow_instance/replay_safe_metric.rb +40 -0
- data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +163 -0
- data/lib/temporalio/internal/worker/workflow_instance.rb +730 -0
- data/lib/temporalio/internal/worker/workflow_worker.rb +236 -0
- data/lib/temporalio/internal.rb +7 -0
- data/lib/temporalio/metric.rb +109 -0
- data/lib/temporalio/retry_policy.rb +74 -0
- data/lib/temporalio/runtime.rb +314 -0
- data/lib/temporalio/scoped_logger.rb +96 -0
- data/lib/temporalio/search_attributes.rb +343 -0
- data/lib/temporalio/testing/activity_environment.rb +136 -0
- data/lib/temporalio/testing/workflow_environment.rb +383 -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 +46 -0
- data/lib/temporalio/worker/activity_executor.rb +55 -0
- data/lib/temporalio/worker/interceptor.rb +362 -0
- data/lib/temporalio/worker/thread_pool.rb +237 -0
- data/lib/temporalio/worker/tuner.rb +189 -0
- data/lib/temporalio/worker/workflow_executor/thread_pool.rb +230 -0
- data/lib/temporalio/worker/workflow_executor.rb +26 -0
- data/lib/temporalio/worker/workflow_replayer.rb +343 -0
- data/lib/temporalio/worker.rb +569 -0
- data/lib/temporalio/workflow/activity_cancellation_type.rb +20 -0
- data/lib/temporalio/workflow/child_workflow_cancellation_type.rb +21 -0
- data/lib/temporalio/workflow/child_workflow_handle.rb +43 -0
- data/lib/temporalio/workflow/definition.rb +566 -0
- data/lib/temporalio/workflow/external_workflow_handle.rb +41 -0
- data/lib/temporalio/workflow/future.rb +151 -0
- data/lib/temporalio/workflow/handler_unfinished_policy.rb +13 -0
- data/lib/temporalio/workflow/info.rb +82 -0
- data/lib/temporalio/workflow/parent_close_policy.rb +19 -0
- data/lib/temporalio/workflow/update_info.rb +20 -0
- data/lib/temporalio/workflow.rb +529 -0
- data/lib/temporalio/workflow_history.rb +47 -0
- data/lib/temporalio.rb +11 -0
- data/temporalio.gemspec +28 -0
- metadata +238 -0
@@ -0,0 +1,65 @@
|
|
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_options [RPCOptions, nil] Advanced RPC options.
|
40
|
+
#
|
41
|
+
# @return [Object, nil] Update result.
|
42
|
+
#
|
43
|
+
# @raise [Error::WorkflowUpdateFailedError] If the update failed.
|
44
|
+
# @raise [Error::WorkflowUpdateRPCTimeoutOrCanceledError] This update call timed out or was canceled. This doesn't
|
45
|
+
# mean the update itself was timed out or canceled.
|
46
|
+
# @raise [Error::RPCError] RPC error from call.
|
47
|
+
def result(rpc_options: nil)
|
48
|
+
@known_outcome ||= @client._impl.poll_workflow_update(Interceptor::PollWorkflowUpdateInput.new(
|
49
|
+
workflow_id:,
|
50
|
+
run_id: workflow_run_id,
|
51
|
+
update_id: id,
|
52
|
+
rpc_options:
|
53
|
+
))
|
54
|
+
|
55
|
+
if @known_outcome.failure
|
56
|
+
raise Error::WorkflowUpdateFailedError.new, cause: @client.data_converter.from_failure(@known_outcome.failure)
|
57
|
+
end
|
58
|
+
|
59
|
+
results = @client.data_converter.from_payloads(@known_outcome.success)
|
60
|
+
warn("Expected 0 or 1 update result, got #{results.size}") if results.size > 1
|
61
|
+
results.first
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
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
|
@@ -0,0 +1,484 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'google/protobuf/well_known_types'
|
4
|
+
require 'logger'
|
5
|
+
require 'temporalio/api'
|
6
|
+
require 'temporalio/client/async_activity_handle'
|
7
|
+
require 'temporalio/client/connection'
|
8
|
+
require 'temporalio/client/interceptor'
|
9
|
+
require 'temporalio/client/schedule'
|
10
|
+
require 'temporalio/client/schedule_handle'
|
11
|
+
require 'temporalio/client/workflow_execution'
|
12
|
+
require 'temporalio/client/workflow_execution_count'
|
13
|
+
require 'temporalio/client/workflow_handle'
|
14
|
+
require 'temporalio/client/workflow_query_reject_condition'
|
15
|
+
require 'temporalio/common_enums'
|
16
|
+
require 'temporalio/converters'
|
17
|
+
require 'temporalio/error'
|
18
|
+
require 'temporalio/internal/client/implementation'
|
19
|
+
require 'temporalio/retry_policy'
|
20
|
+
require 'temporalio/runtime'
|
21
|
+
require 'temporalio/search_attributes'
|
22
|
+
require 'temporalio/workflow/definition'
|
23
|
+
|
24
|
+
module Temporalio
|
25
|
+
# Client for accessing Temporal.
|
26
|
+
#
|
27
|
+
# Most users will use {connect} to connect a client. The {workflow_service} method provides access to a raw gRPC
|
28
|
+
# client. To create another client on the same connection, like for a different namespace, {options} may be used to
|
29
|
+
# get the options as a struct which can then be dup'd, altered, and splatted as kwargs to the constructor (e.g.
|
30
|
+
# +Client.new(**my_options.to_h)+).
|
31
|
+
#
|
32
|
+
# Clients are thread-safe and are meant to be reused for the life of the application. They are built to work in both
|
33
|
+
# synchronous and asynchronous contexts. Internally they use callbacks based on {::Queue} which means they are
|
34
|
+
# Fiber-compatible.
|
35
|
+
class Client
|
36
|
+
Options = Data.define(
|
37
|
+
:connection,
|
38
|
+
:namespace,
|
39
|
+
:data_converter,
|
40
|
+
:interceptors,
|
41
|
+
:logger,
|
42
|
+
:default_workflow_query_reject_condition
|
43
|
+
)
|
44
|
+
|
45
|
+
# Options as returned from {options} for +**to_h+ splat use in {initialize}. See {initialize} for details.
|
46
|
+
class Options; end # rubocop:disable Lint/EmptyClass
|
47
|
+
|
48
|
+
# Connect to Temporal server. This is a shortcut for +Connection.new+ followed by +Client.new+.
|
49
|
+
#
|
50
|
+
# @param target_host [String] +host:port+ for the Temporal server. For local development, this is often
|
51
|
+
# +localhost:7233+.
|
52
|
+
# @param namespace [String] Namespace to use for client calls.
|
53
|
+
# @param api_key [String, nil] API key for Temporal. This becomes the +Authorization+ HTTP header with +"Bearer "+
|
54
|
+
# prepended. This is only set if RPC metadata doesn't already have an +authorization+ key.
|
55
|
+
# @param tls [Boolean, Connection::TLSOptions] If false, do not use TLS. If true, use system default TLS options. If
|
56
|
+
# TLS options are present, those TLS options will be used.
|
57
|
+
# @param data_converter [Converters::DataConverter] Data converter to use for all data conversions to/from payloads.
|
58
|
+
# @param interceptors [Array<Interceptor>] Set of interceptors that are chained together to allow intercepting of
|
59
|
+
# client calls. The earlier interceptors wrap the later ones. Any interceptors that also implement worker
|
60
|
+
# interceptor will be used as worker interceptors too so they should not be given separately when creating a
|
61
|
+
# worker.
|
62
|
+
# @param logger [Logger] Logger to use for this client and any workers made from this client. Defaults to stdout
|
63
|
+
# with warn level. Callers setting this logger are responsible for closing it.
|
64
|
+
# @param default_workflow_query_reject_condition [WorkflowQueryRejectCondition, nil] Default rejection
|
65
|
+
# condition for workflow queries if not set during query. See {WorkflowHandle.query} for details on the
|
66
|
+
# rejection condition.
|
67
|
+
# @param rpc_metadata [Hash<String, String>] Headers to use for all calls to the server. Keys here can be overriden
|
68
|
+
# by per-call RPC metadata keys.
|
69
|
+
# @param rpc_retry [Connection::RPCRetryOptions] Retry options for direct service calls (when opted in) or all
|
70
|
+
# high-level calls made by this client (which all opt-in to retries by default).
|
71
|
+
# @param identity [String] Identity for this client.
|
72
|
+
# @param keep_alive [Connection::KeepAliveOptions] Keep-alive options for the client connection. Can be set to +nil+
|
73
|
+
# to disable.
|
74
|
+
# @param http_connect_proxy [Connection::HTTPConnectProxyOptions, nil] Options for HTTP CONNECT proxy.
|
75
|
+
# @param runtime [Runtime] Runtime for this client.
|
76
|
+
# @param lazy_connect [Boolean] If true, the client will not connect until the first call is attempted or a worker
|
77
|
+
# is created with it. Lazy clients cannot be used for workers if they have not performed a connection.
|
78
|
+
#
|
79
|
+
# @return [Client] Connected client.
|
80
|
+
#
|
81
|
+
# @see Connection.initialize
|
82
|
+
# @see initialize
|
83
|
+
def self.connect(
|
84
|
+
target_host,
|
85
|
+
namespace,
|
86
|
+
api_key: nil,
|
87
|
+
tls: false,
|
88
|
+
data_converter: Converters::DataConverter.default,
|
89
|
+
interceptors: [],
|
90
|
+
logger: Logger.new($stdout, level: Logger::WARN),
|
91
|
+
default_workflow_query_reject_condition: nil,
|
92
|
+
rpc_metadata: {},
|
93
|
+
rpc_retry: Connection::RPCRetryOptions.new,
|
94
|
+
identity: "#{Process.pid}@#{Socket.gethostname}",
|
95
|
+
keep_alive: Connection::KeepAliveOptions.new, # Set to nil to disable
|
96
|
+
http_connect_proxy: nil,
|
97
|
+
runtime: Runtime.default,
|
98
|
+
lazy_connect: false
|
99
|
+
)
|
100
|
+
Client.new(
|
101
|
+
connection: Connection.new(
|
102
|
+
target_host:,
|
103
|
+
api_key:,
|
104
|
+
tls:,
|
105
|
+
rpc_metadata:,
|
106
|
+
rpc_retry:,
|
107
|
+
identity:,
|
108
|
+
keep_alive:,
|
109
|
+
http_connect_proxy:,
|
110
|
+
runtime:,
|
111
|
+
lazy_connect:
|
112
|
+
),
|
113
|
+
namespace:,
|
114
|
+
data_converter:,
|
115
|
+
interceptors:,
|
116
|
+
logger:,
|
117
|
+
default_workflow_query_reject_condition:
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [Options] Frozen options for this client which has the same attributes as {initialize}.
|
122
|
+
attr_reader :options
|
123
|
+
|
124
|
+
# Create a client from an existing connection. Most users will prefer {connect} instead. Parameters here match
|
125
|
+
# {Options} returned from {options} by intention so options can be dup'd, altered, and splatted to create a new
|
126
|
+
# client.
|
127
|
+
#
|
128
|
+
# @param connection [Connection] Existing connection to create a client from.
|
129
|
+
# @param namespace [String] Namespace to use for client calls.
|
130
|
+
# @param data_converter [Converters::DataConverter] Data converter to use for all data conversions to/from payloads.
|
131
|
+
# @param interceptors [Array<Interceptor>] Set of interceptors that are chained together to allow intercepting of
|
132
|
+
# client calls. The earlier interceptors wrap the later ones. Any interceptors that also implement worker
|
133
|
+
# interceptor will be used as worker interceptors too so they should not be given separately when creating a
|
134
|
+
# worker.
|
135
|
+
# @param logger [Logger] Logger to use for this client and any workers made from this client. Defaults to stdout
|
136
|
+
# with warn level. Callers setting this logger are responsible for closing it.
|
137
|
+
# @param default_workflow_query_reject_condition [WorkflowQueryRejectCondition, nil] Default rejection condition for
|
138
|
+
# workflow queries if not set during query. See {WorkflowHandle.query} for details on the rejection condition.
|
139
|
+
#
|
140
|
+
# @see connect
|
141
|
+
def initialize(
|
142
|
+
connection:,
|
143
|
+
namespace:,
|
144
|
+
data_converter: DataConverter.default,
|
145
|
+
interceptors: [],
|
146
|
+
logger: Logger.new($stdout, level: Logger::WARN),
|
147
|
+
default_workflow_query_reject_condition: nil
|
148
|
+
)
|
149
|
+
@options = Options.new(
|
150
|
+
connection:,
|
151
|
+
namespace:,
|
152
|
+
data_converter:,
|
153
|
+
interceptors:,
|
154
|
+
logger:,
|
155
|
+
default_workflow_query_reject_condition:
|
156
|
+
).freeze
|
157
|
+
# Initialize interceptors
|
158
|
+
@impl = interceptors.reverse_each.reduce(Internal::Client::Implementation.new(self)) do |acc, int|
|
159
|
+
int.intercept_client(acc)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
# @return [Connection] Underlying connection for this client.
|
164
|
+
def connection
|
165
|
+
@options.connection
|
166
|
+
end
|
167
|
+
|
168
|
+
# @return [String] Namespace used in calls by this client.
|
169
|
+
def namespace
|
170
|
+
@options.namespace
|
171
|
+
end
|
172
|
+
|
173
|
+
# @return [DataConverter] Data converter used by this client.
|
174
|
+
def data_converter
|
175
|
+
@options.data_converter
|
176
|
+
end
|
177
|
+
|
178
|
+
# @return [Connection::WorkflowService] Raw gRPC workflow service.
|
179
|
+
def workflow_service
|
180
|
+
connection.workflow_service
|
181
|
+
end
|
182
|
+
|
183
|
+
# @return [Connection::OperatorService] Raw gRPC operator service.
|
184
|
+
def operator_service
|
185
|
+
connection.operator_service
|
186
|
+
end
|
187
|
+
|
188
|
+
# Start a workflow and return its handle.
|
189
|
+
#
|
190
|
+
# @param workflow [Class<Workflow::Definition>, String, Symbol] Workflow definition class or workflow name.
|
191
|
+
# @param args [Array<Object>] Arguments to the workflow.
|
192
|
+
# @param id [String] Unique identifier for the workflow execution.
|
193
|
+
# @param task_queue [String] Task queue to run the workflow on.
|
194
|
+
# @param execution_timeout [Float, nil] Total workflow execution timeout in seconds including retries and continue
|
195
|
+
# as new.
|
196
|
+
# @param run_timeout [Float, nil] Timeout of a single workflow run in seconds.
|
197
|
+
# @param task_timeout [Float, nil] Timeout of a single workflow task in seconds.
|
198
|
+
# @param id_reuse_policy [WorkflowIDReusePolicy] How already-existing IDs are treated.
|
199
|
+
# @param id_conflict_policy [WorkflowIDConflictPolicy] How already-running workflows of the same ID are treated.
|
200
|
+
# Default is unspecified which effectively means fail the start attempt. This cannot be set if `id_reuse_policy`
|
201
|
+
# is set to terminate if running.
|
202
|
+
# @param retry_policy [RetryPolicy, nil] Retry policy for the workflow.
|
203
|
+
# @param cron_schedule [String, nil] Cron schedule. Users should use schedules instead of this.
|
204
|
+
# @param memo [Hash{String, Symbol => Object}, nil] Memo for the workflow.
|
205
|
+
# @param search_attributes [SearchAttributes, nil] Search attributes for the workflow.
|
206
|
+
# @param start_delay [Float, nil] Amount of time in seconds to wait before starting the workflow. This does not work
|
207
|
+
# with `cron_schedule`.
|
208
|
+
# @param request_eager_start [Boolean] Potentially reduce the latency to start this workflow by encouraging the
|
209
|
+
# server to start it on a local worker running with this same client. This is currently experimental.
|
210
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
211
|
+
#
|
212
|
+
# @return [WorkflowHandle] A workflow handle to the started workflow.
|
213
|
+
# @raise [Error::WorkflowAlreadyStartedError] Workflow already exists.
|
214
|
+
# @raise [Error::RPCError] RPC error from call.
|
215
|
+
def start_workflow(
|
216
|
+
workflow,
|
217
|
+
*args,
|
218
|
+
id:,
|
219
|
+
task_queue:,
|
220
|
+
execution_timeout: nil,
|
221
|
+
run_timeout: nil,
|
222
|
+
task_timeout: nil,
|
223
|
+
id_reuse_policy: WorkflowIDReusePolicy::ALLOW_DUPLICATE,
|
224
|
+
id_conflict_policy: WorkflowIDConflictPolicy::UNSPECIFIED,
|
225
|
+
retry_policy: nil,
|
226
|
+
cron_schedule: nil,
|
227
|
+
memo: nil,
|
228
|
+
search_attributes: nil,
|
229
|
+
start_delay: nil,
|
230
|
+
request_eager_start: false,
|
231
|
+
rpc_options: nil
|
232
|
+
)
|
233
|
+
@impl.start_workflow(Interceptor::StartWorkflowInput.new(
|
234
|
+
workflow:,
|
235
|
+
args:,
|
236
|
+
workflow_id: id,
|
237
|
+
task_queue:,
|
238
|
+
execution_timeout:,
|
239
|
+
run_timeout:,
|
240
|
+
task_timeout:,
|
241
|
+
id_reuse_policy:,
|
242
|
+
id_conflict_policy:,
|
243
|
+
retry_policy:,
|
244
|
+
cron_schedule:,
|
245
|
+
memo:,
|
246
|
+
search_attributes:,
|
247
|
+
start_delay:,
|
248
|
+
request_eager_start:,
|
249
|
+
headers: {},
|
250
|
+
rpc_options:
|
251
|
+
))
|
252
|
+
end
|
253
|
+
|
254
|
+
# Start a workflow and wait for its result. This is a shortcut for {start_workflow} + {WorkflowHandle.result}.
|
255
|
+
#
|
256
|
+
# @param workflow [Class<Workflow::Definition>, Symbol, String] Workflow definition class or workflow name.
|
257
|
+
# @param args [Array<Object>] Arguments to the workflow.
|
258
|
+
# @param id [String] Unique identifier for the workflow execution.
|
259
|
+
# @param task_queue [String] Task queue to run the workflow on.
|
260
|
+
# @param execution_timeout [Float, nil] Total workflow execution timeout in seconds including retries and continue
|
261
|
+
# as new.
|
262
|
+
# @param run_timeout [Float, nil] Timeout of a single workflow run in seconds.
|
263
|
+
# @param task_timeout [Float, nil] Timeout of a single workflow task in seconds.
|
264
|
+
# @param id_reuse_policy [WorkflowIDReusePolicy] How already-existing IDs are treated.
|
265
|
+
# @param id_conflict_policy [WorkflowIDConflictPolicy] How already-running workflows of the same ID are treated.
|
266
|
+
# Default is unspecified which effectively means fail the start attempt. This cannot be set if `id_reuse_policy`
|
267
|
+
# is set to terminate if running.
|
268
|
+
# @param retry_policy [RetryPolicy, nil] Retry policy for the workflow.
|
269
|
+
# @param cron_schedule [String, nil] Cron schedule. Users should use schedules instead of this.
|
270
|
+
# @param memo [Hash{String, Symbol => Object}, nil] Memo for the workflow.
|
271
|
+
# @param search_attributes [SearchAttributes, nil] Search attributes for the workflow.
|
272
|
+
# @param start_delay [Float, nil] Amount of time in seconds to wait before starting the workflow. This does not work
|
273
|
+
# with `cron_schedule`.
|
274
|
+
# @param request_eager_start [Boolean] Potentially reduce the latency to start this workflow by encouraging the
|
275
|
+
# server to start it on a local worker running with this same client. This is currently experimental.
|
276
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
277
|
+
#
|
278
|
+
# @return [Object] Successful result of the workflow.
|
279
|
+
# @raise [Error::WorkflowAlreadyStartedError] Workflow already exists.
|
280
|
+
# @raise [Error::WorkflowFailedError] Workflow failed with +cause+ as the cause.
|
281
|
+
# @raise [Error::RPCError] RPC error from call.
|
282
|
+
def execute_workflow(
|
283
|
+
workflow,
|
284
|
+
*args,
|
285
|
+
id:,
|
286
|
+
task_queue:,
|
287
|
+
execution_timeout: nil,
|
288
|
+
run_timeout: nil,
|
289
|
+
task_timeout: nil,
|
290
|
+
id_reuse_policy: WorkflowIDReusePolicy::ALLOW_DUPLICATE,
|
291
|
+
id_conflict_policy: WorkflowIDConflictPolicy::UNSPECIFIED,
|
292
|
+
retry_policy: nil,
|
293
|
+
cron_schedule: nil,
|
294
|
+
memo: nil,
|
295
|
+
search_attributes: nil,
|
296
|
+
start_delay: nil,
|
297
|
+
request_eager_start: false,
|
298
|
+
rpc_options: nil
|
299
|
+
)
|
300
|
+
start_workflow(
|
301
|
+
workflow,
|
302
|
+
*args,
|
303
|
+
id:,
|
304
|
+
task_queue:,
|
305
|
+
execution_timeout:,
|
306
|
+
run_timeout:,
|
307
|
+
task_timeout:,
|
308
|
+
id_reuse_policy:,
|
309
|
+
id_conflict_policy:,
|
310
|
+
retry_policy:,
|
311
|
+
cron_schedule:,
|
312
|
+
memo:,
|
313
|
+
search_attributes:,
|
314
|
+
start_delay:,
|
315
|
+
request_eager_start:,
|
316
|
+
rpc_options:
|
317
|
+
).result
|
318
|
+
end
|
319
|
+
|
320
|
+
# Get a workflow handle to an existing workflow by its ID.
|
321
|
+
#
|
322
|
+
# @param workflow_id [String] Workflow ID to get a handle to.
|
323
|
+
# @param run_id [String, nil] Run ID that will be used for all calls. Many choose to leave this unset which ensures
|
324
|
+
# interactions occur on the latest of the workflow ID.
|
325
|
+
# @param first_execution_run_id [String, nil] First execution run ID used for some calls like cancellation and
|
326
|
+
# termination to ensure the affected workflow is only within the same chain as this given run ID.
|
327
|
+
#
|
328
|
+
# @return [WorkflowHandle] The workflow handle.
|
329
|
+
def workflow_handle(
|
330
|
+
workflow_id,
|
331
|
+
run_id: nil,
|
332
|
+
first_execution_run_id: nil
|
333
|
+
)
|
334
|
+
WorkflowHandle.new(client: self, id: workflow_id, run_id:, result_run_id: run_id, first_execution_run_id:)
|
335
|
+
end
|
336
|
+
|
337
|
+
# List workflows.
|
338
|
+
#
|
339
|
+
# @param query [String, nil] A Temporal visibility list filter.
|
340
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
341
|
+
#
|
342
|
+
# @return [Enumerator<WorkflowExecution>] Enumerable workflow executions.
|
343
|
+
#
|
344
|
+
# @raise [Error::RPCError] RPC error from call.
|
345
|
+
#
|
346
|
+
# @see https://docs.temporal.io/visibility
|
347
|
+
def list_workflows(query = nil, rpc_options: nil)
|
348
|
+
@impl.list_workflows(Interceptor::ListWorkflowsInput.new(query:, rpc_options:))
|
349
|
+
end
|
350
|
+
|
351
|
+
# Count workflows.
|
352
|
+
#
|
353
|
+
# @param query [String, nil] A Temporal visibility list filter.
|
354
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
355
|
+
#
|
356
|
+
# @return [WorkflowExecutionCount] Count of workflows.
|
357
|
+
#
|
358
|
+
# @raise [Error::RPCError] RPC error from call.
|
359
|
+
#
|
360
|
+
# @see https://docs.temporal.io/visibility
|
361
|
+
def count_workflows(query = nil, rpc_options: nil)
|
362
|
+
@impl.count_workflows(Interceptor::CountWorkflowsInput.new(query:, rpc_options:))
|
363
|
+
end
|
364
|
+
|
365
|
+
# Create a schedule and return its handle.
|
366
|
+
#
|
367
|
+
# @param id [String] Unique identifier of the schedule.
|
368
|
+
# @param schedule [Schedule] Schedule to create.
|
369
|
+
# @param trigger_immediately [Boolean] If true, trigger one action immediately when creating the schedule.
|
370
|
+
# @param backfills [Array<Schedule::Backfill>] Set of time periods to take actions on as if that time passed right
|
371
|
+
# now.
|
372
|
+
# @param memo [Hash<String, Object>, nil] Memo for the schedule. Memo for a scheduled workflow is part of the
|
373
|
+
# schedule action.
|
374
|
+
# @param search_attributes [SearchAttributes, nil] Search attributes for the schedule. Search attributes for a
|
375
|
+
# scheduled workflow are part of the scheduled action.
|
376
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
377
|
+
#
|
378
|
+
# @return [ScheduleHandle] A handle to the created schedule.
|
379
|
+
# @raise [Error::ScheduleAlreadyRunningError] If a schedule with this ID is already running.
|
380
|
+
# @raise [Error::RPCError] RPC error from call.
|
381
|
+
def create_schedule(
|
382
|
+
id,
|
383
|
+
schedule,
|
384
|
+
trigger_immediately: false,
|
385
|
+
backfills: [],
|
386
|
+
memo: nil,
|
387
|
+
search_attributes: nil,
|
388
|
+
rpc_options: nil
|
389
|
+
)
|
390
|
+
@impl.create_schedule(Interceptor::CreateScheduleInput.new(
|
391
|
+
id:,
|
392
|
+
schedule:,
|
393
|
+
trigger_immediately:,
|
394
|
+
backfills:,
|
395
|
+
memo:,
|
396
|
+
search_attributes:,
|
397
|
+
rpc_options:
|
398
|
+
))
|
399
|
+
end
|
400
|
+
|
401
|
+
# Get a schedule handle to an existing schedule for the given ID.
|
402
|
+
#
|
403
|
+
# @param id [String] Schedule ID to get a handle to.
|
404
|
+
# @return [ScheduleHandle] The schedule handle.
|
405
|
+
def schedule_handle(id)
|
406
|
+
ScheduleHandle.new(client: self, id:)
|
407
|
+
end
|
408
|
+
|
409
|
+
# List schedules.
|
410
|
+
#
|
411
|
+
# Note, this list is eventually consistent. Therefore if a schedule is added or deleted, it may not be available in
|
412
|
+
# the list immediately.
|
413
|
+
#
|
414
|
+
# @param query [String] A Temporal visibility list filter.
|
415
|
+
# @param rpc_options [RPCOptions, nil] Advanced RPC options.
|
416
|
+
#
|
417
|
+
# @return [Enumerator<Schedule::List::Description>] Enumerable schedules.
|
418
|
+
#
|
419
|
+
# @raise [Error::RPCError] RPC error from call.
|
420
|
+
#
|
421
|
+
# @see https://docs.temporal.io/visibility
|
422
|
+
def list_schedules(query = nil, rpc_options: nil)
|
423
|
+
@impl.list_schedules(Interceptor::ListSchedulesInput.new(query:, rpc_options:))
|
424
|
+
end
|
425
|
+
|
426
|
+
# Get an async activity handle.
|
427
|
+
#
|
428
|
+
# @param task_token_or_id_reference [String, ActivityIDReference] Task token string or activity ID reference.
|
429
|
+
# @return [AsyncActivityHandle]
|
430
|
+
def async_activity_handle(task_token_or_id_reference)
|
431
|
+
if task_token_or_id_reference.is_a?(ActivityIDReference)
|
432
|
+
AsyncActivityHandle.new(client: self, task_token: nil, id_reference: task_token_or_id_reference)
|
433
|
+
elsif task_token_or_id_reference.is_a?(String)
|
434
|
+
AsyncActivityHandle.new(client: self, task_token: task_token_or_id_reference, id_reference: nil)
|
435
|
+
else
|
436
|
+
raise ArgumentError, 'Must be a string task token or an ActivityIDReference'
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
# @!visibility private
|
441
|
+
def _impl
|
442
|
+
@impl
|
443
|
+
end
|
444
|
+
|
445
|
+
# Set of RPC options for RPC calls.
|
446
|
+
class RPCOptions
|
447
|
+
# @return [Hash<String, String>, nil] Headers to include on the RPC call.
|
448
|
+
attr_accessor :metadata
|
449
|
+
|
450
|
+
# @return [Float, nil] Number of seconds before timeout of the RPC call.
|
451
|
+
attr_accessor :timeout
|
452
|
+
|
453
|
+
# @return [Cancellation, nil] Cancellation to use to potentially cancel the call. If canceled, the RPC will return
|
454
|
+
# {Error::CanceledError}.
|
455
|
+
attr_accessor :cancellation
|
456
|
+
|
457
|
+
# @return [Boolean, nil] Whether to override the default retry option which decides whether to retry calls
|
458
|
+
# implicitly when known transient error codes are reached. By default when this is nil, high-level calls retry
|
459
|
+
# known transient error codes and low-level/direct calls do not.
|
460
|
+
attr_accessor :override_retry
|
461
|
+
|
462
|
+
# Create RPC options.
|
463
|
+
#
|
464
|
+
# @param metadata [Hash<String, String>, nil] Headers to include on the RPC call.
|
465
|
+
# @param timeout [Float, nil] Number of seconds before timeout of the RPC call.
|
466
|
+
# @param cancellation [Cancellation, nil] Cancellation to use to potentially cancel the call. If canceled, the RPC
|
467
|
+
# will return {Error::CanceledError}.
|
468
|
+
# @param override_retry [Boolean, nil] Whether to override the default retry option which decides whether to retry
|
469
|
+
# calls implicitly when known transient error codes are reached. By default when this is nil, high-level calls
|
470
|
+
# retry known transient error codes and low-level/direct calls do not.
|
471
|
+
def initialize(
|
472
|
+
metadata: nil,
|
473
|
+
timeout: nil,
|
474
|
+
cancellation: nil,
|
475
|
+
override_retry: nil
|
476
|
+
)
|
477
|
+
@metadata = metadata
|
478
|
+
@timeout = timeout
|
479
|
+
@cancellation = cancellation
|
480
|
+
@override_retry = override_retry
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'temporalio/api'
|
4
|
+
|
5
|
+
module Temporalio
|
6
|
+
# How already-in-use workflow IDs are handled on start.
|
7
|
+
#
|
8
|
+
# @see https://docs.temporal.io/workflows#workflow-id-reuse-policy
|
9
|
+
module WorkflowIDReusePolicy
|
10
|
+
# Allow starting a workflow execution using the same workflow ID.
|
11
|
+
ALLOW_DUPLICATE = Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE
|
12
|
+
# Allow starting a workflow execution using the same workflow ID, only when the last execution's final state is one
|
13
|
+
# of terminated, canceled, timed out, or failed.
|
14
|
+
ALLOW_DUPLICATE_FAILED_ONLY =
|
15
|
+
Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_ALLOW_DUPLICATE_FAILED_ONLY
|
16
|
+
# Do not permit re-use of the workflow ID for this workflow. Future start workflow requests could potentially change
|
17
|
+
# the policy, allowing re-use of the workflow ID.
|
18
|
+
REJECT_DUPLICATE = Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_REJECT_DUPLICATE
|
19
|
+
# This option is {WorkflowIDConflictPolicy::TERMINATE_EXISTING} but is here for backwards compatibility. If
|
20
|
+
# specified, it acts like {ALLOW_DUPLICATE}, but also the {WorkflowIDConflictPolicy} on the request is treated as
|
21
|
+
# {WorkflowIDConflictPolicy::TERMINATE_EXISTING}. If no running workflow, then the behavior is the same as
|
22
|
+
# {ALLOW_DUPLICATE}.
|
23
|
+
#
|
24
|
+
# @deprecated Use {WorkflowIDConflictPolicy::TERMINATE_EXISTING} instead.
|
25
|
+
TERMINATE_IF_RUNNING = Api::Enums::V1::WorkflowIdReusePolicy::WORKFLOW_ID_REUSE_POLICY_TERMINATE_IF_RUNNING
|
26
|
+
end
|
27
|
+
|
28
|
+
# How already-running workflows of the same ID are handled on start.
|
29
|
+
#
|
30
|
+
# @see https://docs.temporal.io/workflows#workflow-id-conflict-policy
|
31
|
+
module WorkflowIDConflictPolicy
|
32
|
+
# Unset.
|
33
|
+
UNSPECIFIED = Api::Enums::V1::WorkflowIdConflictPolicy::WORKFLOW_ID_CONFLICT_POLICY_UNSPECIFIED
|
34
|
+
# Don't start a new workflow, instead fail with already-started error.
|
35
|
+
FAIL = Api::Enums::V1::WorkflowIdConflictPolicy::WORKFLOW_ID_CONFLICT_POLICY_FAIL
|
36
|
+
# Don't start a new workflow, instead return a workflow handle for the running workflow.
|
37
|
+
USE_EXISTING = Api::Enums::V1::WorkflowIdConflictPolicy::WORKFLOW_ID_CONFLICT_POLICY_USE_EXISTING
|
38
|
+
# Terminate the running workflow before starting a new one.
|
39
|
+
TERMINATE_EXISTING = Api::Enums::V1::WorkflowIdConflictPolicy::WORKFLOW_ID_CONFLICT_POLICY_TERMINATE_EXISTING
|
40
|
+
end
|
41
|
+
end
|