Skip to content

Middleware Catalog

orva ships with a production-oriented middleware layer, but the ergonomics only matter if you can quickly find the right one. This page is the full catalog for the active release line: every middleware export, what it is for, where to import it from, and the smallest useful example.

If you want recommended stacks by scenario instead of a full catalog, start with the Middleware Cookbook.

Import styles

Use aggregate imports in applications:

ts
import { cors, requestId, secureHeaders } from 'orvajs/middlewares';

Use subpath imports in libraries, templates, CLIs, and shared infrastructure packages:

ts
import { cors } from 'orvajs/middlewares/cors';
import { requestId } from 'orvajs/middlewares/request-id';
import { secureHeaders } from 'orvajs/middlewares/secure-headers';

Quick picks

ScenarioRecommended stack
Browser-facing APIrequestId() logger() cors() secureHeaders() bodyLimit() responseTime()
Internal admin panelbasicAuth() requireOrigin() rateLimit() secureHeaders()
Public APIbearerAuth() or apiKeyAuth() plus rateLimit() requestId() responseTime()
Static assetsserveStatic() with etag() compress() cacheControl()
Security baselinesecureHeaders() plus contentSecurityPolicy() and strictTransportSecurity()

How to read the examples

Examples use the smallest meaningful configuration. For larger apps, prefer wrapping these stacks in route groups or shared middleware factories.

Authentication

These middlewares all gate access and set c.get('auth') / c.var.auth style metadata for downstream handlers.

MiddlewareImportUse it forExample
basicAuth()orvajs/middlewares/basic-authBrowser prompts, internal tools, admin consolesapp.use(basicAuth({ users: { admin: 'secret' } }))
bearerAuth()orvajs/middlewares/bearer-authBearer token APIs and service-to-service authapp.use(bearerAuth({ token: ['token-a', 'token-b'] }))
apiKeyAuth()orvajs/middlewares/api-key-authHeader or query based API keysapp.use(apiKeyAuth({ key: ['k1'], headerName: 'X-API-Key' }))

Authentication recipe

ts
import { createOrva } from 'orvajs';
import { basicAuth, bearerAuth, apiKeyAuth } from 'orvajs/middlewares';

const app = createOrva()
  .get('/admin', basicAuth({ users: { admin: 'secret' } }), (c) => c.text('ok'))
  .get('/internal', bearerAuth({ token: 'internal-token' }), (c) => c.text('ok'))
  .get('/partners', apiKeyAuth({ key: ['partner-key'], queryName: 'apiKey' }), (c) => c.text('ok'));

Guards

Use these when the request should be rejected before the main handler runs.

MiddlewareImportUse it forExample
allowMethods()orvajs/middlewares/allow-methodsAllow only a small method setapp.use(allowMethods(['GET', 'POST']))
blockMethods()orvajs/middlewares/block-methodsBlock dangerous or unsupported methodsapp.use(blockMethods(['TRACE', 'CONNECT']))
requireHeader()orvajs/middlewares/require-headerRequire one or more headersapp.use(requireHeader(['x-tenant-id']))
requireQuery()orvajs/middlewares/require-queryRequire one or more query paramsapp.use(requireQuery(['page']))
requireJson()orvajs/middlewares/require-jsonEnforce application/json on write methodsapp.use(requireJson())
requireAccept()orvajs/middlewares/require-acceptEnforce Accept negotiationapp.use(requireAccept(['application/json']))
bodyLimit()orvajs/middlewares/body-limitReject oversized request bodiesapp.use(bodyLimit({ maxBytes: 1024 * 1024 }))
timeout()orvajs/middlewares/timeoutFail slow requests with a timeout responseapp.use(timeout({ ms: 5_000 }))
rateLimit()orvajs/middlewares/rate-limitProtect endpoints against bursts and abuseapp.use(rateLimit({ limit: 100, windowMs: 60_000 }))
hostAllowlist()orvajs/middlewares/host-allowlistRestrict valid hostsapp.use(hostAllowlist(['api.example.com']))
blockUserAgents()orvajs/middlewares/block-user-agentsBlock bots or broken clients by patternapp.use(blockUserAgents([/curl/i, 'BadBot']))
requireOrigin()orvajs/middlewares/require-originRestrict browser originsapp.use(requireOrigin(['https://app.example.com']))
idempotencyKey()orvajs/middlewares/idempotency-keyRequire Idempotency-Key on mutating endpointsapp.use(idempotencyKey())
csrfOrigin()orvajs/middlewares/csrf-originCSRF-style origin checks for body-carrying requestsapp.use(csrfOrigin(['https://app.example.com']))

Guard recipe

ts
import { createOrva } from 'orvajs';
import {
  allowMethods,
  bodyLimit,
  idempotencyKey,
  rateLimit,
  requireJson,
  requireOrigin,
} from 'orvajs/middlewares';

const app = createOrva().use(
  allowMethods(['GET', 'POST', 'PATCH']),
  requireOrigin(['https://app.example.com']),
  requireJson(),
  bodyLimit({ maxBytes: 2 * 1024 * 1024 }),
  idempotencyKey(),
  rateLimit({ limit: 60, windowMs: 60_000 }),
);

