Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
* Logging Middleware
*
* Logs request and response details for debugging and monitoring.
*/
import { } from 'next/server';
import { logger } from '@/lib/logging';
import type { RouteContext, RouteHandler } from './types';
/**
* Logging middleware
*
* Wraps a handler to log request details and response status.
* Useful for debugging and monitoring API endpoints.
*
* @example
* ```ts
* export const GET = withLogging(async (request, context) => {
* // Request will be logged automatically
* return successResponse({ message: 'Hello' });
* });
* ```
*/
export function withLogging<T>(handler: RouteHandler<T>): RouteHandler<T> {
return async (request, context?: RouteContext) => {
const url = new URL(request.url);
const startTime = Date.now();
// Log incoming request
logger.info(`${request.method} ${url.pathname}`, {
category: 'API',
query: Object.fromEntries(url.searchParams),
headers: {
'content-type': request.headers.get('content-type'),
'user-agent': request.headers.get('user-agent')?.substring(0, 50) } });
try {
const response = await handler(request, context);
const duration = Date.now() - startTime;
// Log successful response
logger.info(`${request.method} ${url.pathname} completed`, {
category: 'API',
status: response.status,
duration: `${duration}ms` });
return response;
} catch (error) {
const duration = Date.now() - startTime;
// Log error
logger.error(
`${request.method} ${url.pathname} failed`,
error instanceof Error ? error : new Error(String(error)),
{
category: 'API',
duration: `${duration}ms`
}
);
throw error;
}
};
}
|