@temporalio/core-bridge 1.12.0 → 1.12.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 (116) hide show
  1. package/Cargo.lock +64 -119
  2. package/Cargo.toml +1 -1
  3. package/index.js +3 -2
  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 +1 -2
  11. package/sdk-core/.github/workflows/per-pr.yml +2 -0
  12. package/sdk-core/AGENTS.md +7 -0
  13. package/sdk-core/Cargo.toml +9 -5
  14. package/sdk-core/README.md +6 -5
  15. package/sdk-core/client/Cargo.toml +3 -2
  16. package/sdk-core/client/src/lib.rs +17 -8
  17. package/sdk-core/client/src/metrics.rs +57 -23
  18. package/sdk-core/client/src/raw.rs +33 -15
  19. package/sdk-core/core/Cargo.toml +11 -9
  20. package/sdk-core/core/benches/workflow_replay.rs +114 -15
  21. package/sdk-core/core/src/core_tests/activity_tasks.rs +18 -18
  22. package/sdk-core/core/src/core_tests/child_workflows.rs +4 -4
  23. package/sdk-core/core/src/core_tests/determinism.rs +6 -6
  24. package/sdk-core/core/src/core_tests/local_activities.rs +20 -20
  25. package/sdk-core/core/src/core_tests/mod.rs +40 -5
  26. package/sdk-core/core/src/core_tests/queries.rs +25 -16
  27. package/sdk-core/core/src/core_tests/replay_flag.rs +3 -3
  28. package/sdk-core/core/src/core_tests/updates.rs +3 -3
  29. package/sdk-core/core/src/core_tests/workers.rs +9 -7
  30. package/sdk-core/core/src/core_tests/workflow_tasks.rs +40 -42
  31. package/sdk-core/core/src/ephemeral_server/mod.rs +1 -19
  32. package/sdk-core/core/src/lib.rs +10 -1
  33. package/sdk-core/core/src/pollers/poll_buffer.rs +2 -2
  34. package/sdk-core/core/src/replay/mod.rs +3 -3
  35. package/sdk-core/core/src/telemetry/metrics.rs +306 -152
  36. package/sdk-core/core/src/telemetry/mod.rs +11 -4
  37. package/sdk-core/core/src/telemetry/otel.rs +134 -131
  38. package/sdk-core/core/src/telemetry/prometheus_meter.rs +885 -0
  39. package/sdk-core/core/src/telemetry/prometheus_server.rs +48 -28
  40. package/sdk-core/core/src/test_help/mod.rs +27 -12
  41. package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +7 -7
  42. package/sdk-core/core/src/worker/activities.rs +4 -4
  43. package/sdk-core/core/src/worker/client/mocks.rs +10 -3
  44. package/sdk-core/core/src/worker/client.rs +68 -5
  45. package/sdk-core/core/src/worker/heartbeat.rs +229 -0
  46. package/sdk-core/core/src/worker/mod.rs +35 -14
  47. package/sdk-core/core/src/worker/tuner/resource_based.rs +4 -4
  48. package/sdk-core/core/src/worker/workflow/history_update.rs +71 -19
  49. package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -2
  50. package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -1
  51. package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +31 -48
  52. package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -2
  53. package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +3 -3
  54. package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +4 -1
  55. package/sdk-core/core/src/worker/workflow/managed_run.rs +1 -1
  56. package/sdk-core/core/src/worker/workflow/mod.rs +15 -15
  57. package/sdk-core/core-api/Cargo.toml +2 -2
  58. package/sdk-core/core-api/src/envconfig.rs +204 -99
  59. package/sdk-core/core-api/src/lib.rs +9 -0
  60. package/sdk-core/core-api/src/telemetry/metrics.rs +548 -100
  61. package/sdk-core/core-api/src/worker.rs +11 -5
  62. package/sdk-core/core-c-bridge/Cargo.toml +49 -0
  63. package/sdk-core/core-c-bridge/build.rs +26 -0
  64. package/sdk-core/core-c-bridge/include/temporal-sdk-core-c-bridge.h +817 -0
  65. package/sdk-core/core-c-bridge/src/client.rs +679 -0
  66. package/sdk-core/core-c-bridge/src/lib.rs +245 -0
  67. package/sdk-core/core-c-bridge/src/metric.rs +682 -0
  68. package/sdk-core/core-c-bridge/src/random.rs +61 -0
  69. package/sdk-core/core-c-bridge/src/runtime.rs +445 -0
  70. package/sdk-core/core-c-bridge/src/testing.rs +282 -0
  71. package/sdk-core/core-c-bridge/src/tests/context.rs +644 -0
  72. package/sdk-core/core-c-bridge/src/tests/mod.rs +178 -0
  73. package/sdk-core/core-c-bridge/src/tests/utils.rs +108 -0
  74. package/sdk-core/core-c-bridge/src/worker.rs +1069 -0
  75. package/sdk-core/etc/deps.svg +64 -64
  76. package/sdk-core/sdk/src/activity_context.rs +6 -4
  77. package/sdk-core/sdk/src/lib.rs +49 -27
  78. package/sdk-core/sdk/src/workflow_future.rs +18 -25
  79. package/sdk-core/sdk-core-protos/protos/api_upstream/README.md +4 -0
  80. package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +0 -2
  81. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +630 -83
  82. package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +632 -78
  83. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/batch/v1/message.proto +4 -4
  84. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +6 -4
  85. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
  86. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +32 -2
  87. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +10 -1
  88. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/deployment.proto +26 -0
  89. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +2 -0
  90. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/reset.proto +4 -4
  91. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
  92. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +47 -31
  93. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +4 -4
  94. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +7 -1
  95. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/worker/v1/message.proto +134 -0
  96. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +14 -11
  97. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +148 -37
  98. package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +21 -0
  99. package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -4
  100. package/sdk-core/sdk-core-protos/src/history_builder.rs +9 -5
  101. package/sdk-core/sdk-core-protos/src/lib.rs +96 -6
  102. package/sdk-core/test-utils/src/lib.rs +11 -3
  103. package/sdk-core/tests/cloud_tests.rs +3 -3
  104. package/sdk-core/tests/heavy_tests.rs +11 -3
  105. package/sdk-core/tests/integ_tests/client_tests.rs +12 -13
  106. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +1 -1
  107. package/sdk-core/tests/integ_tests/metrics_tests.rs +188 -83
  108. package/sdk-core/tests/integ_tests/polling_tests.rs +1 -1
  109. package/sdk-core/tests/integ_tests/queries_tests.rs +56 -40
  110. package/sdk-core/tests/integ_tests/update_tests.rs +2 -7
  111. package/sdk-core/tests/integ_tests/worker_tests.rs +3 -4
  112. package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +3 -7
  113. package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +3 -5
  114. package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +24 -17
  115. package/src/client.rs +6 -0
  116. package/src/metrics.rs +6 -6
