amit-temporalio 0.3.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 (179) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +2 -0
  3. data/Cargo.lock +4325 -0
  4. data/Cargo.toml +25 -0
  5. data/Gemfile +23 -0
  6. data/LICENSE +21 -0
  7. data/README.md +1148 -0
  8. data/Rakefile +101 -0
  9. data/ext/Cargo.toml +27 -0
  10. data/lib/temporalio/activity/complete_async_error.rb +11 -0
  11. data/lib/temporalio/activity/context.rb +116 -0
  12. data/lib/temporalio/activity/definition.rb +189 -0
  13. data/lib/temporalio/activity/info.rb +64 -0
  14. data/lib/temporalio/activity.rb +12 -0
  15. data/lib/temporalio/api/activity/v1/message.rb +25 -0
  16. data/lib/temporalio/api/batch/v1/message.rb +31 -0
  17. data/lib/temporalio/api/cloud/account/v1/message.rb +28 -0
  18. data/lib/temporalio/api/cloud/cloudservice/v1/request_response.rb +126 -0
  19. data/lib/temporalio/api/cloud/cloudservice/v1/service.rb +25 -0
  20. data/lib/temporalio/api/cloud/cloudservice.rb +3 -0
  21. data/lib/temporalio/api/cloud/identity/v1/message.rb +41 -0
  22. data/lib/temporalio/api/cloud/namespace/v1/message.rb +42 -0
  23. data/lib/temporalio/api/cloud/nexus/v1/message.rb +31 -0
  24. data/lib/temporalio/api/cloud/operation/v1/message.rb +28 -0
  25. data/lib/temporalio/api/cloud/region/v1/message.rb +24 -0
  26. data/lib/temporalio/api/cloud/resource/v1/message.rb +23 -0
  27. data/lib/temporalio/api/cloud/sink/v1/message.rb +24 -0
  28. data/lib/temporalio/api/cloud/usage/v1/message.rb +31 -0
  29. data/lib/temporalio/api/command/v1/message.rb +46 -0
  30. data/lib/temporalio/api/common/v1/grpc_status.rb +23 -0
  31. data/lib/temporalio/api/common/v1/message.rb +47 -0
  32. data/lib/temporalio/api/enums/v1/batch_operation.rb +22 -0
  33. data/lib/temporalio/api/enums/v1/command_type.rb +21 -0
  34. data/lib/temporalio/api/enums/v1/common.rb +26 -0
  35. data/lib/temporalio/api/enums/v1/event_type.rb +21 -0
  36. data/lib/temporalio/api/enums/v1/failed_cause.rb +26 -0
  37. data/lib/temporalio/api/enums/v1/namespace.rb +23 -0
  38. data/lib/temporalio/api/enums/v1/query.rb +22 -0
  39. data/lib/temporalio/api/enums/v1/reset.rb +23 -0
  40. data/lib/temporalio/api/enums/v1/schedule.rb +21 -0
  41. data/lib/temporalio/api/enums/v1/task_queue.rb +25 -0
  42. data/lib/temporalio/api/enums/v1/update.rb +22 -0
  43. data/lib/temporalio/api/enums/v1/workflow.rb +30 -0
  44. data/lib/temporalio/api/errordetails/v1/message.rb +42 -0
  45. data/lib/temporalio/api/export/v1/message.rb +24 -0
  46. data/lib/temporalio/api/failure/v1/message.rb +35 -0
  47. data/lib/temporalio/api/filter/v1/message.rb +27 -0
  48. data/lib/temporalio/api/history/v1/message.rb +90 -0
  49. data/lib/temporalio/api/namespace/v1/message.rb +31 -0
  50. data/lib/temporalio/api/nexus/v1/message.rb +40 -0
  51. data/lib/temporalio/api/operatorservice/v1/request_response.rb +49 -0
  52. data/lib/temporalio/api/operatorservice/v1/service.rb +23 -0
  53. data/lib/temporalio/api/operatorservice.rb +3 -0
  54. data/lib/temporalio/api/payload_visitor.rb +1513 -0
  55. data/lib/temporalio/api/protocol/v1/message.rb +23 -0
  56. data/lib/temporalio/api/query/v1/message.rb +27 -0
  57. data/lib/temporalio/api/replication/v1/message.rb +26 -0
  58. data/lib/temporalio/api/schedule/v1/message.rb +43 -0
  59. data/lib/temporalio/api/sdk/v1/enhanced_stack_trace.rb +25 -0
  60. data/lib/temporalio/api/sdk/v1/task_complete_metadata.rb +21 -0
  61. data/lib/temporalio/api/sdk/v1/user_metadata.rb +23 -0
  62. data/lib/temporalio/api/sdk/v1/workflow_metadata.rb +23 -0
  63. data/lib/temporalio/api/taskqueue/v1/message.rb +45 -0
  64. data/lib/temporalio/api/testservice/v1/request_response.rb +31 -0
  65. data/lib/temporalio/api/testservice/v1/service.rb +23 -0
  66. data/lib/temporalio/api/update/v1/message.rb +33 -0
  67. data/lib/temporalio/api/version/v1/message.rb +26 -0
  68. data/lib/temporalio/api/workflow/v1/message.rb +43 -0
  69. data/lib/temporalio/api/workflowservice/v1/request_response.rb +204 -0
  70. data/lib/temporalio/api/workflowservice/v1/service.rb +23 -0
  71. data/lib/temporalio/api/workflowservice.rb +3 -0
  72. data/lib/temporalio/api.rb +14 -0
  73. data/lib/temporalio/cancellation.rb +170 -0
  74. data/lib/temporalio/client/activity_id_reference.rb +32 -0
  75. data/lib/temporalio/client/async_activity_handle.rb +85 -0
  76. data/lib/temporalio/client/connection/cloud_service.rb +726 -0
  77. data/lib/temporalio/client/connection/operator_service.rb +201 -0
  78. data/lib/temporalio/client/connection/service.rb +42 -0
  79. data/lib/temporalio/client/connection/test_service.rb +111 -0
  80. data/lib/temporalio/client/connection/workflow_service.rb +1041 -0
  81. data/lib/temporalio/client/connection.rb +316 -0
  82. data/lib/temporalio/client/interceptor.rb +416 -0
  83. data/lib/temporalio/client/schedule.rb +967 -0
  84. data/lib/temporalio/client/schedule_handle.rb +126 -0
  85. data/lib/temporalio/client/workflow_execution.rb +100 -0
  86. data/lib/temporalio/client/workflow_execution_count.rb +36 -0
  87. data/lib/temporalio/client/workflow_execution_status.rb +18 -0
  88. data/lib/temporalio/client/workflow_handle.rb +389 -0
  89. data/lib/temporalio/client/workflow_query_reject_condition.rb +14 -0
  90. data/lib/temporalio/client/workflow_update_handle.rb +65 -0
  91. data/lib/temporalio/client/workflow_update_wait_stage.rb +17 -0
  92. data/lib/temporalio/client.rb +484 -0
  93. data/lib/temporalio/common_enums.rb +41 -0
  94. data/lib/temporalio/converters/data_converter.rb +99 -0
  95. data/lib/temporalio/converters/failure_converter.rb +202 -0
  96. data/lib/temporalio/converters/payload_codec.rb +26 -0
  97. data/lib/temporalio/converters/payload_converter/binary_null.rb +34 -0
  98. data/lib/temporalio/converters/payload_converter/binary_plain.rb +35 -0
  99. data/lib/temporalio/converters/payload_converter/binary_protobuf.rb +42 -0
  100. data/lib/temporalio/converters/payload_converter/composite.rb +66 -0
  101. data/lib/temporalio/converters/payload_converter/encoding.rb +35 -0
  102. data/lib/temporalio/converters/payload_converter/json_plain.rb +44 -0
  103. data/lib/temporalio/converters/payload_converter/json_protobuf.rb +41 -0
  104. data/lib/temporalio/converters/payload_converter.rb +71 -0
  105. data/lib/temporalio/converters/raw_value.rb +20 -0
  106. data/lib/temporalio/converters.rb +9 -0
  107. data/lib/temporalio/error/failure.rb +219 -0
  108. data/lib/temporalio/error.rb +155 -0
  109. data/lib/temporalio/internal/bridge/api/activity_result/activity_result.rb +34 -0
  110. data/lib/temporalio/internal/bridge/api/activity_task/activity_task.rb +31 -0
  111. data/lib/temporalio/internal/bridge/api/child_workflow/child_workflow.rb +33 -0
  112. data/lib/temporalio/internal/bridge/api/common/common.rb +26 -0
  113. data/lib/temporalio/internal/bridge/api/core_interface.rb +40 -0
  114. data/lib/temporalio/internal/bridge/api/external_data/external_data.rb +27 -0
  115. data/lib/temporalio/internal/bridge/api/nexus/nexus.rb +33 -0
  116. data/lib/temporalio/internal/bridge/api/workflow_activation/workflow_activation.rb +56 -0
  117. data/lib/temporalio/internal/bridge/api/workflow_commands/workflow_commands.rb +57 -0
  118. data/lib/temporalio/internal/bridge/api/workflow_completion/workflow_completion.rb +30 -0
  119. data/lib/temporalio/internal/bridge/api.rb +3 -0
  120. data/lib/temporalio/internal/bridge/client.rb +95 -0
  121. data/lib/temporalio/internal/bridge/runtime.rb +53 -0
  122. data/lib/temporalio/internal/bridge/testing.rb +66 -0
  123. data/lib/temporalio/internal/bridge/worker.rb +85 -0
  124. data/lib/temporalio/internal/bridge.rb +36 -0
  125. data/lib/temporalio/internal/client/implementation.rb +700 -0
  126. data/lib/temporalio/internal/metric.rb +122 -0
  127. data/lib/temporalio/internal/proto_utils.rb +133 -0
  128. data/lib/temporalio/internal/worker/activity_worker.rb +376 -0
  129. data/lib/temporalio/internal/worker/multi_runner.rb +213 -0
  130. data/lib/temporalio/internal/worker/workflow_instance/child_workflow_handle.rb +54 -0
  131. data/lib/temporalio/internal/worker/workflow_instance/context.rb +333 -0
  132. data/lib/temporalio/internal/worker/workflow_instance/details.rb +44 -0
  133. data/lib/temporalio/internal/worker/workflow_instance/external_workflow_handle.rb +32 -0
  134. data/lib/temporalio/internal/worker/workflow_instance/externally_immutable_hash.rb +22 -0
  135. data/lib/temporalio/internal/worker/workflow_instance/handler_execution.rb +25 -0
  136. data/lib/temporalio/internal/worker/workflow_instance/handler_hash.rb +41 -0
  137. data/lib/temporalio/internal/worker/workflow_instance/illegal_call_tracer.rb +97 -0
  138. data/lib/temporalio/internal/worker/workflow_instance/inbound_implementation.rb +62 -0
  139. data/lib/temporalio/internal/worker/workflow_instance/outbound_implementation.rb +415 -0
  140. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_logger.rb +37 -0
  141. data/lib/temporalio/internal/worker/workflow_instance/replay_safe_metric.rb +40 -0
  142. data/lib/temporalio/internal/worker/workflow_instance/scheduler.rb +163 -0
  143. data/lib/temporalio/internal/worker/workflow_instance.rb +730 -0
  144. data/lib/temporalio/internal/worker/workflow_worker.rb +236 -0
  145. data/lib/temporalio/internal.rb +7 -0
  146. data/lib/temporalio/metric.rb +109 -0
  147. data/lib/temporalio/retry_policy.rb +74 -0
  148. data/lib/temporalio/runtime.rb +314 -0
  149. data/lib/temporalio/scoped_logger.rb +96 -0
  150. data/lib/temporalio/search_attributes.rb +343 -0
  151. data/lib/temporalio/testing/activity_environment.rb +136 -0
  152. data/lib/temporalio/testing/workflow_environment.rb +383 -0
  153. data/lib/temporalio/testing.rb +10 -0
  154. data/lib/temporalio/version.rb +5 -0
  155. data/lib/temporalio/worker/activity_executor/fiber.rb +49 -0
  156. data/lib/temporalio/worker/activity_executor/thread_pool.rb +46 -0
  157. data/lib/temporalio/worker/activity_executor.rb +55 -0
  158. data/lib/temporalio/worker/interceptor.rb +362 -0
  159. data/lib/temporalio/worker/thread_pool.rb +237 -0
  160. data/lib/temporalio/worker/tuner.rb +189 -0
  161. data/lib/temporalio/worker/workflow_executor/thread_pool.rb +230 -0
  162. data/lib/temporalio/worker/workflow_executor.rb +26 -0
  163. data/lib/temporalio/worker/workflow_replayer.rb +343 -0
  164. data/lib/temporalio/worker.rb +569 -0
  165. data/lib/temporalio/workflow/activity_cancellation_type.rb +20 -0
  166. data/lib/temporalio/workflow/child_workflow_cancellation_type.rb +21 -0
  167. data/lib/temporalio/workflow/child_workflow_handle.rb +43 -0
  168. data/lib/temporalio/workflow/definition.rb +566 -0
  169. data/lib/temporalio/workflow/external_workflow_handle.rb +41 -0
  170. data/lib/temporalio/workflow/future.rb +151 -0
  171. data/lib/temporalio/workflow/handler_unfinished_policy.rb +13 -0
  172. data/lib/temporalio/workflow/info.rb +82 -0
  173. data/lib/temporalio/workflow/parent_close_policy.rb +19 -0
  174. data/lib/temporalio/workflow/update_info.rb +20 -0
  175. data/lib/temporalio/workflow.rb +529 -0
  176. data/lib/temporalio/workflow_history.rb +47 -0
  177. data/lib/temporalio.rb +11 -0
  178. data/temporalio.gemspec +28 -0
  179. metadata +234 -0
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio/scoped_logger'
4
+
5
+ module Temporalio
6
+ module Internal
7
+ module Worker
8
+ class WorkflowInstance
9
+ # Wrapper for a metric that does not log on replay.
10
+ class ReplaySafeMetric < SimpleDelegator
11
+ def record(value, additional_attributes: nil)
12
+ return if Temporalio::Workflow.in_workflow? && Temporalio::Workflow::Unsafe.replaying?
13
+
14
+ super
15
+ end
16
+
17
+ def with_additional_attributes(additional_attributes)
18
+ ReplaySafeMetric.new(super)
19
+ end
20
+
21
+ class Meter < SimpleDelegator
22
+ def create_metric(
23
+ metric_type,
24
+ name,
25
+ description: nil,
26
+ unit: nil,
27
+ value_type: :integer
28
+ )
29
+ ReplaySafeMetric.new(super)
30
+ end
31
+
32
+ def with_additional_attributes(additional_attributes)
33
+ Meter.new(super)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'temporalio'
4
+ require 'temporalio/cancellation'
5
+ require 'temporalio/error'
6
+ require 'temporalio/internal/worker/workflow_instance'
7
+ require 'temporalio/workflow'
8
+ require 'timeout'
9
+
10
+ module Temporalio
11
+ module Internal
12
+ module Worker
13
+ class WorkflowInstance
14
+ # Deterministic {::Fiber::Scheduler} implementation.
15
+ class Scheduler
16
+ def initialize(instance)
17
+ @instance = instance
18
+ @fibers = []
19
+ @ready = []
20
+ @wait_conditions = {}
21
+ @wait_condition_counter = 0
22
+ end
23
+
24
+ def context
25
+ @instance.context
26
+ end
27
+
28
+ def run_until_all_yielded
29
+ loop do
30
+ # Run all fibers until all yielded
31
+ while (fiber = @ready.shift)
32
+ fiber.resume
33
+ end
34
+
35
+ # Find the _first_ resolvable wait condition and if there, resolve it, and loop again, otherwise return.
36
+ # It is important that we both let fibers get all settled _before_ this and only allow a _single_ wait
37
+ # condition to be satisfied before looping. This allows wait condition users to trust that the line of
38
+ # code after the wait condition still has the condition satisfied.
39
+ # @type var cond_fiber: Fiber?
40
+ cond_fiber = nil
41
+ cond_result = nil
42
+ @wait_conditions.each do |seq, cond|
43
+ next unless (cond_result = cond.first.call)
44
+
45
+ cond_fiber = cond[1]
46
+ @wait_conditions.delete(seq)
47
+ break
48
+ end
49
+ return unless cond_fiber
50
+
51
+ cond_fiber.resume(cond_result)
52
+ end
53
+ end
54
+
55
+ def wait_condition(cancellation:, &block)
56
+ raise Workflow::InvalidWorkflowStateError, 'Cannot wait in this context' if @instance.context_frozen
57
+
58
+ if cancellation&.canceled?
59
+ raise Error::CanceledError,
60
+ cancellation.canceled_reason || 'Wait condition canceled before started'
61
+ end
62
+
63
+ seq = (@wait_condition_counter += 1)
64
+ @wait_conditions[seq] = [block, Fiber.current]
65
+
66
+ # Add a cancellation callback
67
+ cancel_callback_key = cancellation&.add_cancel_callback do
68
+ # Only if the condition is still present
69
+ cond = @wait_conditions.delete(seq)
70
+ if cond&.last&.alive?
71
+ cond&.last&.raise(Error::CanceledError.new(cancellation&.canceled_reason || 'Wait condition canceled'))
72
+ end
73
+ end
74
+
75
+ # This blocks until a resume is called on this fiber
76
+ result = Fiber.yield
77
+
78
+ # Remove cancellation callback (only needed on success)
79
+ cancellation&.remove_cancel_callback(cancel_callback_key) if cancel_callback_key
80
+
81
+ result
82
+ end
83
+
84
+ def stack_trace
85
+ # Collect backtraces of known fibers, separating with a blank line. We make sure to remove any lines that
86
+ # reference Temporal paths, and we remove any empty backtraces.
87
+ dir_path = @instance.illegal_call_tracing_disabled { File.dirname(Temporalio._root_file_path) }
88
+ @fibers.map do |fiber|
89
+ fiber.backtrace.reject { |s| s.start_with?(dir_path) }.join("\n")
90
+ end.reject(&:empty?).join("\n\n")
91
+ end
92
+
93
+ ###
94
+ # Fiber::Scheduler methods
95
+ #
96
+ # Note, we do not implement many methods here such as io_read and
97
+ # such. While it might seem to make sense to implement them and
98
+ # raise, we actually want to default to the blocking behavior of them
99
+ # not being present. This is so advanced things like logging still
100
+ # work inside of workflows. So we only implement the bare minimum.
101
+ ###
102
+
103
+ def block(_blocker, timeout = nil)
104
+ # TODO(cretz): Make the blocker visible in the stack trace?
105
+
106
+ # We just yield because unblock will resume this. We will just wrap in timeout if needed.
107
+ if timeout
108
+ begin
109
+ Timeout.timeout(timeout) { Fiber.yield }
110
+ true
111
+ rescue Timeout::Error
112
+ false
113
+ end
114
+ else
115
+ Fiber.yield
116
+ true
117
+ end
118
+ end
119
+
120
+ def close
121
+ # Nothing to do here, lifetime of scheduler is controlled by the instance
122
+ end
123
+
124
+ def fiber(&block)
125
+ if @instance.context_frozen
126
+ raise Workflow::InvalidWorkflowStateError, 'Cannot schedule fibers in this context'
127
+ end
128
+
129
+ fiber = Fiber.new do
130
+ block.call # steep:ignore
131
+ ensure
132
+ @fibers.delete(Fiber.current)
133
+ end
134
+ @fibers << fiber
135
+ @ready << fiber
136
+ fiber
137
+ end
138
+
139
+ def io_wait(io, events, timeout)
140
+ # TODO(cretz): This in a blocking fashion?
141
+ raise NotImplementedError, 'TODO'
142
+ end
143
+
144
+ def kernel_sleep(duration = nil)
145
+ Workflow.sleep(duration)
146
+ end
147
+
148
+ def process_wait(pid, flags)
149
+ raise NotImplementedError, 'Cannot wait on other processes in workflows'
150
+ end
151
+
152
+ def timeout_after(duration, exception_class, *exception_arguments, &)
153
+ context.timeout(duration, exception_class, *exception_arguments, summary: 'Timeout timer', &)
154
+ end
155
+
156
+ def unblock(_blocker, fiber)
157
+ @ready << fiber
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end