@temporalio/core-bridge 1.8.6 → 1.9.0-rc.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 (196) hide show
  1. package/Cargo.lock +189 -152
  2. package/Cargo.toml +1 -0
  3. package/lib/index.d.ts +17 -44
  4. package/lib/index.js.map +1 -1
  5. package/package.json +3 -4
  6. package/releases/aarch64-apple-darwin/index.node +0 -0
  7. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  8. package/releases/x86_64-apple-darwin/index.node +0 -0
  9. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  10. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  11. package/sdk-core/.github/workflows/heavy.yml +4 -0
  12. package/sdk-core/.github/workflows/per-pr.yml +96 -0
  13. package/sdk-core/ARCHITECTURE.md +1 -1
  14. package/sdk-core/Cargo.toml +6 -0
  15. package/sdk-core/README.md +37 -21
  16. package/sdk-core/client/Cargo.toml +6 -3
  17. package/sdk-core/client/src/lib.rs +272 -138
  18. package/sdk-core/client/src/metrics.rs +68 -57
  19. package/sdk-core/client/src/raw.rs +191 -45
  20. package/sdk-core/client/src/retry.rs +20 -0
  21. package/sdk-core/client/src/worker_registry/mod.rs +264 -0
  22. package/sdk-core/client/src/workflow_handle/mod.rs +2 -1
  23. package/sdk-core/core/Cargo.toml +16 -18
  24. package/sdk-core/core/src/core_tests/child_workflows.rs +7 -7
  25. package/sdk-core/core/src/core_tests/mod.rs +1 -0
  26. package/sdk-core/core/src/core_tests/replay_flag.rs +29 -39
  27. package/sdk-core/core/src/core_tests/updates.rs +73 -0
  28. package/sdk-core/core/src/core_tests/workflow_tasks.rs +52 -1
  29. package/sdk-core/core/src/ephemeral_server/mod.rs +34 -11
  30. package/sdk-core/core/src/internal_flags.rs +7 -1
  31. package/sdk-core/core/src/lib.rs +19 -36
  32. package/sdk-core/core/src/protosext/mod.rs +11 -3
  33. package/sdk-core/core/src/protosext/protocol_messages.rs +102 -0
  34. package/sdk-core/core/src/replay/mod.rs +100 -48
  35. package/sdk-core/core/src/telemetry/log_export.rs +161 -28
  36. package/sdk-core/core/src/telemetry/metrics.rs +869 -248
  37. package/sdk-core/core/src/telemetry/mod.rs +135 -239
  38. package/sdk-core/core/src/telemetry/prometheus_server.rs +36 -31
  39. package/sdk-core/core/src/test_help/mod.rs +63 -4
  40. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +12 -2
  41. package/sdk-core/core/src/worker/activities.rs +276 -10
  42. package/sdk-core/core/src/worker/client/mocks.rs +18 -0
  43. package/sdk-core/core/src/worker/client.rs +16 -3
  44. package/sdk-core/core/src/worker/mod.rs +50 -19
  45. package/sdk-core/core/src/worker/slot_provider.rs +175 -0
  46. package/sdk-core/core/src/worker/workflow/driven_workflow.rs +27 -34
  47. package/sdk-core/core/src/worker/workflow/history_update.rs +4 -1
  48. package/sdk-core/core/src/worker/workflow/machines/activity_state_machine.rs +36 -94
  49. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +34 -22
  50. package/sdk-core/core/src/worker/workflow/machines/cancel_workflow_state_machine.rs +50 -34
  51. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +106 -92
  52. package/sdk-core/core/src/worker/workflow/machines/continue_as_new_workflow_state_machine.rs +22 -21
  53. package/sdk-core/core/src/worker/workflow/machines/local_activity_state_machine.rs +386 -499
  54. package/sdk-core/core/src/worker/workflow/machines/mod.rs +12 -2
  55. package/sdk-core/core/src/worker/workflow/machines/modify_workflow_properties_state_machine.rs +33 -26
  56. package/sdk-core/core/src/worker/workflow/machines/patch_state_machine.rs +198 -215
  57. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +66 -62
  58. package/sdk-core/core/src/worker/workflow/machines/timer_state_machine.rs +88 -119
  59. package/sdk-core/core/src/worker/workflow/machines/transition_coverage.rs +3 -1
  60. package/sdk-core/core/src/worker/workflow/machines/update_state_machine.rs +411 -0
  61. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +26 -25
  62. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +302 -85
  63. package/sdk-core/core/src/worker/workflow/managed_run.rs +179 -132
  64. package/sdk-core/core/src/worker/workflow/mod.rs +121 -46
  65. package/sdk-core/core/src/worker/workflow/run_cache.rs +8 -12
  66. package/sdk-core/core/src/worker/workflow/workflow_stream.rs +45 -38
  67. package/sdk-core/core-api/Cargo.toml +7 -6
  68. package/sdk-core/core-api/src/lib.rs +4 -12
  69. package/sdk-core/core-api/src/telemetry/metrics.rs +334 -0
  70. package/sdk-core/core-api/src/telemetry.rs +53 -42
  71. package/sdk-core/core-api/src/worker.rs +7 -0
  72. package/sdk-core/{.buildkite/docker → docker}/docker-compose.yaml +1 -1
  73. package/sdk-core/etc/dynamic-config.yaml +11 -1
  74. package/sdk-core/fsm/rustfsm_procmacro/Cargo.toml +1 -1
  75. package/sdk-core/fsm/rustfsm_procmacro/src/lib.rs +1 -3
  76. package/sdk-core/fsm/rustfsm_procmacro/tests/trybuild/no_handle_conversions_require_into_fail.stderr +2 -2
  77. package/sdk-core/sdk/Cargo.toml +1 -1
  78. package/sdk-core/sdk/src/lib.rs +85 -7
  79. package/sdk-core/sdk/src/workflow_context/options.rs +4 -0
  80. package/sdk-core/sdk/src/workflow_context.rs +43 -15
  81. package/sdk-core/sdk/src/workflow_future.rs +334 -204
  82. package/sdk-core/sdk-core-protos/Cargo.toml +2 -2
  83. package/sdk-core/sdk-core-protos/build.rs +14 -14
  84. package/sdk-core/sdk-core-protos/protos/api_upstream/.buildkite/Dockerfile +2 -0
  85. package/sdk-core/sdk-core-protos/protos/api_upstream/Makefile +99 -0
  86. package/sdk-core/sdk-core-protos/protos/api_upstream/api-linter.yaml +56 -0
  87. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.gen.yaml +20 -0
  88. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.lock +11 -0
  89. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +18 -0
  90. package/sdk-core/sdk-core-protos/protos/api_upstream/google/api/annotations.proto +31 -0
  91. package/sdk-core/sdk-core-protos/protos/api_upstream/google/api/http.proto +379 -0
  92. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/any.proto +162 -0
  93. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/descriptor.proto +1212 -0
  94. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/duration.proto +115 -0
  95. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/empty.proto +51 -0
  96. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/timestamp.proto +144 -0
  97. package/sdk-core/sdk-core-protos/protos/api_upstream/google/protobuf/wrappers.proto +123 -0
  98. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/batch/v1/message.proto +3 -5
  99. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/command/v1/message.proto +11 -13
  100. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/common/v1/message.proto +2 -4
  101. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/failed_cause.proto +2 -0
  102. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/reset.proto +1 -1
  103. package/sdk-core/{protos/api_upstream/build/tools.go → sdk-core-protos/protos/api_upstream/temporal/api/export/v1/message.proto} +22 -6
  104. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/filter/v1/message.proto +2 -4
  105. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/history/v1/message.proto +21 -23
  106. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/namespace/v1/message.proto +2 -4
  107. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/operatorservice/v1/request_response.proto +2 -0
  108. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/operatorservice/v1/service.proto +4 -0
  109. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/replication/v1/message.proto +1 -3
  110. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/schedule/v1/message.proto +36 -20
  111. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/sdk/v1/task_complete_metadata.proto +13 -0
  112. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -4
  113. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/update/v1/message.proto +1 -1
  114. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/version/v1/message.proto +2 -3
  115. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflow/v1/message.proto +18 -20
  116. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflowservice/v1/request_response.proto +84 -32
  117. package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/workflowservice/v1/service.proto +205 -47
  118. package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +57 -0
  119. package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +27 -0
  120. package/sdk-core/sdk-core-protos/src/history_builder.rs +67 -2
  121. package/sdk-core/sdk-core-protos/src/lib.rs +75 -2
  122. package/sdk-core/sdk-core-protos/src/utilities.rs +14 -0
  123. package/sdk-core/test-utils/Cargo.toml +5 -1
  124. package/sdk-core/test-utils/src/canned_histories.rs +3 -57
  125. package/sdk-core/test-utils/src/interceptors.rs +46 -0
  126. package/sdk-core/test-utils/src/lib.rs +106 -38
  127. package/sdk-core/tests/integ_tests/metrics_tests.rs +110 -15
  128. package/sdk-core/tests/integ_tests/queries_tests.rs +174 -3
  129. package/sdk-core/tests/integ_tests/update_tests.rs +908 -0
  130. package/sdk-core/tests/integ_tests/workflow_tests/activities.rs +44 -1
  131. package/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +1 -1
  132. package/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +1 -1
  133. package/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +4 -4
  134. package/sdk-core/tests/integ_tests/workflow_tests/eager.rs +61 -0
  135. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +27 -2
  136. package/sdk-core/tests/integ_tests/workflow_tests.rs +1 -0
  137. package/sdk-core/tests/main.rs +2 -1
  138. package/sdk-core/tests/runner.rs +15 -2
  139. package/src/conversions.rs +75 -89
  140. package/src/helpers.rs +74 -0
  141. package/src/runtime.rs +17 -6
  142. package/src/worker.rs +14 -61
  143. package/ts/index.ts +21 -52
  144. package/sdk-core/.buildkite/docker/Dockerfile +0 -9
  145. package/sdk-core/.buildkite/docker/build.sh +0 -5
  146. package/sdk-core/.buildkite/docker/docker-compose-ci.yaml +0 -27
  147. package/sdk-core/.buildkite/pipeline.yml +0 -57
  148. package/sdk-core/.github/workflows/semgrep.yml +0 -25
  149. package/sdk-core/core/src/worker/workflow/bridge.rs +0 -35
  150. package/sdk-core/core/src/worker/workflow/managed_run/managed_wf_test.rs +0 -215
  151. package/sdk-core/protos/api_upstream/.buildkite/Dockerfile +0 -2
  152. package/sdk-core/protos/api_upstream/Makefile +0 -80
  153. package/sdk-core/protos/api_upstream/api-linter.yaml +0 -40
  154. package/sdk-core/protos/api_upstream/buf.yaml +0 -9
  155. package/sdk-core/protos/api_upstream/build/go.mod +0 -7
  156. package/sdk-core/protos/api_upstream/build/go.sum +0 -5
  157. package/sdk-core/protos/api_upstream/go.mod +0 -6
  158. package/sdk-core/protos/testsrv_upstream/dependencies/gogoproto/gogo.proto +0 -141
  159. /package/sdk-core/{.buildkite/docker → docker}/docker-compose-telem.yaml +0 -0
  160. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.buildkite/docker-compose.yml +0 -0
  161. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.buildkite/pipeline.yml +0 -0
  162. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/CODEOWNERS +0 -0
  163. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  164. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/workflows/publish-docs.yml +0 -0
  165. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/.github/workflows/trigger-api-go-update.yml +0 -0
  166. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/LICENSE +0 -0
  167. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/README.md +0 -0
  168. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/batch_operation.proto +0 -0
  169. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/command_type.proto +0 -0
  170. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/common.proto +0 -0
  171. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/event_type.proto +0 -0
  172. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/namespace.proto +0 -0
  173. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/query.proto +0 -0
  174. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/schedule.proto +0 -0
  175. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/task_queue.proto +0 -0
  176. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/update.proto +0 -0
  177. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/enums/v1/workflow.proto +0 -0
  178. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/errordetails/v1/message.proto +0 -0
  179. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/failure/v1/message.proto +0 -0
  180. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/protocol/v1/message.proto +0 -0
  181. /package/sdk-core/{protos → sdk-core-protos/protos}/api_upstream/temporal/api/query/v1/message.proto +0 -0
  182. /package/sdk-core/{protos → sdk-core-protos/protos}/google/rpc/status.proto +0 -0
  183. /package/sdk-core/{protos → sdk-core-protos/protos}/grpc/health/v1/health.proto +0 -0
  184. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/activity_result/activity_result.proto +0 -0
  185. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/activity_task/activity_task.proto +0 -0
  186. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/child_workflow/child_workflow.proto +0 -0
  187. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/common/common.proto +0 -0
  188. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/core_interface.proto +0 -0
  189. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/external_data/external_data.proto +0 -0
  190. /package/sdk-core/{protos → sdk-core-protos/protos}/local/temporal/sdk/core/workflow_completion/workflow_completion.proto +0 -0
  191. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/Makefile +0 -0
  192. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/api-linter.yaml +0 -0
  193. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/buf.yaml +0 -0
  194. /package/sdk-core/{protos/api_upstream → sdk-core-protos/protos/testsrv_upstream}/dependencies/gogoproto/gogo.proto +0 -0
  195. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/temporal/api/testservice/v1/request_response.proto +0 -0
  196. /package/sdk-core/{protos → sdk-core-protos/protos}/testsrv_upstream/temporal/api/testservice/v1/service.proto +0 -0
