wsclient

package
v0.0.0-...-5365fac Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 23, 2026 License: MIT Imports: 10 Imported by: 0

Documentation

Overview

Package wsclient — исходящее WebSocket-соединение с переподключением (план 120A). Чистый транспорт: не знает ни про приёмку, ни про метаданные. Владелец (ui.wsIntakeSupervisor) даёт колбэки: gate (предохранитель сети), onMessage (доставка входящего), logf (журнал).

Обратное давление — синхронной обработкой: следующее сообщение не читается, пока onMessage не вернулся. Очереди в памяти нет намеренно — при медленном обработчике замедляется чтение (TCP-окно давит на сервер), а не растёт память до OOM (план 120, решение 6).

Index

Constants

This section is empty.

Variables

View Source
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 New

func New(cfg Config) *Client

New создаёт клиента. Запуск — отдельно, Run(ctx).

func (*Client) Run

func (c *Client) Run(ctx context.Context)

Run держит соединение до отмены ctx: подключение → подписка → цикл чтения → переподключение с экспоненциальной выдержкой и джиттером. Блокирующий.

func (*Client) Send

func (c *Client) Send(ctx context.Context, data []byte) error

Send отправляет текстовое сообщение в живое соединение. Не подключено — ErrNotConnected немедленно (без буфера — контракт #738). Разрыв, замеченный на отправке, соединение не закрывает: его увидит и обслужит цикл чтения.

func (*Client) Status

func (c *Client) Status() Status

Status возвращает снимок состояния.

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 (Подключён()).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL