@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.0

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 (233) hide show
  1. package/Cargo.lock +794 -650
  2. package/bridge-macros/src/derive_tryintojs.rs +40 -0
  3. package/lib/native.d.ts +24 -3
  4. package/package.json +4 -4
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  11. package/sdk-core/AGENTS.md +42 -31
  12. package/sdk-core/Cargo.toml +4 -1
  13. package/sdk-core/README.md +19 -13
  14. package/sdk-core/crates/client/Cargo.toml +4 -0
  15. package/sdk-core/crates/client/README.md +139 -0
  16. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  17. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  18. package/sdk-core/crates/client/src/errors.rs +294 -0
  19. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
  20. package/sdk-core/crates/client/src/lib.rs +920 -1326
  21. package/sdk-core/crates/client/src/metrics.rs +24 -33
  22. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  23. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  24. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  25. package/sdk-core/crates/client/src/retry.rs +99 -54
  26. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
  27. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  28. package/sdk-core/crates/common/Cargo.toml +62 -3
  29. package/sdk-core/crates/common/build.rs +742 -12
  30. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  31. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
  32. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  33. package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
  34. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  35. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
  36. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
  43. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
  44. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
  45. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
  46. package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
  47. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  48. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
  49. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
  50. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
  51. package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
  52. package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  53. package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
  54. package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
  55. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
  56. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
  57. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
  58. package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
  59. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
  60. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
  61. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
  62. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  63. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  64. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  65. package/sdk-core/crates/common/src/lib.rs +15 -211
  66. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  67. package/sdk-core/crates/common/src/priority.rs +110 -0
  68. package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
  69. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  70. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  71. package/sdk-core/crates/common/src/protos/mod.rs +134 -27
  72. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  73. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  74. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
  75. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  76. package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
  77. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  78. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  79. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  80. package/sdk-core/crates/common/src/telemetry.rs +278 -19
  81. package/sdk-core/crates/common/src/worker.rs +68 -636
  82. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  83. package/sdk-core/crates/macros/Cargo.toml +5 -1
  84. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  85. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  86. package/sdk-core/crates/macros/src/lib.rs +138 -512
  87. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  88. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  89. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  90. package/sdk-core/crates/sdk/README.md +415 -0
  91. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  92. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  93. package/sdk-core/crates/sdk/src/lib.rs +759 -442
  94. package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
  95. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  96. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  97. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  98. package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
  99. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
  100. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  101. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  102. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  103. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
  104. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  105. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  106. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  107. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
  108. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
  109. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
  110. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  111. package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
  112. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  113. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
  114. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  115. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  116. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
  117. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
  118. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
  119. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  120. package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
  121. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  122. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  123. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
  124. package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
  125. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
  126. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
  127. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
  128. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  129. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  130. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
  131. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
  132. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  133. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
  134. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  135. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
  136. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
  137. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
  138. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  139. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  140. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  141. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  142. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  143. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  144. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  145. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  146. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  147. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  148. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  149. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  150. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  151. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  152. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  153. package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
  154. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  155. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
  156. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
  157. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
  175. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
  176. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
  177. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  178. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
  179. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
  180. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
  181. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
  182. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
  183. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
  184. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
  185. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  186. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  187. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
  188. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
  189. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
  190. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
  191. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
  192. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
  193. package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
  194. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
  195. package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
  196. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
  197. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  198. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  199. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  200. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  201. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  202. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  203. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  204. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  205. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  206. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  207. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
  208. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
  209. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
  210. package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
  211. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
  212. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
  213. package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
  214. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
  215. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
  216. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
  217. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
  218. package/sdk-core/rustfmt.toml +2 -1
  219. package/src/client.rs +206 -289
  220. package/src/helpers/try_into_js.rs +88 -2
  221. package/src/metrics.rs +277 -35
  222. package/src/runtime.rs +94 -45
  223. package/src/testing.rs +9 -16
  224. package/src/worker.rs +86 -68
  225. package/ts/native.ts +39 -3
  226. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  227. package/sdk-core/crates/common/src/errors.rs +0 -85
  228. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  229. package/sdk-core/crates/macros/LICENSE.txt +0 -21
  230. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  231. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  232. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  233. 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
+ }