@temporalio/core-bridge 1.13.0 → 1.13.2

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 (181) hide show
  1. package/Cargo.lock +239 -382
  2. package/Cargo.toml +11 -11
  3. package/lib/native.d.ts +10 -3
  4. package/package.json +3 -3
  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/.cargo/config.toml +71 -11
  11. package/sdk-core/.clippy.toml +1 -0
  12. package/sdk-core/.github/workflows/heavy.yml +2 -0
  13. package/sdk-core/.github/workflows/per-pr.yml +50 -18
  14. package/sdk-core/ARCHITECTURE.md +44 -48
  15. package/sdk-core/Cargo.toml +26 -7
  16. package/sdk-core/README.md +4 -0
  17. package/sdk-core/arch_docs/diagrams/TimerMachine_Coverage.puml +14 -0
  18. package/sdk-core/arch_docs/diagrams/initial_event_history.png +0 -0
  19. package/sdk-core/arch_docs/sdks_intro.md +299 -0
  20. package/sdk-core/client/Cargo.toml +8 -7
  21. package/sdk-core/client/src/callback_based.rs +1 -2
  22. package/sdk-core/client/src/lib.rs +485 -299
  23. package/sdk-core/client/src/metrics.rs +32 -8
  24. package/sdk-core/client/src/proxy.rs +124 -5
  25. package/sdk-core/client/src/raw.rs +598 -307
  26. package/sdk-core/client/src/replaceable.rs +253 -0
  27. package/sdk-core/client/src/retry.rs +9 -6
  28. package/sdk-core/client/src/worker_registry/mod.rs +19 -3
  29. package/sdk-core/client/src/workflow_handle/mod.rs +20 -17
  30. package/sdk-core/core/Cargo.toml +100 -31
  31. package/sdk-core/core/src/core_tests/activity_tasks.rs +55 -225
  32. package/sdk-core/core/src/core_tests/mod.rs +2 -8
  33. package/sdk-core/core/src/core_tests/queries.rs +3 -5
  34. package/sdk-core/core/src/core_tests/replay_flag.rs +3 -62
  35. package/sdk-core/core/src/core_tests/updates.rs +4 -5
  36. package/sdk-core/core/src/core_tests/workers.rs +4 -3
  37. package/sdk-core/core/src/core_tests/workflow_cancels.rs +10 -7
  38. package/sdk-core/core/src/core_tests/workflow_tasks.rs +28 -291
  39. package/sdk-core/core/src/ephemeral_server/mod.rs +15 -3
  40. package/sdk-core/core/src/internal_flags.rs +11 -1
  41. package/sdk-core/core/src/lib.rs +50 -36
  42. package/sdk-core/core/src/pollers/mod.rs +5 -5
  43. package/sdk-core/core/src/pollers/poll_buffer.rs +2 -2
  44. package/sdk-core/core/src/protosext/mod.rs +13 -5
  45. package/sdk-core/core/src/protosext/protocol_messages.rs +4 -11
  46. package/sdk-core/core/src/retry_logic.rs +256 -108
  47. package/sdk-core/core/src/telemetry/metrics.rs +1 -0
  48. package/sdk-core/core/src/telemetry/mod.rs +8 -2
  49. package/sdk-core/core/src/telemetry/prometheus_meter.rs +2 -2
  50. package/sdk-core/core/src/test_help/integ_helpers.rs +971 -0
  51. package/sdk-core/core/src/test_help/mod.rs +10 -1100
  52. package/sdk-core/core/src/test_help/unit_helpers.rs +218 -0
  53. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +42 -6
  54. package/sdk-core/core/src/worker/activities/local_activities.rs +19 -19
  55. package/sdk-core/core/src/worker/activities.rs +10 -3
  56. package/sdk-core/core/src/worker/client/mocks.rs +3 -3
  57. package/sdk-core/core/src/worker/client.rs +130 -93
  58. package/sdk-core/core/src/worker/heartbeat.rs +12 -13
  59. package/sdk-core/core/src/worker/mod.rs +31 -21
  60. package/sdk-core/core/src/worker/nexus.rs +14 -3
  61. package/sdk-core/core/src/worker/slot_provider.rs +9 -0
  62. package/sdk-core/core/src/worker/tuner.rs +159 -0
  63. package/sdk-core/core/src/worker/workflow/history_update.rs +3 -265
  64. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +1 -54
  65. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +0 -82
  66. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +0 -67
  67. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -192
  68. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +0 -43
  69. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +6 -554
  70. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +0 -71
  71. package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +102 -3
  72. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +10 -539
  73. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +0 -139
  74. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +1 -119
  75. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +6 -63
  76. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +9 -4
  77. package/sdk-core/core/src/worker/workflow/mod.rs +5 -1
  78. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +8 -3
  79. package/sdk-core/core-api/Cargo.toml +4 -4
  80. package/sdk-core/core-api/src/envconfig.rs +153 -54
  81. package/sdk-core/core-api/src/lib.rs +68 -0
  82. package/sdk-core/core-api/src/telemetry/metrics.rs +2 -1
  83. package/sdk-core/core-api/src/telemetry.rs +13 -0
  84. package/sdk-core/core-c-bridge/Cargo.toml +13 -8
  85. package/sdk-core/core-c-bridge/include/temporal-sdk-core-c-bridge.h +184 -22
  86. package/sdk-core/core-c-bridge/src/client.rs +462 -184
  87. package/sdk-core/core-c-bridge/src/envconfig.rs +314 -0
  88. package/sdk-core/core-c-bridge/src/lib.rs +1 -0
  89. package/sdk-core/core-c-bridge/src/random.rs +4 -4
  90. package/sdk-core/core-c-bridge/src/runtime.rs +22 -23
  91. package/sdk-core/core-c-bridge/src/testing.rs +1 -4
  92. package/sdk-core/core-c-bridge/src/tests/context.rs +31 -31
  93. package/sdk-core/core-c-bridge/src/tests/mod.rs +32 -28
  94. package/sdk-core/core-c-bridge/src/tests/utils.rs +7 -7
  95. package/sdk-core/core-c-bridge/src/worker.rs +319 -66
  96. package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +6 -1
  97. package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/dupe_transitions_fail.stderr +5 -5
  98. package/sdk-core/sdk/Cargo.toml +8 -2
  99. package/sdk-core/sdk/src/activity_context.rs +1 -1
  100. package/sdk-core/sdk/src/app_data.rs +1 -1
  101. package/sdk-core/sdk/src/interceptors.rs +1 -4
  102. package/sdk-core/sdk/src/lib.rs +1 -5
  103. package/sdk-core/sdk/src/workflow_context/options.rs +10 -1
  104. package/sdk-core/sdk/src/workflow_future.rs +1 -1
  105. package/sdk-core/sdk-core-protos/Cargo.toml +6 -6
  106. package/sdk-core/sdk-core-protos/build.rs +10 -23
  107. package/sdk-core/sdk-core-protos/protos/api_upstream/.github/workflows/create-release.yml +9 -1
  108. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +254 -5
  109. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +234 -5
  110. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +1 -1
  111. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +6 -0
  112. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -2
  113. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +60 -2
  114. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +30 -6
  115. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +2 -0
  116. package/sdk-core/{test-utils → sdk-core-protos}/src/canned_histories.rs +5 -5
  117. package/sdk-core/sdk-core-protos/src/history_builder.rs +2 -2
  118. package/sdk-core/sdk-core-protos/src/lib.rs +25 -9
  119. package/sdk-core/sdk-core-protos/src/test_utils.rs +89 -0
  120. package/sdk-core/sdk-core-protos/src/utilities.rs +14 -5
  121. package/sdk-core/tests/c_bridge_smoke_test.c +10 -0
  122. package/sdk-core/tests/cloud_tests.rs +10 -8
  123. package/sdk-core/tests/common/http_proxy.rs +134 -0
  124. package/sdk-core/{test-utils/src/lib.rs → tests/common/mod.rs} +214 -281
  125. package/sdk-core/{test-utils/src → tests/common}/workflows.rs +4 -3
  126. package/sdk-core/tests/fuzzy_workflow.rs +1 -1
  127. package/sdk-core/tests/global_metric_tests.rs +8 -7
  128. package/sdk-core/tests/heavy_tests.rs +7 -3
  129. package/sdk-core/tests/integ_tests/client_tests.rs +111 -24
  130. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +14 -9
  131. package/sdk-core/tests/integ_tests/heartbeat_tests.rs +4 -4
  132. package/sdk-core/tests/integ_tests/metrics_tests.rs +114 -14
  133. package/sdk-core/tests/integ_tests/pagination_tests.rs +273 -0
  134. package/sdk-core/tests/integ_tests/polling_tests.rs +311 -93
  135. package/sdk-core/tests/integ_tests/queries_tests.rs +4 -4
  136. package/sdk-core/tests/integ_tests/update_tests.rs +13 -7
  137. package/sdk-core/tests/integ_tests/visibility_tests.rs +26 -9
  138. package/sdk-core/tests/integ_tests/worker_tests.rs +668 -13
  139. package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +40 -24
  140. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +244 -11
  141. package/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +1 -1
  142. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +78 -2
  143. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +61 -2
  144. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +465 -7
  145. package/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +41 -2
  146. package/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +315 -3
  147. package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +1 -1
  148. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1990 -14
  149. package/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +65 -2
  150. package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +123 -23
  151. package/sdk-core/tests/integ_tests/workflow_tests/patches.rs +525 -3
  152. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +65 -16
  153. package/sdk-core/tests/integ_tests/workflow_tests/resets.rs +32 -23
  154. package/sdk-core/tests/integ_tests/workflow_tests/signals.rs +126 -5
  155. package/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +1 -2
  156. package/sdk-core/tests/integ_tests/workflow_tests/timers.rs +124 -8
  157. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +62 -2
  158. package/sdk-core/tests/integ_tests/workflow_tests.rs +67 -8
  159. package/sdk-core/tests/main.rs +26 -17
  160. package/sdk-core/tests/manual_tests.rs +5 -1
  161. package/sdk-core/tests/runner.rs +22 -40
  162. package/sdk-core/tests/shared_tests/mod.rs +1 -1
  163. package/sdk-core/tests/shared_tests/priority.rs +1 -1
  164. package/sdk-core/{core/benches/workflow_replay.rs → tests/workflow_replay_bench.rs} +10 -5
  165. package/src/client.rs +97 -20
  166. package/src/helpers/callbacks.rs +4 -4
  167. package/src/helpers/errors.rs +7 -1
  168. package/src/helpers/handles.rs +1 -0
  169. package/src/helpers/try_from_js.rs +4 -3
  170. package/src/lib.rs +3 -2
  171. package/src/metrics.rs +3 -0
  172. package/src/runtime.rs +5 -2
  173. package/src/worker.rs +9 -12
  174. package/ts/native.ts +13 -3
  175. package/sdk-core/arch_docs/diagrams/workflow_internals.svg +0 -1
  176. package/sdk-core/core/src/core_tests/child_workflows.rs +0 -281
  177. package/sdk-core/core/src/core_tests/determinism.rs +0 -318
  178. package/sdk-core/core/src/core_tests/local_activities.rs +0 -1442
  179. package/sdk-core/test-utils/Cargo.toml +0 -38
  180. package/sdk-core/test-utils/src/histfetch.rs +0 -28
  181. package/sdk-core/test-utils/src/interceptors.rs +0 -46
