import { ShortlinksDatabase } from "./database.js"; import { type ConfigEnv } from "./config.js"; import { type SlugTokenFactory } from "./slug.js"; import type { AddDomainInput, Click, ClickInput, CreateLinkInput, Domain, Link, LinkStats } from "./types.js"; export interface ShortlinksStoreOptions { /** Injectable only for deterministic collision tests; production uses cryptographic randomness. */ tokenFactory?: SlugTokenFactory; /** Optional operator-managed fallback domain; omitted means no implicit domain. */ managedDefaultDomain?: string; /** Additional product-specific reserved root slugs. */ reservedSlugs?: Iterable; } export declare class ShortlinksStore { readonly database: ShortlinksDatabase; /** The env the store was built with: every app-home read (config, machine id, click salt) follows it. */ private readonly env; private readonly tokenFactory; private readonly managedDefaultDomain; private readonly reservedSlugs; constructor(dbPath?: string, env?: ConfigEnv, options?: ShortlinksStoreOptions); close(): void; addDomain(input: AddDomainInput): Domain; listDomains(): Domain[]; getDomain(hostnameOrId: string): Domain | null; deleteDomain(hostnameOrId: string): Domain; getDefaultDomain(): Domain | null; private ensureDefaultDomain; createLink(input: CreateLinkInput): Link; listLinks(options?: { domain?: string; activeOnly?: boolean; limit?: number; }): Link[]; getLink(domainOrSlug: string, maybeSlug?: string): Link | null; resolve(hostname: string, slug: string): Link | null; setLinkActive(domainOrSlug: string, maybeSlugOrActive: string | boolean, maybeActive?: boolean): Link; deleteLink(domainOrSlug: string, maybeSlug?: string): Link; recordClick(link: Link, input?: ClickInput): Click; getStats(domainOrSlug: string, maybeSlug?: string): LinkStats; totalStats(): { domains: number; links: number; clicks: number; }; private hashIp; }