HTTP Response

These middlewares shape headers, redirects, validators, and response metadata.

MiddlewareImportUse it forExample
poweredBy()orvajs/middlewares/powered-byAdd X-Powered-Byapp.use(poweredBy('orva'))
responseHeaders()orvajs/middlewares/response-headersAppend one or more dynamic/static headersapp.use(responseHeaders({ headers: { 'x-app': 'orva' } }))
cacheControl()orvajs/middlewares/cache-controlSet cache policyapp.use(cacheControl('public, max-age=60'))
noStore()orvajs/middlewares/no-storeDisable cachingapp.use(noStore())
vary()orvajs/middlewares/varyAdd Vary headersapp.use(vary('Origin', 'Accept-Encoding'))
cors()orvajs/middlewares/corsCross-origin browser accessapp.use(cors({ origin: ['https://app.example.com'], credentials: true }))
httpsRedirect()orvajs/middlewares/https-redirectRedirect HTTP traffic to HTTPSapp.use(httpsRedirect({ status: 308 }))
trailingSlash()orvajs/middlewares/trailing-slashAdd or remove trailing slashesapp.use(trailingSlash({ mode: 'remove' }))
etag()orvajs/middlewares/etagAdd strong ETag validators and 304 supportapp.use(etag())
responseTag()orvajs/middlewares/response-tagStamp a single response headerapp.use(responseTag('x-release', '2026-04'))
contentType()orvajs/middlewares/content-typeProvide a fallback content typeapp.use(contentType('application/json; charset=utf-8'))
checksum()orvajs/middlewares/checksumAdd a body hash headerapp.use(checksum('X-Body-SHA1'))
responseChecksumTrailer()orvajs/middlewares/response-checksum-trailerAdd a digest-style response hashapp.use(responseChecksumTrailer('Digest'))
contentLength()orvajs/middlewares/content-lengthCompute Content-Length when missingapp.use(contentLength())

HTTP recipe

ts
import { createOrva } from 'orvajs';
import {
  cacheControl,
  cors,
  etag,
  responseHeaders,
  secureHeaders,
  vary,
} from 'orvajs/middlewares';

const app = createOrva().use(
  cors({ origin: ['https://app.example.com'], credentials: true }),
  secureHeaders(),
  cacheControl('public, max-age=60'),
  vary('Origin', 'Accept-Encoding'),
  responseHeaders({ headers: { 'x-service': 'edge-api' } }),
  etag(),
);

Observability

These middlewares capture request metadata and write it into response headers or c.var.

MiddlewareImportUse it forExample
logger()orvajs/middlewares/loggerConsole or custom request loggingapp.use(logger({ includeQuery: true }))
requestId()orvajs/middlewares/request-idStable request correlation IDsapp.use(requestId({ contextKey: 'requestId' }))
responseTime()orvajs/middlewares/response-timeAdd an elapsed-time headerapp.use(responseTime())
requestMeta()orvajs/middlewares/request-metaStore method/path/query/headers in contextapp.use(requestMeta())
userAgent()orvajs/middlewares/user-agentStore User-Agent in contextapp.use(userAgent())
clientIp()orvajs/middlewares/client-ipStore client IP from proxy headersapp.use(clientIp())
serverTiming()orvajs/middlewares/server-timingAdd Server-Timingapp.use(serverTiming('app;dur=12'))
requestContext()orvajs/middlewares/request-contextStore combined IP / UA / origin metadataapp.use(requestContext())
requestSize()orvajs/middlewares/request-sizeCapture request size in bytesapp.use(requestSize())
locale()orvajs/middlewares/localeParse Accept-Languageapp.use(locale('en'))
requestBodyText()orvajs/middlewares/request-body-textStore the raw request body textapp.use(requestBodyText())

Observability recipe

ts
import { createOrva } from 'orvajs';
import {
  clientIp,
  logger,
  requestContext,
  requestId,
  responseTime,
  serverTiming,
} from 'orvajs/middlewares';

const app = createOrva().use(
  requestId(),
  clientIp(),
  requestContext(),
  logger({ includeQuery: true }),
  responseTime(),
  serverTiming('app;dur=8'),
);

Security Headers

Use secureHeaders() for a fast baseline, or compose individual policies when you need tighter control.

