import type { FastifyInstance, FastifyRequest } from "fastify"; import { randomUUID } from "node:crypto"; declare module "fastify" { interface FastifyRequest { requestId: string; } } const firstHeaderValue = ( value: string | string[] | undefined, ): string | undefined => (Array.isArray(value) ? value[0] : value); export const createRequestId = ( incomingRequestId: string | string[] | undefined, ): string => { const requestId = firstHeaderValue(incomingRequestId); return requestId && /^[A-Za-z0-9_-]{1,128}$/.test(requestId) ? requestId : `req-${randomUUID()}`; }; export const requestIdPlugin = async (app: FastifyInstance) => { app.addHook("onRequest", async (request, reply) => { request.requestId = request.id; reply.header("x-request-id", request.requestId); }); }; export const getRequestId = (request: FastifyRequest): string => request.requestId ?? request.id ?? `req-${randomUUID()}`;