temporalio 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (232) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +175 -4
  3. data/bridge/Cargo.lock +44 -21
  4. data/bridge/Cargo.toml +1 -0
  5. data/bridge/sdk-core/Cargo.toml +1 -1
  6. data/bridge/sdk-core/README.md +1 -4
  7. data/bridge/sdk-core/client/Cargo.toml +1 -1
  8. data/bridge/sdk-core/client/src/lib.rs +12 -20
  9. data/bridge/sdk-core/client/src/raw.rs +9 -8
  10. data/bridge/sdk-core/client/src/retry.rs +100 -23
  11. data/bridge/sdk-core/core/Cargo.toml +7 -7
  12. data/bridge/sdk-core/core/benches/workflow_replay.rs +13 -10
  13. data/bridge/sdk-core/core/src/abstractions.rs +22 -22
  14. data/bridge/sdk-core/core/src/core_tests/activity_tasks.rs +146 -43
  15. data/bridge/sdk-core/core/src/core_tests/local_activities.rs +419 -9
  16. data/bridge/sdk-core/core/src/core_tests/queries.rs +247 -89
  17. data/bridge/sdk-core/core/src/core_tests/workers.rs +2 -2
  18. data/bridge/sdk-core/core/src/core_tests/workflow_cancels.rs +1 -1
  19. data/bridge/sdk-core/core/src/core_tests/workflow_tasks.rs +47 -27
  20. data/bridge/sdk-core/core/src/lib.rs +139 -32
  21. data/bridge/sdk-core/core/src/protosext/mod.rs +1 -1
  22. data/bridge/sdk-core/core/src/replay/mod.rs +185 -41
  23. data/bridge/sdk-core/core/src/telemetry/log_export.rs +190 -0
  24. data/bridge/sdk-core/core/src/telemetry/metrics.rs +184 -139
  25. data/bridge/sdk-core/core/src/telemetry/mod.rs +310 -315
  26. data/bridge/sdk-core/core/src/telemetry/prometheus_server.rs +4 -3
  27. data/bridge/sdk-core/core/src/test_help/mod.rs +23 -9
  28. data/bridge/sdk-core/core/src/worker/activities/local_activities.rs +12 -6
  29. data/bridge/sdk-core/core/src/worker/activities.rs +40 -23
  30. data/bridge/sdk-core/core/src/worker/client/mocks.rs +1 -1
  31. data/bridge/sdk-core/core/src/worker/client.rs +30 -4
  32. data/bridge/sdk-core/core/src/worker/mod.rs +23 -19
  33. data/bridge/sdk-core/core/src/worker/workflow/driven_workflow.rs +10 -19
  34. data/bridge/sdk-core/core/src/worker/workflow/history_update.rs +99 -25
  35. data/bridge/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -5
  36. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -5
  37. data/bridge/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +1 -5
  38. data/bridge/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +3 -5
  39. data/bridge/sdk-core/core/src/worker/workflow/machines/complete_workflow_state_machine.rs +1 -5
  40. data/bridge/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +2 -6
  41. data/bridge/sdk-core/core/src/worker/workflow/machines/fail_workflow_state_machine.rs +1 -5
  42. data/bridge/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +24 -22
  43. data/bridge/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -38
  44. data/bridge/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +178 -0
  45. data/bridge/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +1 -5
  46. data/bridge/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -5
  47. data/bridge/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -5
  48. data/bridge/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +8 -2
  49. data/bridge/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +1 -5
  50. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines/local_acts.rs +1 -1
  51. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +233 -217
  52. data/bridge/sdk-core/core/src/worker/workflow/machines/workflow_task_state_machine.rs +1 -6
  53. data/bridge/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +4 -4
  54. data/bridge/sdk-core/core/src/worker/workflow/managed_run.rs +13 -5
  55. data/bridge/sdk-core/core/src/worker/workflow/mod.rs +86 -29
  56. data/bridge/sdk-core/core/src/worker/workflow/wft_poller.rs +2 -2
  57. data/bridge/sdk-core/core/src/worker/workflow/workflow_stream.rs +56 -11
  58. data/bridge/sdk-core/core-api/Cargo.toml +4 -3
  59. data/bridge/sdk-core/core-api/src/lib.rs +1 -43
  60. data/bridge/sdk-core/core-api/src/telemetry.rs +147 -0
  61. data/bridge/sdk-core/core-api/src/worker.rs +13 -0
  62. data/bridge/sdk-core/etc/deps.svg +115 -140
  63. data/bridge/sdk-core/etc/regen-depgraph.sh +5 -0
  64. data/bridge/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +1 -1
  65. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-23_history.bin +0 -0
  66. data/bridge/sdk-core/histories/evict_while_la_running_no_interference-85_history.bin +0 -0
  67. data/bridge/sdk-core/protos/api_upstream/buf.yaml +0 -3
  68. data/bridge/sdk-core/protos/api_upstream/build/go.mod +7 -0
  69. data/bridge/sdk-core/protos/api_upstream/build/go.sum +5 -0
  70. data/bridge/sdk-core/protos/api_upstream/{temporal/api/update/v1/message.proto → build/tools.go} +6 -23
  71. data/bridge/sdk-core/protos/api_upstream/go.mod +6 -0
  72. data/bridge/sdk-core/protos/api_upstream/temporal/api/batch/v1/message.proto +12 -9
  73. data/bridge/sdk-core/protos/api_upstream/temporal/api/command/v1/message.proto +20 -19
  74. data/bridge/sdk-core/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
  75. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/batch_operation.proto +3 -2
  76. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/command_type.proto +4 -4
  77. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/common.proto +3 -2
  78. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/event_type.proto +5 -3
  79. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +23 -2
  80. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/{cluster.proto → interaction_type.proto} +10 -11
  81. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/namespace.proto +2 -2
  82. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/query.proto +2 -2
  83. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/reset.proto +2 -2
  84. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/schedule.proto +2 -2
  85. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +2 -2
  86. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/update.proto +2 -13
  87. data/bridge/sdk-core/protos/api_upstream/temporal/api/enums/v1/workflow.proto +2 -2
  88. data/bridge/sdk-core/protos/api_upstream/temporal/api/errordetails/v1/message.proto +2 -2
  89. data/bridge/sdk-core/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  90. data/bridge/sdk-core/protos/api_upstream/temporal/api/filter/v1/message.proto +2 -2
  91. data/bridge/sdk-core/protos/api_upstream/temporal/api/history/v1/message.proto +26 -19
  92. data/bridge/sdk-core/protos/api_upstream/temporal/api/interaction/v1/message.proto +87 -0
  93. data/bridge/sdk-core/protos/api_upstream/temporal/api/namespace/v1/message.proto +2 -2
  94. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +21 -61
  95. data/bridge/sdk-core/protos/api_upstream/temporal/api/operatorservice/v1/service.proto +2 -21
  96. data/bridge/sdk-core/protos/api_upstream/temporal/api/query/v1/message.proto +2 -2
  97. data/bridge/sdk-core/protos/api_upstream/temporal/api/replication/v1/message.proto +2 -2
  98. data/bridge/sdk-core/protos/api_upstream/temporal/api/schedule/v1/message.proto +110 -31
  99. data/bridge/sdk-core/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +4 -4
  100. data/bridge/sdk-core/protos/api_upstream/temporal/api/version/v1/message.proto +2 -2
  101. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflow/v1/message.proto +3 -2
  102. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -16
  103. data/bridge/sdk-core/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +17 -3
  104. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
  105. data/bridge/sdk-core/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +8 -1
  106. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +2 -2
  107. data/bridge/sdk-core/protos/testsrv_upstream/temporal/api/testservice/v1/service.proto +2 -2
  108. data/bridge/sdk-core/sdk/Cargo.toml +2 -2
  109. data/bridge/sdk-core/sdk/src/interceptors.rs +36 -3
  110. data/bridge/sdk-core/sdk/src/lib.rs +7 -5
  111. data/bridge/sdk-core/sdk/src/workflow_context.rs +13 -2
  112. data/bridge/sdk-core/sdk/src/workflow_future.rs +3 -7
  113. data/bridge/sdk-core/sdk-core-protos/Cargo.toml +1 -1
  114. data/bridge/sdk-core/sdk-core-protos/build.rs +0 -1
  115. data/bridge/sdk-core/sdk-core-protos/src/history_builder.rs +65 -18
  116. data/bridge/sdk-core/sdk-core-protos/src/history_info.rs +22 -22
  117. data/bridge/sdk-core/sdk-core-protos/src/lib.rs +104 -44
  118. data/bridge/sdk-core/test-utils/Cargo.toml +2 -1
  119. data/bridge/sdk-core/test-utils/src/lib.rs +81 -29
  120. data/bridge/sdk-core/tests/integ_tests/heartbeat_tests.rs +5 -2
  121. data/bridge/sdk-core/tests/integ_tests/metrics_tests.rs +37 -0
  122. data/bridge/sdk-core/tests/integ_tests/polling_tests.rs +0 -13
  123. data/bridge/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +167 -13
  124. data/bridge/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +53 -0
  125. data/bridge/sdk-core/tests/integ_tests/workflow_tests/replay.rs +106 -20
  126. data/bridge/sdk-core/tests/integ_tests/workflow_tests.rs +18 -8
  127. data/bridge/sdk-core/tests/main.rs +6 -4
  128. data/bridge/src/connection.rs +81 -62
  129. data/bridge/src/lib.rs +92 -33
  130. data/bridge/src/runtime.rs +9 -2
  131. data/bridge/src/worker.rs +53 -2
  132. data/lib/bridge.so +0 -0
  133. data/lib/gen/temporal/api/batch/v1/message_pb.rb +8 -6
  134. data/lib/gen/temporal/api/command/v1/message_pb.rb +17 -9
  135. data/lib/gen/temporal/api/common/v1/message_pb.rb +1 -1
  136. data/lib/gen/temporal/api/enums/v1/batch_operation_pb.rb +2 -1
  137. data/lib/gen/temporal/api/enums/v1/command_type_pb.rb +3 -1
  138. data/lib/gen/temporal/api/enums/v1/common_pb.rb +2 -1
  139. data/lib/gen/temporal/api/enums/v1/event_type_pb.rb +3 -2
  140. data/lib/gen/temporal/api/enums/v1/failed_cause_pb.rb +7 -1
  141. data/lib/gen/temporal/api/enums/v1/interaction_type_pb.rb +25 -0
  142. data/lib/gen/temporal/api/enums/v1/namespace_pb.rb +1 -1
  143. data/lib/gen/temporal/api/enums/v1/query_pb.rb +1 -1
  144. data/lib/gen/temporal/api/enums/v1/reset_pb.rb +1 -1
  145. data/lib/gen/temporal/api/enums/v1/schedule_pb.rb +1 -1
  146. data/lib/gen/temporal/api/enums/v1/task_queue_pb.rb +1 -1
  147. data/lib/gen/temporal/api/enums/v1/update_pb.rb +1 -6
  148. data/lib/gen/temporal/api/enums/v1/workflow_pb.rb +1 -1
  149. data/lib/gen/temporal/api/errordetails/v1/message_pb.rb +1 -1
  150. data/lib/gen/temporal/api/failure/v1/message_pb.rb +1 -1
  151. data/lib/gen/temporal/api/filter/v1/message_pb.rb +1 -1
  152. data/lib/gen/temporal/api/history/v1/message_pb.rb +19 -18
  153. data/lib/gen/temporal/api/interaction/v1/message_pb.rb +49 -0
  154. data/lib/gen/temporal/api/namespace/v1/message_pb.rb +1 -1
  155. data/lib/gen/temporal/api/operatorservice/v1/request_response_pb.rb +11 -51
  156. data/lib/gen/temporal/api/operatorservice/v1/service_pb.rb +1 -1
  157. data/lib/gen/temporal/api/query/v1/message_pb.rb +1 -1
  158. data/lib/gen/temporal/api/replication/v1/message_pb.rb +1 -1
  159. data/lib/gen/temporal/api/schedule/v1/message_pb.rb +22 -1
  160. data/lib/gen/temporal/api/taskqueue/v1/message_pb.rb +2 -2
  161. data/lib/gen/temporal/api/version/v1/message_pb.rb +1 -1
  162. data/lib/gen/temporal/api/workflow/v1/message_pb.rb +2 -1
  163. data/lib/gen/temporal/api/workflowservice/v1/request_response_pb.rb +27 -10
  164. data/lib/gen/temporal/api/workflowservice/v1/service_pb.rb +1 -1
  165. data/lib/gen/temporal/sdk/core/workflow_activation/workflow_activation_pb.rb +1 -0
  166. data/lib/gen/temporal/sdk/core/workflow_commands/workflow_commands_pb.rb +5 -1
  167. data/lib/temporalio/activity/context.rb +97 -0
  168. data/lib/temporalio/activity/info.rb +67 -0
  169. data/lib/temporalio/activity.rb +85 -0
  170. data/lib/temporalio/bridge/error.rb +8 -0
  171. data/lib/temporalio/bridge.rb +14 -0
  172. data/lib/{temporal → temporalio}/client/implementation.rb +49 -48
  173. data/lib/{temporal → temporalio}/client/workflow_handle.rb +35 -35
  174. data/lib/{temporal → temporalio}/client.rb +19 -32
  175. data/lib/{temporal → temporalio}/connection.rb +238 -223
  176. data/lib/{temporal → temporalio}/data_converter.rb +76 -35
  177. data/lib/{temporal → temporalio}/error/failure.rb +6 -6
  178. data/lib/{temporal → temporalio}/error/workflow_failure.rb +4 -2
  179. data/lib/{temporal → temporalio}/errors.rb +19 -1
  180. data/lib/{temporal → temporalio}/failure_converter/base.rb +5 -5
  181. data/lib/{temporal → temporalio}/failure_converter/basic.rb +58 -52
  182. data/lib/temporalio/failure_converter.rb +7 -0
  183. data/lib/{temporal → temporalio}/interceptor/chain.rb +2 -1
  184. data/lib/{temporal → temporalio}/interceptor/client.rb +22 -1
  185. data/lib/{temporal → temporalio}/payload_codec/base.rb +5 -5
  186. data/lib/{temporal → temporalio}/payload_converter/base.rb +3 -3
  187. data/lib/{temporal → temporalio}/payload_converter/bytes.rb +4 -3
  188. data/lib/{temporal → temporalio}/payload_converter/composite.rb +7 -5
  189. data/lib/{temporal → temporalio}/payload_converter/encoding_base.rb +4 -4
  190. data/lib/{temporal → temporalio}/payload_converter/json.rb +4 -3
  191. data/lib/{temporal → temporalio}/payload_converter/nil.rb +4 -3
  192. data/lib/temporalio/payload_converter.rb +14 -0
  193. data/lib/{temporal → temporalio}/retry_policy.rb +4 -4
  194. data/lib/{temporal → temporalio}/retry_state.rb +1 -1
  195. data/lib/temporalio/runtime.rb +25 -0
  196. data/lib/{temporal → temporalio}/timeout_type.rb +2 -2
  197. data/lib/temporalio/version.rb +3 -0
  198. data/lib/temporalio/worker/activity_runner.rb +92 -0
  199. data/lib/temporalio/worker/activity_worker.rb +138 -0
  200. data/lib/temporalio/worker/reactor.rb +46 -0
  201. data/lib/temporalio/worker/runner.rb +63 -0
  202. data/lib/temporalio/worker/sync_worker.rb +88 -0
  203. data/lib/temporalio/worker/thread_pool_executor.rb +51 -0
  204. data/lib/temporalio/worker.rb +198 -0
  205. data/lib/{temporal → temporalio}/workflow/execution_info.rb +4 -4
  206. data/lib/{temporal → temporalio}/workflow/execution_status.rb +1 -1
  207. data/lib/{temporal → temporalio}/workflow/id_reuse_policy.rb +6 -6
  208. data/lib/{temporal → temporalio}/workflow/query_reject_condition.rb +5 -5
  209. data/lib/temporalio.rb +12 -3
  210. data/temporalio.gemspec +7 -3
  211. metadata +79 -56
  212. data/bridge/sdk-core/bridge-ffi/Cargo.toml +0 -24
  213. data/bridge/sdk-core/bridge-ffi/LICENSE.txt +0 -23
  214. data/bridge/sdk-core/bridge-ffi/build.rs +0 -25
  215. data/bridge/sdk-core/bridge-ffi/include/sdk-core-bridge.h +0 -249
  216. data/bridge/sdk-core/bridge-ffi/src/lib.rs +0 -825
  217. data/bridge/sdk-core/bridge-ffi/src/wrappers.rs +0 -211
  218. data/bridge/sdk-core/core/src/log_export.rs +0 -62
  219. data/bridge/sdk-core/core/src/worker/workflow/machines/mutable_side_effect_state_machine.rs +0 -127
  220. data/bridge/sdk-core/core/src/worker/workflow/machines/side_effect_state_machine.rs +0 -71
  221. data/bridge/sdk-core/protos/api_upstream/temporal/api/cluster/v1/message.proto +0 -83
  222. data/bridge/sdk-core/protos/local/temporal/sdk/core/bridge/bridge.proto +0 -210
  223. data/bridge/sdk-core/sdk/src/conversions.rs +0 -8
  224. data/lib/gen/temporal/api/cluster/v1/message_pb.rb +0 -67
  225. data/lib/gen/temporal/api/enums/v1/cluster_pb.rb +0 -26
  226. data/lib/gen/temporal/api/update/v1/message_pb.rb +0 -26
  227. data/lib/temporal/bridge.rb +0 -14
  228. data/lib/temporal/failure_converter.rb +0 -8
  229. data/lib/temporal/payload_converter.rb +0 -14
  230. data/lib/temporal/runtime.rb +0 -22
  231. data/lib/temporal/version.rb +0 -3
  232. data/lib/temporal.rb +0 -8
