import type { MiddlewareHandler } from "hono"; /** Structural sink contract for request metrics. */ export interface AnalyticsEngineDatasetLike { writeDataPoint(point: { blobs?: string[]; doubles?: number[]; indexes?: string[]; }): void; } /** Per-request db-query counter, populated by the db middleware. */ export interface RequestDbMetrics { queries: number; } export declare const DB_METRICS_CONTEXT_KEY = "__voyantDbMetrics"; export interface MetricsMiddlewareOptions { /** Resolve the metrics sink for a request. Returning undefined is a no-op. */ dataset: (env: unknown) => AnalyticsEngineDatasetLike | undefined; } /** * Per-request metrics for an explicitly supplied deployment sink. * * One data point per request: * - blobs: [method, routePattern, surface, cacheStatus] * - doubles: [durationMs, status, dbQueryCount] * - indexes: [routePattern] (AE sampling key — per-route analysis) * * `writeDataPoint` is fire-and-forget and never throws into the * request; a missing binding short-circuits before timing overhead. */ export declare function metrics(options: MetricsMiddlewareOptions): MiddlewareHandler<{ Variables: { [DB_METRICS_CONTEXT_KEY]?: RequestDbMetrics; }; }>; /** * Wrap a drizzle client so top-level query-initiating calls increment * the request counter. Counts `select/insert/update/delete/execute/ * transaction/query` invocations — a transaction counts as ONE (its * inner statements run on the tx handle, which is not wrapped). An * approximation by design: the goal is spotting N+1 routes and * subrequest-budget pressure, not exact accounting. */ export declare function withQueryCounting(db: TDb, counter: RequestDbMetrics): TDb;