@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
@@ -46,7 +46,7 @@ use temporalio_common::protos::{
46
46
  RecordMarkerCommandAttributes, UpsertWorkflowSearchAttributesCommandAttributes,
47
47
  },
48
48
  common::v1::SearchAttributes,
49
- enums::v1::{CommandType, IndexedValueType},
49
+ enums::v1::CommandType,
50
50
  },
51
51
  };
52
52
 
@@ -141,13 +141,10 @@ pub(super) fn has_change<'a>(
141
141
  );
142
142
  vec![]
143
143
  } else {
144
- serialized.metadata.insert(
145
- "type".to_string(),
146
- IndexedValueType::KeywordList
147
- .as_str_name()
148
- .as_bytes()
149
- .to_vec(),
150
- );
144
+ // "KeywordList" is the expected type for this search attribute
145
+ serialized
146
+ .metadata
147
+ .insert("type".to_string(), "KeywordList".as_bytes().to_vec());
151
148
  let indexed_fields = {
152
149
  let mut m = HashMap::new();
153
150
  m.insert(VERSION_SEARCH_ATTR_KEY.to_string(), serialized);
@@ -50,11 +50,11 @@ pub(super) fn upsert_search_attrs(
50
50
  let has_flag = internal_flags
51
51
  .borrow_mut()
52
52
  .try_use(CoreInternalFlags::UpsertSearchAttributeOnPatch, !replaying);
53
- if has_flag
54
- && attribs
55
- .search_attributes
56
- .contains_key(VERSION_SEARCH_ATTR_KEY)
57
- {
53
+ let contains_version_key = attribs
54
+ .search_attributes
55
+ .as_ref()
56
+ .is_some_and(|sa| sa.indexed_fields.contains_key(VERSION_SEARCH_ATTR_KEY));
57
+ if has_flag && contains_version_key {
58
58
  warn!(
59
59
  "Upserting the {VERSION_SEARCH_ATTR_KEY} search attribute directly from workflow code \
60
60
  is not permitted and has no effect!"
@@ -63,7 +63,7 @@ pub(super) fn upsert_search_attrs(
63
63
  // this.
64
64
  create_new(Default::default())
65
65
  } else {
66
- create_new(attribs.search_attributes.into())
66
+ create_new(attribs.search_attributes.unwrap_or_default())
67
67
  }
68
68
  }
69
69
 
@@ -186,21 +186,18 @@ mod tests {
186
186
  worker::client::mocks::mock_worker_client,
187
187
  };
188
188
  use std::collections::HashMap;
189
- use temporalio_common::{
190
- Worker,
191
- protos::{
192
- coresdk::{
193
- AsJsonPayloadExt,
194
- workflow_activation::{WorkflowActivationJob, workflow_activation_job},
195
- workflow_commands::SetPatchMarker,
196
- workflow_completion::WorkflowActivationCompletion,
197
- },
198
- temporal::api::{
199
- command::v1::command::Attributes,
200
- common::v1::Payload,
201
- enums::v1::EventType,
202
- history::v1::{HistoryEvent, UpsertWorkflowSearchAttributesEventAttributes},
203
- },
189
+ use temporalio_common::protos::{
190
+ coresdk::{
191
+ AsJsonPayloadExt,
192
+ workflow_activation::{WorkflowActivationJob, workflow_activation_job},
193
+ workflow_commands::SetPatchMarker,
194
+ workflow_completion::WorkflowActivationCompletion,
195
+ },
196
+ temporal::api::{
197
+ command::v1::command::Attributes,
198
+ common::v1::Payload,
199
+ enums::v1::EventType,
200
+ history::v1::{HistoryEvent, UpsertWorkflowSearchAttributesEventAttributes},
204
201
  },
205
202
  };
206
203
 
@@ -318,7 +315,9 @@ mod tests {
318
315
  };
319
316
  cmds.push(
320
317
  UpsertWorkflowSearchAttributes {
321
- search_attributes: ver_upsert,
318
+ search_attributes: Some(SearchAttributes {
319
+ indexed_fields: ver_upsert,
320
+ }),
322
321
  }
323
322
  .into(),
324
323
  );
@@ -13,6 +13,7 @@ use super::{
13
13
  workflow_task_state_machine::WorkflowTaskMachine,
14
14
  };
15
15
  use crate::{
16
+ WorkerConfig,
16
17
  abstractions::dbg_panic,
17
18
  internal_flags::{CoreInternalFlags, InternalFlags},
18
19
  protosext::{
@@ -66,13 +67,14 @@ use temporalio_common::{
66
67
  command::v1::{
67
68
  Command as ProtoCommand, CommandAttributesExt, command::Attributes as ProtoCmdAttrs,
68
69
  },
70
+ common::v1::SearchAttributes,
69
71
  enums::v1::EventType,
70
72
  history::v1::{HistoryEvent, history_event},
71
73
  protocol::v1::{Message as ProtocolMessage, message::SequencingId},
72
74
  sdk::v1::{UserMetadata, WorkflowTaskCompletedMetadata},
73
75
  },
74
76
  },
75
- worker::{WorkerConfig, WorkerDeploymentVersion},
77
+ worker::WorkerDeploymentVersion,
76
78
  };
77
79
 
78
80
  type Result<T, E = WFMachinesError> = std::result::Result<T, E>;
@@ -126,6 +128,10 @@ pub(crate) struct WorkflowMachines {
126
128
  history_size_bytes: u64,
127
129
  /// Set on each WFT started event
128
130
  continue_as_new_suggested: bool,
131
+ /// Set on each WFT started event
132
+ suggest_continue_as_new_reasons: Vec<i32>,
133
+ /// Set on each WFT started event
134
+ target_worker_deployment_version_changed: bool,
129
135
  /// Set if the current WFT is already complete and that completion event had legacy build-id
130
136
  /// or a deployment version in it. Will use an empty deployment name if it's legacy build-id.
131
137
  current_wft_deployment_info: Option<WorkerDeploymentVersion>,
@@ -290,6 +296,8 @@ impl WorkflowMachines {
290
296
  observed_internal_flags: Rc::new(RefCell::new(observed_internal_flags)),
291
297
  history_size_bytes: 0,
292
298
  continue_as_new_suggested: false,
299
+ suggest_continue_as_new_reasons: Default::default(),
300
+ target_worker_deployment_version_changed: false,
293
301
  current_wft_deployment_info: None,
294
302
  all_machines: Default::default(),
295
303
  machine_is_core_created: Default::default(),
@@ -471,6 +479,8 @@ impl WorkflowMachines {
471
479
  .last_sdk_version()
472
480
  .unwrap_or_default()
473
481
  .to_owned(),
482
+ suggest_continue_as_new_reasons: self.suggest_continue_as_new_reasons.clone(),
483
+ target_worker_deployment_version_changed: self.target_worker_deployment_version_changed,
474
484
  }
475
485
  }
476
486
 
@@ -635,6 +645,9 @@ impl WorkflowMachines {
635
645
  if events.is_empty() {
636
646
  self.replaying = false;
637
647
  }
648
+ // Track if we were replaying before processing events. We only want to record replay
649
+ // latency if we actually did replay work (i.e., started with replaying=true).
650
+ let was_replaying = self.replaying;
638
651
  let replay_start = Instant::now();
639
652
 
640
653
  if let Some(last_event) = events.last()
@@ -821,7 +834,10 @@ impl WorkflowMachines {
821
834
  }
822
835
  }
823
836
 
824
- if !self.replaying {
837
+ // Only record replay latency if we actually did replay work. This avoids recording
838
+ // near-zero latencies for the first workflow task (which has no history to replay) or
839
+ // when there were no events to process.
840
+ if was_replaying && !self.replaying {
825
841
  self.metrics.wf_task_replay_latency(replay_start.elapsed());
826
842
  }
827
843
 
@@ -885,6 +901,9 @@ impl WorkflowMachines {
885
901
  {
886
902
  self.history_size_bytes = u64::try_from(attrs.history_size_bytes).unwrap_or_default();
887
903
  self.continue_as_new_suggested = attrs.suggest_continue_as_new;
904
+ self.suggest_continue_as_new_reasons = attrs.suggest_continue_as_new_reasons.clone();
905
+ self.target_worker_deployment_version_changed =
906
+ attrs.target_worker_deployment_version_changed;
888
907
  }
889
908
 
890
909
  if let Some(initial_cmd_id) = event.get_initial_command_event_id() {
@@ -1637,8 +1656,13 @@ impl WorkflowMachines {
1637
1656
  attrs.retry_policy.clone_from(&started_info.retry_policy);
1638
1657
  }
1639
1658
  }
1640
- if attrs.search_attributes.is_empty() {
1641
- attrs.search_attributes = self.drive_me.get_current_search_attributes();
1659
+ if attrs.search_attributes.is_none() {
1660
+ let current = self.drive_me.get_current_search_attributes();
1661
+ if !current.is_empty() {
1662
+ attrs.search_attributes = Some(SearchAttributes {
1663
+ indexed_fields: current,
1664
+ });
1665
+ }
1642
1666
  }
1643
1667
  attrs
1644
1668
  }
@@ -1,11 +1,11 @@
1
1
  use crate::{
2
- MetricsContext,
2
+ MetricsContext, WorkerConfig,
3
3
  abstractions::dbg_panic,
4
4
  internal_flags::CoreInternalFlags,
5
5
  protosext::{WorkflowActivationExt, protocol_messages::IncomingProtocolMessage},
6
6
  telemetry::metrics,
7
7
  worker::{
8
- LEGACY_QUERY_ID, LocalActRequest,
8
+ LEGACY_QUERY_ID, LocalActRequest, WorkflowErrorType,
9
9
  workflow::{
10
10
  ActivationAction, ActivationCompleteOutcome, ActivationCompleteResult,
11
11
  ActivationOrAuto, BufferedTasks, DrivenWorkflow, EvictionRequestResult,
@@ -28,25 +28,20 @@ use std::{
28
28
  sync::{Arc, mpsc::Sender},
29
29
  time::{Duration, Instant},
30
30
  };
31
- use temporalio_common::{
32
- errors::WorkflowErrorType,
33
- protos::{
34
- TaskToken,
35
- coresdk::{
36
- workflow_activation::{
37
- WorkflowActivation, create_evict_activation, query_to_job,
38
- remove_from_cache::EvictionReason, workflow_activation_job,
39
- },
40
- workflow_commands::{FailWorkflowExecution, QueryResult},
41
- workflow_completion,
42
- },
43
- temporal::api::{
44
- command::v1::command::Attributes as CmdAttribs,
45
- enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
46
- failure::v1::Failure,
31
+ use temporalio_common::protos::{
32
+ TaskToken,
33
+ coresdk::{
34
+ workflow_activation::{
35
+ WorkflowActivation, create_evict_activation, query_to_job,
36
+ remove_from_cache::EvictionReason, workflow_activation_job,
47
37
  },
38
+ workflow_commands::{FailWorkflowExecution, QueryResult},
39
+ workflow_completion,
40
+ },
41
+ temporal::api::{
42
+ enums::v1::{VersioningBehavior, WorkflowTaskFailedCause},
43
+ failure::v1::Failure,
48
44
  },
49
- worker::WorkerConfig,
50
45
  };
51
46
  use tokio::sync::oneshot;
52
47
  use tracing::Span;
@@ -191,6 +186,7 @@ impl ManagedRun {
191
186
  attempt = %work.attempt,
192
187
  "Applying new workflow task from server"
193
188
  );
189
+ let is_incremental = work.is_incremental();
194
190
  let wft_info = WorkflowTaskInfo {
195
191
  attempt: work.attempt,
196
192
  task_token: work.task_token,
@@ -239,7 +235,9 @@ impl ManagedRun {
239
235
 
240
236
  // The update field is only populated in the event we hit the cache
241
237
  let activation = if work.update.is_real() {
242
- self.metrics.sticky_cache_hit();
238
+ if is_incremental {
239
+ self.metrics.sticky_cache_hit();
240
+ }
243
241
  self.wfm.new_work_from_server(work.update, work.messages)?
244
242
  } else {
245
243
  let r = self.wfm.get_next_activation()?;
@@ -440,6 +438,7 @@ impl ManagedRun {
440
438
  action: ActivationAction::RespondLegacyQuery {
441
439
  result: Box::new(qr),
442
440
  },
441
+ metrics: self.metrics.clone(),
443
442
  }),
444
443
  resp_chan,
445
444
  );
@@ -1127,27 +1126,6 @@ impl ManagedRun {
1127
1126
  )
1128
1127
  };
1129
1128
 
1130
- // Record metrics for any outgoing terminal commands
1131
- for cmd in commands.iter() {
1132
- match cmd.attributes.as_ref() {
1133
- Some(CmdAttribs::CompleteWorkflowExecutionCommandAttributes(_)) => {
1134
- self.metrics.wf_completed();
1135
- }
1136
- Some(CmdAttribs::FailWorkflowExecutionCommandAttributes(attrs)) => {
1137
- if metrics::should_record_failure_metric(&attrs.failure) {
1138
- self.metrics.wf_failed();
1139
- }
1140
- }
1141
- Some(CmdAttribs::ContinueAsNewWorkflowExecutionCommandAttributes(_)) => {
1142
- self.metrics.wf_continued_as_new();
1143
- }
1144
- Some(CmdAttribs::CancelWorkflowExecutionCommandAttributes(_)) => {
1145
- self.metrics.wf_canceled();
1146
- }
1147
- _ => (),
1148
- }
1149
- }
1150
-
1151
1129
  let attempt = self.wft.as_ref().map(|t| t.info.attempt).unwrap_or(1);
1152
1130
  ActivationCompleteOutcome::ReportWFTSuccess(ServerCommandsWithWorkflowInfo {
1153
1131
  task_token: data.task_token,
@@ -1160,6 +1138,7 @@ impl ManagedRun {
1160
1138
  versioning_behavior: data.versioning_behavior,
1161
1139
  attempt,
1162
1140
  },
1141
+ metrics: self.metrics.clone(),
1163
1142
  })
1164
1143
  } else {
1165
1144
  ActivationCompleteOutcome::DoNothing
@@ -15,7 +15,7 @@ pub(crate) use driven_workflow::DrivenWorkflow;
15
15
  pub(crate) use history_update::HistoryUpdate;
16
16
 
17
17
  use crate::{
18
- MetricsContext,
18
+ MetricsContext, WorkerConfig,
19
19
  abstractions::{
20
20
  MeteredPermitDealer, TrackedOwnedMeteredSemPermit, UsedMeteredSemPermit, dbg_panic,
21
21
  take_cell::TakeCell,
@@ -26,11 +26,10 @@ use crate::{
26
26
  telemetry::{
27
27
  VecDisplayer,
28
28
  metrics::{self, FailureReason},
29
- set_trace_subscriber_for_current_thread,
30
29
  },
31
30
  worker::{
32
- LocalActRequest, LocalActivityExecutionResult, LocalActivityResolution,
33
- PostActivateHookData,
31
+ ActivitySlotKind, CompleteWfError, LocalActRequest, LocalActivityExecutionResult,
32
+ LocalActivityResolution, PollError, PostActivateHookData, WorkflowSlotKind,
34
33
  activities::{ActivitiesFromWFTsHandle, LocalActivityManager},
35
34
  client::{LegacyQueryResult, WorkerClient, WorkflowTaskCompletion},
36
35
  workflow::{
@@ -61,7 +60,6 @@ use std::{
61
60
  };
62
61
  use temporalio_client::MESSAGE_TOO_LARGE_KEY;
63
62
  use temporalio_common::{
64
- errors::{CompleteWfError, PollError},
65
63
  protos::{
66
64
  TaskToken,
67
65
  coresdk::{
@@ -88,7 +86,7 @@ use temporalio_common::{
88
86
  workflowservice::v1::{PollActivityTaskQueueResponse, get_system_info_response},
89
87
  },
90
88
  },
91
- worker::{ActivitySlotKind, WorkerConfig, WorkflowSlotKind},
89
+ telemetry::set_trace_subscriber_for_current_thread,
92
90
  };
93
91
  use tokio::{
94
92
  sync::{
@@ -98,8 +96,7 @@ use tokio::{
98
96
  task::{LocalSet, spawn_blocking},
99
97
  };
100
98
  use tokio_stream::wrappers::UnboundedReceiverStream;
101
- use tokio_util::either::Either;
102
- use tokio_util::sync::CancellationToken;
99
+ use tokio_util::{either::Either, sync::CancellationToken};
103
100
  use tracing::{Span, Subscriber};
104
101
 
105
102
  /// Id used by server for "legacy" queries. IE: Queries that come in the `query` rather than
@@ -355,6 +352,7 @@ impl Workflows {
355
352
  mut versioning_behavior,
356
353
  attempt,
357
354
  },
355
+ metrics: run_metrics,
358
356
  } => {
359
357
  let reserved_act_permits =
360
358
  self.reserve_activity_slots_for_outgoing_commands(commands.as_mut_slice());
@@ -372,6 +370,7 @@ impl Workflows {
372
370
  } else {
373
371
  0
374
372
  };
373
+ let mut maybe_record_terminal_metric = detect_terminal_command(&commands);
375
374
  let mut completion = WorkflowTaskCompletion {
376
375
  task_token: task_token.clone(),
377
376
  commands,
@@ -398,6 +397,9 @@ impl Workflows {
398
397
  self.handle_wft_reporting_errs(run_id, || async {
399
398
  match self.client.complete_workflow_task(completion).await {
400
399
  Ok(response) => {
400
+ if let Some(record) = maybe_record_terminal_metric.take() {
401
+ record(&run_metrics);
402
+ }
401
403
  if response.reset_history_event_id > 0 {
402
404
  reset_last_started_to = Some(response.reset_history_event_id);
403
405
  }
@@ -460,6 +462,7 @@ impl Workflows {
460
462
  ServerCommandsWithWorkflowInfo {
461
463
  task_token,
462
464
  action: ActivationAction::RespondLegacyQuery { result },
465
+ ..
463
466
  } => {
464
467
  self.respond_legacy_query(task_token, LegacyQueryResult::Succeeded(*result))
465
468
  .await;
@@ -1008,10 +1011,18 @@ enum FailedActivationWFTReport {
1008
1011
  ReportLegacyQueryFailure(TaskToken, Failure),
1009
1012
  }
1010
1013
 
1011
- #[derive(Debug)]
1012
1014
  struct ServerCommandsWithWorkflowInfo {
1013
1015
  task_token: TaskToken,
1014
1016
  action: ActivationAction,
1017
+ metrics: MetricsContext,
1018
+ }
1019
+ impl Debug for ServerCommandsWithWorkflowInfo {
1020
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1021
+ f.debug_struct("ServerCommandsWithWorkflowInfo")
1022
+ .field("task_token", &self.task_token)
1023
+ .field("action", &self.action)
1024
+ .finish()
1025
+ }
1015
1026
  }
1016
1027
 
1017
1028
  #[derive(Debug)]
@@ -1031,6 +1042,7 @@ pub(crate) enum ActivationAction {
1031
1042
  }
1032
1043
 
1033
1044
  #[derive(Debug)]
1045
+ #[allow(clippy::large_enum_variant)]
1034
1046
  enum EvictionRequestResult {
1035
1047
  EvictionRequested(Option<u32>, RunUpdateAct),
1036
1048
  NotFound,
@@ -1046,6 +1058,35 @@ impl EvictionRequestResult {
1046
1058
  }
1047
1059
  }
1048
1060
 
1061
+ #[allow(clippy::type_complexity)]
1062
+ fn detect_terminal_command(
1063
+ commands: &[ProtoCommand],
1064
+ ) -> Option<Box<dyn FnOnce(&MetricsContext) + Send>> {
1065
+ for cmd in commands {
1066
+ match cmd.attributes.as_ref() {
1067
+ Some(Attributes::CompleteWorkflowExecutionCommandAttributes(_)) => {
1068
+ return Some(Box::new(|m: &MetricsContext| m.wf_completed()));
1069
+ }
1070
+ Some(Attributes::FailWorkflowExecutionCommandAttributes(attrs)) => {
1071
+ let should_record = metrics::should_record_failure_metric(&attrs.failure);
1072
+ return Some(Box::new(move |m: &MetricsContext| {
1073
+ if should_record {
1074
+ m.wf_failed();
1075
+ }
1076
+ }));
1077
+ }
1078
+ Some(Attributes::ContinueAsNewWorkflowExecutionCommandAttributes(_)) => {
1079
+ return Some(Box::new(|m: &MetricsContext| m.wf_continued_as_new()));
1080
+ }
1081
+ Some(Attributes::CancelWorkflowExecutionCommandAttributes(_)) => {
1082
+ return Some(Box::new(|m: &MetricsContext| m.wf_canceled()));
1083
+ }
1084
+ _ => {}
1085
+ }
1086
+ }
1087
+ None
1088
+ }
1089
+
1049
1090
  #[derive(Debug)]
1050
1091
  #[allow(dead_code)] // Not always used in non-test
1051
1092
  pub(crate) struct WorkflowStateInfo {
@@ -1,5 +1,5 @@
1
1
  use crate::{
2
- MetricsContext,
2
+ MetricsContext, WorkerConfig,
3
3
  telemetry::metrics::workflow_type,
4
4
  worker::workflow::{
5
5
  HistoryUpdate, LocalActivityRequestSink, PermittedWFT, RequestEvictMsg, RunBasics,
@@ -8,12 +8,9 @@ use crate::{
8
8
  };
9
9
  use lru::LruCache;
10
10
  use std::{num::NonZeroUsize, rc::Rc, sync::Arc};
11
- use temporalio_common::{
12
- protos::{
13
- coresdk::workflow_activation::remove_from_cache::EvictionReason,
14
- temporal::api::workflowservice::v1::get_system_info_response,
15
- },
16
- worker::WorkerConfig,
11
+ use temporalio_common::protos::{
12
+ coresdk::workflow_activation::remove_from_cache::EvictionReason,
13
+ temporal::api::workflowservice::v1::get_system_info_response,
17
14
  };
18
15
 
19
16
  pub(super) struct RunCache {
@@ -2,6 +2,7 @@ use crate::{
2
2
  abstractions::OwnedMeteredSemPermit,
3
3
  protosext::ValidPollWFTQResponse,
4
4
  worker::{
5
+ WorkflowSlotKind,
5
6
  client::WorkerClient,
6
7
  workflow::{
7
8
  CacheMissFetchReq, HistoryUpdate, NextPageReq, PermittedWFT,
@@ -11,10 +12,7 @@ use crate::{
11
12
  };
12
13
  use futures_util::{FutureExt, Stream, StreamExt, stream, stream::PollNext};
13
14
  use std::{future, sync::Arc};
14
- use temporalio_common::{
15
- protos::{TaskToken, coresdk::WorkflowSlotInfo},
16
- worker::WorkflowSlotKind,
17
- };
15
+ use temporalio_common::protos::{TaskToken, coresdk::WorkflowSlotInfo};
18
16
  use tracing::Span;
19
17
 
20
18
  /// Transforms incoming validated WFTs and history fetching requests into [PermittedWFT]s ready
@@ -1,21 +1,18 @@
1
1
  use crate::{
2
- MetricsContext,
2
+ MetricsContext, WorkerConfig,
3
3
  abstractions::{MeteredPermitDealer, OwnedMeteredSemPermit},
4
4
  pollers::{BoxedWFPoller, LongPollBuffer, Poller, WorkflowTaskOptions, WorkflowTaskPoller},
5
5
  protosext::ValidPollWFTQResponse,
6
6
  telemetry::metrics::{workflow_poller, workflow_sticky_poller},
7
- worker::{client::WorkerClient, wft_poller_behavior},
7
+ worker::{WorkflowSlotKind, client::WorkerClient, wft_poller_behavior},
8
8
  };
9
9
  use crossbeam_utils::atomic::AtomicCell;
10
10
  use futures_util::{Stream, stream};
11
11
  use std::{
12
- sync::{Arc, OnceLock},
12
+ sync::{Arc, OnceLock, atomic::AtomicBool},
13
13
  time::SystemTime,
14
14
  };
15
- use temporalio_common::{
16
- protos::temporal::api::workflowservice::v1::PollWorkflowTaskQueueResponse,
17
- worker::{WorkerConfig, WorkflowSlotKind},
18
- };
15
+ use temporalio_common::protos::temporal::api::workflowservice::v1::PollWorkflowTaskQueueResponse;
19
16
  use tokio::sync::watch;
20
17
  use tokio_util::sync::CancellationToken;
21
18
 
@@ -29,6 +26,7 @@ pub(crate) fn make_wft_poller(
29
26
  wft_slots: &MeteredPermitDealer<WorkflowSlotKind>,
30
27
  last_successful_poll_time: Arc<AtomicCell<Option<SystemTime>>>,
31
28
  sticky_last_successful_poll_time: Arc<AtomicCell<Option<SystemTime>>>,
29
+ graceful_poll_shutdown: Arc<AtomicBool>,
32
30
  ) -> impl Stream<
33
31
  Item = Result<
34
32
  (
@@ -62,6 +60,7 @@ pub(crate) fn make_wft_poller(
62
60
  wft_poller_shared: wft_poller_shared.clone(),
63
61
  },
64
62
  last_successful_poll_time,
63
+ graceful_poll_shutdown.clone(),
65
64
  );
66
65
  let sticky_queue_poller = sticky_queue_name.as_ref().map(|sqn| {
67
66
  let sticky_metrics = metrics.with_new_attrs([workflow_sticky_poller()]);
@@ -77,6 +76,7 @@ pub(crate) fn make_wft_poller(
77
76
  }),
78
77
  WorkflowTaskOptions { wft_poller_shared },
79
78
  sticky_last_successful_poll_time,
79
+ graceful_poll_shutdown,
80
80
  )
81
81
  });
82
82
  let wf_task_poll_buffer = Box::new(WorkflowTaskPoller::new(
@@ -258,11 +258,10 @@ mod tests {
258
258
  use super::*;
259
259
  use crate::{
260
260
  abstractions::tests::fixed_size_permit_dealer, pollers::MockPermittedPollBuffer,
261
- test_help::mock_poller,
261
+ test_help::mock_poller, worker::WorkflowSlotKind,
262
262
  };
263
263
  use futures_util::{StreamExt, pin_mut};
264
264
  use std::sync::Arc;
265
- use temporalio_common::worker::WorkflowSlotKind;
266
265
 
267
266
  #[tokio::test]
268
267
  async fn poll_timeouts_do_not_produce_responses() {
@@ -10,9 +10,7 @@ use crate::{
10
10
  };
11
11
  use futures_util::{Stream, StreamExt, stream, stream::PollNext};
12
12
  use std::{collections::VecDeque, fmt::Debug, future, sync::Arc};
13
- use temporalio_common::{
14
- errors::PollError, protos::coresdk::workflow_activation::remove_from_cache::EvictionReason,
15
- };
13
+ use temporalio_common::protos::coresdk::workflow_activation::remove_from_cache::EvictionReason;
16
14
  use tokio_util::sync::CancellationToken;
17
15
  use tracing::{Level, Span};
18
16
 
@@ -0,0 +1,6 @@
1
+ #[test]
2
+ fn activities_procmacro_build_tests() {
3
+ let t = trybuild::TestCases::new();
4
+ t.pass("tests/activities_trybuild/*_pass.rs");
5
+ t.compile_fail("tests/activities_trybuild/*_fail.rs");
6
+ }
@@ -0,0 +1,54 @@
1
+ use std::sync::Arc;
2
+ use temporalio_macros::activities;
3
+ use temporalio_sdk::activities::{ActivityContext, ActivityError};
4
+
5
+ pub struct MyActivities;
6
+
7
+ #[activities]
8
+ impl MyActivities {
9
+ #[activity]
10
+ pub async fn static_activity(
11
+ _ctx: ActivityContext,
12
+ _in: String,
13
+ ) -> Result<String, ActivityError> {
14
+ Ok("Can be static".to_string())
15
+ }
16
+
17
+ #[activity]
18
+ pub async fn activity(
19
+ self: Arc<Self>,
20
+ _ctx: ActivityContext,
21
+ _in: bool,
22
+ ) -> Result<String, ActivityError> {
23
+ Ok("I'm done!".to_string())
24
+ }
25
+
26
+ #[activity]
27
+ pub async fn activity_arc_fully_qualified(
28
+ self: std::sync::Arc<Self>,
29
+ _ctx: ActivityContext,
30
+ _in: bool,
31
+ ) -> Result<String, ActivityError> {
32
+ Ok("I'm done!".to_string())
33
+ }
34
+
35
+ #[activity]
36
+ pub fn sync_activity(_ctx: ActivityContext, _in: bool) -> Result<String, ActivityError> {
37
+ Ok("Sync activities are supported too".to_string())
38
+ }
39
+ }
40
+
41
+ pub struct MyActivitiesStatic;
42
+
43
+ #[activities]
44
+ impl MyActivitiesStatic {
45
+ #[activity]
46
+ pub async fn static_activity(
47
+ _ctx: ActivityContext,
48
+ _in: String,
49
+ ) -> Result<String, ActivityError> {
50
+ Ok("Can be static".to_string())
51
+ }
52
+ }
53
+
54
+ fn main() {}
@@ -0,0 +1,18 @@
1
+ use temporalio_macros::activities;
2
+
3
+ pub struct BadActivities;
4
+
5
+ #[activities]
6
+ impl BadActivities {
7
+ #[activity]
8
+ pub async fn no_context(
9
+ &self,
10
+ _ctx: ActivityContext,
11
+ _in: String,
12
+ ) -> Result<String, ActivityError> {
13
+ // This should fail because the self type is invalid.
14
+ Ok("bad".to_string())
15
+ }
16
+ }
17
+
18
+ fn main() {}
@@ -0,0 +1,5 @@
1
+ error: Activity methods with instance state must use `self: Arc<Self>` as the receiver, not `self`, `&self`, or `&mut self`
2
+ --> tests/activities_trybuild/invalid_self_type_fail.rs:9:9
3
+ |
4
+ 9 | &self,
5
+ | ^^^^^
@@ -0,0 +1,14 @@
1
+ use temporalio_macros::activities;
2
+
3
+ pub struct BadActivities;
4
+
5
+ #[activities]
6
+ impl BadActivities {
7
+ #[activity]
8
+ pub async fn no_context(_in: String) -> Result<String, ActivityError> {
9
+ // This should fail because there's no ActivityContext parameter
10
+ Ok("bad".to_string())
11
+ }
12
+ }
13
+
14
+ fn main() {}