@@ -293,142 +293,3 @@ impl SignalExternalMachine {
293
293
  matches!(self.state(), SignalExternalMachineState::Cancelled(_))
294
294
  }
295
295
  }
296
-
297
- #[cfg(test)]
298
- mod tests {
299
- use super::*;
300
- use crate::{
301
- replay::TestHistoryBuilder,
302
- test_help::{MockPollCfg, build_fake_sdk},
303
- };
304
- use std::mem::discriminant;
305
- use temporal_sdk::{CancellableFuture, SignalWorkflowOptions, WfContext, WorkflowResult};
306
- use temporal_sdk_core_protos::{
307
- DEFAULT_WORKFLOW_TYPE,
308
- coresdk::workflow_activation::{WorkflowActivationJob, workflow_activation_job},
309
- temporal::api::command::v1::Command,
310
- };
311
- use temporal_sdk_core_test_utils::interceptors::ActivationAssertionsInterceptor;
312
-
313
- const SIGNAME: &str = "signame";
314
-
315
- async fn signal_sender(ctx: WfContext) -> WorkflowResult<()> {
316
- let mut dat = SignalWorkflowOptions::new("fake_wid", "fake_rid", SIGNAME, [b"hi!"]);
317
- dat.with_header("tupac", b"shakur");
318
- let res = ctx.signal_workflow(dat).await;
319
- if res.is_err() {
320
- Err(anyhow::anyhow!("Signal fail!"))
321
- } else {
322
- Ok(().into())
323
- }
324
- }
325
-
326
- #[rstest::rstest]
327
- #[case::succeeds(false)]
328
- #[case::fails(true)]
329
- #[tokio::test]
330
- async fn sends_signal(#[case] fails: bool) {
331
- let mut t = TestHistoryBuilder::default();
332
- t.add_by_type(EventType::WorkflowExecutionStarted);
333
- t.add_full_wf_task();
334
- let id = t.add_signal_wf(SIGNAME, "fake_wid", "fake_rid");
335
- if fails {
336
- t.add_external_signal_failed(id);
337
- } else {
338
- t.add_external_signal_completed(id);
339
- }
340
- t.add_full_wf_task();
341
- t.add_workflow_execution_completed();
342
-
343
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
344
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
345
- asserts.then(move |wft| {
346
- assert_matches!(wft.commands.as_slice(),
347
- [Command { attributes: Some(
348
- command::Attributes::SignalExternalWorkflowExecutionCommandAttributes(attrs)),..}] => {
349
- assert_eq!(attrs.signal_name, SIGNAME);
350
- assert_eq!(attrs.input.as_ref().unwrap().payloads[0], b"hi!".into());
351
- assert_eq!(*attrs.header.as_ref().unwrap().fields.get("tupac").unwrap(),
352
- b"shakur".into());
353
- }
354
- );
355
- }).then(move |wft| {
356
- let cmds = &wft.commands;
357
- assert_eq!(cmds.len(), 1);
358
- if fails {
359
- assert_eq!(cmds[0].command_type(), CommandType::FailWorkflowExecution);
360
- } else {
361
- assert_eq!(
362
- cmds[0].command_type(),
363
- CommandType::CompleteWorkflowExecution
364
- );
365
- }
366
- });
367
- });
368
-
369
- let mut worker = build_fake_sdk(mock_cfg);
370
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, signal_sender);
371
- worker.run().await.unwrap();
372
- }
373
-
374
- #[tokio::test]
375
- async fn cancels_before_sending() {
376
- let mut t = TestHistoryBuilder::default();
377
- t.add_by_type(EventType::WorkflowExecutionStarted);
378
- t.add_full_wf_task();
379
- t.add_workflow_execution_completed();
380
-
381
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
382
- let mut aai = ActivationAssertionsInterceptor::default();
383
- aai.skip_one().then(move |act| {
384
- assert_matches!(
385
- &act.jobs[0],
386
- WorkflowActivationJob {
387
- variant: Some(workflow_activation_job::Variant::ResolveSignalExternalWorkflow(
388
- ResolveSignalExternalWorkflow {
389
- failure: Some(c),
390
- ..
391
- }
392
- ))
393
- } => c.message == SIG_CANCEL_MSG
394
- );
395
- });
396
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
397
- asserts.then(move |wft| {
398
- assert_eq!(wft.commands.len(), 1);
399
- assert_eq!(
400
- wft.commands[0].command_type(),
401
- CommandType::CompleteWorkflowExecution
402
- );
403
- });
404
- });
405
-
406
- let mut worker = build_fake_sdk(mock_cfg);
407
- worker.set_worker_interceptor(aai);
408
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
409
- let sig = ctx.signal_workflow(SignalWorkflowOptions::new(
410
- "fake_wid",
411
- "fake_rid",
412
- SIGNAME,
413
- [b"hi!"],
414
- ));
415
- sig.cancel(&ctx);
416
- let _res = sig.await;
417
- Ok(().into())
418
- });
419
- worker.run().await.unwrap();
420
- }
421
-
422
- #[test]
423
- fn cancels_ignored_terminal() {
424
- for state in [
425
- SignalExternalMachineState::Cancelled(Cancelled {}),
426
- Signaled {}.into(),
427
- ] {
428
- let mut s = SignalExternalMachine::from_parts(state.clone(), Default::default());
429
- let cmds = s.cancel().unwrap();
430
- assert_eq!(cmds.len(), 0);
431
- assert_eq!(discriminant(&state), discriminant(s.state()));
432
- }
433
- }
434
- }
@@ -253,125 +253,7 @@ impl WFMachinesAdapter for TimerMachine {
253
253
  #[cfg(test)]
254
254
  mod test {
255
255
  use super::*;
256
- use crate::{
257
- replay::TestHistoryBuilder,
258
- test_help::{MockPollCfg, build_fake_sdk, canned_histories},
259
- };
260
- use std::{mem::discriminant, time::Duration};
261
- use temporal_sdk::{CancellableFuture, WfContext, WorkflowResult};
262
- use temporal_sdk_core_protos::{
263
- DEFAULT_WORKFLOW_TYPE,
264
- temporal::api::{enums::v1::WorkflowTaskFailedCause, failure::v1::Failure},
265
- };
266
-
267
- async fn happy_timer(ctx: WfContext) -> WorkflowResult<()> {
268
- ctx.timer(Duration::from_secs(5)).await;
269
- Ok(().into())
270
- }
271
-
272
- #[tokio::test]
273
- async fn test_fire_happy_path_inc() {
274
- let t = canned_histories::single_timer("1");
275
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
276
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
277
- asserts
278
- .then(move |wft| {
279
- assert_eq!(wft.commands.len(), 1);
280
- assert_eq!(wft.commands[0].command_type(), CommandType::StartTimer);
281
- })
282
- .then(move |wft| {
283
- assert_eq!(wft.commands.len(), 1);
284
- assert_eq!(
285
- wft.commands[0].command_type(),
286
- CommandType::CompleteWorkflowExecution
287
- );
288
- });
289
- });
290
-
291
- let mut worker = build_fake_sdk(mock_cfg);
292
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, happy_timer);
293
- worker.run().await.unwrap();
294
- }
295
-
296
- #[tokio::test]
297
- async fn mismatched_timer_ids_errors() {
298
- let t = canned_histories::single_timer("badid");
299
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
300
- mock_cfg.num_expected_fails = 1;
301
- mock_cfg.expect_fail_wft_matcher = Box::new(move |_, cause, f| {
302
- matches!(cause, WorkflowTaskFailedCause::NonDeterministicError)
303
- && matches!(f, Some(Failure {message, .. })
304
- if message.contains("Timer fired event did not have expected timer id 1"))
305
- });
306
- let mut worker = build_fake_sdk(mock_cfg);
307
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
308
- ctx.timer(Duration::from_secs(5)).await;
309
- Ok(().into())
310
- });
311
- worker.run().await.unwrap();
312
- }
313
-
314
- async fn cancel_timer(ctx: WfContext) -> WorkflowResult<()> {
315
- let cancel_timer_fut = ctx.timer(Duration::from_secs(500));
316
- ctx.timer(Duration::from_secs(5)).await;
317
- // Cancel the first timer after having waited on the second
318
- cancel_timer_fut.cancel(&ctx);
319
- cancel_timer_fut.await;
320
- Ok(().into())
321
- }
322
-
323
- #[tokio::test]
324
- async fn incremental_cancellation() {
325
- let t = canned_histories::cancel_timer("2", "1");
326
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
327
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
328
- asserts
329
- .then(move |wft| {
330
- assert_eq!(wft.commands.len(), 2);
331
- assert_eq!(wft.commands[0].command_type(), CommandType::StartTimer);
332
- assert_eq!(wft.commands[1].command_type(), CommandType::StartTimer);
333
- })
334
- .then(move |wft| {
335
- assert_eq!(wft.commands.len(), 2);
336
- assert_eq!(wft.commands[0].command_type(), CommandType::CancelTimer);
337
- assert_eq!(
338
- wft.commands[1].command_type(),
339
- CommandType::CompleteWorkflowExecution
340
- );
341
- });
342
- });
343
-
344
- let mut worker = build_fake_sdk(mock_cfg);
345
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, cancel_timer);
346
- worker.run().await.unwrap();
347
- }
348
-
349
- #[tokio::test]
350
- async fn cancel_before_sent_to_server() {
351
- let mut t = TestHistoryBuilder::default();
352
- t.add_by_type(EventType::WorkflowExecutionStarted);
353
- t.add_full_wf_task();
354
- t.add_workflow_execution_completed();
355
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
356
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
357
- asserts.then(move |wft| {
358
- assert_eq!(wft.commands.len(), 1);
359
- assert_matches!(
360
- wft.commands[0].command_type(),
361
- CommandType::CompleteWorkflowExecution
362
- );
363
- });
364
- });
365
- let mut worker = build_fake_sdk(mock_cfg);
366
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, |ctx: WfContext| async move {
367
- let cancel_timer_fut = ctx.timer(Duration::from_secs(500));
368
- // Immediately cancel the timer
369
- cancel_timer_fut.cancel(&ctx);
370
- cancel_timer_fut.await;
371
- Ok(().into())
372
- });
373
- worker.run().await.unwrap();
374
- }
256
+ use std::mem::discriminant;
375
257
 
