mirror of
https://github.com/LukeHagar/arbiter.git
synced 2025-12-06 04:19:14 +00:00
55 lines
1.8 KiB
JavaScript
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
|