From d854a4d4e020ef4d91fb067785d44bfb854b8198 Mon Sep 17 00:00:00 2001 From: Ultradesu Date: Tue, 28 Jul 2026 22:45:50 +0100 Subject: [PATCH] Bump furumi 0.2.2 -> 0.2.3 --- src/devices.rs | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/devices.rs b/src/devices.rs index cd72a07..fe86c6f 100644 --- a/src/devices.rs +++ b/src/devices.rs @@ -1249,8 +1249,7 @@ impl DeviceSync { device: &StoredDevice, transport_stats: Arc, ) -> Result<()> { - let ticket: PeerTicket = device.endpoint_ticket.parse()?; - let peer = service.connect(ticket).await?; + let peer = resolve_device_peer(&service, device).await?; let own_ticket = service.ticket().await?.to_string(); let identity = self.ensure_identity()?; let profile = self.own_profile(&own_ticket)?; @@ -2380,7 +2379,7 @@ impl DeviceSync { let own = self.ensure_identity()?.device_id; let conn = lock(&self.conn); let mut stmt = conn.prepare( - "SELECT device_id, endpoint_ticket + "SELECT device_id, endpoint_id, endpoint_ticket FROM sync_devices WHERE trusted_at_ms IS NOT NULL AND revoked_at_ms IS NULL @@ -2390,7 +2389,8 @@ impl DeviceSync { let rows = stmt.query_map([own], |row| { Ok(StoredDevice { device_id: row.get(0)?, - endpoint_ticket: row.get(1)?, + endpoint_id: row.get(1)?, + endpoint_ticket: row.get(2)?, }) })?; Ok(rows.collect::>>()?) @@ -2642,9 +2642,29 @@ impl DeviceSync { #[derive(Debug)] struct StoredDevice { device_id: String, + endpoint_id: String, endpoint_ticket: String, } +async fn resolve_device_peer( + service: &MusicDhtService, + device: &StoredDevice, +) -> Result { + if let Ok(peer) = device.endpoint_id.parse::() + && (service.connected_peers().contains(&peer) + || service + .known_peers() + .iter() + .any(|contact| contact.peer_id == peer)) + { + // The live DHT contact carries a ticket for the current schema. The + // persisted device ticket may predate a schema upgrade. + return Ok(peer); + } + let ticket: PeerTicket = device.endpoint_ticket.parse()?; + service.connect(ticket).await.map_err(Into::into) +} + pub async fn serve_peers( mut acceptor: StreamAcceptor, sync: Arc,