@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,9 +1,9 @@
1
1
  use crate::{
2
2
  common::{
3
- CoreWfStarter, fake_grpc_server::fake_server, get_integ_runtime_options,
4
- get_integ_server_options, get_integ_telem_options, mock_sdk_cfg,
3
+ CoreWfStarter, activity_functions::StdActivities, fake_grpc_server::fake_server,
4
+ get_integ_runtime_options, get_integ_server_options, get_integ_telem_options, mock_sdk_cfg,
5
5
  },
6
- shared_tests,
6
+ shared_tests::{self, is_oversize_grpc_event},
7
7
  };
8
8
  use assert_matches::assert_matches;
9
9
  use futures_util::FutureExt;
@@ -18,10 +18,9 @@ use std::{
18
18
  },
19
19
  time::Duration,
20
20
  };
21
- use temporalio_client::WorkflowOptions;
21
+ use temporalio_client::{Connection, WorkflowStartOptions};
22
22
  use temporalio_common::{
23
- Worker,
24
- errors::WorkerValidationError,
23
+ data_converters::{DataConverter, RawValue},
25
24
  protos::{
26
25
  DEFAULT_WORKFLOW_TYPE, TestHistoryBuilder, canned_histories,
27
26
  coresdk::{
@@ -35,13 +34,15 @@ use temporalio_common::{
35
34
  command::v1::command::Attributes,
36
35
  common::v1::WorkerVersionStamp,
37
36
  enums::v1::{
38
- EventType, WorkflowTaskFailedCause, WorkflowTaskFailedCause::GrpcMessageTooLarge,
37
+ EventType,
38
+ WorkflowTaskFailedCause::{self},
39
39
  },
40
40
  failure::v1::Failure as InnerFailure,
41
41
  history::v1::{
42
- ActivityTaskScheduledEventAttributes, history_event,
43
- history_event::Attributes::{
44
- self as EventAttributes, WorkflowTaskFailedEventAttributes,
42
+ ActivityTaskScheduledEventAttributes,
43
+ history_event::{
44
+ self,
45
+ Attributes::{self as EventAttributes},
45
46
  },
46
47
  },
47
48
  workflowservice::v1::{
@@ -50,18 +51,20 @@ use temporalio_common::{
50
51
  },
51
52
  },
52
53
  },
53
- worker::{
54
- ActivitySlotKind, LocalActivitySlotKind, PollerBehavior, SlotInfo, SlotInfoTrait,
55
- SlotMarkUsedContext, SlotReleaseContext, SlotReservationContext, SlotSupplier,
56
- SlotSupplierPermit, WorkerConfig, WorkerTaskTypes, WorkerVersioningStrategy,
57
- WorkflowSlotKind,
58
- },
54
+ worker::WorkerTaskTypes,
59
55
  };
56
+ use temporalio_macros::{activities, workflow, workflow_methods};
60
57
  use temporalio_sdk::{
61
- ActivityOptions, LocalActivityOptions, WfContext, interceptors::WorkerInterceptor,
58
+ ActivityOptions, LocalActivityOptions, WorkerOptions, WorkflowContext, WorkflowResult,
59
+ WorkflowTermination,
60
+ activities::{ActivityContext, ActivityError},
61
+ interceptors::WorkerInterceptor,
62
62
  };
63
63
  use temporalio_sdk_core::{
64
- CoreRuntime, ResourceBasedTuner, ResourceSlotOptions, TunerBuilder, init_worker,
64
+ ActivitySlotKind, CoreRuntime, LocalActivitySlotKind, PollError, PollerBehavior,
65
+ ResourceBasedTuner, ResourceSlotOptions, SlotInfo, SlotInfoTrait, SlotMarkUsedContext,
66
+ SlotReleaseContext, SlotReservationContext, SlotSupplier, SlotSupplierPermit, TunerBuilder,
67
+ WorkerConfig, WorkerValidationError, WorkerVersioningStrategy, WorkflowSlotKind, init_worker,
65
68
  test_help::{
66
69
  FakeWfResponses, MockPollCfg, ResponseType, build_mock_pollers, drain_pollers_and_shutdown,
67
70
  hist_to_poll_resp, mock_worker, mock_worker_client,
@@ -73,14 +76,12 @@ use uuid::Uuid;
73
76
 
74
77
  #[tokio::test]
75
78
  async fn worker_validation_fails_on_nonexistent_namespace() {
76
- let opts = get_integ_server_options();
79
+ let mut opts = get_integ_server_options();
77
80
  let runtime =
78
81
  CoreRuntime::new_assume_tokio(get_integ_runtime_options(get_integ_telem_options()))
79
82
  .unwrap();
80
- let retrying_client = opts
81
- .connect_no_namespace(runtime.telemetry().get_temporal_metric_meter())
82
- .await
83
- .unwrap();
83
+ opts.metrics_meter = runtime.telemetry().get_temporal_metric_meter();
84
+ let connection = Connection::connect(opts).await.unwrap();
84
85
 
85
86
  let worker = init_worker(
86
87
  &runtime,
@@ -93,7 +94,7 @@ async fn worker_validation_fails_on_nonexistent_namespace() {
93
94
  .task_types(WorkerTaskTypes::all())
94
95
  .build()
95
96
  .unwrap(),
96
- retrying_client,
97
+ connection,
97
98
  )
98
99
  .unwrap();
99
100
 
@@ -110,12 +111,13 @@ async fn worker_handles_unknown_workflow_types_gracefully() {
110
111
  let mut starter = CoreWfStarter::new(wf_type);
111
112
  let mut worker = starter.worker().await;
112
113
 
114
+ let task_queue = starter.get_task_queue().to_owned();
115
+ let wf_id = format!("wce-{}", Uuid::new_v4());
113
116
  let run_id = worker
114
117
  .submit_wf(
115
- format!("wce-{}", Uuid::new_v4()),
116
118
  "unregistered".to_string(),
117
119
  vec![],
118
- WorkflowOptions::default(),
120
+ WorkflowStartOptions::new(task_queue, wf_id).build(),
119
121
  )
120
122
  .await
121
123
  .unwrap();
@@ -172,36 +174,41 @@ async fn worker_handles_unknown_workflow_types_gracefully() {
172
174
  });
173
175
  }
174
176
 
177
+ #[workflow]
178
+ #[derive(Default)]
179
+ struct ResourceBasedNonStickyWf;
180
+
181
+ #[workflow_methods]
182
+ impl ResourceBasedNonStickyWf {
183
+ #[run]
184
+ async fn run(_ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
185
+ Ok(())
186
+ }
187
+ }
188
+
175
189
  #[tokio::test]
176
190
  async fn resource_based_few_pollers_guarantees_non_sticky_poll() {
177
191
  let wf_name = "resource_based_few_pollers_guarantees_non_sticky_poll";
178
192
  let mut starter = CoreWfStarter::new(wf_name);
179
- starter.worker_config.max_outstanding_workflow_tasks = None;
180
- starter.worker_config.max_outstanding_local_activities = None;
181
- starter.worker_config.max_outstanding_activities = None;
182
- starter.worker_config.max_outstanding_nexus_tasks = None;
183
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
193
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
184
194
  // 3 pollers so the minimum slots of 2 can both be handed out to a sticky poller
185
- starter.worker_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(3_usize);
195
+ starter.sdk_config.workflow_task_poller_behavior = PollerBehavior::SimpleMaximum(3_usize);
186
196
  // Set the limits to zero so it's essentially unwilling to hand out slots
187
197
  let mut tuner = ResourceBasedTuner::new(0.0, 0.0);
188
198
  tuner.with_workflow_slots_options(ResourceSlotOptions::new(2, 10, Duration::from_millis(0)));
189
- starter.worker_config.tuner = Some(Arc::new(tuner));
199
+ starter.sdk_config.tuner = Arc::new(tuner);
190
200
  let mut worker = starter.worker().await;
191
201
 
192
202
  // Workflow doesn't actually need to do anything. We just need to see that we don't get stuck
193
203
  // by assigning all slots to sticky pollers.
194
- worker.register_wf(
195
- wf_name.to_owned(),
196
- |_: WfContext| async move { Ok(().into()) },
197
- );
204
+ worker.register_workflow::<ResourceBasedNonStickyWf>();
205
+ let task_queue = starter.get_task_queue().to_owned();
198
206
  for i in 0..20 {
199
207
  worker
200
- .submit_wf(
201
- format!("{wf_name}_{i}"),
202
- wf_name.to_owned(),
203
- vec![],
204
- WorkflowOptions::default(),
208
+ .submit_workflow(
209
+ ResourceBasedNonStickyWf::run,
210
+ (),
211
+ WorkflowStartOptions::new(task_queue.clone(), format!("{wf_name}_{i}")).build(),
205
212
  )
206
213
  .await
207
214
  .unwrap();
@@ -217,31 +224,47 @@ async fn oversize_grpc_message() {
217
224
  let (telemopts, addr, _aborter) = prom_metrics(None);
218
225
  let runtime = CoreRuntime::new_assume_tokio(get_integ_runtime_options(telemopts)).unwrap();
219
226
  let mut starter = CoreWfStarter::new_with_runtime(wf_name, runtime);
220
- starter.worker_config.task_types = WorkerTaskTypes::workflow_only();
227
+ starter.sdk_config.task_types = WorkerTaskTypes::workflow_only();
221
228
  let mut core = starter.worker().await;
222
229
 
223
- static OVERSIZE_GRPC_MESSAGE_RUN: AtomicBool = AtomicBool::new(false);
224
- core.register_wf(wf_name.to_owned(), |_ctx: WfContext| async move {
225
- if OVERSIZE_GRPC_MESSAGE_RUN.load(Relaxed) {
226
- Ok(vec![].into())
227
- } else {
228
- OVERSIZE_GRPC_MESSAGE_RUN.store(true, Relaxed);
229
- let result: Vec<u8> = vec![0; 5000000];
230
- Ok(result.into())
230
+ let has_run = Arc::new(AtomicBool::new(false));
231
+ let has_run_clone = has_run.clone();
232
+
233
+ #[workflow]
234
+ struct OversizeGrpcMessageWf {
235
+ has_run: Arc<AtomicBool>,
236
+ }
237
+
238
+ #[workflow_methods(factory_only)]
239
+ impl OversizeGrpcMessageWf {
240
+ #[run]
241
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<Vec<u8>> {
242
+ if ctx.state(|wf| wf.has_run.load(Relaxed)) {
243
+ Ok(vec![])
244
+ } else {
245
+ ctx.state(|wf| wf.has_run.store(true, Relaxed));
246
+ let result: Vec<u8> = vec![0; 5000000];
247
+ Ok(result)
248
+ }
231
249
  }
250
+ }
251
+
252
+ core.register_workflow_with_factory(move || OversizeGrpcMessageWf {
253
+ has_run: has_run_clone.clone(),
232
254
  });
233
- starter.start_with_worker(wf_name, &mut core).await;
255
+ starter
256
+ .start_with_worker(OversizeGrpcMessageWf::name(), &mut core)
257
+ .await;
234
258
  core.run_until_done().await.unwrap();
235
259
 
236
- assert!(starter.get_history().await.events.iter().any(|e| {
237
- e.event_type == EventType::WorkflowTaskFailed as i32
238
- && if let WorkflowTaskFailedEventAttributes(attr) = e.attributes.as_ref().unwrap() {
239
- attr.cause == GrpcMessageTooLarge as i32
240
- && attr.failure.as_ref().unwrap().message == "GRPC Message too large"
241
- } else {
242
- false
243
- }
244
- }));
260
+ assert!(
261
+ starter
262
+ .get_history()
263
+ .await
264
+ .events
265
+ .iter()
266
+ .any(is_oversize_grpc_event)
267
+ );
245
268
 
246
269
  // Verify the workflow task failure metric includes the GrpcMessageTooLarge reason
247
270
  let tq = starter.get_task_queue();
@@ -357,7 +380,10 @@ async fn activity_tasks_from_completion_reserve_slots() {
357
380
  cfg.max_outstanding_activities = Some(2);
358
381
  });
359
382
  let core = Arc::new(mock_worker(mock));
360
- let mut worker = crate::common::TestWorker::new(core.clone());
383
+ let mut worker = crate::common::TestWorker::new(temporalio_sdk::Worker::new_from_core(
384
+ core.clone(),
385
+ DataConverter::default(),
386
+ ));
361
387
 
362
388
  // First poll for activities twice, occupying both slots
363
389
  let at1 = core.poll_activity_task().await.unwrap();
@@ -365,33 +391,45 @@ async fn activity_tasks_from_completion_reserve_slots() {
365
391
  let workflow_complete_token = CancellationToken::new();
366
392
  let workflow_complete_token_clone = workflow_complete_token.clone();
367
393
 
368
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| {
369
- let complete_token = workflow_complete_token.clone();
370
- async move {
371
- ctx.activity(ActivityOptions {
372
- activity_type: "act1".to_string(),
373
- ..Default::default()
374
- })
375
- .await;
376
- ctx.activity(ActivityOptions {
377
- activity_type: "act2".to_string(),
378
- ..Default::default()
379
- })
380
- .await;
381
- complete_token.cancel();
382
- Ok(().into())
394
+ struct FakeAct;
395
+ #[activities]
396
+ impl FakeAct {
397
+ #[activity(name = "act1")]
398
+ fn act1(_: ActivityContext) -> Result<RawValue, ActivityError> {
399
+ unreachable!("doesn't actually run")
400
+ }
401
+
402
+ #[activity(name = "act2")]
403
+ fn act2(_: ActivityContext) -> Result<RawValue, ActivityError> {
404
+ unreachable!("doesn't actually run")
383
405
  }
406
+ }
407
+
408
+ #[workflow]
409
+ struct ActivityTasksCompletionWf {
410
+ complete_token: CancellationToken,
411
+ }
412
+
413
+ #[workflow_methods(factory_only)]
414
+ impl ActivityTasksCompletionWf {
415
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
416
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
417
+ ctx.start_activity(FakeAct::act1, (), ActivityOptions::default())
418
+ .await
419
+ .map_err(|e| WorkflowTermination::from(anyhow::Error::from(e)))?;
420
+ ctx.start_activity(FakeAct::act2, (), ActivityOptions::default())
421
+ .await
422
+ .map_err(|e| WorkflowTermination::from(anyhow::Error::from(e)))?;
423
+ ctx.state(|wf| wf.complete_token.cancel());
424
+ Ok(())
425
+ }
426
+ }
427
+
428
+ let wf_token = workflow_complete_token.clone();
429
+ worker.register_workflow_with_factory(move || ActivityTasksCompletionWf {
430
+ complete_token: wf_token.clone(),
384
431
  });
385
432
 
386
- worker
387
- .submit_wf(
388
- wf_id.to_owned(),
389
- DEFAULT_WORKFLOW_TYPE,
390
- vec![],
391
- WorkflowOptions::default(),
392
- )
393
- .await
394
- .unwrap();
395
433
  let act_completer = async {
396
434
  barr.wait().await;
397
435
  core.complete_activity_task(ActivityTaskCompletion {
@@ -407,13 +445,13 @@ async fn activity_tasks_from_completion_reserve_slots() {
407
445
  .await
408
446
  .unwrap();
409
447
  barr.wait().await;
410
- // Wait for workflow to complete in order for all eager activities to be requested before shutting down.
411
- // After shutdown, no eager activities slots can be allocated.
448
+ // Wait for workflow to complete in order for all eager activities to be requested before
449
+ // shutting down. After shutdown, no eager activities slots can be allocated.
412
450
  workflow_complete_token_clone.cancelled().await;
413
451
  core.initiate_shutdown();
414
452
  // Even though this test requests eager activity tasks, none are returned in poll responses.
415
453
  let err = core.poll_activity_task().await.unwrap_err();
416
- assert_matches!(err, temporalio_common::errors::PollError::ShutDown);
454
+ assert_matches!(err, PollError::ShutDown);
417
455
  };
418
456
  // This wf poll should *not* set the flag that it wants tasks back since both slots are
419
457
  // occupied
@@ -438,23 +476,27 @@ async fn max_wft_respected() {
438
476
  cfg.max_cached_workflows = total_wfs as usize;
439
477
  cfg.max_outstanding_workflow_tasks = Some(1);
440
478
  });
441
- let active_count: &'static _ = Box::leak(Box::new(Semaphore::new(1)));
442
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
443
- drop(
444
- active_count
445
- .try_acquire()
446
- .expect("No multiple concurrent workflow tasks!"),
447
- );
448
- ctx.timer(Duration::from_secs(1)).await;
449
- Ok(().into())
450
- });
451
-
452
- for wf_id in wf_ids {
453
- worker
454
- .submit_wf(wf_id, DEFAULT_WORKFLOW_TYPE, vec![], Default::default())
455
- .await
456
- .unwrap();
479
+ static ACTIVE_COUNT: Semaphore = Semaphore::const_new(1);
480
+
481
+ #[workflow]
482
+ #[derive(Default)]
483
+ struct MaxWftWf;
484
+
485
+ #[workflow_methods]
486
+ impl MaxWftWf {
487
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
488
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
489
+ drop(
490
+ ACTIVE_COUNT
491
+ .try_acquire()
492
+ .expect("No multiple concurrent workflow tasks!"),
493
+ );
494
+ ctx.timer(Duration::from_secs(1)).await;
495
+ Ok(())
496
+ }
457
497
  }
498
+
499
+ worker.register_workflow::<MaxWftWf>();
458
500
  worker.run_until_done().await.unwrap();
459
501
  }
460
502
 
@@ -527,23 +569,24 @@ async fn history_length_with_fail_and_timeout(
527
569
  wc.max_cached_workflows = 1;
528
570
  }
529
571
  });
530
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
531
- assert_eq!(ctx.history_length(), 3);
532
- ctx.timer(Duration::from_secs(1)).await;
533
- assert_eq!(ctx.history_length(), 14);
534
- ctx.timer(Duration::from_secs(1)).await;
535
- assert_eq!(ctx.history_length(), 19);
536
- Ok(().into())
537
- });
538
- worker
539
- .submit_wf(
540
- wfid.to_owned(),
541
- DEFAULT_WORKFLOW_TYPE.to_owned(),
542
- vec![],
543
- WorkflowOptions::default(),
544
- )
545
- .await
546
- .unwrap();
572
+ #[workflow]
573
+ #[derive(Default)]
574
+ struct HistoryLengthWf;
575
+
576
+ #[workflow_methods]
577
+ impl HistoryLengthWf {
578
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
579
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
580
+ assert_eq!(ctx.history_length(), 3);
581
+ ctx.timer(Duration::from_secs(1)).await;
582
+ assert_eq!(ctx.history_length(), 14);
583
+ ctx.timer(Duration::from_secs(1)).await;
584
+ assert_eq!(ctx.history_length(), 19);
585
+ Ok(())
586
+ }
587
+ }
588
+
589
+ worker.register_workflow::<HistoryLengthWf>();
547
590
  worker.run_until_done().await.unwrap();
548
591
  }
549
592
 
@@ -583,31 +626,37 @@ async fn sets_build_id_from_wft_complete() {
583
626
  },
584
627
  );
585
628
 
586
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
587
- // First task, it should be empty, since replaying and nothing in first WFT completed
588
- assert_eq!(ctx.current_deployment_version(), None);
589
- ctx.timer(Duration::from_secs(1)).await;
590
- assert_eq!(
591
- ctx.current_deployment_version().unwrap().build_id,
592
- "enchi-cat"
593
- );
594
- ctx.timer(Duration::from_secs(1)).await;
595
- // Not replaying at this point, so we should see the worker's build id
596
- assert_eq!(
597
- ctx.current_deployment_version().unwrap().build_id,
598
- "fierce-predator"
599
- );
600
- ctx.timer(Duration::from_secs(1)).await;
601
- assert_eq!(
602
- ctx.current_deployment_version().unwrap().build_id,
603
- "fierce-predator"
604
- );
605
- Ok(().into())
606
- });
607
- worker
608
- .submit_wf(wfid, DEFAULT_WORKFLOW_TYPE, vec![], Default::default())
609
- .await
610
- .unwrap();
629
+ #[workflow]
630
+ #[derive(Default)]
631
+ struct BuildIdWf;
632
+
633
+ #[workflow_methods]
634
+ impl BuildIdWf {
635
+ #[run(name = DEFAULT_WORKFLOW_TYPE)]
636
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
637
+ // First task, it should be empty, since replaying and nothing in first WFT completed
638
+ assert_eq!(ctx.current_deployment_version(), None);
639
+ ctx.timer(Duration::from_secs(1)).await;
640
+ assert_eq!(
641
+ ctx.current_deployment_version().unwrap().build_id,
642
+ "enchi-cat"
643
+ );
644
+ ctx.timer(Duration::from_secs(1)).await;
645
+ // Not replaying at this point, so we should see the worker's build id
646
+ assert_eq!(
647
+ ctx.current_deployment_version().unwrap().build_id,
648
+ "fierce-predator"
649
+ );
650
+ ctx.timer(Duration::from_secs(1)).await;
651
+ assert_eq!(
652
+ ctx.current_deployment_version().unwrap().build_id,
653
+ "fierce-predator"
654
+ );
655
+ Ok(())
656
+ }
657
+ }
658
+
659
+ worker.register_workflow::<BuildIdWf>();
611
660
  worker.run_until_done().await.unwrap();
612
661
  }
613
662
 
@@ -666,7 +715,7 @@ impl<SK> TrackingSlotSupplier<SK> {
666
715
  #[async_trait::async_trait]
667
716
  impl<SK> SlotSupplier for TrackingSlotSupplier<SK>
668
717
  where
669
- SK: temporalio_common::worker::SlotKind + Send + Sync,
718
+ SK: temporalio_sdk_core::SlotKind + Send + Sync,
670
719
  SK::Info: SlotInfoTrait,
671
720
  {
672
721
  type SlotKind = SK;
@@ -711,50 +760,56 @@ async fn test_custom_slot_supplier_simple() {
711
760
  ));
712
761
 
713
762
  let mut starter = CoreWfStarter::new("test_custom_slot_supplier_simple");
714
- starter.worker_config.max_outstanding_workflow_tasks = None;
715
- starter.worker_config.max_outstanding_local_activities = None;
716
- starter.worker_config.max_outstanding_activities = None;
717
- starter.worker_config.max_outstanding_nexus_tasks = None;
763
+ starter.sdk_config.register_activities(StdActivities);
718
764
 
719
765
  let mut tb = TunerBuilder::default();
720
766
  tb.workflow_slot_supplier(wf_supplier.clone());
721
767
  tb.activity_slot_supplier(activity_supplier.clone());
722
768
  tb.local_activity_slot_supplier(local_activity_supplier.clone());
723
- starter.worker_config.tuner = Some(Arc::new(tb.build()));
769
+ starter.sdk_config.tuner = Arc::new(tb.build());
724
770
 
725
771
  let mut worker = starter.worker().await;
726
772
 
727
- worker.register_activity(
728
- "SlotSupplierActivity",
729
- |_: temporalio_sdk::ActContext, _: ()| async move { Ok(()) },
730
- );
731
- worker.register_wf(
732
- "SlotSupplierWorkflow".to_owned(),
733
- |ctx: WfContext| async move {
773
+ #[workflow]
774
+ #[derive(Default)]
775
+ struct SlotSupplierWorkflow;
776
+
777
+ #[workflow_methods]
778
+ impl SlotSupplierWorkflow {
779
+ #[run]
780
+ async fn run(ctx: &mut WorkflowContext<Self>) -> WorkflowResult<()> {
734
781
  let _result = ctx
735
- .activity(ActivityOptions {
736
- activity_type: "SlotSupplierActivity".to_string(),
737
- start_to_close_timeout: Some(Duration::from_secs(10)),
738
- ..Default::default()
739
- })
782
+ .start_activity(
783
+ StdActivities::no_op,
784
+ (),
785
+ ActivityOptions {
786
+ start_to_close_timeout: Some(Duration::from_secs(10)),
787
+ ..Default::default()
788
+ },
789
+ )
740
790
  .await;
741
791
  let _result = ctx
742
- .local_activity(LocalActivityOptions {
743
- activity_type: "SlotSupplierActivity".to_string(),
744
- start_to_close_timeout: Some(Duration::from_secs(10)),
745
- ..Default::default()
746
- })
792
+ .start_local_activity(
793
+ StdActivities::no_op,
794
+ (),
795
+ LocalActivityOptions {
796
+ start_to_close_timeout: Some(Duration::from_secs(10)),
797
+ ..Default::default()
798
+ },
799
+ )
747
800
  .await;
748
- Ok(().into())
749
- },
750
- );
801
+ Ok(())
802
+ }
803
+ }
751
804
 
805
+ worker.register_workflow::<SlotSupplierWorkflow>();
806
+
807
+ let task_queue = starter.get_task_queue().to_owned();
752
808
  worker
753
- .submit_wf(
754
- "test-wf".to_owned(),
755
- "SlotSupplierWorkflow".to_owned(),
756
- vec![],
757
- Default::default(),
809
+ .submit_workflow(
810
+ SlotSupplierWorkflow::run,
811
+ (),
812
+ WorkflowStartOptions::new(task_queue, "test-wf".to_owned()).build(),
758
813
  )
759
814
  .await
760
815
  .unwrap();
@@ -825,7 +880,7 @@ async fn test_custom_slot_supplier_simple() {
825
880
  slot_type: "activity",
826
881
  activity_type: Some(act_type),
827
882
  ..
828
- } if act_type == "SlotSupplierActivity"))
883
+ } if act_type.contains("no_op")))
829
884
  );
