import { Injectable, NestMiddleware } from '@nestjs/common'; import { randomUUID } from 'crypto'; import type { Request, Response, NextFunction } from 'express'; export const REQUEST_ID_HEADER = 'x-request-id'; export type RequestWithId = Request & { requestId?: string }; @Injectable() export class RequestIdMiddleware implements NestMiddleware { use(req: RequestWithId, res: Response, next: NextFunction) { const incoming = req.headers[REQUEST_ID_HEADER]; const requestId = typeof incoming === 'string' && incoming.trim() ? incoming.trim().slice(0, 64) : randomUUID(); req.requestId = requestId; res.setHeader('X-Request-Id', requestId); next(); } }