Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Dispatch ¶
Dispatch drives ONE request through the full pipeline: identity, access gate, middleware, handler. It speaks only router.Context, so the pipeline that runs in production is the same one a test can drive — with no Cloudflare runtime and no js.Global() in sight.
That is not a convenience: the previous tests called the matched handler DIRECTLY, past the gate, which is why they stayed green while every guarded route answered 403 in production. A pipeline you cannot drive is a pipeline nobody tests.
func NewRouter ¶
NewRouter builds the edge router. It takes a Config on purpose: the no-argument version could not authenticate anybody, which made every guarded route unreachable. An app with no auth passes edge.Config{} — explicitly.
func Validate ¶
Validate refuses to start on a contradiction. Each of these denies EVERY caller, forever, on a route that LOOKS protected — and the only way to discover that is a 403 in production, which is exactly how the file upload API shipped unusable.
It panics rather than returning an error: there is nobody to hand an error to at the top of a Worker, and goflare recovers and logs panics. Loud beats silent.
Types ¶
type Config ¶
type Config struct {
// Authn establishes identity. It runs BEFORE the access gate, and that ordering is the
// whole point: a gate that runs first can never be satisfied, so every guarded route
// becomes a permanent 403. That is exactly the bug this replaced — it made the file
// upload API unusable in production while the tests stayed green.
//
// It reads the request (cookie, header, token) and calls ctx.SetUserID. Anonymous ("")
// is a legal outcome, not an error.
Authn router.Middleware
// Authorize answers whether that identity holds a permission. nil DENIES: the absence
// of an answer is not permission.
Authorize model.Authorizer
}
Config declares WHO the caller is and WHAT they may do. The library supplies the mechanism; the policy belongs to the app.
The zero value is legal — an app with no authentication — and its public routes work. What it cannot do is mount a guarded route without saying who authorizes it: Serve refuses to start on that contradiction, instead of answering 403 forever in silence.