temporal-ruby 0.0.1.pre.pre1 → 0.0.1
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 +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
|