@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/Cargo.lock +794 -650
  2. package/bridge-macros/src/derive_tryintojs.rs +40 -0
  3. package/lib/native.d.ts +24 -3
  4. package/package.json +4 -4
  5. package/releases/aarch64-apple-darwin/index.node +0 -0
  6. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  7. package/releases/x86_64-apple-darwin/index.node +0 -0
  8. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  9. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  10. package/sdk-core/.github/workflows/per-pr.yml +6 -6
  11. package/sdk-core/AGENTS.md +42 -31
  12. package/sdk-core/Cargo.toml +4 -1
  13. package/sdk-core/README.md +19 -13
  14. package/sdk-core/crates/client/Cargo.toml +4 -0
  15. package/sdk-core/crates/client/README.md +139 -0
  16. package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
  17. package/sdk-core/crates/client/src/callback_based.rs +7 -0
  18. package/sdk-core/crates/client/src/errors.rs +294 -0
  19. package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +370 -159
  20. package/sdk-core/crates/client/src/lib.rs +920 -1326
  21. package/sdk-core/crates/client/src/metrics.rs +24 -33
  22. package/sdk-core/crates/client/src/options_structs.rs +457 -0
  23. package/sdk-core/crates/client/src/replaceable.rs +5 -4
  24. package/sdk-core/crates/client/src/request_extensions.rs +8 -9
  25. package/sdk-core/crates/client/src/retry.rs +99 -54
  26. package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +104 -29
  27. package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
  28. package/sdk-core/crates/common/Cargo.toml +62 -3
  29. package/sdk-core/crates/common/build.rs +742 -12
  30. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
  31. package/sdk-core/crates/common/protos/api_upstream/.github/workflows/create-release.yml +0 -5
  32. package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
  33. package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
  34. package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
  35. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +3329 -2647
  36. package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
  37. package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
  38. package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
  39. package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
  40. package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
  41. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
  42. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
  43. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
  44. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
  45. package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
  46. package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
  47. package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
  48. package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +111 -17
  49. package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
  50. package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
  51. package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
  52. package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
  53. package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
  54. package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
  55. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
  56. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
  57. package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
  58. package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
  59. package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
  60. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
  61. package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -5
  62. package/sdk-core/crates/common/src/activity_definition.rs +20 -0
  63. package/sdk-core/crates/common/src/data_converters.rs +770 -0
  64. package/sdk-core/crates/common/src/envconfig.rs +5 -0
  65. package/sdk-core/crates/common/src/lib.rs +15 -211
  66. package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
  67. package/sdk-core/crates/common/src/priority.rs +110 -0
  68. package/sdk-core/crates/common/src/protos/canned_histories.rs +19 -0
  69. package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
  70. package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
  71. package/sdk-core/crates/common/src/protos/mod.rs +134 -27
  72. package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
  73. package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
  74. package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +11 -16
  75. package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
  76. package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
  77. package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
  78. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
  79. package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
  80. package/sdk-core/crates/common/src/telemetry.rs +278 -19
  81. package/sdk-core/crates/common/src/worker.rs +68 -636
  82. package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
  83. package/sdk-core/crates/macros/Cargo.toml +5 -1
  84. package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
  85. package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
  86. package/sdk-core/crates/macros/src/lib.rs +138 -512
  87. package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
  88. package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
  89. package/sdk-core/crates/sdk/Cargo.toml +19 -6
  90. package/sdk-core/crates/sdk/README.md +415 -0
  91. package/sdk-core/crates/sdk/src/activities.rs +417 -0
  92. package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
  93. package/sdk-core/crates/sdk/src/lib.rs +759 -442
  94. package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -35
  95. package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
  96. package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
  97. package/sdk-core/crates/sdk/src/workflows.rs +711 -0
  98. package/sdk-core/crates/sdk-core/Cargo.toml +59 -65
  99. package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
  100. package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
  101. package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
  102. package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
  103. package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +22 -21
  104. package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
  105. package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
  106. package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
  107. package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +647 -27
  108. package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
  109. package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
  110. package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
  111. package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
  112. package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
  113. package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
  114. package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
  115. package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
  116. package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +183 -198
  117. package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
  118. package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
  119. package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
  120. package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
  121. package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
  122. package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
  123. package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +11 -5
  124. package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
  125. package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
  126. package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
  127. package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -23
  128. package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
  129. package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
  130. package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +25 -27
  131. package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
  132. package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
  133. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
  134. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
  135. package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +28 -4
  136. package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
  137. package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
  138. package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
  139. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
  140. package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
  141. package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
  142. package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
  143. package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
  144. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
  145. package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
  146. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
  147. package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
  148. package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
  149. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
  150. package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
  151. package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
  152. package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
  153. package/sdk-core/crates/sdk-core/tests/common/mod.rs +281 -236
  154. package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
  155. package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
  156. package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
  157. package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
  158. package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
  159. package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
  160. package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
  161. package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +37 -38
  162. package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
  163. package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
  164. package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
  165. package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +157 -157
  166. package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
  167. package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -463
  168. package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
  169. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +389 -265
  170. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
  171. package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
  172. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
  173. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +437 -327
  174. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
  175. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
  176. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
  177. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
  178. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +110 -46
  179. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
  180. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
  181. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
  182. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
  183. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
  184. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
  185. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
  186. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
  187. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +155 -140
  188. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
  189. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
  190. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
  191. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
  192. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
  193. package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
  194. package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
  195. package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
  196. package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
  197. package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
  198. package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
  199. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
  200. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
  201. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
  202. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
  203. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
  204. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
  205. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
  206. package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
  207. package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +8 -1
  208. package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
  209. package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
  210. package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
  211. package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
  212. package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
  213. package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
  214. package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
  215. package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
  216. package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
  217. package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
  218. package/sdk-core/rustfmt.toml +2 -1
  219. package/src/client.rs +206 -289
  220. package/src/helpers/try_into_js.rs +88 -2
  221. package/src/metrics.rs +277 -35
  222. package/src/runtime.rs +94 -45
  223. package/src/testing.rs +9 -16
  224. package/src/worker.rs +86 -68
  225. package/ts/native.ts +39 -3
  226. package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
  227. package/sdk-core/crates/common/src/errors.rs +0 -85
  228. package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
  229. package/sdk-core/crates/macros/LICENSE.txt +0 -21
  230. package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
  231. package/sdk-core/crates/sdk/src/app_data.rs +0 -37
  232. package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
  233. package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
