33 lines
943 B
TypeScript
33 lines
943 B
TypeScript
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()}`;
|