@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
@@ -7,7 +7,8 @@ mod fuzzy_workflow;
7
7
 
8
8
  use crate::common::get_integ_runtime_options;
9
9
  use common::{
10
- CoreWfStarter, init_integ_telem, prom_metrics, rand_6_chars, workflows::la_problem_workflow,
10
+ CoreWfStarter, activity_functions::StdActivities, init_integ_telem, prom_metrics, rand_6_chars,
11
+ workflows::LaProblemWorkflow,
11
12
  };
12
13
  use futures_util::{
13
14
  StreamExt,
@@ -22,73 +23,84 @@ use std::{
22
23
  time::{Duration, Instant},
23
24
  };
24
25
  use temporalio_client::{
25
- GetWorkflowResultOptions, WfClientExt, WorkflowClientTrait, WorkflowOptions,
26
+ NamespacedClient, UntypedSignal, UntypedWorkflow, WorkflowExecutionInfo,
27
+ WorkflowGetResultOptions, WorkflowSignalOptions, WorkflowStartOptions,
26
28
  };
29
+ use temporalio_common::{
30
+ data_converters::RawValue, protos::temporal::api::enums::v1::WorkflowIdConflictPolicy,
31
+ };
32
+ use temporalio_macros::{activities, workflow, workflow_methods};
27
33
 
28
34
  use temporalio_common::{
29
35
  protos::{
30
- coresdk::{AsJsonPayloadExt, workflow_commands::ActivityCancellationType},
36
+ coresdk::workflow_commands::ActivityCancellationType,
31
37
  temporal::api::enums::v1::WorkflowIdReusePolicy,
32
38
  },
33
- worker::{PollerBehavior, WorkerTaskTypes},
39
+ worker::WorkerTaskTypes,
40
+ };
41
+ use temporalio_sdk::{
42
+ ActivityOptions, SyncWorkflowContext, WorkflowContext, WorkflowResult,
43
+ activities::{ActivityContext, ActivityError},
44
+ };
45
+ use temporalio_sdk_core::{
46
+ CoreRuntime, PollerBehavior, ResourceBasedTuner, ResourceSlotOptions, TunerHolder,
34
47
  };
35
- use temporalio_sdk::{ActContext, ActivityOptions, WfContext, WorkflowResult};
36
- use temporalio_sdk_core::{CoreRuntime, ResourceBasedTuner, ResourceSlotOptions};
48
+
49
+ #[workflow]
50
+ #[derive(Clone, Default)]
51
+ struct ActivityLoadWf;
52
+
53
+ #[workflow_methods]
54
+ impl ActivityLoadWf {
55
+ #[run(name = "activity_load")]
56
+ async fn run(ctx: &mut WorkflowContext<Self>, tq: String) -> WorkflowResult<()> {
57
+ let input_str = "yo".to_string();
58
+ let res = ctx
59
+ .start_activity(
60
+ StdActivities::echo,
61
+ input_str.clone(),
62
+ ActivityOptions {
63
+ activity_id: Some("act-1".to_string()),
64
+ task_queue: Some(tq),
65
+ schedule_to_start_timeout: Some(Duration::from_secs(8)),
66
+ start_to_close_timeout: Some(Duration::from_secs(8)),
67
+ schedule_to_close_timeout: Some(Duration::from_secs(8)),
68
+ heartbeat_timeout: Some(Duration::from_secs(8)),
69
+ cancellation_type: ActivityCancellationType::TryCancel,
70
+ ..Default::default()
71
+ },
72
+ )
73
+ .await?;
74
+ assert_eq!(res, input_str);
75
+ Ok(())
76
+ }
77
+ }
37
78
 
38
79
  #[tokio::test]
39
80
  async fn activity_load() {
40
81
  const CONCURRENCY: usize = 512;
41
82
 
42
83
  let mut starter = CoreWfStarter::new("activity_load");
43
- starter.worker_config.max_outstanding_workflow_tasks = Some(CONCURRENCY);
44
- starter.worker_config.max_cached_workflows = CONCURRENCY;
45
- starter.worker_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
46
- starter.worker_config.max_outstanding_activities = Some(CONCURRENCY);
84
+ starter.sdk_config.max_cached_workflows = CONCURRENCY;
85
+ starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
86
+ starter.sdk_config.tuner =
87
+ Arc::new(TunerHolder::fixed_size(CONCURRENCY, CONCURRENCY, 100, 100));
88
+ starter.sdk_config.register_activities(StdActivities);
89
+ let task_queue = starter.get_task_queue().to_owned();
47
90
  let mut worker = starter.worker().await;
48
91
 
49
- let activity_id = "act-1";
50
- let activity_timeout = Duration::from_secs(8);
51
- let task_queue = Some(starter.get_task_queue().to_owned());
52
-
53
- let wf_fn = move |ctx: WfContext| {
54
- let task_queue = task_queue.clone();
55
- let payload = "yo".as_json_payload().unwrap();
56
- async move {
57
- let activity = ActivityOptions {
58
- activity_id: Some(activity_id.to_string()),
59
- activity_type: "test_activity".to_string(),
60
- input: payload.clone(),
61
- task_queue,
62
- schedule_to_start_timeout: Some(activity_timeout),
63
- start_to_close_timeout: Some(activity_timeout),
64
- schedule_to_close_timeout: Some(activity_timeout),
65
- heartbeat_timeout: Some(activity_timeout),
66
- cancellation_type: ActivityCancellationType::TryCancel,
67
- ..Default::default()
68
- };
69
- let res = ctx.activity(activity).await.unwrap_ok_payload();
70
- assert_eq!(res.data, payload.data);
71
- Ok(().into())
72
- }
73
- };
74
-
75
92
  let starting = Instant::now();
76
- let wf_type = "activity_load";
77
- worker.register_wf(wf_type.to_owned(), wf_fn);
78
- worker.register_activity(
79
- "test_activity",
80
- |_ctx: ActContext, echo: String| async move { Ok(echo) },
81
- );
93
+ worker.register_workflow::<ActivityLoadWf>();
82
94
  join_all((0..CONCURRENCY).map(|i| {
83
95
  let worker = &worker;
84
96
  let wf_id = format!("activity_load_{i}");
97
+ let tq = task_queue.clone();
85
98
  async move {
86
99
  worker
87
- .submit_wf(
88
- wf_id,
89
- wf_type.to_owned(),
90
- vec![],
91
- WorkflowOptions::default(),
100
+ .submit_workflow(
101
+ ActivityLoadWf::run,
102
+ tq.clone(),
103
+ WorkflowStartOptions::new(tq, wf_id).build(),
92
104
  )
93
105
  .await
94
106
  .unwrap();
@@ -103,17 +115,56 @@ async fn activity_load() {
103
115
  dbg!(running.elapsed());
104
116
  }
105
117
 
118
+ #[workflow]
119
+ #[derive(Default)]
120
+ struct ChunkyActivityWf;
121
+
122
+ #[workflow_methods]
123
+ impl ChunkyActivityWf {
124
+ #[run(name = "chunky_activity_wf")]
125
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
126
+ let input_str = "yo".to_string();
127
+ let res = ctx
128
+ .start_activity(
129
+ ChunkyActivities::chunky_echo,
130
+ input_str.clone(),
131
+ ActivityOptions {
132
+ activity_id: Some("act-1".to_string()),
133
+ start_to_close_timeout: Some(Duration::from_secs(30)),
134
+ ..Default::default()
135
+ },
136
+ )
137
+ .await?;
138
+ assert_eq!(res, input_str);
139
+ Ok(())
140
+ }
141
+ }
142
+
143
+ struct ChunkyActivities;
144
+ #[activities]
145
+ impl ChunkyActivities {
146
+ #[activity]
147
+ async fn chunky_echo(_ctx: ActivityContext, echo: String) -> Result<String, ActivityError> {
148
+ tokio::task::spawn_blocking(move || {
149
+ let mut mem = vec![0_u8; 1000 * 1024 * 1024];
150
+ for _ in 1..10 {
151
+ for i in 0..mem.len() {
152
+ mem[i] &= mem[mem.len() - 1 - i]
153
+ }
154
+ }
155
+ Ok(echo)
156
+ })
157
+ .await?
158
+ }
159
+ }
160
+
106
161
  #[tokio::test]
107
162
  async fn chunky_activities_resource_based() {
108
163
  const WORKFLOWS: usize = 100;
109
164
 
110
165
  let mut starter = CoreWfStarter::new("chunky_activities_resource_based");
111
- starter.worker_config.max_outstanding_workflow_tasks = None;
112
- starter.worker_config.max_outstanding_local_activities = None;
113
- starter.worker_config.max_outstanding_activities = None;
114
- starter.worker_config.max_outstanding_nexus_tasks = None;
115
- starter.worker_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
116
- starter.worker_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
166
+ starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
167
+ starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10_usize);
117
168
  let mut tuner = ResourceBasedTuner::new(0.7, 0.7);
118
169
  tuner
119
170
  .with_workflow_slots_options(ResourceSlotOptions::new(
@@ -122,61 +173,27 @@ async fn chunky_activities_resource_based() {
122
173
  Duration::from_millis(0),
123
174
  ))
124
175
  .with_activity_slots_options(ResourceSlotOptions::new(5, 1000, Duration::from_millis(50)));
125
- starter.worker_config.tuner = Some(Arc::new(tuner));
126
- let mut worker = starter.worker().await;
127
-
128
- let activity_id = "act-1";
129
- let activity_timeout = Duration::from_secs(30);
176
+ starter.sdk_config.tuner = Arc::new(tuner);
130
177
 
131
- let wf_fn = move |ctx: WfContext| {
132
- let payload = "yo".as_json_payload().unwrap();
133
- async move {
134
- let activity = ActivityOptions {
135
- activity_id: Some(activity_id.to_string()),
136
- activity_type: "test_activity".to_string(),
137
- input: payload.clone(),
138
- start_to_close_timeout: Some(activity_timeout),
139
- ..Default::default()
140
- };
141
- let res = ctx.activity(activity).await.unwrap_ok_payload();
142
- assert_eq!(res.data, payload.data);
143
- Ok(().into())
144
- }
145
- };
178
+ starter.sdk_config.register_activities(ChunkyActivities);
179
+ let task_queue = starter.get_task_queue().to_owned();
180
+ let mut worker = starter.worker().await;
146
181
 
147
182
  let starting = Instant::now();
148
- let wf_type = "chunky_activity_wf";
149
- worker.register_wf(wf_type.to_owned(), wf_fn);
150
- worker.register_activity(
151
- "test_activity",
152
- |_ctx: ActContext, echo: String| async move {
153
- tokio::task::spawn_blocking(move || {
154
- // Allocate a gig and then do some CPU stuff on it
155
- let mut mem = vec![0_u8; 1000 * 1024 * 1024];
156
- for _ in 1..10 {
157
- for i in 0..mem.len() {
158
- mem[i] &= mem[mem.len() - 1 - i]
159
- }
160
- }
161
- Ok(echo)
162
- })
163
- .await?
164
- },
165
- );
183
+ worker.register_workflow::<ChunkyActivityWf>();
166
184
  join_all((0..WORKFLOWS).map(|i| {
167
185
  let worker = &worker;
168
186
  let wf_id = format!("chunk_activity_{i}");
187
+ let tq = task_queue.clone();
169
188
  async move {
170
189
  worker
171
- .submit_wf(
172
- wf_id,
173
- wf_type.to_owned(),
174
- vec![],
175
- WorkflowOptions {
176
- #[allow(deprecated)]
177
- id_reuse_policy: WorkflowIdReusePolicy::TerminateIfRunning,
178
- ..Default::default()
179
- },
190
+ .submit_workflow(
191
+ ChunkyActivityWf::run,
192
+ (),
193
+ WorkflowStartOptions::new(tq, wf_id)
194
+ .id_conflict_policy(WorkflowIdConflictPolicy::TerminateExisting)
195
+ .id_reuse_policy(WorkflowIdReusePolicy::AllowDuplicate)
196
+ .build(),
180
197
  )
181
198
  .await
182
199
  .unwrap();
@@ -191,9 +208,37 @@ async fn chunky_activities_resource_based() {
191
208
  dbg!(running.elapsed());
192
209
  }
193
210
 
211
+ #[workflow]
212
+ #[derive(Default)]
213
+ struct WorkflowLoadWf;
214
+
215
+ #[workflow_methods]
216
+ impl WorkflowLoadWf {
217
+ #[run(name = "workflow_load")]
218
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
219
+ for _ in 0..5 {
220
+ let _ = ctx
221
+ .start_activity(
222
+ StdActivities::echo,
223
+ "hi!".to_string(),
224
+ ActivityOptions {
225
+ start_to_close_timeout: Some(Duration::from_secs(5)),
226
+ ..Default::default()
227
+ },
228
+ )
229
+ .await;
230
+ ctx.timer(Duration::from_secs(1)).await;
231
+ }
232
+
233
+ Ok(())
234
+ }
235
+
236
+ #[signal]
237
+ fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>) {}
238
+ }
239
+
194
240
  #[tokio::test(flavor = "multi_thread", worker_threads = 4)]
195
241
  async fn workflow_load() {
196
- const SIGNAME: &str = "signame";
197
242
  let num_workflows = 500;
198
243
  let wf_name = "workflow_load";
199
244
  let (mut telemopts, _, _aborter) = prom_metrics(None);
@@ -203,66 +248,40 @@ async fn workflow_load() {
203
248
  init_integ_telem();
204
249
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
205
250
  let mut starter = CoreWfStarter::new_with_runtime("workflow_load", rt);
206
- starter.worker_config.max_outstanding_workflow_tasks = Some(5);
207
- starter.worker_config.max_cached_workflows = 200;
208
- starter.worker_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
209
- starter.worker_config.max_outstanding_activities = Some(100);
251
+ starter.sdk_config.max_cached_workflows = 200;
252
+ starter.sdk_config.activity_task_poller_behavior = PollerBehavior::SimpleMaximum(10);
253
+ starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(5, 100, 100, 100));
254
+ starter.sdk_config.register_activities(StdActivities);
255
+ let task_queue = starter.get_task_queue().to_owned();
210
256
  let mut worker = starter.worker().await;
211
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
212
- let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
213
- let drained_fut = sigchan.forward(sink::drain());
214
-
215
- let real_stuff = async move {
216
- for _ in 0..5 {
217
- ctx.activity(ActivityOptions {
218
- activity_type: "echo_activity".to_string(),
219
- start_to_close_timeout: Some(Duration::from_secs(5)),
220
- input: "hi!".as_json_payload().expect("serializes fine"),
221
- ..Default::default()
222
- })
223
- .await;
224
- ctx.timer(Duration::from_secs(1)).await;
225
- }
226
- };
227
- tokio::select! {
228
- _ = drained_fut => {}
229
- _ = real_stuff => {}
230
- }
231
-
232
- Ok(().into())
233
- });
234
- worker.register_activity(
235
- "echo_activity",
236
- |_ctx: ActContext, echo_me: String| async move { Ok(echo_me) },
237
- );
238
- let client = starter.get_client().await;
257
+ worker.register_workflow::<WorkflowLoadWf>();
239
258
 
240
259
  let mut workflow_handles = vec![];
241
260
  for i in 0..num_workflows {
242
261
  let wfid = format!("{wf_name}_{i}");
243
- let rid = worker
244
- .submit_wf(
245
- wfid.clone(),
246
- wf_name.to_owned(),
247
- vec![],
248
- WorkflowOptions::default(),
262
+ let handle = worker
263
+ .submit_workflow(
264
+ WorkflowLoadWf::run,
265
+ (),
266
+ WorkflowStartOptions::new(task_queue.clone(), wfid).build(),
249
267
  )
250
268
  .await
251
269
  .unwrap();
252
- workflow_handles.push(client.get_untyped_workflow_handle(wfid, rid));
270
+ workflow_handles.push(handle);
253
271
  }
254
272
 
255
273
  let sig_sender = async {
256
274
  loop {
257
- let sends: FuturesUnordered<_> = (0..num_workflows)
258
- .map(|i| {
259
- client.signal_workflow_execution(
260
- format!("{wf_name}_{i}"),
261
- "".to_string(),
262
- SIGNAME.to_string(),
263
- None,
264
- None,
265
- )
275
+ let sends: FuturesUnordered<_> = workflow_handles
276
+ .iter()
277
+ .map(|handle| async move {
278
+ handle
279
+ .signal(
280
+ WorkflowLoadWf::drain_signal,
281
+ (),
282
+ WorkflowSignalOptions::default(),
283
+ )
284
+ .await
266
285
  })
267
286
  .collect();
268
287
  sends
@@ -280,49 +299,49 @@ async fn workflow_load() {
280
299
  async fn evict_while_la_running_no_interference() {
281
300
  let wf_name = "evict_while_la_running_no_interference";
282
301
  let mut starter = CoreWfStarter::new(wf_name);
283
- starter.worker_config.max_outstanding_local_activities = Some(20);
284
- starter.worker_config.max_cached_workflows = 20;
302
+ starter.sdk_config.max_cached_workflows = 20;
285
303
  // Though it doesn't make sense to set wft higher than cached workflows, leaving this commented
286
304
  // introduces more instability that can be useful in the test.
287
305
  // starter.max_wft(20);
306
+ starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(100, 10, 20, 1));
307
+ starter.sdk_config.register_activities(StdActivities);
308
+ let task_queue = starter.get_task_queue().to_owned();
288
309
  let mut worker = starter.worker().await;
289
310
 
290
- worker.register_wf(wf_name.to_owned(), la_problem_workflow);
291
- worker.register_activity("delay", |_: ActContext, _: String| async {
292
- tokio::time::sleep(Duration::from_secs(15)).await;
293
- Ok(())
294
- });
311
+ worker.register_workflow::<LaProblemWorkflow>();
295
312
 
296
313
  let client = starter.get_client().await;
297
314
  let subfs = FuturesUnordered::new();
298
315
  for i in 1..100 {
299
316
  let wf_id = format!("{wf_name}-{i}");
300
- let run_id = worker
301
- .submit_wf(
302
- &wf_id,
303
- wf_name.to_owned(),
304
- vec![],
305
- WorkflowOptions::default(),
317
+ let handle = worker
318
+ .submit_workflow(
319
+ LaProblemWorkflow::run,
320
+ (),
321
+ WorkflowStartOptions::new(task_queue.clone(), wf_id.clone()).build(),
306
322
  )
307
323
  .await
308
324
  .unwrap();
309
- let cw = worker.core_worker.clone();
325
+ let run_id = handle.run_id().unwrap().to_owned();
326
+ let cw = worker.core_worker();
310
327
  let client = client.clone();
311
328
  subfs.push(async move {
312
- // Evict the workflow
313
329
  tokio::time::sleep(Duration::from_secs(1)).await;
314
330
  cw.request_workflow_eviction(&run_id);
315
- // Wake up workflow by sending signal
316
- client
317
- .signal_workflow_execution(
318
- wf_id,
319
- run_id.clone(),
320
- "whaatever".to_string(),
321
- None,
322
- None,
323
- )
324
- .await
325
- .unwrap();
331
+ WorkflowExecutionInfo {
332
+ namespace: client.namespace(),
333
+ workflow_id: wf_id,
334
+ run_id: Some(run_id),
335
+ first_execution_run_id: None,
336
+ }
337
+ .bind_untyped(client)
338
+ .signal(
339
+ UntypedSignal::new("whaatever"),
340
+ RawValue::empty(),
341
+ WorkflowSignalOptions::default(),
342
+ )
343
+ .await
344
+ .unwrap();
326
345
  });
327
346
  }
328
347
  let runf = async {
@@ -331,47 +350,60 @@ async fn evict_while_la_running_no_interference() {
331
350
  tokio::join!(subfs.collect::<Vec<_>>(), runf);
332
351
  }
333
352
 
334
- pub async fn many_parallel_timers_longhist(ctx: WfContext) -> WorkflowResult<()> {
335
- for _ in 0..120 {
336
- let mut futs = vec![];
337
- for _ in 0..100 {
338
- futs.push(ctx.timer(Duration::from_millis(100)));
353
+ #[workflow]
354
+ #[derive(Default)]
355
+ struct ManyParallelTimersLonghistWf;
356
+
357
+ #[workflow_methods]
358
+ impl ManyParallelTimersLonghistWf {
359
+ #[run(name = "can_paginate_long_history")]
360
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
361
+ for _ in 0..120 {
362
+ let mut futs = vec![];
363
+ for _ in 0..100 {
364
+ futs.push(ctx.timer(Duration::from_millis(100)));
365
+ }
366
+ join_all(futs).await;
339
367
  }
340
- join_all(futs).await;
368
+ Ok(())
341
369
  }
342
- Ok(().into())
343
370
  }
344
371
 
345
372
  #[tokio::test]
346
373
  async fn can_paginate_long_history() {
347
374
  let wf_name = "can_paginate_long_history";
348
375
  let mut starter = CoreWfStarter::new(wf_name);
349
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
350
- // Do not use sticky queues so we are forced to paginate once history gets long
351
- starter.worker_config.max_cached_workflows = 0;
376
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
377
+ starter.sdk_config.max_cached_workflows = 0;
352
378
 
353
379
  let mut worker = starter.worker().await;
354
- worker.register_wf(wf_name.to_owned(), many_parallel_timers_longhist);
355
- let run_id = worker
356
- .submit_wf(
357
- wf_name.to_owned(),
358
- wf_name.to_owned(),
359
- vec![],
360
- WorkflowOptions::default(),
380
+ worker.register_workflow::<ManyParallelTimersLonghistWf>();
381
+ let task_queue = starter.get_task_queue().to_owned();
382
+ let handle = worker
383
+ .submit_workflow(
384
+ ManyParallelTimersLonghistWf::run,
385
+ (),
386
+ WorkflowStartOptions::new(task_queue, wf_name.to_owned()).build(),
361
387
  )
362
388
  .await
363
389
  .unwrap();
390
+ let run_id = handle.run_id().unwrap().to_owned();
364
391
  let client = starter.get_client().await;
365
392
  tokio::spawn(async move {
393
+ let handle = WorkflowExecutionInfo {
394
+ namespace: client.namespace(),
395
+ workflow_id: wf_name.into(),
396
+ run_id: Some(run_id),
397
+ first_execution_run_id: None,
398
+ }
399
+ .bind_untyped(client);
366
400
  loop {
367
401
  for _ in 0..10 {
368
- client
369
- .signal_workflow_execution(
370
- wf_name.to_owned(),
371
- run_id.clone(),
372
- "sig".to_string(),
373
- None,
374
- None,
402
+ handle
403
+ .signal(
404
+ UntypedSignal::new("sig"),
405
+ RawValue::empty(),
406
+ WorkflowSignalOptions::default(),
375
407
  )
376
408
  .await
377
409
  .unwrap();
@@ -382,82 +414,92 @@ async fn can_paginate_long_history() {
382
414
  worker.run_until_done().await.unwrap();
383
415
  }
384
416
 
417
+ struct JitteryActivities;
418
+ #[activities]
419
+ impl JitteryActivities {
420
+ #[activity]
421
+ async fn jittery_echo(_ctx: ActivityContext, echo: String) -> Result<String, ActivityError> {
422
+ let rand_millis = rand::rng().random_range(0..500);
423
+ tokio::time::sleep(Duration::from_millis(rand_millis)).await;
424
+ Ok(echo)
425
+ }
426
+ }
427
+
428
+ #[workflow]
429
+ #[derive(Default)]
430
+ struct PollerLoadWf;
431
+
432
+ #[workflow_methods]
433
+ impl PollerLoadWf {
434
+ #[run(name = "poller_load")]
435
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
436
+ for _ in 0..5 {
437
+ let _ = ctx
438
+ .start_activity(
439
+ JitteryActivities::jittery_echo,
440
+ "hi!".to_string(),
441
+ ActivityOptions {
442
+ start_to_close_timeout: Some(Duration::from_secs(5)),
443
+ ..Default::default()
444
+ },
445
+ )
446
+ .await;
447
+ }
448
+
449
+ Ok(())
450
+ }
451
+
452
+ #[signal(name = "signame")]
453
+ fn drain_signal(&mut self, _ctx: &mut SyncWorkflowContext<Self>, _: ()) {}
454
+ }
455
+
385
456
  #[tokio::test]
386
457
  async fn poller_autoscaling_basic_loadtest() {
387
458
  const SIGNAME: &str = "signame";
388
459
  let num_workflows = 100;
389
460
  let wf_name = "poller_load";
390
461
  let mut starter = CoreWfStarter::new("poller_load");
391
- starter.worker_config.max_cached_workflows = 5000;
392
- starter.worker_config.max_outstanding_workflow_tasks = Some(1000);
393
- starter.worker_config.max_outstanding_activities = Some(1000);
394
- starter.worker_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
462
+ starter.sdk_config.max_cached_workflows = 5000;
463
+ starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1000, 1000, 100, 1));
464
+ starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::Autoscaling {
395
465
  minimum: 1,
396
466
  maximum: 200,
397
467
  initial: 5,
398
468
  };
399
- starter.worker_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
469
+ starter.sdk_config.activity_task_poller_behavior = PollerBehavior::Autoscaling {
400
470
  minimum: 1,
401
471
  maximum: 200,
402
472
  initial: 5,
403
473
  };
474
+
475
+ starter.sdk_config.register_activities(JitteryActivities);
404
476
  let mut worker = starter.worker().await;
405
477
  let shutdown_handle = worker.inner_mut().shutdown_handle();
406
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
407
- let sigchan = ctx.make_signal_channel(SIGNAME).map(Ok);
408
- let drained_fut = sigchan.forward(sink::drain());
409
-
410
- let real_stuff = async move {
411
- for _ in 0..5 {
412
- ctx.activity(ActivityOptions {
413
- activity_type: "echo".to_string(),
414
- start_to_close_timeout: Some(Duration::from_secs(5)),
415
- input: "hi!".as_json_payload().expect("serializes fine"),
416
- ..Default::default()
417
- })
418
- .await;
419
- }
420
- };
421
- tokio::select! {
422
- _ = drained_fut => {}
423
- _ = real_stuff => {}
424
- }
425
-
426
- Ok(().into())
427
- });
428
- worker.register_activity("echo", |_: ActContext, echo: String| async move {
429
- // Add some jitter to completions
430
- let rand_millis = rand::rng().random_range(0..500);
431
- tokio::time::sleep(Duration::from_millis(rand_millis)).await;
432
- Ok(echo)
433
- });
478
+ worker.register_workflow::<PollerLoadWf>();
434
479
  let client = starter.get_client().await;
435
480
 
481
+ let task_queue = starter.get_task_queue().to_owned();
436
482
  let mut workflow_handles = vec![];
437
483
  for i in 0..num_workflows {
438
484
  let wfid = format!("{wf_name}_{i}-{}", rand_6_chars());
439
- let rid = worker
440
- .submit_wf(
441
- wfid.clone(),
442
- wf_name.to_owned(),
443
- vec![],
444
- WorkflowOptions {
445
- execution_timeout: Some(Duration::from_secs(120)),
446
- ..Default::default()
447
- },
485
+ let handle = worker
486
+ .submit_workflow(
487
+ PollerLoadWf::run,
488
+ (),
489
+ WorkflowStartOptions::new(task_queue.clone(), wfid)
490
+ .execution_timeout(Duration::from_secs(120))
491
+ .build(),
448
492
  )
449
493
  .await
450
494
  .unwrap();
451
- workflow_handles.push(client.get_untyped_workflow_handle(wfid, rid));
495
+ workflow_handles.push(handle);
452
496
  }
453
497
 
454
498
  let (ah, abort_reg) = AbortHandle::new_pair();
455
499
  let all_workflows_are_done = async {
456
500
  stream::iter(mem::take(&mut workflow_handles))
457
501
  .for_each_concurrent(25, |handle| async move {
458
- let _ = handle
459
- .get_workflow_result(GetWorkflowResultOptions::default())
460
- .await;
502
+ let _ = handle.get_result(WorkflowGetResultOptions::default()).await;
461
503
  })
462
504
  .await;
463
505
  ah.abort();
@@ -469,13 +511,17 @@ async fn poller_autoscaling_basic_loadtest() {
469
511
  loop {
470
512
  let sends: FuturesUnordered<_> = (0..num_workflows)
471
513
  .map(|i| {
472
- client.signal_workflow_execution(
473
- format!("{wf_name}_{i}"),
474
- "".to_string(),
475
- SIGNAME.to_string(),
476
- None,
477
- None,
478
- )
514
+ let handle =
515
+ client.get_workflow_handle::<UntypedWorkflow>(format!("{wf_name}_{i}"));
516
+ async move {
517
+ handle
518
+ .signal(
519
+ UntypedSignal::new(SIGNAME),
520
+ RawValue::empty(),
521
+ WorkflowSignalOptions::default(),
522
+ )
523
+ .await
524
+ }
479
525
  })
480
526
  .collect();
481
527
  sends