temporalio 0.2.0-x86_64-darwin → 0.3.0-x86_64-darwin

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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +2 -0
  3. data/Gemfile +3 -3
  4. data/Rakefile +10 -296
  5. data/lib/temporalio/activity/complete_async_error.rb +1 -1
  6. data/lib/temporalio/activity/context.rb +5 -2
  7. data/lib/temporalio/activity/definition.rb +163 -65
  8. data/lib/temporalio/activity/info.rb +22 -21
  9. data/lib/temporalio/activity.rb +2 -59
  10. data/lib/temporalio/api/activity/v1/message.rb +25 -0
  11. data/lib/temporalio/api/cloud/account/v1/message.rb +28 -0
  12. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +34 -1
  13. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +1 -1
  14. data/lib/temporalio/api/cloud/identity/v1/message.rb +6 -1
  15. data/lib/temporalio/api/cloud/namespace/v1/message.rb +8 -1
  16. data/lib/temporalio/api/cloud/nexus/v1/message.rb +31 -0
  17. data/lib/temporalio/api/cloud/operation/v1/message.rb +2 -1
  18. data/lib/temporalio/api/cloud/region/v1/message.rb +2 -1
  19. data/lib/temporalio/api/cloud/resource/v1/message.rb +23 -0
  20. data/lib/temporalio/api/cloud/sink/v1/message.rb +24 -0
  21. data/lib/temporalio/api/cloud/usage/v1/message.rb +31 -0
  22. data/lib/temporalio/api/common/v1/message.rb +7 -1
  23. data/lib/temporalio/api/enums/v1/event_type.rb +1 -1
  24. data/lib/temporalio/api/enums/v1/failed_cause.rb +1 -1
  25. data/lib/temporalio/api/enums/v1/reset.rb +1 -1
  26. data/lib/temporalio/api/history/v1/message.rb +1 -1
  27. data/lib/temporalio/api/nexus/v1/message.rb +2 -2
  28. data/lib/temporalio/api/operatorservice/v1/service.rb +1 -1
  29. data/lib/temporalio/api/payload_visitor.rb +1513 -0
  30. data/lib/temporalio/api/schedule/v1/message.rb +2 -1
  31. data/lib/temporalio/api/testservice/v1/request_response.rb +31 -0
  32. data/lib/temporalio/api/testservice/v1/service.rb +23 -0
  33. data/lib/temporalio/api/workflow/v1/message.rb +1 -1
  34. data/lib/temporalio/api/workflowservice/v1/request_response.rb +17 -2
  35. data/lib/temporalio/api/workflowservice/v1/service.rb +1 -1
  36. data/lib/temporalio/api.rb +1 -0
  37. data/lib/temporalio/cancellation.rb +34 -14
  38. data/lib/temporalio/client/async_activity_handle.rb +12 -37
  39. data/lib/temporalio/client/connection/cloud_service.rb +309 -231
  40. data/lib/temporalio/client/connection/operator_service.rb +36 -84
  41. data/lib/temporalio/client/connection/service.rb +6 -5
  42. data/lib/temporalio/client/connection/test_service.rb +111 -0
  43. data/lib/temporalio/client/connection/workflow_service.rb +264 -441
  44. data/lib/temporalio/client/connection.rb +90 -44
  45. data/lib/temporalio/client/interceptor.rb +160 -60
  46. data/lib/temporalio/client/schedule.rb +967 -0
  47. data/lib/temporalio/client/schedule_handle.rb +126 -0
  48. data/lib/temporalio/client/workflow_execution.rb +7 -10
  49. data/lib/temporalio/client/workflow_handle.rb +38 -95
  50. data/lib/temporalio/client/workflow_update_handle.rb +3 -5
  51. data/lib/temporalio/client.rb +122 -42
  52. data/lib/temporalio/common_enums.rb +17 -0
  53. data/lib/temporalio/converters/data_converter.rb +4 -7
  54. data/lib/temporalio/converters/failure_converter.rb +5 -3
  55. data/lib/temporalio/converters/payload_converter/composite.rb +4 -0
  56. data/lib/temporalio/converters/payload_converter.rb +6 -8
  57. data/lib/temporalio/converters/raw_value.rb +20 -0
  58. data/lib/temporalio/error/failure.rb +1 -1
  59. data/lib/temporalio/error.rb +10 -2
  60. data/lib/temporalio/internal/bridge/3.2/temporalio_bridge.bundle +0 -0
  61. data/lib/temporalio/internal/bridge/3.3/temporalio_bridge.bundle +0 -0
  62. data/lib/temporalio/internal/bridge/{3.1 → 3.4}/temporalio_bridge.bundle +0 -0
  63. data/lib/temporalio/internal/bridge/api/core_interface.rb +5 -1
  64. data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +33 -0
  65. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +5 -1
  66. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +4 -1
  67. data/lib/temporalio/internal/bridge/client.rb +11 -6
  68. data/lib/temporalio/internal/bridge/testing.rb +20 -0
  69. data/lib/temporalio/internal/bridge/worker.rb +2 -0
  70. data/lib/temporalio/internal/bridge.rb +1 -1
  71. data/lib/temporalio/internal/client/implementation.rb +245 -70
  72. data/lib/temporalio/internal/metric.rb +122 -0
  73. data/lib/temporalio/internal/proto_utils.rb +86 -7
  74. data/lib/temporalio/internal/worker/activity_worker.rb +52 -24
  75. data/lib/temporalio/internal/worker/multi_runner.rb +51 -7
  76. data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +54 -0
  77. data/lib/temporalio/internal/worker/workflow_instance/context.rb +329 -0
  78. data/lib/temporalio/internal/worker/workflow_instance/details.rb +44 -0
  79. data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +32 -0
  80. data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +22 -0
  81. data/lib/temporalio/internal/worker/workflow_instance/handler_execution.rb +25 -0
  82. data/lib/temporalio/internal/worker/workflow_instance/handler_hash.rb +41 -0
  83. data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +97 -0
  84. data/lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb +62 -0
  85. data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +415 -0
  86. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +37 -0
  87. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_metric.rb +40 -0
  88. data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +163 -0
  89. data/lib/temporalio/internal/worker/workflow_instance.rb +730 -0
  90. data/lib/temporalio/internal/worker/workflow_worker.rb +196 -0
  91. data/lib/temporalio/metric.rb +109 -0
  92. data/lib/temporalio/retry_policy.rb +37 -14
  93. data/lib/temporalio/runtime.rb +118 -75
  94. data/lib/temporalio/search_attributes.rb +80 -37
  95. data/lib/temporalio/testing/activity_environment.rb +2 -2
  96. data/lib/temporalio/testing/workflow_environment.rb +251 -5
  97. data/lib/temporalio/version.rb +1 -1
  98. data/lib/temporalio/worker/activity_executor/thread_pool.rb +9 -217
  99. data/lib/temporalio/worker/activity_executor.rb +3 -3
  100. data/lib/temporalio/worker/interceptor.rb +340 -66
  101. data/lib/temporalio/worker/thread_pool.rb +237 -0
  102. data/lib/temporalio/worker/workflow_executor/thread_pool.rb +230 -0
  103. data/lib/temporalio/worker/workflow_executor.rb +26 -0
  104. data/lib/temporalio/worker.rb +201 -30
  105. data/lib/temporalio/workflow/activity_cancellation_type.rb +20 -0
  106. data/lib/temporalio/workflow/child_workflow_cancellation_type.rb +21 -0
  107. data/lib/temporalio/workflow/child_workflow_handle.rb +43 -0
  108. data/lib/temporalio/workflow/definition.rb +566 -0
  109. data/lib/temporalio/workflow/external_workflow_handle.rb +41 -0
  110. data/lib/temporalio/workflow/future.rb +151 -0
  111. data/lib/temporalio/workflow/handler_unfinished_policy.rb +13 -0
  112. data/lib/temporalio/workflow/info.rb +82 -0
  113. data/lib/temporalio/workflow/parent_close_policy.rb +19 -0
  114. data/lib/temporalio/workflow/update_info.rb +20 -0
  115. data/lib/temporalio/workflow.rb +523 -0
  116. data/lib/temporalio.rb +4 -0
  117. data/temporalio.gemspec +2 -2
  118. metadata +52 -6
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'temporalio/error'
4
+ require 'temporalio/workflow'
4
5
 