MiddlewareImportUse it forExample
contentSecurityPolicy()orvajs/middlewares/content-security-policyCSP and report-only policiesapp.use(contentSecurityPolicy({ directives: { defaultSrc: [\"'self'\"] } }))
referrerPolicy()orvajs/middlewares/referrer-policyReferrer leakage controlapp.use(referrerPolicy('strict-origin-when-cross-origin'))
frameOptions()orvajs/middlewares/frame-optionsClickjacking protectionapp.use(frameOptions('DENY'))
xContentTypeOptions()orvajs/middlewares/x-content-type-optionsMIME sniffing protectionapp.use(xContentTypeOptions())
xDnsPrefetchControl()orvajs/middlewares/x-dns-prefetch-controlDNS prefetch policyapp.use(xDnsPrefetchControl(false))
xDownloadOptions()orvajs/middlewares/x-download-optionsIE download safety headerapp.use(xDownloadOptions())
xPermittedCrossDomainPolicies()orvajs/middlewares/x-permitted-cross-domain-policiesAdobe/Flash cross-domain restrictionsapp.use(xPermittedCrossDomainPolicies('none'))
xXssProtection()orvajs/middlewares/x-xss-protectionLegacy browser XSS headerapp.use(xXssProtection('0'))
strictTransportSecurity()orvajs/middlewares/strict-transport-securityHSTSapp.use(strictTransportSecurity({ maxAge: 31536000, preload: true }))
permissionsPolicy()orvajs/middlewares/permissions-policyRestrict browser capabilitiesapp.use(permissionsPolicy({ directives: { geolocation: [] } }))
crossOriginEmbedderPolicy()orvajs/middlewares/cross-origin-embedder-policyCOEPapp.use(crossOriginEmbedderPolicy('require-corp'))
crossOriginOpenerPolicy()orvajs/middlewares/cross-origin-opener-policyCOOPapp.use(crossOriginOpenerPolicy('same-origin'))
crossOriginResourcePolicy()orvajs/middlewares/cross-origin-resource-policyCORPapp.use(crossOriginResourcePolicy('same-origin'))
originAgentCluster()orvajs/middlewares/origin-agent-clusterOrigin-Agent-Cluster isolationapp.use(originAgentCluster('?1'))
secureHeaders()orvajs/middlewares/secure-headersSensible security-header defaultsapp.use(secureHeaders())

Security recipe

ts
import { createOrva } from 'orvajs';
import {
  contentSecurityPolicy,
  secureHeaders,
  strictTransportSecurity,
} from 'orvajs/middlewares';

const app = createOrva().use(
  secureHeaders(),
  contentSecurityPolicy({
    directives: {
      defaultSrc: ["'self'"],
      imgSrc: ["'self'", 'data:'],
      scriptSrc: ["'self'"],
    },
  }),
  strictTransportSecurity({
    maxAge: 31536000,
    includeSubDomains: true,
    preload: true,
  }),
);

Asset Delivery

These are the delivery middlewares most teams want once docs, dashboards, or uploaded assets show up.

MiddlewareImportUse it forExample
serveStatic()orvajs/middlewares/serve-staticStatic files, manifests, SPA fallbackapp.get('/assets/*', serveStatic({ root: 'public', prefix: '/assets', etag: true }))
compress()orvajs/middlewares/compressBrotli / gzip / deflate compressionapp.use(compress({ threshold: 1024, encodings: ['br', 'gzip'] }))

Asset delivery recipe

ts
import { createOrva } from 'orvajs';
import { cacheControl, compress, etag, serveStatic } from 'orvajs/middlewares';

const app = createOrva()
  .use(compress({ threshold: 1024, encodings: ['br', 'gzip'] }), cacheControl('public, max-age=600'), etag())
  .get('/assets/*', serveStatic({
    root: 'public',
    prefix: '/assets',
    index: false,
    etag: true,
  }))
  .get('/*', serveStatic({
    root: 'public',
    spaFallback: 'index.html',
  }));

These are utility exports, not app.use() middlewares. Use them inside custom middleware, adapters, auth flows, and tests.

UtilityImportUse it forExample
getCookie()orvajs/middlewares/cookieRead a single cookie from a requestconst session = getCookie(request, 'session')
parseCookieHeader()orvajs/middlewares/cookieParse the full cookie headerconst cookies = parseCookieHeader(request.headers.get('cookie'))
serializeCookie()orvajs/middlewares/cookieBuild a Set-Cookie valueserializeCookie('theme', 'dark', { path: '/', httpOnly: true })
serializeDeleteCookie()orvajs/middlewares/cookieExpire and remove cookiesserializeDeleteCookie('session', { path: '/' })
ts
import { defineMiddleware } from 'orvajs';
import { getCookie, serializeCookie, serializeDeleteCookie } from 'orvajs/middlewares/cookie';

export const sessionCookies = defineMiddleware(async (c, next) => {
  const session = getCookie(c.req, 'session');

  c.after((response) => {
    if (!session) {
      response.headers.append('Set-Cookie', serializeCookie('session', 'new-session', {
        path: '/',
        httpOnly: true,
      }));
    }
    return response;
  });

  await next();
});

export function logoutHeaders(): Headers {
  return new Headers({
    'Set-Cookie': serializeDeleteCookie('session', { path: '/' }),
  });
}

What to use first

If you are just getting started, the shortest stable stack is still:

ts
import { createOrva } from 'orvajs';
import {
  bodyLimit,
  cors,
  logger,
  requestId,
  responseTime,
  secureHeaders,
} from 'orvajs/middlewares';

const app = createOrva().use(
  requestId(),
  logger(),
  cors(),
  secureHeaders(),
  bodyLimit({ maxBytes: 1024 * 1024 }),
  responseTime(),
);

Then expand from there only when the route shape actually needs it.

Built with VitePress. Structured for production docs, multilingual delivery and long-term versioning.