@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,13 +1,10 @@
1
- use crate::{
2
- common::{CoreWfStarter, eventually},
3
- integ_tests::activity_functions::echo,
4
- };
1
+ use crate::common::{CoreWfStarter, activity_functions::StdActivities, eventually};
5
2
  use std::time::Duration;
6
- use temporalio_client::{NamespacedClient, WorkflowOptions, WorkflowService};
3
+ use temporalio_client::{NamespacedClient, WorkflowStartOptions, grpc::WorkflowService};
7
4
  use temporalio_common::{
8
5
  protos::{
9
6
  coresdk::{
10
- AsJsonPayloadExt, workflow_commands::CompleteWorkflowExecution, workflow_completion,
7
+ workflow_commands::CompleteWorkflowExecution, workflow_completion,
11
8
  workflow_completion::WorkflowActivationCompletion,
12
9
  },
13
10
  temporal::api::{
@@ -18,11 +15,10 @@ use temporalio_common::{
18
15
  },
19
16
  },
20
17
  },
21
- worker::{
22
- WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes, WorkerVersioningStrategy,
23
- },
18
+ worker::{WorkerDeploymentOptions, WorkerDeploymentVersion, WorkerTaskTypes},
24
19
  };
25
- use temporalio_sdk::{ActivityOptions, WfContext};
20
+ use temporalio_macros::{workflow, workflow_methods};
21
+ use temporalio_sdk::{ActivityOptions, WorkflowContext, WorkflowResult};
26
22
  use temporalio_sdk_core::test_help::WorkerTestHelpers;
27
23
  use tokio::join;
28
24
  use tonic::IntoRequest;
@@ -37,13 +33,12 @@ async fn sets_deployment_info_on_task_responses(#[values(true, false)] use_defau
37
33
  deployment_name: deploy_name.clone(),
38
34
  build_id: "1.0".to_string(),
39
35
  };
40
- starter.worker_config.versioning_strategy =
41
- WorkerVersioningStrategy::WorkerDeploymentBased(WorkerDeploymentOptions {
42
- version: version.clone(),
43
- use_worker_versioning: true,
44
- default_versioning_behavior: VersioningBehavior::AutoUpgrade.into(),
45
- });
46
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
36
+ starter.sdk_config.deployment_options = WorkerDeploymentOptions {
37
+ version: version.clone(),
38
+ use_worker_versioning: true,
39
+ default_versioning_behavior: VersioningBehavior::AutoUpgrade.into(),
40
+ };
41
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
47
42
  let core = starter.get_worker().await;
48
43
  let client = starter.get_client().await;
49
44
 
