@temporalio/core-bridge 1.15.0 → 1.16.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 (209) hide show
  1. package/Cargo.lock +172 -70
  2. package/lib/native.d.ts +1 -1
  3. package/package.json +2 -2
  4. package/releases/aarch64-apple-darwin/index.node +0 -0
  5. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  6. package/releases/x86_64-apple-darwin/index.node +0 -0
  7. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  8. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  9. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  10. package/sdk-core/AGENTS.md +41 -30
  11. package/sdk-core/Cargo.toml +3 -0
  12. package/sdk-core/README.md +15 -9
  13. package/sdk-core/crates/client/Cargo.toml +4 -0
  14. package/sdk-core/crates/client/README.md +139 -0
  15. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  16. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  17. package/sdk-core/crates/client/src/errors.rs +294 -0
  18. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +280 -159
  19. package/sdk-core/crates/client/src/lib.rs +920 -1326
  20. package/sdk-core/crates/client/src/metrics.rs +24 -33
  21. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  22. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  23. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  24. package/sdk-core/crates/client/src/retry.rs +99 -54
  25. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +1 -1
  26. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  27. package/sdk-core/crates/common/Cargo.toml +61 -2
  28. package/sdk-core/crates/common/build.rs +742 -12
  29. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  30. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  31. package/sdk-core/crates/common/protos/api_upstream/buf.yaml +0 -3
  32. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  33. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +1166 -770
  34. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +1243 -750
  35. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +2 -2
  36. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -3
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +4 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +16 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -6
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +88 -33
  43. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +4 -2
  44. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -0
  45. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +5 -5
  46. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  47. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  48. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  49. package/sdk-core/crates/common/src/lib.rs +15 -211
  50. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  51. package/sdk-core/crates/common/src/priority.rs +110 -0
  52. package/sdk-core/crates/common/src/protos/canned_histories.rs +3 -0
  53. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  54. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  55. package/sdk-core/crates/common/src/protos/mod.rs +122 -27
  56. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  57. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  58. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +5 -7
  59. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  60. package/sdk-core/crates/common/src/telemetry/metrics.rs +268 -223
  61. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  62. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  63. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  64. package/sdk-core/crates/common/src/telemetry.rs +264 -4
  65. package/sdk-core/crates/common/src/worker.rs +68 -603
  66. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  67. package/sdk-core/crates/macros/Cargo.toml +5 -1
  68. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  69. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  70. package/sdk-core/crates/macros/src/lib.rs +138 -512
  71. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  72. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  73. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  74. package/sdk-core/crates/sdk/README.md +415 -0
  75. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  76. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  77. package/sdk-core/crates/sdk/src/lib.rs +757 -442
  78. package/sdk-core/crates/sdk/src/workflow_context/options.rs +45 -35
  79. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  80. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  81. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  82. package/sdk-core/crates/sdk-core/Cargo.toml +57 -64
  83. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +41 -35
  84. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  85. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  86. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  87. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +13 -15
  88. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  89. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  90. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  91. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +493 -26
  92. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +4 -8
  93. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +7 -7
  94. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  95. package/sdk-core/crates/sdk-core/src/lib.rs +41 -111
  96. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  97. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +118 -19
  98. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  99. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  100. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +179 -196
  101. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -280
  102. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +6 -9
  103. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  104. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  105. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  106. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +9 -5
  107. package/sdk-core/crates/sdk-core/src/worker/client.rs +103 -81
  108. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +7 -11
  109. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1124 -229
  110. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +145 -23
  111. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  112. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  113. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +13 -13
  114. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +28 -8
  115. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  116. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  117. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +19 -4
  118. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +14 -18
  119. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +4 -6
  120. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  121. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  122. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  123. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  124. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  125. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  126. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  127. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  128. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  129. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  130. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  131. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  132. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  133. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  134. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  135. package/sdk-core/crates/sdk-core/tests/common/mod.rs +241 -196
  136. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  137. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +3 -5
  138. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -64
  139. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +298 -252
  140. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  141. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  142. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  143. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +16 -12
  144. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +48 -40
  145. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +327 -255
  146. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  147. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +147 -126
  148. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  149. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -453
  150. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  151. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +360 -231
  152. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +248 -185
  153. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -43
  154. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  155. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +428 -315
  156. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -56
  157. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -28
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -243
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +101 -42
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -147
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -28
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1036
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -41
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +397 -238
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +414 -189
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +154 -137
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -105
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -38
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -40
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -54
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +363 -226
  175. package/sdk-core/crates/sdk-core/tests/main.rs +17 -15
  176. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +207 -152
  177. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +65 -34
  178. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  179. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  180. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  181. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  182. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  183. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  184. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  185. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  186. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  187. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  188. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +7 -1
  189. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +14 -14
  190. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +83 -74
  191. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +9 -14
  192. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +1 -2
  193. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +13 -13
  194. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +6 -6
  195. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +3 -4
  196. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +62 -75
  197. package/sdk-core/rustfmt.toml +2 -1
  198. package/src/client.rs +205 -318
  199. package/src/metrics.rs +22 -30
  200. package/src/runtime.rs +4 -5
  201. package/src/worker.rs +16 -19
  202. package/ts/native.ts +1 -1
  203. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  204. package/sdk-core/crates/common/src/errors.rs +0 -85
  205. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  206. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  207. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  208. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  209. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
