@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
@@ -1,8 +1,8 @@
1
1
  mod activities;
2
- mod appdata_propagation;
3
2
  mod cancel_external;
4
3
  mod cancel_wf;
5
4
  mod child_workflows;
5
+ mod client_interactions;
6
6
  mod continue_as_new;
7
7
  mod determinism;
8
8
  mod eager;
@@ -11,6 +11,7 @@ mod modify_wf_properties;
11
11
  mod nexus;
12
12
  mod patches;
13
13
  mod priority;
14
+ mod queries;
14
15
  mod replay;
15
16
  mod resets;
16
17
  mod signals;
@@ -20,26 +21,30 @@ mod upsert_search_attrs;
20
21
 
21
22
  use crate::{
22
23
  common::{
23
- CoreWfStarter, get_integ_runtime_options, history_from_proto_binary,
24
- init_core_and_create_wf, init_core_replay_preloaded, mock_sdk_cfg, prom_metrics,
24
+ CoreWfStarter, activity_functions::StdActivities, get_integ_runtime_options,
25
+ history_from_proto_binary, init_core_and_create_wf, init_core_replay_preloaded,
26
+ mock_sdk_cfg, prom_metrics,
25
27
  },
26
- integ_tests::{activity_functions::echo, metrics_tests},
28
+ integ_tests::metrics_tests,
27
29
  };
28
30
  use assert_matches::assert_matches;
29
31
  use std::{
30
32
  collections::{HashMap, HashSet},
33
+ sync::Arc,
31
34
  time::Duration,
32
35
  };
33
36
  use temporalio_client::{
34
- WfClientExt, WorkflowClientTrait, WorkflowExecutionResult, WorkflowOptions,
37
+ NamespacedClient, UntypedQuery, UntypedSignal, UntypedWorkflow, WorkflowExecutionInfo,
38
+ WorkflowQueryOptions, WorkflowSignalOptions, WorkflowStartOptions,
39
+ errors::WorkflowGetResultError, grpc::WorkflowService,
35
40
  };
