mirror of
https://github.com/bitechdev/ResolveSpec.git
synced 2025-12-31 08:44:25 +00:00
138 lines
4.5 KiB
Go
138 lines
4.5 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Config holds the configuration for a single web server instance.
|
|
type Config struct {
|
|
Name string
|
|
Host string
|
|
Port int
|
|
Description string
|
|
|
|
// Handler is the http.Handler (e.g., a router) to be served.
|
|
Handler http.Handler
|
|
|
|
// GZIP compression support
|
|
GZIP bool
|
|
|
|
// TLS/HTTPS configuration options (mutually exclusive)
|
|
// Option 1: Provide certificate and key files directly
|
|
SSLCert string
|
|
SSLKey string
|
|
|
|
// Option 2: Use self-signed certificate (for development/testing)
|
|
// Generates a self-signed certificate automatically if no SSLCert/SSLKey provided
|
|
SelfSignedSSL bool
|
|
|
|
// Option 3: Use Let's Encrypt / Certbot for automatic TLS
|
|
// AutoTLS enables automatic certificate management via Let's Encrypt
|
|
AutoTLS bool
|
|
// AutoTLSDomains specifies the domains for Let's Encrypt certificates
|
|
AutoTLSDomains []string
|
|
// AutoTLSCacheDir specifies where to cache certificates (default: "./certs-cache")
|
|
AutoTLSCacheDir string
|
|
// AutoTLSEmail is the email for Let's Encrypt registration (optional but recommended)
|
|
AutoTLSEmail string
|
|
|
|
// Graceful shutdown configuration
|
|
// ShutdownTimeout is the maximum time to wait for graceful shutdown
|
|
// Default: 30 seconds
|
|
ShutdownTimeout time.Duration
|
|
|
|
// DrainTimeout is the time to wait for in-flight requests to complete
|
|
// before forcing shutdown. Default: 25 seconds
|
|
DrainTimeout time.Duration
|
|
|
|
// ReadTimeout is the maximum duration for reading the entire request
|
|
// Default: 15 seconds
|
|
ReadTimeout time.Duration
|
|
|
|
// WriteTimeout is the maximum duration before timing out writes of the response
|
|
// Default: 15 seconds
|
|
WriteTimeout time.Duration
|
|
|
|
// IdleTimeout is the maximum amount of time to wait for the next request
|
|
// Default: 60 seconds
|
|
IdleTimeout time.Duration
|
|
}
|
|
|
|
// Instance defines the interface for a single server instance.
|
|
// It abstracts the underlying http.Server, allowing for easier management and testing.
|
|
type Instance interface {
|
|
// Start begins serving requests. This method should be non-blocking and
|
|
// run the server in a separate goroutine.
|
|
Start() error
|
|
|
|
// Stop gracefully shuts down the server without interrupting any active connections.
|
|
// It accepts a context to allow for a timeout.
|
|
Stop(ctx context.Context) error
|
|
|
|
// Addr returns the network address the server is listening on.
|
|
Addr() string
|
|
|
|
// Name returns the server instance name.
|
|
Name() string
|
|
|
|
// HealthCheckHandler returns a handler that responds to health checks.
|
|
// Returns 200 OK when healthy, 503 Service Unavailable when shutting down.
|
|
HealthCheckHandler() http.HandlerFunc
|
|
|
|
// ReadinessHandler returns a handler for readiness checks.
|
|
// Includes in-flight request count.
|
|
ReadinessHandler() http.HandlerFunc
|
|
|
|
// InFlightRequests returns the current number of in-flight requests.
|
|
InFlightRequests() int64
|
|
|
|
// IsShuttingDown returns true if the server is shutting down.
|
|
IsShuttingDown() bool
|
|
|
|
// Wait blocks until shutdown is complete.
|
|
Wait()
|
|
}
|
|
|
|
// Manager defines the interface for a server manager.
|
|
// It is responsible for managing the lifecycle of multiple server instances.
|
|
type Manager interface {
|
|
// Add registers a new server instance based on the provided configuration.
|
|
// The server is not started until StartAll or Start is called on the instance.
|
|
Add(cfg Config) (Instance, error)
|
|
|
|
// Get returns a server instance by its name.
|
|
Get(name string) (Instance, error)
|
|
|
|
// Remove stops and removes a server instance by its name.
|
|
Remove(name string) error
|
|
|
|
// StartAll starts all registered server instances that are not already running.
|
|
StartAll() error
|
|
|
|
// StopAll gracefully shuts down all running server instances.
|
|
// Executes shutdown callbacks and drains in-flight requests.
|
|
StopAll() error
|
|
|
|
// StopAllWithContext gracefully shuts down all running server instances with a context.
|
|
StopAllWithContext(ctx context.Context) error
|
|
|
|
// RestartAll gracefully restarts all running server instances.
|
|
RestartAll() error
|
|
|
|
// List returns all registered server instances.
|
|
List() []Instance
|
|
|
|
// ServeWithGracefulShutdown starts all servers and blocks until a shutdown signal is received.
|
|
// It handles SIGINT and SIGTERM signals and performs graceful shutdown with callbacks.
|
|
ServeWithGracefulShutdown() error
|
|
|
|
// RegisterShutdownCallback registers a callback to be called during shutdown.
|
|
// Useful for cleanup tasks like closing database connections, flushing metrics, etc.
|
|
RegisterShutdownCallback(cb ShutdownCallback)
|
|
}
|
|
|
|
// ShutdownCallback is a function called during graceful shutdown.
|
|
type ShutdownCallback func(context.Context) error
|