next-actuator
Version:
A fully composable actuator implementation for Next.js projects
32 lines • 1.38 kB
JavaScript
import { sum } from 'es-toolkit';
import { notFound } from 'next/navigation';
import { isDimensionalMetric } from '../types/metric';
const createMetric = (name, description, baseUnit, value, availableDimensions) => ({
name,
description,
baseUnit,
measurements: [{ statistic: 'VALUE', value }],
availableDimensions
});
const evaluateMetric = async (name, metric, dimension) => {
if (!isDimensionalMetric(metric)) {
return createMetric(name, metric.description, metric.baseUnit, await metric.value(), []);
}
if (!dimension) {
const aggregatePromises = Object.values(metric.dimensions).map(dimension => dimension.value());
const aggregateValue = sum(await Promise.all(aggregatePromises));
return createMetric(name, metric.description, metric.baseUnit, aggregateValue, Object.keys(metric.dimensions));
}
const foundDimension = metric.dimensions[dimension];
if (foundDimension) {
return createMetric(name, foundDimension.description, metric.baseUnit, await foundDimension.value(), []);
}
notFound();
};
export const handleMetric = (name, metric) => {
return async (req) => {
const dimension = req.nextUrl.searchParams.get('dimension');
return Response.json(await evaluateMetric(name, metric, dimension), { status: 200 });
};
};
//# sourceMappingURL=handle-metric.js.map