@temporalio/core-bridge 1.3.0 → 1.4.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 (36) hide show
  1. package/Cargo.lock +117 -212
  2. package/index.d.ts +8 -2
  3. package/package.json +2 -3
  4. package/releases/aarch64-apple-darwin/index.node +0 -0
  5. package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
  6. package/releases/x86_64-apple-darwin/index.node +0 -0
  7. package/releases/x86_64-pc-windows-msvc/index.node +0 -0
  8. package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
  9. package/sdk-core/.buildkite/pipeline.yml +2 -0
  10. package/sdk-core/.cargo/config.toml +1 -1
  11. package/sdk-core/bridge-ffi/src/lib.rs +2 -2
  12. package/sdk-core/client/Cargo.toml +1 -1
  13. package/sdk-core/client/src/lib.rs +16 -11
  14. package/sdk-core/client/src/metrics.rs +13 -11
  15. package/sdk-core/client/src/raw.rs +1 -2
  16. package/sdk-core/client/src/retry.rs +57 -42
  17. package/sdk-core/core/Cargo.toml +12 -8
  18. package/sdk-core/core/src/core_tests/activity_tasks.rs +65 -40
  19. package/sdk-core/core/src/ephemeral_server/mod.rs +19 -3
  20. package/sdk-core/core/src/lib.rs +2 -2
  21. package/sdk-core/core/src/pollers/mod.rs +2 -0
  22. package/sdk-core/core/src/telemetry/metrics.rs +48 -39
  23. package/sdk-core/core/src/telemetry/mod.rs +53 -22
  24. package/sdk-core/core/src/telemetry/prometheus_server.rs +17 -13
  25. package/sdk-core/core/src/worker/client/mocks.rs +1 -0
  26. package/sdk-core/core/src/worker/workflow/mod.rs +4 -1
  27. package/sdk-core/core-api/Cargo.toml +1 -1
  28. package/sdk-core/test-utils/src/lib.rs +21 -2
  29. package/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +27 -40
  30. package/sdk-core/tests/integ_tests/polling_tests.rs +1 -0
  31. package/sdk-core/tests/integ_tests/queries_tests.rs +1 -1
  32. package/sdk-core/tests/integ_tests/workflow_tests/replay.rs +1 -5
  33. package/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +8 -2
  34. package/sdk-core/tests/main.rs +7 -0
  35. package/sdk-core/tests/runner.rs +93 -0
  36. package/src/conversions.rs +19 -3
@@ -105,7 +105,7 @@ async fn simple_query_legacy() {
105
105
  assert_eq!(&q_resp.unwrap()[0].data, query_resp);
106
106
  }
107
107
 
108
- #[rstest::rstest]
108
+ #[rstest]
109
109
  #[case::no_eviction(false)]
110
110
  #[case::with_eviction(true)]
111
111
  #[tokio::test]
@@ -1,7 +1,6 @@
1
1
  use assert_matches::assert_matches;
2
2
  use std::time::Duration;
3
3
  use temporal_sdk::{WfContext, Worker, WorkflowFunction};
4
- use temporal_sdk_core::telemetry_init;
5
4
  use temporal_sdk_core_api::errors::{PollActivityError, PollWfError};