830
885
  assert!(
831
886
  local_activity_events
@@ -834,7 +889,7 @@ async fn test_custom_slot_supplier_simple() {
834
889
  slot_type: "local_activity",
835
890
  activity_type: Some(act_type),
836
891
  ..
837
- } if act_type == "SlotSupplierActivity"))
892
+ } if act_type.contains("no_op")))
838
893
  );
839
894
  assert!(wf_events.iter().any(|e| matches!(
840
895
  e,
@@ -907,12 +962,13 @@ async fn shutdown_worker_not_retried() {
907
962
  .await;
908
963
 
909
964
  let mut opts = get_integ_server_options();
910
- let uri = format!("http://localhost:{}", fs.addr.port())
911
- .parse()
965
+ opts.target = format!("http://localhost:{}", fs.addr.port())
966
+ .parse::<url::Url>()
912
967
  .unwrap();
913
- opts.target_url = uri;
914
- opts.skip_get_system_info = true;
915
- let client = opts.connect("ns", None).await.unwrap();
968
+ opts.set_skip_get_system_info(true);
969
+ let connection = Connection::connect(opts).await.unwrap();
970
+ let client_opts = temporalio_client::ClientOptions::new("ns").build();
971
+ let client = temporalio_client::Client::new(connection, client_opts).unwrap();
916
972
 
917
973
  let wf_type = "shutdown_worker_not_retried";
918
974
  let mut starter = CoreWfStarter::new_with_overrides(wf_type, None, Some(client));
@@ -920,3 +976,10 @@ async fn shutdown_worker_not_retried() {
920
976
  drain_pollers_and_shutdown(&worker).await;
921
977
  assert_eq!(shutdown_call_count.load(Ordering::Relaxed), 1);
922
978
  }
979
+
980
+ #[test]
981
+ fn test_default_build_id() {
982
+ let o = WorkerOptions::new("task_queue").build();
983
+ assert!(!o.deployment_options.version.build_id.is_empty());
984
+ assert_ne!(o.deployment_options.version.build_id, "undetermined");
985
+ }