From 2e1f120065266688a9602cb761c5bd1a690a5853 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 13:57:28 +0100 Subject: [PATCH 01/16] fix(netwatch): increase BSD monitor read buffer to 8KiB --- netwatch/src/netmon/bsd.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netwatch/src/netmon/bsd.rs b/netwatch/src/netmon/bsd.rs index 0c6e5aaf..d612e9af 100644 --- a/netwatch/src/netmon/bsd.rs +++ b/netwatch/src/netmon/bsd.rs @@ -40,7 +40,7 @@ impl RouteMonitor { trace!("AF_ROUTE monitor started"); // TODO: cleaner shutdown - let mut buffer = vec![0u8; 2048]; + let mut buffer = vec![0u8; 8192]; loop { match socket.read(&mut buffer).await { Ok(read) => { From 7e110ee8484f324fb110d36e99eb1f2cf89df011 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 13:57:51 +0100 Subject: [PATCH 02/16] fix(netwatch): filter multicast/link-local routes regardless of table --- netwatch/src/netmon/linux.rs | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/netwatch/src/netmon/linux.rs b/netwatch/src/netmon/linux.rs index 026ab879..9b5a18a0 100644 --- a/netwatch/src/netmon/linux.rs +++ b/netwatch/src/netmon/linux.rs @@ -112,24 +112,19 @@ impl RouteMonitor { RouteNetlinkMessage::NewRoute(msg) | RouteNetlinkMessage::DelRoute(msg) => { trace!("ROUTE:: {:?}", msg); - // Ignore the following messages - let table = get_nla!(msg, route::RouteAttribute::Table) - .copied() - .unwrap_or_default(); + // Ignore multicast and link-local route changes if let Some(dst) = get_nla!(msg, route::RouteAttribute::Destination) { match dst { route::RouteAddress::Inet(addr) => { - if (table == 255 || table == 254) - && (addr.is_multicast() - || is_link_local(IpAddr::V4(*addr))) + if addr.is_multicast() + || is_link_local(IpAddr::V4(*addr)) { continue; } } route::RouteAddress::Inet6(addr) => { - if (table == 255 || table == 254) - && (addr.is_multicast() - || is_link_local(IpAddr::V6(*addr))) + if addr.is_multicast() + || is_link_local(IpAddr::V6(*addr)) { continue; } From 44cdaf31722160665f912c8b0e59062d44643346 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 13:58:56 +0100 Subject: [PATCH 03/16] fix(netwatch): grow BSD monitor read buffer on demand --- netwatch/src/interfaces/bsd.rs | 5 ++++- netwatch/src/netmon/bsd.rs | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/netwatch/src/interfaces/bsd.rs b/netwatch/src/interfaces/bsd.rs index bed3cbed..e1e681d5 100644 --- a/netwatch/src/interfaces/bsd.rs +++ b/netwatch/src/interfaces/bsd.rs @@ -916,7 +916,10 @@ fn parse_kernel_inet_addr(af: i32, b: &[u8]) -> Result<(i32, Addr), RouteError> let ip = Ipv4Addr::from(octets); Addr::Inet4 { ip } } else { - // an old fashion, AF_UNSPEC or unknown means AF_INET + // BSD convention: AF_UNSPEC or unknown address family is treated as IPv4 + if af != AF_UNSPEC && af != AF_INET { + tracing::warn!("unexpected address family {af} in routing message, treating as IPv4"); + } let mut octets = [0u8; 4]; if l - 1 < OFF4 { octets[..l - 1].copy_from_slice(&b[1..l]); diff --git a/netwatch/src/netmon/bsd.rs b/netwatch/src/netmon/bsd.rs index d612e9af..52dd0f7a 100644 --- a/netwatch/src/netmon/bsd.rs +++ b/netwatch/src/netmon/bsd.rs @@ -40,10 +40,14 @@ impl RouteMonitor { trace!("AF_ROUTE monitor started"); // TODO: cleaner shutdown - let mut buffer = vec![0u8; 8192]; + let mut buffer = vec![0u8; 2048]; loop { match socket.read(&mut buffer).await { Ok(read) => { + // Grow buffer if the read filled it, up to 64KiB + if read == buffer.len() && buffer.len() < 65536 { + buffer.resize(buffer.len() * 2, 0); + } trace!("AF_ROUTE: read {} bytes", read); match super::super::interfaces::bsd::parse_rib( libc::NET_RT_DUMP, From 800e3c690ee283207eb12c503b27b781033fc698 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:03:07 +0100 Subject: [PATCH 04/16] style: fmt --- netwatch/src/netmon/linux.rs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/netwatch/src/netmon/linux.rs b/netwatch/src/netmon/linux.rs index 9b5a18a0..2411d7a3 100644 --- a/netwatch/src/netmon/linux.rs +++ b/netwatch/src/netmon/linux.rs @@ -116,16 +116,12 @@ impl RouteMonitor { if let Some(dst) = get_nla!(msg, route::RouteAttribute::Destination) { match dst { route::RouteAddress::Inet(addr) => { - if addr.is_multicast() - || is_link_local(IpAddr::V4(*addr)) - { + if addr.is_multicast() || is_link_local(IpAddr::V4(*addr)) { continue; } } route::RouteAddress::Inet6(addr) => { - if addr.is_multicast() - || is_link_local(IpAddr::V6(*addr)) - { + if addr.is_multicast() || is_link_local(IpAddr::V6(*addr)) { continue; } } From 634a16fcbb3f22643a38e73396945def4478f514 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:05:00 +0100 Subject: [PATCH 05/16] fix(netwatch): use try_send in Windows callbacks to avoid blocking thread pool --- netwatch/src/netmon/windows.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netwatch/src/netmon/windows.rs b/netwatch/src/netmon/windows.rs index 87fd575f..665ba6d5 100644 --- a/netwatch/src/netmon/windows.rs +++ b/netwatch/src/netmon/windows.rs @@ -36,14 +36,14 @@ impl RouteMonitor { // 1. Unicast Address Changes let s = sender.clone(); cb_handler.register_unicast_address_change_callback(Box::new(move || { - if let Err(err) = s.blocking_send(NetworkMessage::Change) { + if let Err(err) = s.try_send(NetworkMessage::Change) { warn!("unable to send: unicast change notification: {:?}", err); } }))?; // 2. Route Changes cb_handler.register_route_change_callback(Box::new(move || { - if let Err(err) = sender.blocking_send(NetworkMessage::Change) { + if let Err(err) = sender.try_send(NetworkMessage::Change) { warn!("unable to send: route change notification: {:?}", err); } }))?; From 8f23863c7c6353489aa655b80f8165e0b11918ae Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:05:22 +0100 Subject: [PATCH 06/16] fix(netwatch): warn when navigator.onLine is unavailable in wasm --- netwatch/src/interfaces/wasm_browser.rs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/netwatch/src/interfaces/wasm_browser.rs b/netwatch/src/interfaces/wasm_browser.rs index d949359a..7db072f5 100644 --- a/netwatch/src/interfaces/wasm_browser.rs +++ b/netwatch/src/interfaces/wasm_browser.rs @@ -18,11 +18,15 @@ impl fmt::Display for Interface { impl Interface { async fn new() -> Self { - let is_up = Self::is_up(); + let is_up = match Self::is_up() { + Some(v) => v, + None => { + tracing::warn!("navigator.onLine unavailable, assuming up"); + true + } + }; tracing::debug!(onLine = is_up, "Fetched globalThis.navigator.onLine"); - Self { - is_up: is_up.unwrap_or(true), - } + Self { is_up } } fn is_up() -> Option { From 39e65ec28d76276794281d72199e30c735a72a4d Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:05:48 +0100 Subject: [PATCH 07/16] fix(netwatch): use dyn_into instead of unchecked_into for wasm global --- netwatch/src/netmon/wasm_browser.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/netwatch/src/netmon/wasm_browser.rs b/netwatch/src/netmon/wasm_browser.rs index 51a1187c..f8025dd7 100644 --- a/netwatch/src/netmon/wasm_browser.rs +++ b/netwatch/src/netmon/wasm_browser.rs @@ -47,7 +47,7 @@ fn add_event_listeners(f: &Function) -> Option { offline_listener.set_handle_event(f); // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine#listening_for_changes_in_network_status - let window: EventTarget = js_sys::global().unchecked_into(); + let window: EventTarget = js_sys::global().dyn_into().ok()?; window .add_event_listener_with_event_listener("online", &online_listener) .inspect_err(|err| tracing::debug!(?err, "failed adding event listener")) @@ -73,7 +73,9 @@ struct Listeners { impl Drop for Listeners { fn drop(&mut self) { tracing::trace!("Removing online/offline event listeners"); - let window: EventTarget = js_sys::global().unchecked_into(); + let Ok(window) = js_sys::global().dyn_into::() else { + return; + }; window .remove_event_listener_with_event_listener("online", &self.online_listener) .ok(); From acaeca5c17991c0ea31b7e3faf7759293c3909e0 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:07:58 +0100 Subject: [PATCH 08/16] fix(netwatch): add timeout to netlink default-route query --- netwatch/src/interfaces/linux.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/netwatch/src/interfaces/linux.rs b/netwatch/src/interfaces/linux.rs index e70c22e0..fca58006 100644 --- a/netwatch/src/interfaces/linux.rs +++ b/netwatch/src/interfaces/linux.rs @@ -50,7 +50,18 @@ pub async fn default_route() -> Option { let res = android::default_route().await; #[cfg(not(target_os = "android"))] - let res = sane::default_route().await; + let res = match tokio::time::timeout( + std::time::Duration::from_secs(5), + sane::default_route(), + ) + .await + { + Ok(res) => res, + Err(_) => { + tracing::warn!("netlink default route query timed out"); + return None; + } + }; res.ok().flatten() } From fc58eaed8a63d79774d338efa7c20040e3f9c62d Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:08:32 +0100 Subject: [PATCH 09/16] fix(netwatch): try multiple paths for ip binary on Android --- netwatch/src/interfaces/linux.rs | 36 +++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/netwatch/src/interfaces/linux.rs b/netwatch/src/interfaces/linux.rs index fca58006..80f34100 100644 --- a/netwatch/src/interfaces/linux.rs +++ b/netwatch/src/interfaces/linux.rs @@ -119,16 +119,32 @@ mod android { /// We use this on Android where /proc/net/route can be missing entries or have locked-down /// permissions. See also comments in . pub async fn default_route() -> Result, Error> { - let output = Command::new("/system/bin/ip") - .args(["route", "show", "table", "0"]) - .kill_on_drop(true) - .output() - .await?; - let stdout = std::string::String::from_utf8_lossy(&output.stdout); - let details = parse_android_ip_route(&stdout).map(|iface| DefaultRouteDetails { - interface_name: iface.to_string(), - }); - Ok(details) + const IP_PATHS: &[&str] = &["/system/bin/ip", "/system/xbin/ip", "ip"]; + for path in IP_PATHS { + let output = match Command::new(path) + .args(["route", "show", "table", "0"]) + .kill_on_drop(true) + .output() + .await + { + Ok(output) => output, + Err(err) => { + tracing::debug!(%path, ?err, "ip command not available, trying next"); + continue; + } + }; + let stdout = std::string::String::from_utf8_lossy(&output.stdout); + let details = parse_android_ip_route(&stdout).map(|iface| DefaultRouteDetails { + interface_name: iface.to_string(), + }); + return Ok(details); + } + Err(e!(Error::Io { + source: std::io::Error::new( + std::io::ErrorKind::NotFound, + "ip command not found at any known path" + ) + })) } } From cbe9cc64e1f1b11c8109b67027c0c0a35d087428 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:09:21 +0100 Subject: [PATCH 10/16] fix(netwatch): handle RwLock poisoning gracefully in UDP socket --- netwatch/src/udp.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/netwatch/src/udp.rs b/netwatch/src/udp.rs index 6cfc2780..23b5373e 100644 --- a/netwatch/src/udp.rs +++ b/netwatch/src/udp.rs @@ -80,7 +80,7 @@ impl UdpSocket { /// Rebind the underlying socket. pub fn rebind(&self) -> io::Result<()> { { - let mut guard = self.socket.write().unwrap(); + let mut guard = self.socket.write().unwrap_or_else(|e| e.into_inner()); guard.rebind()?; // Clear errors @@ -172,7 +172,7 @@ impl UdpSocket { /// `addr`. pub fn connect(&self, addr: SocketAddr) -> io::Result<()> { trace!(%addr, "connecting"); - let guard = self.socket.read().unwrap(); + let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); let (socket_tokio, _state) = guard.try_get_connected()?; let sock_ref = socket2::SockRef::from(&socket_tokio); @@ -183,7 +183,7 @@ impl UdpSocket { /// Returns the local address of this socket. pub fn local_addr(&self) -> io::Result { - let guard = self.socket.read().unwrap(); + let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); let (socket, _state) = guard.try_get_connected()?; socket.local_addr() @@ -191,7 +191,7 @@ impl UdpSocket { /// Closes the socket, and waits for the underlying `libc::close` call to be finished. pub async fn close(&self) { - let socket = self.socket.write().unwrap().close(); + let socket = self.socket.write().unwrap_or_else(|e| e.into_inner()).close(); self.wake_all(); if let Some((sock, _)) = socket { let std_sock = sock.into_std(); @@ -209,7 +209,7 @@ impl UdpSocket { /// Check if this socket is closed. pub fn is_closed(&self) -> bool { - self.socket.read().unwrap().is_closed() + self.socket.read().unwrap_or_else(|e| e.into_inner()).is_closed() } /// Handle potential read errors, updating internal state. @@ -455,7 +455,7 @@ impl UdpSocket { /// /// Returns `false` on targets which employ e.g. the `IPV6_DONTFRAG` socket option. pub fn may_fragment(&self) -> bool { - let guard = self.socket.read().unwrap(); + let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); guard.may_fragment() } @@ -465,7 +465,7 @@ impl UdpSocket { /// This is 1 if the platform doesn't support GSO. Subject to change if errors are detected /// while using GSO. pub fn max_gso_segments(&self) -> NonZeroUsize { - let guard = self.socket.read().unwrap(); + let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); guard.max_gso_segments() } @@ -474,7 +474,7 @@ impl UdpSocket { /// /// Returns 1 if the platform doesn't support GRO. pub fn gro_segments(&self) -> NonZeroUsize { - let guard = self.socket.read().unwrap(); + let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); guard.gro_segments() } } @@ -853,7 +853,7 @@ impl SocketState { impl Drop for UdpSocket { fn drop(&mut self) { - if let Some((socket, _)) = self.socket.write().unwrap().close() + if let Some((socket, _)) = self.socket.write().unwrap_or_else(|e| e.into_inner()).close() && let Ok(handle) = tokio::runtime::Handle::try_current() { // No wakeup after dropping write lock here, since we're getting dropped. From a62aa0774d4af320b3dc6717b4f38bd01889940f Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:10:44 +0100 Subject: [PATCH 11/16] fix(netwatch): skip redundant concurrent UDP rebind --- netwatch/src/udp.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/netwatch/src/udp.rs b/netwatch/src/udp.rs index 23b5373e..ff1b33c1 100644 --- a/netwatch/src/udp.rs +++ b/netwatch/src/udp.rs @@ -279,9 +279,23 @@ impl UdpSocket { /// /// Returns an error if the rebind is needed, but failed. fn maybe_rebind(&self) -> io::Result<()> { - if self.is_broken() { - self.rebind()?; + if !self.is_broken() { + return Ok(()); } + + let mut guard = self.socket.write().unwrap_or_else(|e| e.into_inner()); + + // Re-check after acquiring the write lock — another caller may have + // already completed the rebind while we were waiting. + if !self.is_broken() { + return Ok(()); + } + + guard.rebind()?; + self.is_broken + .store(false, std::sync::atomic::Ordering::Release); + drop(guard); + self.wake_all(); Ok(()) } From 339d77c8d70a80b714190a34a6dece03a0998c1a Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Thu, 26 Feb 2026 14:33:39 +0100 Subject: [PATCH 12/16] fixup --- netwatch/src/interfaces/linux.rs | 7 ++----- netwatch/src/udp.rs | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/netwatch/src/interfaces/linux.rs b/netwatch/src/interfaces/linux.rs index 80f34100..27c1ec3d 100644 --- a/netwatch/src/interfaces/linux.rs +++ b/netwatch/src/interfaces/linux.rs @@ -50,11 +50,8 @@ pub async fn default_route() -> Option { let res = android::default_route().await; #[cfg(not(target_os = "android"))] - let res = match tokio::time::timeout( - std::time::Duration::from_secs(5), - sane::default_route(), - ) - .await + let res = match tokio::time::timeout(std::time::Duration::from_secs(5), sane::default_route()) + .await { Ok(res) => res, Err(_) => { diff --git a/netwatch/src/udp.rs b/netwatch/src/udp.rs index ff1b33c1..8de9a774 100644 --- a/netwatch/src/udp.rs +++ b/netwatch/src/udp.rs @@ -191,7 +191,11 @@ impl UdpSocket { /// Closes the socket, and waits for the underlying `libc::close` call to be finished. pub async fn close(&self) { - let socket = self.socket.write().unwrap_or_else(|e| e.into_inner()).close(); + let socket = self + .socket + .write() + .unwrap_or_else(|e| e.into_inner()) + .close(); self.wake_all(); if let Some((sock, _)) = socket { let std_sock = sock.into_std(); @@ -209,7 +213,10 @@ impl UdpSocket { /// Check if this socket is closed. pub fn is_closed(&self) -> bool { - self.socket.read().unwrap_or_else(|e| e.into_inner()).is_closed() + self.socket + .read() + .unwrap_or_else(|e| e.into_inner()) + .is_closed() } /// Handle potential read errors, updating internal state. @@ -867,7 +874,11 @@ impl SocketState { impl Drop for UdpSocket { fn drop(&mut self) { - if let Some((socket, _)) = self.socket.write().unwrap_or_else(|e| e.into_inner()).close() + if let Some((socket, _)) = self + .socket + .write() + .unwrap_or_else(|e| e.into_inner()) + .close() && let Ok(handle) = tokio::runtime::Handle::try_current() { // No wakeup after dropping write lock here, since we're getting dropped. From 0255057eea22fea3694dcddb365592ea411527fa Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Tue, 3 Mar 2026 14:29:31 +0100 Subject: [PATCH 13/16] Revert "fix(netwatch): handle RwLock poisoning gracefully in UDP socket" This reverts commit cbe9cc64e1f1b11c8109b67027c0c0a35d087428. --- netwatch/src/udp.rs | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/netwatch/src/udp.rs b/netwatch/src/udp.rs index 8de9a774..023aa0f3 100644 --- a/netwatch/src/udp.rs +++ b/netwatch/src/udp.rs @@ -80,7 +80,7 @@ impl UdpSocket { /// Rebind the underlying socket. pub fn rebind(&self) -> io::Result<()> { { - let mut guard = self.socket.write().unwrap_or_else(|e| e.into_inner()); + let mut guard = self.socket.write().unwrap(); guard.rebind()?; // Clear errors @@ -172,7 +172,7 @@ impl UdpSocket { /// `addr`. pub fn connect(&self, addr: SocketAddr) -> io::Result<()> { trace!(%addr, "connecting"); - let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); + let guard = self.socket.read().unwrap(); let (socket_tokio, _state) = guard.try_get_connected()?; let sock_ref = socket2::SockRef::from(&socket_tokio); @@ -183,7 +183,7 @@ impl UdpSocket { /// Returns the local address of this socket. pub fn local_addr(&self) -> io::Result { - let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); + let guard = self.socket.read().unwrap(); let (socket, _state) = guard.try_get_connected()?; socket.local_addr() @@ -191,11 +191,7 @@ impl UdpSocket { /// Closes the socket, and waits for the underlying `libc::close` call to be finished. pub async fn close(&self) { - let socket = self - .socket - .write() - .unwrap_or_else(|e| e.into_inner()) - .close(); + let socket = self.socket.write().unwrap().close(); self.wake_all(); if let Some((sock, _)) = socket { let std_sock = sock.into_std(); @@ -213,10 +209,7 @@ impl UdpSocket { /// Check if this socket is closed. pub fn is_closed(&self) -> bool { - self.socket - .read() - .unwrap_or_else(|e| e.into_inner()) - .is_closed() + self.socket.read().unwrap().is_closed() } /// Handle potential read errors, updating internal state. @@ -476,7 +469,7 @@ impl UdpSocket { /// /// Returns `false` on targets which employ e.g. the `IPV6_DONTFRAG` socket option. pub fn may_fragment(&self) -> bool { - let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); + let guard = self.socket.read().unwrap(); guard.may_fragment() } @@ -486,7 +479,7 @@ impl UdpSocket { /// This is 1 if the platform doesn't support GSO. Subject to change if errors are detected /// while using GSO. pub fn max_gso_segments(&self) -> NonZeroUsize { - let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); + let guard = self.socket.read().unwrap(); guard.max_gso_segments() } @@ -495,7 +488,7 @@ impl UdpSocket { /// /// Returns 1 if the platform doesn't support GRO. pub fn gro_segments(&self) -> NonZeroUsize { - let guard = self.socket.read().unwrap_or_else(|e| e.into_inner()); + let guard = self.socket.read().unwrap(); guard.gro_segments() } } @@ -874,11 +867,7 @@ impl SocketState { impl Drop for UdpSocket { fn drop(&mut self) { - if let Some((socket, _)) = self - .socket - .write() - .unwrap_or_else(|e| e.into_inner()) - .close() + if let Some((socket, _)) = self.socket.write().unwrap().close() && let Ok(handle) = tokio::runtime::Handle::try_current() { // No wakeup after dropping write lock here, since we're getting dropped. From 03ceeeb54b8d00723ddbb85a53ffa1197ccd0106 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Tue, 3 Mar 2026 14:29:46 +0100 Subject: [PATCH 14/16] Revert "fix(netwatch): use dyn_into instead of unchecked_into for wasm global" This reverts commit 39e65ec28d76276794281d72199e30c735a72a4d. --- netwatch/src/netmon/wasm_browser.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/netwatch/src/netmon/wasm_browser.rs b/netwatch/src/netmon/wasm_browser.rs index f8025dd7..51a1187c 100644 --- a/netwatch/src/netmon/wasm_browser.rs +++ b/netwatch/src/netmon/wasm_browser.rs @@ -47,7 +47,7 @@ fn add_event_listeners(f: &Function) -> Option { offline_listener.set_handle_event(f); // https://developer.mozilla.org/en-US/docs/Web/API/Navigator/onLine#listening_for_changes_in_network_status - let window: EventTarget = js_sys::global().dyn_into().ok()?; + let window: EventTarget = js_sys::global().unchecked_into(); window .add_event_listener_with_event_listener("online", &online_listener) .inspect_err(|err| tracing::debug!(?err, "failed adding event listener")) @@ -73,9 +73,7 @@ struct Listeners { impl Drop for Listeners { fn drop(&mut self) { tracing::trace!("Removing online/offline event listeners"); - let Ok(window) = js_sys::global().dyn_into::() else { - return; - }; + let window: EventTarget = js_sys::global().unchecked_into(); window .remove_event_listener_with_event_listener("online", &self.online_listener) .ok(); From d98024e034abd4b99e463a7724e7d465fef7bcf9 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Tue, 3 Mar 2026 14:39:00 +0100 Subject: [PATCH 15/16] fixup: drop timeout --- netwatch/src/interfaces/linux.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/netwatch/src/interfaces/linux.rs b/netwatch/src/interfaces/linux.rs index 27c1ec3d..2cf55c75 100644 --- a/netwatch/src/interfaces/linux.rs +++ b/netwatch/src/interfaces/linux.rs @@ -50,15 +50,7 @@ pub async fn default_route() -> Option { let res = android::default_route().await; #[cfg(not(target_os = "android"))] - let res = match tokio::time::timeout(std::time::Duration::from_secs(5), sane::default_route()) - .await - { - Ok(res) => res, - Err(_) => { - tracing::warn!("netlink default route query timed out"); - return None; - } - }; + let res = sane::default_route().await; res.ok().flatten() } From e7d8d86ebb0ccb1ddec4346d2a370e41bddb76a8 Mon Sep 17 00:00:00 2001 From: dignifiedquire Date: Tue, 3 Mar 2026 14:59:34 +0100 Subject: [PATCH 16/16] chore: update lockfile --- Cargo.lock | 242 ++++++++++++++++++++++++++--------------------------- 1 file changed, 120 insertions(+), 122 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f2bf8706..3e578fa9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -28,7 +28,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -72,9 +72,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bitflags" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "block2" @@ -87,9 +87,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.19.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byteorder" @@ -111,9 +111,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.54" +version = "1.2.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6354c81bbfd62d9cfa9cb3c773c2b7b2a3a482d569de977fd0e961f6e7c00583" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" dependencies = [ "find-msvc-tools", "shlex", @@ -133,9 +133,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "num-traits", @@ -185,9 +185,9 @@ checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" [[package]] name = "deranged" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", ] @@ -211,7 +211,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.114", + "syn 2.0.117", "unicode-xid", ] @@ -223,9 +223,9 @@ checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" [[package]] name = "dispatch2" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags", "block2", @@ -241,7 +241,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -291,9 +291,9 @@ checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "find-msvc-tools" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8591b0bcc8a98a64310a2fae1bb3e9b8564dd10e381e6e28010fde8e8e8568db" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "fnv" @@ -312,9 +312,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" dependencies = [ "futures-channel", "futures-core", @@ -327,9 +327,9 @@ dependencies = [ [[package]] name = "futures-buffered" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +checksum = "4421cb78ee172b6b06080093479d3c50f058e7c81b7d577bbb8d118d551d4cd5" dependencies = [ "cordyceps", "diatomic-waker", @@ -340,9 +340,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ "futures-core", "futures-sink", @@ -350,15 +350,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" dependencies = [ "futures-core", "futures-task", @@ -367,9 +367,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" @@ -386,32 +386,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "futures-sink" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] name = "futures-task" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] name = "futures-util" -version = "0.3.31" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ "futures-channel", "futures-core", @@ -421,7 +421,6 @@ dependencies = [ "futures-task", "memchr", "pin-project-lite", - "pin-utils", "slab", ] @@ -569,13 +568,12 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.19" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", "http", "http-body", @@ -747,9 +745,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iroh-metrics" @@ -775,7 +773,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -799,9 +797,9 @@ checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] name = "js-sys" -version = "0.3.89" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4eacb0641a310445a4c513f2a5e23e19952e269c6a38887254d5f837a305506" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -815,9 +813,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.180" +version = "0.2.182" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" [[package]] name = "libm" @@ -876,9 +874,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.6" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] name = "minicov" @@ -919,7 +917,7 @@ checksum = "03755949235714b2b307e5ae89dd8c1c2531fb127d9b8b7b4adf9c876cd3ed18" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -945,9 +943,9 @@ dependencies = [ [[package]] name = "n0-watcher" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba717c22ceec021ace0ff7674bf8fd60c9394605740a8201678fc1cb3a7398f6" +checksum = "38795f7932e6e9d1c6e989270ef5b3ff24ebb910e2c9d4bed2d28d8bae3007dc" dependencies = [ "derive_more", "n0-error", @@ -1151,14 +1149,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "objc2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" dependencies = [ "objc2-encode", ] @@ -1239,29 +1237,29 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -1422,9 +1420,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1433,9 +1431,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rustc_version" @@ -1454,9 +1452,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" -version = "1.0.22" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "same-file" @@ -1518,7 +1516,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1561,9 +1559,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" @@ -1589,7 +1587,7 @@ checksum = "c87e960f4dca2788eeb86bbdde8dd246be8948790b7618d656e68f9b720a86e8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1626,9 +1624,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.114" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -1643,7 +1641,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1669,7 +1667,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1724,9 +1722,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -1740,13 +1738,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1786,9 +1784,9 @@ dependencies = [ [[package]] name = "toml_parser" -version = "1.0.6+spec-1.1.0" +version = "1.0.9+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" dependencies = [ "winnow", ] @@ -1825,7 +1823,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -1875,9 +1873,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "unicode-ident" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" @@ -1952,9 +1950,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d7d0fce354c88b7982aec4400b3e7fcf723c32737cef571bd165f7613557ee" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -1965,9 +1963,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.62" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee85afca410ac4abba5b584b12e77ea225db6ee5471d0aebaae0861166f9378a" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -1979,9 +1977,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55839b71ba921e4f75b674cb16f843f4b1f3b26ddfcb3454de1cf65cc021ec0f" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1989,31 +1987,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf2e969c2d60ff52e7e98b7392ff1588bffdd1ccd4769eba27222fd3d621571" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0861f0dcdf46ea819407495634953cdcc8a8c7215ab799a7a7ce366be71c7b30" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.62" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12430eab93df2be01b6575bf8e05700945dafa62d6fa40faa07b0ea9afd8add1" +checksum = "6311c867385cc7d5602463b31825d454d0837a3aba7cdb5e56d5201792a3f7fe" dependencies = [ "async-trait", "cast", @@ -2033,20 +2031,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.62" +version = "0.3.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce7d6debc1772c3502c727c8c47180c040c8741f7fcf6e731d6ef57818d59ae2" +checksum = "67008cdde4769831958536b0f11b3bdd0380bde882be17fff9c2f34bb4549abd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "wasm-bindgen-test-shared" -version = "0.2.112" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4f79c547a8daa04318dac7646f579a016f819452c34bcb14e8dda0e77a4386c" +checksum = "cfe29135b180b72b04c74aa97b2b4a2ef275161eff9a6c7955ea9eaedc7e1d4e" [[package]] name = "wasm-tracing" @@ -2061,9 +2059,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.89" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10053fbf9a374174094915bbce141e87a6bf32ecd9a002980db4b638405e8962" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -2163,7 +2161,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2174,7 +2172,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2393,9 +2391,9 @@ checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] name = "wmi" -version = "0.18.0" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d1d435f7745ba9ed55c43049d47b5fbd1104449beaa2afbc80a1e10a4a018" +checksum = "003e65f4934cf9449b9ce913ad822cd054a5af669d24f93db101fdb02856bb23" dependencies = [ "chrono", "futures", @@ -2446,28 +2444,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.35" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.35" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] @@ -2487,7 +2485,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", "synstructure", ] @@ -2521,11 +2519,11 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn 2.0.117", ] [[package]] name = "zmij" -version = "1.0.17" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02aae0f83f69aafc94776e879363e9771d7ecbffe2c7fbb6c14c5e00dfe88439" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"