@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.
- package/Cargo.lock +64 -119
- package/Cargo.toml +1 -1
- package/index.js +3 -2
- package/package.json +3 -3
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/sdk-core/.cargo/config.toml +1 -2
- package/sdk-core/.github/workflows/per-pr.yml +2 -0
- package/sdk-core/AGENTS.md +7 -0
- package/sdk-core/Cargo.toml +9 -5
- package/sdk-core/README.md +6 -5
- package/sdk-core/client/Cargo.toml +3 -2
- package/sdk-core/client/src/lib.rs +17 -8
- package/sdk-core/client/src/metrics.rs +57 -23
- package/sdk-core/client/src/raw.rs +33 -15
- package/sdk-core/core/Cargo.toml +11 -9
- package/sdk-core/core/benches/workflow_replay.rs +114 -15
- package/sdk-core/core/src/core_tests/activity_tasks.rs +18 -18
- package/sdk-core/core/src/core_tests/child_workflows.rs +4 -4
- package/sdk-core/core/src/core_tests/determinism.rs +6 -6
- package/sdk-core/core/src/core_tests/local_activities.rs +20 -20
- package/sdk-core/core/src/core_tests/mod.rs +40 -5
- package/sdk-core/core/src/core_tests/queries.rs +25 -16
- package/sdk-core/core/src/core_tests/replay_flag.rs +3 -3
- package/sdk-core/core/src/core_tests/updates.rs +3 -3
- package/sdk-core/core/src/core_tests/workers.rs +9 -7
- package/sdk-core/core/src/core_tests/workflow_tasks.rs +40 -42
- package/sdk-core/core/src/ephemeral_server/mod.rs +1 -19
- package/sdk-core/core/src/lib.rs +10 -1
- package/sdk-core/core/src/pollers/poll_buffer.rs +2 -2
- package/sdk-core/core/src/replay/mod.rs +3 -3
- package/sdk-core/core/src/telemetry/metrics.rs +306 -152
- package/sdk-core/core/src/telemetry/mod.rs +11 -4
- package/sdk-core/core/src/telemetry/otel.rs +134 -131
- package/sdk-core/core/src/telemetry/prometheus_meter.rs +885 -0
- package/sdk-core/core/src/telemetry/prometheus_server.rs +48 -28
- package/sdk-core/core/src/test_help/mod.rs +27 -12
- package/sdk-core/core/src/worker/activities/activity_heartbeat_manager.rs +7 -7
- package/sdk-core/core/src/worker/activities.rs +4 -4
- package/sdk-core/core/src/worker/client/mocks.rs +10 -3
- package/sdk-core/core/src/worker/client.rs +68 -5
- package/sdk-core/core/src/worker/heartbeat.rs +229 -0
- package/sdk-core/core/src/worker/mod.rs +35 -14
- package/sdk-core/core/src/worker/tuner/resource_based.rs +4 -4
- package/sdk-core/core/src/worker/workflow/history_update.rs +71 -19
- package/sdk-core/core/src/worker/workflow/machines/cancel_external_state_machine.rs +1 -2
- package/sdk-core/core/src/worker/workflow/machines/child_workflow_state_machine.rs +1 -1
- package/sdk-core/core/src/worker/workflow/machines/nexus_operation_state_machine.rs +31 -48
- package/sdk-core/core/src/worker/workflow/machines/signal_external_state_machine.rs +1 -2
- package/sdk-core/core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +3 -3
- package/sdk-core/core/src/worker/workflow/machines/workflow_machines.rs +4 -1
- package/sdk-core/core/src/worker/workflow/managed_run.rs +1 -1
- package/sdk-core/core/src/worker/workflow/mod.rs +15 -15
- package/sdk-core/core-api/Cargo.toml +2 -2
- package/sdk-core/core-api/src/envconfig.rs +204 -99
- package/sdk-core/core-api/src/lib.rs +9 -0
- package/sdk-core/core-api/src/telemetry/metrics.rs +548 -100
- package/sdk-core/core-api/src/worker.rs +11 -5
- package/sdk-core/core-c-bridge/Cargo.toml +49 -0
- package/sdk-core/core-c-bridge/build.rs +26 -0
- package/sdk-core/core-c-bridge/include/temporal-sdk-core-c-bridge.h +817 -0
- package/sdk-core/core-c-bridge/src/client.rs +679 -0
- package/sdk-core/core-c-bridge/src/lib.rs +245 -0
- package/sdk-core/core-c-bridge/src/metric.rs +682 -0
- package/sdk-core/core-c-bridge/src/random.rs +61 -0
- package/sdk-core/core-c-bridge/src/runtime.rs +445 -0
- package/sdk-core/core-c-bridge/src/testing.rs +282 -0
- package/sdk-core/core-c-bridge/src/tests/context.rs +644 -0
- package/sdk-core/core-c-bridge/src/tests/mod.rs +178 -0
- package/sdk-core/core-c-bridge/src/tests/utils.rs +108 -0
- package/sdk-core/core-c-bridge/src/worker.rs +1069 -0
- package/sdk-core/etc/deps.svg +64 -64
- package/sdk-core/sdk/src/activity_context.rs +6 -4
- package/sdk-core/sdk/src/lib.rs +49 -27
- package/sdk-core/sdk/src/workflow_future.rs +18 -25
- package/sdk-core/sdk-core-protos/protos/api_upstream/README.md +4 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/buf.yaml +0 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv2.json +630 -83
- package/sdk-core/sdk-core-protos/protos/api_upstream/openapi/openapiv3.yaml +632 -78
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/batch/v1/message.proto +4 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/command/v1/message.proto +6 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/common/v1/message.proto +2 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/deployment/v1/message.proto +32 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/common.proto +10 -1
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/deployment.proto +26 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +2 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/enums/v1/reset.proto +4 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/failure/v1/message.proto +2 -2
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/history/v1/message.proto +47 -31
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/nexus/v1/message.proto +4 -4
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/schedule/v1/message.proto +7 -1
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/worker/v1/message.proto +134 -0
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflow/v1/message.proto +14 -11
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +148 -37
- package/sdk-core/sdk-core-protos/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +21 -0
- package/sdk-core/sdk-core-protos/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -4
- package/sdk-core/sdk-core-protos/src/history_builder.rs +9 -5
- package/sdk-core/sdk-core-protos/src/lib.rs +96 -6
- package/sdk-core/test-utils/src/lib.rs +11 -3
- package/sdk-core/tests/cloud_tests.rs +3 -3
- package/sdk-core/tests/heavy_tests.rs +11 -3
- package/sdk-core/tests/integ_tests/client_tests.rs +12 -13
- package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +1 -1
- package/sdk-core/tests/integ_tests/metrics_tests.rs +188 -83
- package/sdk-core/tests/integ_tests/polling_tests.rs +1 -1
- package/sdk-core/tests/integ_tests/queries_tests.rs +56 -40
- package/sdk-core/tests/integ_tests/update_tests.rs +2 -7
- package/sdk-core/tests/integ_tests/worker_tests.rs +3 -4
- package/sdk-core/tests/integ_tests/worker_versioning_tests.rs +3 -7
- package/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +3 -5
- package/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +24 -17
- package/src/client.rs +6 -0
- 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
|
+
}
|