@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,11 +1,10 @@
1
1
  use crate::common::{ActivationAssertionsInterceptor, CoreWfStarter, build_fake_sdk};
2
- use futures_util::StreamExt;
3
2
  use std::collections::HashMap;
4
- use temporalio_client::{SignalWithStartOptions, WorkflowClientTrait, WorkflowOptions};
3
+ use temporalio_client::{WorkflowStartOptions, WorkflowStartSignal};
5
4
  use temporalio_common::protos::{
6
5
  DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder,
7
6
  coresdk::{
8
- IntoPayloadsExt,
7
+ AsJsonPayloadExt, IntoPayloadsExt,
9
8
  workflow_activation::{
10
9
  ResolveSignalExternalWorkflow, WorkflowActivationJob, workflow_activation_job,
11
10
  },
@@ -18,9 +17,10 @@ use temporalio_common::protos::{
18
17
  };
19
18
 
20
19
  use temporalio_common::worker::WorkerTaskTypes;
20
+ use temporalio_macros::{workflow, workflow_methods};
21
21
  use temporalio_sdk::{
22
- CancellableFuture, ChildWorkflowOptions, Signal, SignalWorkflowOptions, WfContext,
23
- WorkflowResult,
22
+ CancellableFuture, ChildWorkflowOptions, Signal, SignalWorkflowOptions, SyncWorkflowContext,
23
+ WorkflowContext, WorkflowResult,
24
24
  };
25
25
  use temporalio_sdk_core::test_help::MockPollCfg;
26
26
  use uuid::Uuid;
@@ -28,85 +28,128 @@ use uuid::Uuid;
28
28
  const SIGNAME: &str = "signame";
29
29
  const RECEIVER_WFID: &str = "sends-signal-signal-receiver";
30
30
 
31
- async fn signal_sender(ctx: WfContext) -> WorkflowResult<()> {
32
- let run_id = std::str::from_utf8(&ctx.get_args()[0].data)
33
- .unwrap()
34
- .to_owned();
35
- let mut dat = SignalWorkflowOptions::new(RECEIVER_WFID, run_id, SIGNAME, [b"hi!"]);
36
- dat.with_header("tupac", b"shakur");
37
- let sigres = ctx.signal_workflow(dat).await;
38
- if ctx.get_args().get(1).is_some() {
39
- // We expect failure
40
- assert!(sigres.is_err());
41
- } else {
42
- sigres.unwrap();
31
+ #[workflow]
32
+ #[derive(Default)]
33
+ struct SignalSender;
34
+
35
+ #[workflow_methods]
36
+ impl SignalSender {
37
+ #[run(name = "sender")]
38
+ async fn run(
39
+ ctx: &mut WorkflowContext<Self>,
40
+ (run_id, expect_failure): (String, bool),
41
+ ) -> WorkflowResult<()> {
42
+ let mut dat = SignalWorkflowOptions::new(
43
+ RECEIVER_WFID,
44
+ run_id,
45
+ SIGNAME,
46
+ ["hi!".to_string().as_json_payload().unwrap()],
47
+ );
48
+ dat.with_header("tupac", b"shakur");
49
+ let sigres = ctx.signal_workflow(dat).await;
50
+ if expect_failure {
51
+ assert!(sigres.is_err());
52
+ } else {
53
+ sigres.unwrap();
54
+ }
55
+ Ok(())
43
56
  }
44
- Ok(().into())
45
57
  }
46
58
 
47
59
  #[tokio::test]
48
60
  async fn sends_signal_to_missing_wf() {
49
61
  let wf_name = "sends_signal_to_missing_wf";
50
62
  let mut starter = CoreWfStarter::new(wf_name);
51
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
63
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
52
64
  let mut worker = starter.worker().await;
53
- worker.register_wf(wf_name.to_owned(), signal_sender);
65
+ worker.register_workflow::<SignalSender>();
54
66
 
67
+ let task_queue = starter.get_task_queue().to_owned();
55
68
  worker
56
- .submit_wf(
57
- wf_name,
58
- wf_name,
59
- vec![Uuid::new_v4().to_string().into(), [1].into()],
60
- WorkflowOptions::default(),
69
+ .submit_workflow(
70
+ SignalSender::run,
71
+ (Uuid::new_v4().to_string(), true),
72
+ WorkflowStartOptions::new(task_queue, wf_name).build(),
61
73
  )
62
74
  .await
63
75
  .unwrap();
64
76
  worker.run_until_done().await.unwrap();
65
77
  }
66
78
 
67
- async fn signal_receiver(ctx: WfContext) -> WorkflowResult<()> {
68
- let res = ctx.make_signal_channel(SIGNAME).next().await.unwrap();
69
- assert_eq!(&res.input, &[b"hi!".into()]);
70
- assert_eq!(
71
- *res.headers.get("tupac").expect("tupac header exists"),
72
- b"shakur".into()
73
- );
74
- Ok(().into())
79
+ #[workflow]
80
+ #[derive(Default)]
81
+ struct SignalReceiver {
82
+ received: bool,
75
83
  }
76
84
 
77
- async fn signal_with_create_wf_receiver(ctx: WfContext) -> WorkflowResult<()> {
78
- let res = ctx.make_signal_channel(SIGNAME).next().await.unwrap();
79
- assert_eq!(&res.input, &[b"tada".into()]);
80
- assert_eq!(
81
- *res.headers.get("tupac").expect("tupac header exists"),
82
- b"shakur".into()
83
- );
84
- Ok(().into())
85
+ #[workflow_methods]
86
+ impl SignalReceiver {
87
+ #[run(name = "receiver")]
88
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
89
+ ctx.wait_condition(|s| s.received).await;
90
+ Ok(())
91
+ }
92
+
93
+ #[signal(name = "signame")]
94
+ fn handle_signal(&mut self, ctx: &mut SyncWorkflowContext<Self>, input: String) {
95
+ assert_eq!(input, "hi!");
96
+ let headers = ctx.headers();
97
+ assert_eq!(
98
+ *headers.get("tupac").expect("tupac header exists"),
99
+ b"shakur".into()
100
+ );
101
+ self.received = true;
102
+ }
103
+ }
104
+
105
+ #[workflow]
106
+ #[derive(Default)]
107
+ struct SignalWithCreateWfReceiver {
108
+ received: bool,
109
+ }
110
+
111
+ #[workflow_methods]
112
+ impl SignalWithCreateWfReceiver {
113
+ #[run]
114
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
115
+ ctx.wait_condition(|s| s.received).await;
116
+ Ok(())
117
+ }
118
+
119
+ #[signal(name = "signame")]
120
+ fn handle_signal(&mut self, ctx: &mut SyncWorkflowContext<Self>, input: String) {
121
+ assert_eq!(input, "tada");
122
+ let headers = ctx.headers();
123
+ assert_eq!(
124
+ *headers.get("tupac").expect("tupac header exists"),
125
+ b"shakur".into()
126
+ );
127
+ self.received = true;
128
+ }
85
129
  }
86
130
 
87
131
  #[tokio::test]
88
132
  async fn sends_signal_to_other_wf() {
89
133
  let mut starter = CoreWfStarter::new("sends_signal_to_other_wf");
90
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
134
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
91
135
  let mut worker = starter.worker().await;
92
- worker.register_wf("sender", signal_sender);
93
- worker.register_wf("receiver", signal_receiver);
136
+ worker.register_workflow::<SignalSender>();
137
+ worker.register_workflow::<SignalReceiver>();
94
138
 
139
+ let task_queue = starter.get_task_queue().to_owned();
95
140
  let receiver_run_id = worker
96
141
  .submit_wf(
97
- RECEIVER_WFID,
98
142
  "receiver",
99
- vec![],
100
- WorkflowOptions::default(),
143
+ vec![().as_json_payload().unwrap()],
144
+ WorkflowStartOptions::new(task_queue.clone(), RECEIVER_WFID).build(),
101
145
  )
102
146
  .await
103
147
  .unwrap();
104
148
  worker
105
149
  .submit_wf(
106
- "sends-signal-sender",
107
150
  "sender",
108
- vec![receiver_run_id.into()],
109
- WorkflowOptions::default(),
151
+ vec![(receiver_run_id, false).as_json_payload().unwrap()],
152
+ WorkflowStartOptions::new(task_queue, "sends-signal-sender").build(),
110
153
  )
111
154
  .await
112
155
  .unwrap();
@@ -116,76 +159,101 @@ async fn sends_signal_to_other_wf() {
116
159
  #[tokio::test]
117
160
  async fn sends_signal_with_create_wf() {
118
161
  let mut starter = CoreWfStarter::new("sends_signal_with_create_wf");
119
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
162
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
120
163
  let mut worker = starter.worker().await;
121
- worker.register_wf("receiver_signal", signal_with_create_wf_receiver);
164
+ worker.register_workflow::<SignalWithCreateWfReceiver>();
122
165
 
123
166
  let client = starter.get_client().await;
124
167
  let mut header: HashMap<String, Payload> = HashMap::new();
125
168
  header.insert("tupac".into(), "shakur".into());
126
- let options = SignalWithStartOptions::builder()
127
- .task_queue(worker.inner_mut().task_queue())
128
- .workflow_id("sends_signal_with_create_wf")
129
- .workflow_type("receiver_signal")
130
- .signal_name(SIGNAME)
131
- .maybe_signal_input(vec![b"tada".into()].into_payloads())
132
- .maybe_signal_header(Some(header.into()))
169
+ let task_queue = worker.inner_mut().task_queue().to_string();
170
+ let start_signal = WorkflowStartSignal::new(SIGNAME)
171
+ .maybe_input(vec!["tada".to_string().as_json_payload().unwrap()].into_payloads())
172
+ .maybe_header(Some(header.into()))
173
+ .build();
174
+ let options = WorkflowStartOptions::new(task_queue, "sends_signal_with_create_wf")
175
+ .start_signal(start_signal)
133
176
  .build();
134
- let res = client
135
- .signal_with_start_workflow_execution(options, WorkflowOptions::default())
177
+ let handle = client
178
+ .start_workflow(SignalWithCreateWfReceiver::run, (), options)
136
179
  .await
137
180
  .expect("request succeeds.qed");
138
181
 
139
- worker.expect_workflow_completion("sends_signal_with_create_wf", Some(res.run_id));
182
+ worker.expect_workflow_completion(
183
+ "sends_signal_with_create_wf",
184
+ Some(handle.run_id().unwrap().to_string()),
185
+ );
140
186
  worker.run_until_done().await.unwrap();
141
187
  }
142
188
 
143
- async fn signals_child(ctx: WfContext) -> WorkflowResult<()> {
144
- let started_child = ctx
145
- .child_workflow(ChildWorkflowOptions {
146
- workflow_id: "my_precious_child".to_string(),
147
- workflow_type: "child_receiver".to_string(),
148
- ..Default::default()
149
- })
150
- .start(&ctx)
151
- .await
152
- .into_started()
153
- .expect("Must start ok");
154
- let mut sig = Signal::new(SIGNAME, [b"hi!"]);
155
- sig.data.with_header("tupac", b"shakur");
156
- started_child.signal(&ctx, sig).await.unwrap();
157
- started_child.result().await.status.unwrap();
158
- Ok(().into())
189
+ #[workflow]
190
+ #[derive(Default)]
191
+ struct SignalsChild;
192
+
193
+ #[workflow_methods]
194
+ impl SignalsChild {
195
+ #[run(name = "child_signaler")]
196
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
197
+ let started_child = ctx
198
+ .child_workflow(ChildWorkflowOptions {
199
+ workflow_id: "my_precious_child".to_string(),
200
+ workflow_type: "receiver".to_string(),
201
+ input: vec![().as_json_payload().unwrap()],
202
+ ..Default::default()
203
+ })
204
+ .start()
205
+ .await
206
+ .into_started()
207
+ .expect("Must start ok");
208
+ let mut sig = Signal::new(SIGNAME, ["hi!".to_string().as_json_payload().unwrap()]);
209
+ sig.data.with_header("tupac", b"shakur");
210
+ started_child.signal(sig).await.unwrap();
211
+ started_child.result().await.status.unwrap();
212
+ Ok(())
213
+ }
159
214
  }
160
215
 
161
216
  #[tokio::test]
162
217
  async fn sends_signal_to_child() {
163
218
  let mut starter = CoreWfStarter::new("sends_signal_to_child");
164
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
219
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
165
220
  let mut worker = starter.worker().await;
166
- worker.register_wf("child_signaler", signals_child);
167
- worker.register_wf("child_receiver", signal_receiver);
221
+ worker.register_workflow::<SignalsChild>();
222
+ worker.register_workflow::<SignalReceiver>();
168
223
 
224
+ let task_queue = starter.get_task_queue().to_owned();
169
225
  worker
170
226
  .submit_wf(
171
- "sends-signal-to-child",
172
227
  "child_signaler",
173
- vec![],
174
- WorkflowOptions::default(),
228
+ vec![().as_json_payload().unwrap()],
229
+ WorkflowStartOptions::new(task_queue, "sends-signal-to-child").build(),
175
230
  )
176
231
  .await
177
232
  .unwrap();
178
233
  worker.run_until_done().await.unwrap();
179
234
  }
180
235
 
181
- async fn signal_sender_canned(ctx: WfContext) -> WorkflowResult<()> {
182
- let mut dat = SignalWorkflowOptions::new("fake_wid", "fake_rid", SIGNAME, [b"hi!"]);
183
- dat.with_header("tupac", b"shakur");
184
- let res = ctx.signal_workflow(dat).await;
185
- if res.is_err() {
186
- Err(anyhow::anyhow!("Signal fail!"))
187
- } else {
188
- Ok(().into())
236
+ #[workflow]
237
+ #[derive(Default)]
238
+ struct SignalSenderCanned;
239
+
240
+ #[workflow_methods]
241
+ impl SignalSenderCanned {
242
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
243
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
244
+ let mut dat = SignalWorkflowOptions::new(
245
+ "fake_wid",
246
+ "fake_rid",
247
+ SIGNAME,
248
+ ["hi!".to_string().as_json_payload().unwrap()],
249
+ );
250
+ dat.with_header("tupac", b"shakur");
251
+ let res = ctx.signal_workflow(dat).await;
252
+ if res.is_err() {
253
+ Err(anyhow::anyhow!("Signal fail!").into())
254
+ } else {
255
+ Ok(())
256
+ }
189
257
  }
190
258
  }
191
259
 
@@ -213,7 +281,7 @@ async fn sends_signal(#[case] fails: bool) {
213
281
  [Command { attributes: Some(
214
282
  command::Attributes::SignalExternalWorkflowExecutionCommandAttributes(attrs)),..}] => {
215
283
  assert_eq!(attrs.signal_name, SIGNAME);
216
- assert_eq!(attrs.input.as_ref().unwrap().payloads[0], b"hi!".into());
284
+ assert_eq!(attrs.input.as_ref().unwrap().payloads[0], "hi!".to_string().as_json_payload().unwrap());
217
285
  assert_eq!(*attrs.header.as_ref().unwrap().fields.get("tupac").unwrap(),
218
286
  b"shakur".into());
219
287
  }
@@ -233,10 +301,30 @@ async fn sends_signal(#[case] fails: bool) {
233
301
  });
234
302
 
235
303
  let mut worker = build_fake_sdk(mock_cfg);
236
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, signal_sender_canned);
304
+ worker.register_workflow::<SignalSenderCanned>();
237
305
  worker.run().await.unwrap();
238
306
  }
239
307
 
308
+ #[workflow]
309
+ #[derive(Default)]
310
+ struct CancelsBeforeSending;
311
+
312
+ #[workflow_methods]
313
+ impl CancelsBeforeSending {
314
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
315
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
316
+ let sig = ctx.signal_workflow(SignalWorkflowOptions::new(
317
+ "fake_wid",
318
+ "fake_rid",
319
+ SIGNAME,
320
+ ["hi!".to_string().as_json_payload().unwrap()],
321
+ ));
322
+ sig.cancel();
323
+ let _res = sig.await;
324
+ Ok(())
325
+ }
326
+ }
327
+
240
328
  #[tokio::test]
241
329
  async fn cancels_before_sending() {
242
330
  let mut t = TestHistoryBuilder::default();
@@ -271,16 +359,6 @@ async fn cancels_before_sending() {
271
359
 
272
360
  let mut worker = build_fake_sdk(mock_cfg);
273
361
  worker.set_worker_interceptor(aai);
274
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
275
- let sig = ctx.signal_workflow(SignalWorkflowOptions::new(
276
- "fake_wid",
277
- "fake_rid",
278
- SIGNAME,
279
- [b"hi!"],
280
- ));
281
- sig.cancel(&ctx);
282
- let _res = sig.await;
283
- Ok(().into())
284
- });
362
+ worker.register_workflow::<CancelsBeforeSending>();
285
363
  worker.run().await.unwrap();
286
364
  }
@@ -1,37 +1,59 @@
1
- use crate::{common::CoreWfStarter, integ_tests::workflow_tests::timers::timer_wf};
1
+ use crate::{common::CoreWfStarter, integ_tests::workflow_tests::timers::TimerWf};
2
2
  use std::{
3
- sync::atomic::{AtomicBool, AtomicUsize, Ordering},
3
+ sync::{
4
+ Arc,
5
+ atomic::{AtomicBool, AtomicUsize, Ordering},
6
+ },
4
7
  time::Duration,
5
8
  };
6
- use temporalio_client::WorkflowOptions;
7
- use temporalio_common::worker::{PollerBehavior, WorkerTaskTypes};
8
- use temporalio_sdk::{WfContext, WorkflowResult};
9
+ use temporalio_client::WorkflowStartOptions;
10
+ use temporalio_common::worker::WorkerTaskTypes;
11
+ use temporalio_macros::{workflow, workflow_methods};
12
+ use temporalio_sdk::{WorkflowContext, WorkflowResult};
13
+ use temporalio_sdk_core::{PollerBehavior, TunerHolder};
9
14
  use tokio::sync::Barrier;
10
15
 
11
16
  #[tokio::test]
12
17
  async fn timer_workflow_not_sticky() {
13
18
  let wf_name = "timer_wf_not_sticky";
14
19
  let mut starter = CoreWfStarter::new(wf_name);
15
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
16
- starter.worker_config.max_cached_workflows = 0_usize;
20
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
21
+ starter.sdk_config.max_cached_workflows = 0_usize;
17
22
  let mut worker = starter.worker().await;
18
- worker.register_wf(wf_name.to_owned(), timer_wf);
23
+ worker.register_workflow::<TimerWf>();
19
24
 
20
- starter.start_with_worker(wf_name, &mut worker).await;
25
+ let task_queue = starter.get_task_queue().to_owned();
26
+ let workflow_id = starter.get_task_queue().to_owned();
27
+ worker
28
+ .submit_workflow(
29
+ TimerWf::run,
30
+ (),
31
+ WorkflowStartOptions::new(task_queue, workflow_id).build(),
32
+ )
33
+ .await
34
+ .unwrap();
21
35
  worker.run_until_done().await.unwrap();
22
36
  }
23
37
 
24
- static TIMED_OUT_ONCE: AtomicBool = AtomicBool::new(false);
25
- static RUN_CT: AtomicUsize = AtomicUsize::new(0);
26
- async fn timer_timeout_wf(ctx: WfContext) -> WorkflowResult<()> {
27
- RUN_CT.fetch_add(1, Ordering::SeqCst);
28
- let t = ctx.timer(Duration::from_secs(1));
29
- if !TIMED_OUT_ONCE.load(Ordering::SeqCst) {
30
- ctx.force_task_fail(anyhow::anyhow!("I AM SLAIN!"));
31
- TIMED_OUT_ONCE.store(true, Ordering::SeqCst);
38
+ #[workflow]
39
+ struct TimerTimeoutWf {
40
+ timed_out_once: Arc<AtomicBool>,
41
+ run_ct: Arc<AtomicUsize>,
42
+ }
43
+
44
+ #[workflow_methods(factory_only)]
45
+ impl TimerTimeoutWf {
46
+ #[run]
47
+ pub(crate) async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
48
+ ctx.state(|wf| wf.run_ct.fetch_add(1, Ordering::SeqCst));
49
+ let t = ctx.timer(Duration::from_secs(1));
50
+ if !ctx.state(|wf| wf.timed_out_once.load(Ordering::SeqCst)) {
51
+ ctx.force_task_fail(anyhow::anyhow!("I AM SLAIN!"));
52
+ ctx.state(|wf| wf.timed_out_once.store(true, Ordering::SeqCst));
53
+ }
54
+ t.await;
55
+ Ok(())
32
56
  }
33
- t.await;
34
- Ok(().into())
35
57
  }
36
58
 
37
59
  #[tokio::test]
@@ -40,44 +62,69 @@ async fn timer_workflow_timeout_on_sticky() {
40
62
  // on a not-sticky queue
41
63
  let wf_name = "timer_workflow_timeout_on_sticky";
42
64
  let mut starter = CoreWfStarter::new(wf_name);
43
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
65
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
44
66
  starter.workflow_options.task_timeout = Some(Duration::from_secs(2));
45
67
  let mut worker = starter.worker().await;
46
- worker.register_wf(wf_name.to_owned(), timer_timeout_wf);
47
68
 
48
- starter.start_with_worker(wf_name, &mut worker).await;
69
+ let timed_out_once = Arc::new(AtomicBool::new(false));
70
+ let run_ct = Arc::new(AtomicUsize::new(0));
71
+ let run_ct_clone = run_ct.clone();
72
+ worker.register_workflow_with_factory(move || TimerTimeoutWf {
73
+ timed_out_once: timed_out_once.clone(),
74
+ run_ct: run_ct_clone.clone(),
75
+ });
76
+
77
+ worker
78
+ .submit_workflow(TimerTimeoutWf::run, (), starter.workflow_options.clone())
79
+ .await
80
+ .unwrap();
49
81
  worker.run_until_done().await.unwrap();
50
82
  // If it didn't run twice it didn't time out
51
- assert_eq!(RUN_CT.load(Ordering::SeqCst), 2);
83
+ assert_eq!(run_ct.load(Ordering::SeqCst), 2);
84
+ }
85
+
86
+ #[workflow]
87
+ struct CacheMissWf {
88
+ barr: Arc<Barrier>,
89
+ }
90
+
91
+ #[workflow_methods(factory_only)]
92
+ impl CacheMissWf {
93
+ #[run]
94
+ pub(crate) async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
95
+ ctx.state(|wf| wf.barr.clone()).wait().await;
96
+ ctx.timer(Duration::from_secs(1)).await;
97
+ Ok(())
98
+ }
52
99
  }
53
100
 
54
101
  #[tokio::test]
55
102
  async fn cache_miss_ok() {
56
103
  let wf_name = "cache_miss_ok";
57
104
  let mut starter = CoreWfStarter::new(wf_name);
58
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
59
- starter.worker_config.max_outstanding_workflow_tasks = Some(2_usize);
60
- starter.worker_config.max_cached_workflows = 0_usize;
61
- starter.worker_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(1_usize);
105
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
106
+ starter.sdk_config.tuner = Arc::new(TunerHolder::fixed_size(2, 1, 1, 1));
107
+ starter.sdk_config.max_cached_workflows = 0_usize;
108
+ starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(1_usize);
62
109
  let mut worker = starter.worker().await;
63
110
 
64
- let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
65
- worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
66
- barr.wait().await;
67
- ctx.timer(Duration::from_secs(1)).await;
68
- Ok(().into())
111
+ let barr = Arc::new(Barrier::new(2));
112
+ let barr_clone = barr.clone();
113
+ worker.register_workflow_with_factory(move || CacheMissWf {
114
+ barr: barr_clone.clone(),
69
115
  });
70
116
 
71
- let run_id = worker
72
- .submit_wf(
73
- wf_name.to_owned(),
74
- wf_name.to_owned(),
75
- vec![],
76
- WorkflowOptions::default(),
117
+ let task_queue = starter.get_task_queue().to_owned();
118
+ let handle = worker
119
+ .submit_workflow(
120
+ CacheMissWf::run,
121
+ (),
122
+ WorkflowStartOptions::new(task_queue, wf_name.to_owned()).build(),
77
123
  )
78
124
  .await
79
125
  .unwrap();
80
126
  let core = starter.get_worker().await;
127
+ let run_id = handle.info().run_id.clone().unwrap();
81
128
  let (r1, _) = tokio::join!(worker.run_until_done(), async move {
82
129
  barr.wait().await;
83
130
  core.request_workflow_eviction(&run_id);