@@ -0,0 +1,552 @@
1
+ use crate::common::CoreWfStarter;
2
+ use temporalio_client::{
3
+ UntypedQuery, UntypedSignal, UntypedUpdate, WorkflowExecuteUpdateOptions, WorkflowQueryOptions,
4
+ WorkflowSignalOptions, WorkflowStartOptions,
5
+ };
6
+ use temporalio_common::{
7
+ data_converters::{PayloadConverter, RawValue},
8
+ worker::WorkerTaskTypes,
9
+ };
10
+ use temporalio_macros::{workflow, workflow_methods};
11
+ use temporalio_sdk::{SyncWorkflowContext, WorkflowContext, WorkflowContextView, WorkflowResult};
12
+
13
+ #[workflow]
14
+ #[derive(Default)]
15
+ struct InteractionWorkflow {
16
+ counter: i32,
17
+ log: Vec<&'static str>,
18
+ }
19
+
20
+ #[derive(Debug, serde::Serialize, serde::Deserialize)]
21
+ struct ReturnVal {
22
+ counter: i32,
23
+ log: Vec<String>,
24
+ }
25
+
26
+ #[workflow_methods]
27
+ impl InteractionWorkflow {
28
+ #[run]
29
+ async fn run(
30
+ ctx: &mut WorkflowContext<Self>,
31
+ wait_for_value: i32,
32
+ ) -> WorkflowResult<ReturnVal> {
33
+ ctx.state_mut(|s| s.log.push("run"));
34
+ ctx.wait_condition(|s| s.counter == wait_for_value).await;
35
+ let rval = ctx.state_mut(|s| {
36
+ s.log.push("run_done");
37
+ ReturnVal {
38
+ counter: s.counter,
39
+ log: std::mem::take(&mut s.log)
40
+ .into_iter()
41
+ .map(|s| s.to_string())
42
+ .collect(),
43
+ }
44
+ });
45
+ Ok(rval)
46
+ }
47
+
48
+ #[signal]
49
+ fn increment(&mut self, _ctx: &mut SyncWorkflowContext<Self>, amount: i32) {
50
+ self.counter += amount;
51
+ }
52
+
53
+ #[signal]
54
+ async fn increment_and_wait(ctx: &mut WorkflowContext<Self>, amount_and_target: (i32, i32)) {
55
+ ctx.state_mut(|s| s.counter += amount_and_target.0);
56
+ ctx.wait_condition(|s| s.counter >= amount_and_target.1)
57
+ .await;
58
+ ctx.state_mut(|s| s.log.push("async signal done"));
59
+ }
60
+
61
+ #[query]
62
+ fn get_counter(&self, _ctx: &WorkflowContextView) -> i32 {
63
+ self.counter
64
+ }
65
+
66
+ #[query]
67
+ fn get_counter_checked(
68
+ &self,
69
+ _ctx: &WorkflowContextView,
70
+ min: i32,
71
+ ) -> Result<i32, Box<dyn std::error::Error + Send + Sync>> {
72
+ if self.counter < min {
73
+ Err(format!("Counter {} is below minimum {}", self.counter, min).into())
74
+ } else {
75
+ Ok(self.counter)
76
+ }
77
+ }
78
+
79
+ #[update]
80
+ fn set_counter(&mut self, _ctx: &mut SyncWorkflowContext<Self>, value: i32) -> i32 {
81
+ self.log.push("set counter");
82
+ let old = self.counter;
83
+ self.counter = value;
84
+ old
85
+ }
86
+
87
+ #[update]
88
+ fn invalidate_vec(&mut self, _ctx: &mut SyncWorkflowContext<Self>) {
89
+ self.log = vec![]
90
+ }
91
+
92
+ #[update]
93
+ async fn change_and_wait(ctx: &mut WorkflowContext<Self>, amount_and_wait: (i32, i32)) {
94
+ ctx.state_mut(|s| {
95
+ s.log.push("starting change_and_wait");
96
+ s.counter += amount_and_wait.0;
97
+ });
98
+ ctx.wait_condition(|s| s.counter == amount_and_wait.1).await;
99
+ ctx.state_mut(|s| s.log.push("done change_and_wait"));
100
+ }
101
+
102
+ #[update_validator(validated_set)]
103
+ fn validate_validated_set(
104
+ &self,
105
+ _ctx: &WorkflowContextView,
106
+ value: &i32,
107
+ ) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
108
+ if *value < 0 {
109
+ Err("Value must be non-negative".into())
110
+ } else {
111
+ Ok(())
112
+ }
113
+ }
114
+ #[update]
115
+ fn validated_set(&mut self, _ctx: &mut SyncWorkflowContext<Self>, value: i32) -> i32 {
116
+ let old = self.counter;
117
+ self.counter = value;
118
+ old
119
+ }
120
+ }
121
+
122
+ // TODO: add another test that uses wait condition concurrently with some future that uses
123
+ // state_mut
124
+
125
+ #[tokio::test]
126
+ async fn test_typed_signal() {
127
+ let wf_name = InteractionWorkflow::name();
128
+ let mut starter = CoreWfStarter::new(wf_name);
129
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
130
+ let mut worker = starter.worker().await;
131
+ worker.register_workflow::<InteractionWorkflow>();
132
+
133
+ let task_queue = starter.get_task_queue().to_owned();
134
+ let handle = worker
135
+ .submit_workflow(
136
+ InteractionWorkflow::run,
137
+ 42, // Wait for counter == 42
138
+ WorkflowStartOptions::new(
139
+ task_queue.clone(),
140
+ format!("{}_signal", starter.get_task_queue()),
141
+ )
142
+ .build(),
143
+ )
144
+ .await
145
+ .unwrap();
146
+
147
+ // Send signal concurrently with worker
148
+ let signaler = async {
149
+ handle
150
+ .signal(
151
+ InteractionWorkflow::increment,
152
+ 42,
153
+ WorkflowSignalOptions::default(),
154
+ )
155
+ .await
156
+ .unwrap();
157
+ };
158
+
159
+ let (_, worker_res) = tokio::join!(signaler, worker.run_until_done());
160
+ worker_res.unwrap();
161
+
162
+ let result = handle.get_result(Default::default()).await.unwrap();
163
+ assert_eq!(result.counter, 42);
164
+ }
165
+
166
+ #[tokio::test]
167
+ async fn test_typed_update() {
168
+ let wf_name = InteractionWorkflow::name();
169
+ let mut starter = CoreWfStarter::new(wf_name);
170
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
171
+ let mut worker = starter.worker().await;
172
+ worker.register_workflow::<InteractionWorkflow>();
173
+
174
+ let task_queue = starter.get_task_queue().to_owned();
175
+ let handle = worker
176
+ .submit_workflow(
177
+ InteractionWorkflow::run,
178
+ 999, // Wait for counter == 999
179
+ WorkflowStartOptions::new(
180
+ task_queue.clone(),
181
+ format!("{}_update", starter.get_task_queue()),
182
+ )
183
+ .build(),
184
+ )
185
+ .await
186
+ .unwrap();
187
+
188
+ let updates = async {
189
+ let old_value = handle
190
+ .execute_update(
191
+ InteractionWorkflow::set_counter,
192
+ 2,
193
+ WorkflowExecuteUpdateOptions::default(),
194
+ )
195
+ .await
196
+ .unwrap();
197
+ assert_eq!(old_value, 0);
198
+ handle
199
+ .execute_update(
200
+ InteractionWorkflow::invalidate_vec,
201
+ (),
202
+ WorkflowExecuteUpdateOptions::default(),
203
+ )
204
+ .await
205
+ .unwrap();
206
+ handle
207
+ .execute_update(
208
+ InteractionWorkflow::change_and_wait,
209
+ (997, 999),
210
+ WorkflowExecuteUpdateOptions::default(),
211
+ )
212
+ .await
213
+ .unwrap();
214
+ };
215
+
216
+ let (_, workerres) = tokio::join!(updates, worker.run_until_done());
217
+ workerres.unwrap();
218
+
219
+ let result = handle.get_result(Default::default()).await.unwrap();
220
+ assert_eq!(result.counter, 999);
221
+ }
222
+
223
+ #[tokio::test]
224
+ async fn test_typed_query() {
225
+ let wf_name = InteractionWorkflow::name();
226
+ let mut starter = CoreWfStarter::new(wf_name);
227
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
228
+ let mut worker = starter.worker().await;
229
+ worker.register_workflow::<InteractionWorkflow>();
230
+
231
+ let task_queue = starter.get_task_queue().to_owned();
232
+ let handle = worker
233
+ .submit_workflow(
234
+ InteractionWorkflow::run,
235
+ 100,
236
+ WorkflowStartOptions::new(
237
+ task_queue.clone(),
238
+ format!("{}_query", starter.get_task_queue()),
239
+ )
240
+ .build(),
241
+ )
242
+ .await
243
+ .unwrap();
244
+
245
+ let querier = async {
246
+ let counter = handle
247
+ .query(
248
+ InteractionWorkflow::get_counter,
249
+ (),
250
+ WorkflowQueryOptions::default(),
251
+ )
252
+ .await
253
+ .unwrap();
254
+ assert_eq!(counter, 0);
255
+ handle
256
+ .signal(
257
+ InteractionWorkflow::increment,
258
+ 50,
259
+ WorkflowSignalOptions::default(),
260
+ )
261
+ .await
262
+ .unwrap();
263
+
264
+ let counter = handle
265
+ .query(
266
+ InteractionWorkflow::get_counter,
267
+ (),
268
+ WorkflowQueryOptions::default(),
269
+ )
270
+ .await
271
+ .unwrap();
272
+ assert_eq!(counter, 50);
273
+ handle
274
+ .signal(
275
+ InteractionWorkflow::increment,
276
+ 50,
277
+ WorkflowSignalOptions::default(),
278
+ )
279
+ .await
280
+ .unwrap();
281
+ };
282
+
283
+ let (_, worker_res) = tokio::join!(querier, worker.run_until_done());
284
+ worker_res.unwrap();
285
+
286
+ let result = handle.get_result(Default::default()).await.unwrap();
287
+ assert_eq!(result.counter, 100);
288
+ }
289
+
290
+ #[tokio::test]
291
+ async fn test_update_validation() {
292
+ let wf_name = InteractionWorkflow::name();
293
+ let mut starter = CoreWfStarter::new(wf_name);
294
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
295
+ let mut worker = starter.worker().await;
296
+ worker.register_workflow::<InteractionWorkflow>();
297
+
298
+ let task_queue = starter.get_task_queue().to_owned();
299
+ let handle = worker
300
+ .submit_workflow(
301
+ InteractionWorkflow::run,
302
+ 42,
303
+ WorkflowStartOptions::new(
304
+ task_queue.clone(),
305
+ format!("{}_validation", starter.get_task_queue()),
306
+ )
307
+ .build(),
308
+ )
309
+ .await
310
+ .unwrap();
311
+
312
+ let updater = async {
313
+ let old_value = handle
314
+ .execute_update(
315
+ InteractionWorkflow::validated_set,
316
+ 10,
317
+ WorkflowExecuteUpdateOptions::default(),
318
+ )
319
+ .await
320
+ .unwrap();
321
+ assert_eq!(old_value, 0);
322
+
323
+ let result = handle
324
+ .execute_update(
325
+ InteractionWorkflow::validated_set,
326
+ -5,
327
+ WorkflowExecuteUpdateOptions::default(),
328
+ )
329
+ .await;
330
+ assert!(result.is_err());
331
+ let err = result.unwrap_err();
332
+ assert!(err.to_string().contains("non-negative"));
333
+
334
+ let old_value = handle
335
+ .execute_update(
336
+ InteractionWorkflow::validated_set,
337
+ 42,
338
+ WorkflowExecuteUpdateOptions::default(),
339
+ )
340
+ .await
341
+ .unwrap();
342
+ assert_eq!(old_value, 10);
343
+ };
344
+
345
+ let (_, worker_res) = tokio::join!(updater, worker.run_until_done());
346
+ worker_res.unwrap();
347
+
348
+ let result = handle.get_result(Default::default()).await.unwrap();
349
+ assert_eq!(result.counter, 42);
350
+ }
351
+
352
+ #[tokio::test]
353
+ async fn test_async_signal() {
354
+ let wf_name = InteractionWorkflow::name();
355
+ let mut starter = CoreWfStarter::new(wf_name);
356
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
357
+ let mut worker = starter.worker().await;
358
+ worker.register_workflow::<InteractionWorkflow>();
359
+
360
+ let task_queue = starter.get_task_queue().to_owned();
361
+ let handle = worker
362
+ .submit_workflow(
363
+ InteractionWorkflow::run,
364
+ 100,
365
+ WorkflowStartOptions::new(
366
+ task_queue.clone(),
367
+ format!("{}_async_signal", starter.get_task_queue()),
368
+ )
369
+ .build(),
370
+ )
371
+ .await
372
+ .unwrap();
373
+
374
+ let signaler = async {
375
+ // Send async signal that adds 20 and waits for counter >= 50
376
+ handle
377
+ .signal(
378
+ InteractionWorkflow::increment_and_wait,
379
+ (20, 50),
380
+ WorkflowSignalOptions::default(),
381
+ )
382
+ .await
383
+ .unwrap();
384
+
385
+ // Send another signal to reach the target (20 + 30 = 50)
386
+ handle
387
+ .signal(
388
+ InteractionWorkflow::increment,
389
+ 30,
390
+ WorkflowSignalOptions::default(),
391
+ )
392
+ .await
393
+ .unwrap();
394
+
395
+ // Now send final signal to complete the workflow (50 + 50 = 100)
396
+ handle
397
+ .signal(
398
+ InteractionWorkflow::increment,
399
+ 50,
400
+ WorkflowSignalOptions::default(),
401
+ )
402
+ .await
403
+ .unwrap();
404
+ };
405
+
406
+ let (_, worker_res) = tokio::join!(signaler, worker.run_until_done());
407
+ worker_res.unwrap();
408
+
409
+ let result = handle.get_result(Default::default()).await.unwrap();
410
+ assert_eq!(result.counter, 100);
411
+ assert!(result.log.contains(&"async signal done".to_owned()));
412
+ }
413
+
414
+ #[tokio::test]
415
+ async fn test_fallible_query() {
416
+ let wf_name = InteractionWorkflow::name();
417
+ let mut starter = CoreWfStarter::new(wf_name);
418
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
419
+ let mut worker = starter.worker().await;
420
+ worker.register_workflow::<InteractionWorkflow>();
421
+
422
+ let task_queue = starter.get_task_queue().to_owned();
423
+ let handle = worker
424
+ .submit_workflow(
425
+ InteractionWorkflow::run,
426
+ 100,
427
+ WorkflowStartOptions::new(
428
+ task_queue.clone(),
429
+ format!("{}_fallible_query", starter.get_task_queue()),
430
+ )
431
+ .build(),
432
+ )
433
+ .await
434
+ .unwrap();
435
+
436
+ let querier = async {
437
+ let result = handle
438
+ .query(
439
+ InteractionWorkflow::get_counter_checked,
440
+ 10,
441
+ WorkflowQueryOptions::default(),
442
+ )
443
+ .await;
444
+ assert!(result.is_err());
445
+ let err = result.unwrap_err();
446
+ assert!(err.to_string().contains("below minimum"));
447
+ handle
448
+ .signal(
449
+ InteractionWorkflow::increment,
450
+ 50,
451
+ WorkflowSignalOptions::default(),
452
+ )
453
+ .await
454
+ .unwrap();
455
+ let counter = handle
456
+ .query(
457
+ InteractionWorkflow::get_counter_checked,
458
+ 10,
459
+ WorkflowQueryOptions::default(),
460
+ )
461
+ .await
462
+ .unwrap();
463
+ assert_eq!(counter, 50);
464
+ handle
465
+ .signal(
466
+ InteractionWorkflow::increment,
467
+ 50,
468
+ WorkflowSignalOptions::default(),
469
+ )
470
+ .await
471
+ .unwrap();
472
+ };
473
+
474
+ let (_, worker_res) = tokio::join!(querier, worker.run_until_done());
475
+ worker_res.unwrap();
476
+
477
+ let result = handle.get_result(Default::default()).await.unwrap();
478
+ assert_eq!(result.counter, 100);
479
+ }
480
+
481
+ #[tokio::test]
482
+ async fn test_untyped_signal_query_update() {
483
+ let wf_name = InteractionWorkflow::name();
484
+ let mut starter = CoreWfStarter::new(wf_name);
485
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
486
+ let mut worker = starter.worker().await;
487
+ worker.register_workflow::<InteractionWorkflow>();
488
+
489
+ let task_queue = starter.get_task_queue().to_owned();
490
+ let handle = worker
491
+ .submit_workflow(
492
+ InteractionWorkflow::run,
493
+ 100,
494
+ WorkflowStartOptions::new(
495
+ task_queue.clone(),
496
+ format!("{}_untyped", starter.get_task_queue()),
497
+ )
498
+ .build(),
499
+ )
500
+ .await
501
+ .unwrap();
502
+
503
+ let pc = PayloadConverter::serde_json();
504
+
505
+ let interactions = async {
506
+ handle
507
+ .signal(
508
+ UntypedSignal::new("increment"),
509
+ RawValue::from_value(&25i32, &pc),
510
+ WorkflowSignalOptions::default(),
511
+ )
512
+ .await
513
+ .unwrap();
514
+
515
+ let counter_raw = handle
516
+ .query(
517
+ UntypedQuery::new("get_counter"),
518
+ RawValue::from_value(&(), &pc),
519
+ WorkflowQueryOptions::default(),
520
+ )
521
+ .await
522
+ .unwrap();
523
+ let counter: i32 = counter_raw.to_value(&pc);
524
+ assert_eq!(counter, 25);
525
+
526
+ let old_raw = handle
527
+ .execute_update(
528
+ UntypedUpdate::new("set_counter"),
529
+ RawValue::from_value(&50i32, &pc),
530
+ WorkflowExecuteUpdateOptions::default(),
531
+ )
532
+ .await
533
+ .unwrap();
534
+ let old_value: i32 = old_raw.to_value(&pc);
535
+ assert_eq!(old_value, 25);
536
+
537
+ handle
538
+ .signal(
539
+ UntypedSignal::new("increment"),
540
+ RawValue::from_value(&50i32, &pc),
541
+ WorkflowSignalOptions::default(),
542
+ )
543
+ .await
544
+ .unwrap();
545
+ };
546
+
547
+ let (_, worker_res) = tokio::join!(interactions, worker.run_until_done());
548
+ worker_res.unwrap();
549
+
550
+ let result = handle.get_result(Default::default()).await.unwrap();
551
+ assert_eq!(result.counter, 100);
552
+ }