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.
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