376
258
  #[test]
377
259
  fn cancels_ignored_terminal() {
@@ -3,14 +3,12 @@ use crate::{
3
3
  internal_flags::CoreInternalFlags,
4
4
  worker::workflow::{
5
5
  InternalFlagsRef, WFMachinesError,
6
- machines::{
7
- EventInfo, HistEventData, WFMachinesAdapter,
8
- patch_state_machine::VERSION_SEARCH_ATTR_KEY,
9
- },
6
+ machines::{EventInfo, HistEventData, WFMachinesAdapter},
10
7
  },
11
8
  };
12
9
  use rustfsm::{StateMachine, TransitionResult, fsm};
13
10
  use temporal_sdk_core_protos::{
11
+ VERSION_SEARCH_ATTR_KEY,
14
12
  coresdk::workflow_commands::UpsertWorkflowSearchAttributes,
15
13
  temporal::api::{
16
14
  command::v1::{UpsertWorkflowSearchAttributesCommandAttributes, command},
@@ -181,18 +179,15 @@ mod tests {
181
179
  use super::{super::OnEventWrapper, *};
182
180
  use crate::{
183
181
  replay::TestHistoryBuilder,
184
- test_help::{MockPollCfg, ResponseType, build_fake_sdk, build_mock_pollers, mock_worker},
185
- worker::{
186
- client::mocks::mock_worker_client,
187
- workflow::machines::patch_state_machine::VERSION_SEARCH_ATTR_KEY,
182
+ test_help::{
183
+ MockPollCfg, ResponseType, WorkerTestHelpers, build_mock_pollers, mock_worker,
188
184
  },
185
+ worker::client::mocks::mock_worker_client,
189
186
  };
190
187
  use rustfsm::StateMachine;
191
188
  use std::collections::HashMap;
192
- use temporal_sdk::WfContext;
193
189
  use temporal_sdk_core_api::Worker;
194
190
  use temporal_sdk_core_protos::{
195
- DEFAULT_WORKFLOW_TYPE,
196
191
  coresdk::{
197
192
  AsJsonPayloadExt,
198
193
  workflow_activation::{WorkflowActivationJob, workflow_activation_job},
@@ -200,64 +195,12 @@ mod tests {
200
195
  workflow_completion::WorkflowActivationCompletion,
201
196
  },
202
197
  temporal::api::{
203
- command::v1::{Command, command::Attributes},
198
+ command::v1::command::Attributes,
204
199
  common::v1::Payload,
205
200
  enums::v1::EventType,
206
201
  history::v1::{HistoryEvent, UpsertWorkflowSearchAttributesEventAttributes},
207
202
  },
208
203
  };
209
- use temporal_sdk_core_test_utils::WorkerTestHelpers;
210
-
211
- #[tokio::test]
212
- async fn upsert_search_attrs_from_workflow() {
213
- let mut t = TestHistoryBuilder::default();
214
- t.add_by_type(EventType::WorkflowExecutionStarted);
215
- t.add_full_wf_task();
216
- t.add_workflow_execution_completed();
217
-
218
- let (k1, k2) = ("foo", "bar");
219
-
220
- let mut mock_cfg = MockPollCfg::from_hist_builder(t);
221
- mock_cfg.completion_asserts_from_expectations(|mut asserts| {
222
- asserts.then(|wft| {
223
- assert_matches!(
224
- wft.commands.as_slice(),
225
- [Command { attributes: Some(
226
- command::Attributes::UpsertWorkflowSearchAttributesCommandAttributes(msg)
227
- ), .. }, ..] => {
228
- let fields = &msg.search_attributes.as_ref().unwrap().indexed_fields;
229
- let payload1 = fields.get(k1).unwrap();
230
- let payload2 = fields.get(k2).unwrap();
231
- assert_eq!(payload1.data[0], 0x01);
232
- assert_eq!(payload2.data[0], 0x02);
233
- assert_eq!(fields.len(), 2);
234
- }
235
- );
236
- });
237
- });
238
-
239
- let mut worker = build_fake_sdk(mock_cfg);
240
- worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
241
- ctx.upsert_search_attributes([
242
- (
243
- String::from(k1),
244
- Payload {
245
- data: vec![0x01],
246
- ..Default::default()
247
- },
248
- ),
249
- (
250
- String::from(k2),
251
- Payload {
252
- data: vec![0x02],
253
- ..Default::default()
254
- },
255
- ),
256
- ]);
257
- Ok(().into())
258
- });
259
- worker.run().await.unwrap();
260
- }
261
204
 
262
205
  #[rstest::rstest]
263
206
  fn upsert_search_attrs_sm() {
@@ -32,7 +32,7 @@ use crate::{
32
32
  child_workflow_state_machine::ChildWorkflowMachine,
33
33
  modify_workflow_properties_state_machine::modify_workflow_properties,
34
34
  nexus_operation_state_machine::NexusOperationMachine,
35
- patch_state_machine::VERSION_SEARCH_ATTR_KEY, update_state_machine::UpdateMachine,
35
+ update_state_machine::UpdateMachine,
36
36
  upsert_search_attributes_state_machine::upsert_search_attrs_internal,
37
37
  },
38
38
  },
@@ -53,11 +53,11 @@ use std::{
53
53
  };
54
54
  use temporal_sdk_core_api::worker::{WorkerConfig, WorkerDeploymentVersion};
55
55
  use temporal_sdk_core_protos::{
56
+ VERSION_SEARCH_ATTR_KEY,
56
57
  coresdk::{
57
58
  common::{NamespacedWorkflowExecution, VersioningIntent},
58
- workflow_activation,
59
59
  workflow_activation::{
60
- NotifyHasPatch, UpdateRandomSeed, WorkflowActivation, workflow_activation_job,
60
+ self, NotifyHasPatch, UpdateRandomSeed, WorkflowActivation, workflow_activation_job,
61
61
  },
62
62
  workflow_commands::ContinueAsNewWorkflowExecution,
63
63
  },
@@ -463,6 +463,11 @@ impl WorkflowMachines {
463
463
  continue_as_new_suggested: self.continue_as_new_suggested,
464
464
  deployment_version_for_current_task: deployment_version_for_current_task
465
465
  .map(Into::into),
466
+ last_sdk_version: (*self.observed_internal_flags)
467
+ .borrow()
468
+ .last_sdk_version()
469
+ .unwrap_or_default()
470
+ .to_owned(),
466
471
  }
467
472
  }
468
473
 
@@ -1352,7 +1357,7 @@ impl WorkflowMachines {
1352
1357
  WFCommandVariant::AddLocalActivity(attrs) => {
1353
1358
  let seq = attrs.seq;
1354
1359
  let attrs: ValidScheduleLA =
1355
- ValidScheduleLA::from_schedule_la(attrs).map_err(|e| {
1360
+ ValidScheduleLA::from_schedule_la(attrs, cmd.metadata).map_err(|e| {
1356
1361
  WFMachinesError::Fatal(format!(
1357
1362
  "Invalid schedule local activity request (seq {seq}): {e}"
1358
1363
  ))
@@ -96,7 +96,11 @@ use tokio_stream::wrappers::UnboundedReceiverStream;
96
96
  use tokio_util::sync::CancellationToken;
97
97
  use tracing::Span;
98
98
 
99
- pub(crate) const LEGACY_QUERY_ID: &str = "legacy_query";
99
+ /// Id used by server for "legacy" queries. IE: Queries that come in the `query` rather than
100
+ /// `queries` field of a WFT, and are responded to on the separate `respond_query_task_completed`
101
+ /// rpc.
102
+ #[allow(unreachable_pub)] // re-exported in supermodule
103
+ pub const LEGACY_QUERY_ID: &str = "legacy_query";
100
104
  /// What percentage of a WFT timeout we are willing to wait before sending a WFT heartbeat when
101
105
  /// necessary.
102
106
  const WFT_HEARTBEAT_TIMEOUT_FRACTION: f32 = 0.8;
@@ -578,7 +578,7 @@ impl WFStream {
578
578
  #[derive(derive_more::From, Debug)]
579
579
  enum WFStreamInput {
580
580
  NewWft(Box<PermittedWFT>),
581
- Local(LocalInput),
581
+ Local(Box<LocalInput>),
582
582
  /// The stream given to us which represents the poller (or a mock) terminated.
583
583
  PollerDead,
584
584
  /// The stream given to us which represents the poller (or a mock) encountered a non-retryable
@@ -590,6 +590,11 @@ enum WFStreamInput {
590
590
  auto_reply_fail_tt: Option<TaskToken>,
591
591
  },
592
592
  }
593
+ impl From<LocalInput> for WFStreamInput {
594
+ fn from(input: LocalInput) -> Self {
595
+ WFStreamInput::Local(Box::new(input))
596
+ }
597
+ }
593
598
 
594
599
  /// A non-poller-received input to the [WFStream]
595
600
  #[derive(derive_more::Debug)]
@@ -672,10 +677,10 @@ impl From<ExternalPollerInputs> for WFStreamInput {
672
677
  paginator,
673
678
  update,
674
679
  span,
675
- } => WFStreamInput::Local(LocalInput {
680
+ } => WFStreamInput::Local(Box::new(LocalInput {
676
681
  input: LocalInputs::FetchedPageCompletion { paginator, update },
677
682
  span,
678
- }),
683
+ })),
679
684
  }
680
685
  }
681
686
  }
@@ -18,7 +18,7 @@ envconfig = ["dep:toml", "dep:serde", "dep:dirs"]
18
18
 
19
19
  [dependencies]
20
20
  async-trait = "0.1"
21
- dirs = { version = "5.0", optional = true }
21
+ dirs = { version = "6.0", optional = true }
22
22
  derive_builder = { workspace = true }
23
23
  derive_more = { workspace = true }
24
24
  opentelemetry = { workspace = true, optional = true }
@@ -26,11 +26,11 @@ prost = { workspace = true }
26
26
  serde = { version = "1.0", features = ["derive"], optional = true }
27
27
  serde_json = "1.0"
28
28
  thiserror = { workspace = true }
29
- toml = { version = "0.8", optional = true }
29
+ toml = { version = "0.9", optional = true }
30
30
  tonic = { workspace = true }
31
31
  tracing = "0.1"
32
32
  tracing-core = "0.1"
33
- url = "2.3"
33
+ url = "2.5"
34
34
 
35
35
  [dependencies.temporal-sdk-core-protos]
36
36
  path = "../sdk-core-protos"
@@ -40,4 +40,4 @@ version = "0.1"
40
40
  workspace = true
41
41
 
42
42
  [dev-dependencies]
43
- tempfile = "3.8"
43
+ tempfile = "3.21"