Documentation
¶
Overview ¶
Package wsclient — исходящее WebSocket-соединение с переподключением (план 120A). Чистый транспорт: не знает ни про приёмку, ни про метаданные. Владелец (ui.wsIntakeSupervisor) даёт колбэки: gate (предохранитель сети), onMessage (доставка входящего), logf (журнал).
Обратное давление — синхронной обработкой: следующее сообщение не читается, пока onMessage не вернулся. Очереди в памяти нет намеренно — при медленном обработчике замедляется чтение (TCP-окно давит на сервер), а не растёт память до OOM (план 120, решение 6).
Index ¶
Constants ¶
This section is empty.
Variables ¶
var ErrNotConnected = errors.New("websocket: соединение не установлено")
ErrNotConnected возвращается Send, когда соединение не установлено (обрыв, пауза переподключения или блокировка предохранителем). Гарантий доставки нет по контракту (#738): не отправилось — ошибка сразу, без буфера и повтора.
Functions ¶
This section is empty.
Types ¶
type Client ¶
type Client struct {
// contains filtered or unexported fields
}
Client — одно управляемое соединение. Создаётся New, живёт в Run.
func (*Client) Run ¶
Run держит соединение до отмены ctx: подключение → подписка → цикл чтения → переподключение с экспоненциальной выдержкой и джиттером. Блокирующий.
type Config ¶
type Config struct {
Name string // имя шлюза, для журнала и состояния
URL string // ws:// или wss://
// Header строит заголовки рукопожатия перед каждым подключением: секрет
// разыменовывается на dial, а не на старте — появившаяся env-переменная
// подхватывается очередной попыткой без рестарта. nil — без заголовков.
Header func() (http.Header, error)
Subscribe []byte // сообщение сразу после подключения; nil — не слать
ReconnectInitial time.Duration
ReconnectMax time.Duration
MaxMessageBytes int64 // лимит входящего сообщения
// Gate вызывается перед каждой попыткой подключения и перед обработкой
// каждого сообщения. Непустая строка — причина блокировки (предохранитель
// сети): соединение не поднимается / закрывается. nil — без блокировок.
Gate func() string
// OnMessage обрабатывает входящее синхронно. Ошибка пишется в журнал и
// состояние, но соединение НЕ рвёт: решения о карантине принимает приёмка.
OnMessage func(ctx context.Context, raw []byte) error
// Logf — журнал владельца (формат log.Printf). nil — молча.
Logf func(format string, args ...any)
}
Config — параметры одного соединения.
type Status ¶
type Status struct {
Connected bool
BlockedReason string // непустая — заблокировано предохранителем
ConnectedSince time.Time // нулевое время, если не подключено
LastMessageAt time.Time
LastError string
Reconnects int64 // завершившиеся попытки подключения после первой
Received int64 // принятых сообщений (до обработки)
HandlerErrors int64 // ошибок onMessage (сообщение потеряно для приёмки)
Sent int64
SendErrors int64
}
Status — снимок состояния соединения для админки и DSL (Подключён()).