Documentation
¶
Overview ¶
Package zip is Hanzo's canonical Go web framework. Built on Fiber v3 / fasthttp. Sinatra-style API. ZAP-typed handlers. Multi-language extension support via HIP-0105.
ONE framework, ZERO escape hatches. zip IS fast.
app := zip.New(zip.Config{Logger: luxlog.NewLogger("svc")})
app.Use(middleware.Recover(), middleware.RequestID())
app.Get("/health", func(c *zip.Ctx) error {
return c.JSON(200, fiber.Map{"ok": true})
})
app.Listen(":9653", "http://:8080") // ZAP primary + HTTP extra, one verb
Public surface — types/functions exposed at the package root:
type App, Config, Ctx, Handler func New(Config) *App func Get[I, O](app *App, path string, fn func(ctx, *I) (*O, error)) func Post[I, O](app *App, path string, fn func(ctx, *I) (*O, error)) ...
All other behavior lives in subpackages: `middleware`, `runtime`.
Index ¶
- Constants
- func Delete[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
- func Get[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
- func Patch[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
- func Post[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
- func Put[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
- func RegisterTransport(scheme string, tf TransportFunc)
- type App
- func (a *App) All(path string, h Handler) Router
- func (a *App) Delete(path string, h Handler) Router
- func (a *App) Fiber() *fiber.App
- func (a *App) Get(path string, h Handler) Router
- func (a *App) Group(prefix string, handlers ...Handler) Router
- func (a *App) Head(path string, h Handler) Router
- func (a *App) Listen(addrs ...string) error
- func (a *App) Logger() luxlog.Logger
- func (a *App) Module(methodPath, runtimeName, modulePath string) error
- func (a *App) ModuleFn(method, path, fn, runtimeName, modulePath string) error
- func (a *App) Mount(prefix string, h http.Handler)
- func (a *App) Options(path string, h Handler) Router
- func (a *App) Patch(path string, h Handler) Router
- func (a *App) Post(path string, h Handler) Router
- func (a *App) Put(path string, h Handler) Router
- func (a *App) Route(prefix string, fn func(r Router)) Router
- func (a *App) Shutdown() error
- func (a *App) ShutdownWithContext(ctx context.Context) error
- func (a *App) Use(handlers ...Handler) Router
- func (a *App) UseFiber(handlers ...fiber.Handler) Router
- type Config
- type Ctx
- func (c *Ctx) App() *App
- func (c *Ctx) Bind(v any) error
- func (c *Ctx) BindQuery(v any) error
- func (c *Ctx) BindURI(v any) error
- func (c *Ctx) Body() []byte
- func (c *Ctx) Bytes(code int, b []byte) error
- func (c *Ctx) Context() context.Context
- func (c *Ctx) Continue() error
- func (c *Ctx) Fiber() fiber.Ctx
- func (c *Ctx) Header(name string) string
- func (c *Ctx) IsAdmin() bool
- func (c *Ctx) JSON(code int, v any) error
- func (c *Ctx) Locals(key any, value ...any) any
- func (c *Ctx) Log() luxlog.Logger
- func (c *Ctx) Method() string
- func (c *Ctx) Next() error
- func (c *Ctx) NoContent(code int) error
- func (c *Ctx) Org() string
- func (c *Ctx) Param(name string) string
- func (c *Ctx) Path() string
- func (c *Ctx) Query(name string) string
- func (c *Ctx) RequestID() string
- func (c *Ctx) SendStream(r io.Reader) error
- func (c *Ctx) SendStreamWriter(fn func(w *bufio.Writer)) error
- func (c *Ctx) SetHeader(name, value string)
- func (c *Ctx) SetLog(l luxlog.Logger)
- func (c *Ctx) Status(code int) *Ctx
- func (c *Ctx) String(code int, s string) error
- func (c *Ctx) User() string
- func (c *Ctx) UserEmail() string
- type HTTPError
- func ErrBadRequest(msg string) *HTTPError
- func ErrConflict(msg string) *HTTPError
- func ErrForbidden(msg string) *HTTPError
- func ErrInternal(msg string) *HTTPError
- func ErrNotFound(msg string) *HTTPError
- func ErrUnauthorized(msg string) *HTTPError
- func Errorf(status int, format string, args ...any) *HTTPError
- type Handler
- type MCPConfig
- type OpOption
- type OpenAPIConfig
- type Router
- type Server
- type TransportFunc
- type TypedHandler
Constants ¶
const DefaultScheme = "zap"
DefaultScheme is the transport a bare address (no "scheme://") uses. ZAP is the primary transport (TLS 1.3 + post-quantum, gRPC's replacement), so the path of least resistance is ZAP-native.
const JSONVariant = jsonenc.Variant
JSONVariant reports which JSON implementation zip is using in this build — "encoding/json/v2" when compiled with GOEXPERIMENT=jsonv2, "encoding/json" otherwise. Exposed for cmd/cloud startup logs and for tests that need to assert the variant. Per HIP-0106 the wire stack is "JSON only at edge, ZAP between services"; this constant tells operators which JSON impl is on the edge.
Variables ¶
This section is empty.
Functions ¶
func Delete ¶
func Delete[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
Delete registers a DELETE typed handler at path.
func Get ¶
func Get[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
Get registers a GET typed handler at path.
func Patch ¶
func Patch[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
Patch registers a PATCH typed handler at path.
func Post ¶
func Post[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
Post registers a POST typed handler at path.
func Put ¶
func Put[In, Out any](app *App, path string, fn TypedHandler[In, Out], opts ...OpOption)
Put registers a PUT typed handler at path.
func RegisterTransport ¶ added in v1.1.0
func RegisterTransport(scheme string, tf TransportFunc)
RegisterTransport adds (or replaces) a transport keyed by address scheme, so any future termination/serialization protocol slots in with ZERO change to the Listen API. Call before Listen.
zip.RegisterTransport("quic", func(addr string, h fasthttp.RequestHandler) zip.Server {
return myquic.NewServer(addr, h)
})
Types ¶
type App ¶
type App struct {
// contains filtered or unexported fields
}
App is the zip application. It wraps *fiber.App and exposes the zip handler signature alongside generic typed handlers.
func New ¶
New constructs an App with the given config. Defaults are applied for any zero-valued field.
func (*App) Fiber ¶
Fiber returns the underlying *fiber.App. Use for one-off escape into Fiber-only APIs (rare). Prefer staying on the zip surface.
func (*App) Listen ¶ added in v1.1.0
Listen serves the app on one or more addresses and blocks until all listeners stop or the first one errors. The address scheme selects the transport; a bare address uses ZAP (DefaultScheme). This is the ONE and only way to serve a zip app — no per-transport methods.
func (*App) Module ¶
Module mounts a single HIP-0105 extension at the given method+path. The `methodPath` form is "METHOD /path" (e.g. "POST /v1/validate"), matching the Sinatra/Express idiom. `runtime` selects the backing engine ("wasm" | "goja" | "pyvm" | "starlark" | "v8go" | "native"); `modulePath` is the directory containing the extension.json manifest.
app.Module("POST /v1/policy/eval", "wasm", "./extensions/policy")
app.Module("POST /v1/transform", "pyvm", "./extensions/transform")
app.Module("POST /v1/webhook", "goja", "./extensions/webhook")
The extension's exported function name is inferred from the path's last segment unless explicitly overridden via app.ModuleFn().
func (*App) ModuleFn ¶
ModuleFn is the explicit form of Module — caller specifies the guest's exported function name directly.
func (*App) Mount ¶
Mount registers an http.Handler at the given prefix. Implicit chi.Router and gin.Engine support flows through AdaptNetHTTP via their respective ServeHTTP methods — both are http.Handlers.
app.Mount("/legacy/chi", zip.AdaptNetHTTP(chiRouter))
app.Mount("/legacy/gin", zip.AdaptNetHTTP(ginEngine))
app.Mount("/legacy/iam", zip.AdaptNetHTTP(beegoApp.HandlerWrapper()))
Migration tool — costs ~5% perf vs native Fiber.
func (*App) ShutdownWithContext ¶
ShutdownWithContext gracefully stops both transports bounded by ctx.
type Config ¶
type Config struct {
// Logger is the luxfi/log Logger zip uses internally. Required.
// If nil, a default one is created via luxlog.NewLogger("zip").
Logger luxlog.Logger
// Loader is the HIP-0105 extension runtime loader. nil disables
// app.Module() — only native handlers will work. The interface is
// satisfied by *extruntime.Loader from hanzoai/base/plugins/extruntime;
// zip does NOT take a hard dep on hanzoai/base.
Loader runtime.Loader
// AllowedRuntimes restricts which extension runtimes app.Module()
// will accept (e.g. ["goja","wazero"] for hard multi-tenant safety).
// nil = allow whatever the Loader has registered.
AllowedRuntimes []string
// ServerHeader is sent as the Server: response header (default "zip").
// Set to "-" to suppress.
ServerHeader string
// BodyLimit is the maximum request body size (default 4 MiB).
BodyLimit int
// AppName forwards to fiber.Config.AppName.
AppName string
// DisableStartupMessage suppresses Fiber's startup banner.
DisableStartupMessage bool
// ErrorHandler is the catch-all error handler. Defaults to zip.errorHandler
// which renders {error, code, status} JSON.
ErrorHandler fiber.ErrorHandler
// Concurrency caps the maximum number of concurrent connections the
// server will accept. Default 0 means fasthttp's own default
// (256*1024). Ops should cap this at the per-replica budget — see
// `~/work/hanzo/hips/docs/SCALE_STANDARD.md`. With Hanzo's verified
// 8 KiB/conn budget, 100_000 sits at ~800 MiB inside a 1 GiB pod.
Concurrency int
// ReadBufferSize is fasthttp's per-conn request-read buffer (default
// 4 KiB). Raise only for header-heavy upstreams; raising it inflates
// the per-conn memory budget and breaks the conn-memory regression
// gate (see SCALE_STANDARD.md §8).
ReadBufferSize int
// WriteBufferSize is fasthttp's per-conn response-write buffer
// (default 4 KiB). Raise only for streaming-heavy responses; same
// budget caveat as ReadBufferSize.
WriteBufferSize int
// OpenAPI configures the auto-generated /.well-known/openapi.json
// served when typed handlers are registered.
OpenAPI OpenAPIConfig
// MCP configures the Model Context Protocol tool surface auto-derived from
// typed handlers (Get/Post[In,Out]). Enabled by default — it's free (the
// same op registry that feeds OpenAPI), served over every transport. Set
// MCP.Disabled to suppress.
MCP MCPConfig
}
Config configures the zip App. Most fields pass through to Fiber's own Config; a few zip-specific knobs control runtime loading.
type Ctx ¶
type Ctx struct {
// contains filtered or unexported fields
}
Ctx wraps fiber.Ctx and adds the Hanzo identity surface (Org/User/Email from gateway-minted X-* headers per HIP-0026), a per-request luxfi/log logger, and typed Deps access.
func (*Ctx) Bind ¶
Bind parses the request body into v based on Content-Type (JSON by default) and runs struct-tag validation (required/min/max/minlen/maxlen). Returns a *HTTPError(400) when either step fails so handlers can return the error directly.
func (*Ctx) Log ¶
Log returns the request-scoped logger. Middleware that adds request_id, org, user, etc. via Locals can enrich this by calling SetLog.
func (*Ctx) Next ¶
Next yields to the next handler in the chain. Use sparingly from zip middleware — middleware bodies usually call c.Continue() at the end, not Next() mid-handler.
func (*Ctx) Org ¶
Org returns the X-Org-Id from the JWT-validated gateway. Empty when no gateway is in front (local dev / direct ingress).
func (*Ctx) RequestID ¶
RequestID returns the value of X-Request-Id (set by the RequestID middleware).
func (*Ctx) SendStream ¶
SendStream streams data from r to the client (e.g. for SSE).
func (*Ctx) SendStreamWriter ¶
SendStreamWriter writes streaming output via a bufio.Writer (Server-Sent Events / chunked transfer). Forwards to fiber.Ctx.SendStreamWriter.
func (*Ctx) SetLog ¶
SetLog replaces the request logger (typically by middleware that wants to attach request-id / org / user fields).
type HTTPError ¶
type HTTPError struct {
Status int `json:"status"`
Code string `json:"code,omitempty"`
Msg string `json:"error"`
}
HTTPError is the canonical error type zip understands. Returning one causes the error handler to send a JSON {error, code, status} body.
func ErrConflict ¶
func ErrForbidden ¶
func ErrInternal ¶
func ErrNotFound ¶
func ErrUnauthorized ¶
type Handler ¶
Handler is zip's request handler signature. Returning an error causes Fiber's error chain to write a JSON response.
func AdaptNetHTTP ¶
AdaptNetHTTP wraps an http.Handler so it can be mounted on a zip router. Use for stdlib code:
app.Mount("/legacy/net", zip.AdaptNetHTTP(httpHandler))
Migration tool — costs ~5% perf vs native Fiber. Replace with native zip handlers when feasible.
func AdaptNetHTTPFunc ¶
func AdaptNetHTTPFunc(h http.HandlerFunc) Handler
AdaptNetHTTPFunc wraps an http.HandlerFunc.
Migration tool — costs ~5% perf vs native Fiber.
type MCPConfig ¶ added in v1.1.0
type MCPConfig struct {
// Disabled suppresses the /mcp route (MCP is on by default — it's free).
Disabled bool
// Path overrides the mount path (default "/mcp").
Path string
// Name is the server name reported to MCP clients (default AppName, else "zip").
Name string
}
MCPConfig configures the auto-derived MCP surface.
type OpOption ¶
type OpOption func(*registeredOp)
OpOption configures a typed handler registration (OpenAPI metadata).
func WithOperationID ¶
WithOperationID sets the operation ID in OpenAPI.
func WithSummary ¶
WithSummary sets the operation summary in OpenAPI.
type OpenAPIConfig ¶
type OpenAPIConfig struct {
// Title appears in the OpenAPI info block.
Title string
// Description appears in the OpenAPI info block.
Description string
// Version appears in the OpenAPI info block (e.g. "v1.0.0").
Version string
// Disabled suppresses the /.well-known/openapi.json route and /docs.
Disabled bool
}
OpenAPIConfig configures the auto-generated /.well-known/openapi.json endpoint zip serves when typed handlers are registered.
type Router ¶
type Router interface {
Use(handlers ...Handler) Router
Get(path string, h Handler) Router
Post(path string, h Handler) Router
Put(path string, h Handler) Router
Patch(path string, h Handler) Router
Delete(path string, h Handler) Router
Head(path string, h Handler) Router
Options(path string, h Handler) Router
All(path string, h Handler) Router
Group(prefix string, handlers ...Handler) Router
Route(prefix string, fn func(r Router)) Router
// Fiber returns the underlying fiber.Router for one-off escape.
Fiber() fiber.Router
}
Router is the path-mounting surface shared by *App and Group. All concrete routes flow through toFiberHandler — fiber.Ctx is the underlying type the framework's users never see directly.
type Server ¶ added in v1.1.0
Server is a running transport listener bound to one address. Both zap-proto/http.Server and the built-in HTTP server satisfy it, as does any custom transport.
type TransportFunc ¶ added in v1.1.0
type TransportFunc func(addr string, handler fasthttp.RequestHandler) Server
TransportFunc builds a Server that serves handler on addr. Register one per address scheme with RegisterTransport — that is the ONLY extension point; the Listen API never changes as protocols are added.
type TypedHandler ¶
TypedHandler is the generic handler signature: takes an *In, returns (*Out, error). zip generates OpenAPI 3.1 spec from the In/Out types and registers a Fiber route that unmarshals body → In, runs the handler, and marshals Out → JSON response.
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
examples
|
|
|
express-in-zip
command
express-in-zip — the proof point: a legacy Express-shaped TypeScript handler running inside zip with ZERO rewrite.
|
express-in-zip — the proof point: a legacy Express-shaped TypeScript handler running inside zip with ZERO rewrite. |
|
hello
command
Hello, zip — minimal example.
|
Hello, zip — minimal example. |
|
migrate-from-beego
command
migrate-from-beego example — beego → zip migration via http.Handler adapter.
|
migrate-from-beego example — beego → zip migration via http.Handler adapter. |
|
migrate-from-chi
command
migrate-from-chi example — chi → zip via stdlib adapter.
|
migrate-from-chi example — chi → zip via stdlib adapter. |
|
migrate-from-gin
command
migrate-from-gin example — mechanical port of a gin-style API to zip.
|
migrate-from-gin example — mechanical port of a gin-style API to zip. |
|
module-routes
command
module-routes example — mount HIP-0105 extension modules as routes.
|
module-routes example — mount HIP-0105 extension modules as routes. |
|
sse-streaming
command
sse-streaming example — Server-Sent Events via c.SendStreamWriter.
|
sse-streaming example — Server-Sent Events via c.SendStreamWriter. |
|
subsystem-mount
command
subsystem-mount example — HIP-0106 Mount(app, deps) idiom.
|
subsystem-mount example — HIP-0106 Mount(app, deps) idiom. |
|
websocket
command
websocket example — chat-style echo server.
|
websocket example — chat-style echo server. |
|
zap-typed
command
zap-typed example — typed handler with auto-generated OpenAPI spec.
|
zap-typed example — typed handler with auto-generated OpenAPI spec. |
|
internal
|
|
|
jsonenc
Package jsonenc is zip's single JSON entry point.
|
Package jsonenc is zip's single JSON entry point. |
|
runtime
Package runtime defines the minimal Loader / Module interface zip consumes from any HIP-0105 extension runtime implementation (hanzoai/base/plugins/extruntime is the reference).
|
Package runtime defines the minimal Loader / Module interface zip consumes from any HIP-0105 extension runtime implementation (hanzoai/base/plugins/extruntime is the reference). |
|
Package middleware ships zip's canonical generic middleware stack.
|
Package middleware ships zip's canonical generic middleware stack. |
|
esbuild.go wraps esbuild's pure-Go API (no CGO) so zip can compile TS / modern-JS handler source down to ES5 that the embedded goja VM executes.
|
esbuild.go wraps esbuild's pure-Go API (no CGO) so zip can compile TS / modern-JS handler source down to ES5 that the embedded goja VM executes. |
|
Package wsx provides Fiber-v3-compatible WebSocket support via fasthttp/websocket.
|
Package wsx provides Fiber-v3-compatible WebSocket support via fasthttp/websocket. |
|
Package zaprpc is an OPTIONAL named-service RPC dispatch helper for zip apps that want a Cap'n-Proto/gRPC-style service registry (name → method → handler) rather than plain REST routes.
|
Package zaprpc is an OPTIONAL named-service RPC dispatch helper for zip apps that want a Cap'n-Proto/gRPC-style service registry (name → method → handler) rather than plain REST routes. |