Skip to main content
Version: 1.8

Middleware

Chain message handlers with custom logic using the middleware pattern. Middleware wraps the message handler to add cross-cutting concerns.

import "github.com/KARTIKrocks/wshub"
  • Composable middleware chain
  • Built-in logging, recovery, and metrics middleware
  • Easy to write custom middleware

Exact signatures live on pkg.go.dev.

Middleware Chain

type Middleware func(HandlerFunc) HandlerFunc
type HandlerFunc func(*Client, *Message) error

// Build a middleware chain
chain := wshub.NewMiddlewareChain(finalHandler).
Use(wshub.RecoveryMiddleware(logger)).
Use(wshub.LoggingMiddleware(logger)).
Use(wshub.MetricsMiddleware(metrics)).
Build()

// Use with the hub
hub := wshub.NewHub(
wshub.WithMessageHandler(chain),
)

Built-in Middleware

MiddlewareDescription
LoggingMiddleware(logger)Log message events
RecoveryMiddleware(logger)Recover from panics in message handlers
MetricsMiddleware(metrics)Record message processing metrics
// Use built-in middleware
chain := wshub.NewMiddlewareChain(handler).
Use(wshub.RecoveryMiddleware(logger)). // catch panics
Use(wshub.LoggingMiddleware(logger)). // log messages
Use(wshub.MetricsMiddleware(metrics)). // record metrics
Build()
tip

When using MetricsMiddleware, pass wshub.WithoutHandlerLatency() to the hub so handler latency is not recorded twice.

Custom Middleware

Write custom middleware by implementing the Middleware signature:

// Custom middleware that filters messages
func ProfanityFilter(next wshub.HandlerFunc) wshub.HandlerFunc {
return func(client *wshub.Client, msg *wshub.Message) error {
if containsProfanity(msg.Text()) {
client.SendText("Message blocked: inappropriate content")
return nil // swallow the message
}
return next(client, msg)
}
}

// Custom middleware that adds timing
func TimingMiddleware(next wshub.HandlerFunc) wshub.HandlerFunc {
return func(client *wshub.Client, msg *wshub.Message) error {
start := time.Now()
err := next(client, msg)
log.Printf("Message processed in %v", time.Since(start))
return err
}
}

// Use in chain
chain := wshub.NewMiddlewareChain(handler).
Use(ProfanityFilter).
Use(TimingMiddleware).
Build()