@@ -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,89 +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
52
- .worker_config
53
- .task_types(WorkerTaskTypes::workflow_only());
63
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
54
64
  let mut worker = starter.worker().await;
55
- worker.register_wf(wf_name.to_owned(), signal_sender);
65
+ worker.register_workflow::<SignalSender>();
56
66
 
67
+ let task_queue = starter.get_task_queue().to_owned();
57
68
  worker
58
- .submit_wf(
59
- wf_name,
60
- wf_name,
61
- vec![Uuid::new_v4().to_string().into(), [1].into()],
62
- WorkflowOptions::default(),
69
+ .submit_workflow(
70
+ SignalSender::run,
71
+ (Uuid::new_v4().to_string(), true),
72
+ WorkflowStartOptions::new(task_queue, wf_name).build(),
63
73
  )
64
74
  .await
65
75
  .unwrap();
66
76
  worker.run_until_done().await.unwrap();
67
77
  }
68
78
 
69
- async fn signal_receiver(ctx: WfContext) -> WorkflowResult<()> {
70
- let res = ctx.make_signal_channel(SIGNAME).next().await.unwrap();
71
- assert_eq!(&res.input, &[b"hi!".into()]);
72
- assert_eq!(
73
- *res.headers.get("tupac").expect("tupac header exists"),
74
- b"shakur".into()
75
- );
76
- Ok(().into())
79
+ #[workflow]
80
+ #[derive(Default)]
81
+ struct SignalReceiver {
82
+ received: bool,
77
83
  }
78
84
 
79
- async fn signal_with_create_wf_receiver(ctx: WfContext) -> WorkflowResult<()> {
80
- let res = ctx.make_signal_channel(SIGNAME).next().await.unwrap();
81
- assert_eq!(&res.input, &[b"tada".into()]);
82
- assert_eq!(
83
- *res.headers.get("tupac").expect("tupac header exists"),
84
- b"shakur".into()
85
- );
86
- 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
+ }
87
129
  }
88
130
 
89
131
  #[tokio::test]