36
41
  use temporalio_common::{
37
- errors::{PollError, WorkflowErrorType},
42
+ data_converters::RawValue,
38
43
  prost_dur,
39
44
  protos::{
40
45
  DEFAULT_WORKFLOW_TYPE, canned_histories,
41
46
  coresdk::{
42
- ActivityTaskCompletion, AsJsonPayloadExt, IntoCompletion,
47
+ ActivityTaskCompletion, IntoCompletion,
43
48
  activity_result::ActivityExecutionResult,
44
49
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
45
50
  workflow_commands::{
@@ -49,48 +54,59 @@ use temporalio_common::{
49
54
  workflow_completion::WorkflowActivationCompletion,
50
55
  },
51
56
  temporal::api::{
57
+ common::v1::WorkflowExecution,
52
58
  enums::v1::{CommandType, EventType},
53
59
  failure::v1::Failure,
54
60
  history::v1::history_event,
55
- query::v1::WorkflowQuery,
56
61
  sdk::v1::UserMetadata,
62
+ workflowservice::v1::ResetStickyTaskQueueRequest,
57
63
  },
58
64
  test_utils::schedule_activity_cmd,
59
65
  },
60
- worker::{
61
- PollerBehavior, WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes,
62
- WorkerVersioningStrategy,
63
- },
66
+ worker::{WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes},
64
67
  };
68
+ use temporalio_macros::{workflow, workflow_methods};
65
69
  use temporalio_sdk::{
66
- ActivityOptions, LocalActivityOptions, TimerOptions, WfContext, interceptors::WorkerInterceptor,
70
+ ActivityOptions, LocalActivityOptions, TimerOptions, WorkflowContext, WorkflowResult,
71
+ interceptors::WorkerInterceptor,
67
72
  };
68
73
  use temporalio_sdk_core::{
69
- CoreRuntime,
74
+ CoreRuntime, PollError, PollerBehavior, TunerHolder, WorkflowErrorType,
70
75
  replay::HistoryForReplay,
71
76
  test_help::{MockPollCfg, WorkerTestHelpers, drain_pollers_and_shutdown},
72
77
  };
73
78
  use tokio::{join, sync::Notify, time::sleep};
79
+ use tonic::IntoRequest;
74
80
  // TODO: We should get expected histories for these tests and confirm that the history at the end
75
81
  // matches.
76
82
 
83
+ #[workflow]
84
+ #[derive(Default)]
85
+ struct ParallelWorkflowsWf;
86
+
87
+ #[workflow_methods]
88
+ impl ParallelWorkflowsWf {
89
+ #[run]
90
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
91
+ ctx.timer(Duration::from_secs(1)).await;
92
+ Ok(())
93
+ }
94
+ }
95
+
77
96
  #[tokio::test]
78
97
  async fn parallel_workflows_same_queue() {
79
98
  let wf_name = "parallel_workflows_same_queue";
80
99
  let mut starter = CoreWfStarter::new(wf_name);
81
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
100
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
82
101
  let mut core = starter.worker().await;
83
102
 
84
- core.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
85
- ctx.timer(Duration::from_secs(1)).await;
86
- Ok(().into())
87
- });
103
+ core.register_workflow::<ParallelWorkflowsWf>();
104
+ let task_queue = starter.get_task_queue().to_owned();
88
105
  for i in 0..25 {
89
- core.submit_wf(
90
- format!("{wf_name}-{i}"),
91
- wf_name,
92
- vec![],
93
- starter.workflow_options.clone(),
106
+ core.submit_workflow(
107
+ ParallelWorkflowsWf::run,
108
+ (),
109
+ WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}-{i}")).build(),
94
110
  )
95
111
  .await
96
112
  .unwrap();
@@ -139,7 +155,7 @@ async fn fail_wf_task(#[values(true, false)] replay: bool) {
139
155
  attrs.first_execution_run_id = "run2".to_string();
140
156
  }
141
157
  let hist2 = HistoryForReplay::new(hist_proto, "fake".to_string());
142
- init_core_replay_preloaded("fail_wf_task", [hist, hist2])
158
+ Arc::new(init_core_replay_preloaded("fail_wf_task", [hist, hist2]))
143
159
  } else {
144
160
  let mut starter = init_core_and_create_wf("fail_wf_task").await;
145
161
  starter.get_worker().await
@@ -223,23 +239,26 @@ async fn signal_workflow() {
223
239
  .unwrap();
224
240
 
225
241
  // Send the signals to the server
226
- client
227
- .signal_workflow_execution(
228
- workflow_id.to_string(),
229
- res.run_id.to_string(),
230
- signal_id_1.to_string(),
231
- None,
232
- None,
242
+ let handle = WorkflowExecutionInfo {
243
+ namespace: client.namespace(),
244
+ workflow_id: workflow_id.clone(),
245
+ run_id: Some(res.run_id.clone()),
246
+ first_execution_run_id: None,
247
+ }
248
+ .bind_untyped(client.clone());
249
+ handle
250
+ .signal(
251
+ UntypedSignal::new(signal_id_1),
252
+ RawValue::empty(),
253
+ WorkflowSignalOptions::default(),
233
254
  )
234
255
  .await
235
256
  .unwrap();
236
- client
237
- .signal_workflow_execution(
238
- workflow_id.to_string(),
239
- res.run_id.to_string(),
240
- signal_id_2.to_string(),
241
- None,
242
- None,
257
+ handle
258
+ .signal(
259
+ UntypedSignal::new(signal_id_2),
260
+ RawValue::empty(),
261
+ WorkflowSignalOptions::default(),
243
262
  )
244
263
  .await
245
264
  .unwrap();
@@ -320,18 +339,21 @@ async fn signal_workflow_signal_not_handled_on_workflow_completion() {
320
339
  let run_id = res.run_id.clone();
321
340
 
322
341
  // Send the signal to the server
323
- starter
324
- .get_client()
325
- .await
326
- .signal_workflow_execution(
327
- workflow_id.clone(),
328
- res.run_id.to_string(),
329
- signal_id_1.to_string(),
330
- None,
331
- None,
332
- )
333
- .await
334
- .unwrap();
342
+ let sig_client = starter.get_client().await;
343
+ WorkflowExecutionInfo {
344
+ namespace: sig_client.namespace(),
345
+ workflow_id: workflow_id.clone(),
346
+ run_id: Some(res.run_id.clone()),
347
+ first_execution_run_id: None,
348
+ }
349
+ .bind_untyped(sig_client.clone())
350
+ .signal(
351
+ UntypedSignal::new(signal_id_1),
352
+ RawValue::empty(),
353
+ WorkflowSignalOptions::default(),
354
+ )
355
+ .await
356
+ .unwrap();
335
357
 
336
358
  // Send completion - not having seen a poll response with a signal in it yet (unhandled
337
359
  // command error will be logged as a warning and an eviction will be issued)
@@ -365,9 +387,9 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
365
387
  let signal_at_complete = "at-complete";
366
388
  let mut wf_starter = CoreWfStarter::new("wft_timeout_doesnt_create_unsolvable_autocomplete");
367
389
  // Test needs eviction on and a short timeout
368
- wf_starter.worker_config.max_cached_workflows = 0_usize;
369
- wf_starter.worker_config.max_outstanding_workflow_tasks = Some(1_usize);
370
- wf_starter.worker_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(1_usize);
390
+ wf_starter.sdk_config.max_cached_workflows = 0_usize;
391
+ wf_starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(1, 1, 1, 1));
392
+ wf_starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(1_usize);
371
393
  wf_starter.workflow_options.task_timeout = Some(Duration::from_secs(1));
372
394
  let core = wf_starter.get_worker().await;
373
395
  let client = wf_starter.get_client().await;
@@ -399,16 +421,20 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
399
421
  // Before polling for a task again, we start and complete the activity and send the
400
422
  // corresponding signals.
401
423
  let ac_task = core.poll_activity_task().await.unwrap();
402
- let rid = wf_task.run_id.clone();
424
+ let handle = WorkflowExecutionInfo {
425
+ namespace: client.namespace(),
426
+ workflow_id: wf_id.to_string(),
427
+ run_id: Some(wf_task.run_id.clone()),
428
+ first_execution_run_id: None,
429
+ }
430
+ .bind_untyped(client.clone());
403
431
  // Send the signals to the server & resolve activity -- sometimes this happens too fast
404
432
  sleep(Duration::from_millis(200)).await;
405
- client
406
- .signal_workflow_execution(
407
- wf_id.to_string(),
408
- rid,
409
- signal_at_start.to_string(),
410
- None,
411
- None,
433
+ handle
434
+ .signal(
435
+ UntypedSignal::new(signal_at_start),
436
+ RawValue::empty(),
437
+ WorkflowSignalOptions::default(),
412
438
  )
413
439
  .await
414
440
  .unwrap();
@@ -419,14 +445,11 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
419
445
  })
420
446
  .await
421
447
  .unwrap();
422
- let rid = wf_task.run_id.clone();
423
- client
424
- .signal_workflow_execution(
425
- wf_id.to_string(),
426
- rid,
427
- signal_at_complete.to_string(),
428
- None,
429
- None,
448
+ handle
449
+ .signal(
450
+ UntypedSignal::new(signal_at_complete),
451
+ RawValue::empty(),
452
+ WorkflowSignalOptions::default(),
430
453
  )
431
454
  .await
432
455
  .unwrap();
@@ -469,34 +492,49 @@ async fn wft_timeout_doesnt_create_unsolvable_autocomplete() {
469
492
  /// overflow. This test intentionally makes completes slower than polls to evaluate that.
470
493
  ///
471
494
  /// It's expected that this test may generate some task timeouts.
495
+ #[workflow]
496
+ #[derive(Default)]
497
+ struct SlowCompletesWf;
498
+
499
+ #[workflow_methods]
500
+ impl SlowCompletesWf {
501
+ #[run]
502
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
503
+ for _ in 0..3 {
504
+ ctx.start_activity(
505
+ StdActivities::echo,
506
+ "hi!".to_string(),
507
+ ActivityOptions {
508
+ start_to_close_timeout: Some(Duration::from_secs(5)),
509
+ ..Default::default()
510
+ },
511
+ )
512
+ .await
513
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
514
+ ctx.timer(Duration::from_secs(1)).await;
515
+ }
516
+ Ok(())
517
+ }
518
+ }
519
+
472
520
  #[tokio::test]
473
521
  async fn slow_completes_with_small_cache() {
474
522
  let wf_name = "slow_completes_with_small_cache";
475
523
  let mut starter = CoreWfStarter::new(wf_name);
476
- starter.worker_config.max_outstanding_workflow_tasks = Some(5_usize);
477
- starter.worker_config.max_cached_workflows = 5_usize;
524
+ starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(5, 10, 1, 1));
525
+ starter.sdk_config.max_cached_workflows = 5_usize;
478
526
  let mut worker = starter.worker().await;
479
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
480
- for _ in 0..3 {
481
- ctx.activity(ActivityOptions {
482
- activity_type: "echo_activity".to_string(),
483
- start_to_close_timeout: Some(Duration::from_secs(5)),
484
- input: "hi!".as_json_payload().expect("serializes fine"),
485
- ..Default::default()
486
- })
487
- .await;
488
- ctx.timer(Duration::from_secs(1)).await;
489
- }
490
- Ok(().into())
491
- });
492
- worker.register_activity("echo_activity", echo);
527
+
528
+ worker.register_activities(StdActivities);
529
+
530
+ worker.register_workflow::<SlowCompletesWf>();
531
+ let task_queue = starter.get_task_queue().to_owned();
493
532
  for i in 0..20 {
494
533
  worker
495
- .submit_wf(
496
- format!("{wf_name}_{i}"),
497
- wf_name.to_owned(),
498
- vec![],
499
- WorkflowOptions::default(),
534
+ .submit_workflow(
535
+ SlowCompletesWf::run,
536
+ (),
537
+ WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}_{i}")).build(),
500
538
  )
501
539
  .await
502
540
  .unwrap();
@@ -522,22 +560,26 @@ async fn slow_completes_with_small_cache() {
522
560
  async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_build_id: bool) {
523
561
  let wf_type = "deployment_version_correct_in_wf_info";
524
562
  let mut starter = CoreWfStarter::new(wf_type);
525
- let version_strat = if use_only_build_id {
526
- WorkerVersioningStrategy::None {
527
- build_id: "1.0".to_owned(),
563
+ starter.sdk_config.deployment_options = if use_only_build_id {
564
+ WorkerDeploymentOptions {
565
+ version: WorkerDeploymentVersion {
566
+ deployment_name: "".to_string(),
567
+ build_id: "1.0".to_string(),
568
+ },
569
+ use_worker_versioning: false,
570
+ default_versioning_behavior: None,
528
571
  }
529
572
  } else {
530
- WorkerVersioningStrategy::WorkerDeploymentBased(WorkerDeploymentOptions {
573
+ WorkerDeploymentOptions {
531
574
  version: WorkerDeploymentVersion {
532
575
  deployment_name: "deployment-1".to_string(),
533
576
  build_id: "1.0".to_string(),
534
577
  },
535
578
  use_worker_versioning: false,
536
579
  default_versioning_behavior: None,
537
- })
580
+ }
538
581
  };
539
- starter.worker_config.versioning_strategy = version_strat;
540
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
582
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
541
583
  let core = starter.get_worker().await;
542
584
  starter.start_wf().await;
543
585
  let client = starter.get_client().await;
@@ -567,15 +609,19 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
567
609
  .unwrap();
568
610
 
569
611
  // Ensure a query on first wft also sees the correct id
612
+ let query_handle = WorkflowExecutionInfo {
613
+ namespace: client.namespace(),
614
+ workflow_id: workflow_id.clone(),
615
+ run_id: Some(res.run_id.clone()),
616
+ first_execution_run_id: None,
617
+ }
618
+ .bind_untyped(client.clone());
570
619
  let query_fut = async {
571
- client
572
- .query_workflow_execution(
573
- workflow_id.clone(),
574
- res.run_id.to_string(),
575
- WorkflowQuery {
576
- query_type: "q1".to_string(),
577
- ..Default::default()
578
- },
620
+ query_handle
621
+ .query(
622
+ UntypedQuery::new("q1"),
623
+ RawValue::empty(),
624
+ WorkflowQueryOptions::default(),
579
625
  )
580
626
  .await
581
627
  .unwrap()
@@ -621,39 +667,49 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
621
667
  };
622
668
  join!(query_fut, complete_fut);
623
669
  starter.shutdown().await;
624
- client
625
- .reset_sticky_task_queue(workflow_id.clone(), "".to_string())
626
- .await
627
- .unwrap();
670
+ WorkflowService::reset_sticky_task_queue(
671
+ &mut client.clone(),
672
+ ResetStickyTaskQueueRequest {
673
+ namespace: client.namespace(),
674
+ execution: Some(WorkflowExecution {
675
+ workflow_id: workflow_id.clone(),
676
+ run_id: "".to_string(),
677
+ }),
678
+ }
679
+ .into_request(),
680
+ )
681
+ .await
682
+ .unwrap();
628
683
 
629
684
  let mut starter = starter.clone_no_worker();
630
- let version_strat = if use_only_build_id {
631
- WorkerVersioningStrategy::None {
632
- build_id: "2.0".to_owned(),
685
+ starter.sdk_config.deployment_options = if use_only_build_id {
686
+ WorkerDeploymentOptions {
687
+ version: WorkerDeploymentVersion {
688
+ deployment_name: "".to_string(),
689
+ build_id: "2.0".to_string(),
690
+ },
691
+ use_worker_versioning: false,
692
+ default_versioning_behavior: None,
633
693
  }
634
694
  } else {
635
- WorkerVersioningStrategy::WorkerDeploymentBased(WorkerDeploymentOptions {
695
+ WorkerDeploymentOptions {
636
696
  version: WorkerDeploymentVersion {
637
697
  deployment_name: "deployment-1".to_string(),
638
698
  build_id: "2.0".to_string(),
639
699
  },
640
700
  use_worker_versioning: false,
641
701
  default_versioning_behavior: None,
642
- })
702
+ }
643
703
  };
644
- starter.worker_config.versioning_strategy = version_strat;
645
704
 
646
705
  let core = starter.get_worker().await;
647
706
 
648
707
  let query_fut = async {
649
- client
650
- .query_workflow_execution(
651
- workflow_id.clone(),
652
- res.run_id.to_string(),
653
- WorkflowQuery {
654
- query_type: "q2".to_string(),
655
- ..Default::default()
656
- },
708
+ query_handle
709
+ .query(
710
+ UntypedQuery::new("q2"),
711
+ RawValue::empty(),
712
+ WorkflowQueryOptions::default(),
657
713
  )
658
714
  .await
659
715
  .unwrap()
@@ -722,12 +778,11 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
722
778
  join!(query_fut, complete_fut);
723
779
 
724
780
  client
725
- .signal_workflow_execution(
726
- workflow_id.clone(),
727
- "".to_string(),
728
- "whatever".to_string(),
729
- None,
730
- None,
781
+ .get_workflow_handle::<UntypedWorkflow>(&workflow_id)
782
+ .signal(
783
+ UntypedSignal::new("whatever"),
784
+ RawValue::empty(),
785
+ WorkflowSignalOptions::default(),
731
786
  )
732
787
  .await
733
788
  .unwrap();
@@ -751,6 +806,8 @@ async fn deployment_version_correct_in_wf_info(#[values(true, false)] use_only_b
751
806
  core.complete_execution(&res.run_id).await;
752
807
  }
753
808
 
809
+ const NONDETERMINISM_WF_NAME: &str = "nondeterminism_errors_fail_workflow_when_configured_to";
810
+
754
811
  #[rstest::rstest]
755
812
  #[tokio::test]
756
813
  async fn nondeterminism_errors_fail_workflow_when_configured_to(
@@ -758,26 +815,36 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
758
815
  ) {
759
816
  let (telemopts, addr, _aborter) = prom_metrics(None);
760
817
  let rt = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
761
- let wf_name = "nondeterminism_errors_fail_workflow_when_configured_to";
818
+ let wf_name = NONDETERMINISM_WF_NAME;
762
819
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, rt);
763
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
820
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
764
821
  let typeset = HashSet::from([WorkflowErrorType::Nondeterminism]);
765
822
  if whole_worker {
766
- starter.worker_config.workflow_failure_errors = typeset;
823
+ starter.sdk_config.workflow_failure_errors = typeset;
767
824
  } else {
768
- starter.worker_config.workflow_types_to_failure_errors =
825
+ starter.sdk_config.workflow_types_to_failure_errors =
769
826
  HashMap::from([(wf_name.to_owned(), typeset)]);
770
827
  }
771
828
  let wf_id = starter.get_task_queue().to_owned();
772
829
  let mut worker = starter.worker().await;
773
830
  worker.fetch_results = false;
774
831
 
775
- worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
776
- ctx.timer(Duration::from_secs(1000)).await;
777
- Ok(().into())
778
- });
832
+ #[workflow]
833
+ #[derive(Default)]
834
+ struct NondeterminismTimerWf;
835
+
836
+ #[workflow_methods]
837
+ impl NondeterminismTimerWf {
838
+ #[run(name = NONDETERMINISM_WF_NAME)]
839
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
840
+ ctx.timer(Duration::from_secs(1000)).await;
841
+ Ok(())
842
+ }
843
+ }
844
+
845
+ worker.register_workflow::<NondeterminismTimerWf>();
779
846
  let client = starter.get_client().await;
780
- let core_worker = worker.core_worker.clone();
847
+ let core_worker = worker.core_worker();
781
848
  starter.start_with_worker(wf_name, &mut worker).await;
782
849
 
783
850
  let stopper = async {
@@ -802,23 +869,53 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
802
869
 
803
870
  // Restart the worker with a new, incompatible wf definition which will cause nondeterminism
804
871
  let mut starter = starter.clone_no_worker();
872
+ starter.sdk_config.register_activities(StdActivities);
805
873
  let mut worker = starter.worker().await;
806
- worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
807
- ctx.activity(ActivityOptions {
808
- activity_type: "echo_activity".to_string(),
809
- start_to_close_timeout: Some(Duration::from_secs(5)),
810
- ..Default::default()
811
- })
812
- .await;
813
- Ok(().into())
814
- });
874
+
875
+ #[workflow]
876
+ #[derive(Default)]
877
+ struct NondeterminismActivityWf;
878
+
879
+ #[workflow_methods]
880
+ impl NondeterminismActivityWf {
881
+ #[run(name = NONDETERMINISM_WF_NAME)]
882
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
883
+ ctx.start_activity(
884
+ StdActivities::echo,
885
+ "hi".to_owned(),
886
+ ActivityOptions {
887
+ start_to_close_timeout: Some(Duration::from_secs(5)),
888
+ ..Default::default()
889
+ },
890
+ )
891
+ .await
892
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
893
+ Ok(())
894
+ }
895
+ }
896
+
897
+ worker.register_workflow::<NondeterminismActivityWf>();
815
898
  // We need to generate a task so that we'll encounter the error (first avoid WFT timeout)
899
+ WorkflowService::reset_sticky_task_queue(
900
+ &mut client.clone(),
901
+ ResetStickyTaskQueueRequest {
902
+ namespace: client.namespace(),
903
+ execution: Some(WorkflowExecution {
904
+ workflow_id: wf_id.clone(),
905
+ run_id: "".to_string(),
906
+ }),
907
+ }
908
+ .into_request(),
909
+ )
910
+ .await
911
+ .unwrap();
816
912
  client
817
- .reset_sticky_task_queue(wf_id.clone(), "".to_string())
818
- .await
819
- .unwrap();
820
- client
821
- .signal_workflow_execution(wf_id.clone(), "".to_string(), "hi".to_string(), None, None)
913
+ .get_workflow_handle::<UntypedWorkflow>(&wf_id)
914
+ .signal(
915
+ UntypedSignal::new("hi"),
916
+ RawValue::empty(),
917
+ WorkflowSignalOptions::default(),
918
+ )
822
919
  .await
823
920
  .unwrap();
824
921
  worker.expect_workflow_completion(&wf_id, None);
@@ -834,70 +931,105 @@ async fn nondeterminism_errors_fail_workflow_when_configured_to(
834
931
  assert!(body.contains(&match_this));
835
932
  }
836
933
 
934
+ const HISTORY_OUT_OF_ORDER_WF_NAME: &str = "history_out_of_order_on_restart";
935
+
837
936
  #[tokio::test]
838
937
  async fn history_out_of_order_on_restart() {
839
- let wf_name = "history_out_of_order_on_restart";
938
+ let wf_name = HISTORY_OUT_OF_ORDER_WF_NAME;
840
939
  let mut starter = CoreWfStarter::new(wf_name);
841
- starter.worker_config.workflow_failure_errors =
842
- HashSet::from([WorkflowErrorType::Nondeterminism]);
940
+ starter.sdk_config.workflow_failure_errors = HashSet::from([WorkflowErrorType::Nondeterminism]);
843
941
  let mut worker = starter.worker().await;
844
942
  let mut starter2 = starter.clone_no_worker();
845
943
  let mut worker2 = starter2.worker().await;
846
944
 
847
- static HIT_SLEEP: Notify = Notify::const_new();
945
+ let hit_sleep = Arc::new(Notify::new());
946
+ let hit_sleep_clone1 = hit_sleep.clone();
947
+ let hit_sleep_clone2 = hit_sleep.clone();
848
948
 
849
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
850
- ctx.local_activity(LocalActivityOptions {
851
- activity_type: "echo".to_owned(),
852
- input: "hi".as_json_payload().unwrap(),
853
- start_to_close_timeout: Some(Duration::from_secs(5)),
854
- ..Default::default()
855
- })
856
- .await;
857
- ctx.activity(ActivityOptions {
858
- activity_type: "echo".to_owned(),
859
- input: "hi".as_json_payload().unwrap(),
860
- start_to_close_timeout: Some(Duration::from_secs(5)),
861
- ..Default::default()
862
- })
863
- .await;
864
- // Interrupt this sleep on first go
865
- HIT_SLEEP.notify_one();
866
- ctx.timer(Duration::from_secs(5)).await;
867
- Ok(().into())
868
- });
869
- worker.register_activity("echo", echo);
870
-
871
- worker2.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
872
- ctx.local_activity(LocalActivityOptions {
873
- activity_type: "echo".to_owned(),
874
- input: "hi".as_json_payload().unwrap(),
875
- start_to_close_timeout: Some(Duration::from_secs(5)),
876
- ..Default::default()
877
- })
878
- .await;
879
- // Timer is added after restarting workflow
880
- ctx.timer(Duration::from_secs(1)).await;
881
- ctx.activity(ActivityOptions {
882
- activity_type: "echo".to_owned(),
883
- input: "hi".as_json_payload().unwrap(),
884
- start_to_close_timeout: Some(Duration::from_secs(5)),
885
- ..Default::default()
886
- })
887
- .await;
888
- ctx.timer(Duration::from_secs(2)).await;
889
- Ok(().into())
949
+ #[workflow]
950
+ struct HistoryOutOfOrderWf1 {
951
+ hit_sleep: Arc<Notify>,
952
+ }
953
+
954
+ #[workflow_methods(factory_only)]
955
+ impl HistoryOutOfOrderWf1 {
956
+ #[run(name = HISTORY_OUT_OF_ORDER_WF_NAME)]
957
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
958
+ ctx.start_local_activity(
959
+ StdActivities::echo,
960
+ "hi".to_string(),
961
+ LocalActivityOptions {
962
+ start_to_close_timeout: Some(Duration::from_secs(5)),
963
+ ..Default::default()
964
+ },
965
+ )
966
+ .await
967
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
968
+ ctx.start_activity(
969
+ StdActivities::echo,
970
+ "hi".to_string(),
971
+ ActivityOptions {
972
+ start_to_close_timeout: Some(Duration::from_secs(5)),
973
+ ..Default::default()
974
+ },
975
+ )
976
+ .await
977
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
978
+ ctx.state(|wf| wf.hit_sleep.notify_one());
979
+ ctx.timer(Duration::from_secs(5)).await;
980
+ Ok(())
981
+ }
982
+ }
983
+
984
+ #[workflow]
985
+ #[derive(Default)]
986
+ struct HistoryOutOfOrderWf2;
987
+
988
+ #[workflow_methods]
989
+ impl HistoryOutOfOrderWf2 {
990
+ #[run(name = HISTORY_OUT_OF_ORDER_WF_NAME)]
991
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
992
+ ctx.start_local_activity(
993
+ StdActivities::echo,
994
+ "hi".to_string(),
995
+ LocalActivityOptions {
996
+ start_to_close_timeout: Some(Duration::from_secs(5)),
997
+ ..Default::default()
998
+ },
999
+ )
1000
+ .await
1001
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
1002
+ // Timer is added after restarting workflow
1003
+ ctx.timer(Duration::from_secs(1)).await;
1004
+ ctx.start_activity(
1005
+ StdActivities::echo,
1006
+ "hi".to_string(),
1007
+ ActivityOptions {
1008
+ start_to_close_timeout: Some(Duration::from_secs(5)),
1009
+ ..Default::default()
1010
+ },
1011
+ )
1012
+ .await
1013
+ .map_err(|e| anyhow::anyhow!("{e}"))?;
1014
+ ctx.timer(Duration::from_secs(2)).await;
1015
+ Ok(())
1016
+ }
1017
+ }
1018
+
1019
+ worker.register_activities(StdActivities);
1020
+ worker2.register_activities(StdActivities);
1021
+ worker.register_workflow_with_factory(move || HistoryOutOfOrderWf1 {
1022
+ hit_sleep: hit_sleep_clone1.clone(),
890
1023
  });
891
- worker2.register_activity("echo", echo);
1024
+ worker2.register_workflow::<HistoryOutOfOrderWf2>();
1025
+ let task_queue = starter.get_task_queue().to_owned();
892
1026
  worker
893
- .submit_wf(
894
- wf_name.to_owned(),
895
- wf_name.to_owned(),
896
- vec![],
897
- WorkflowOptions {
898
- execution_timeout: Some(Duration::from_secs(20)),
899
- ..Default::default()
900
- },
1027
+ .submit_workflow(
1028
+ HistoryOutOfOrderWf1::run,
1029
+ (),
1030
+ WorkflowStartOptions::new(task_queue, wf_name.to_owned())
1031
+ .execution_timeout(Duration::from_secs(20))
1032
+ .build(),
901
1033
  )
902
1034
  .await
903
1035
  .unwrap();
@@ -907,7 +1039,7 @@ async fn history_out_of_order_on_restart() {
907
1039
  };
908
1040
  let w2 = async {
909
1041
  // wait to hit sleep
910
- HIT_SLEEP.notified().await;
1042
+ hit_sleep_clone2.notified().await;
911
1043
  starter.shutdown().await;
912
1044
  // start new worker
913
1045
  worker2.expect_workflow_completion(wf_name, None);
@@ -918,12 +1050,9 @@ async fn history_out_of_order_on_restart() {
918
1050
  let handle = starter
919
1051
  .get_client()
920
1052
  .await
921
- .get_untyped_workflow_handle(wf_name, "");
922
- let res = handle
923
- .get_workflow_result(Default::default())
924
- .await
925
- .unwrap();
926
- assert_matches!(res, WorkflowExecutionResult::Failed(_));
1053
+ .get_workflow_handle::<UntypedWorkflow>(wf_name);
1054
+ let res = handle.get_result(Default::default()).await;
1055
+ assert_matches!(res, Err(WorkflowGetResultError::Failed(_)));
927
1056
  }
928
1057
 
929
1058
  #[tokio::test]
@@ -931,7 +1060,6 @@ async fn pass_timer_summary_to_metadata() {
931
1060
  let t = canned_histories::single_timer("1");
932
1061
  let mut mock_cfg = MockPollCfg::from_hist_builder(t);
933
1062
  let wf_id = mock_cfg.hists[0].wf_id.clone();
934
- let wf_type = DEFAULT_WORKFLOW_TYPE;
935
1063
  let expected_user_metadata = Some(UserMetadata {
936
1064
  summary: Some(b"timer summary".into()),
937
1065
  details: None,
@@ -952,21 +1080,30 @@ async fn pass_timer_summary_to_metadata() {
952
1080
  });
953
1081
  });
954
1082
 
1083
+ #[workflow]
1084
+ #[derive(Default)]
1085
+ struct PassTimerSummaryWf;
1086
+
1087
+ #[workflow_methods]
1088
+ impl PassTimerSummaryWf {
1089
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
1090
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
1091
+ ctx.timer(TimerOptions {
1092
+ duration: Duration::from_secs(1),
1093
+ summary: Some("timer summary".to_string()),
1094
+ })
1095
+ .await;
1096
+ Ok(())
1097
+ }
1098
+ }
1099
+
955
1100
  let mut worker = mock_sdk_cfg(mock_cfg, |_| {});
956
- worker.register_wf(wf_type, |ctx: WfContext| async move {
957
- ctx.timer(TimerOptions {
958
- duration: Duration::from_secs(1),
959
- summary: Some("timer summary".to_string()),
960
- })
961
- .await;
962
- Ok(().into())
963
- });
1101
+ worker.register_workflow::<PassTimerSummaryWf>();
964
1102
  worker
965
1103
  .submit_wf(
966
- wf_id.to_owned(),
967
- wf_type.to_owned(),
1104
+ DEFAULT_WORKFLOW_TYPE.to_owned(),
968
1105
  vec![],
969
- WorkflowOptions::default(),
1106
+ WorkflowStartOptions::new("fake_tq".to_owned(), wf_id.to_owned()).build(),
970
1107
  )
971
1108
  .await
972
1109
  .unwrap();