@@ -0,0 +1,282 @@
1
+ use std::time::Duration;
2
+
3
+ use crate::ByteArray;
4
+ use crate::ByteArrayRef;
5
+ use crate::UserDataHandle;
6
+ use crate::runtime::Runtime;
7
+
8
+ use temporal_sdk_core::ephemeral_server;
9
+
10
+ pub struct EphemeralServer {
11
+ runtime: Runtime,
12
+ server: Option<ephemeral_server::EphemeralServer>,
13
+ }
14
+
15
+ #[repr(C)]
16
+ pub struct DevServerOptions {
17
+ /// Must always be present
18
+ pub test_server: *const TestServerOptions,
19
+ pub namespace: ByteArrayRef,
20
+ pub ip: ByteArrayRef,
21
+ /// Empty means default behavior
22
+ pub database_filename: ByteArrayRef,
23
+ pub ui: bool,
24
+ pub ui_port: u16,
25
+ pub log_format: ByteArrayRef,
26
+ pub log_level: ByteArrayRef,
27
+ }
28
+
29
+ #[repr(C)]
30
+ pub struct TestServerOptions {
31
+ /// Empty means default behavior
32
+ pub existing_path: ByteArrayRef,
33
+ pub sdk_name: ByteArrayRef,
34
+ pub sdk_version: ByteArrayRef,
35
+ pub download_version: ByteArrayRef,
36
+ /// Empty means default behavior
37
+ pub download_dest_dir: ByteArrayRef,
38
+ /// 0 means default behavior
39
+ pub port: u16,
40
+ /// Newline delimited
41
+ pub extra_args: ByteArrayRef,
42
+ /// 0 means no TTL
43
+ pub download_ttl_seconds: u64,
44
+ }
45
+
46
+ /// Anything besides user data must be freed if non-null.
47
+ pub type EphemeralServerStartCallback = unsafe extern "C" fn(
48
+ user_data: *mut libc::c_void,
49
+ success: *mut EphemeralServer,
50
+ success_target: *const ByteArray,
51
+ fail: *const ByteArray,
52
+ );
53
+
54
+ /// Runtime must live as long as server. Options and user data must live through
55
+ /// callback.
56
+ #[unsafe(no_mangle)]
57
+ pub extern "C" fn temporal_core_ephemeral_server_start_dev_server(
58
+ runtime: *mut Runtime,
59
+ options: *const DevServerOptions,
60
+ user_data: *mut libc::c_void,
61
+ callback: EphemeralServerStartCallback,
62
+ ) {
63
+ let runtime = unsafe { &mut *runtime };
64
+ // Convert opts
65
+ let options = unsafe { &*options };
66
+ let config: ephemeral_server::TemporalDevServerConfig = match options.try_into() {
67
+ Ok(v) => v,
68
+ Err(err) => {
69
+ unsafe {
70
+ callback(
71
+ user_data,
72
+ std::ptr::null_mut(),
73
+ std::ptr::null(),
74
+ runtime
75
+ .alloc_utf8(&format!("Invalid options: {err}"))
76
+ .into_raw(),
77
+ );
78
+ }
79
+ return;
80
+ }
81
+ };
82
+ // Spawn async call
83
+ let user_data = UserDataHandle(user_data);
84
+ runtime.core.tokio_handle().spawn(async move {
85
+ match config.start_server().await {
86
+ Ok(server) => {
87
+ let target = runtime.alloc_utf8(&server.target).into_raw();
88
+ let owned_server = Box::into_raw(Box::new(EphemeralServer {
89
+ runtime: runtime.clone(),
90
+ server: Some(server),
91
+ }));
92
+ unsafe {
93
+ callback(user_data.into(), owned_server, target, std::ptr::null());
94
+ }
95
+ }
96
+ Err(err) => unsafe {
97
+ callback(
98
+ user_data.into(),
99
+ std::ptr::null_mut(),
100
+ std::ptr::null(),
101
+ runtime
102
+ .alloc_utf8(&format!("Connection failed: {err}"))
103
+ .into_raw(),
104
+ );
105
+ },
106
+ }
107
+ });
108
+ }
109
+
110
+ /// Runtime must live as long as server. Options and user data must live through
111
+ /// callback.
112
+ #[unsafe(no_mangle)]
113
+ pub extern "C" fn temporal_core_ephemeral_server_start_test_server(
114
+ runtime: *mut Runtime,
115
+ options: *const TestServerOptions,
116
+ user_data: *mut libc::c_void,
117
+ callback: EphemeralServerStartCallback,
118
+ ) {
119
+ let runtime = unsafe { &mut *runtime };
120
+ // Convert opts
121
+ let options = unsafe { &*options };
122
+ let config: ephemeral_server::TestServerConfig = match options.try_into() {
123
+ Ok(v) => v,
124
+ Err(err) => {
125
+ unsafe {
126
+ callback(
127
+ user_data,
128
+ std::ptr::null_mut(),
129
+ std::ptr::null(),
130
+ runtime
131
+ .alloc_utf8(&format!("Invalid options: {err}"))
132
+ .into_raw(),
133
+ );
134
+ }
135
+ return;
136
+ }
137
+ };
138
+ // Spawn async call
139
+ let user_data = UserDataHandle(user_data);
140
+ runtime.core.tokio_handle().spawn(async move {
141
+ match config.start_server().await {
142
+ Ok(server) => {
143
+ let target = runtime.alloc_utf8(&server.target).into_raw();
144
+ let owned_server = Box::into_raw(Box::new(EphemeralServer {
145
+ runtime: runtime.clone(),
146
+ server: Some(server),
147
+ }));
148
+ unsafe {
149
+ callback(user_data.into(), owned_server, target, std::ptr::null());
150
+ }
151
+ }
152
+ Err(err) => unsafe {
153
+ callback(
154
+ user_data.into(),
155
+ std::ptr::null_mut(),
156
+ std::ptr::null(),
157
+ runtime
158
+ .alloc_utf8(&format!("Connection failed: {err}"))
159
+ .into_raw(),
160
+ );
161
+ },
162
+ }
163
+ });
164
+ }
165
+
166
+ #[unsafe(no_mangle)]
167
+ pub extern "C" fn temporal_core_ephemeral_server_free(server: *mut EphemeralServer) {
168
+ unsafe {
169
+ let _ = Box::from_raw(server);
170
+ }
171
+ }
172
+
173
+ pub type EphemeralServerShutdownCallback =
174
+ unsafe extern "C" fn(user_data: *mut libc::c_void, fail: *const ByteArray);
175
+
176
+ #[unsafe(no_mangle)]
177
+ pub extern "C" fn temporal_core_ephemeral_server_shutdown(
178
+ server: *mut EphemeralServer,
179
+ user_data: *mut libc::c_void,
180
+ callback: EphemeralServerShutdownCallback,
181
+ ) {
182
+ let server = unsafe { &mut *server };
183
+ let eph_server = server.server.take();
184
+ let user_data = UserDataHandle(user_data);
185
+ server.runtime.core.tokio_handle().spawn(async move {
186
+ let fail = if let Some(mut eph_server) = eph_server {
187
+ if let Err(err) = eph_server.shutdown().await {
188
+ server
189
+ .runtime
190
+ .alloc_utf8(&format!("Failed shutting down server: {err}"))
191
+ .into_raw()
192
+ } else {
193
+ std::ptr::null_mut()
194
+ }
195
+ } else {
196
+ std::ptr::null_mut()
197
+ };
198
+ unsafe {
199
+ callback(user_data.into(), fail);
200
+ }
201
+ });
202
+ }
203
+
204
+ impl TryFrom<&DevServerOptions> for ephemeral_server::TemporalDevServerConfig {
205
+ type Error = anyhow::Error;
206
+
207
+ fn try_from(options: &DevServerOptions) -> anyhow::Result<Self> {
208
+ let test_server_options = unsafe { &*options.test_server };
209
+ Ok(ephemeral_server::TemporalDevServerConfigBuilder::default()
210
+ .exe(test_server_options.exe())
211
+ .namespace(options.namespace.to_string())
212
+ .ip(options.ip.to_string())
213
+ .port(test_server_options.port())
214
+ .db_filename(options.database_filename.to_option_string())
215
+ .ui(options.ui)
216
+ .ui_port(if options.ui_port == 0 || !options.ui {
217
+ None
218
+ } else {
219
+ Some(options.ui_port)
220
+ })
221
+ .log((
222
+ options.log_format.to_string(),
223
+ options.log_level.to_string(),
224
+ ))
225
+ .extra_args(test_server_options.extra_args())
226
+ .build()?)
227
+ }
228
+ }
229
+
230
+ impl TryFrom<&TestServerOptions> for ephemeral_server::TestServerConfig {
231
+ type Error = anyhow::Error;
232
+
233
+ fn try_from(options: &TestServerOptions) -> anyhow::Result<Self> {
234
+ Ok(ephemeral_server::TestServerConfigBuilder::default()
235
+ .exe(options.exe())
236
+ .port(options.port())
237
+ .extra_args(options.extra_args())
238
+ .build()?)
239
+ }
240
+ }
241
+
242
+ impl TestServerOptions {
243
+ fn exe(&self) -> ephemeral_server::EphemeralExe {
244
+ if let Some(existing_path) = self.existing_path.to_option_string() {
245
+ ephemeral_server::EphemeralExe::ExistingPath(existing_path)
246
+ } else {
247
+ ephemeral_server::EphemeralExe::CachedDownload {
248
+ version: match self.download_version.to_str() {
249
+ "default" => ephemeral_server::EphemeralExeVersion::SDKDefault {
250
+ sdk_name: self.sdk_name.to_string(),
251
+ sdk_version: self.sdk_version.to_string(),
252
+ },
253
+ download_version => {
254
+ ephemeral_server::EphemeralExeVersion::Fixed(download_version.to_string())
255
+ }
256
+ },
257
+ dest_dir: self.download_dest_dir.to_option_string(),
258
+ ttl: if self.download_ttl_seconds == 0 {
259
+ None
260
+ } else {
261
+ Some(Duration::from_secs(self.download_ttl_seconds))
262
+ },
263
+ }
264
+ }
265
+ }
266
+
267
+ fn port(&self) -> Option<u16> {
268
+ if self.port == 0 {
269
+ None
270
+ } else {
271
+ Some(self.port)
272
+ }
273
+ }
274
+
275
+ fn extra_args(&self) -> Vec<String> {
276
+ if let Some(extra_args) = self.extra_args.to_option_str() {
277
+ extra_args.split('\n').map(str::to_string).collect()
278
+ } else {
279
+ Vec::new()
280
+ }
281
+ }
282
+ }