@@ -8,7 +8,9 @@ use temporal_client::{
8
8
  ConfiguredClient, TemporalServiceClientWithMetrics
9
9
  };
10
10
  use thiserror::Error;
11
+ use tokio::{select};
11
12
  use tokio::runtime::{Runtime};
13
+ use tokio_util::sync::CancellationToken;
12
14
  use tonic::metadata::{MetadataKey,MetadataValue};
13
15
  use url::Url;
14
16
 
@@ -42,13 +44,18 @@ pub enum ConnectionError {
42
44
 
43
45
  #[error(transparent)]
44
46
  RequestError(#[from] tonic::Status),
47
+
48
+ #[error("RPC call was cancelled")]
49
+ RequestCancelled,
45
50
  }
46
51
 
52
+ pub type RpcResult = Result<Vec<u8>, ConnectionError>;
53
+
47
54
  fn rpc_req<P: prost::Message + Default>(params: RpcParams) -> Result<tonic::Request<P>, ConnectionError> {
48
55
  let proto = P::decode(&*params.request)?;
49
56
  let mut req = tonic::Request::new(proto);
50
57
 
51
- for (k, v) in params.metadata {
58
+ for (k, v) in &params.metadata {
52
59
  req.metadata_mut().insert(
53
60
  MetadataKey::from_str(k.as_str())?,
54
61
  MetadataValue::try_from(v.as_str())?
@@ -62,16 +69,77 @@ fn rpc_req<P: prost::Message + Default>(params: RpcParams) -> Result<tonic::Requ
62
69
  Ok(req)
63
70
  }
64
71
 
65
- fn rpc_resp<P: prost::Message + Default>(res: Result<tonic::Response<P>, tonic::Status>) -> Result<Vec<u8>, ConnectionError> {
72
+ fn rpc_resp<P: prost::Message + Default>(res: Result<tonic::Response<P>, tonic::Status>) -> RpcResult {
66
73
  Ok(res?.get_ref().encode_to_vec())
67
74
  }
68
75
 
69
76
  macro_rules! rpc_call {
70
- ($client:expr, $runtime:expr, $rpc:ident, $params:expr) => {
71
- rpc_resp($runtime.block_on($client.$rpc(rpc_req($params)?)))
77
+ ($client:expr, $rpc:ident, $params:expr) => {
78
+ rpc_resp($client.$rpc(rpc_req($params)?).await)
72
79
  };
73
80
  }
74
81
 
82
+ async fn make_rpc_call(mut client: Client, params: RpcParams) -> RpcResult {
83
+ match params.rpc.as_str() {
84
+ "register_namespace" => rpc_call!(client, register_namespace, params),
85
+ "describe_namespace" => rpc_call!(client, describe_namespace, params),
86
+ "list_namespaces" => rpc_call!(client, list_namespaces, params),
87
+ "update_namespace" => rpc_call!(client, update_namespace, params),
88
+ "deprecate_namespace" => rpc_call!(client, deprecate_namespace, params),
89
+ "start_workflow_execution" => rpc_call!(client, start_workflow_execution, params),
90
+ "get_workflow_execution_history" => rpc_call!(client, get_workflow_execution_history, params),
91
+ // "get_workflow_execution_history_reverse" => rpc_call!(client, get_workflow_execution_history_reverse, params),
92
+ "poll_workflow_task_queue" => rpc_call!(client, poll_workflow_task_queue, params),
93
+ "respond_workflow_task_completed" => rpc_call!(client, respond_workflow_task_completed, params),
94
+ "respond_workflow_task_failed" => rpc_call!(client, respond_workflow_task_failed, params),
95
+ "poll_activity_task_queue" => rpc_call!(client, poll_activity_task_queue, params),
96
+ "record_activity_task_heartbeat" => rpc_call!(client, record_activity_task_heartbeat, params),
97
+ "record_activity_task_heartbeat_by_id" => rpc_call!(client, record_activity_task_heartbeat_by_id, params),
98
+ "respond_activity_task_completed" => rpc_call!(client, respond_activity_task_completed, params),
99
+ "respond_activity_task_completed_by_id" => rpc_call!(client, respond_activity_task_completed_by_id, params),
100
+ "respond_activity_task_failed" => rpc_call!(client, respond_activity_task_failed, params),
101
+ "respond_activity_task_failed_by_id" => rpc_call!(client, respond_activity_task_failed_by_id, params),
102
+ "respond_activity_task_canceled" => rpc_call!(client, respond_activity_task_canceled, params),
103
+ "respond_activity_task_canceled_by_id" => rpc_call!(client, respond_activity_task_canceled_by_id, params),
104
+ "request_cancel_workflow_execution" => rpc_call!(client, request_cancel_workflow_execution, params),
105
+ "signal_workflow_execution" => rpc_call!(client, signal_workflow_execution, params),
106
+ "signal_with_start_workflow_execution" => rpc_call!(client, signal_with_start_workflow_execution, params),
107
+ "reset_workflow_execution" => rpc_call!(client, reset_workflow_execution, params),
108
+ "terminate_workflow_execution" => rpc_call!(client, terminate_workflow_execution, params),
109
+ "delete_workflow_execution" => rpc_call!(client, delete_workflow_execution, params),
110
+ "list_open_workflow_executions" => rpc_call!(client, list_open_workflow_executions, params),
111
+ "list_closed_workflow_executions" => rpc_call!(client, list_closed_workflow_executions, params),
112
+ "list_workflow_executions" => rpc_call!(client, list_workflow_executions, params),
113
+ "list_archived_workflow_executions" => rpc_call!(client, list_archived_workflow_executions, params),
114
+ "scan_workflow_executions" => rpc_call!(client, scan_workflow_executions, params),
115
+ "count_workflow_executions" => rpc_call!(client, count_workflow_executions, params),
116
+ "get_search_attributes" => rpc_call!(client, get_search_attributes, params),
117
+ "respond_query_task_completed" => rpc_call!(client, respond_query_task_completed, params),
118
+ "reset_sticky_task_queue" => rpc_call!(client, reset_sticky_task_queue, params),
119
+ "query_workflow" => rpc_call!(client, query_workflow, params),
120
+ "describe_workflow_execution" => rpc_call!(client, describe_workflow_execution, params),
121
+ "describe_task_queue" => rpc_call!(client, describe_task_queue, params),
122
+ "get_cluster_info" => rpc_call!(client, get_cluster_info, params),
123
+ "get_system_info" => rpc_call!(client, get_system_info, params),
124
+ "list_task_queue_partitions" => rpc_call!(client, list_task_queue_partitions, params),
125
+ "create_schedule" => rpc_call!(client, create_schedule, params),
126
+ "describe_schedule" => rpc_call!(client, describe_schedule, params),
127
+ "update_schedule" => rpc_call!(client, update_schedule, params),
128
+ "patch_schedule" => rpc_call!(client, patch_schedule, params),
129
+ "list_schedule_matching_times" => rpc_call!(client, list_schedule_matching_times, params),
130
+ "delete_schedule" => rpc_call!(client, delete_schedule, params),
131
+ "list_schedules" => rpc_call!(client, list_schedules, params),
132
+ "update_worker_build_id_ordering" => rpc_call!(client, update_worker_build_id_ordering, params),
133
+ "get_worker_build_id_ordering" => rpc_call!(client, get_worker_build_id_ordering, params),
134
+ "update_workflow" => rpc_call!(client, update_workflow, params),
135
+ "start_batch_operation" => rpc_call!(client, start_batch_operation, params),
136
+ "stop_batch_operation" => rpc_call!(client, stop_batch_operation, params),
137
+ "describe_batch_operation" => rpc_call!(client, describe_batch_operation, params),
138
+ "list_batch_operations" => rpc_call!(client, list_batch_operations, params),
139
+ _ => Err(ConnectionError::InvalidRpc(params.rpc.to_string()))
140
+ }
141
+ }
142
+
75
143
  // A Connection is a Client wrapper for making RPC calls
76
144
  pub struct Connection {
77
145
  pub client: Client,
@@ -105,63 +173,14 @@ impl Connection {
105
173
  Ok(Connection { client, runtime })
106
174
  }
107
175
 
108
- pub fn call(&mut self, params: RpcParams) -> Result<Vec<u8>, ConnectionError> {
109
- match params.rpc.as_str() {
110
- "register_namespace" => rpc_call!(self.client, self.runtime, register_namespace, params),
111
- "describe_namespace" => rpc_call!(self.client, self.runtime, describe_namespace, params),
112
- "list_namespaces" => rpc_call!(self.client, self.runtime, list_namespaces, params),
113
- "update_namespace" => rpc_call!(self.client, self.runtime, update_namespace, params),
114
- "deprecate_namespace" => rpc_call!(self.client, self.runtime, deprecate_namespace, params),
115
- "start_workflow_execution" => rpc_call!(self.client, self.runtime, start_workflow_execution, params),
116
- "get_workflow_execution_history" => rpc_call!(self.client, self.runtime, get_workflow_execution_history, params),
117
- // "get_workflow_execution_history_reverse" => rpc_call!(self.client, self.runtime, get_workflow_execution_history_reverse, params),
118
- "poll_workflow_task_queue" => rpc_call!(self.client, self.runtime, poll_workflow_task_queue, params),
119
- "respond_workflow_task_completed" => rpc_call!(self.client, self.runtime, respond_workflow_task_completed, params),
120
- "respond_workflow_task_failed" => rpc_call!(self.client, self.runtime, respond_workflow_task_failed, params),
121
- "poll_activity_task_queue" => rpc_call!(self.client, self.runtime, poll_activity_task_queue, params),
122
- "record_activity_task_heartbeat" => rpc_call!(self.client, self.runtime, record_activity_task_heartbeat, params),
123
- "record_activity_task_heartbeat_by_id" => rpc_call!(self.client, self.runtime, record_activity_task_heartbeat_by_id, params),
124
- "respond_activity_task_completed" => rpc_call!(self.client, self.runtime, respond_activity_task_completed, params),
125
- "respond_activity_task_completed_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_completed_by_id, params),
126
- "respond_activity_task_failed" => rpc_call!(self.client, self.runtime, respond_activity_task_failed, params),
127
- "respond_activity_task_failed_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_failed_by_id, params),
128
- "respond_activity_task_canceled" => rpc_call!(self.client, self.runtime, respond_activity_task_canceled, params),
129
- "respond_activity_task_canceled_by_id" => rpc_call!(self.client, self.runtime, respond_activity_task_canceled_by_id, params),
130
- "request_cancel_workflow_execution" => rpc_call!(self.client, self.runtime, request_cancel_workflow_execution, params),
131
- "signal_workflow_execution" => rpc_call!(self.client, self.runtime, signal_workflow_execution, params),
132
- "signal_with_start_workflow_execution" => rpc_call!(self.client, self.runtime, signal_with_start_workflow_execution, params),
133
- "reset_workflow_execution" => rpc_call!(self.client, self.runtime, reset_workflow_execution, params),
134
- "terminate_workflow_execution" => rpc_call!(self.client, self.runtime, terminate_workflow_execution, params),
135
- "list_open_workflow_executions" => rpc_call!(self.client, self.runtime, list_open_workflow_executions, params),
136
- "list_closed_workflow_executions" => rpc_call!(self.client, self.runtime, list_closed_workflow_executions, params),
137
- "list_workflow_executions" => rpc_call!(self.client, self.runtime, list_workflow_executions, params),
138
- "list_archived_workflow_executions" => rpc_call!(self.client, self.runtime, list_archived_workflow_executions, params),
139
- "scan_workflow_executions" => rpc_call!(self.client, self.runtime, scan_workflow_executions, params),
140
- "count_workflow_executions" => rpc_call!(self.client, self.runtime, count_workflow_executions, params),
141
- "get_search_attributes" => rpc_call!(self.client, self.runtime, get_search_attributes, params),
142
- "respond_query_task_completed" => rpc_call!(self.client, self.runtime, respond_query_task_completed, params),
143
- "reset_sticky_task_queue" => rpc_call!(self.client, self.runtime, reset_sticky_task_queue, params),
144
- "query_workflow" => rpc_call!(self.client, self.runtime, query_workflow, params),
145
- "describe_workflow_execution" => rpc_call!(self.client, self.runtime, describe_workflow_execution, params),
146
- "describe_task_queue" => rpc_call!(self.client, self.runtime, describe_task_queue, params),
147
- "get_cluster_info" => rpc_call!(self.client, self.runtime, get_cluster_info, params),
148
- "get_system_info" => rpc_call!(self.client, self.runtime, get_system_info, params),
149
- "list_task_queue_partitions" => rpc_call!(self.client, self.runtime, list_task_queue_partitions, params),
150
- "create_schedule" => rpc_call!(self.client, self.runtime, create_schedule, params),
151
- "describe_schedule" => rpc_call!(self.client, self.runtime, describe_schedule, params),
152
- "update_schedule" => rpc_call!(self.client, self.runtime, update_schedule, params),
153
- "patch_schedule" => rpc_call!(self.client, self.runtime, patch_schedule, params),
154
- "list_schedule_matching_times" => rpc_call!(self.client, self.runtime, list_schedule_matching_times, params),
155
- "delete_schedule" => rpc_call!(self.client, self.runtime, delete_schedule, params),
156
- "list_schedules" => rpc_call!(self.client, self.runtime, list_schedules, params),
157
- "update_worker_build_id_ordering" => rpc_call!(self.client, self.runtime, update_worker_build_id_ordering, params),
158
- "get_worker_build_id_ordering" => rpc_call!(self.client, self.runtime, get_worker_build_id_ordering, params),
159
- "update_workflow" => rpc_call!(self.client, self.runtime, update_workflow, params),
160
- "start_batch_operation" => rpc_call!(self.client, self.runtime, start_batch_operation, params),
161
- "stop_batch_operation" => rpc_call!(self.client, self.runtime, stop_batch_operation, params),
162
- "describe_batch_operation" => rpc_call!(self.client, self.runtime, describe_batch_operation, params),
163
- "list_batch_operations" => rpc_call!(self.client, self.runtime, list_batch_operations, params),
164
- _ => Err(ConnectionError::InvalidRpc(params.rpc.to_string()))
165
- }
176
+ pub fn call(&self, params: RpcParams, cancel_token: CancellationToken) -> RpcResult {
177
+ let core_client = self.client.clone();
178
+
179
+ self.runtime.block_on(async move {
180
+ select! {
181
+ _ = cancel_token.cancelled() => Err(ConnectionError::RequestCancelled),
182
+ result = make_rpc_call(core_client, params) => result
183
+ }
184
+ })
166
185
  }
167
186
  }
data/bridge/src/lib.rs CHANGED
@@ -13,18 +13,34 @@ use rutie::{
13
13
  NilClass, Hash, Integer,
14
14
  };
15
15
  use std::collections::HashMap;
16
- use temporal_sdk_core::{Logger, TelemetryOptionsBuilder};
17
- use worker::{Worker, WorkerResult};
16
+ use temporal_sdk_core_api::telemetry::{Logger, TelemetryOptionsBuilder};
17
+ use tokio_util::sync::CancellationToken;
18
+ use worker::{Worker, WorkerError, WorkerResult};
18
19
 
19
20
  const RUNTIME_THREAD_COUNT: u8 = 2;
20
21
 
21
22
  fn raise_bridge_exception(message: &str) {
22
- VM::raise_ex(AnyException::new("Temporal::Bridge::Error", Some(message)));
23
+ VM::raise_ex(AnyException::new("Temporalio::Bridge::Error", Some(message)));
23
24
  }
24
25
 
25
- fn wrap_bytes(bytes: &[u8]) -> AnyObject {
26
+ fn wrap_worker_error(e: &WorkerError) -> AnyException {
27
+ let name = match e {
28
+ WorkerError::Shutdown() => "Temporalio::Bridge::Error::WorkerShutdown",
29
+ _ => "Temporalio::Bridge::Error"
30
+ };
31
+
32
+ AnyException::new(name, Some(&format!("[{:?}] {}", e, e)))
33
+ }
34
+
35
+ fn wrap_bytes(bytes: Vec<u8>) -> RString {
26
36
  let enc = Encoding::find("ASCII-8BIT").unwrap();
27
- RString::from_bytes(bytes, &enc).to_any_object()
37
+ RString::from_bytes(&bytes, &enc)
38
+ }
39
+
40
+ fn unwrap_bytes(string: RString) -> Vec<u8> {
41
+ // It is important to use the _unchecked conversion, otherwise Rutie
42
+ // will assume incorrect encoding and screw up the encoded proto
43
+ string.to_vec_u8_unchecked()
28
44
  }
29
45
 
30
46
  fn to_hash_map(hash: Hash) -> HashMap<String, String> {
@@ -40,6 +56,14 @@ fn to_hash_map(hash: Hash) -> HashMap<String, String> {
40
56
  result
41
57
  }
42
58
 
59
+ fn worker_result_to_proc_args(result: WorkerResult) -> [AnyObject; 2] {
60
+ let ruby_nil = NilClass::new().to_any_object();
61
+ match result {
62
+ Ok(bytes) => [wrap_bytes(bytes).to_any_object(), ruby_nil],
63
+ Err(e) => [ruby_nil, wrap_worker_error(&e).to_any_object()]
64
+ }
65
+ }
66
+
43
67
  wrappable_struct!(Connection, ConnectionWrapper, CONNECTION_WRAPPER);
44
68
  wrappable_struct!(Runtime, RuntimeWrapper, RUNTIME_WRAPPER);
45
69
  wrappable_struct!(Worker, WorkerWrapper, WORKER_WRAPPER);
@@ -61,7 +85,7 @@ methods!(
61
85
 
62
86
  let connection = result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
63
87
 
64
- Module::from_existing("Temporal")
88
+ Module::from_existing("Temporalio")
65
89
  .get_nested_module("Bridge")
66
90
  .get_nested_class("Connection")
67
91
  .wrap_data(connection, &*CONNECTION_WRAPPER)
@@ -69,11 +93,12 @@ methods!(
69
93
 
70
94
  fn call_rpc(rpc: Symbol, request: RString, metadata: Hash, timeout: Integer) -> RString {
71
95
  let rpc = rpc.map_err(VM::raise_ex).unwrap().to_string();
72
- let request = request.map_err(VM::raise_ex).unwrap().to_string().as_bytes().to_vec();
96
+ let request = unwrap_bytes(request.map_err(VM::raise_ex).unwrap());
73
97
  let metadata = to_hash_map(metadata.map_err(VM::raise_ex).unwrap());
74
98
  let timeout = timeout.map_or(None, |v| Some(v.to_u64()));
99
+ let token = CancellationToken::new();
75
100
 
76
- let result = Thread::call_without_gvl(move || {
101
+ let result = Thread::call_without_gvl(|| {
77
102
  let connection = _rtself.get_data_mut(&*CONNECTION_WRAPPER);
78
103
  let params = RpcParams {
79
104
  rpc: rpc.clone(),
@@ -81,34 +106,24 @@ methods!(
81
106
  metadata: metadata.clone(),
82
107
  timeout_millis: timeout
83
108
  };
84
- connection.call(params)
85
- }, Some(|| {}));
109
+ connection.call(params, token.clone())
110
+ }, Some(|| { token.cancel() }));
86
111
 
87
112
  let response = result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
88
113
 
89
- let enc = Encoding::find("ASCII-8BIT").unwrap();
90
- RString::from_bytes(&response, &enc)
114
+ wrap_bytes(response)
91
115
  }
92
116
 
93
- // TODO: Add telemetry configuration to this interface
94
- fn init_telemetry() -> NilClass {
95
- let telemetry_config = TelemetryOptionsBuilder::default()
96
- .tracing_filter("temporal_sdk_core=DEBUG".to_string())
97
- .logging(Logger::Console)
117
+ fn init_runtime() -> AnyObject {
118
+ let telemetry_options = TelemetryOptionsBuilder::default()
119
+ .logging(Logger::Console { filter: "temporal_sdk_core=DEBUG".to_string() })
98
120
  .build()
99
121
  .map_err(|e| raise_bridge_exception(&e.to_string()))
100
122
  .unwrap();
101
123
 
102
- temporal_sdk_core::telemetry_init(&telemetry_config)
103
- .expect("Unable to initialize telemetry");
124
+ let runtime = Runtime::new(RUNTIME_THREAD_COUNT, telemetry_options);
104
125
 
105
- NilClass::new()
106
- }
107
-
108
- fn init_runtime() -> AnyObject {
109
- let runtime = Runtime::new(RUNTIME_THREAD_COUNT);
110
-
111
- Module::from_existing("Temporal")
126
+ Module::from_existing("Temporalio")
112
127
  .get_nested_module("Bridge")
113
128
  .get_nested_class("Runtime")
114
129
  .wrap_data(runtime, &*RUNTIME_WRAPPER)
@@ -130,7 +145,7 @@ methods!(
130
145
  let connection = connection.get_data(&*CONNECTION_WRAPPER);
131
146
  let worker = Worker::new(runtime, &connection.client, &namespace, &task_queue);
132
147
 
133
- Module::from_existing("Temporal")
148
+ Module::from_existing("Temporalio")
134
149
  .get_nested_module("Bridge")
135
150
  .get_nested_class("Worker")
136
151
  .wrap_data(worker.unwrap(), &*WORKER_WRAPPER)
@@ -142,10 +157,8 @@ methods!(
142
157
  }
143
158
 
144
159
  let ruby_callback = VM::block_proc();
145
-
146
160
  let callback = move |result: WorkerResult| {
147
- let bytes = result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
148
- ruby_callback.call(&[wrap_bytes(&bytes)]);
161
+ ruby_callback.call(&worker_result_to_proc_args(result));
149
162
  };
150
163
 
151
164
  let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
@@ -155,13 +168,55 @@ methods!(
155
168
 
156
169
  NilClass::new()
157
170
  }
171
+
172
+ fn worker_complete_activity_task(proto: RString) -> NilClass {
173
+ if !VM::is_block_given() {
174
+ panic!("Called #worker_complete_activity_task without a block");
175
+ }
176
+
177
+ let bytes = unwrap_bytes(proto.map_err(VM::raise_ex).unwrap());
178
+ let ruby_callback = VM::block_proc();
179
+ let callback = move |result: WorkerResult| {
180
+ ruby_callback.call(&worker_result_to_proc_args(result));
181
+ };
182
+
183
+ let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
184
+ let result = worker.complete_activity_task(bytes, callback);
185
+
186
+ result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
187
+
188
+ NilClass::new()
189
+ }
190
+
191
+ fn worker_record_activity_heartbeat(proto: RString) -> NilClass {
192
+ let bytes = unwrap_bytes(proto.map_err(VM::raise_ex).unwrap());
193
+ let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
194
+
195
+ let result = worker.record_activity_heartbeat(bytes);
196
+
197
+ result.map_err(|e| raise_bridge_exception(&e.to_string())).unwrap();
198
+
199
+ NilClass::new()
200
+ }
201
+
202
+ fn worker_initiate_shutdown() -> NilClass {
203
+ let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
204
+ worker.initiate_shutdown();
205
+
206
+ NilClass::new()
207
+ }
208
+
209
+ fn worker_shutdown() -> NilClass {
210
+ let worker = _rtself.get_data_mut(&*WORKER_WRAPPER);
211
+ worker.shutdown();
212
+
213
+ NilClass::new()
214
+ }
158
215
  );
159
216
 
160
217
  #[no_mangle]
161
218
  pub extern "C" fn init_bridge() {
162
- Module::from_existing("Temporal").get_nested_module("Bridge").define(|module| {
163
- module.def_self("init_telemetry", init_telemetry);
164
-
219
+ Module::from_existing("Temporalio").get_nested_module("Bridge").define(|module| {
165
220
  module.define_nested_class("Runtime", None).define(|klass| {
166
221
  klass.def_self("init", init_runtime);
167
222
  klass.def("run_callback_loop", run_callback_loop);
@@ -175,6 +230,10 @@ pub extern "C" fn init_bridge() {
175
230
  module.define_nested_class("Worker", None).define(|klass| {
176
231
  klass.def_self("create", create_worker);
177
232
  klass.def("poll_activity_task", worker_poll_activity_task);
233
+ klass.def("complete_activity_task", worker_complete_activity_task);
234
+ klass.def("record_activity_heartbeat", worker_record_activity_heartbeat);
235
+ klass.def("initiate_shutdown", worker_initiate_shutdown);
236
+ klass.def("shutdown", worker_shutdown);
178
237
  });
179
238
  });
180
239
  }
@@ -1,6 +1,8 @@
1
1
  use rutie::Thread;
2
2
  use std::sync::Arc;
3
3
  use std::sync::mpsc::{channel, Sender, Receiver};
4
+ use temporal_sdk_core::CoreRuntime;
5
+ use temporal_sdk_core_api::telemetry::TelemetryOptions;
4
6
  use tokio::runtime::{Builder, Runtime as TokioRuntime};
5
7
 
6
8
  pub type Callback = Box<dyn FnOnce() + Send + 'static>;
@@ -11,13 +13,14 @@ pub enum Command {
11
13
  }
12
14
 
13
15
  pub struct Runtime {
16
+ pub core_runtime: Arc<CoreRuntime>,
14
17
  pub tokio_runtime: Arc<TokioRuntime>,
15
18
  pub callback_tx: Sender<Command>,
16
19
  callback_rx: Receiver<Command>,
17
20
  }
18
21
 
19
22
  impl Runtime {
20
- pub fn new(thread_count: u8) -> Self {
23
+ pub fn new(thread_count: u8, telemetry_options: TelemetryOptions) -> Self {
21
24
  let (tx, rx): (Sender<Command>, Receiver<Command>) = channel();
22
25
  let tokio_runtime = Arc::new(
23
26
  Builder::new_multi_thread()
@@ -27,8 +30,12 @@ impl Runtime {
27
30
  .build()
28
31
  .expect("Unable to start a runtime")
29
32
  );
33
+ let core_runtime = Arc::new(
34
+ CoreRuntime::new(telemetry_options, Builder::new_multi_thread())
35
+ .expect("Failed to initialize Core telemetry")
36
+ );
30
37
 
31
- Runtime { tokio_runtime, callback_tx: tx, callback_rx: rx }
38
+ Runtime { core_runtime, tokio_runtime, callback_tx: tx, callback_rx: rx }
32
39
  }
33
40
 
34
41
  // This function is expected to be called from a Ruby thread
data/bridge/src/worker.rs CHANGED
@@ -4,7 +4,9 @@ use prost::Message;
4
4
  use std::sync::Arc;
5
5
  use std::sync::mpsc::Sender;
6
6
  use temporal_sdk_core::api::{Worker as WorkerTrait};
7
+ use temporal_sdk_core_api::errors::{PollActivityError};
7
8
  use temporal_sdk_core_api::worker::{WorkerConfigBuilder, WorkerConfigBuilderError};
9
+ use temporal_sdk_core_protos::coresdk::{ActivityHeartbeat, ActivityTaskCompletion};
8
10
  use thiserror::Error;
9
11
  use tokio::runtime::{Runtime as TokioRuntime};
10
12
 
@@ -13,14 +15,23 @@ pub enum WorkerError {
13
15
  #[error(transparent)]
14
16
  EncodeError(#[from] prost::EncodeError),
15
17
 
18
+ #[error(transparent)]
19
+ DecodeError(#[from] prost::DecodeError),
20
+
16
21
  #[error(transparent)]
17
22
  InvalidWorkerOptions(#[from] WorkerConfigBuilderError),
18
23
 
19
24
  #[error(transparent)]
20
25
  UnableToPollActivityTask(#[from] temporal_sdk_core::api::errors::PollActivityError),
21
26
 
27
+ #[error(transparent)]
28
+ UnableToCompleteActivityTask(#[from] temporal_sdk_core::api::errors::CompleteActivityError),
29
+
22
30
  #[error("Unable to send a request. Channel is closed")]
23
31
  ChannelClosed(),
32
+
33
+ #[error("Core worker is shutting down")]
34
+ Shutdown(),
24
35
  }
25
36
 
26
37
  pub type WorkerResult = Result<Vec<u8>, WorkerError>;
@@ -37,11 +48,12 @@ impl Worker {
37
48
  let config = WorkerConfigBuilder::default()
38
49
  .namespace(namespace)
39
50
  .task_queue(task_queue)
51
+ .worker_build_id("test-worker-build") // TODO: replace this with an actual build id
40
52
  .build()?;
41
53
 
42
54
  let core_worker = runtime.tokio_runtime.block_on(async move {
43
- temporal_sdk_core::init_worker(config, client.clone())
44
- });
55
+ temporal_sdk_core::init_worker(&runtime.core_runtime, config, client.clone())
56
+ }).expect("Failed to initialize Core Worker");
45
57
 
46
58
  Ok(Worker {
47
59
  core_worker: Arc::new(core_worker),
@@ -62,6 +74,7 @@ impl Worker {
62
74
  let bytes = task.encode_to_vec();
63
75
  Box::new(move || callback(Ok(bytes)))
64
76
  },
77
+ Err(PollActivityError::ShutDown) => Box::new(move || callback(Err(WorkerError::Shutdown()))),
65
78
  Err(e) => Box::new(move || callback(Err(WorkerError::UnableToPollActivityTask(e))))
66
79
  };
67
80
 
@@ -70,4 +83,42 @@ impl Worker {
70
83
 
71
84
  Ok(())
72
85
  }
86
+
87
+ pub fn complete_activity_task<F>(&self, bytes: Vec<u8>, callback: F) -> Result<(), WorkerError> where F: FnOnce(WorkerResult) + Send + 'static {
88
+ let core_worker = self.core_worker.clone();
89
+ let callback_tx = self.callback_tx.clone();
90
+ let proto = ActivityTaskCompletion::decode(&*bytes)?;
91
+
92
+ self.tokio_runtime.spawn(async move {
93
+ let result = core_worker.complete_activity_task(proto).await;
94
+
95
+ let callback: Callback = match result {
96
+ Ok(()) => Box::new(move || callback(Ok(vec!()))),
97
+ Err(e) => Box::new(move || callback(Err(WorkerError::UnableToCompleteActivityTask(e))))
98
+ };
99
+
100
+ callback_tx.send(Command::RunCallback(callback)).expect("Unable to send a callback");
101
+ });
102
+
103
+ Ok(())
104
+ }
105
+
106
+ pub fn record_activity_heartbeat(&self, bytes: Vec<u8>) -> Result<(), WorkerError> {
107
+ let proto = ActivityHeartbeat::decode(&*bytes)?;
108
+ self.core_worker.record_activity_heartbeat(proto);
109
+
110
+ Ok(())
111
+ }
112
+
113
+ pub fn initiate_shutdown(&self) {
114
+ self.core_worker.initiate_shutdown();
115
+ }
116
+
117
+ pub fn shutdown(&self) {
118
+ let core_worker = self.core_worker.clone();
119
+
120
+ self.tokio_runtime.block_on(async move {
121
+ core_worker.shutdown().await;
122
+ });
123
+ }
73
124
  }
data/lib/bridge.so CHANGED
Binary file
@@ -17,9 +17,8 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
17
17
  optional :close_time, :message, 4, "google.protobuf.Timestamp"
18
18
  end
19
19
  add_message "temporal.api.batch.v1.BatchOperationTermination" do
20
- optional :reason, :string, 1
21
- optional :details, :message, 2, "temporal.api.common.v1.Payloads"
22
- optional :identity, :string, 3
20
+ optional :details, :message, 1, "temporal.api.common.v1.Payloads"
21
+ optional :identity, :string, 2
23
22
  end
24
23
  add_message "temporal.api.batch.v1.BatchOperationSignal" do
25
24
  optional :signal, :string, 1
@@ -28,13 +27,15 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
28
27
  optional :identity, :string, 4
29
28
  end
30
29
  add_message "temporal.api.batch.v1.BatchOperationCancellation" do
31
- optional :reason, :string, 1
32
- optional :identity, :string, 2
30
+ optional :identity, :string, 1
31
+ end
32
+ add_message "temporal.api.batch.v1.BatchOperationDeletion" do
33
+ optional :identity, :string, 1
33
34
  end
34
35
  end
35
36
  end
36
37
 
37
- module Temporal
38
+ module Temporalio
38
39
  module Api
39
40
  module Batch
40
41
  module V1
@@ -42,6 +43,7 @@ module Temporal
42
43
  BatchOperationTermination = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationTermination").msgclass
43
44
  BatchOperationSignal = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationSignal").msgclass
44
45
  BatchOperationCancellation = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationCancellation").msgclass
46
+ BatchOperationDeletion = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.batch.v1.BatchOperationDeletion").msgclass
45
47
  end
46
48
  end
47
49
  end
@@ -7,9 +7,9 @@ require 'google/protobuf/duration_pb'
7
7
  require 'dependencies/gogoproto/gogo_pb'
8
8
  require 'temporal/api/enums/v1/workflow_pb'
9
9
  require 'temporal/api/enums/v1/command_type_pb'
10
- require 'temporal/api/enums/v1/update_pb'
11
10
  require 'temporal/api/common/v1/message_pb'
12
11
  require 'temporal/api/failure/v1/message_pb'
12
+ require 'temporal/api/interaction/v1/message_pb'
13
13
  require 'temporal/api/taskqueue/v1/message_pb'
14
14
 
15
15
  Google::Protobuf::DescriptorPool.generated_pool.build do
@@ -66,6 +66,9 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
66
66
  add_message "temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes" do
67
67
  optional :search_attributes, :message, 1, "temporal.api.common.v1.SearchAttributes"
68
68
  end
69
+ add_message "temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes" do
70
+ optional :upserted_memo, :message, 1, "temporal.api.common.v1.Memo"
71
+ end
69
72
  add_message "temporal.api.command.v1.RecordMarkerCommandAttributes" do
70
73
  optional :marker_name, :string, 1
71
74
  map :details, :string, :message, 2, "temporal.api.common.v1.Payloads"
@@ -107,15 +110,16 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
107
110
  optional :search_attributes, :message, 16, "temporal.api.common.v1.SearchAttributes"
108
111
  end
109
112
  add_message "temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes" do
110
- optional :update_id, :string, 1
113
+ optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
114
+ optional :input, :message, 2, "temporal.api.interaction.v1.Input"
111
115
  end
112
116
  add_message "temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes" do
113
- optional :update_id, :string, 1
114
- optional :durability_preference, :enum, 2, "temporal.api.enums.v1.WorkflowUpdateDurabilityPreference"
115
- oneof :result do
116
- optional :success, :message, 3, "temporal.api.common.v1.Payloads"
117
- optional :failure, :message, 4, "temporal.api.failure.v1.Failure"
118
- end
117
+ optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
118
+ optional :output, :message, 2, "temporal.api.interaction.v1.Output"
119
+ end
120
+ add_message "temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes" do
121
+ optional :meta, :message, 1, "temporal.api.interaction.v1.Meta"
122
+ optional :failure, :message, 2, "temporal.api.failure.v1.Failure"
119
123
  end
120
124
  add_message "temporal.api.command.v1.Command" do
121
125
  optional :command_type, :enum, 1, "temporal.api.enums.v1.CommandType"
@@ -135,12 +139,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
135
139
  optional :upsert_workflow_search_attributes_command_attributes, :message, 14, "temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes"
136
140
  optional :accept_workflow_update_command_attributes, :message, 15, "temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes"
137
141
  optional :complete_workflow_update_command_attributes, :message, 16, "temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes"
142
+ optional :modify_workflow_properties_command_attributes, :message, 17, "temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes"
143
+ optional :reject_workflow_update_command_attributes, :message, 18, "temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes"
138
144
  end
139
145
  end
140
146
  end
141
147
  end
142
148
 
143
- module Temporal
149
+ module Temporalio
144
150
  module Api
145
151
  module Command
146
152
  module V1
@@ -154,11 +160,13 @@ module Temporal
154
160
  RequestCancelExternalWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RequestCancelExternalWorkflowExecutionCommandAttributes").msgclass
155
161
  SignalExternalWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.SignalExternalWorkflowExecutionCommandAttributes").msgclass
156
162
  UpsertWorkflowSearchAttributesCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.UpsertWorkflowSearchAttributesCommandAttributes").msgclass
163
+ ModifyWorkflowPropertiesCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.ModifyWorkflowPropertiesCommandAttributes").msgclass
157
164
  RecordMarkerCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RecordMarkerCommandAttributes").msgclass
158
165
  ContinueAsNewWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.ContinueAsNewWorkflowExecutionCommandAttributes").msgclass
159
166
  StartChildWorkflowExecutionCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.StartChildWorkflowExecutionCommandAttributes").msgclass
160
167
  AcceptWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.AcceptWorkflowUpdateCommandAttributes").msgclass
161
168
  CompleteWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.CompleteWorkflowUpdateCommandAttributes").msgclass
169
+ RejectWorkflowUpdateCommandAttributes = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.RejectWorkflowUpdateCommandAttributes").msgclass
162
170
  Command = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("temporal.api.command.v1.Command").msgclass
163
171
  end
164
172
  end