90
132
  async fn sends_signal_to_other_wf() {
91
133
  let mut starter = CoreWfStarter::new("sends_signal_to_other_wf");
92
- starter
93
- .worker_config
94
- .task_types(WorkerTaskTypes::workflow_only());
134
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
95
135
  let mut worker = starter.worker().await;
96
- worker.register_wf("sender", signal_sender);
97
- worker.register_wf("receiver", signal_receiver);
136
+ worker.register_workflow::<SignalSender>();
137
+ worker.register_workflow::<SignalReceiver>();
98
138
 
139
+ let task_queue = starter.get_task_queue().to_owned();
99
140
  let receiver_run_id = worker
100
141
  .submit_wf(
101
- RECEIVER_WFID,
102
142
  "receiver",
103
- vec![],
104
- WorkflowOptions::default(),
143
+ vec![().as_json_payload().unwrap()],
144
+ WorkflowStartOptions::new(task_queue.clone(), RECEIVER_WFID).build(),
105
145
  )
106
146
  .await
107
147
  .unwrap();
108
148
  worker
109
149
  .submit_wf(
110
- "sends-signal-sender",
111
150
  "sender",
112
- vec![receiver_run_id.into()],
113
- WorkflowOptions::default(),
151
+ vec![(receiver_run_id, false).as_json_payload().unwrap()],
152
+ WorkflowStartOptions::new(task_queue, "sends-signal-sender").build(),
114
153
  )
115
154
  .await
116
155
  .unwrap();
@@ -120,80 +159,101 @@ async fn sends_signal_to_other_wf() {
120
159
  #[tokio::test]
121
160
  async fn sends_signal_with_create_wf() {
122
161
  let mut starter = CoreWfStarter::new("sends_signal_with_create_wf");
123
- starter
124
- .worker_config
125
- .task_types(WorkerTaskTypes::workflow_only());
162
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
126
163
  let mut worker = starter.worker().await;
127
- worker.register_wf("receiver_signal", signal_with_create_wf_receiver);
164
+ worker.register_workflow::<SignalWithCreateWfReceiver>();
128
165
 
129
166
  let client = starter.get_client().await;
130
167
  let mut header: HashMap<String, Payload> = HashMap::new();
131
168
  header.insert("tupac".into(), "shakur".into());
132
- let options = SignalWithStartOptions::builder()
133
- .task_queue(worker.inner_mut().task_queue())
134
- .workflow_id("sends_signal_with_create_wf")
135
- .workflow_type("receiver_signal")
136
- .signal_name(SIGNAME)
137
- .maybe_signal_input(vec![b"tada".into()].into_payloads())
138
- .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)
139
176
  .build();
140
- let res = client
141
- .signal_with_start_workflow_execution(options, WorkflowOptions::default())
177
+ let handle = client
178
+ .start_workflow(SignalWithCreateWfReceiver::run, (), options)
142
179
  .await
143
180
  .expect("request succeeds.qed");
144
181
 
145
- 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
+ );
146
186
  worker.run_until_done().await.unwrap();
147
187
  }
148
188
 
149
- async fn signals_child(ctx: WfContext) -> WorkflowResult<()> {
150
- let started_child = ctx
151
- .child_workflow(ChildWorkflowOptions {
152
- workflow_id: "my_precious_child".to_string(),
153
- workflow_type: "child_receiver".to_string(),
154
- ..Default::default()
155
- })
156
- .start(&ctx)
157
- .await
158
- .into_started()
159
- .expect("Must start ok");
160
- let mut sig = Signal::new(SIGNAME, [b"hi!"]);
161
- sig.data.with_header("tupac", b"shakur");
162
- started_child.signal(&ctx, sig).await.unwrap();
163
- started_child.result().await.status.unwrap();
164
- 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
+ }
165
214
  }
166
215
 
167
216
  #[tokio::test]
168
217
  async fn sends_signal_to_child() {
169
218
  let mut starter = CoreWfStarter::new("sends_signal_to_child");
170
- starter
171
- .worker_config
172
- .task_types(WorkerTaskTypes::workflow_only());
219
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
173
220
  let mut worker = starter.worker().await;
174
- worker.register_wf("child_signaler", signals_child);
175
- worker.register_wf("child_receiver", signal_receiver);
221
+ worker.register_workflow::<SignalsChild>();
222
+ worker.register_workflow::<SignalReceiver>();
176
223
 
224
+ let task_queue = starter.get_task_queue().to_owned();
177
225
  worker
178
226
  .submit_wf(
179
- "sends-signal-to-child",
180
227
  "child_signaler",
181
- vec![],
182
- WorkflowOptions::default(),
228
+ vec![().as_json_payload().unwrap()],
229
+ WorkflowStartOptions::new(task_queue, "sends-signal-to-child").build(),
183
230
  )
184
231
  .await
185
232
  .unwrap();
186
233
  worker.run_until_done().await.unwrap();
187
234
  }
188
235
 
189
- async fn signal_sender_canned(ctx: WfContext) -> WorkflowResult<()> {
190
- let mut dat = SignalWorkflowOptions::new("fake_wid", "fake_rid", SIGNAME, [b"hi!"]);
191
- dat.with_header("tupac", b"shakur");
192
- let res = ctx.signal_workflow(dat).await;
193
- if res.is_err() {
194
- Err(anyhow::anyhow!("Signal fail!"))
195
- } else {
196
- 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
+ }
197
257
  }
198
258
  }
199
259
 
@@ -221,7 +281,7 @@ async fn sends_signal(#[case] fails: bool) {
221
281
  [Command { attributes: Some(
222
282
  command::Attributes::SignalExternalWorkflowExecutionCommandAttributes(attrs)),..}] => {
223
283
  assert_eq!(attrs.signal_name, SIGNAME);
224
- 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());
225
285
  assert_eq!(*attrs.header.as_ref().unwrap().fields.get("tupac").unwrap(),
226
286
  b"shakur".into());
227
287
  }
