4 · Middleware & sessions

El middleware corre antes de tus handlers. En nyx-serve un middleware es solo una función Request → Response con una regla: devuelve status 0 para continuar (y cualquier header que pongas igual llega a la respuesta final), o cualquier otro status para frenar el request ahí mismo.

Una barrera de auth

fn require_auth(req: Request) -> Response {
    let token: String = http_find_header(req.headers_flat, "Authorization")
    if token.length() == 0 {
        return response_json(401, "{\"error\":\"unauthorized\"}")
    }
    return Response { status: 0, headers_flat: [], body: "" }  // continue
}

Registralo con app_use. El orden importa — el middleware corre de arriba a abajo:

cors_configure("*", "GET, POST, OPTIONS", "Content-Type, Authorization")
app_use(app, mw_cors)        // built-in CORS
app_use(app, require_auth)   // your gate

Nota que pasas la función por nombre, no llamada: app_use(app, mw_cors), no mw_cors(). Y el origen CORS se configura una vez con cors_configure, no como argumento.

Sesiones

Las sesiones por cookie viven en std/session, respaldadas por nyx-kv sobre RESP. Apuntalo a tu instancia de KV una vez, y después session_start emite la cookie y session_set / session_get guardan valores por usuario.

import "std/session"

fn login(req: Request) -> Response {
    if not req.form.contains("name") {
        return response_json(400, "{\"error\":\"name is required\"}")
    }
    let name: String = req.form.get("name")
    var resp: Response = response_json(200, "{\"ok\":true}")
    let sid: String = session_start(req, resp)   // sets the cookie
    session_set(req, "user", name)
    return resp
}

fn profile(req: Request) -> Response {
    let user: String = session_get(req, "user")
    if user.length() == 0 {
        return response_json(401, "{\"error\":\"log in first\"}")
    }
    return response_json(200, "{\"user\":\"" + user + "\"}")
}

fn main() {
    session_configure("127.0.0.1", 6380, 3600)  // kv host, port, ttl
    let app: App = app_new()
    app_post(app, "/login", login)
    app_get(app, "/profile", profile)
    serve_app(app, 3000, 8)
}

Necesitas un nyx-kv corriendo para esto. La forma más rápida:

$ docker run -p 6380:6380 nyxlang/nyx-kv   # or point session_configure at nyxkv.com
Las sesiones sobreviven a los redirects — el header Set-Cookie se preserva en respuestas 3xx, así que un login que redirige al home igual deja al usuario logueado.