temporal-ruby 0.0.1.pre.pre1 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/README.md +23 -3
- data/lib/gen/temporal/api/command/v1/message_pb.rb +1 -1
- data/lib/gen/temporal/api/enums/v1/common_pb.rb +7 -0
- data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +5 -6
- data/lib/gen/temporal/api/version/v1/message_pb.rb +19 -8
- data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +19 -8
- data/lib/gen/temporal/api/workflowservice/v1/service_services_pb.rb +0 -3
- data/lib/temporal.rb +104 -0
- data/lib/temporal/activity/context.rb +5 -1
- data/lib/temporal/activity/poller.rb +26 -9
- data/lib/temporal/activity/task_processor.rb +33 -20
- data/lib/temporal/client/converter/base.rb +35 -0
- data/lib/temporal/client/converter/composite.rb +49 -0
- data/lib/temporal/client/converter/payload/bytes.rb +30 -0
- data/lib/temporal/client/converter/payload/json.rb +28 -0
- data/lib/temporal/client/converter/payload/nil.rb +27 -0
- data/lib/temporal/client/grpc_client.rb +102 -27
- data/lib/temporal/client/retryer.rb +49 -0
- data/lib/temporal/client/serializer.rb +2 -0
- data/lib/temporal/client/serializer/cancel_timer.rb +2 -2
- data/lib/temporal/client/serializer/complete_workflow.rb +6 -4
- data/lib/temporal/client/serializer/continue_as_new.rb +37 -0
- data/lib/temporal/client/serializer/fail_workflow.rb +2 -2
- data/lib/temporal/client/serializer/failure.rb +4 -2
- data/lib/temporal/client/serializer/record_marker.rb +6 -4
- data/lib/temporal/client/serializer/request_activity_cancellation.rb +2 -2
- data/lib/temporal/client/serializer/retry_policy.rb +24 -0
- data/lib/temporal/client/serializer/schedule_activity.rb +8 -20
- data/lib/temporal/client/serializer/start_child_workflow.rb +9 -20
- data/lib/temporal/client/serializer/start_timer.rb +2 -2
- data/lib/temporal/concerns/payloads.rb +51 -0
- data/lib/temporal/configuration.rb +31 -4
- data/lib/temporal/error_handler.rb +11 -0
- data/lib/temporal/errors.rb +24 -0
- data/lib/temporal/execution_options.rb +9 -1
- data/lib/temporal/json.rb +3 -1
- data/lib/temporal/logger.rb +17 -0
- data/lib/temporal/metadata.rb +11 -3
- data/lib/temporal/metadata/activity.rb +15 -2
- data/lib/temporal/metadata/workflow.rb +8 -0
- data/lib/temporal/metadata/workflow_task.rb +11 -0
- data/lib/temporal/retry_policy.rb +6 -9
- data/lib/temporal/saga/concern.rb +1 -1
- data/lib/temporal/testing.rb +1 -0
- data/lib/temporal/testing/future_registry.rb +1 -1
- data/lib/temporal/testing/local_activity_context.rb +1 -1
- data/lib/temporal/testing/local_workflow_context.rb +38 -14
- data/lib/temporal/testing/scheduled_workflows.rb +75 -0
- data/lib/temporal/testing/temporal_override.rb +35 -7
- data/lib/temporal/testing/workflow_override.rb +6 -1
- data/lib/temporal/version.rb +1 -1
- data/lib/temporal/worker.rb +28 -10
- data/lib/temporal/workflow.rb +8 -2
- data/lib/temporal/workflow/command.rb +3 -0
- data/lib/temporal/workflow/context.rb +40 -5
- data/lib/temporal/workflow/errors.rb +39 -0
- data/lib/temporal/workflow/executor.rb +1 -1
- data/lib/temporal/workflow/future.rb +18 -6
- data/lib/temporal/workflow/history/event.rb +1 -3
- data/lib/temporal/workflow/history/event_target.rb +4 -0
- data/lib/temporal/workflow/history/window.rb +1 -1
- data/lib/temporal/workflow/poller.rb +41 -13
- data/lib/temporal/workflow/replay_aware_logger.rb +4 -4
- data/lib/temporal/workflow/state_manager.rb +33 -52
- data/lib/temporal/workflow/task_processor.rb +41 -11
- metadata +21 -9
- data/lib/temporal/client/serializer/payload.rb +0 -25
@@ -0,0 +1,49 @@
|
|
1
|
+
module Temporal
|
2
|
+
module Client
|
3
|
+
module Retryer
|
4
|
+
INITIAL_INTERVAL_S = 0.2
|
5
|
+
MAX_INTERVAL_S = 6.0
|
6
|
+
BACKOFF_COEFFICIENT = 1.2
|
7
|
+
DEFAULT_RETRIES = 24 # gets us to about 60s given the other parameters, assuming 0 latency
|
8
|
+
|
9
|
+
# List pulled from RpcRetryOptions in the Java SDK
|
10
|
+
# https://github.com/temporalio/sdk-java/blob/ad8831d4a4d9d257baf3482ab49f1aa681895c0e/temporal-serviceclient/src/main/java/io/temporal/serviceclient/RpcRetryOptions.java#L32
|
11
|
+
# No amount of retrying will help in these cases.
|
12
|
+
def self.do_not_retry_errors
|
13
|
+
[
|
14
|
+
GRPC::AlreadyExists,
|
15
|
+
GRPC::Cancelled,
|
16
|
+
GRPC::FailedPrecondition,
|
17
|
+
GRPC::InvalidArgument,
|
18
|
+
# If the activity has timed out, the server will return this and will never accept a retry
|
19
|
+
GRPC::NotFound,
|
20
|
+
GRPC::PermissionDenied,
|
21
|
+
GRPC::Unauthenticated,
|
22
|
+
GRPC::Unimplemented,
|
23
|
+
]
|
24
|
+
end
|
25
|
+
|
26
|
+
# Used for backoff retries in certain cases when calling temporal server.
|
27
|
+
# on_retry - a proc that's executed each time you need to retry
|
28
|
+
def self.with_retries(times: DEFAULT_RETRIES, on_retry: nil, &block)
|
29
|
+
# Values taken from the Java SDK
|
30
|
+
# https://github.com/temporalio/sdk-java/blob/ad8831d4a4d9d257baf3482ab49f1aa681895c0e/temporal-serviceclient/src/main/java/io/temporal/serviceclient/RpcRetryOptions.java#L32
|
31
|
+
current_interval_s = INITIAL_INTERVAL_S
|
32
|
+
retry_i = 0
|
33
|
+
loop do
|
34
|
+
begin
|
35
|
+
return yield
|
36
|
+
rescue *do_not_retry_errors
|
37
|
+
raise
|
38
|
+
rescue => e
|
39
|
+
raise e if retry_i >= times
|
40
|
+
retry_i += 1
|
41
|
+
on_retry.call if on_retry
|
42
|
+
sleep(current_interval_s)
|
43
|
+
current_interval_s = [current_interval_s * BACKOFF_COEFFICIENT, MAX_INTERVAL_S].min
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -6,6 +6,7 @@ require 'temporal/client/serializer/record_marker'
|
|
6
6
|
require 'temporal/client/serializer/start_timer'
|
7
7
|
require 'temporal/client/serializer/cancel_timer'
|
8
8
|
require 'temporal/client/serializer/complete_workflow'
|
9
|
+
require 'temporal/client/serializer/continue_as_new'
|
9
10
|
require 'temporal/client/serializer/fail_workflow'
|
10
11
|
|
11
12
|
module Temporal
|
@@ -19,6 +20,7 @@ module Temporal
|
|
19
20
|
Workflow::Command::StartTimer => Serializer::StartTimer,
|
20
21
|
Workflow::Command::CancelTimer => Serializer::CancelTimer,
|
21
22
|
Workflow::Command::CompleteWorkflow => Serializer::CompleteWorkflow,
|
23
|
+
Workflow::Command::ContinueAsNew => Serializer::ContinueAsNew,
|
22
24
|
Workflow::Command::FailWorkflow => Serializer::FailWorkflow
|
23
25
|
}.freeze
|
24
26
|
|
@@ -5,10 +5,10 @@ module Temporal
|
|
5
5
|
module Serializer
|
6
6
|
class CancelTimer < Base
|
7
7
|
def to_proto
|
8
|
-
Temporal::Api::
|
8
|
+
Temporal::Api::Command::V1::Command.new(
|
9
9
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_CANCEL_TIMER,
|
10
10
|
cancel_timer_command_attributes:
|
11
|
-
Temporal::Api::
|
11
|
+
Temporal::Api::Command::V1::CancelTimerCommandAttributes.new(
|
12
12
|
timer_id: object.timer_id.to_s
|
13
13
|
)
|
14
14
|
)
|
@@ -1,16 +1,18 @@
|
|
1
1
|
require 'temporal/client/serializer/base'
|
2
|
-
require 'temporal/
|
2
|
+
require 'temporal/concerns/payloads'
|
3
3
|
|
4
4
|
module Temporal
|
5
5
|
module Client
|
6
6
|
module Serializer
|
7
7
|
class CompleteWorkflow < Base
|
8
|
+
include Concerns::Payloads
|
9
|
+
|
8
10
|
def to_proto
|
9
|
-
Temporal::Api::
|
11
|
+
Temporal::Api::Command::V1::Command.new(
|
10
12
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_COMPLETE_WORKFLOW_EXECUTION,
|
11
13
|
complete_workflow_execution_command_attributes:
|
12
|
-
Temporal::Api::
|
13
|
-
result:
|
14
|
+
Temporal::Api::Command::V1::CompleteWorkflowExecutionCommandAttributes.new(
|
15
|
+
result: to_result_payloads(object.result)
|
14
16
|
)
|
15
17
|
)
|
16
18
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'temporal/client/serializer/base'
|
2
|
+
require 'temporal/client/serializer/retry_policy'
|
3
|
+
require 'temporal/concerns/payloads'
|
4
|
+
|
5
|
+
module Temporal
|
6
|
+
module Client
|
7
|
+
module Serializer
|
8
|
+
class ContinueAsNew < Base
|
9
|
+
include Concerns::Payloads
|
10
|
+
|
11
|
+
def to_proto
|
12
|
+
Temporal::Api::Command::V1::Command.new(
|
13
|
+
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_CONTINUE_AS_NEW_WORKFLOW_EXECUTION,
|
14
|
+
continue_as_new_workflow_execution_command_attributes:
|
15
|
+
Temporal::Api::Command::V1::ContinueAsNewWorkflowExecutionCommandAttributes.new(
|
16
|
+
workflow_type: Temporal::Api::Common::V1::WorkflowType.new(name: object.workflow_type),
|
17
|
+
task_queue: Temporal::Api::TaskQueue::V1::TaskQueue.new(name: object.task_queue),
|
18
|
+
input: to_payloads(object.input),
|
19
|
+
workflow_run_timeout: object.timeouts[:execution],
|
20
|
+
workflow_task_timeout: object.timeouts[:task],
|
21
|
+
retry_policy: Temporal::Client::Serializer::RetryPolicy.new(object.retry_policy).to_proto,
|
22
|
+
header: serialize_headers(object.headers)
|
23
|
+
)
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def serialize_headers(headers)
|
30
|
+
return unless headers
|
31
|
+
|
32
|
+
Temporal::Api::Common::V1::Header.new(fields: object.headers)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -6,10 +6,10 @@ module Temporal
|
|
6
6
|
module Serializer
|
7
7
|
class FailWorkflow < Base
|
8
8
|
def to_proto
|
9
|
-
Temporal::Api::
|
9
|
+
Temporal::Api::Command::V1::Command.new(
|
10
10
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_FAIL_WORKFLOW_EXECUTION,
|
11
11
|
fail_workflow_execution_command_attributes:
|
12
|
-
Temporal::Api::
|
12
|
+
Temporal::Api::Command::V1::FailWorkflowExecutionCommandAttributes.new(
|
13
13
|
failure: Failure.new(object.exception).to_proto
|
14
14
|
)
|
15
15
|
)
|
@@ -1,17 +1,19 @@
|
|
1
1
|
require 'temporal/client/serializer/base'
|
2
|
-
require 'temporal/
|
2
|
+
require 'temporal/concerns/payloads'
|
3
3
|
|
4
4
|
module Temporal
|
5
5
|
module Client
|
6
6
|
module Serializer
|
7
7
|
class Failure < Base
|
8
|
+
include Concerns::Payloads
|
9
|
+
|
8
10
|
def to_proto
|
9
11
|
Temporal::Api::Failure::V1::Failure.new(
|
10
12
|
message: object.message,
|
11
13
|
stack_trace: stack_trace_from(object.backtrace),
|
12
14
|
application_failure_info: Temporal::Api::Failure::V1::ApplicationFailureInfo.new(
|
13
15
|
type: object.class.name,
|
14
|
-
details:
|
16
|
+
details: to_details_payloads(object.message)
|
15
17
|
)
|
16
18
|
)
|
17
19
|
end
|
@@ -1,18 +1,20 @@
|
|
1
1
|
require 'temporal/client/serializer/base'
|
2
|
-
require 'temporal/
|
2
|
+
require 'temporal/concerns/payloads'
|
3
3
|
|
4
4
|
module Temporal
|
5
5
|
module Client
|
6
6
|
module Serializer
|
7
7
|
class RecordMarker < Base
|
8
|
+
include Concerns::Payloads
|
9
|
+
|
8
10
|
def to_proto
|
9
|
-
Temporal::Api::
|
11
|
+
Temporal::Api::Command::V1::Command.new(
|
10
12
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_RECORD_MARKER,
|
11
13
|
record_marker_command_attributes:
|
12
|
-
Temporal::Api::
|
14
|
+
Temporal::Api::Command::V1::RecordMarkerCommandAttributes.new(
|
13
15
|
marker_name: object.name,
|
14
16
|
details: {
|
15
|
-
'data' =>
|
17
|
+
'data' => to_details_payloads(object.details)
|
16
18
|
}
|
17
19
|
)
|
18
20
|
)
|
@@ -5,10 +5,10 @@ module Temporal
|
|
5
5
|
module Serializer
|
6
6
|
class RequestActivityCancellation < Base
|
7
7
|
def to_proto
|
8
|
-
Temporal::Api::
|
8
|
+
Temporal::Api::Command::V1::Command.new(
|
9
9
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_REQUEST_CANCEL_ACTIVITY_TASK,
|
10
10
|
request_cancel_activity_task_command_attributes:
|
11
|
-
Temporal::Api::
|
11
|
+
Temporal::Api::Command::V1::RequestCancelActivityTaskCommandAttributes.new(
|
12
12
|
scheduled_event_id: object.activity_id.to_i
|
13
13
|
)
|
14
14
|
)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'temporal/client/serializer/base'
|
2
|
+
|
3
|
+
module Temporal
|
4
|
+
module Client
|
5
|
+
module Serializer
|
6
|
+
class RetryPolicy < Base
|
7
|
+
def to_proto
|
8
|
+
return unless object
|
9
|
+
|
10
|
+
non_retriable_errors = Array(object.non_retriable_errors).map(&:name)
|
11
|
+
options = {
|
12
|
+
initial_interval: object.interval,
|
13
|
+
backoff_coefficient: object.backoff,
|
14
|
+
maximum_interval: object.max_interval,
|
15
|
+
maximum_attempts: object.max_attempts,
|
16
|
+
non_retryable_error_types: non_retriable_errors,
|
17
|
+
}.compact
|
18
|
+
|
19
|
+
Temporal::Api::Common::V1::RetryPolicy.new(options)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,25 +1,28 @@
|
|
1
1
|
require 'temporal/client/serializer/base'
|
2
|
-
require 'temporal/client/serializer/
|
2
|
+
require 'temporal/client/serializer/retry_policy'
|
3
|
+
require 'temporal/concerns/payloads'
|
3
4
|
|
4
5
|
module Temporal
|
5
6
|
module Client
|
6
7
|
module Serializer
|
7
8
|
class ScheduleActivity < Base
|
9
|
+
include Concerns::Payloads
|
10
|
+
|
8
11
|
def to_proto
|
9
|
-
Temporal::Api::
|
12
|
+
Temporal::Api::Command::V1::Command.new(
|
10
13
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_SCHEDULE_ACTIVITY_TASK,
|
11
14
|
schedule_activity_task_command_attributes:
|
12
|
-
Temporal::Api::
|
15
|
+
Temporal::Api::Command::V1::ScheduleActivityTaskCommandAttributes.new(
|
13
16
|
activity_id: object.activity_id.to_s,
|
14
17
|
activity_type: Temporal::Api::Common::V1::ActivityType.new(name: object.activity_type),
|
15
|
-
input:
|
18
|
+
input: to_payloads(object.input),
|
16
19
|
namespace: object.namespace,
|
17
20
|
task_queue: Temporal::Api::TaskQueue::V1::TaskQueue.new(name: object.task_queue),
|
18
21
|
schedule_to_close_timeout: object.timeouts[:schedule_to_close],
|
19
22
|
schedule_to_start_timeout: object.timeouts[:schedule_to_start],
|
20
23
|
start_to_close_timeout: object.timeouts[:start_to_close],
|
21
24
|
heartbeat_timeout: object.timeouts[:heartbeat],
|
22
|
-
retry_policy:
|
25
|
+
retry_policy: Temporal::Client::Serializer::RetryPolicy.new(object.retry_policy).to_proto,
|
23
26
|
header: serialize_headers(object.headers)
|
24
27
|
)
|
25
28
|
)
|
@@ -27,21 +30,6 @@ module Temporal
|
|
27
30
|
|
28
31
|
private
|
29
32
|
|
30
|
-
def serialize_retry_policy(retry_policy)
|
31
|
-
return unless retry_policy
|
32
|
-
|
33
|
-
non_retriable_errors = Array(retry_policy.non_retriable_errors).map(&:name)
|
34
|
-
options = {
|
35
|
-
initial_interval: retry_policy.interval,
|
36
|
-
backoff_coefficient: retry_policy.backoff,
|
37
|
-
maximum_interval: retry_policy.max_interval,
|
38
|
-
maximum_attempts: retry_policy.max_attempts,
|
39
|
-
non_retryable_error_types: non_retriable_errors
|
40
|
-
}.compact
|
41
|
-
|
42
|
-
Temporal::Api::Common::V1::RetryPolicy.new(options)
|
43
|
-
end
|
44
|
-
|
45
33
|
def serialize_headers(headers)
|
46
34
|
return unless headers
|
47
35
|
|
@@ -1,23 +1,27 @@
|
|
1
1
|
require 'temporal/client/serializer/base'
|
2
|
-
require 'temporal/client/serializer/
|
2
|
+
require 'temporal/client/serializer/retry_policy'
|
3
|
+
require 'temporal/concerns/payloads'
|
3
4
|
|
4
5
|
module Temporal
|
5
6
|
module Client
|
6
7
|
module Serializer
|
7
8
|
class StartChildWorkflow < Base
|
9
|
+
include Concerns::Payloads
|
10
|
+
|
8
11
|
def to_proto
|
9
|
-
Temporal::Api::
|
12
|
+
Temporal::Api::Command::V1::Command.new(
|
10
13
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_START_CHILD_WORKFLOW_EXECUTION,
|
11
14
|
start_child_workflow_execution_command_attributes:
|
12
|
-
Temporal::Api::
|
15
|
+
Temporal::Api::Command::V1::StartChildWorkflowExecutionCommandAttributes.new(
|
13
16
|
namespace: object.namespace,
|
14
17
|
workflow_id: object.workflow_id.to_s,
|
15
18
|
workflow_type: Temporal::Api::Common::V1::WorkflowType.new(name: object.workflow_type),
|
16
19
|
task_queue: Temporal::Api::TaskQueue::V1::TaskQueue.new(name: object.task_queue),
|
17
|
-
input:
|
20
|
+
input: to_payloads(object.input),
|
18
21
|
workflow_execution_timeout: object.timeouts[:execution],
|
22
|
+
workflow_run_timeout: object.timeouts[:run],
|
19
23
|
workflow_task_timeout: object.timeouts[:task],
|
20
|
-
retry_policy:
|
24
|
+
retry_policy: Temporal::Client::Serializer::RetryPolicy.new(object.retry_policy).to_proto,
|
21
25
|
header: serialize_headers(object.headers)
|
22
26
|
)
|
23
27
|
)
|
@@ -25,21 +29,6 @@ module Temporal
|
|
25
29
|
|
26
30
|
private
|
27
31
|
|
28
|
-
def serialize_retry_policy(retry_policy)
|
29
|
-
return unless retry_policy
|
30
|
-
|
31
|
-
non_retriable_errors = Array(retry_policy.non_retriable_errors).map(&:name)
|
32
|
-
options = {
|
33
|
-
initial_interval: retry_policy.interval,
|
34
|
-
backoff_coefficient: retry_policy.backoff,
|
35
|
-
maximum_interval: retry_policy.max_interval,
|
36
|
-
maximum_attempts: retry_policy.max_attempts,
|
37
|
-
non_retriable_error_reasons: non_retriable_errors,
|
38
|
-
}.compact
|
39
|
-
|
40
|
-
Temporal::Api::Common::V1::RetryPolicy.new(options)
|
41
|
-
end
|
42
|
-
|
43
32
|
def serialize_headers(headers)
|
44
33
|
return unless headers
|
45
34
|
|
@@ -5,10 +5,10 @@ module Temporal
|
|
5
5
|
module Serializer
|
6
6
|
class StartTimer < Base
|
7
7
|
def to_proto
|
8
|
-
Temporal::Api::
|
8
|
+
Temporal::Api::Command::V1::Command.new(
|
9
9
|
command_type: Temporal::Api::Enums::V1::CommandType::COMMAND_TYPE_START_TIMER,
|
10
10
|
start_timer_command_attributes:
|
11
|
-
Temporal::Api::
|
11
|
+
Temporal::Api::Command::V1::StartTimerCommandAttributes.new(
|
12
12
|
timer_id: object.timer_id.to_s,
|
13
13
|
start_to_fire_timeout: object.timeout
|
14
14
|
)
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Temporal
|
2
|
+
module Concerns
|
3
|
+
module Payloads
|
4
|
+
def from_payloads(payloads)
|
5
|
+
payload_converter.from_payloads(payloads)
|
6
|
+
end
|
7
|
+
|
8
|
+
def from_payload(payload)
|
9
|
+
payload_converter.from_payload(payload)
|
10
|
+
end
|
11
|
+
|
12
|
+
def from_result_payloads(payloads)
|
13
|
+
from_payloads(payloads)&.first
|
14
|
+
end
|
15
|
+
|
16
|
+
def from_details_payloads(payloads)
|
17
|
+
from_payloads(payloads)&.first
|
18
|
+
end
|
19
|
+
|
20
|
+
def from_signal_payloads(payloads)
|
21
|
+
from_payloads(payloads)&.first
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_payloads(data)
|
25
|
+
payload_converter.to_payloads(data)
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_payload(data)
|
29
|
+
payload_converter.to_payload(data)
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_result_payloads(data)
|
33
|
+
to_payloads([data])
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_details_payloads(data)
|
37
|
+
to_payloads([data])
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_signal_payloads(data)
|
41
|
+
to_payloads([data])
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def payload_converter
|
47
|
+
Temporal.configuration.converter
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -1,13 +1,23 @@
|
|
1
|
-
require 'logger'
|
1
|
+
require 'temporal/logger'
|
2
2
|
require 'temporal/metrics_adapters/null'
|
3
|
+
require 'temporal/client/converter/payload/nil'
|
4
|
+
require 'temporal/client/converter/payload/bytes'
|
5
|
+
require 'temporal/client/converter/payload/json'
|
6
|
+
require 'temporal/client/converter/composite'
|
3
7
|
|
4
8
|
module Temporal
|
5
9
|
class Configuration
|
6
|
-
attr_reader :timeouts
|
10
|
+
attr_reader :timeouts, :error_handlers
|
11
|
+
attr_writer :converter
|
7
12
|
attr_accessor :client_type, :host, :port, :logger, :metrics_adapter, :namespace, :task_queue, :headers
|
8
13
|
|
14
|
+
# We want an infinite execution timeout for cron schedules and other perpetual workflows.
|
15
|
+
# We choose an 10-year execution timeout because that's the maximum the cassandra DB supports,
|
16
|
+
# matching the go SDK, see https://github.com/temporalio/sdk-go/blob/d96130dad3d2bc189bc7626543bd5911cc07ff6d/internal/internal_workflow_testsuite.go#L68
|
9
17
|
DEFAULT_TIMEOUTS = {
|
10
|
-
execution:
|
18
|
+
execution: 86_400 * 365 * 10, # End-to-end workflow time, including all recurrences if it's scheduled.
|
19
|
+
# Time for a single run, excluding retries. Server defaults to execution timeout; we default here as well to be explicit.
|
20
|
+
run: 86_400 * 365 * 10,
|
11
21
|
task: 10, # Workflow task processing time
|
12
22
|
schedule_to_close: nil, # End-to-end activity time (default: schedule_to_start + start_to_close)
|
13
23
|
schedule_to_start: 10, # Queue time for an activity
|
@@ -18,15 +28,28 @@ module Temporal
|
|
18
28
|
DEFAULT_HEADERS = {}.freeze
|
19
29
|
DEFAULT_NAMESPACE = 'default-namespace'.freeze
|
20
30
|
DEFAULT_TASK_QUEUE = 'default-task-queue'.freeze
|
31
|
+
DEFAULT_CONVERTER = Temporal::Client::Converter::Composite.new(
|
32
|
+
payload_converters: [
|
33
|
+
Temporal::Client::Converter::Payload::Nil.new,
|
34
|
+
Temporal::Client::Converter::Payload::Bytes.new,
|
35
|
+
Temporal::Client::Converter::Payload::JSON.new,
|
36
|
+
]
|
37
|
+
).freeze
|
21
38
|
|
22
39
|
def initialize
|
23
40
|
@client_type = :grpc
|
24
|
-
@logger = Logger.new(STDOUT, progname: 'temporal_client')
|
41
|
+
@logger = Temporal::Logger.new(STDOUT, progname: 'temporal_client')
|
25
42
|
@metrics_adapter = MetricsAdapters::Null.new
|
26
43
|
@timeouts = DEFAULT_TIMEOUTS
|
27
44
|
@namespace = DEFAULT_NAMESPACE
|
28
45
|
@task_queue = DEFAULT_TASK_QUEUE
|
29
46
|
@headers = DEFAULT_HEADERS
|
47
|
+
@converter = DEFAULT_CONVERTER
|
48
|
+
@error_handlers = []
|
49
|
+
end
|
50
|
+
|
51
|
+
def on_error(&block)
|
52
|
+
@error_handlers << block
|
30
53
|
end
|
31
54
|
|
32
55
|
def task_list
|
@@ -40,5 +63,9 @@ module Temporal
|
|
40
63
|
def timeouts=(new_timeouts)
|
41
64
|
@timeouts = DEFAULT_TIMEOUTS.merge(new_timeouts)
|
42
65
|
end
|
66
|
+
|
67
|
+
def converter
|
68
|
+
@converter
|
69
|
+
end
|
43
70
|
end
|
44
71
|
end
|