import type { DatabaseSync } from "node:sqlite"; import { type Operation } from "effection"; export interface SavepointTransaction { readonly open: boolean; } export interface SavepointTransactionController { validate(transaction: SavepointTransaction): void; poison(transaction: SavepointTransaction, failure: unknown): void; afterRollback(transaction: SavepointTransaction): void; } export interface SavepointManager { synchronous(transaction: SavepointTransaction, body: () => T): T; operation(transaction: SavepointTransaction, body: Operation): Operation; /** * Run `body` and discard everything it wrote, however it ends. * * For work whose whole product is outside this database — reading the * Workspace as a retained root held it, by materializing that root and * exporting from it. The materialization is a means, not a result, so there * is no path on which it commits: success rolls back exactly as failure and * cancellation do. */ rollbackOnly(transaction: SavepointTransaction, body: Operation): Operation; } export interface SavepointObservationEvent { readonly kind: "create" | "release" | "rollback"; readonly name: string; } export type SavepointObserver = (event: SavepointObservationEvent) => void; export declare const SavepointObservation: import("effection").Context; export declare function createSavepointManager(database: DatabaseSync, transactions: SavepointTransactionController, observe?: SavepointObserver): SavepointManager;