import { Logger } from "@libp2p/logger"; import { Awaitable } from "@canvas-js/utils"; import { Config } from "./config.js"; import { ModelValue, Effect, Model, QueryParams, WhereCondition, ModelValueWithIncludes, PrimaryKeyValue, DatabaseAPI, DatabaseUpgradeAPI, ModelSchema } from "./types.js"; export type Subscription = { model: string; query: QueryParams; filter: (effect: Effect) => boolean; callback: (results: ModelValue[] | ModelValueWithIncludes[]) => Awaitable; }; export type ModelDBBackend = "idb" | "postgres" | "sqlite-disk" | "sqlite-memory" | "sqlite-wasm" | "sqlite-expo" | "sqlite-durable-objects"; export type DatabaseUpgradeCallback = (upgradeAPI: DatabaseUpgradeAPI, oldConfig: Config, oldVersion: Record, newVersion: Record) => Awaitable; export interface ModelDBInit { models: ModelSchema; version?: Record; upgrade?: DatabaseUpgradeCallback; initialUpgradeVersion?: Record; initialUpgradeSchema?: ModelSchema; clear?: boolean; } export declare abstract class AbstractModelDB implements DatabaseAPI { #private; readonly config: Config; readonly version: Record; static namespace: string; static version: number; protected static baseVersion: { [x: string]: number; }; readonly models: Record; protected readonly log: Logger; protected readonly subscriptions: Map; protected constructor(config: Config, version: Record); protected static initialize(baseModelDB: DatabaseAPI, timestamp: string, initialVersion: Record, initialConfig: Config): Promise; protected static getVersion(baseModelDB: DatabaseAPI): Promise>; protected static upgrade(baseModelDB: DatabaseAPI, timestamp: string, newVersion: Record, newConfig: Config, upgrade: (oldConfig: Config, oldVersion: Record) => Promise): Promise; protected abstract hasModel(model: Model): Awaitable; protected satisfies(config: Config): Promise; abstract getType(): ModelDBBackend; abstract close(): Promise; abstract get = ModelValue>(modelName: string, key: PrimaryKeyValue | PrimaryKeyValue[]): Promise; abstract getAll = ModelValue>(modelName: string): Promise; abstract getMany = ModelValue>(modelName: string, key: PrimaryKeyValue[] | PrimaryKeyValue[][]): Promise<(T | null)[]>; abstract iterate = ModelValue>(modelName: string, query?: QueryParams): AsyncIterable; abstract query = ModelValue>(modelName: string, query?: QueryParams): Promise; abstract count(modelName: string, where?: WhereCondition): Promise; abstract clear(modelName: string): Promise; abstract apply(effects: Effect[]): Promise; set = ModelValue>(modelName: string, value: T): Promise; delete(modelName: string, key: PrimaryKeyValue | PrimaryKeyValue[]): Promise; update = ModelValue>(modelName: string, value: T): Promise; merge = ModelValue>(modelName: string, value: T): Promise; subscribe(modelName: string, query: QueryParams, callback: (results: ModelValue[] | ModelValueWithIncludes[]) => Awaitable): { id: number; results: Promise; }; unsubscribe(id: number): void; protected getEffectFilter(model: Model, query: QueryParams): (effect: Effect) => boolean; }