import { log, timedExecution } from '$lib'; import { validate, v7 as uuidv7 } from 'uuid'; import type { Handle } from '@sveltejs/kit'; const requestIdHeader = 'x-request-id'; export const handle: Handle = async ({ event, resolve }) => { // use incoming requestId, if it is a valid uuid, else generate one const reqIdFromRequest = event.request.headers.get(requestIdHeader); const { requestId, fromRequest } = reqIdFromRequest && validate(reqIdFromRequest) ? { requestId: reqIdFromRequest, fromRequest: true } : { requestId: uuidv7(), fromRequest: false }; const context = { requestId, route: event.route.id, method: event.request.method, userAgent: event.request.headers.get('user-agent'), clientIP: event.getClientAddress(), }; if (fromRequest) { log.trace(context, 'using incoming request-id'); } // make requestId available to handlers event.locals.requestId = requestId; const { executionTime, result: response } = await timedExecution(async () => { return await resolve(event); }); response.headers.set(requestIdHeader, requestId); log.info( { executionTime: `${executionTime}ms`, status: response.status, size: response.headers.get('content-length'), ...context, }, 'finished request' ); return response; };