From 41c916dbf726c1ddf48a988b66e355363ad5f90b Mon Sep 17 00:00:00 2001 From: Jordan Noone Date: Tue, 15 Sep 2026 00:06:28 -0700 Subject: [PATCH 1/4] Fix Machine API dependency compatibility --- Cargo.lock | 28 +++++++--------------------- bambulabs/Cargo.toml | 2 +- bambulabs/src/client.rs | 10 ++++++---- src/server/mod.rs | 3 ++- 4 files changed, 16 insertions(+), 27 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b9092d5a..0ee3d8d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -257,7 +257,7 @@ dependencies = [ "parse-display", "pretty_assertions", "rumqttc", - "rustls 0.22.4", + "rustls", "schemars", "serde", "serde_json", @@ -693,7 +693,7 @@ dependencies = [ "openapiv3", "paste", "percent-encoding", - "rustls 0.23.40", + "rustls", "rustls-pemfile", "schemars", "scopeguard", @@ -1232,7 +1232,7 @@ dependencies = [ "http", "hyper", "hyper-util", - "rustls 0.23.40", + "rustls", "rustls-pki-types", "tokio", "tokio-rustls", @@ -2409,7 +2409,7 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash", - "rustls 0.23.40", + "rustls", "socket2 0.5.7", "thiserror 1.0.68", "tokio", @@ -2429,7 +2429,7 @@ dependencies = [ "rand_pcg", "ring", "rustc-hash", - "rustls 0.23.40", + "rustls", "rustls-pki-types", "slab", "thiserror 2.0.20", @@ -2619,7 +2619,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.40", + "rustls", "rustls-pemfile", "rustls-pki-types", "serde", @@ -2699,20 +2699,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - [[package]] name = "rustls" version = "0.23.40" @@ -3507,7 +3493,7 @@ version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.40", + "rustls", "tokio", ] diff --git a/bambulabs/Cargo.toml b/bambulabs/Cargo.toml index a8d1ae13..644e774f 100644 --- a/bambulabs/Cargo.toml +++ b/bambulabs/Cargo.toml @@ -12,7 +12,7 @@ lazy_static = "1.5.0" nanoid = "0.5.0" parse-display = "0.11.0" rumqttc = "0.25.1" -rustls = "0.22" +rustls = "0.23" schemars = { version = "0.8", features = ["uuid", "url"] } serde = { version = "1", features = ["derive"] } serde_json = "1" diff --git a/bambulabs/src/client.rs b/bambulabs/src/client.rs index ad5e5a1f..798a73c3 100644 --- a/bambulabs/src/client.rs +++ b/bambulabs/src/client.rs @@ -60,10 +60,12 @@ impl Client { fn get_config(ip: &str, access_code: &str) -> Result { let client_id = format!("bambu-api-{}", nanoid::nanoid!(8)); - let ssl_config = rustls::ClientConfig::builder() - .dangerous() - .with_custom_certificate_verifier(Arc::new(crate::no_auth::NoAuth::new())) - .with_no_client_auth(); + let ssl_config = + rustls::ClientConfig::builder_with_provider(Arc::new(rustls::crypto::aws_lc_rs::default_provider())) + .with_safe_default_protocol_versions()? + .dangerous() + .with_custom_certificate_verifier(Arc::new(crate::no_auth::NoAuth::new())) + .with_no_client_auth(); let mut opts = rumqttc::MqttOptions::new(client_id, ip, MQTT_PORT); opts.set_max_packet_size(MAX_PACKET_SIZE, MAX_PACKET_SIZE); diff --git a/src/server/mod.rs b/src/server/mod.rs index ca3369a2..d9b31959 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -61,6 +61,7 @@ pub async fn create_server( default_request_body_max_bytes: 107374182400, // 100 Gigiabytes. default_handler_task_mode: dropshot::HandlerTaskMode::CancelOnDisconnect, log_headers: Default::default(), + compression: Default::default(), }; let api_context = Arc::new(Context { @@ -102,7 +103,7 @@ pub async fn serve( let (server, _api_context) = create_server(bind, machines, registry).await?; let addr: SocketAddr = bind.parse()?; - let responder = libmdns::Responder::new().unwrap(); + let responder = libmdns::Responder::new(); let _svc = responder.register( "_machine-api._tcp".to_owned(), "Machine Api Server".to_owned(), From 2db9379eb8ec77c2194ee7e86f5e6126eb0c6acf Mon Sep 17 00:00:00 2001 From: Jordan Noone Date: Tue, 15 Sep 2026 00:13:43 -0700 Subject: [PATCH 2/4] Update remaining mDNS and telemetry API calls --- Cargo.lock | 184 ++++++++++++++++++++----------- Cargo.toml | 2 +- bambulabs/src/client.rs | 4 +- src/bin/machine-api/cmd_serve.rs | 6 +- src/bin/machine-api/main.rs | 7 +- src/server/mod.rs | 4 +- 6 files changed, 128 insertions(+), 79 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ee3d8d1..c41c53f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -203,7 +203,7 @@ dependencies = [ "pin-project-lite", "rustversion", "serde", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower 0.5.1", "tower-layer", "tower-service", @@ -224,7 +224,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", ] @@ -485,9 +485,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8030735ecb0d128428b64cd379809817e620a40e5001c54465b99ec5feec2857" dependencies = [ "futures-core", - "prost", - "prost-types", - "tonic", + "prost 0.13.3", + "prost-types 0.13.3", + "tonic 0.12.3", "tracing-core", ] @@ -504,14 +504,14 @@ dependencies = [ "hdrhistogram", "humantime", "hyper-util", - "prost", - "prost-types", + "prost 0.13.3", + "prost-types 0.13.3", "serde", "serde_json", "thread_local", "tokio", "tokio-stream", - "tonic", + "tonic 0.12.3", "tracing", "tracing-core", "tracing-subscriber", @@ -1707,9 +1707,9 @@ dependencies = [ "openapi-lint", "openapiv3", "openssl", - "opentelemetry 0.32.0", + "opentelemetry", "opentelemetry-otlp", - "opentelemetry_sdk 0.32.1", + "opentelemetry_sdk", "parse-display", "portpicker", "pretty_assertions", @@ -2091,20 +2091,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "opentelemetry" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 1.0.68", - "tracing", -] - [[package]] name = "opentelemetry" version = "0.32.0" @@ -2121,51 +2107,32 @@ dependencies = [ [[package]] name = "opentelemetry-otlp" -version = "0.27.0" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cf61a1868dacc576bf2b2a1c3e9ab150af7272909e80085c3173384fe11f76" +checksum = "9966929966d17620d7c316c643ba62631826e10021409357772d5eea84f62c35" dependencies = [ - "async-trait", - "futures-core", "http", - "opentelemetry 0.27.1", + "opentelemetry", "opentelemetry-proto", - "opentelemetry_sdk 0.27.1", - "prost", - "thiserror 1.0.68", + "opentelemetry_sdk", + "prost 0.14.4", + "thiserror 2.0.20", "tokio", - "tonic", - "tracing", + "tonic 0.14.6", + "tonic-types", ] [[package]] name = "opentelemetry-proto" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6e05acbfada5ec79023c85368af14abd0b307c015e9064d249b2a950ef459a6" -dependencies = [ - "opentelemetry 0.27.1", - "opentelemetry_sdk 0.27.1", - "prost", - "tonic", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.27.1" +version = "0.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" +checksum = "56d658ba1faf63f7b9c492cfbe6e0ec365440a16132d3270c1065f7b33f1b638" dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "opentelemetry 0.27.1", - "percent-encoding", - "rand 0.8.5", - "serde_json", - "thiserror 1.0.68", + "opentelemetry", + "opentelemetry_sdk", + "prost 0.14.4", + "tonic 0.14.6", + "tonic-prost", ] [[package]] @@ -2177,7 +2144,7 @@ dependencies = [ "futures-channel", "futures-executor", "futures-util", - "opentelemetry 0.32.0", + "opentelemetry", "percent-encoding", "portable-atomic", "rand 0.9.4", @@ -2373,7 +2340,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.13.3", +] + +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive 0.14.4", ] [[package]] @@ -2389,13 +2366,35 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "prost-types" version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4759aa0d3a6232fb8dbdb97b61de2c20047c68aca932c7ed76da9d788508d670" dependencies = [ - "prost", + "prost 0.13.3", +] + +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost 0.14.4", ] [[package]] @@ -2625,7 +2624,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "system-configuration 0.6.1", "tokio", "tokio-native-tls", @@ -3234,9 +3233,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" dependencies = [ "futures-core", ] @@ -3596,7 +3595,7 @@ dependencies = [ "hyper-util", "percent-encoding", "pin-project", - "prost", + "prost 0.13.3", "socket2 0.5.7", "tokio", "tokio-stream", @@ -3606,6 +3605,54 @@ dependencies = [ "tracing", ] +[[package]] +name = "tonic" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" +dependencies = [ + "async-trait", + "base64 0.22.1", + "bytes", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "sync_wrapper 1.0.2", + "tokio", + "tokio-stream", + "tower 0.5.1", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-prost" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" +dependencies = [ + "bytes", + "prost 0.14.4", + "tonic 0.14.6", +] + +[[package]] +name = "tonic-types" +version = "0.14.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab1b02061f83d519bba3caa167f88f261ef05720ab8ebc954ade70de3348e8" +dependencies = [ + "prost 0.14.4", + "prost-types 0.14.4", + "tonic 0.14.6", +] + [[package]] name = "tower" version = "0.4.13" @@ -3634,10 +3681,15 @@ checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" dependencies = [ "futures-core", "futures-util", + "indexmap 2.14.0", "pin-project-lite", + "slab", "sync_wrapper 0.1.2", + "tokio", + "tokio-util", "tower-layer", "tower-service", + "tracing", ] [[package]] @@ -3702,7 +3754,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adbc64cba7137545b8044cb1fe9814f7aacf3c6b5f9b45be8bb5db538befdb26" dependencies = [ "js-sys", - "opentelemetry 0.32.0", + "opentelemetry", "smallvec", "tracing", "tracing-core", diff --git a/Cargo.toml b/Cargo.toml index 07d04ff7..7173f718 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,7 @@ moonraker = { path = "moonraker", optional = true } multer = { version = "3.1.0", features = ["json"] } openssl = { version = "0", features = ["vendored"] } opentelemetry = "0.32.0" -opentelemetry-otlp = "0.27.0" +opentelemetry-otlp = { version = "0.32.0", default-features = false, features = ["grpc-tonic", "trace", "metrics", "logs", "internal-logs"] } opentelemetry_sdk = { version = "0.32.1", features = ["rt-tokio"] } parse-display = "0.11.0" prometheus-client = "0.25.0" diff --git a/bambulabs/src/client.rs b/bambulabs/src/client.rs index 798a73c3..e573eeca 100644 --- a/bambulabs/src/client.rs +++ b/bambulabs/src/client.rs @@ -48,8 +48,8 @@ impl Client { Ok(Self { ip, access_code, - topic_device_request: format!("device/{}/request", &serial), - topic_device_report: format!("device/{}/report", &serial), + topic_device_request: format!("device/{}/request", serial), + topic_device_report: format!("device/{}/report", serial), serial, client: Arc::new(client), event_loop: Arc::new(Mutex::new(event_loop)), diff --git a/src/bin/machine-api/cmd_serve.rs b/src/bin/machine-api/cmd_serve.rs index 3f0e5d3d..228c92ad 100644 --- a/src/bin/machine-api/cmd_serve.rs +++ b/src/bin/machine-api/cmd_serve.rs @@ -156,10 +156,10 @@ pub async fn main(_cli: &Cli, cfg: &Config, bind: &str) -> Result<()> { let bind_addr: SocketAddr = bind.parse()?; tokio::spawn(async move { let bind_addr = bind_addr; - let responder = libmdns::Responder::new().unwrap(); + let responder = libmdns::Responder::new(); let _svc = responder.register( - "_machine-api._tcp".to_owned(), - "Machine Api Server".to_owned(), + "_machine-api._tcp", + "Machine Api Server", bind_addr.port(), &["path=/"], ); diff --git a/src/bin/machine-api/main.rs b/src/bin/machine-api/main.rs index 50a5f600..d4621891 100644 --- a/src/bin/machine-api/main.rs +++ b/src/bin/machine-api/main.rs @@ -127,11 +127,8 @@ async fn main() -> Result<()> { ) }; - let provider = opentelemetry_sdk::trace::TracerProvider::builder() - .with_batch_exporter( - opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?, - opentelemetry_sdk::runtime::Tokio, - ) + let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() + .with_batch_exporter(opentelemetry_otlp::SpanExporter::builder().with_tonic().build()?) .build(); opentelemetry::global::set_tracer_provider(provider.clone()); diff --git a/src/server/mod.rs b/src/server/mod.rs index d9b31959..d5e6b1e3 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -105,8 +105,8 @@ pub async fn serve( let responder = libmdns::Responder::new(); let _svc = responder.register( - "_machine-api._tcp".to_owned(), - "Machine Api Server".to_owned(), + "_machine-api._tcp", + "Machine Api Server", addr.port(), &["path=/"], ); From 6a89aed27d494e347d5087ba5f238366b65c1862 Mon Sep 17 00:00:00 2001 From: Jordan Noone Date: Tue, 15 Sep 2026 00:16:20 -0700 Subject: [PATCH 3/4] Format updated mDNS calls --- src/bin/machine-api/cmd_serve.rs | 7 +------ src/server/mod.rs | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/src/bin/machine-api/cmd_serve.rs b/src/bin/machine-api/cmd_serve.rs index 228c92ad..3a31e26b 100644 --- a/src/bin/machine-api/cmd_serve.rs +++ b/src/bin/machine-api/cmd_serve.rs @@ -157,12 +157,7 @@ pub async fn main(_cli: &Cli, cfg: &Config, bind: &str) -> Result<()> { tokio::spawn(async move { let bind_addr = bind_addr; let responder = libmdns::Responder::new(); - let _svc = responder.register( - "_machine-api._tcp", - "Machine Api Server", - bind_addr.port(), - &["path=/"], - ); + let _svc = responder.register("_machine-api._tcp", "Machine Api Server", bind_addr.port(), &["path=/"]); tracing::info!( bind_addr = bind_addr.to_string(), diff --git a/src/server/mod.rs b/src/server/mod.rs index d5e6b1e3..f7b3b617 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -104,12 +104,7 @@ pub async fn serve( let addr: SocketAddr = bind.parse()?; let responder = libmdns::Responder::new(); - let _svc = responder.register( - "_machine-api._tcp", - "Machine Api Server", - addr.port(), - &["path=/"], - ); + let _svc = responder.register("_machine-api._tcp", "Machine Api Server", addr.port(), &["path=/"]); // For Cloud run & ctrl+c, shutdown gracefully. // "The main process inside the container will receive SIGTERM, and after a grace period, From 16613b037833bd7d63ddd7df51f759f207018d63 Mon Sep 17 00:00:00 2001 From: Jordan Noone Date: Sun, 20 Sep 2026 13:27:44 -0700 Subject: [PATCH 4/4] Resolve remaining Machine API Clippy errors --- bambulabs/src/client.rs | 2 +- bambulabs/src/message.rs | 2 +- bambulabs/src/templates.rs | 6 +++--- src/bin/machine-api/cmd_serve.rs | 2 +- src/bin/machine-api/main.rs | 2 +- src/server/endpoints.rs | 6 +++--- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bambulabs/src/client.rs b/bambulabs/src/client.rs index e573eeca..90ab6e9c 100644 --- a/bambulabs/src/client.rs +++ b/bambulabs/src/client.rs @@ -138,7 +138,7 @@ impl Client { let response = self.responses.get(&SequenceId::status()); if let Some(response) = response { if let Message::Print(Print::PushStatus(status)) = response.value() { - return Ok(Some(status.clone())); + return Ok(Some(status.as_ref().clone())); } } diff --git a/bambulabs/src/message.rs b/bambulabs/src/message.rs index d10d47ec..3c31cd0c 100644 --- a/bambulabs/src/message.rs +++ b/bambulabs/src/message.rs @@ -206,7 +206,7 @@ pub enum Print { /// Calibration. Calibration(Calibration), /// The status of the print. - PushStatus(PushStatus), + PushStatus(Box), /// The gcode line. GcodeLine(GcodeLine), /// A gcode file. diff --git a/bambulabs/src/templates.rs b/bambulabs/src/templates.rs index 335f6920..8a39ee90 100644 --- a/bambulabs/src/templates.rs +++ b/bambulabs/src/templates.rs @@ -20,11 +20,11 @@ pub enum Template { /// The template for the machine settings. Machine(Box), /// The template for a machine model. - MachineModel(MachineModel), + MachineModel(Box), /// The template for the filament settings. - Filament(Filament), + Filament(Box), /// The template for the process settings. - Process(Process), + Process(Box), } impl Template { diff --git a/src/bin/machine-api/cmd_serve.rs b/src/bin/machine-api/cmd_serve.rs index 3a31e26b..a82832e3 100644 --- a/src/bin/machine-api/cmd_serve.rs +++ b/src/bin/machine-api/cmd_serve.rs @@ -85,7 +85,7 @@ where * I have no idea what the real fix is, but this ain't it. This * just stops graphs from lying when the box goes offline. */ - for (_, gauge) in sensors.iter_mut() { + for gauge in sensors.values_mut() { gauge.set(0.0); } diff --git a/src/bin/machine-api/main.rs b/src/bin/machine-api/main.rs index d4621891..5a9836ab 100644 --- a/src/bin/machine-api/main.rs +++ b/src/bin/machine-api/main.rs @@ -166,7 +166,7 @@ async fn main() -> Result<()> { let cfg: Config = toml::from_str( &std::fs::read_to_string(&cli.config) - .map_err(|_| anyhow::anyhow!("Config file not found at {}", &cli.config))?, + .map_err(|_| anyhow::anyhow!("Config file not found at {}", cli.config))?, )?; match cli.command { diff --git a/src/server/endpoints.rs b/src/server/endpoints.rs index 59d1dece..e3e5cdaf 100644 --- a/src/server/endpoints.rs +++ b/src/server/endpoints.rs @@ -56,7 +56,7 @@ pub enum ExtraMachineInfoResponse { #[cfg(debug_assertions)] #[cfg(not(test))] /// The raw status message from the machine. - raw_status: bambulabs::message::PushStatus, + raw_status: Box, }, } @@ -125,7 +125,7 @@ impl MachineInfoResponse { nozzle_diameter: status.nozzle_diameter, #[cfg(debug_assertions)] #[cfg(not(test))] - raw_status: status, + raw_status: Box::new(status), }) } _ => None, @@ -209,7 +209,7 @@ pub async fn get_machine( )), None => Err(HttpError::for_not_found( None, - format!("machine not found by id: {:?}", ¶ms.id), + format!("machine not found by id: {:?}", params.id), )), } }