@@ -0,0 +1,411 @@
1
+ use super::{workflow_machines::MachineResponse, EventInfo, WFMachinesAdapter, WFMachinesError};
2
+ use crate::{
3
+ protosext::protocol_messages::UpdateRequest,
4
+ worker::workflow::machines::{Cancellable, HistEventData, NewMachineWithResponse},
5
+ };
6
+ use itertools::Itertools;
7
+ use prost::EncodeError;
8
+ use rustfsm::{fsm, MachineError, StateMachine, TransitionResult};
9
+ use std::{convert::TryFrom, mem};
10
+ use temporal_sdk_core_protos::{
11
+ coresdk::{
12
+ workflow_activation::DoUpdate,
13
+ workflow_commands::{update_response, UpdateResponse},
14
+ },
15
+ temporal::api::{
16
+ command::v1::{command, ProtocolMessageCommandAttributes},
17
+ common::v1::Payload,
18
+ enums::v1::{CommandType, EventType},
19
+ failure::v1::Failure,
20
+ history::v1::HistoryEvent,
21
+ protocol::v1::Message as ProtocolMessage,
22
+ update::v1::{outcome, Acceptance, Outcome, Rejection, Response},
23
+ },
24
+ utilities::pack_any,
25
+ };
26
+
27
+ fsm! {
28
+ pub(super) name UpdateMachine;
29
+ command UpdateMachineCommand;
30
+ error WFMachinesError;
31
+ shared_state SharedState;
32
+
33
+ RequestInitiated --(Accept, on_accept)--> Accepted;
34
+ RequestInitiated --(Reject(Failure), on_reject)--> Rejected;
35
+
36
+ Accepted --(Complete(Payload), on_complete)--> CompletedImmediately;
37
+ Accepted --(Reject(Failure), on_fail)--> CompletedImmediately;
38
+ Accepted --(CommandProtocolMessage)--> AcceptCommandCreated;
39
+
40
+ AcceptCommandCreated --(WorkflowExecutionUpdateAccepted)--> AcceptCommandRecorded;
41
+ // These transitions may be taken after we've sent the command, but not seen the event,
42
+ // such as during local activity execution inside of an update handler.
43
+ AcceptCommandCreated --(Complete(Payload), on_complete)--> CompletedImmediatelyAcceptCreated;
44
+ AcceptCommandCreated --(Reject(Failure), on_fail)--> CompletedImmediatelyAcceptCreated;
45
+
46
+ AcceptCommandRecorded --(Complete(Payload), on_complete)--> Completed;
47
+ AcceptCommandRecorded --(Reject(Failure), on_fail)--> Completed;
48
+
49
+ Completed --(CommandProtocolMessage)--> CompletedCommandCreated;
50
+ CompletedCommandCreated --(WorkflowExecutionUpdateCompleted)--> CompletedCommandRecorded;
51
+
52
+ // When the update is immediately completed, we create two messages in a row, and both will
53
+ // produce another transition for us
54
+ CompletedImmediately --(CommandProtocolMessage)--> CompletedImmediatelyAcceptCreated;
55
+ CompletedImmediatelyAcceptCreated --(CommandProtocolMessage)--> CompletedImmediatelyCompleteCreated;
56
+ // Then once we've seen the accepted event in history, we go back to the normal complete path
57
+ CompletedImmediatelyCompleteCreated --(WorkflowExecutionUpdateAccepted)--> CompletedCommandCreated;
58
+ }
59
+
60
+ #[derive(Debug, derive_more::Display)]
61
+ pub(super) enum UpdateMachineCommand {
62
+ #[display(fmt = "Accept")]
63
+ Accept,
64
+ #[display(fmt = "Reject")]
65
+ Reject(Failure),
66
+ #[display(fmt = "Complete")]
67
+ Complete(Payload),
68
+ #[display(fmt = "Fail")]
69
+ Fail(Failure),
70
+ }
71
+
72
+ #[derive(Clone)]
73
+ pub(super) struct SharedState {
74
+ message_id: String,
75
+ instance_id: String,
76
+ event_seq_id: i64,
77
+ request: UpdateRequest,
78
+ }
79
+
80
+ impl UpdateMachine {
81
+ pub(crate) fn init(
82
+ message_id: String,
83
+ instance_id: String,
84
+ event_seq_id: i64,
85
+ mut request: UpdateRequest,
86
+ replaying: bool,
87
+ ) -> NewMachineWithResponse {
88
+ let me = Self::from_parts(
89
+ RequestInitiated {}.into(),
90
+ SharedState {
91
+ message_id,
92
+ instance_id: instance_id.clone(),
93
+ event_seq_id,
94
+ request: request.clone(),
95
+ },
96
+ );
97
+ let do_update = DoUpdate {
98
+ id: mem::replace(&mut request.meta.update_id, "".to_string()),
99
+ protocol_instance_id: instance_id,
100
+ name: request.name,
101
+ input: request.input,
102
+ headers: request.headers,
103
+ meta: Some(request.meta),
104
+ run_validator: !replaying,
105
+ };
106
+ NewMachineWithResponse {
107
+ machine: me.into(),
108
+ response: MachineResponse::PushWFJob(do_update.into()),
109
+ }
110
+ }
111
+
112
+ pub(crate) fn handle_response(
113
+ &mut self,
114
+ resp: UpdateResponse,
115
+ ) -> Result<Vec<MachineResponse>, WFMachinesError> {
116
+ let cmds = match resp.response {
117
+ None => {
118
+ return Err(WFMachinesError::Fatal(format!(
119
+ "Update response for update {} had an empty result, this is a lang layer bug.",
120
+ &self.shared_state.request.meta.update_id
121
+ )))
122
+ }
123
+ Some(update_response::Response::Accepted(_)) => {
124
+ self.on_event(UpdateMachineEvents::Accept)
125
+ }
126
+ Some(update_response::Response::Rejected(f)) => {
127
+ self.on_event(UpdateMachineEvents::Reject(f))
128
+ }
129
+ Some(update_response::Response::Completed(p)) => {
130
+ self.on_event(UpdateMachineEvents::Complete(p))
131
+ }
132
+ }
133
+ .map_err(|e| match e {
134
+ MachineError::InvalidTransition => WFMachinesError::Nondeterminism(format!(
135
+ "Invalid transition while handling update response (id {}) in state {}",
136
+ &self.shared_state.request.meta.update_id,
137
+ self.state(),
138
+ )),
139
+ MachineError::Underlying(e) => e,
140
+ })?;
141
+ cmds.into_iter()
142
+ .map(|c| self.adapt_response(c, None))
143
+ .flatten_ok()
144
+ .try_collect()
145
+ }
146
+
147
+ fn build_command_msg(
148
+ &self,
149
+ outgoing_id: String,
150
+ msg: UpdateMsg,
151
+ ) -> Result<Vec<MachineResponse>, WFMachinesError> {
152
+ Ok(vec![
153
+ self.build_msg(outgoing_id.clone(), msg)?,
154
+ MachineResponse::IssueNewCommand(
155
+ command::Attributes::ProtocolMessageCommandAttributes(
156
+ ProtocolMessageCommandAttributes {
157
+ message_id: outgoing_id,
158
+ },
159
+ )
160
+ .into(),
161
+ ),
162
+ ])
163
+ }
164
+
165
+ /// Build an outgoing protocol message.
166
+ fn build_msg(
167
+ &self,
168
+ outgoing_id: String,
169
+ msg: UpdateMsg,
170
+ ) -> Result<MachineResponse, WFMachinesError> {
171
+ let accept_body = msg.pack().map_err(|e| {
172
+ WFMachinesError::Fatal(format!("Failed to serialize update response: {:?}", e))
173
+ })?;
174
+ Ok(MachineResponse::IssueNewMessage(ProtocolMessage {
175
+ id: outgoing_id.clone(),
176
+ protocol_instance_id: self.shared_state.instance_id.clone(),
177
+ body: Some(accept_body),
178
+ ..Default::default()
179
+ }))
180
+ }
181
+ }
182
+
183
+ enum UpdateMsg {
184
+ Accept(Acceptance),
185
+ Reject(Rejection),
186
+ Response(Response),
187
+ }
188
+ impl UpdateMsg {
189
+ fn pack(self) -> Result<prost_types::Any, EncodeError> {
190
+ match self {
191
+ UpdateMsg::Accept(m) => pack_any(
192
+ "type.googleapis.com/temporal.api.update.v1.Acceptance".to_string(),
193
+ &m,
194
+ ),
195
+ UpdateMsg::Reject(m) => pack_any(
196
+ "type.googleapis.com/temporal.api.update.v1.Rejection".to_string(),
197
+ &m,
198
+ ),
199
+ UpdateMsg::Response(m) => pack_any(
200
+ "type.googleapis.com/temporal.api.update.v1.Response".to_string(),
201
+ &m,
202
+ ),
203
+ }
204
+ }
205
+ }
206
+
207
+ impl TryFrom<HistEventData> for UpdateMachineEvents {
208
+ type Error = WFMachinesError;
209
+
210
+ fn try_from(e: HistEventData) -> Result<Self, Self::Error> {
211
+ let e = e.event;
212
+ Ok(match e.event_type() {
213
+ EventType::WorkflowExecutionUpdateAccepted => {
214
+ UpdateMachineEvents::WorkflowExecutionUpdateAccepted
215
+ }
216
+ EventType::WorkflowExecutionUpdateCompleted => {
217
+ UpdateMachineEvents::WorkflowExecutionUpdateCompleted
218
+ }
219
+ _ => {
220
+ return Err(WFMachinesError::Nondeterminism(format!(
221
+ "Update machine does not handle this event: {e}"
222
+ )))
223
+ }
224
+ })
225
+ }
226
+ }
227
+
228
+ impl WFMachinesAdapter for UpdateMachine {
229
+ fn adapt_response(
230
+ &self,
231
+ my_command: UpdateMachineCommand,
232
+ _event_info: Option<EventInfo>,
233
+ ) -> Result<Vec<MachineResponse>, WFMachinesError> {
234
+ Ok(match my_command {
235
+ UpdateMachineCommand::Accept => self.build_command_msg(
236
+ format!("{}/accept", self.shared_state.message_id),
237
+ UpdateMsg::Accept(Acceptance {
238
+ accepted_request_message_id: self.shared_state.message_id.clone(),
239
+ accepted_request_sequencing_event_id: self.shared_state.event_seq_id,
240
+ ..Default::default()
241
+ }),
242
+ )?,
243
+ UpdateMachineCommand::Reject(fail) => {
244
+ vec![self.build_msg(
245
+ format!("{}/reject", self.shared_state.message_id),
246
+ UpdateMsg::Reject(Rejection {
247
+ rejected_request_message_id: self.shared_state.message_id.clone(),
248
+ rejected_request_sequencing_event_id: self.shared_state.event_seq_id,
249
+ failure: Some(fail),
250
+ ..Default::default()
251
+ }),
252
+ )?]
253
+ }
254
+ UpdateMachineCommand::Complete(p) => self.build_command_msg(
255
+ format!("{}/complete", self.shared_state.message_id),
256
+ UpdateMsg::Response(Response {
257
+ meta: Some(self.shared_state.request.meta.clone()),
258
+ outcome: Some(Outcome {
259
+ value: Some(outcome::Value::Success(p.into())),
260
+ }),
261
+ }),
262
+ )?,
263
+ UpdateMachineCommand::Fail(f) => self.build_command_msg(
264
+ format!("{}/complete", self.shared_state.message_id),
265
+ UpdateMsg::Response(Response {
266
+ meta: Some(self.shared_state.request.meta.clone()),
267
+ outcome: Some(Outcome {
268
+ value: Some(outcome::Value::Failure(f)),
269
+ }),
270
+ }),
271
+ )?,
272
+ })
273
+ }
274
+
275
+ fn matches_event(&self, event: &HistoryEvent) -> bool {
276
+ matches!(
277
+ event.event_type(),
278
+ EventType::WorkflowExecutionUpdateAccepted
279
+ | EventType::WorkflowExecutionUpdateRejected
280
+ | EventType::WorkflowExecutionUpdateCompleted
281
+ )
282
+ }
283
+ }
284
+
285
+ impl TryFrom<CommandType> for UpdateMachineEvents {
286
+ type Error = ();
287
+
288
+ fn try_from(c: CommandType) -> Result<Self, Self::Error> {
289
+ Ok(match c {
290
+ CommandType::ProtocolMessage => UpdateMachineEvents::CommandProtocolMessage,
291
+ _ => return Err(()),
292
+ })
293
+ }
294
+ }
295
+
296
+ #[derive(Default, Clone)]
297
+ pub(super) struct RequestInitiated {}
298
+ impl RequestInitiated {
299
+ fn on_accept(self) -> UpdateMachineTransition<Accepted> {
300
+ UpdateMachineTransition::commands([UpdateMachineCommand::Accept])
301
+ }
302
+ fn on_reject(self, fail: Failure) -> UpdateMachineTransition<Rejected> {
303
+ UpdateMachineTransition::commands([UpdateMachineCommand::Reject(fail)])
304
+ }
305
+ }
306
+
307
+ #[derive(Default, Clone)]
308
+ pub(super) struct Accepted {}
309
+ impl From<RequestInitiated> for Accepted {
310
+ fn from(_: RequestInitiated) -> Self {
311
+ Accepted {}
312
+ }
313
+ }
314
+ impl Accepted {
315
+ fn on_complete(self, p: Payload) -> UpdateMachineTransition<CompletedImmediately> {
316
+ UpdateMachineTransition::commands([UpdateMachineCommand::Complete(p)])
317
+ }
318
+ fn on_fail(self, f: Failure) -> UpdateMachineTransition<CompletedImmediately> {
319
+ UpdateMachineTransition::commands([UpdateMachineCommand::Fail(f)])
320
+ }
321
+ }
322
+
323
+ #[derive(Default, Clone)]
324
+ pub(super) struct AcceptCommandCreated {}
325
+ impl From<Accepted> for AcceptCommandCreated {
326
+ fn from(_: Accepted) -> Self {
327
+ AcceptCommandCreated {}
328
+ }
329
+ }
330
+ impl AcceptCommandCreated {
331
+ fn on_complete(self, p: Payload) -> UpdateMachineTransition<CompletedImmediatelyAcceptCreated> {
332
+ UpdateMachineTransition::commands([UpdateMachineCommand::Complete(p)])
333
+ }
334
+ fn on_fail(self, f: Failure) -> UpdateMachineTransition<CompletedImmediatelyAcceptCreated> {
335
+ UpdateMachineTransition::commands([UpdateMachineCommand::Fail(f)])
336
+ }
337
+ }
338
+
339
+ #[derive(Default, Clone)]
340
+ pub(super) struct AcceptCommandRecorded {}
341
+ impl AcceptCommandRecorded {
342
+ fn on_complete(self, p: Payload) -> UpdateMachineTransition<Completed> {
343
+ UpdateMachineTransition::commands([UpdateMachineCommand::Complete(p)])
344
+ }
345
+ fn on_fail(self, f: Failure) -> UpdateMachineTransition<Completed> {
346
+ UpdateMachineTransition::commands([UpdateMachineCommand::Fail(f)])
347
+ }
348
+ }
349
+ impl From<AcceptCommandCreated> for AcceptCommandRecorded {
350
+ fn from(_: AcceptCommandCreated) -> Self {
351
+ AcceptCommandRecorded {}
352
+ }
353
+ }
354
+
355
+ #[derive(Default, Clone)]
356
+ pub(super) struct Completed {}
357
+ impl From<AcceptCommandRecorded> for Completed {
358
+ fn from(_: AcceptCommandRecorded) -> Self {
359
+ Completed {}
360
+ }
361
+ }
362
+
363
+ #[derive(Default, Clone)]
364
+ pub(super) struct CompletedCommandCreated {}
365
+ impl From<Completed> for CompletedCommandCreated {
366
+ fn from(_: Completed) -> Self {
367
+ CompletedCommandCreated {}
368
+ }
369
+ }
370
+ impl From<CompletedImmediatelyCompleteCreated> for CompletedCommandCreated {
371
+ fn from(_: CompletedImmediatelyCompleteCreated) -> Self {
372
+ CompletedCommandCreated {}
373
+ }
374
+ }
375
+
376
+ #[derive(Default, Clone)]
377
+ pub(super) struct CompletedCommandRecorded {}
378
+ impl From<CompletedCommandCreated> for CompletedCommandRecorded {
379
+ fn from(_: CompletedCommandCreated) -> Self {
380
+ CompletedCommandRecorded {}
381
+ }
382
+ }
383
+
384
+ #[derive(Default, Clone)]
385
+ pub(super) struct Rejected {}
386
+ impl From<RequestInitiated> for Rejected {
387
+ fn from(_: RequestInitiated) -> Self {
388
+ Rejected {}
389
+ }
390
+ }
391
+
392
+ #[derive(Default, Clone)]
393
+ pub(super) struct CompletedImmediately {}
394
+
395
+ #[derive(Default, Clone)]
396
+ pub(super) struct CompletedImmediatelyAcceptCreated {}
397
+ impl From<CompletedImmediately> for CompletedImmediatelyAcceptCreated {
398
+ fn from(_: CompletedImmediately) -> Self {
399
+ CompletedImmediatelyAcceptCreated {}
400
+ }
401
+ }
402
+
403
+ #[derive(Default, Clone)]
404
+ pub(super) struct CompletedImmediatelyCompleteCreated {}
405
+ impl From<CompletedImmediatelyAcceptCreated> for CompletedImmediatelyCompleteCreated {
406
+ fn from(_: CompletedImmediatelyAcceptCreated) -> Self {
407
+ CompletedImmediatelyCompleteCreated {}
408
+ }
409
+ }
410
+
411
+ impl Cancellable for UpdateMachine {}
@@ -196,15 +196,15 @@ mod tests {
196
196
  use super::{super::OnEventWrapper, *};
197
197
  use crate::{
198
198
  replay::TestHistoryBuilder,
199
- test_help::{build_mock_pollers, mock_worker, MockPollCfg, ResponseType},
199
+ test_help::{build_fake_sdk, build_mock_pollers, mock_worker, MockPollCfg, ResponseType},
200
200
  worker::{
201
201
  client::mocks::mock_workflow_client,
202
- workflow::{machines::patch_state_machine::VERSION_SEARCH_ATTR_KEY, ManagedWFFunc},
202
+ workflow::machines::patch_state_machine::VERSION_SEARCH_ATTR_KEY,
203
203
  },
204
204
  };
205
205
  use rustfsm::StateMachine;
206
206
  use std::collections::HashMap;
207
- use temporal_sdk::{WfContext, WorkflowFunction};
207
+ use temporal_sdk::WfContext;
208
208
  use temporal_sdk_core_api::Worker;
209
209
  use temporal_sdk_core_protos::{
210
210
  coresdk::{
@@ -215,6 +215,7 @@ mod tests {
215
215
  command::v1::command::Attributes, common::v1::Payload,
216
216
  history::v1::UpsertWorkflowSearchAttributesEventAttributes,
217
217
  },
218
+ DEFAULT_WORKFLOW_TYPE,
218
219
  };
219
220
  use temporal_sdk_core_test_utils::WorkerTestHelpers;
220
221
 
@@ -227,7 +228,27 @@ mod tests {
227
228
 
228
229
  let (k1, k2) = ("foo", "bar");
229
230
 
230
- let wff = WorkflowFunction::new(move |ctx: WfContext| async move {
231
+ let mut mock_cfg = MockPollCfg::from_hist_builder(t);
232
+ mock_cfg.completion_asserts_from_expectations(|mut asserts| {
233
+ asserts.then(|wft| {
234
+ assert_matches!(
235
+ wft.commands.as_slice(),
236
+ [Command { attributes: Some(
237
+ command::Attributes::UpsertWorkflowSearchAttributesCommandAttributes(msg)
238
+ ), .. }, ..] => {
239
+ let fields = &msg.search_attributes.as_ref().unwrap().indexed_fields;
240
+ let payload1 = fields.get(k1).unwrap();
241
+ let payload2 = fields.get(k2).unwrap();
242
+ assert_eq!(payload1.data[0], 0x01);
243
+ assert_eq!(payload2.data[0], 0x02);
244
+ assert_eq!(fields.len(), 2);
245
+ }
246
+ );
247
+ });
248
+ });
249
+
250
+ let mut worker = build_fake_sdk(mock_cfg);
251
+ worker.register_wf(DEFAULT_WORKFLOW_TYPE, move |ctx: WfContext| async move {
231
252
  ctx.upsert_search_attributes([
232
253
  (
233
254
  String::from(k1),
@@ -246,27 +267,7 @@ mod tests {
246
267
  ]);
247
268
  Ok(().into())
248
269
  });
249
- let mut wfm = ManagedWFFunc::new(t, wff, vec![]);
250
-
251
- wfm.get_next_activation().await.unwrap();
252
- let commands = wfm.get_server_commands().commands;
253
- assert!(!commands.is_empty());
254
- let cmd = commands[0].clone();
255
- assert_eq!(
256
- cmd.command_type,
257
- CommandType::UpsertWorkflowSearchAttributes as i32
258
- );
259
- assert_matches!(
260
- cmd.attributes.unwrap(),
261
- Attributes::UpsertWorkflowSearchAttributesCommandAttributes(msg) => {
262
- let fields = &msg.search_attributes.unwrap().indexed_fields;
263
- let payload1 = fields.get(k1).unwrap();
264
- let payload2 = fields.get(k2).unwrap();
265
- assert_eq!(payload1.data[0], 0x01);
266
- assert_eq!(payload2.data[0], 0x02);
267
- assert_eq!(fields.len(), 2);
268
- });
269
- wfm.shutdown().await.unwrap();
270
+ worker.run().await.unwrap();
270
271
  }
271
272
 
272
273
  #[rstest::rstest]