5
6
  module Temporalio
6
7
  # Cancellation representation, often known as a "cancellation token". This is used by clients, activities, and
@@ -19,7 +20,7 @@ module Temporalio
19
20
  @canceled_reason = nil
20
21
  @canceled_mutex = Mutex.new
21
22
  @canceled_cond_var = nil
22
- @cancel_callbacks = []
23
+ @cancel_callbacks = {} # Keyed by sentinel value, but value iteration still is deterministic
23
24
  @shield_depth = 0
24
25
  @shield_pending_cancel = nil # When pending, set as single-reason array
25
26
  parents.each { |p| p.add_cancel_callback { on_cancel(reason: p.canceled_reason) } }
@@ -59,15 +60,24 @@ module Temporalio
59
60
  [self, proc { |reason: nil| on_cancel(reason:) }]
60
61
  end
61
62
 
62
- # Wait on this to be canceled. This is backed by a {::ConditionVariable}.
63
+ # Wait on this to be canceled. This is backed by a {::ConditionVariable} outside of workflows or
64
+ # {Workflow.wait_condition} inside of workflows.
63
65
  def wait
66
+ # If this is in a workflow, just wait for the canceled. This is because ConditionVariable does a no-duration
67
+ # kernel_sleep to the fiber scheduler which ends up recursing back into this because the workflow implementation
68
+ # of kernel_sleep by default relies on cancellation.
69
+ if Workflow.in_workflow?
70
+ Workflow.wait_condition(cancellation: nil) { @canceled }
71
+ return
72
+ end
73
+
64
74
  @canceled_mutex.synchronize do
