Middleware runs in registration order. Each function receives (ctx, next) and must call await next() to continue unless it ends the request. Phase 1 improves lifecycle consistency around routing and error handling.
logging.ts
app.use(async (ctx, next) => {
const start = Date.now();
const response = await next();
console.log(ctx.method, ctx.path, Date.now() - start, "ms");
return response;
});Common middleware packages
security-stack.ts
import { cors } from "@orveth/cors";
import { requestId, securityHeaders } from "@orveth/security";
app.use(cors());
app.use(requestId());
app.use(securityHeaders());