mirror of
https://github.com/J3vb/OwnCord.git
synced 2026-09-03 03:50:00 +03:00
Server:
- Split monolithic voice_handlers.go into voice_join/leave/controls/broadcast
- Add metrics endpoint (admin-IP-restricted /api/v1/metrics)
- Add orphaned attachment cleanup in maintenance loop
- Add sentinel errors (db/errors.go, ws/errors.go)
- Add ring buffer for event replay on reconnect
- Add heartbeat monitoring with stale connection sweep
- Improve hub with panic recovery, graceful shutdown, seq tracking
- Typed message structs replace raw map[string]interface{}
Client:
- Decompose MainPage into ChatArea + SidebarArea controllers
- Add disposable.ts lifecycle management pattern
- Add member list right-click context menu (kick/ban/role)
- Tighten CSP (media-src, font-src, object-src, base-uri)
- Improve store with shallowEqual, 500-msg cap, batch updates
- Add search API endpoint wiring
- Fix LiveKit session cleanup and reconnection
Docs:
- Add CODEMAPS for architecture, backend, frontend, data, deps
- Add protocol-schema.json (machine-readable, 36 message types)
- Add platform research report
- Update PROTOCOL.md with seq/replay fields
33 lines
1.2 KiB
Go
33 lines
1.2 KiB
Go
package ws
|
|
|
|
import "log/slog"
|
|
|
|
// handleVoiceLeave processes an explicit voice_leave message or a disconnect.
|
|
// 1. Gets old voiceChID from clearVoiceChID().
|
|
// 2. If was in voice: remove from DB, broadcast voice_leave.
|
|
// 3. Call livekit.RemoveParticipant (ignore errors — participant may already be gone).
|
|
func (h *Hub) handleVoiceLeave(c *Client) {
|
|
oldChID := c.clearVoiceChID()
|
|
if oldChID == 0 {
|
|
slog.Debug("handleVoiceLeave no-op (already cleared)", "user_id", c.userID)
|
|
return
|
|
}
|
|
|
|
slog.Info("voice leave", "user_id", c.userID, "channel_id", oldChID)
|
|
|
|
if leaveErr := h.db.LeaveVoiceChannel(c.userID); leaveErr != nil {
|
|
slog.Error("ws handleVoiceLeave LeaveVoiceChannel — ghost session may remain in DB",
|
|
"err", leaveErr, "user_id", c.userID, "channel_id", oldChID)
|
|
c.sendMsg(buildErrorMsg(ErrCodeInternal, "voice leave partially failed — please rejoin if issues persist"))
|
|
}
|
|
h.BroadcastToAll(buildVoiceLeave(oldChID, c.userID))
|
|
|
|
// Remove from LiveKit (best-effort).
|
|
if h.livekit != nil {
|
|
if err := h.livekit.RemoveParticipant(oldChID, c.userID); err != nil {
|
|
slog.Debug("handleVoiceLeave RemoveParticipant (may already be gone)",
|
|
"err", err, "user_id", c.userID, "channel_id", oldChID)
|
|
}
|
|
}
|
|
}
|