temporal-ruby 0.0.0 → 0.0.1.pre.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +19 -42
- data/lib/gen/temporal/api/command/v1/message_pb.rb +146 -0
- data/lib/gen/temporal/api/common/v1/message_pb.rb +67 -0
- data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +35 -0
- data/lib/gen/temporal/api/enums/v1/common_pb.rb +34 -0
- data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +62 -0
- data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +60 -0
- data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +31 -0
- data/lib/gen/temporal/api/enums/v1/query_pb.rb +31 -0
- data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +30 -0
- data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +82 -0
- data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +55 -0
- data/lib/gen/temporal/api/failure/v1/message_pb.rb +81 -0
- data/lib/gen/temporal/api/filter/v1/message_pb.rb +38 -0
- data/lib/gen/temporal/api/history/v1/message_pb.rb +423 -0
- data/lib/gen/temporal/api/namespace/v1/message_pb.rb +55 -0
- data/lib/gen/temporal/api/query/v1/message_pb.rb +36 -0
- data/lib/gen/temporal/api/replication/v1/message_pb.rb +27 -0
- data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +60 -0
- data/lib/gen/temporal/api/version/v1/message_pb.rb +28 -0
- data/lib/gen/temporal/api/workflow/v1/message_pb.rb +83 -0
- data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +538 -0
- data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +19 -0
- data/lib/gen/temporal/api/workflowservice/v1/service_services_pb.rb +223 -0
- data/lib/temporal-ruby.rb +1 -0
- data/lib/temporal.rb +137 -0
- data/lib/temporal/activity.rb +33 -0
- data/lib/temporal/activity/async_token.rb +34 -0
- data/lib/temporal/activity/context.rb +64 -0
- data/lib/temporal/activity/poller.rb +79 -0
- data/lib/temporal/activity/task_processor.rb +78 -0
- data/lib/temporal/activity/workflow_convenience_methods.rb +41 -0
- data/lib/temporal/client.rb +21 -0
- data/lib/temporal/client/errors.rb +8 -0
- data/lib/temporal/client/grpc_client.rb +345 -0
- data/lib/temporal/client/serializer.rb +31 -0
- data/lib/temporal/client/serializer/base.rb +23 -0
- data/lib/temporal/client/serializer/cancel_timer.rb +19 -0
- data/lib/temporal/client/serializer/complete_workflow.rb +20 -0
- data/lib/temporal/client/serializer/fail_workflow.rb +20 -0
- data/lib/temporal/client/serializer/failure.rb +29 -0
- data/lib/temporal/client/serializer/payload.rb +25 -0
- data/lib/temporal/client/serializer/record_marker.rb +23 -0
- data/lib/temporal/client/serializer/request_activity_cancellation.rb +19 -0
- data/lib/temporal/client/serializer/schedule_activity.rb +53 -0
- data/lib/temporal/client/serializer/start_child_workflow.rb +51 -0
- data/lib/temporal/client/serializer/start_timer.rb +20 -0
- data/lib/temporal/concerns/executable.rb +37 -0
- data/lib/temporal/concerns/typed.rb +40 -0
- data/lib/temporal/configuration.rb +44 -0
- data/lib/temporal/errors.rb +38 -0
- data/lib/temporal/executable_lookup.rb +25 -0
- data/lib/temporal/execution_options.rb +35 -0
- data/lib/temporal/json.rb +18 -0
- data/lib/temporal/metadata.rb +68 -0
- data/lib/temporal/metadata/activity.rb +27 -0
- data/lib/temporal/metadata/base.rb +17 -0
- data/lib/temporal/metadata/workflow.rb +22 -0
- data/lib/temporal/metadata/workflow_task.rb +25 -0
- data/lib/temporal/metrics.rb +37 -0
- data/lib/temporal/metrics_adapters/log.rb +33 -0
- data/lib/temporal/metrics_adapters/null.rb +9 -0
- data/lib/temporal/middleware/chain.rb +30 -0
- data/lib/temporal/middleware/entry.rb +9 -0
- data/lib/temporal/retry_policy.rb +27 -0
- data/lib/temporal/saga/concern.rb +23 -0
- data/lib/temporal/saga/result.rb +22 -0
- data/lib/temporal/saga/saga.rb +24 -0
- data/lib/temporal/testing.rb +50 -0
- data/lib/temporal/testing/future_registry.rb +27 -0
- data/lib/temporal/testing/local_activity_context.rb +17 -0
- data/lib/temporal/testing/local_workflow_context.rb +178 -0
- data/lib/temporal/testing/temporal_override.rb +121 -0
- data/lib/temporal/testing/workflow_execution.rb +44 -0
- data/lib/temporal/testing/workflow_override.rb +36 -0
- data/lib/temporal/thread_local_context.rb +14 -0
- data/lib/temporal/thread_pool.rb +63 -0
- data/lib/temporal/types.rb +7 -0
- data/lib/temporal/uuid.rb +19 -0
- data/lib/temporal/version.rb +1 -1
- data/lib/temporal/worker.rb +88 -0
- data/lib/temporal/workflow.rb +42 -0
- data/lib/temporal/workflow/command.rb +39 -0
- data/lib/temporal/workflow/command_state_machine.rb +48 -0
- data/lib/temporal/workflow/context.rb +243 -0
- data/lib/temporal/workflow/convenience_methods.rb +34 -0
- data/lib/temporal/workflow/dispatcher.rb +31 -0
- data/lib/temporal/workflow/execution_info.rb +51 -0
- data/lib/temporal/workflow/executor.rb +45 -0
- data/lib/temporal/workflow/future.rb +77 -0
- data/lib/temporal/workflow/history.rb +76 -0
- data/lib/temporal/workflow/history/event.rb +69 -0
- data/lib/temporal/workflow/history/event_target.rb +75 -0
- data/lib/temporal/workflow/history/window.rb +40 -0
- data/lib/temporal/workflow/poller.rb +67 -0
- data/lib/temporal/workflow/replay_aware_logger.rb +36 -0
- data/lib/temporal/workflow/state_manager.rb +342 -0
- data/lib/temporal/workflow/task_processor.rb +78 -0
- data/rbi/temporal-ruby.rbi +43 -0
- data/temporal.gemspec +10 -2
- metadata +186 -6
@@ -0,0 +1,19 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# source: temporal/api/workflowservice/v1/service.proto
|
3
|
+
|
4
|
+
require 'google/protobuf'
|
5
|
+
|
6
|
+
require 'temporal/api/workflowservice/v1/request_response_pb'
|
7
|
+
Google::Protobuf::DescriptorPool.generated_pool.build do
|
8
|
+
add_file("temporal/api/workflowservice/v1/service.proto", :syntax => :proto3) do
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
module Temporal
|
13
|
+
module Api
|
14
|
+
module WorkflowService
|
15
|
+
module V1
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,223 @@
|
|
1
|
+
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
2
|
+
# Source: temporal/api/workflowservice/v1/service.proto for package 'Temporal.Api.WorkflowService.V1'
|
3
|
+
# Original file comments:
|
4
|
+
# The MIT License
|
5
|
+
#
|
6
|
+
# Copyright (c) 2020 Temporal Technologies Inc. All rights reserved.
|
7
|
+
#
|
8
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
9
|
+
# of this software and associated documentation files (the "Software"), to deal
|
10
|
+
# in the Software without restriction, including without limitation the rights
|
11
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
12
|
+
# copies of the Software, and to permit persons to whom the Software is
|
13
|
+
# furnished to do so, subject to the following conditions:
|
14
|
+
#
|
15
|
+
# The above copyright notice and this permission notice shall be included in
|
16
|
+
# all copies or substantial portions of the Software.
|
17
|
+
#
|
18
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
19
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
20
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
21
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
22
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
23
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
24
|
+
# THE SOFTWARE.
|
25
|
+
#
|
26
|
+
|
27
|
+
require 'grpc'
|
28
|
+
require 'temporal/api/workflowservice/v1/service_pb'
|
29
|
+
|
30
|
+
module Temporal
|
31
|
+
module Api
|
32
|
+
module WorkflowService
|
33
|
+
module V1
|
34
|
+
module WorkflowService
|
35
|
+
# WorkflowService API is exposed to provide support for long running applications. Application is expected to call
|
36
|
+
# StartWorkflowExecution to create an instance for each instance of long running workflow. Such applications are expected
|
37
|
+
# to have a worker which regularly polls for WorkflowTask and ActivityTask from the WorkflowService. For each
|
38
|
+
# WorkflowTask, application is expected to process the history of events for that session and respond back with next
|
39
|
+
# commands. For each ActivityTask, application is expected to execute the actual logic for that task and respond back
|
40
|
+
# with completion or failure. Worker is expected to regularly heartbeat while activity task is running.
|
41
|
+
class Service
|
42
|
+
|
43
|
+
include GRPC::GenericService
|
44
|
+
|
45
|
+
self.marshal_class_method = :encode
|
46
|
+
self.unmarshal_class_method = :decode
|
47
|
+
self.service_name = 'temporal.api.workflowservice.v1.WorkflowService'
|
48
|
+
|
49
|
+
# RegisterNamespace creates a new namespace which can be used as a container for all resources. Namespace is a top level
|
50
|
+
# entity within Temporal, used as a container for all resources like workflow executions, task queues, etc. Namespace
|
51
|
+
# acts as a sandbox and provides isolation for all resources within the namespace. All resources belongs to exactly one
|
52
|
+
# namespace.
|
53
|
+
rpc :RegisterNamespace, ::Temporal::Api::WorkflowService::V1::RegisterNamespaceRequest, ::Temporal::Api::WorkflowService::V1::RegisterNamespaceResponse
|
54
|
+
# DescribeNamespace returns the information and configuration for a registered namespace.
|
55
|
+
rpc :DescribeNamespace, ::Temporal::Api::WorkflowService::V1::DescribeNamespaceRequest, ::Temporal::Api::WorkflowService::V1::DescribeNamespaceResponse
|
56
|
+
# ListNamespaces returns the information and configuration for all namespaces.
|
57
|
+
rpc :ListNamespaces, ::Temporal::Api::WorkflowService::V1::ListNamespacesRequest, ::Temporal::Api::WorkflowService::V1::ListNamespacesResponse
|
58
|
+
# (-- api-linter: core::0134::method-signature=disabled
|
59
|
+
# aip.dev/not-precedent: UpdateNamespace RPC doesn't follow Google API format. --)
|
60
|
+
# (-- api-linter: core::0134::response-message-name=disabled
|
61
|
+
# aip.dev/not-precedent: UpdateNamespace RPC doesn't follow Google API format. --)
|
62
|
+
# UpdateNamespace is used to update the information and configuration for a registered namespace.
|
63
|
+
rpc :UpdateNamespace, ::Temporal::Api::WorkflowService::V1::UpdateNamespaceRequest, ::Temporal::Api::WorkflowService::V1::UpdateNamespaceResponse
|
64
|
+
# DeprecateNamespace is used to update state of a registered namespace to DEPRECATED. Once the namespace is deprecated
|
65
|
+
# it cannot be used to start new workflow executions. Existing workflow executions will continue to run on
|
66
|
+
# deprecated namespaces.
|
67
|
+
rpc :DeprecateNamespace, ::Temporal::Api::WorkflowService::V1::DeprecateNamespaceRequest, ::Temporal::Api::WorkflowService::V1::DeprecateNamespaceResponse
|
68
|
+
# StartWorkflowExecution starts a new long running workflow instance. It will create the instance with
|
69
|
+
# 'WorkflowExecutionStarted' event in history and also schedule the first WorkflowTask for the worker to make the
|
70
|
+
# first command for this instance. It will return 'WorkflowExecutionAlreadyStartedFailure', if an instance already
|
71
|
+
# exists with same workflowId.
|
72
|
+
rpc :StartWorkflowExecution, ::Temporal::Api::WorkflowService::V1::StartWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::StartWorkflowExecutionResponse
|
73
|
+
# GetWorkflowExecutionHistory returns the history of specified workflow execution. It fails with 'NotFoundFailure' if specified workflow
|
74
|
+
# execution in unknown to the service.
|
75
|
+
rpc :GetWorkflowExecutionHistory, ::Temporal::Api::WorkflowService::V1::GetWorkflowExecutionHistoryRequest, ::Temporal::Api::WorkflowService::V1::GetWorkflowExecutionHistoryResponse
|
76
|
+
# PollWorkflowTaskQueue is called by application worker to process WorkflowTask from a specific task queue. A
|
77
|
+
# WorkflowTask is dispatched to callers for active workflow executions, with pending workflow tasks.
|
78
|
+
# Application is then expected to call 'RespondWorkflowTaskCompleted' API when it is done processing the WorkflowTask.
|
79
|
+
# It will also create a 'WorkflowTaskStarted' event in the history for that session before handing off WorkflowTask to
|
80
|
+
# application worker.
|
81
|
+
rpc :PollWorkflowTaskQueue, ::Temporal::Api::WorkflowService::V1::PollWorkflowTaskQueueRequest, ::Temporal::Api::WorkflowService::V1::PollWorkflowTaskQueueResponse
|
82
|
+
# RespondWorkflowTaskCompleted is called by application worker to complete a WorkflowTask handed as a result of
|
83
|
+
# 'PollWorkflowTaskQueue' API call. Completing a WorkflowTask will result in new events for the workflow execution and
|
84
|
+
# potentially new ActivityTask being created for corresponding commands. It will also create a WorkflowTaskCompleted
|
85
|
+
# event in the history for that session. Use the 'taskToken' provided as response of PollWorkflowTaskQueue API call
|
86
|
+
# for completing the WorkflowTask.
|
87
|
+
# The response could contain a new workflow task if there is one or if the request asking for one.
|
88
|
+
rpc :RespondWorkflowTaskCompleted, ::Temporal::Api::WorkflowService::V1::RespondWorkflowTaskCompletedRequest, ::Temporal::Api::WorkflowService::V1::RespondWorkflowTaskCompletedResponse
|
89
|
+
# RespondWorkflowTaskFailed is called by application worker to indicate failure. This results in
|
90
|
+
# WorkflowTaskFailedEvent written to the history and a new WorkflowTask created. This API can be used by client to
|
91
|
+
# either clear sticky task queue or report any panics during WorkflowTask processing. Temporal will only append first
|
92
|
+
# WorkflowTaskFailed event to the history of workflow execution for consecutive failures.
|
93
|
+
rpc :RespondWorkflowTaskFailed, ::Temporal::Api::WorkflowService::V1::RespondWorkflowTaskFailedRequest, ::Temporal::Api::WorkflowService::V1::RespondWorkflowTaskFailedResponse
|
94
|
+
# PollActivityTaskQueue is called by application worker to process ActivityTask from a specific task queue. ActivityTask
|
95
|
+
# is dispatched to callers whenever a ScheduleTask command is made for a workflow execution.
|
96
|
+
# Application is expected to call 'RespondActivityTaskCompleted' or 'RespondActivityTaskFailed' once it is done
|
97
|
+
# processing the task.
|
98
|
+
# Application also needs to call 'RecordActivityTaskHeartbeat' API within 'heartbeatTimeoutSeconds' interval to
|
99
|
+
# prevent the task from getting timed out. An event 'ActivityTaskStarted' event is also written to workflow execution
|
100
|
+
# history before the ActivityTask is dispatched to application worker.
|
101
|
+
rpc :PollActivityTaskQueue, ::Temporal::Api::WorkflowService::V1::PollActivityTaskQueueRequest, ::Temporal::Api::WorkflowService::V1::PollActivityTaskQueueResponse
|
102
|
+
# RecordActivityTaskHeartbeat is called by application worker while it is processing an ActivityTask. If worker fails
|
103
|
+
# to heartbeat within 'heartbeatTimeoutSeconds' interval for the ActivityTask, then it will be marked as timedout and
|
104
|
+
# 'ActivityTaskTimedOut' event will be written to the workflow history. Calling 'RecordActivityTaskHeartbeat' will
|
105
|
+
# fail with 'NotFoundFailure' in such situations. Use the 'taskToken' provided as response of
|
106
|
+
# PollActivityTaskQueue API call for heart beating.
|
107
|
+
rpc :RecordActivityTaskHeartbeat, ::Temporal::Api::WorkflowService::V1::RecordActivityTaskHeartbeatRequest, ::Temporal::Api::WorkflowService::V1::RecordActivityTaskHeartbeatResponse
|
108
|
+
# (-- api-linter: core::0136::prepositions=disabled
|
109
|
+
# aip.dev/not-precedent: "By" is used to indicate request type. --)
|
110
|
+
# RecordActivityTaskHeartbeatById is called by application worker while it is processing an ActivityTask. If worker fails
|
111
|
+
# to heartbeat within 'heartbeatTimeoutSeconds' interval for the ActivityTask, then it will be marked as timed out and
|
112
|
+
# 'ActivityTaskTimedOut' event will be written to the workflow history. Calling 'RecordActivityTaskHeartbeatById' will
|
113
|
+
# fail with 'NotFoundFailure' in such situations. Instead of using 'taskToken' like in RecordActivityTaskHeartbeat,
|
114
|
+
# use Namespace, WorkflowId and ActivityId
|
115
|
+
rpc :RecordActivityTaskHeartbeatById, ::Temporal::Api::WorkflowService::V1::RecordActivityTaskHeartbeatByIdRequest, ::Temporal::Api::WorkflowService::V1::RecordActivityTaskHeartbeatByIdResponse
|
116
|
+
# RespondActivityTaskCompleted is called by application worker when it is done processing an ActivityTask. It will
|
117
|
+
# result in a new 'ActivityTaskCompleted' event being written to the workflow history and a new WorkflowTask
|
118
|
+
# created for the workflow so new commands could be made. Use the 'taskToken' provided as response of
|
119
|
+
# PollActivityTaskQueue API call for completion. It fails with 'NotFoundFailure' if the taskToken is not valid
|
120
|
+
# anymore due to activity timeout.
|
121
|
+
rpc :RespondActivityTaskCompleted, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCompletedRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCompletedResponse
|
122
|
+
# (-- api-linter: core::0136::prepositions=disabled
|
123
|
+
# aip.dev/not-precedent: "By" is used to indicate request type. --)
|
124
|
+
# RespondActivityTaskCompletedById is called by application worker when it is done processing an ActivityTask.
|
125
|
+
# It will result in a new 'ActivityTaskCompleted' event being written to the workflow history and a new WorkflowTask
|
126
|
+
# created for the workflow so new commands could be made. Similar to RespondActivityTaskCompleted but use Namespace,
|
127
|
+
# WorkflowId and ActivityId instead of 'taskToken' for completion. It fails with 'NotFoundFailure'
|
128
|
+
# if the these Ids are not valid anymore due to activity timeout.
|
129
|
+
rpc :RespondActivityTaskCompletedById, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCompletedByIdRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCompletedByIdResponse
|
130
|
+
# RespondActivityTaskFailed is called by application worker when it is done processing an ActivityTask. It will
|
131
|
+
# result in a new 'ActivityTaskFailed' event being written to the workflow history and a new WorkflowTask
|
132
|
+
# created for the workflow instance so new commands could be made. Use the 'taskToken' provided as response of
|
133
|
+
# PollActivityTaskQueue API call for completion. It fails with 'NotFoundFailure' if the taskToken is not valid
|
134
|
+
# anymore due to activity timeout.
|
135
|
+
rpc :RespondActivityTaskFailed, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskFailedRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskFailedResponse
|
136
|
+
# (-- api-linter: core::0136::prepositions=disabled
|
137
|
+
# aip.dev/not-precedent: "By" is used to indicate request type. --)
|
138
|
+
# RespondActivityTaskFailedById is called by application worker when it is done processing an ActivityTask.
|
139
|
+
# It will result in a new 'ActivityTaskFailed' event being written to the workflow history and a new WorkflowTask
|
140
|
+
# created for the workflow instance so new commands could be made. Similar to RespondActivityTaskFailed but use
|
141
|
+
# Namespace, WorkflowId and ActivityId instead of 'taskToken' for completion. It fails with 'NotFoundFailure'
|
142
|
+
# if the these Ids are not valid anymore due to activity timeout.
|
143
|
+
rpc :RespondActivityTaskFailedById, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskFailedByIdRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskFailedByIdResponse
|
144
|
+
# RespondActivityTaskCanceled is called by application worker when it is successfully canceled an ActivityTask. It will
|
145
|
+
# result in a new 'ActivityTaskCanceled' event being written to the workflow history and a new WorkflowTask
|
146
|
+
# created for the workflow instance so new commands could be made. Use the 'taskToken' provided as response of
|
147
|
+
# PollActivityTaskQueue API call for completion. It fails with 'NotFoundFailure' if the taskToken is not valid
|
148
|
+
# anymore due to activity timeout.
|
149
|
+
rpc :RespondActivityTaskCanceled, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCanceledRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCanceledResponse
|
150
|
+
# (-- api-linter: core::0136::prepositions=disabled
|
151
|
+
# aip.dev/not-precedent: "By" is used to indicate request type. --)
|
152
|
+
# RespondActivityTaskCanceledById is called by application worker when it is successfully canceled an ActivityTask.
|
153
|
+
# It will result in a new 'ActivityTaskCanceled' event being written to the workflow history and a new WorkflowTask
|
154
|
+
# created for the workflow instance so new commands could be made. Similar to RespondActivityTaskCanceled but use
|
155
|
+
# Namespace, WorkflowId and ActivityId instead of 'taskToken' for completion. It fails with 'NotFoundFailure'
|
156
|
+
# if the these Ids are not valid anymore due to activity timeout.
|
157
|
+
rpc :RespondActivityTaskCanceledById, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCanceledByIdRequest, ::Temporal::Api::WorkflowService::V1::RespondActivityTaskCanceledByIdResponse
|
158
|
+
# RequestCancelWorkflowExecution is called by application worker when it wants to request cancellation of a workflow instance.
|
159
|
+
# It will result in a new 'WorkflowExecutionCancelRequested' event being written to the workflow history and a new WorkflowTask
|
160
|
+
# created for the workflow instance so new commands could be made. It fails with 'NotFoundFailure' if the workflow is not valid
|
161
|
+
# anymore due to completion or doesn't exist.
|
162
|
+
rpc :RequestCancelWorkflowExecution, ::Temporal::Api::WorkflowService::V1::RequestCancelWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::RequestCancelWorkflowExecutionResponse
|
163
|
+
# SignalWorkflowExecution is used to send a signal event to running workflow execution. This results in
|
164
|
+
# WorkflowExecutionSignaled event recorded in the history and a workflow task being created for the execution.
|
165
|
+
rpc :SignalWorkflowExecution, ::Temporal::Api::WorkflowService::V1::SignalWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::SignalWorkflowExecutionResponse
|
166
|
+
# (-- api-linter: core::0136::prepositions=disabled
|
167
|
+
# aip.dev/not-precedent: "With" is used to indicate combined operation. --)
|
168
|
+
# SignalWithStartWorkflowExecution is used to ensure sending signal to a workflow.
|
169
|
+
# If the workflow is running, this results in WorkflowExecutionSignaled event being recorded in the history
|
170
|
+
# and a workflow task being created for the execution.
|
171
|
+
# If the workflow is not running or not found, this results in WorkflowExecutionStarted and WorkflowExecutionSignaled
|
172
|
+
# events being recorded in history, and a workflow task being created for the execution
|
173
|
+
rpc :SignalWithStartWorkflowExecution, ::Temporal::Api::WorkflowService::V1::SignalWithStartWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::SignalWithStartWorkflowExecutionResponse
|
174
|
+
# ResetWorkflowExecution reset an existing workflow execution to WorkflowTaskCompleted event(exclusive).
|
175
|
+
# And it will immediately terminating the current execution instance.
|
176
|
+
rpc :ResetWorkflowExecution, ::Temporal::Api::WorkflowService::V1::ResetWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::ResetWorkflowExecutionResponse
|
177
|
+
# TerminateWorkflowExecution terminates an existing workflow execution by recording WorkflowExecutionTerminated event
|
178
|
+
# in the history and immediately terminating the execution instance.
|
179
|
+
rpc :TerminateWorkflowExecution, ::Temporal::Api::WorkflowService::V1::TerminateWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::TerminateWorkflowExecutionResponse
|
180
|
+
# ListOpenWorkflowExecutions is a visibility API to list the open executions in a specific namespace.
|
181
|
+
rpc :ListOpenWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::ListOpenWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::ListOpenWorkflowExecutionsResponse
|
182
|
+
# ListClosedWorkflowExecutions is a visibility API to list the closed executions in a specific namespace.
|
183
|
+
rpc :ListClosedWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::ListClosedWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::ListClosedWorkflowExecutionsResponse
|
184
|
+
# ListWorkflowExecutions is a visibility API to list workflow executions in a specific namespace.
|
185
|
+
rpc :ListWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::ListWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::ListWorkflowExecutionsResponse
|
186
|
+
# ListArchivedWorkflowExecutions is a visibility API to list archived workflow executions in a specific namespace.
|
187
|
+
rpc :ListArchivedWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::ListArchivedWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::ListArchivedWorkflowExecutionsResponse
|
188
|
+
# ScanWorkflowExecutions is a visibility API to list large amount of workflow executions in a specific namespace without order.
|
189
|
+
rpc :ScanWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::ScanWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::ScanWorkflowExecutionsResponse
|
190
|
+
# CountWorkflowExecutions is a visibility API to count of workflow executions in a specific namespace.
|
191
|
+
rpc :CountWorkflowExecutions, ::Temporal::Api::WorkflowService::V1::CountWorkflowExecutionsRequest, ::Temporal::Api::WorkflowService::V1::CountWorkflowExecutionsResponse
|
192
|
+
# GetSearchAttributes is a visibility API to get all legal keys that could be used in list APIs
|
193
|
+
rpc :GetSearchAttributes, ::Temporal::Api::WorkflowService::V1::GetSearchAttributesRequest, ::Temporal::Api::WorkflowService::V1::GetSearchAttributesResponse
|
194
|
+
# RespondQueryTaskCompleted is called by application worker to complete a QueryTask (which is a WorkflowTask for query)
|
195
|
+
# as a result of 'PollWorkflowTaskQueue' API call. Completing a QueryTask will unblock the client call to 'QueryWorkflow'
|
196
|
+
# API and return the query result to client as a response to 'QueryWorkflow' API call.
|
197
|
+
rpc :RespondQueryTaskCompleted, ::Temporal::Api::WorkflowService::V1::RespondQueryTaskCompletedRequest, ::Temporal::Api::WorkflowService::V1::RespondQueryTaskCompletedResponse
|
198
|
+
# ResetStickyTaskQueue resets the sticky task queue related information in mutable state of a given workflow.
|
199
|
+
# Things cleared are:
|
200
|
+
# 1. StickyTaskQueue
|
201
|
+
# 2. StickyScheduleToStartTimeout
|
202
|
+
# 3. ClientLibraryVersion
|
203
|
+
# 4. ClientFeatureVersion
|
204
|
+
# 5. ClientImpl
|
205
|
+
rpc :ResetStickyTaskQueue, ::Temporal::Api::WorkflowService::V1::ResetStickyTaskQueueRequest, ::Temporal::Api::WorkflowService::V1::ResetStickyTaskQueueResponse
|
206
|
+
# QueryWorkflow returns query result for a specified workflow execution
|
207
|
+
rpc :QueryWorkflow, ::Temporal::Api::WorkflowService::V1::QueryWorkflowRequest, ::Temporal::Api::WorkflowService::V1::QueryWorkflowResponse
|
208
|
+
# DescribeWorkflowExecution returns information about the specified workflow execution.
|
209
|
+
rpc :DescribeWorkflowExecution, ::Temporal::Api::WorkflowService::V1::DescribeWorkflowExecutionRequest, ::Temporal::Api::WorkflowService::V1::DescribeWorkflowExecutionResponse
|
210
|
+
# DescribeTaskQueue returns information about the target task queue, right now this API returns the
|
211
|
+
# pollers which polled this task queue in last few minutes.
|
212
|
+
rpc :DescribeTaskQueue, ::Temporal::Api::WorkflowService::V1::DescribeTaskQueueRequest, ::Temporal::Api::WorkflowService::V1::DescribeTaskQueueResponse
|
213
|
+
# GetClusterInfo returns information about temporal cluster
|
214
|
+
rpc :GetClusterInfo, ::Temporal::Api::WorkflowService::V1::GetClusterInfoRequest, ::Temporal::Api::WorkflowService::V1::GetClusterInfoResponse
|
215
|
+
rpc :ListTaskQueuePartitions, ::Temporal::Api::WorkflowService::V1::ListTaskQueuePartitionsRequest, ::Temporal::Api::WorkflowService::V1::ListTaskQueuePartitionsResponse
|
216
|
+
end
|
217
|
+
|
218
|
+
Stub = Service.rpc_stub_class
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
data/lib/temporal-ruby.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
require 'temporal'
|
data/lib/temporal.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
# Protoc wants all of its generated files on the LOAD_PATH
|
2
|
+
$LOAD_PATH << File.expand_path('./gen', __dir__)
|
3
|
+
|
4
|
+
require 'securerandom'
|
5
|
+
require 'temporal/configuration'
|
6
|
+
require 'temporal/execution_options'
|
7
|
+
require 'temporal/client'
|
8
|
+
require 'temporal/activity'
|
9
|
+
require 'temporal/activity/async_token'
|
10
|
+
require 'temporal/workflow'
|
11
|
+
require 'temporal/workflow/history'
|
12
|
+
require 'temporal/workflow/execution_info'
|
13
|
+
require 'temporal/metrics'
|
14
|
+
|
15
|
+
module Temporal
|
16
|
+
class << self
|
17
|
+
def start_workflow(workflow, *input, **args)
|
18
|
+
options = args.delete(:options) || {}
|
19
|
+
input << args unless args.empty?
|
20
|
+
|
21
|
+
execution_options = ExecutionOptions.new(workflow, options)
|
22
|
+
workflow_id = options[:workflow_id] || SecureRandom.uuid
|
23
|
+
|
24
|
+
response = client.start_workflow_execution(
|
25
|
+
namespace: execution_options.namespace,
|
26
|
+
workflow_id: workflow_id,
|
27
|
+
workflow_name: execution_options.name,
|
28
|
+
task_queue: execution_options.task_queue,
|
29
|
+
input: input,
|
30
|
+
execution_timeout: execution_options.timeouts[:execution],
|
31
|
+
task_timeout: execution_options.timeouts[:task],
|
32
|
+
workflow_id_reuse_policy: options[:workflow_id_reuse_policy],
|
33
|
+
headers: execution_options.headers
|
34
|
+
)
|
35
|
+
|
36
|
+
response.run_id
|
37
|
+
end
|
38
|
+
|
39
|
+
def register_namespace(name, description = nil)
|
40
|
+
client.register_namespace(name: name, description: description)
|
41
|
+
end
|
42
|
+
|
43
|
+
def signal_workflow(workflow, signal, workflow_id, run_id, input = nil)
|
44
|
+
execution_options = ExecutionOptions.new(workflow)
|
45
|
+
|
46
|
+
client.signal_workflow_execution(
|
47
|
+
namespace: execution_options.namespace, # TODO: allow passing namespace instead
|
48
|
+
workflow_id: workflow_id,
|
49
|
+
run_id: run_id,
|
50
|
+
signal: signal,
|
51
|
+
input: input
|
52
|
+
)
|
53
|
+
end
|
54
|
+
|
55
|
+
def reset_workflow(namespace, workflow_id, run_id, workflow_task_id: nil, reason: 'manual reset')
|
56
|
+
workflow_task_id ||= get_last_completed_workflow_task_id(namespace, workflow_id, run_id)
|
57
|
+
raise Error, 'Could not find a completed workflow task event' unless workflow_task_id
|
58
|
+
|
59
|
+
response = client.reset_workflow_execution(
|
60
|
+
namespace: namespace,
|
61
|
+
workflow_id: workflow_id,
|
62
|
+
run_id: run_id,
|
63
|
+
reason: reason,
|
64
|
+
workflow_task_event_id: workflow_task_id
|
65
|
+
)
|
66
|
+
|
67
|
+
response.run_id
|
68
|
+
end
|
69
|
+
|
70
|
+
def fetch_workflow_execution_info(namespace, workflow_id, run_id)
|
71
|
+
response = client.describe_workflow_execution(
|
72
|
+
namespace: namespace,
|
73
|
+
workflow_id: workflow_id,
|
74
|
+
run_id: run_id
|
75
|
+
)
|
76
|
+
|
77
|
+
Workflow::ExecutionInfo.generate_from(response.workflow_execution_info)
|
78
|
+
end
|
79
|
+
|
80
|
+
def complete_activity(async_token, result = nil)
|
81
|
+
details = Activity::AsyncToken.decode(async_token)
|
82
|
+
|
83
|
+
client.respond_activity_task_completed_by_id(
|
84
|
+
namespace: details.namespace,
|
85
|
+
activity_id: details.activity_id,
|
86
|
+
workflow_id: details.workflow_id,
|
87
|
+
run_id: details.run_id,
|
88
|
+
result: result
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
def fail_activity(async_token, exception)
|
93
|
+
details = Activity::AsyncToken.decode(async_token)
|
94
|
+
|
95
|
+
client.respond_activity_task_failed_by_id(
|
96
|
+
namespace: details.namespace,
|
97
|
+
activity_id: details.activity_id,
|
98
|
+
workflow_id: details.workflow_id,
|
99
|
+
run_id: details.run_id,
|
100
|
+
exception: exception
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
def configure(&block)
|
105
|
+
yield configuration
|
106
|
+
end
|
107
|
+
|
108
|
+
def configuration
|
109
|
+
@configuration ||= Configuration.new
|
110
|
+
end
|
111
|
+
|
112
|
+
def logger
|
113
|
+
configuration.logger
|
114
|
+
end
|
115
|
+
|
116
|
+
def metrics
|
117
|
+
@metrics ||= Metrics.new(configuration.metrics_adapter)
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def client
|
123
|
+
@client ||= Temporal::Client.generate
|
124
|
+
end
|
125
|
+
|
126
|
+
def get_last_completed_workflow_task_id(namespace, workflow_id, run_id)
|
127
|
+
history_response = client.get_workflow_execution_history(
|
128
|
+
namespace: namespace,
|
129
|
+
workflow_id: workflow_id,
|
130
|
+
run_id: run_id
|
131
|
+
)
|
132
|
+
history = Workflow::History.new(history_response.history.events)
|
133
|
+
workflow_task_event = history.get_last_completed_workflow_task
|
134
|
+
workflow_task_event&.id
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'temporal/activity/workflow_convenience_methods'
|
2
|
+
require 'temporal/concerns/executable'
|
3
|
+
require 'temporal/errors'
|
4
|
+
|
5
|
+
module Temporal
|
6
|
+
class Activity
|
7
|
+
extend WorkflowConvenienceMethods
|
8
|
+
extend Concerns::Executable
|
9
|
+
|
10
|
+
def self.execute_in_context(context, input)
|
11
|
+
activity = new(context)
|
12
|
+
activity.execute(*input)
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize(context)
|
16
|
+
@context = context
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute(*_args)
|
20
|
+
raise NotImplementedError, '#execute method must be implemented by a subclass'
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def activity
|
26
|
+
@context
|
27
|
+
end
|
28
|
+
|
29
|
+
def logger
|
30
|
+
activity.logger
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'base64'
|
2
|
+
|
3
|
+
module Temporal
|
4
|
+
class Activity
|
5
|
+
class AsyncToken
|
6
|
+
SEPARATOR = '|'.freeze
|
7
|
+
|
8
|
+
attr_reader :namespace, :activity_id, :workflow_id, :run_id
|
9
|
+
|
10
|
+
def self.encode(namespace, activity_id, workflow_id, run_id)
|
11
|
+
new(namespace, activity_id, workflow_id, run_id).to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.decode(token)
|
15
|
+
string = Base64.urlsafe_decode64(token)
|
16
|
+
namespace, activity_id, workflow_id, run_id = string.split(SEPARATOR)
|
17
|
+
|
18
|
+
new(namespace, activity_id, workflow_id, run_id)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(namespace, activity_id, workflow_id, run_id)
|
22
|
+
@namespace = namespace
|
23
|
+
@activity_id = activity_id
|
24
|
+
@workflow_id = workflow_id
|
25
|
+
@run_id = run_id
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
parts = [namespace, activity_id, workflow_id, run_id]
|
30
|
+
Base64.urlsafe_encode64(parts.join(SEPARATOR)).freeze
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|