@@ -241,10 +301,30 @@ async fn sends_signal(#[case] fails: bool) {
241
301
  });
242
302
 
243
303
  let mut worker = build_fake_sdk(mock_cfg);
244
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, signal_sender_canned);
304
+ worker.register_workflow::<SignalSenderCanned>();
245
305
  worker.run().await.unwrap();
246
306
  }
247
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
+
248
328
  #[tokio::test]
249
329
  async fn cancels_before_sending() {
250
330
  let mut t = TestHistoryBuilder::default();
@@ -279,16 +359,6 @@ async fn cancels_before_sending() {
279
359
 
280
360
  let mut worker = build_fake_sdk(mock_cfg);
281
361
  worker.set_worker_interceptor(aai);
282
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
283
- let sig = ctx.signal_workflow(SignalWorkflowOptions::new(
284
- "fake_wid",
285
- "fake_rid",
286
- SIGNAME,
287
- [b"hi!"],
288
- ));
289
- sig.cancel(&ctx);
290
- let _res = sig.await;
291
- Ok(().into())
292
- });
362
+ worker.register_workflow::<CancelsBeforeSending>();
293
363
  worker.run().await.unwrap();
294
364
  }
@@ -1,39 +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
16
- .worker_config
17
- .task_types(WorkerTaskTypes::workflow_only())
18
- .max_cached_workflows(0_usize);
20
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
21
+ starter.sdk_config.max_cached_workflows = 0_usize;
19
22
  let mut worker = starter.worker().await;
20
- worker.register_wf(wf_name.to_owned(), timer_wf);
23
+ worker.register_workflow::<TimerWf>();
21
24
 
22
- 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();
23
35
  worker.run_until_done().await.unwrap();
24
36
  }
25
37
 
26
- static TIMED_OUT_ONCE: AtomicBool = AtomicBool::new(false);
27
- static RUN_CT: AtomicUsize = AtomicUsize::new(0);
28
- async fn timer_timeout_wf(ctx: WfContext) -> WorkflowResult<()> {
29
- RUN_CT.fetch_add(1, Ordering::SeqCst);
30
- let t = ctx.timer(Duration::from_secs(1));
31
- if !TIMED_OUT_ONCE.load(Ordering::SeqCst) {
32
- ctx.force_task_fail(anyhow::anyhow!("I AM SLAIN!"));
33
- 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(())
34
56
  }
35
- t.await;
36
- Ok(().into())
37
57
  }
38
58
 
39
59
  #[tokio::test]
@@ -42,48 +62,69 @@ async fn timer_workflow_timeout_on_sticky() {
42
62
  // on a not-sticky queue
43
63
  let wf_name = "timer_workflow_timeout_on_sticky";
44
64
  let mut starter = CoreWfStarter::new(wf_name);
45
- starter
46
- .worker_config
47
- .task_types(WorkerTaskTypes::workflow_only());
65
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
48
66
  starter.workflow_options.task_timeout = Some(Duration::from_secs(2));
49
67
  let mut worker = starter.worker().await;
50
- worker.register_wf(wf_name.to_owned(), timer_timeout_wf);
51
68
 
52
- 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();
53
81
  worker.run_until_done().await.unwrap();
54
82
  // If it didn't run twice it didn't time out
55
- 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
+ }
56
99
  }
57
100
 
58
101
  #[tokio::test]
59
102
  async fn cache_miss_ok() {
60
103
  let wf_name = "cache_miss_ok";
61
104
  let mut starter = CoreWfStarter::new(wf_name);
62
- starter
63
- .worker_config
64
- .task_types(WorkerTaskTypes::workflow_only())
65
- .max_outstanding_workflow_tasks(2_usize)
66
- .max_cached_workflows(0_usize)
67
- .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);
68
109
  let mut worker = starter.worker().await;
69
110
 
70
- let barr: &'static Barrier = Box::leak(Box::new(Barrier::new(2)));
71
- worker.register_wf(wf_name.to_owned(), move |ctx: WfContext| async move {
72
- barr.wait().await;
73
- ctx.timer(Duration::from_secs(1)).await;
74
- 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(),
75
115
  });
76
116
 
77
- let run_id = worker
78
- .submit_wf(
79
- wf_name.to_owned(),
80
- wf_name.to_owned(),
81
- vec![],
82
- 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(),
83
123
  )
84
124
  .await
85
125
  .unwrap();
86
126
  let core = starter.get_worker().await;
127
+ let run_id = handle.info().run_id.clone().unwrap();
87
128
  let (r1, _) = tokio::join!(worker.run_until_done(), async move {
88
129
  barr.wait().await;
89
130
  core.request_workflow_eviction(&run_id);