fix: rearchitect server mute/deafen pipeline to scope restrictions by spaceId
- Replaces global `userId` tracking with `spaceId:userId` composite keys across both backend and frontend, fixing the issue where server-muting a user in one space bled into others. - Modifies client-side `ready` event hydration to merge voice states per-origin instead of completely overwriting the store, preventing federated connections from wiping out home instance mutes. - Excludes server voice restrictions from `zustand/persist` so stale client caches don't override the server's authority on reload. - Fixes React component reactivity by using reactive store selections for `spaceId` instead of imperative `getState()` calls, ensuring UI lockdown indicators accurately reflect the initial websocket handshake.
This commit is contained in:
@@ -279,8 +279,8 @@ export type ServerEvent =
|
||||
| { type: 'join_request_received'; request: JoinRequest }
|
||||
| { type: 'join_request_accepted'; request: JoinRequest; space: SpaceWithChannelsAndMembers }
|
||||
| { type: 'join_request_declined'; request: JoinRequest }
|
||||
| { type: 'voice_server_muted'; userId: string; channelId: string; muted: boolean }
|
||||
| { type: 'voice_server_deafened'; userId: string; channelId: string; deafened: boolean }
|
||||
| { type: 'voice_server_muted'; userId: string; channelId: string; spaceId: string; muted: boolean }
|
||||
| { type: 'voice_server_deafened'; userId: string; channelId: string; spaceId: string; deafened: boolean }
|
||||
| { type: 'voice_moved'; userId: string; oldChannelId: string; newChannelId: string }
|
||||
| { type: 'member_banned'; spaceId: string; reason: string | null }
|
||||
| { type: 'pong' }
|
||||
|
||||
Reference in New Issue
Block a user