53 lines · 2.1 KB · TypeScript
RawDownload
import type { UsageStats } from "@local-studio/contracts/usage";import { Effect } from "effect";import { observeControllerFunction } from "../../core/function-observability";import { documentRoute, defineRoutes, mergeRoutes } from "../../http/route-registrar";import { effectHandler } from "../../http/effect-handler";import type { AppContext } from "../../app-context";import { emptyResponse } from "./usage/usage-utilities"; const USAGE_CACHE_TTL_MS = 15_000; const withControllerUsage = (  context: AppContext,  body: UsageStats,  includeController: boolean,): Effect.Effect<UsageStats, unknown> =>  includeController    ? context.stores.controllerRequestStore        .aggregateEffect()        .pipe(Effect.map((controller) => ({ ...body, controller })))    : Effect.succeed(body); export const registerUsageRoutes = defineRoutes((app, context) => {  let usageCache: { at: number; body: UsageStats } | null = null;   return mergeRoutes(    app.get(      "/usage",      documentRoute,      effectHandler((ctx) => {        const includeController = ctx.req.query("include_controller") === "true";        const usageEffect = Effect.gen(function* () {          if (usageCache && Date.now() - usageCache.at < USAGE_CACHE_TTL_MS) {            return yield* withControllerUsage(context, usageCache.body, includeController);          }          const usage = yield* observeControllerFunction(            context,            "usage.aggregateInferenceRequests",            () => context.stores.inferenceRequestStore.aggregateEffect(),          );          const body: UsageStats = usage ?? emptyResponse();          usageCache = { at: Date.now(), body };          return yield* withControllerUsage(context, body, includeController);        }).pipe(          Effect.catch((error) => {            context.logger.error(`[Usage] Error fetching usage stats: ${(error as Error).message}`);            return withControllerUsage(context, emptyResponse(), includeController);          }),        );        return usageEffect.pipe(Effect.map((body) => ctx.json(body)));      }),    ),  );});