diff --git a/Cargo.lock b/Cargo.lock index 18969e4..ee64341 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1836,7 +1836,7 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "furumusic" -version = "0.9.6" +version = "0.9.7" dependencies = [ "anyhow", "async-stream", diff --git a/src/federation/devices.rs b/src/federation/devices.rs index 941ad7d..44c88e8 100644 --- a/src/federation/devices.rs +++ b/src/federation/devices.rs @@ -84,6 +84,7 @@ struct Identity { #[derive(Debug, Clone)] struct StoredDevice { device_id: String, + endpoint_id: String, endpoint_ticket: String, } @@ -1573,8 +1574,7 @@ async fn sync_device( user_id: i64, device: &StoredDevice, ) -> 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 = ensure_identity(pool, user_id, "").await?; let profile = own_profile(pool, user_id, "", &own_ticket).await?; @@ -4118,7 +4118,7 @@ pub async fn playlist_content_ids_for_removal( async fn active_remote_devices(pool: &sqlx::PgPool, user_id: i64) -> Result> { let identity = ensure_identity(pool, user_id, "").await?; let rows = sqlx::query( - "SELECT device_id, endpoint_ticket + "SELECT device_id, endpoint_id, endpoint_ticket FROM furumusic__fed_device WHERE user_id = $1 AND trusted_at_ms IS NOT NULL @@ -4134,11 +4134,31 @@ async fn active_remote_devices(pool: &sqlx::PgPool, user_id: i64) -> Result Result { + if let Ok(peer) = device.endpoint_id.parse::() + && (service.connected_peers().contains(&peer) + || service + .known_peers() + .iter() + .any(|contact| contact.peer_id == peer)) + { + // Prefer the live/current-schema DHT contact over a persisted ticket + // that may have been issued before a schema upgrade. + return Ok(peer); + } + let ticket: PeerTicket = device.endpoint_ticket.parse()?; + service.connect(ticket).await.map_err(Into::into) +} + async fn active_device_count(pool: &sqlx::PgPool, user_id: i64) -> Result { sqlx::query_scalar( "SELECT COUNT(*) FROM furumusic__fed_device diff --git a/templates/player/shell.html b/templates/player/shell.html index 7660752..5b22b88 100644 --- a/templates/player/shell.html +++ b/templates/player/shell.html @@ -757,8 +757,22 @@