websocket

package
v1.0.0-rc1 Latest Latest
Warning

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

Go to latest
Published: Jun 19, 2026 License: MIT Imports: 13 Imported by: 0

Documentation

Index

Constants

View Source
const (
	// ReadBufferSizeFieldName -размер буфера чтения
	ReadBufferSizeFieldName = "server.http.websocket.size.buffer.read"

	//WriteBufferSizeFieldName - размер буфера записи
	WriteBufferSizeFieldName = "server.http.websocket.size.buffer.write"

	// OriginsFieldName - разрешённые origins
	OriginsFieldName = "server.http.websocket.origins"

	// PingTimeoutFieldName - таймаут ping
	PingTimeoutFieldName = "server.http.websocket.timeout.ping"

	// WriteTimeoutFieldName - таймаут записи
	WriteTimeoutFieldName = "server.http.websocket.timeout.write"

	// ClientEventBufferSizeFieldName - размер буфера событий клиента
	ClientEventBufferSizeFieldName = "server.http.websocket.size.buffer.events"

	// AnyOrigin - wildcard для разрешения любого origin
	AnyOrigin = "*"
)

Variables

View Source
var (
	ReadBufferSizeDefault        = int(1024)
	WriteBufferSizeDefault       = int(1024)
	ClientEventBufferSizeDefault = 10
	WriteTimeoutDefault          = 20 * time.Second
	PingTimeoutDefault           = 60 * time.Second
)
View Source
var (
	// MessageChanFullError возникает, когда буфер исходящих сообщений клиента заполнен.
	MessageChanFullError = errors.New("message channel is full")

	// MessageChanClosedError возникает при попытке записи в закрытый канал.
	MessageChanClosedError = errors.New("message channel is closed")
)
View Source
var Component = &compogo.Component{
	Name: "http.server.websocket",
	Init: compogo.StepFunc(func(container compogo.Container) error {
		return container.Provides(NewConfig, NewUpgrader)
	}),
	BindFlags: compogo.BindFlags(func(flagSet flag.FlagSet, container compogo.Container) error {
		return container.Invoke(func(config *Config) {
			flagSet.IntVar(&config.ReadBufferSize, ReadBufferSizeFieldName, ReadBufferSizeDefault, "")
			flagSet.IntVar(&config.WriteBufferSize, WriteBufferSizeFieldName, WriteBufferSizeDefault, "")
			flagSet.IntVar(&config.ClientEventBufferSize, ClientEventBufferSizeFieldName, ClientEventBufferSizeDefault, "")

			flagSet.DurationVar(&config.WriteTimeout, WriteTimeoutFieldName, WriteTimeoutDefault, "")
			flagSet.DurationVar(&config.PingTimeout, PingTimeoutFieldName, PingTimeoutDefault, "")

			flagSet.StringSliceVar(&config.origins, OriginsFieldName, nil, "")
		})
	}),
	Configuration: compogo.StepFunc(func(container compogo.Container) error {
		return container.Invoke(Configuration)
	}),
}

Component — компонент WebSocket для Compogo. Регистрирует конфигурацию и Upgrader в DI-контейнере.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client представляет WebSocket-клиента (одно соединение). Обеспечивает:

  • Двусторонний обмен сообщениями
  • Автоматические ping/pong для поддержания соединения
  • Буферизацию исходящих сообщений
  • Graceful shutdown через контекст

func NewClient

func NewClient(conn *websocket.Conn, config *Config, onMessage emitter.Emitter[*Event], logger compogo.Logger) *Client

NewClient создаёт нового WebSocket-клиента.

func (*Client) Process

func (c *Client) Process(ctx context.Context) error

Process запускает основной цикл обработки клиента. Блокирует выполнение до завершения работы клиента. Обрабатывает входящие и исходящие сообщения, ping/pong.

func (*Client) Send

func (c *Client) Send(event *Event) error

Send отправляет событие клиенту. Если буфер исходящих сообщений заполнен, возвращает MessageChanFullError.

type Config

type Config struct {
	ReadBufferSize        int
	WriteBufferSize       int
	ClientEventBufferSize int

	WriteTimeout time.Duration
	PingTimeout  time.Duration
	PingInterval time.Duration

	Origins set.Set[string]
	// contains filtered or unexported fields
}

Config содержит конфигурацию WebSocket.

func Configuration

func Configuration(config *Config, configurator compogo.Configurator) *Config

Configuration загружает конфигурацию из Configurator. PingInterval вычисляется как 90% от PingTimeout для надёжности.

func NewConfig

func NewConfig() *Config

NewConfig создаёт новую конфигурацию с значениями по умолчанию.

type Event

type Event struct {
	Type      string          `json:"type,omitempty"`
	Payload   json.RawMessage `json:"payload,omitempty"`
	Timestamp *Timestamp      `json:"timestamp,omitempty"`
}

Event представляет событие, передаваемое по WebSocket. Содержит тип, полезную нагрузку (payload) и временную метку.

Пример:

event := &Event{
    Type: "chat_message",
    Payload: json.RawMessage(`{"text":"hello","user":"john"}`),
}

func NewEvent

func NewEvent(Type string, payload json.RawMessage) *Event

NewEvent создаёт новое событие с указанным типом и payload'ом.

type Handler

type Handler struct {
	OnClientConnection    emitter.Emitter[*Client]
	OnClientDisconnection emitter.Emitter[*Client]
	OnMessage             emitter.Emitter[*Event]
	// contains filtered or unexported fields
}

Handler — HTTP-обработчик WebSocket-соединений. Управляет всеми активными клиентами и обеспечивает:

  • Апгрейд HTTP до WebSocket
  • Управление клиентами (добавление/удаление)
  • Рассылку сообщений всем клиентам
  • События подключения/отключения клиентов
  • Эмиттер входящих сообщений

func NewHandler

func NewHandler(
	config *Config,
	upgrader *Upgrader,
	logger compogo.Logger,
	closer compogo.Closer,
) *Handler

NewHandler создаёт новый WebSocket-обработчик.

func (*Handler) Send

func (h *Handler) Send(event *Event) (err error)

Send отправляет событие всем подключённым клиентам. Добавляет временную метку к событию.

func (*Handler) ServeHTTP

func (h *Handler) ServeHTTP(writer http.ResponseWriter, request *http.Request)

ServeHTTP обрабатывает HTTP-запрос и апгрейдит его до WebSocket. Реализует интерфейс http.Handler.

type Timestamp

type Timestamp struct {
	Seconds int64 `json:"seconds,omitempty"`
	Nano    int32 `json:"nano,omitempty"`
}

Timestamp представляет временную метку в формате Unix. Используется для отметки времени создания событий.

func NewTimestamp

func NewTimestamp() *Timestamp

NewTimestamp создаёт временную метку для текущего момента времени (UTC).

type Upgrader

type Upgrader struct {
	*websocket.Upgrader
	// contains filtered or unexported fields
}

Upgrader — обёртка над websocket.Upgrader с поддержкой проверки Origin

func NewUpgrader

func NewUpgrader(config *Config) *Upgrader

NewUpgrader создаёт новый Upgrader с конфигурацией из Config.

func (*Upgrader) CheckOrigin

func (up *Upgrader) CheckOrigin(r *http.Request) bool

CheckOrigin проверяет, разрешён ли Origin запроса. Поддерживает:

  • Wildcard "*" — разрешены все origins
  • Совпадение с хостом запроса (same-origin)
  • Список разрешённых origins из конфигурации

Реализует интерфейс websocket.Upgrader.CheckOrigin.

Jump to

Keyboard shortcuts

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