@@ -74,7 +69,7 @@ async fn sets_deployment_info_on_task_responses(#[values(true, false)] use_defau
74
69
  let desc_resp = eventually(
75
70
  async || {
76
71
  client
77
- .get_client()
72
+ .connection()
78
73
  .clone()
79
74
  .describe_worker_deployment(
80
75
  DescribeWorkerDeploymentRequest {
@@ -93,7 +88,7 @@ async fn sets_deployment_info_on_task_responses(#[values(true, false)] use_defau
93
88
 
94
89
  #[allow(deprecated)]
95
90
  client
96
- .get_client()
91
+ .connection()
97
92
  .clone()
98
93
  .set_worker_deployment_current_version(
99
94
  SetWorkerDeploymentCurrentVersionRequest {
@@ -150,28 +145,19 @@ async fn activity_has_deployment_stamp() {
150
145
  let wf_name = "activity_has_deployment_stamp";
151
146
  let mut starter = CoreWfStarter::new(wf_name);
152
147
  let deploy_name = format!("deployment-{}", starter.get_task_queue());
153
- starter.worker_config.versioning_strategy =
154
- WorkerVersioningStrategy::WorkerDeploymentBased(WorkerDeploymentOptions {
155
- version: WorkerDeploymentVersion {
156
- deployment_name: deploy_name.clone(),
157
- build_id: "1.0".to_string(),
158
- },
159
- use_worker_versioning: true,
160
- default_versioning_behavior: VersioningBehavior::AutoUpgrade.into(),
161
- });
148
+ starter.sdk_config.deployment_options = WorkerDeploymentOptions {
149
+ version: WorkerDeploymentVersion {
150
+ deployment_name: deploy_name.clone(),
151
+ build_id: "1.0".to_string(),
152
+ },
153
+ use_worker_versioning: true,
154
+ default_versioning_behavior: VersioningBehavior::AutoUpgrade.into(),
155
+ };
156
+ starter.sdk_config.register_activities(StdActivities);
162
157
  let mut worker = starter.worker().await;
163
158
  let client = starter.get_client().await;
164
- worker.register_wf(wf_name.to_owned(), |ctx: WfContext| async move {
165
- ctx.activity(ActivityOptions {
166
- activity_type: "echo_activity".to_string(),
167
- start_to_close_timeout: Some(Duration::from_secs(5)),
168
- input: "hi!".as_json_payload().expect("serializes fine"),
169
- ..Default::default()
170
- })
171
- .await;
172
- Ok(().into())
173
- });
174
- worker.register_activity("echo_activity", echo);
159
+
160
+ worker.register_workflow::<ActivityHasDeploymentStampWf>();
175
161
  let submitter = worker.get_submitter_handle();
176
162
  let shutdown_handle = worker.inner_mut().shutdown_handle();
177
163
 
@@ -179,7 +165,7 @@ async fn activity_has_deployment_stamp() {
179
165
  let desc_resp = eventually(
180
166
  async || {
181
167
  client
182
- .get_client()
168
+ .connection()
183
169
  .clone()
184
170
  .describe_worker_deployment(
185
171
  DescribeWorkerDeploymentRequest {
@@ -198,7 +184,7 @@ async fn activity_has_deployment_stamp() {
198
184
 
199
185
  #[allow(deprecated)]
200
186
  client
201
- .get_client()
187
+ .connection()
202
188
  .clone()
203
189
  .set_worker_deployment_current_version(
204
190
  SetWorkerDeploymentCurrentVersionRequest {
@@ -213,12 +199,13 @@ async fn activity_has_deployment_stamp() {
213
199
  .await
214
200
  .unwrap();
215
201
 
202
+ let task_queue = starter.get_task_queue().to_owned();
203
+ let workflow_id = starter.get_wf_id();
216
204
  submitter
217
205
  .submit_wf(
218
- starter.get_wf_id(),
219
206
  wf_name.to_owned(),
220
207
  vec![],
221
- WorkflowOptions::default(),
208
+ WorkflowStartOptions::new(task_queue, workflow_id).build(),
222
209
  )
223
210
  .await
224
211
  .unwrap();
@@ -246,3 +233,25 @@ async fn activity_has_deployment_stamp() {
246
233
  // TODO: Can't actually verify this at the moment as the deployment options are not transferred
247
234
  // to the event.
248
235
  }
236
+
237
+ #[workflow]
238
+ #[derive(Default)]
239
+ struct ActivityHasDeploymentStampWf;
240
+
241
+ #[workflow_methods]
242
+ impl ActivityHasDeploymentStampWf {
243
+ #[run(name = "activity_has_deployment_stamp")]
244
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
245
+ let _ = ctx
246
+ .start_activity(
247
+ StdActivities::echo,
248
+ "hi!".to_string(),
249
+ ActivityOptions {
250
+ start_to_close_timeout: Some(Duration::from_secs(5)),
251
+ ..Default::default()
252
+ },
253
+ )
254
+ .await;
255
+ Ok(())
256
+ }
257
+ }
@@ -0,0 +1,180 @@
1
+ use crate::common::{CoreWfStarter, eventually, rand_6_chars};
2
+ use futures::TryStreamExt;
3
+ use std::{collections::HashSet, time::Duration};
4
+ use temporalio_client::{
5
+ UntypedWorkflow, WorkflowCountOptions, WorkflowListOptions, WorkflowStartOptions,
6
+ WorkflowTerminateOptions, errors::WorkflowStartError,
7
+ };
8
+ use temporalio_common::{data_converters::RawValue, worker::WorkerTaskTypes};
9
+ use temporalio_macros::{workflow, workflow_methods};
10
+ use temporalio_sdk::{WorkflowContext, WorkflowResult};
11
+
12
+ #[workflow]
13
+ #[derive(Default)]
14
+ struct EmptyWorkflow;
15
+
16
+ #[workflow_methods]
17
+ impl EmptyWorkflow {
18
+ #[run]
19
+ async fn run(_ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
20
+ Ok(())
21
+ }
22
+ }
23
+
24
+ #[rstest::rstest]
25
+ #[case::no_limit(None)]
26
+ #[case::with_limit(Some(2))]
27
+ #[tokio::test]
28
+ async fn list_workflows(#[case] limit: Option<usize>) {
29
+ let test_name = "list_workflows_returns_started_workflows";
30
+ let mut starter = CoreWfStarter::new(test_name);
31
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
32
+ let client = starter.get_client().await;
33
+ let mut worker = starter.worker().await;
34
+ worker.register_workflow::<EmptyWorkflow>();
35
+
36
+ let suffix = rand_6_chars();
37
+ let num_workflows = 5;
38
+ let task_queue = starter.get_task_queue().to_owned();
39
+ let mut started_workflow_ids = Vec::new();
40
+ let mut expected_run_ids = Vec::new();
41
+
42
+ for i in 0..num_workflows {
43
+ let wf_id = format!("{test_name}_{suffix}_{i}");
44
+ started_workflow_ids.push(wf_id.clone());
45
+ let handle = worker
46
+ .submit_workflow(
47
+ EmptyWorkflow::run,
48
+ (),
49
+ WorkflowStartOptions::new(task_queue.clone(), wf_id).build(),
50
+ )
51
+ .await
52
+ .unwrap();
53
+ expected_run_ids.push(handle.info().run_id.clone());
54
+ }
55
+
56
+ worker.run_until_done().await.unwrap();
57
+
58
+ let results = eventually(
59
+ || {
60
+ let client = client.clone();
61
+ let expected_ids: HashSet<_> = started_workflow_ids.iter().cloned().collect();
62
+ let task_queue = task_queue.clone();
63
+ let expected_count = limit.unwrap_or(num_workflows);
64
+ async move {
65
+ let query = format!("TaskQueue = '{task_queue}'");
66
+ let opts = match limit {
67
+ Some(l) => WorkflowListOptions::builder().limit(l).build(),
68
+ None => WorkflowListOptions::default(),
69
+ };
70
+ let stream = client.list_workflows(query, opts);
71
+ let results: Vec<_> = stream.try_collect().await.expect("No errors");
72
+
73
+ if results.len() != expected_count {
74
+ return Err(format!(
75
+ "Expected {} workflows, got {}",
76
+ expected_count,
77
+ results.len()
78
+ ));
79
+ }
80
+
81
+ let found_ids: HashSet<_> = results.iter().map(|w| w.id().to_owned()).collect();
82
+ if !found_ids.is_subset(&expected_ids) {
83
+ return Err(format!(
84
+ "Found unexpected workflow IDs. Expected subset of: {:?}, Found: {:?}",
85
+ expected_ids, found_ids
86
+ ));
87
+ }
88
+
89
+ Ok(results)
90
+ }
91
+ },
92
+ Duration::from_secs(10),
93
+ )
94
+ .await
95
+ .unwrap();
96
+
97
+ // Verify accessor fields are populated
98
+ for wf in &results {
99
+ assert!(
100
+ started_workflow_ids.contains(&wf.id().to_owned()),
101
+ "Workflow ID {} not in started list",
102
+ wf.id()
103
+ );
104
+ assert!(!wf.run_id().is_empty(), "run_id should be populated");
105
+ assert_eq!(wf.task_queue(), task_queue, "task_queue mismatch");
106
+ assert!(wf.start_time().is_some(), "start_time should be populated");
107
+ assert!(
108
+ !wf.workflow_type().is_empty(),
109
+ "workflow_type should be populated"
110
+ );
111
+ }
112
+
113
+ // Verify count_workflows works too
114
+ let workflow_count = eventually(
115
+ || {
116
+ let client = client.clone();
117
+ let task_queue = task_queue.clone();
118
+ async move {
119
+ let query = format!("TaskQueue = '{task_queue}'");
120
+ let count = client
121
+ .count_workflows(&query, WorkflowCountOptions::default())
122
+ .await
123
+ .unwrap();
124
+ if count.count() != num_workflows {
125
+ return Err(format!(
126
+ "Expected {} workflows, got {}",
127
+ num_workflows,
128
+ count.count()
129
+ ));
130
+ }
131
+ Ok(count.count())
132
+ }
133
+ },
134
+ Duration::from_secs(10),
135
+ )
136
+ .await
137
+ .unwrap();
138
+ assert!(workflow_count == num_workflows);
139
+ }
140
+
141
+ #[tokio::test]
142
+ async fn already_started_error_contains_run_id() {
143
+ let test_name = "already_started_error_contains_run_id";
144
+ let mut starter = CoreWfStarter::new(test_name);
145
+ let client = starter.get_client().await;
146
+ let task_queue = starter.get_task_queue().to_owned();
147
+ let wf_id = format!("{test_name}_{}", rand_6_chars());
148
+
149
+ let handle = client
150
+ .start_workflow(
151
+ UntypedWorkflow::new(test_name),
152
+ RawValue::empty(),
153
+ WorkflowStartOptions::new(task_queue.clone(), wf_id.clone()).build(),
154
+ )
155
+ .await
156
+ .unwrap();
157
+ let first_run_id = handle.run_id().unwrap().to_string();
158
+
159
+ let err = client
160
+ .start_workflow(
161
+ UntypedWorkflow::new(test_name),
162
+ RawValue::empty(),
163
+ WorkflowStartOptions::new(task_queue, wf_id).build(),
164
+ )
165
+ .await
166
+ .err()
167
+ .expect("duplicate wfid should error");
168
+
169
+ match err {
170
+ WorkflowStartError::AlreadyStarted { run_id, .. } => {
171
+ assert_eq!(run_id.as_deref(), Some(first_run_id.as_str()));
172
+ }
173
+ other => panic!("Expected AlreadyStarted, got: {other}"),
174
+ }
175
+
176
+ handle
177
+ .terminate(WorkflowTerminateOptions::default())
178
+ .await
179
+ .unwrap();
180
+ }