fix(realtime): объединение частых синхронизаций и лог неожиданных ошибок
- клиент откладывает перечитывание комнат (окно 250 мс) и не запускает второй запрос, пока идёт первый: серия событий ролей и участников больше не даёт лавину GET members/roles и 429 на лимите API; - неожиданные ошибки API пишутся в лог (и в chi-, и в huma-ветке): под параллельной нагрузкой на стенде видели разовые 500 на GET members/roles, но без текста ошибки разобраться было нельзя.
This commit is contained in:
@@ -149,6 +149,11 @@ func humaError(err error) huma.StatusError {
|
||||
return nil
|
||||
}
|
||||
converted := newAPIError(err)
|
||||
if converted.Status >= http.StatusInternalServerError {
|
||||
// Единственное место, где видно текст неожиданной ошибки: клиенту
|
||||
// уходит «internal error», поэтому пишем причину в лог (AGENT.md 9.4).
|
||||
slog.Error("unexpected API error", slog.String("code", converted.Code), slog.Any("error", err))
|
||||
}
|
||||
return &humaAPIError{status: converted.Status, code: converted.Code, message: converted.Message}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@ package server
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
|
||||
"glchat/internal/auth"
|
||||
@@ -74,6 +75,9 @@ func newAPIError(err error) apiError {
|
||||
func writeAPIError(w http.ResponseWriter, err error) {
|
||||
apiErr := newAPIError(err)
|
||||
if apiErr.Status >= http.StatusInternalServerError {
|
||||
// Неожиданную ошибку пишем в лог: клиент видит «internal error», а
|
||||
// разобраться без текста ошибки невозможно (AGENT.md 9.4).
|
||||
slog.Error("unexpected API error", slog.String("code", apiErr.Code), slog.Any("error", err))
|
||||
apiErr.Message = "internal error"
|
||||
}
|
||||
httpx.WriteJSON(w, apiErr.Status, map[string]any{
|
||||
|
||||
Reference in New Issue
Block a user