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