6
5
  use temporal_sdk_core_protos::{
7
6
  coresdk::{
@@ -12,8 +11,7 @@ use temporal_sdk_core_protos::{
12
11
  DEFAULT_WORKFLOW_TYPE,
13
12
  };
14
13
  use temporal_sdk_core_test_utils::{
15
- canned_histories, get_integ_telem_options, history_from_proto_binary,
16
- init_core_replay_preloaded, WorkerTestHelpers,
14
+ canned_histories, history_from_proto_binary, init_core_replay_preloaded, WorkerTestHelpers,
17
15
  };
18
16
  use tokio::join;
19
17
 
@@ -101,7 +99,6 @@ async fn workflow_nondeterministic_replay() {
101
99
 
102
100
  #[tokio::test]
103
101
  async fn replay_using_wf_function() {
104
- telemetry_init(&get_integ_telem_options()).unwrap();
105
102
  let num_timers = 10;
106
103
  let t = canned_histories::long_sequential_timers(num_timers as usize);
107
104
  let func = timers_wf(num_timers);
@@ -118,7 +115,6 @@ async fn replay_ok_ending_with_terminated_or_timed_out() {
118
115
  t1.add_workflow_execution_terminated();
119
116
  let mut t2 = canned_histories::single_timer("1");
120
117
  t2.add_workflow_execution_timed_out();
121
- telemetry_init(&get_integ_telem_options()).unwrap();
122
118
  for t in [t1, t2] {
123
119
  let func = timers_wf(1);
124
120
  let (worker, _) = init_core_replay_preloaded(
@@ -1,8 +1,9 @@
1
- use std::collections::HashMap;
1
+ use log::warn;
2
+ use std::{collections::HashMap, env};
2
3
  use temporal_client::{WorkflowClientTrait, WorkflowOptions};
3
4
  use temporal_sdk::{WfContext, WorkflowResult};
4
5
  use temporal_sdk_core_protos::coresdk::{AsJsonPayloadExt, FromJsonPayloadExt};
5
- use temporal_sdk_core_test_utils::CoreWfStarter;
6
+ use temporal_sdk_core_test_utils::{CoreWfStarter, INTEG_TEMPORALITE_USED_ENV_VAR};
6
7
  use uuid::Uuid;
7
8
 
8
9
  // These are initialized on the server as part of the autosetup container which we
@@ -24,6 +25,11 @@ async fn sends_upsert() {
24
25
  let wf_id = Uuid::new_v4();
25
26
  let mut starter = CoreWfStarter::new(wf_name);
26
27
  let mut worker = starter.worker().await;
28
+ if env::var(INTEG_TEMPORALITE_USED_ENV_VAR).is_ok() {
29
+ warn!("skipping sends_upsert -- does not work on temporalite");
30
+ return;
31
+ }
32
+
27
33
  worker.register_wf(wf_name, search_attr_updater);
28
34
  let run_id = worker
29
35
  .submit_wf(
@@ -1,4 +1,11 @@
1
1
  //! Integration tests
2
+ //!
3
+ //! Note that integ tests which want to use the server (nearly all of them) *need* to use the
4
+ //! `#[rstest]` macro and accept the TODO fixture to support auto setup & teardown of ephemeral
5
+ //! local servers.
6
+
7
+ #[macro_use]
8
+ extern crate rstest;
2
9
 
3
10
  #[cfg(test)]
4
11
  mod integ_tests {
@@ -0,0 +1,93 @@
1
+ use anyhow::{anyhow, bail};
2
+ use std::{
3
+ env,
4
+ env::args,
5
+ path::{Path, PathBuf},
6
+ process::Stdio,
7
+ };
8
+ use temporal_sdk_core::ephemeral_server::{TemporaliteConfigBuilder, TestServerConfigBuilder};
9
+ use temporal_sdk_core_test_utils::{
10
+ default_cached_download, INTEG_SERVER_TARGET_ENV_VAR, INTEG_TEMPORALITE_USED_ENV_VAR,
11
+ INTEG_TEST_SERVER_USED_ENV_VAR,
12
+ };
13
+ use tokio::{self, process::Command};
14
+
15
+ #[tokio::main]
16
+ async fn main() -> Result<(), anyhow::Error> {
17
+ let cargo = env::var("CARGO").unwrap_or_else(|_| "cargo".to_string());
18
+ let server_type = env::var("INTEG_SERVER_TYPE")
19
+ .unwrap_or_else(|_| "temporalite".to_string())
20
+ .to_lowercase();
21
+ // Try building first, so that we error early on build failures & don't start server
22
+ let status = Command::new(&cargo)
23
+ .args(["test", "--test", "integ_tests", "--no-run"])
24
+ .status()
25
+ .await?;
26
+ if !status.success() {
27
+ bail!("Building integration tests failed!");
28
+ }
29
+
30
+ // Move to clap if we start doing any more complicated input
31
+ let (server, envs) = if server_type == "test-server" {
32
+ let config = TestServerConfigBuilder::default()
33
+ .exe(default_cached_download())
34
+ .build()?;
35
+ println!("Using java test server");
36
+ (
37
+ Some(config.start_server_with_output(Stdio::null()).await?),
38
+ vec![(INTEG_TEST_SERVER_USED_ENV_VAR, "true")],
39
+ )
40
+ } else if server_type == "temporalite" {
41
+ let config = TemporaliteConfigBuilder::default()
42
+ .exe(default_cached_download())
43
+ .build()?;
44
+ println!("Using temporalite");
45
+ (
46
+ Some(config.start_server_with_output(Stdio::null()).await?),
47
+ vec![(INTEG_TEMPORALITE_USED_ENV_VAR, "true")],
48
+ )
49
+ } else {
50
+ println!("Not starting up a server. One should be running already.");
51
+ (None, vec![])
52
+ };
53
+
54
+ // Run the integ tests, passing through arguments
55
+ let mut args = args();
56
+ // Shift off binary name
57
+ args.next();
58
+ let mut cmd = Command::new(&cargo);
59
+ if let Some(srv) = server.as_ref() {
60
+ cmd.env(
61
+ INTEG_SERVER_TARGET_ENV_VAR,
62
+ format!("http://{}", &srv.target),
63
+ );
64
+ }
65
+ let status = cmd
66
+ .envs(envs)
67
+ .current_dir(project_root())
68
+ .args(
69
+ ["test", "--test", "integ_tests"]
70
+ .into_iter()
71
+ .map(ToString::to_string)
72
+ .chain(args),
73
+ )
74
+ .status()
75
+ .await?;
76
+
77
+ if let Some(mut srv) = server {
78
+ srv.shutdown().await?;
79
+ }
80
+ if status.success() {
81
+ Ok(())
82
+ } else {
83
+ Err(anyhow!("Integ tests failed!"))
84
+ }
85
+ }
86
+
87
+ fn project_root() -> PathBuf {
88
+ Path::new(&env!("CARGO_MANIFEST_DIR"))
89
+ .ancestors()
90
+ .nth(1)
91
+ .unwrap()
92
+ .to_path_buf()
93
+ }
@@ -13,9 +13,9 @@ use temporal_sdk_core::{
13
13
  ephemeral_server::{
14
14
  TemporaliteConfig, TemporaliteConfigBuilder, TestServerConfig, TestServerConfigBuilder,
15
15
  },
16
- ClientOptions, ClientOptionsBuilder, ClientTlsConfig, Logger, MetricsExporter,
17
- OtelCollectorOptions, RetryConfig, TelemetryOptions, TelemetryOptionsBuilder, TlsConfig,
18
- TraceExporter, Url,
16
+ ClientOptions, ClientOptionsBuilder, ClientTlsConfig, Logger, MetricTemporality,
17
+ MetricsExporter, OtelCollectorOptions, RetryConfig, TelemetryOptions, TelemetryOptionsBuilder,
18
+ TlsConfig, TraceExporter, Url,
19
19
  };
20
20
 
21
21
  pub enum EphemeralServerConfig {
@@ -206,6 +206,22 @@ impl ObjectHandleConversionsExt for Handle<'_, JsObject> {
206
206
  }
207
207
  }
208
208
  if let Some(metrics) = js_optional_getter!(cx, self, "metrics", JsObject) {
209
+ if let Some(temporality) =
210
+ js_optional_value_getter!(cx, &metrics, "temporality", JsString)
211
+ {
212
+ match temporality.as_str() {
213
+ "cumulative" => {
214
+ telemetry_opts.metric_temporality(MetricTemporality::Cumulative);
215
+ }
216
+ "delta" => {
217
+ telemetry_opts.metric_temporality(MetricTemporality::Delta);
218
+ }
219
+ _ => {
220
+ cx.throw_type_error("Invalid telemetryOptions.metrics.temporality, expected 'cumulative' or 'delta'")?;
221
+ }
222
+ };
223
+ }
224
+
209
225
  if let Some(ref prom) = js_optional_getter!(cx, &metrics, "prometheus", JsObject) {
210
226
  let addr = js_value_getter!(cx, prom, "bindAddress", JsString);
211
227
  match addr.parse::<SocketAddr>() {