65
75
  break if @canceled
66
76
 
67
77
  # Add cond var if not present
68
78
  if @canceled_cond_var.nil?
69
79
  @canceled_cond_var = ConditionVariable.new
70
- @cancel_callbacks.push(proc { @canceled_mutex.synchronize { @canceled_cond_var.broadcast } })
80
+ @cancel_callbacks[Object.new] = proc { @canceled_mutex.synchronize { @canceled_cond_var.broadcast } }
71
81
  end
72
82
 
73
83
  # Wait on it
@@ -105,21 +115,29 @@ module Temporalio
105
115
  #
106
116
  # @note WARNING: This is advanced API, users should use {wait} or similar.
107
117
  #
108
- # @param proc [Proc, nil] Proc to invoke, or nil to use block.
109
118
  # @yield Accepts block if not using `proc`.
110
- def add_cancel_callback(proc = nil, &block)
111
- raise ArgumentError, 'Must provide proc or block' unless proc || block
112
- raise ArgumentError, 'Cannot provide both proc and block' if proc && block
113
- raise ArgumentError, 'Parameter not a proc' if proc && !proc.is_a?(Proc)
119
+ # @return [Object] Key that can be used with {remove_cancel_callback} or `nil`` if run immediately.
120
+ def add_cancel_callback(&block)
121
+ raise ArgumentError, 'Must provide block' unless block_given?
114
122
 
115
- callback_to_run_immediately = @canceled_mutex.synchronize do
116
- callback = proc || block
117
- @cancel_callbacks.push(proc || block)
118
- break nil unless @canceled
123
+ callback_to_run_immediately, key = @canceled_mutex.synchronize do
124
+ break [block, nil] if @canceled
119
125
 
120
- callback
126
+ key = Object.new
127
+ @cancel_callbacks[key] = block
128
+ [nil, key]
121
129
  end
122
130
  callback_to_run_immediately&.call
131
+ key
132
+ end
133
+
134
+ # Remove a cancel callback using the key returned from {add_cancel_callback}.
135
+ #
136
+ # @param key [Object] Key returned from {add_cancel_callback}.
137
+ def remove_cancel_callback(key)
138
+ @canceled_mutex.synchronize do
139
+ @cancel_callbacks.delete(key)
140
+ end
123
141
  nil
