import type { MetricsSchema, MetricsStore } from "./index.js"; import { type ActiveActors, type Audience, type DailyMetric, type MetricsReport } from "./report.js"; export type SqlValue = string | number; export interface SqlStatement { sql: string; args: SqlValue[]; } /** Reads need one verb. `metrics/d1-rest` is a reader only: a REST call cannot transact. */ export interface MetricsReader { /** The rows of one read statement. */ query(statement: SqlStatement): Promise>>; } /** * The SQLite dialect below needs exactly two verbs from a store. `metrics/libsql` and * `metrics/d1` implement them with each driver's native calls; any driver that speaks * SQLite (node:sqlite, bun:sqlite, better-sqlite3) does the same in a few lines. */ export interface MetricsDriver extends MetricsReader { /** Every statement or none: a constraint failure in any of them rolls the batch back. */ transact(statements: SqlStatement[]): Promise; } /** * Every table the store touches: what an ingestion credential must be granted * (read, add, update; never delete) and what a report credential reads. */ export declare const METRICS_TABLES: readonly ["metric_definition", "metric_project", "metric_daily", "metric_user_daily"]; /** Run explicitly during provisioning, never on a user's request. */ export declare const METRICS_SCHEMA: readonly ["CREATE TABLE IF NOT EXISTS metric_definition (project TEXT NOT NULL, key TEXT NOT NULL, kind TEXT NOT NULL, label TEXT NOT NULL, help TEXT NOT NULL, unit TEXT NOT NULL, per_user INTEGER NOT NULL, PRIMARY KEY(project, key))", "CREATE TABLE IF NOT EXISTS metric_project (project TEXT NOT NULL, overlaps TEXT NOT NULL, PRIMARY KEY(project))", "CREATE TABLE IF NOT EXISTS metric_daily (project TEXT NOT NULL, key TEXT NOT NULL, dimensions TEXT NOT NULL, day TEXT NOT NULL, count INTEGER NOT NULL CHECK(count >= 0), sum REAL NOT NULL CHECK(sum >= 0), PRIMARY KEY(project, key, dimensions, day))", "CREATE TABLE IF NOT EXISTS metric_user_daily (project TEXT NOT NULL, key TEXT NOT NULL, dimensions TEXT NOT NULL, day TEXT NOT NULL, user TEXT NOT NULL, count INTEGER NOT NULL CHECK(count >= 0), sum REAL NOT NULL CHECK(sum >= 0), PRIMARY KEY(project, key, dimensions, day, user))", "CREATE INDEX IF NOT EXISTS metric_user_identity ON metric_user_daily(project, user)"]; /** One project's store over a SQLite driver. */ export declare function metricsStore(driver: MetricsDriver, project: string): MetricsStore; /** What one project declared, as the store holds it: the reader needs no declaring code. */ export declare function readSchema(reader: MetricsReader, project: string): Promise; /** Inclusive UTC dates. Errors propagate: unavailable data must never read as zero. */ export declare function readMetrics(reader: MetricsReader, range: { from: string; to: string; project?: string; }): Promise; /** * Who did it, over one project's opt-in per-user rows, all dimensions folded: one row per * declared per-user metric (zeros when nobody touched it in the window) with distinct * actors, actors with more than one sample on a single day, actors seen on more than one * day; then every declared unordered overlap. */ export declare function readAudience(reader: MetricsReader, range: { from: string; to: string; project: string; }, schema: MetricsSchema): Promise; /** * Distinct actors per day and over the window, every per-user key, one project or all: * the daily-active and window-active figures a distribution report shows. */ export declare function readActive(reader: MetricsReader, range: { from: string; to: string; project?: string; }): Promise; /** Everything a panel renders for one project over the last `days` UTC days, in one call. */ export declare function readReport(reader: MetricsReader, options: { project: string; days: number; includeToday?: boolean; now?: Date; }): Promise; //# sourceMappingURL=sqlite.d.ts.map