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.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -0
  3. data/README.md +23 -3
  4. data/lib/gen/temporal/api/command/v1/message_pb.rb +1 -1
  5. data/lib/gen/temporal/api/enums/v1/common_pb.rb +7 -0
  6. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +5 -6
  7. data/lib/gen/temporal/api/version/v1/message_pb.rb +19 -8
  8. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +19 -8
  9. data/lib/gen/temporal/api/workflowservice/v1/service_services_pb.rb +0 -3
  10. data/lib/temporal.rb +104 -0
  11. data/lib/temporal/activity/context.rb +5 -1
  12. data/lib/temporal/activity/poller.rb +26 -9
  13. data/lib/temporal/activity/task_processor.rb +33 -20
  14. data/lib/temporal/client/converter/base.rb +35 -0
  15. data/lib/temporal/client/converter/composite.rb +49 -0
  16. data/lib/temporal/client/converter/payload/bytes.rb +30 -0
  17. data/lib/temporal/client/converter/payload/json.rb +28 -0
  18. data/lib/temporal/client/converter/payload/nil.rb +27 -0
  19. data/lib/temporal/client/grpc_client.rb +102 -27
  20. data/lib/temporal/client/retryer.rb +49 -0
  21. data/lib/temporal/client/serializer.rb +2 -0
  22. data/lib/temporal/client/serializer/cancel_timer.rb +2 -2
  23. data/lib/temporal/client/serializer/complete_workflow.rb +6 -4
  24. data/lib/temporal/client/serializer/continue_as_new.rb +37 -0
  25. data/lib/temporal/client/serializer/fail_workflow.rb +2 -2
  26. data/lib/temporal/client/serializer/failure.rb +4 -2
  27. data/lib/temporal/client/serializer/record_marker.rb +6 -4
  28. data/lib/temporal/client/serializer/request_activity_cancellation.rb +2 -2
  29. data/lib/temporal/client/serializer/retry_policy.rb +24 -0
  30. data/lib/temporal/client/serializer/schedule_activity.rb +8 -20
  31. data/lib/temporal/client/serializer/start_child_workflow.rb +9 -20
  32. data/lib/temporal/client/serializer/start_timer.rb +2 -2
  33. data/lib/temporal/concerns/payloads.rb +51 -0
  34. data/lib/temporal/configuration.rb +31 -4
  35. data/lib/temporal/error_handler.rb +11 -0
  36. data/lib/temporal/errors.rb +24 -0
  37. data/lib/temporal/execution_options.rb +9 -1
  38. data/lib/temporal/json.rb +3 -1
  39. data/lib/temporal/logger.rb +17 -0
  40. data/lib/temporal/metadata.rb +11 -3
  41. data/lib/temporal/metadata/activity.rb +15 -2
  42. data/lib/temporal/metadata/workflow.rb +8 -0
  43. data/lib/temporal/metadata/workflow_task.rb +11 -0
  44. data/lib/temporal/retry_policy.rb +6 -9
  45. data/lib/temporal/saga/concern.rb +1 -1
  46. data/lib/temporal/testing.rb +1 -0
  47. data/lib/temporal/testing/future_registry.rb +1 -1
  48. data/lib/temporal/testing/local_activity_context.rb +1 -1
  49. data/lib/temporal/testing/local_workflow_context.rb +38 -14
  50. data/lib/temporal/testing/scheduled_workflows.rb +75 -0
  51. data/lib/temporal/testing/temporal_override.rb +35 -7
  52. data/lib/temporal/testing/workflow_override.rb +6 -1
  53. data/lib/temporal/version.rb +1 -1
  54. data/lib/temporal/worker.rb +28 -10
  55. data/lib/temporal/workflow.rb +8 -2
  56. data/lib/temporal/workflow/command.rb +3 -0
  57. data/lib/temporal/workflow/context.rb +40 -5
  58. data/lib/temporal/workflow/errors.rb +39 -0
  59. data/lib/temporal/workflow/executor.rb +1 -1
  60. data/lib/temporal/workflow/future.rb +18 -6
  61. data/lib/temporal/workflow/history/event.rb +1 -3
  62. data/lib/temporal/workflow/history/event_target.rb +4 -0
  63. data/lib/temporal/workflow/history/window.rb +1 -1
  64. data/lib/temporal/workflow/poller.rb +41 -13
  65. data/lib/temporal/workflow/replay_aware_logger.rb +4 -4
  66. data/lib/temporal/workflow/state_manager.rb +33 -52
  67. data/lib/temporal/workflow/task_processor.rb +41 -11
  68. metadata +21 -9
  69. 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::Decision::V1::Command.new(
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::Decision::V1::CancelTimerCommandAttributes.new(
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/client/serializer/payload'
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::Decision::V1::Command.new(
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::Decision::V1::CompleteWorkflowExecutionCommandAttributes.new(
13
- result: Payload.new(object.result).to_proto
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::Decision::V1::Command.new(
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::Decision::V1::FailWorkflowExecutionCommandAttributes.new(
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/json'
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: Payload.new(object.message).to_proto
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/client/serializer/payload'
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::Decision::V1::Command.new(
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::Decision::V1::RecordMarkerCommandAttributes.new(
14
+ Temporal::Api::Command::V1::RecordMarkerCommandAttributes.new(
13
15
  marker_name: object.name,
14
16
  details: {
15
- 'data' => Payload.new(object.details).to_proto
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::Decision::V1::Command.new(
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::Decision::V1::RequestCancelActivityTaskCommandAttributes.new(
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/payload'
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::Decision::V1::Command.new(
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::Decision::V1::ScheduleActivityTaskCommandAttributes.new(
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: Payload.new(object.input).to_proto,
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: serialize_retry_policy(object.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/payload'
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::Decision::V1::Command.new(
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::Decision::V1::StartChildWorkflowExecutionCommandAttributes.new(
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: Payload.new(object.input).to_proto,
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: serialize_retry_policy(object.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::Decision::V1::Command.new(
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::Decision::V1::StartTimerCommandAttributes.new(
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: 60, # End-to-end workflow time
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