Documentation
¶
Overview ¶
Package stompserver implements the in-process STOMP server used by the Fabric transport.
Index ¶
- Constants
- type ApplicationRequestHandlerFunction
- type AuthInfo
- type ConnEvent
- type Connection
- type FrameHandlerFunc
- type HTTPHandlerRegistrar
- type IPBlockingChecker
- type MiddlewareFunc
- type MiddlewareRegistry
- type RawConnResult
- type RawConnection
- type RawConnectionListener
- func NewTcpConnectionListener(addr string) (RawConnectionListener, error)
- func NewWebSocketConnectionFromExistingHttpServer(httpServer *http.Server, handler HTTPHandlerRegistrar, endpoint string, ...) (RawConnectionListener, error)
- func NewWebSocketConnectionListener(addr string, endpoint string, allowedOrigins []string, logger *slog.Logger, ...) (RawConnectionListener, error)
- type StompConfig
- type StompConn
- type StompServer
- type StompSessionEventType
- type SubscribeHandlerFunction
- type Subscription
- type UnsubscribeHandlerFunction
- type WebSocketStompConnection
- func (c *WebSocketStompConnection) Close() error
- func (c *WebSocketStompConnection) GetRemoteAddr() string
- func (c *WebSocketStompConnection) ReadFrame() (*frame.Frame, error)
- func (c *WebSocketStompConnection) SetReadDeadline(t time.Time)
- func (c *WebSocketStompConnection) WriteFrame(f *frame.Frame) error
Constants ¶
const ( HeaderXSessionID = "X-Session-Id" HeaderConnection = "Connection" HeaderUpgrade = "Upgrade" HeaderUpgradeValue = "websocket" CookieNameSession = "session" )
HTTP Headers
const ( LogBlockedIPAttempted = "[ranch] blocked IP attempted connection: %s (reason: %s)" LogWebSocketConnection = "[ranch] websocket connection from: %s" LogWebSocketClosed = "[ranch] websocket connection from: %s has been closed" LogWebSocketFailed = "[ranch] failed websocket connection from: %s" )
Log Messages
const (
StatusMessageTooManyRequests = "Too many connection attempts. Please try again later."
)
HTTP Status Messages
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ApplicationRequestHandlerFunction ¶
type ApplicationRequestHandlerFunction func(destination string, message []byte, connectionId string)
ApplicationRequestHandlerFunction handles SEND frames targeting application destinations.
type ConnEvent ¶
type ConnEvent struct {
ConnId string
// contains filtered or unexported fields
}
ConnEvent carries STOMP connection event details.
type Connection ¶ added in v0.5.0
type Connection struct {
Source string
}
Connection describes a raw connection lifecycle notification.
type FrameHandlerFunc ¶ added in v0.5.0
FrameHandlerFunc is a function that processes a STOMP frame.
func ChainCommandMiddleware ¶ added in v0.5.0
func ChainCommandMiddleware(reg MiddlewareRegistry, command string, coreHandler FrameHandlerFunc) FrameHandlerFunc
ChainCommandMiddleware returns a FrameHandlerFunc that wraps the provided core handler with both global middleware (key "*") and command-specific middleware.
func ChainMiddleware ¶ added in v0.5.0
func ChainMiddleware(mws []MiddlewareFunc, final FrameHandlerFunc) FrameHandlerFunc
ChainMiddleware applies the list of middleware in order so that the first in the slice is the outermost middleware.
type HTTPHandlerRegistrar ¶ added in v0.9.0
type HTTPHandlerRegistrar interface {
HandleFunc(pattern string, handler func(http.ResponseWriter, *http.Request))
}
HTTPHandlerRegistrar is the subset of HTTP mux APIs needed to register a WebSocket endpoint.
type IPBlockingChecker ¶ added in v0.7.0
type IPBlockingChecker interface {
IsIPBlocked(ip string) (bool, string) // returns blocked status and reason
TrackConnection(ip string, sessionID string)
TrackDisconnection(ip string, sessionID string)
ExtractRealIP(remoteAddr string, headers map[string][]string) string
}
IPBlockingChecker is an interface for checking if an IP should be blocked
type MiddlewareFunc ¶ added in v0.5.0
type MiddlewareFunc func(FrameHandlerFunc) FrameHandlerFunc
MiddlewareFunc is a function that wraps a FrameHandlerFunc.
type MiddlewareRegistry ¶ added in v0.5.0
type MiddlewareRegistry map[string][]MiddlewareFunc
MiddlewareRegistry maps STOMP commands or "*" to middleware chains.
type RawConnResult ¶ added in v0.5.0
type RawConnResult struct {
Conn RawConnection
Err error
}
RawConnResult carries an accepted raw connection or the accept error.
type RawConnection ¶
type RawConnection interface {
// ReadFrame Reads a single frame object
ReadFrame() (*frame.Frame, error)
// WriteFrame Sends a single frame object
WriteFrame(frame *frame.Frame) error
// SetReadDeadline Set deadline for reading frames
SetReadDeadline(t time.Time)
// GetRemoteAddr Returns the remote address of the connection
GetRemoteAddr() string
// Close the connection
Close() error
}
RawConnection is the minimal frame-oriented connection needed by the STOMP server.
type RawConnectionListener ¶
type RawConnectionListener interface {
// Accept Blocks until a new RawConnection is established.
Accept() (RawConnection, error)
// Close Stops the connection listener.
Close() error
// GetConnectionOpenChannel will return a channel that emits connection results when clients connect.
GetConnectionOpenChannel() chan *Connection
// GetConnectionCloseChannel will return a channel the emits connection result when clients disconnect.
GetConnectionCloseChannel() chan *Connection
}
RawConnectionListener accepts raw STOMP connections.
func NewTcpConnectionListener ¶
func NewTcpConnectionListener(addr string) (RawConnectionListener, error)
NewTcpConnectionListener creates a TCP listener for raw STOMP connections.
func NewWebSocketConnectionFromExistingHttpServer ¶
func NewWebSocketConnectionFromExistingHttpServer(httpServer *http.Server, handler HTTPHandlerRegistrar, endpoint string, allowedOrigins []string, logger *slog.Logger, debug bool, customSocketFunc http.HandlerFunc) (RawConnectionListener, error)
NewWebSocketConnectionFromExistingHttpServer registers a WebSocket STOMP endpoint on an existing HTTP server.
func NewWebSocketConnectionListener ¶
func NewWebSocketConnectionListener(addr string, endpoint string, allowedOrigins []string, logger *slog.Logger, debug bool) (RawConnectionListener, error)
NewWebSocketConnectionListener creates an HTTP server that accepts WebSocket STOMP connections.
type StompConfig ¶
type StompConfig interface {
HeartBeat() int64
AppDestinationPrefix() []string
IsAppRequestDestination(destination string) bool
Logger() *slog.Logger
SetLogger(logger *slog.Logger)
GetMiddlewareRegistry() MiddlewareRegistry
SetMiddlewareRegistry(registry MiddlewareRegistry)
}
StompConfig exposes STOMP server configuration.
func NewStompConfig ¶
func NewStompConfig(heartBeatMs int64, appDestinationPrefix []string) StompConfig
NewStompConfig creates STOMP server configuration with normalized application prefixes.
type StompConn ¶
type StompConn interface {
// Return unique connection Id string
GetId() string
// Return IP address of the connection
GetIPAddress() string
SendFrameToSubscription(f *frame.Frame, sub *Subscription)
Close()
GetSubscriptions() map[string]*Subscription
AddSubscription(id string, destination string) (*Subscription, bool)
RemoveSubscription(id string) (*Subscription, bool)
GetEventsChannel() chan *ConnEvent
SendError(err error)
SendMessage(msg string)
}
StompConn is a server-side STOMP client connection.
func NewStompConn ¶
func NewStompConn(rawConnection RawConnection, config StompConfig, events chan *ConnEvent) StompConn
NewStompConn creates and starts a server-side STOMP connection.
type StompServer ¶
type StompServer interface {
// starts the server
Start()
// stops the server
Stop()
// Ready is closed when the server is about to consume accepted connections.
Ready() <-chan struct{}
// sends a message to a given stomp topic destination
SendMessage(destination string, messageBody []byte)
// sends a message to a single connection client
SendMessageToClient(connectionId string, destination string, messageBody []byte)
// closes all connections from a specific IP address with a custom error message
CloseConnectionsByIP(ip string, errorMessage string)
// sets the IP blocking checker that gets called before allowing connections
SetIPBlockingChecker(checker IPBlockingChecker)
// registers a callback for stomp subscribe events
OnSubscribeEvent(callback SubscribeHandlerFunction)
// registers a callback for stomp unsubscribe events
OnUnsubscribeEvent(callback UnsubscribeHandlerFunction)
// registers a callback for application requests
OnApplicationRequest(callback ApplicationRequestHandlerFunction)
// SetConnectionEventCallback is used to set up a callback when certain STOMP session events happen
// such as ConnectionStarting, ConnectionClosed, SubscribeToTopic, UnsubscribeFromTopic and IncomingMessage.
SetConnectionEventCallback(connEventType StompSessionEventType, cb func(connEvent *ConnEvent))
}
StompServer accepts STOMP clients and routes frames to registered callbacks.
func NewStompServer ¶
func NewStompServer(listener RawConnectionListener, config StompConfig) StompServer
NewStompServer creates a STOMP server around a raw connection listener.
type StompSessionEventType ¶
type StompSessionEventType int
StompSessionEventType identifies a STOMP connection or subscription event.
const ( // ConnectionStarting is emitted before a new connection starts processing. ConnectionStarting StompSessionEventType = iota // ConnectionEstablished is emitted after a connection is established. ConnectionEstablished // ConnectionClosed is emitted after a connection closes. ConnectionClosed // SubscribeToTopic is emitted after a client subscribes to a destination. SubscribeToTopic // UnsubscribeFromTopic is emitted after a client unsubscribes from a destination. UnsubscribeFromTopic // IncomingMessage is emitted when a client sends an application message. IncomingMessage )
type SubscribeHandlerFunction ¶
type SubscribeHandlerFunction func(conId string, subId string, destination string, frame *frame.Frame)
SubscribeHandlerFunction handles STOMP SUBSCRIBE frames.
type Subscription ¶ added in v0.5.0
type Subscription struct {
// contains filtered or unexported fields
}
Subscription represents a STOMP subscription owned by a connection.
type UnsubscribeHandlerFunction ¶
UnsubscribeHandlerFunction handles STOMP UNSUBSCRIBE frames.
type WebSocketStompConnection ¶ added in v0.5.0
type WebSocketStompConnection struct {
WSCon *websocket.Conn
// contains filtered or unexported fields
}
WebSocketStompConnection adapts a WebSocket to the RawConnection interface.
func (*WebSocketStompConnection) Close ¶ added in v0.5.0
func (c *WebSocketStompConnection) Close() error
Close closes the underlying WebSocket.
func (*WebSocketStompConnection) GetRemoteAddr ¶ added in v0.6.0
func (c *WebSocketStompConnection) GetRemoteAddr() string
GetRemoteAddr returns the remote network address.
func (*WebSocketStompConnection) ReadFrame ¶ added in v0.5.0
func (c *WebSocketStompConnection) ReadFrame() (*frame.Frame, error)
ReadFrame reads a single STOMP frame from the WebSocket.
func (*WebSocketStompConnection) SetReadDeadline ¶ added in v0.5.0
func (c *WebSocketStompConnection) SetReadDeadline(t time.Time)
SetReadDeadline sets the read deadline on the underlying WebSocket.
func (*WebSocketStompConnection) WriteFrame ¶ added in v0.5.0
func (c *WebSocketStompConnection) WriteFrame(f *frame.Frame) error
WriteFrame writes a single STOMP frame to the WebSocket.