Use server+client ephemeral joins with longer flush for CONTACT_REQUEST
delivery. Forward DM_CHANNEL_UPSERT to peers on the contacts mesh.
Co-authored-by: Cursor <[email protected]>
Persist and broadcast optional activity on contact mesh presence rows so
friends see Now Playing state P2P alongside custom status.
Co-authored-by: Cursor <[email protected]>
Prevents contacts presence and friend-request gossip from blocking on
protomux fullyOpened() that never resolves on stale connections.
Co-authored-by: Cursor <[email protected]>
Add PRESENCE_UPDATE gossip on pearcord:contacts:{userId} so accepted
friends see online/idle/dnd/offline without joining each other's guilds.
- ingestFriendPresence map with TTL-friendly updates
- broadcastPresence on setPresence and mesh rejoin (_lastSelfPresence)
- getFriendPresenceMap for platform listContacts enrichment
- simulateGossip handles PRESENCE_UPDATE for CI smokes
Co-authored-by: Cursor <[email protected]>
Users can remove blocks locally and notify peers via CONTACT_UNBLOCK.
ingestUnblock clears blocked rows when a remote device unblocks you.
Co-authored-by: Cursor <[email protected]>
blockContact now gossips CONTACT_BLOCK to the peer topic, exposes
listBlocked(), and ingestBlock() for remote block events. Request
ingest still ignores users you have blocked locally.
Co-authored-by: Cursor <[email protected]>