Documentation
¶
Overview ¶
Package server provides a net/http-shaped Go server with lifecycle, middleware, typed request binding, WebSocket integration, and optional Model Context Protocol (MCP) endpoints. Routes use http.ServeMux patterns, and handlers remain http.Handler values.
Use net/http directly when routes plus JSON are sufficient. Package server is useful when an application would otherwise assemble the same timeout, recovery, graceful shutdown, readiness, input, and protocol plumbing itself.
Index ¶
- Constants
- Variables
- func Bind(r *http.Request, dst any) error
- func BindForm(r *http.Request, dst any) error
- func BindJSON(r *http.Request, dst any) error
- func BindQuery(r *http.Request, dst any) error
- func JSONEcho[T any]() http.HandlerFunc
- func JSONHandler[In, Out any](fn func(context.Context, In) (Out, error)) http.HandlerFunc
- func MCPDev() mcp.TransportConfig
- func MCPObservability() mcp.TransportConfig
- func RecoveryMiddleware(next http.Handler) http.Handler
- func RequestLoggerMiddleware(next http.Handler) http.Handler
- func SetBuiltinPresetHooks(tools, standardResources, observability, developer func(*Server))
- func Validate(dst any) error
- func VersionInfo() string
- type CORSOptions
- type DataFunc
- type FieldError
- type Middleware
- type MiddlewareStack
- type Option
- func WithAddr(addr string) Option
- func WithCORS(opts *CORSOptions) Option
- func WithCSPWebWorkerSupport() Option
- func WithConfigFile(path string) Option
- func WithDebugMode() Option
- func WithDeferredInit(fn func(context.Context, *Server) error) Option
- func WithDeferredInitStopOnFailure(stop bool) Option
- func WithEnvironment() Option
- func WithFIPSMode() Option
- func WithHealthAddr(addr string) Option
- func WithHealthServer() Option
- func WithLogLevel(level string) Option
- func WithLogger(l *slog.Logger) Option
- func WithMCPBuiltinResources(enabled bool) Option
- func WithMCPBuiltinTools(enabled bool) Option
- func WithMCPDiscoveryFilter(filter func(toolName string, r *http.Request) bool) Option
- func WithMCPDiscoveryPolicy(policy mcp.DiscoveryPolicy) Option
- func WithMCPEndpoint(endpoint string) Option
- func WithMCPFileToolRoot(rootDir string) Option
- func WithMCPLegacyRoutedSSE(enabled bool) Optiondeprecated
- func WithMCPOriginValidator(validator func(*http.Request) bool) Option
- func WithMCPProtocolVersion(version string) Option
- func WithMCPSupport(name, version string, configs ...mcp.TransportConfig) Option
- func WithMCPToolCallTimeout(d time.Duration) Option
- func WithOnReady(hook func(context.Context, *Server) error) Option
- func WithOnShutdown(hook func(context.Context) error) Option
- func WithOptions(options Options) Option
- func WithRateLimit(limit RateLimit, burst int) Option
- func WithServerHeader(value string) Option
- func WithStartupBanner() Option
- func WithStaticDir(dir string) Option
- func WithTLS(certFile, keyFile string) Option
- func WithTemplateDir(dir string) Option
- func WithTimeouts(readTimeout, writeTimeout, idleTimeout time.Duration) Option
- type Options
- type RateLimit
- type SSEMessage
- type Server
- func (srv *Server) AddMetrics(deltaRequests uint64, deltaResponseTime int64)
- func (srv *Server) ClientLimiterCount() int
- func (srv *Server) CompleteDeferredInit(ctx context.Context, err error) error
- func (srv *Server) DELETE(pattern string, handler http.HandlerFunc)
- func (srv *Server) GET(pattern string, handler http.HandlerFunc)
- func (srv *Server) HEAD(pattern string, handler http.HandlerFunc)
- func (srv *Server) Handle(pattern string, handler http.Handler)
- func (srv *Server) HandleFunc(pattern string, handler http.HandlerFunc)
- func (srv *Server) HandleFuncDynamic(pattern, tmplName string, dataFunc DataFunc) error
- func (srv *Server) HandleStatic(pattern string) error
- func (srv *Server) HandleTemplate(pattern, t string, data any) error
- func (srv *Server) Handler() http.Handler
- func (srv *Server) IsReady() bool
- func (srv *Server) IsRunning() bool
- func (srv *Server) MCPEnabled() bool
- func (srv *Server) MCPHandler() *mcp.Handler
- func (srv *Server) MiddlewareRoutes() map[string]MiddlewareStack
- func (srv *Server) OPTIONS(pattern string, handler http.HandlerFunc)
- func (srv *Server) Options() Options
- func (srv *Server) PATCH(pattern string, handler http.HandlerFunc)
- func (srv *Server) POST(pattern string, handler http.HandlerFunc)
- func (srv *Server) PUT(pattern string, handler http.HandlerFunc)
- func (srv *Server) RegisterMCPExtension(ext mcp.Extension) error
- func (srv *Server) RegisterMCPNamespace(name string, configs ...mcp.NamespaceConfig) error
- func (srv *Server) RegisterMCPResource(resource mcp.Resource) error
- func (srv *Server) RegisterMCPResourceTemplate(template mcp.ResourceTemplate) error
- func (srv *Server) RegisterMCPTool(tool mcp.Tool) error
- func (srv *Server) RegisteredRoutes() []string
- func (srv *Server) Run(ctx context.Context) error
- func (srv *Server) RunStdio() error
- func (srv *Server) ServerStart() time.Time
- func (srv *Server) SetMetrics(totalRequests uint64, totalResponseTime int64)
- func (srv *Server) Shutdown(ctx context.Context) error
- func (srv *Server) TotalRequests() uint64
- func (srv *Server) TotalResponseTime() int64
- func (srv *Server) Use(middleware ...Middleware)
- func (srv *Server) UsePrefix(prefix string, middleware ...Middleware)
- func (srv *Server) WebSocketUpgrader() *websocket.Upgrader
- type StatusError
- type ValidationError
Constants ¶
const ( // LevelDebug enables debug-level logging with detailed information LevelDebug = slog.LevelDebug // LevelInfo enables info-level logging for general information LevelInfo = slog.LevelInfo // LevelWarn enables warning-level logging for important but non-critical events LevelWarn = slog.LevelWarn // LevelError enables error-level logging for error conditions only LevelError = slog.LevelError )
Log level constants for server configuration. These wrap slog levels to provide a consistent API while hiding the logging implementation details.
Variables ¶
var ( Version = "dev" // Version from git tags BuildHash = "unknown" // Git commit hash BuildTime = "unknown" // Build timestamp )
Build information set at compile time using -ldflags
Functions ¶
func Bind ¶
Bind picks the decoder based on Content-Type:
- application/json → BindJSON
- application/x-www-form-urlencoded or multipart/form-data → BindForm
- otherwise → BindQuery
func BindForm ¶
BindForm decodes application/x-www-form-urlencoded or multipart/form-data into dst, then runs Validate.
func BindJSON ¶
BindJSON decodes the request body as JSON into dst, then runs Validate. dst must be a non-nil pointer to a struct. Returns ValidationError when rules fail, and the wrapped error otherwise (decode error, etc.).
func BindQuery ¶
BindQuery decodes URL query parameters into dst (string keys → struct fields by json tag or lowercased name). Slices are populated from repeated keys. Then runs Validate.
func JSONEcho ¶
func JSONEcho[T any]() http.HandlerFunc
JSONEcho is the shorthand for the validate-and-pass-through case: bind the body into T, run validation, and echo the validated value back as the 200 response. Useful for webhook acks, dev stubs, and "did this payload validate?" endpoints where the response shape is the same as the input.
srv.POST("/users", server.JSONEcho[CreateUser]())
Reach for JSONHandler[In, Out] when the response is genuinely different from the input — assigning a server-side ID, lowercasing the email, joining a related record. An identity function is the absence of business logic; JSONEcho says so directly.
Errors follow JSONHandler: *ValidationError → per-field 400 envelope, other bind errors → 400 with {"error": err.Error()}.
func JSONHandler ¶
JSONHandler wraps a typed business function as an http.HandlerFunc. It performs bind + validate + invoke + respond in a single step so handlers only contain business logic.
srv.HandleFunc("POST /users", server.JSONHandler(
func(ctx context.Context, in CreateUser) (User, error) {
return createUser(ctx, in)
},
))
func MCPDev ¶
func MCPDev() mcp.TransportConfig
MCPDev configures MCP with developer tools for local development.
SECURITY WARNING: Only use in development environments. Enables tools that can modify server behavior (log level, route introspection).
Tools provided:
- mcp__hyperserve__server_control
- mcp__hyperserve__route_inspector
- mcp__hyperserve__dev_guide
Resources provided:
- logs://server/stream, routes://server/all
func MCPObservability ¶
func MCPObservability() mcp.TransportConfig
MCPObservability configures MCP with observability resources for production use. This preset provides read-only access to system state with no control plane access:
- config://server/current (sanitized server config, no secrets)
- health://server/status (uptime and health metrics)
- logs://server/recent (circular buffer of recent log entries)
func RecoveryMiddleware ¶
RecoveryMiddleware returns a middleware function that recovers from panics in request handlers. Catches panics, logs the error, and returns a 500 Internal Server Error response.
func RequestLoggerMiddleware ¶
RequestLoggerMiddleware returns a middleware function that logs structured request information. It captures and logs:
- Client IP address
- HTTP method and URL path
- Trace ID (if present in X-Trace-ID header)
- Response status code
- Request duration
- Response size in bytes
This middleware is included by default in NewServer(). For high-traffic applications, consider the performance impact of logging.
func SetBuiltinPresetHooks ¶
func SetBuiltinPresetHooks(tools, standardResources, observability, developer func(*Server))
SetBuiltinPresetHooks lets pkg/mcp/builtin (and only it, in practice) wire itself into the auto-registration flow used by NewServer when MCP is enabled. Pass nil for any preset you don't implement.
Types ¶
type CORSOptions ¶
type CORSOptions struct {
AllowedOrigins []string `json:"allowed_origins,omitempty"`
AllowedMethods []string `json:"allowed_methods,omitempty"`
AllowedHeaders []string `json:"allowed_headers,omitempty"`
ExposeHeaders []string `json:"expose_headers,omitempty"`
AllowCredentials bool `json:"allow_credentials,omitempty"`
MaxAgeSeconds int `json:"max_age_seconds,omitempty"`
}
CORSOptions captures configuration for Cross-Origin Resource Sharing handling.
type DataFunc ¶
DataFunc is a function type that generates data for template rendering. It receives the current HTTP request and returns data to be passed to the template.
type FieldError ¶
type FieldError = validate.FieldError
FieldError describes one failed validation rule. Aliased to the internal/validate type so pkg/mcp can produce the same errors when validating typed-tool arguments.
type Middleware ¶
Middleware wraps an HTTP handler. It has the standard net/http middleware shape, so middleware from other packages works without an adapter.
func HeadersMiddleware ¶
func HeadersMiddleware(options Options) Middleware
HeadersMiddleware returns middleware for content-type, framing, referrer, permissions, cross-origin, HSTS, CSP, and configured CORS policy. Automatically handles CORS preflight requests.
func MetricsMiddleware ¶
func MetricsMiddleware(srv *Server) Middleware
MetricsMiddleware returns a middleware function that collects request metrics. It tracks total request count and response times for performance monitoring.
func RateLimitMiddleware ¶
func RateLimitMiddleware(srv *Server) Middleware
RateLimitMiddleware returns a middleware function that enforces rate limiting per client IP address. Uses token bucket algorithm with configurable rate limit and burst capacity. Returns 429 Too Many Requests when rate limit is exceeded. Optimized for Go 1.24's Swiss Tables map implementation.
func SecureWeb ¶
func SecureWeb(options Options) Middleware
SecureWeb is a convenience alias for HeadersMiddleware. Pass the Options snapshot from the Server whose TLS, CSP, CORS, and optional Server header policy should be applied.
type MiddlewareStack ¶
type MiddlewareStack []Middleware
MiddlewareStack is a collection of middleware functions that can be applied to an http.Handler. Middleware in the stack is applied in order, with the first middleware being the outermost.
type Option ¶
Option configures a Server during construction.
func WithAddr ¶
WithAddr sets the address and port for the server to listen on. The address must be in the format "host:port" (e.g., ":8080", "localhost:3000").
func WithCORS ¶
func WithCORS(opts *CORSOptions) Option
WithCORS configures Cross-Origin Resource Sharing options for HTTP handlers.
func WithCSPWebWorkerSupport ¶
func WithCSPWebWorkerSupport() Option
WithCSPWebWorkerSupport enables Content Security Policy support for Web Workers using blob: URLs. This is required for modern web applications that use libraries like Tone.js, PDF.js, or other libraries that create Web Workers with blob: URLs for performance optimization. By default, this is disabled for security reasons and must be explicitly enabled.
func WithConfigFile ¶
WithConfigFile overlays fields present in the JSON file at path. An explicit file is required to exist and contain one valid JSON object.
func WithDebugMode ¶
func WithDebugMode() Option
WithDebugMode enables debug logging and additional debug features. (The previously-exported WithLoglevel had no callers; use WithDebugMode or the HS_LOG_LEVEL env var to change the log level.)
func WithDeferredInit ¶
WithDeferredInit registers a callback that runs after the server listener is active but before the server is marked ready. While the callback is executing, non-health endpoints receive 503.
func WithDeferredInitStopOnFailure ¶
WithDeferredInitStopOnFailure configures whether the server should shut down if the deferred initialization callback returns an error. Defaults to true.
func WithEnvironment ¶
func WithEnvironment() Option
WithEnvironment overlays supported SERVER_ADDR, HEALTH_ADDR, and HS_* variables. It does not consult HS_CONFIG_PATH; use WithConfigFile when the application chooses to read a file.
func WithFIPSMode ¶
func WithFIPSMode() Option
WithFIPSMode restricts the TLS handshake to FIPS-approved cipher suites and elliptic curves.
This is NOT full FIPS 140-3 compliance:
- it does not switch the Go toolchain into FIPS mode (build with GOFIPS140 for that);
- it does not constrain non-TLS crypto (hashes, RNGs, signatures outside TLS);
- it does not invoke a FIPS-validated cryptographic module.
Use this for "TLS handshake uses FIPS-approved primitives." For deployments that require true FIPS 140-3 compliance, combine with a FIPS-validated toolchain build.
func WithHealthAddr ¶
WithHealthAddr sets the address for the separate health server.
func WithHealthServer ¶
func WithHealthServer() Option
WithHealthServer enables the health server on a separate port. The health server provides /healthz/, /readyz/, and /livez/ endpoints for monitoring.
func WithLogLevel ¶
WithLogLevel sets the configured server log level. Accepted values are DEBUG, INFO, WARN, and ERROR.
func WithLogger ¶
WithLogger gives one Server its logger without changing slog's process-wide default. Configure the handler's level in the application when supplying a custom logger.
func WithMCPBuiltinResources ¶
WithMCPBuiltinResources toggles the built-in MCP resources (Config, Metrics, System, ServerLog, ServerHealth). Default off. Same blank-import requirement as WithMCPBuiltinTools.
func WithMCPBuiltinTools ¶
WithMCPBuiltinTools toggles the built-in MCP tools (Calculator plus sandboxed FileRead / ListDirectory when WithMCPFileToolRoot is set). Default off. Requires `_ "github.com/osauer/hyperserve/v2/pkg/mcp/builtin"` to be blank-imported by the consumer; otherwise NewServer logs a warning and registers nothing.
func WithMCPDiscoveryFilter ¶
WithMCPDiscoveryFilter sets a custom filter function for MCP discovery.
The filter function receives the tool name and HTTP request, allowing for context-aware filtering based on auth tokens, IP addresses, etc.
Example - Hide admin tools from external requests:
srv, _ := server.NewServer(
server.WithMCPDiscoveryFilter(func(toolName string, r *http.Request) bool {
if strings.Contains(toolName, "admin") {
return strings.HasPrefix(r.RemoteAddr, "10.") ||
strings.HasPrefix(r.RemoteAddr, "192.168.")
}
return true
}),
)
func WithMCPDiscoveryPolicy ¶
func WithMCPDiscoveryPolicy(policy mcp.DiscoveryPolicy) Option
WithMCPDiscoveryPolicy sets the discovery policy for MCP tools and resources.
Example:
srv, _ := server.NewServer(
server.WithMCPDiscoveryPolicy(mcp.DiscoveryCount),
)
func WithMCPEndpoint ¶
WithMCPEndpoint configures the MCP endpoint path. Default is "/mcp".
func WithMCPFileToolRoot ¶
WithMCPFileToolRoot scopes MCP file tools to rootDir via os.Root, so they cannot read or list paths outside it.
func WithMCPLegacyRoutedSSE
deprecated
WithMCPLegacyRoutedSSE enables HyperServe's proprietary X-SSE-* routed transport. It is disabled by default and should be used only while clients migrate to MCP 2026-07-28 Streamable HTTP subscriptions/listen.
Deprecated: use MCP 2026-07-28 Streamable HTTP.
func WithMCPOriginValidator ¶
WithMCPOriginValidator overrides MCP's default same-origin browser policy. The validator receives every MCP request and should allow requests without Origin when non-browser clients are expected. Use an explicit allowlist and do not trust Origin as authentication. Passing nil restores the default.
func WithMCPProtocolVersion ¶
WithMCPProtocolVersion overrides the MCP protocol version advertised to clients. Empty values reset to mcp.DefaultProtocolVersion.
func WithMCPSupport ¶
func WithMCPSupport(name, version string, configs ...mcp.TransportConfig) Option
WithMCPSupport enables MCP (Model Context Protocol) support on the server. Server name and version identify the server to MCP clients. By default, MCP uses HTTP transport on the "/mcp" endpoint; pass mcp.TransportConfig values to switch to stdio or to install a preset (DeveloperMode, ObservabilityMode).
Example:
server.NewServer(server.WithMCPSupport("MyServer", "1.0.0"))
func WithMCPToolCallTimeout ¶
WithMCPToolCallTimeout sets the per-tool execution budget enforced by the MCP handler. Tools that exceed the timeout return context.DeadlineExceeded to the caller; see the caveat in contextToolWrapper for what happens to the underlying goroutine. Zero or negative values fall back to the package default (30s).
func WithOnReady ¶
WithOnReady registers hooks that run after deferred initialization succeeds but before the server is marked ready. Hooks are executed sequentially in the order they were registered.
func WithOnShutdown ¶
WithOnShutdown registers a function to be called when the server begins shutdown. Multiple hooks can be registered and are executed sequentially in the order they were added. Hooks are called before the HTTP server shutdown begins, allowing applications to cleanly stop their own goroutines and release resources.
Each hook receives a context with a timeout (typically 5 seconds of the total 10-second shutdown budget). Hooks should respect the context deadline and return promptly. Errors from hooks are logged but don't prevent shutdown from proceeding.
Example:
srv, _ := server.NewServer(
server.WithOnShutdown(func(ctx context.Context) error {
log.Println("Stopping background workers...")
return stopWorkers(ctx)
}),
)
func WithOptions ¶
WithOptions replaces the current option snapshot with a defensive copy of options. Options passed later to NewServer override this snapshot.
func WithRateLimit ¶
WithRateLimit configures rate limiting for the server. limit: maximum number of requests per second per client IP burst: maximum number of requests that can be made in a short burst
func WithServerHeader ¶
WithServerHeader opts into a Server response header when HeadersMiddleware is installed. The empty string omits identification. Invalid HTTP control bytes cause NewServer to return an error.
func WithStartupBanner ¶
func WithStartupBanner() Option
WithStartupBanner opts into HyperServe's ASCII startup banner. Library consumers are silent by default apart from configured structured logs.
func WithStaticDir ¶
WithStaticDir sets the directory root used by Server.HandleStatic. The directory is opened and validated when the static route is registered.
func WithTLS ¶
WithTLS enables TLS on the server with the specified certificate and key files. Returns a Option that configures TLS settings and validates file existence.
func WithTemplateDir ¶
WithTemplateDir sets the directory path where HTML templates are located. Templates in this directory can be used with HandleTemplate and HandleFuncDynamic methods. Returns an error if the specified directory does not exist or is not accessible.
func WithTimeouts ¶
WithTimeouts configures the HTTP server timeouts. readTimeout: maximum duration for reading the entire request writeTimeout: maximum duration before timing out writes of the response idleTimeout: maximum time to wait for the next request when keep-alives are enabled
type Options ¶
type Options struct {
Addr string `json:"addr,omitempty"`
EnableTLS bool `json:"tls,omitempty"`
TLSAddr string `json:"tls_addr,omitempty"`
KeyFile string `json:"key_file,omitempty"`
CertFile string `json:"cert_file,omitempty"`
HealthAddr string `json:"health_addr,omitempty"`
RateLimit RateLimit `json:"rate_limit,omitempty"`
Burst int `json:"burst,omitempty"`
ReadTimeout time.Duration `json:"read_timeout,omitempty"`
WriteTimeout time.Duration `json:"write_timeout,omitempty"`
IdleTimeout time.Duration `json:"idle_timeout,omitempty"`
ReadHeaderTimeout time.Duration `json:"read_header_timeout,omitempty"`
StaticDir string `json:"static_dir,omitempty"`
TemplateDir string `json:"template_dir,omitempty"`
RunHealthServer bool `json:"run_health_server,omitempty"`
FIPSMode bool `json:"fips_mode,omitempty"`
// ServerHeader is emitted by HeadersMiddleware when non-empty.
ServerHeader string `json:"server_header,omitempty"`
// MCP (Model Context Protocol) configuration
MCPEnabled bool `json:"mcp_enabled,omitempty"`
MCPEndpoint string `json:"mcp_endpoint,omitempty"`
MCPServerName string `json:"mcp_server_name,omitempty"`
MCPServerVersion string `json:"mcp_server_version,omitempty"`
MCPToolsEnabled bool `json:"mcp_tools_enabled,omitempty"`
MCPResourcesEnabled bool `json:"mcp_resources_enabled,omitempty"`
MCPFileToolRoot string `json:"mcp_file_tool_root,omitempty"`
MCPLogResourceSize int `json:"mcp_log_resource_size,omitempty"`
MCPToolCallTimeout time.Duration `json:"mcp_tool_call_timeout,omitempty"`
MCPTransport mcp.TransportType `json:"mcp_transport,omitempty"`
MCPProtocolVersion string `json:"mcp_protocol_version,omitempty"`
MCPLegacyRoutedSSE bool `json:"mcp_legacy_routed_sse,omitempty"`
MCPDev bool `json:"mcp_dev,omitempty"`
MCPObservability bool `json:"mcp_observability,omitempty"`
MCPDiscoveryPolicy mcp.DiscoveryPolicy `json:"mcp_discovery_policy,omitempty"`
MCPDiscoveryFilter func(toolName string, r *http.Request) bool `json:"-"` // Custom filter function
MCPOriginValidator func(r *http.Request) bool `json:"-"`
// CSP (Content Security Policy) configuration
CSPWebWorkerSupport bool `json:"csp_web_worker_support,omitempty"`
CORS *CORSOptions `json:"cors,omitempty"`
// Logging configuration
LogLevel string `json:"log_level,omitempty"`
DebugMode bool `json:"debug_mode,omitempty"`
// Banner configuration
StartupBanner bool `json:"startup_banner,omitempty"`
BannerColor bool `json:"banner_color,omitempty"`
// OnShutdownHooks are functions called when the server begins shutdown.
// Hooks are executed sequentially in the order they were added, before HTTP server shutdown.
// Each hook receives a context with timeout and should respect the deadline.
// Errors from hooks are logged but don't prevent shutdown.
OnShutdownHooks []func(context.Context) error `json:"-"`
// OnReadyHooks run after deferred initialization succeeds and before the server is marked ready.
OnReadyHooks []func(context.Context, *Server) error `json:"-"`
// StopOnDeferredInitFailure indicates whether the server should shut down if deferred init fails.
StopOnDeferredInitFailure bool `json:"stop_on_deferred_init_failure,omitempty"`
// contains filtered or unexported fields
}
Options contains all configuration settings for the HTTP server. Values can be set via WithXXX functions when creating a new server. Bind a configuration file or environment variables explicitly with WithConfigFile or WithEnvironment.
Use DefaultOptions to obtain HyperServe's defaults before modifying a complete snapshot; a zero Options value is not implicitly filled.
func DefaultOptions ¶
func DefaultOptions() Options
DefaultOptions returns an independent copy of HyperServe's deterministic defaults. Nested slices and CORS configuration are cloned so callers may safely modify the result before passing it to WithOptions.
type RateLimit ¶
RateLimit limits requests per second that can be requested from the httpServer. Requires to add RateLimitMiddleware
type SSEMessage ¶
type SSEMessage struct {
Event string `json:"event"` // Optional: Allows sending multiple event types
Data any `json:"data"` // The actual data payload
}
SSEMessage represents a Server-Sent Events message with an optional event type and data payload. It follows the SSE format with event and data fields that can be sent to clients.
func NewSSEMessage ¶
func NewSSEMessage(data any) *SSEMessage
NewSSEMessage creates a new SSE message with the given data and a default "message" event type. This is a convenience function for creating standard SSE messages.
func (*SSEMessage) String ¶
func (sse *SSEMessage) String() string
String formats the SSE message according to the Server-Sent Events specification. Multi-line data is emitted as one data field per line.
type Server ¶
type Server struct {
// contains filtered or unexported fields
}
Server represents an HTTP server with built-in middleware support, health checks, template rendering, and various configuration options.
The Server manages both the main HTTP server and an optional health check server. It handles graceful shutdown, request metrics, and can be extended with custom middleware.
Example:
srv, _ := server.NewServer(
server.WithAddr(":8080"),
server.WithHealthServer(),
)
srv.HandleFunc("/api/users", handleUsers)
if err := srv.Run(ctx); err != nil {
log.Fatal(err)
}
func NewServer ¶
NewServer creates a new instance of the Server with the given options. By default, the server includes request logging, panic recovery, and metrics collection middleware. The server will listen on ":8080" unless configured otherwise.
Options can be provided to customize the server behavior:
srv, err := server.NewServer(
server.WithAddr(":3000"),
server.WithHealthServer(), // Enable health checks on :8081
server.WithTLS("cert.pem", "key.pem"), // Enable HTTPS
server.WithRateLimit(100, 200), // 100 req/s, burst of 200
)
Returns an error if any of the options fail to apply.
func (*Server) AddMetrics ¶
AddMetrics is a test affordance: it bumps the request count by one and adds to the cumulative response time. See SetMetrics.
func (*Server) ClientLimiterCount ¶
ClientLimiterCount returns the number of active per-client rate limiters.
func (*Server) CompleteDeferredInit ¶
CompleteDeferredInit allows applications to manually finalize deferred initialization after addressing failures. Passing a nil error reruns any pending OnReady hooks and marks the server ready. Passing a non-nil error records the failure and leaves the server in an initializing state.
func (*Server) DELETE ¶
func (srv *Server) DELETE(pattern string, handler http.HandlerFunc)
DELETE registers handler for DELETE requests matching pattern.
func (*Server) GET ¶
func (srv *Server) GET(pattern string, handler http.HandlerFunc)
GET registers handler for GET requests matching pattern.
func (*Server) HEAD ¶
func (srv *Server) HEAD(pattern string, handler http.HandlerFunc)
HEAD registers handler for HEAD requests matching pattern.
func (*Server) Handle ¶
Handle registers an http.Handler for the given pattern. Mirrors http.ServeMux.Handle but also tracks the pattern so prefix middleware can find it. Use this when you have an existing http.Handler (e.g., http.FileServer); use HandleFunc for inline handler functions.
srv.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))))
func (*Server) HandleFunc ¶
func (srv *Server) HandleFunc(pattern string, handler http.HandlerFunc)
func (*Server) HandleFuncDynamic ¶
HandleFuncDynamic registers a handler that renders templates with dynamic data. The dataFunc is called for each request to generate the data passed to the template. Returns an error if template parsing fails.
func (*Server) HandleStatic ¶
HandleStatic registers a handler that serves files only through an os.Root confined to Options.StaticDir. It returns an error without registering the route if the configured root cannot be opened.
func (*Server) HandleTemplate ¶
HandleTemplate registers a handler that renders a specific template with static data. Unlike HandleFuncDynamic, the data is provided once at registration time. Returns an error if template parsing fails.
func (*Server) Handler ¶
Handler returns an ordinary http.Handler. Middleware registration remains open until the handler serves its first request, then its compiled plan and the server's middleware configuration are frozen.
func (*Server) MCPEnabled ¶
MCPEnabled reports whether MCP support has been initialized for this server.
func (*Server) MCPHandler ¶
MCPHandler returns the MCP handler attached to this server, or nil if MCP is not enabled.
func (*Server) MiddlewareRoutes ¶
func (srv *Server) MiddlewareRoutes() map[string]MiddlewareStack
MiddlewareRoutes returns a snapshot of the registered route-to-middleware mapping. The map and its stacks are independent snapshots.
func (*Server) OPTIONS ¶
func (srv *Server) OPTIONS(pattern string, handler http.HandlerFunc)
OPTIONS registers handler for OPTIONS requests matching pattern.
func (*Server) Options ¶
Options returns an independent snapshot of the server configuration. Mutating the returned value does not reconfigure the running server.
func (*Server) PATCH ¶
func (srv *Server) PATCH(pattern string, handler http.HandlerFunc)
PATCH registers handler for PATCH requests matching pattern.
func (*Server) POST ¶
func (srv *Server) POST(pattern string, handler http.HandlerFunc)
POST registers handler for POST requests matching pattern.
func (*Server) PUT ¶
func (srv *Server) PUT(pattern string, handler http.HandlerFunc)
PUT registers handler for PUT requests matching pattern.
func (*Server) RegisterMCPExtension ¶
RegisterMCPExtension registers all tools and resources from an extension.
func (*Server) RegisterMCPNamespace ¶
func (srv *Server) RegisterMCPNamespace(name string, configs ...mcp.NamespaceConfig) error
RegisterMCPNamespace registers an entire MCP namespace with its tools and resources. Per-tool/per-resource namespace registration goes through this path — callers that need a single tool in a namespace pass it inside a NamespaceConfig rather than reaching for two separate helpers.
func (*Server) RegisterMCPResource ¶
RegisterMCPResource registers a custom MCP resource.
func (*Server) RegisterMCPResourceTemplate ¶
func (srv *Server) RegisterMCPResourceTemplate(template mcp.ResourceTemplate) error
RegisterMCPResourceTemplate registers a custom MCP resource template.
func (*Server) RegisterMCPTool ¶
RegisterMCPTool registers a custom MCP tool. Must be called after server creation but before Run().
func (*Server) RegisteredRoutes ¶
RegisteredRoutes returns a sorted snapshot of patterns registered through Handle, HandleFunc, and the method-aware route helpers.
func (*Server) Run ¶
Run starts the HTTP/HTTPS server and blocks until ctx requests a graceful shutdown, the server exits, or deferred initialization fails. It does not subscribe to process signals; the application owns the lifecycle. The context is a shutdown trigger; its values are not installed as HTTP request values. Use middleware for request-scoped data. Cancellation is a normal shutdown trigger and returns nil when shutdown succeeds. Run returns an error for MCP stdio transport because a context cannot portably interrupt its blocking stdin read; use RunStdio instead. A Server must not be run concurrently or reused after Run returns.
func (*Server) RunStdio ¶
RunStdio runs an MCP stdio server until stdin reaches EOF. Stdio is kept separate from Run because an arbitrary io.Reader cannot be interrupted by a context without closing an object the application may own.
func (*Server) ServerStart ¶
ServerStart returns the timestamp when the server began serving.
func (*Server) SetMetrics ¶
SetMetrics is a test affordance: it overrides the request count and cumulative response time. Production code should never call this; metrics are populated by the request-handling middleware.
func (*Server) TotalRequests ¶
TotalRequests returns the total number of requests served so far.
func (*Server) TotalResponseTime ¶
TotalResponseTime returns the cumulative response time in microseconds.
func (*Server) Use ¶
func (srv *Server) Use(middleware ...Middleware)
Use registers middleware for every request. Middleware is applied in the order provided, with the first item outermost. Register middleware before calling Run or serving Handler; registration after serving starts panics.
func (*Server) UsePrefix ¶
func (srv *Server) UsePrefix(prefix string, middleware ...Middleware)
UsePrefix registers middleware for a URL path and its child paths at a slash boundary. For example, "/api" matches "/api/users" but not "/apiv2". Register middleware before calling Run or serving Handler; registration after serving starts panics.
func (*Server) WebSocketUpgrader ¶
WebSocketUpgrader returns a WebSocket upgrader that tracks the upgrade in server telemetry. Use this instead of a standalone Upgrader so WS upgrades land in totalWebSocketUpgrades alongside the totalRequests counter that MetricsMiddleware already maintains for every request.
type StatusError ¶
StatusError carries an HTTP status code so handler errors can opt into a specific 4xx/5xx response without inventing a new error type per call site. Use NewStatusError, or any error that implements `HTTPStatus() int`.
func NewStatusError ¶
func NewStatusError(code int, message string) *StatusError
NewStatusError builds a StatusError. Message is the public string sent in the response body; pass an empty message to fall back to http.StatusText.
func (*StatusError) HTTPStatus ¶
func (e *StatusError) HTTPStatus() int
HTTPStatus is the contract JSONHandler keys off when mapping handler errors to response codes.
func (*StatusError) Unwrap ¶
func (e *StatusError) Unwrap() error
Unwrap exposes the inner cause for errors.Is / errors.As.
type ValidationError ¶
type ValidationError = validate.ValidationError
ValidationError is the aggregate error returned by Validate / Bind* when one or more fields fail their rules. Aliased to internal/validate.