fix(signal): send PresenceList directly to new client after ack
The broadcast alone wasn't reaching the first client because its recv loop hadn't started yet when the second client registered. Now the relay sends PresenceList directly to the new client (right after RegisterPresenceAck) AND broadcasts to all others. This guarantees every client gets the full user list: - New client: via direct send (queued before recv loop starts) - Existing clients: via broadcast Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1016,10 +1016,16 @@ async fn main() -> anyhow::Result<()> {
|
||||
|
||||
info!(%addr, fingerprint = %client_fp, alias = ?client_alias, "signal client registered");
|
||||
|
||||
// Broadcast updated presence to all signal clients
|
||||
// Send the full presence list directly to the new
|
||||
// client (guaranteed delivery — their recv loop is
|
||||
// about to start). Then broadcast to all OTHER
|
||||
// clients so they learn about the new user.
|
||||
{
|
||||
let hub = signal_hub.lock().await;
|
||||
let presence = hub.presence_list();
|
||||
// Direct send to new client (arrives right after ack)
|
||||
let _ = transport.send_signal(&presence).await;
|
||||
// Broadcast to everyone else
|
||||
hub.broadcast(&presence).await;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user