Перейти к содержимому

Middleware

Middleware в ONREZA задаётся через Edge Rules pipeline: onreza.rules.toml выбирает маршрут, порядок шагов и cache boundary, а ONREZA Functions выполняют динамическую логику.

Legacy middleware trigger и ctx.next() больше не являются публичным контрактом. Для auth, redirects, geo-routing, A/B и security headers используйте pipeline action.

schema = "EDGE_RULE_SET_V1"
[[rule]]
id = "dashboard-auth"
when.path = { prefix = "/dashboard" }
action.pipeline = { steps = [
{ use = "require-session", mode = "request", failure = "closed" },
{ handle = "@app" },
{ use = "add-user-header", mode = "response", failure = "open" },
] }
export const config = {
name: "require-session",
} as const;
export default {
async request(request, ctx) {
const session = request.headers.get("cookie")?.match(/session=([^;]+)/)?.[1];
if (!session) {
return Response.redirect(new URL("/login", request.url), 307);
}
const userBytes = await ctx.kv.get(`session:${session}`);
if (!userBytes) {
return Response.redirect(new URL("/login", request.url), 307);
}
ctx.locals.user = new TextDecoder().decode(userBytes);
return request;
},
};

Семантика:

  • request step с failure = "closed" выполняется до cache lookup, поэтому cache HIT не обходит auth;
  • response и observe steps выполняются после terminal route и не заменяют route selection;
  • handle = "@app" передаёт запрос в обычный Static/Compute route приложения;
  • handle = "function-name" делает функцию terminal handler;
  • KV, env, logs и ctx.locals доступны через явный ctx.

Для простых redirects, rewrites, headers, cache, deny/log и rate limit функция не нужна: держите это как native Edge Rule в том же onreza.rules.toml.