Files
arbiter/dist/middleware/harRecorder.js
2025-03-19 22:47:50 -05:00

55 lines
1.8 KiB
JavaScript

import { openApiStore } from '../store/openApiStore.js';
export async function harRecorder(c, next) {
const startTime = Date.now();
// Get request body if present
let requestBody;
if (c.req.method !== 'GET' && c.req.method !== 'HEAD') {
try {
requestBody = await c.req.json();
}
catch (e) {
// Body might not be JSON
requestBody = await c.req.text();
}
}
// Get query parameters from URL
const url = new URL(c.req.url);
const queryParams = {};
for (const [key, value] of url.searchParams.entries()) {
queryParams[key] = value;
}
// Get all request headers
const requestHeaders = {};
Object.entries(c.req.header()).forEach(([key, value]) => {
if (typeof value === 'string') {
requestHeaders[key] = value;
}
});
// Call next middleware
await next();
// Calculate response time
const responseTime = Date.now() - startTime;
// Get response body
let responseBody;
try {
responseBody = await c.res.clone().json();
}
catch (e) {
responseBody = await c.res.clone().text();
}
// Record the request/response in OpenAPI format
openApiStore.recordEndpoint(c.req.path, c.req.method.toLowerCase(), {
query: queryParams,
body: requestBody,
contentType: c.req.header('content-type') || 'application/json',
headers: requestHeaders
}, {
status: c.res.status,
body: responseBody,
contentType: c.res.headers.get('content-type') || 'application/json',
headers: Object.fromEntries(c.res.headers.entries())
});
// Set HAR data in context
c.set('har', openApiStore.generateHAR());
}
//# sourceMappingURL=harRecorder.js.map