Documentation
¶
Index ¶
- Variables
- func Go(fn func())
- func GoCtx(ctx context.Context, fn func(context.Context))
- func LoadConfig[T any]() (T, error)
- func RegisterValidator(tag string, fn validator.Func)
- func RegisterValidatorAlias(alias, tags string)
- func SetTyped[T any](c *core.Context, value *T)
- func TryTyped[T any](c *core.Context) (*T, bool)
- func Typed[T any](c *core.Context) *T
- func Validate(v any) error
- func ValidateOrFail(c *core.Context, v any) (core.Response, bool)
- func ValidateVar(v any, tag string) error
- type App
- func (app *App) Boot(ctx context.Context) error
- func (app *App) Channel(path string, contract ChannelContract, handler ChannelHandler)
- func (app *App) DELETE(path string, contractOrHandler any, handlers ...any)
- func (app *App) Environment() Environment
- func (app *App) GET(path string, contractOrHandler any, handlers ...any)
- func (app *App) GenerateOpenAPI(title, version string) OpenAPISpec
- func (app *App) GetContracts() []RouteContract
- func (app *App) Group(prefix string, middlewares ...Middleware) *Group
- func (app *App) HEAD(path string, contractOrHandler any, handlers ...any)
- func (app *App) Health(name string, check func(context.Context) error, opts ...HealthCheckOption)
- func (app *App) Install(plugin Plugin, opts ...PluginInstallOption) *App
- func (app *App) IsDevelopment() bool
- func (app *App) IsProduction() bool
- func (app *App) Listen(addr string, opts ...core.ListenOption) error
- func (a *App) ListenHTTPRedirect(httpAddr, httpsAddr string)
- func (app *App) Logger() Logger
- func (app *App) Metrics() MetricsRegistry
- func (app *App) OPTIONS(path string, contractOrHandler any, handlers ...any)
- func (app *App) OnBoot(hook BootHook)
- func (app *App) OnMigrate(callback func(MigrateEvent))
- func (app *App) OnShutdown(hook ShutdownHook)
- func (app *App) PATCH(path string, contractOrHandler any, handlers ...any)
- func (app *App) POST(path string, contractOrHandler any, handlers ...any)
- func (app *App) PUT(path string, contractOrHandler any, handlers ...any)
- func (app *App) RegisterHealthEndpoints()
- func (app *App) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (app *App) ShutdownGracefully(ctx context.Context) error
- func (app *App) StartHealthChecks(ctx context.Context)
- func (app *App) Tracer() Tracer
- type AppError
- type BootHook
- type Channel
- type ChannelContract
- type ChannelHandler
- type ChannelRoute
- type Context
- type Contract
- type CoreContext
- type CoreHandler
- type Counter
- type Environment
- type ErrorPlugin
- type FieldError
- type Gauge
- type Group
- func (g *Group) Any(path string, handler any, handlers ...any)
- func (g *Group) DELETE(path string, handler any, handlers ...any)
- func (g *Group) GET(path string, handler any, handlers ...any)
- func (g *Group) Group(prefix string, middlewares ...Middleware) *Group
- func (g *Group) HEAD(path string, handler any, handlers ...any)
- func (g *Group) OPTIONS(path string, handler any, handlers ...any)
- func (g *Group) PATCH(path string, handler any, handlers ...any)
- func (g *Group) POST(path string, handler any, handlers ...any)
- func (g *Group) PUT(path string, handler any, handlers ...any)
- func (g *Group) Use(middlewares ...Middleware)
- type Handler
- type HealthCheck
- type HealthCheckOption
- type HealthResponse
- type HealthResult
- type HealthStatus
- type Histogram
- type LogFormat
- type LogOption
- type Logger
- type MetricsOption
- type MetricsRegistry
- type Middleware
- type MigrateEvent
- type OpenAPIInfo
- type OpenAPISpec
- type Option
- func IgnoreEnv() Option
- func MaxBodySize(size int64) Option
- func ReadTimeout(timeout time.Duration) Option
- func ShutdownTimeout(timeout time.Duration) Option
- func TrustedProxies(proxies ...string) Option
- func WithDevTLS(hosts ...string) Option
- func WithEnvironment(env Environment) Option
- func WithHTTP2() Option
- func WithHTTP3() Option
- func WithMetrics(opts ...MetricsOption) Option
- func WithStructuredLogs(opts ...LogOption) Option
- func WithTLS(certFile, keyFile string) Option
- func WithTracing(serviceName string, opts ...TracingOption) Option
- func WriteTimeout(timeout time.Duration) Option
- type Plugin
- type PluginInstallOption
- type RequestPlugin
- type Response
- type RouteContract
- type RouteInfo
- type RoutePlugin
- type Router
- type SchemaRef
- type ShutdownHook
- type Span
- type Tracer
- type TracingOption
- type Translations
Constants ¶
This section is empty.
Variables ¶
var ( // 4xx Client Errors ErrBadRequest = E(400, "BAD_REQUEST", "The request could not be understood") ErrForbidden = E(403, "FORBIDDEN", "You don't have permission to access this resource") ErrNotFound = E(404, "NOT_FOUND", "The requested resource was not found") ErrMethodNotAllowed = E(405, "METHOD_NOT_ALLOWED", "The HTTP method is not allowed for this resource") ErrConflict = E(409, "CONFLICT", "The request conflicts with the current state") ErrGone = E(410, "GONE", "The resource is no longer available") ErrPayloadTooLarge = E(413, "PAYLOAD_TOO_LARGE", "The request payload is too large") ErrUnsupportedMedia = E(415, "UNSUPPORTED_MEDIA_TYPE", "The media type is not supported") ErrUnprocessableEntity = E(422, "UNPROCESSABLE_ENTITY", "The request was well-formed but contains semantic errors") ErrTooManyRequests = E(429, "TOO_MANY_REQUESTS", "Too many requests, please slow down") // 5xx Server Errors ErrInternal = E(500, "INTERNAL_ERROR", "An internal server error occurred") ErrNotImplemented = E(501, "NOT_IMPLEMENTED", "This feature is not implemented") ErrBadGateway = E(502, "BAD_GATEWAY", "Invalid response from upstream server") ErrGatewayTimeout = E(504, "GATEWAY_TIMEOUT", "Upstream server timed out") // Validation Error (special case with field details) ErrValidation = E(422, "VALIDATION_ERROR", "Request validation failed") )
Functions ¶
func Go ¶
func Go(fn func())
Go runs fn in a new goroutine with panic recovery. A panic in fn is caught, logged as an error with a stack trace, and the server continues operating normally.
Always prefer gx.Go over bare `go func()` in handlers. Never store *gx.Context or *core.Context in the goroutine — extract needed values before launching.
id := c.Param("id")
gx.Go(func() {
sendEmail(id)
})
func GoCtx ¶
GoCtx runs fn in a new goroutine with context propagation and panic recovery. Use this when the goroutine needs to respect request cancellation.
ctx := c.GoContext()
gx.GoCtx(ctx, func(ctx context.Context) {
doAsyncWork(ctx)
})
func LoadConfig ¶
LoadConfig loads application configuration from environment variables using struct field tags:
`env:"VAR_NAME"` — variable name to read
`default:"value"` — fallback when env var is absent
`required:"true"` — returns an error if env var is absent
type AppConfig struct { DatabaseURL string `env:"DATABASE_URL" required:"true"` RedisURL string `env:"REDIS_URL" default:"redis://localhost:6379"` Port int `env:"PORT" default:"8080"` }
cfg, err := gx.LoadConfig[AppConfig]()
func RegisterValidator ¶
RegisterValidator registers a custom validation rule, available globally. Must be called before the first use of Validate/ValidateOrFail.
gx.RegisterValidator("slug", func(fl validator.FieldLevel) bool {
return slugRegex.MatchString(fl.Field().String())
})
func RegisterValidatorAlias ¶
func RegisterValidatorAlias(alias, tags string)
RegisterValidatorAlias registers a mapping from a custom tag to an existing combination of tags.
gx.RegisterValidatorAlias("password", "required,min=8,max=72")
func SetTyped ¶
SetTyped stores a value in the context using its type name as the key This is the counterpart to Typed/TryTyped - middleware and validators use this
func TryTyped ¶
TryTyped retrieves a value from the context store and casts it to type T Returns (value, true) if found and castable, (nil, false) otherwise Use this when the value might not be present (e.g., optional middleware data)
func Typed ¶
Typed retrieves a value from the context store and casts it to type T Panics if the value doesn't exist or cannot be cast to T This is intended for use in handlers where the Contract has validated the presence
func Validate ¶
Validate validates a struct against its `validate` tags. Returns nil if valid, or a ValidationError with field-level details.
if err := gx.Validate(req); err != nil {
return c.Fail(gx.ErrValidation).With("fields", err)
}
func ValidateOrFail ¶
ValidateOrFail validates v and returns (response, false) with a 422 error body if validation fails. Returns (nil, true) if valid.
if res, ok := gx.ValidateOrFail(c, &req); !ok {
return res
}
func ValidateVar ¶
ValidateVar validates a single value against a tag string.
if err := gx.ValidateVar(email, "required,email"); err != nil {
return c.Fail(ErrInvalidEmail)
}
Types ¶
type App ¶
App is the GX application instance that extends core.App
func (*App) Channel ¶
func (app *App) Channel(path string, contract ChannelContract, handler ChannelHandler)
Channel registers a bidirectional channel endpoint The actual transport (WebSocket or QUIC) is chosen based on the client's protocol
func (*App) Environment ¶
func (app *App) Environment() Environment
Environment returns the current application environment
func (*App) GenerateOpenAPI ¶
func (app *App) GenerateOpenAPI(title, version string) OpenAPISpec
GenerateOpenAPI creates an OpenAPI specification Full implementation will be added with the OpenAPI plugin
func (*App) GetContracts ¶
func (app *App) GetContracts() []RouteContract
GetContracts returns all registered contracts
func (*App) Group ¶
func (app *App) Group(prefix string, middlewares ...Middleware) *Group
Group creates a new GX route group.
func (*App) Install ¶
func (app *App) Install(plugin Plugin, opts ...PluginInstallOption) *App
Install adds a plugin to the application with optional install options.
app.Install(auth.New()) app.Install(recovery.New(), gx.PluginPriority(1000)) // execute first
func (*App) IsDevelopment ¶
IsDevelopment returns true if the app is in development mode
func (*App) IsProduction ¶
IsProduction returns true if the app is in production mode
func (*App) Listen ¶
func (app *App) Listen(addr string, opts ...core.ListenOption) error
Listen starts the server and ensures plugin middlewares are registered before serving requests. This overrides core.App.Listen() to guarantee that RequestPlugin middlewares are set up.
func (*App) ListenHTTPRedirect ¶
ListenHTTPRedirect starts a dedicated HTTP server on httpAddr that permanently redirects all requests to the corresponding HTTPS URL on httpsAddr. It runs in a background goroutine and returns immediately.
app.ListenHTTPRedirect(":80", ":443")
func (*App) Metrics ¶
func (app *App) Metrics() MetricsRegistry
Metrics returns the app's metrics registry
func (*App) OnMigrate ¶
func (app *App) OnMigrate(callback func(MigrateEvent))
OnMigrate registers a callback for QUIC connection migration events Called when a client changes network (e.g., WiFi → 4G)
func (*App) OnShutdown ¶
func (app *App) OnShutdown(hook ShutdownHook)
OnShutdown registers a hook to be called during application shutdown
func (*App) RegisterHealthEndpoints ¶
func (app *App) RegisterHealthEndpoints()
RegisterHealthEndpoints adds health check endpoints to the app
func (*App) ServeHTTP ¶
func (app *App) ServeHTTP(w http.ResponseWriter, r *http.Request)
ServeHTTP implements http.Handler, ensuring plugin middlewares are registered in priority order before the first request is processed.
func (*App) ShutdownGracefully ¶
ShutdownGracefully executes all shutdown hooks in reverse order
func (*App) StartHealthChecks ¶
StartHealthChecks begins periodic health check execution
type AppError ¶
type AppError struct {
Status int `json:"status"`
Code string `json:"code"`
Message string `json:"message"`
Details map[string]any `json:"details,omitempty"`
// contains filtered or unexported fields
}
AppError represents a structured application error
func E ¶
func E(status int, code, message string, translations ...Translations) AppError
E creates a new AppError - shorthand constructor. An optional Translations map can be provided as the fourth argument:
var ErrNotFound = gx.E(404, "NOT_FOUND", "Resource not found", gx.Translations{
"fr": "Ressource introuvable",
"es": "Recurso no encontrado",
})
func ValidationError ¶
func ValidationError(fields ...FieldError) AppError
ValidationError creates a validation error with field-level details
func (AppError) MessageFor ¶
MessageFor returns the translated message for lang, falling back to the default English message if no translation is available.
func (AppError) ToResponse ¶
ToResponse converts the error to a core.Response
type Channel ¶
type Channel interface {
// Send serializes and sends a value (JSON by default)
Send(v any) error
// Receive deserializes the next message into v
Receive(v any) error
// SendRaw sends raw bytes
SendRaw(b []byte) error
// ReceiveRaw receives the next raw message
ReceiveRaw() ([]byte, error)
// Done returns a channel that's closed when the client disconnects
Done() <-chan struct{}
// Proto returns the protocol actually used ("websocket" or "quic")
Proto() string
// Close closes the channel
Close() error
}
Channel is the interface for bidirectional real-time communication It abstracts WebSocket (HTTP/1.1, HTTP/2) and QUIC streams (HTTP/3)
func NewNoopChannel ¶
func NewNoopChannel() Channel
NewNoopChannel creates a new no-op channel for testing
type ChannelContract ¶
type ChannelContract struct {
Summary string
Description string
Tags []string
// Message schemas
InputMessage SchemaRef // Messages from client to server
OutputMessage SchemaRef // Messages from server to client
// Possible errors
Errors []AppError
}
ChannelContract describes a channel endpoint's schema
type ChannelHandler ¶
ChannelHandler is a handler function for channel-based endpoints It receives both the request context and the bidirectional channel
type ChannelRoute ¶
type ChannelRoute struct {
Path string
Contract ChannelContract
Handler ChannelHandler
}
ChannelRoute represents a registered channel endpoint
type Context ¶
Context extends core.Context with GX-specific functionality
func (*Context) Log ¶
Log returns a logger correlated with the current request The logger includes trace ID, span ID, request ID, route, and method
func (*Context) SSEChannel ¶
SSEChannel creates a server-to-client channel using Server-Sent Events This is a simpler alternative for use cases that don't need client→server messages
func (*Context) Span ¶
Span returns the current request's span Returns a no-op span if tracing is not enabled
type Contract ¶
type Contract struct {
Summary string
Description string
Tags []string
Deprecated bool
// Input schemas
Params SchemaRef // Path parameters
Query SchemaRef // Query string
Body SchemaRef // Request body
// Output schema
Output SchemaRef
// Possible errors
Errors []AppError
}
Contract describes what an endpoint accepts and returns
type CoreContext ¶
type CoreHandler ¶
type Counter ¶
type Counter interface {
// Inc increments the counter by 1
Inc()
// Add increments the counter by the given value
Add(value float64)
// With returns a counter with the given label values
With(labelValues ...string) Counter
}
Counter is a monotonically increasing metric
type Environment ¶
type Environment string
Environment represents the application environment
const ( Development Environment = "development" Staging Environment = "staging" Production Environment = "production" )
type ErrorPlugin ¶
type ErrorPlugin interface {
Plugin
// OnError is called when an error occurs
// Return nil to let the next error handler process it
// Return a Response to handle the error and stop propagation
OnError(c *Context, err AppError) Response
}
ErrorPlugin is an optional interface for plugins that want to handle errors
type FieldError ¶
type FieldError struct {
Field string `json:"field"`
Rule string `json:"rule"`
Message string `json:"message"`
}
FieldError represents a single field validation error
type Gauge ¶
type Gauge interface {
// Set sets the gauge to the given value
Set(value float64)
// Inc increments the gauge by 1
Inc()
// Dec decrements the gauge by 1
Dec()
// Add adds the given value to the gauge
Add(value float64)
// Sub subtracts the given value from the gauge
Sub(value float64)
// With returns a gauge with the given label values
With(labelValues ...string) Gauge
}
Gauge is a metric that can go up and down
type Group ¶
type Group struct {
// contains filtered or unexported fields
}
Group is the GX route group abstraction. It hides core.Group from application code while delegating to the core router.
func (*Group) Group ¶
func (g *Group) Group(prefix string, middlewares ...Middleware) *Group
Group creates a nested GX group.
func (*Group) Use ¶
func (g *Group) Use(middlewares ...Middleware)
Use adds middleware to the group.
type Handler ¶
Handler is the GX handler signature (uses gx.Context instead of core.Context)
func WithContract ¶
WithContract wraps a GX handler with contract validation middleware.
type HealthCheck ¶
type HealthCheck struct {
// contains filtered or unexported fields
}
HealthCheck represents a health check for a dependency
type HealthCheckOption ¶
type HealthCheckOption func(*HealthCheck)
HealthCheckOption configures a health check
func HealthCritical ¶
func HealthCritical(critical bool) HealthCheckOption
HealthCritical marks the check as critical (default: true) Non-critical checks don't fail the /health/ready endpoint
func HealthInterval ¶
func HealthInterval(interval time.Duration) HealthCheckOption
HealthInterval sets the check interval (default: 30s)
func HealthTimeout ¶
func HealthTimeout(timeout time.Duration) HealthCheckOption
HealthTimeout sets the check timeout (default: 5s)
type HealthResponse ¶
type HealthResponse struct {
Status HealthStatus `json:"status"`
Checks map[string]HealthResult `json:"checks,omitempty"`
}
HealthResponse is the JSON response for health endpoints
type HealthResult ¶
type HealthResult struct {
Status HealthStatus `json:"status"`
LatencyMs int64 `json:"latency_ms,omitempty"`
Error string `json:"error,omitempty"`
LastCheck time.Time `json:"last_check,omitempty"`
}
HealthResult represents the result of a health check
type HealthStatus ¶
type HealthStatus string
HealthStatus represents the health status of a dependency
const ( StatusOK HealthStatus = "ok" StatusDegraded HealthStatus = "degraded" StatusDown HealthStatus = "down" )
type Histogram ¶
type Histogram interface {
// Observe adds a single observation
Observe(value float64)
// With returns a histogram with the given label values
With(labelValues ...string) Histogram
}
Histogram observes values and counts them in buckets
type LogOption ¶
type LogOption func(*logConfig)
func WithLogFormat ¶
WithLogFormat sets the log output format (text or JSON)
type Logger ¶
type Logger interface {
// Info logs an informational message
Info(msg string, args ...any)
// Warn logs a warning message
Warn(msg string, args ...any)
// Error logs an error message
Error(msg string, args ...any)
// Debug logs a debug message
Debug(msg string, args ...any)
// With returns a logger with the given attributes pre-populated
With(args ...any) Logger
}
Logger is a structured logger interface
type MetricsOption ¶
type MetricsOption func(*metricsConfig)
func MetricsBuckets ¶
func MetricsBuckets(buckets []float64) MetricsOption
MetricsBuckets sets custom histogram buckets
func PrometheusExporter ¶
func PrometheusExporter(addr string) MetricsOption
PrometheusExporter sets the Prometheus metrics endpoint address
type MetricsRegistry ¶
type MetricsRegistry interface {
// Counter creates or retrieves a counter
Counter(name, help string, labels ...string) Counter
// Histogram creates or retrieves a histogram
Histogram(name, help string, labels ...string) Histogram
// Gauge creates or retrieves a gauge
Gauge(name, help string, labels ...string) Gauge
}
MetricsRegistry manages all metrics
type Middleware ¶
type Middleware = core.Middleware
func HTTPSRedirect ¶
func HTTPSRedirect() Middleware
HTTPSRedirect returns a middleware that redirects all HTTP requests to HTTPS using 308 Permanent Redirect (preserves HTTP method, unlike 301). It also sets the HSTS header on responses.
type MigrateEvent ¶
MigrateEvent represents a QUIC connection migration event
type OpenAPIInfo ¶
type OpenAPISpec ¶
type OpenAPISpec struct {
OpenAPI string `json:"openapi"`
Info OpenAPIInfo `json:"info"`
Paths map[string]interface{} `json:"paths,omitempty"`
}
OpenAPISpec generates an OpenAPI 3.1 specification from registered contracts This is a placeholder for future implementation
type Option ¶
type Option func(*App)
Option is a functional option for configuring the GX App
func IgnoreEnv ¶
func IgnoreEnv() Option
IgnoreEnv disables reading of GX_* environment variables. When set, only explicit Go options determine the configuration.
func MaxBodySize ¶
MaxBodySize sets the maximum allowed size for request bodies
func ReadTimeout ¶
ReadTimeout sets the maximum duration for reading the entire request
func ShutdownTimeout ¶
ShutdownTimeout sets the maximum duration for graceful shutdown
func TrustedProxies ¶
TrustedProxies sets the list of trusted proxy IP addresses/CIDR ranges
func WithDevTLS ¶
WithDevTLS configures development TLS with self-signed certificate
func WithEnvironment ¶
func WithEnvironment(env Environment) Option
WithEnvironment sets the application environment
func WithHTTP2 ¶
func WithHTTP2() Option
WithHTTP2 enables HTTP/2 support (enabled by default with TLS)
func WithMetrics ¶
func WithMetrics(opts ...MetricsOption) Option
WithMetrics enables Prometheus metrics
func WithStructuredLogs ¶
WithStructuredLogs enables structured logging
func WithTracing ¶
func WithTracing(serviceName string, opts ...TracingOption) Option
WithTracing enables distributed tracing with OpenTelemetry
func WriteTimeout ¶
WriteTimeout sets the maximum duration before timing out writes of the response
type Plugin ¶
type Plugin interface {
// Name returns the unique name of the plugin
Name() string
// OnBoot is called during application boot, before the server starts
OnBoot(app *App) error
// OnShutdown is called during graceful shutdown
OnShutdown(ctx context.Context) error
}
Plugin is the base interface for all GX plugins
type PluginInstallOption ¶
type PluginInstallOption func(*pluginEntry)
PluginInstallOption configures how a plugin is installed.
func PluginPriority ¶
func PluginPriority(n int) PluginInstallOption
PluginPriority sets the execution priority for a plugin. Higher values execute earlier (first in the OnRequest chain). Default priority is 0 (last custom plugin).
Standard framework plugin priorities:
recovery: 1000 requestid: 950 logger: 900 cors: 850 ratelimit: 800 auth: 750 cache: 700 compress: 100
type RequestPlugin ¶
type RequestPlugin interface {
Plugin
// OnRequest is called for each incoming request
// It can act as middleware by calling next and potentially modifying the response
OnRequest(c *Context, next core.Handler) Response
}
RequestPlugin is an optional interface for plugins that need to intercept requests
type RouteContract ¶
RouteContract stores a route with its contract
type RoutePlugin ¶
type RoutePlugin interface {
Plugin
// OnRoute is called once for each route registered during boot
OnRoute(route RouteInfo)
}
RoutePlugin is an optional interface for plugins that need to know about registered routes
type SchemaRef ¶
type SchemaRef struct {
// contains filtered or unexported fields
}
SchemaRef is a reference to a type schema
func Schema ¶
Schema creates a SchemaRef for type T The schema is inferred from the type structure at compile time
func (SchemaRef) BindAndValidate ¶
BindAndValidate binds request data to the schema type and validates it Returns the bound value or an error
type ShutdownHook ¶
ShutdownHook is a function called during application shutdown
type Span ¶
type Span interface {
// SetAttr sets an attribute on the span
SetAttr(key string, value any)
// End completes the span
End()
// Context returns a context.Context with this span
Context() context.Context
}
Span represents a single operation within a trace
type Tracer ¶
type Tracer interface {
// Start begins a new span with the given name
Start(ctx context.Context, name string) Span
// StartWithAttributes begins a new span with initial attributes
StartWithAttributes(ctx context.Context, name string, attrs map[string]any) Span
}
Tracer creates and manages spans
type TracingOption ¶
type TracingOption func(*tracingConfig)
Option types for functional configuration
func OTELExporter ¶
func OTELExporter(endpoint string) TracingOption
OTELExporter configures the OpenTelemetry exporter endpoint
func TracingSampler ¶
func TracingSampler(rate float64) TracingOption
TracingSampler sets the sampling rate (0.0 to 1.0)
type Translations ¶
Translations is a map of language code → translated message. Language codes are normalized lowercase tags like "fr", "es", "de".
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
auth
command
|
|
|
basic
command
|
|
|
cache
command
|
|
|
channel
command
|
|
|
compress
command
|
|
|
cors
command
|
|
|
gx-basic
command
|
|
|
http3
command
|
|
|
http3-pure
command
|
|
|
observability
command
|
|
|
openapi
command
|
|
|
quickstart
command
|
|
|
ratelimit
command
|
|
|
router
command
|
|
|
sse
command
|
|
|
tls
command
|
|
|
Package gxtest provides utilities for testing GX handlers, routers, and apps without starting a real HTTP server.
|
Package gxtest provides utilities for testing GX handlers, routers, and apps without starting a real HTTP server. |
|
plugins
|
|