124
142
  end
125
143
 
@@ -144,7 +162,9 @@ module Temporalio
144
162
 
145
163
  @canceled = true
146
164
  @canceled_reason = reason
147
- @cancel_callbacks.dup
165
+ to_return = @cancel_callbacks.dup
166
+ @cancel_callbacks.clear
167
+ to_return.values
148
168
  end
149
169
  end
150
170
  end
@@ -27,36 +27,24 @@ module Temporalio
27
27
  # Record a heartbeat for the activity.
28
28
  #
29
29
  # @param details [Array<Object>] Details of the heartbeat.
30
- # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
31
- # @param rpc_timeout [Float, nil] Number of seconds before timeout.
32
- def heartbeat(
33
- *details,
34
- rpc_metadata: nil,
35
- rpc_timeout: nil
36
- )
30
+ # @param rpc_options [RPCOptions, nil] Advanced RPC options.
31
+ def heartbeat(*details, rpc_options: nil)
37
32
  @client._impl.heartbeat_async_activity(Interceptor::HeartbeatAsyncActivityInput.new(
38
33
  task_token_or_id_reference:,
39
34
  details:,
40
- rpc_metadata:,
41
- rpc_timeout:
35
+ rpc_options:
42
36
  ))
43
37
  end
44
38
 
45
39
  # Complete the activity.
46
40
  #
47
41
  # @param result [Object, nil] Result of the activity.
48
- # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
49
- # @param rpc_timeout [Float, nil] Number of seconds before timeout.
50
- def complete(
51
- result = nil,
52
- rpc_metadata: nil,
53
- rpc_timeout: nil
54
- )
42
+ # @param rpc_options [RPCOptions, nil] Advanced RPC options.
43
+ def complete(result = nil, rpc_options: nil)
55
44
  @client._impl.complete_async_activity(Interceptor::CompleteAsyncActivityInput.new(
56
45
  task_token_or_id_reference:,
57
46
  result:,
58
- rpc_metadata:,
59
- rpc_timeout:
47
+ rpc_options:
60
48
  ))
61
49
  end
62
50
 
@@ -64,39 +52,26 @@ module Temporalio
64
52
  #
65
53
  # @param error [Exception] Error for the activity.
66
54
  # @param last_heartbeat_details [Array<Object>] Last heartbeat details for the activity.
67
- # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
68
- # @param rpc_timeout [Float, nil] Number of seconds before timeout.
69
- def fail(
70
- error,
71
- last_heartbeat_details: [],
72
- rpc_metadata: nil,
73
- rpc_timeout: nil
74
- )
55
+ # @param rpc_options [RPCOptions, nil] Advanced RPC options.
56
+ def fail(error, last_heartbeat_details: [], rpc_options: nil)
75
57
  @client._impl.fail_async_activity(Interceptor::FailAsyncActivityInput.new(
76
58
  task_token_or_id_reference:,
77
59
  error:,
78
60
  last_heartbeat_details:,
79
- rpc_metadata:,
80
- rpc_timeout:
61
+ rpc_options:
81
62
  ))
82
63
  end
83
64
 
84
65
  # Report the activity as canceled.
85
66
  #
86
67
  # @param details [Array<Object>] Cancellation details.
87
- # @param rpc_metadata [Hash<String, String>, nil] Headers to include on the RPC call.
88
- # @param rpc_timeout [Float, nil] Number of seconds before timeout.
68
+ # @param rpc_options [RPCOptions, nil] Advanced RPC options.
89
69
  # @raise [AsyncActivityCanceledError] If the activity has been canceled.
90
- def report_cancellation(
91
- *details,
92
- rpc_metadata: nil,
93
- rpc_timeout: nil
94
- )
70
+ def report_cancellation(*details, rpc_options: nil)
95
71
  @client._impl.report_cancellation_async_activity(Interceptor::ReportCancellationAsyncActivityInput.new(
96
72
  task_token_or_id_reference:,
97
73
  details:,
98
- rpc_metadata:,
99
- rpc_timeout:
74
+ rpc_options:
100
75
  ))
101
76
  end
102
77