UNPKG

@npiesco/absurder-sql

Version:

High-performance SQLite for browsers with IndexedDB persistence. Export/import databases, multi-tab coordination, dual-mode (browser + native).

353 lines (341 loc) 14.2 kB
/* tslint:disable */ /* eslint-disable */ export function init_logger(): void; export interface DatabaseError { code: string; message: string; sql: string | null; } export type IsolationLevel = "ReadUncommitted" | "ReadCommitted" | "RepeatableRead" | "Serializable"; export interface DatabaseConfig { name: string; version: number | null; cache_size: number | null; page_size: number | null; auto_vacuum: boolean | null; journal_mode: string | null; max_export_size_bytes: number | null; } export interface Row { values: ColumnValue[]; } export type ColumnValue = { type: "Null" } | { type: "Integer"; value: number } | { type: "Real"; value: number } | { type: "Text"; value: string } | { type: "Blob"; value: number[] } | { type: "Date"; value: number } | { type: "BigInt"; value: string }; export interface QueryResult { columns: string[]; rows: Row[]; affectedRows: number; lastInsertId: number | null; executionTimeMs: number; } export interface TransactionOptions { isolation_level: IsolationLevel; timeout_ms: number | null; } export class Database { private constructor(); free(): void; [Symbol.dispose](): void; /** * Queue a write operation to be executed by the leader * * Non-leader tabs can use this to request writes from the leader. * The write is forwarded via BroadcastChannel and executed by the leader. * * # Arguments * * `sql` - SQL statement to execute (must be a write operation) * * # Returns * Result indicating success or failure */ queueWrite(sql: string): Promise<void>; /** * Export database to SQLite .db file format * * Returns the complete database as a Uint8Array that can be downloaded * or saved as a standard SQLite .db file. * * # Example * ```javascript * const dbBytes = await db.exportToFile(); * const blob = new Blob([dbBytes], { type: 'application/x-sqlite3' }); * const url = URL.createObjectURL(blob); * const a = document.createElement('a'); * a.href = url; * a.download = 'database.db'; * a.click(); * ``` */ exportToFile(): Promise<Uint8Array>; isLeader(): Promise<any>; /** * Delete a database from storage * * Removes database from both STORAGE_REGISTRY and GLOBAL_STORAGE */ static deleteDatabase(name: string): Promise<void>; /** * Get leader information */ getLeaderInfo(): Promise<any>; /** * Import SQLite database from .db file bytes * * Replaces the current database contents with the imported data. * This will close the current database connection and clear all existing data. * * # Arguments * * `file_data` - SQLite .db file as Uint8Array * * # Returns * * `Ok(())` - Import successful * * `Err(JsValue)` - Import failed (invalid file, validation error, etc.) * * # Example * ```javascript * // From file input * const fileInput = document.getElementById('dbFile'); * const file = fileInput.files[0]; * const arrayBuffer = await file.arrayBuffer(); * const uint8Array = new Uint8Array(arrayBuffer); * * await db.importFromFile(uint8Array); * * // Database is immediately usable after import (no reopen needed) * const result = await db.execute('SELECT * FROM imported_table'); * ``` * * # Warning * This operation is destructive and will replace all existing database data. */ importFromFile(file_data: Uint8Array): Promise<void>; /** * Get all database names stored in IndexedDB * * Returns an array of database names (sorted alphabetically) */ static getAllDatabases(): Promise<any>; /** * Check if optimistic mode is enabled */ isOptimisticMode(): Promise<boolean>; /** * Request leadership (triggers re-election check) */ requestLeadership(): Promise<void>; executeWithParams(sql: string, params: any): Promise<any>; onDataChange(callback: Function): void; /** * Wait for this instance to become leader */ waitForLeadership(): Promise<void>; /** * Record a write conflict (non-leader write attempt) */ recordWriteConflict(): Promise<void>; /** * Force close connection and remove from pool (for test cleanup) */ forceCloseConnection(): Promise<void>; /** * Track an optimistic write */ trackOptimisticWrite(sql: string): Promise<string>; /** * Allow non-leader writes (for single-tab apps or testing) */ allowNonLeaderWrites(allow: boolean): Promise<void>; /** * Clear all optimistic writes */ clearOptimisticWrites(): Promise<void>; /** * Record a follower refresh */ recordFollowerRefresh(): Promise<void>; /** * Get coordination metrics as JSON string */ getCoordinationMetrics(): Promise<string>; /** * Get count of pending writes */ getPendingWritesCount(): Promise<number>; /** * Queue a write operation with a specific timeout * * # Arguments * * `sql` - SQL statement to execute * * `timeout_ms` - Timeout in milliseconds */ queueWriteWithTimeout(sql: string, timeout_ms: number): Promise<void>; /** * Record a leadership change */ recordLeadershipChange(became_leader: boolean): Promise<void>; /** * Enable or disable optimistic updates mode */ enableOptimisticUpdates(enabled: boolean): Promise<void>; /** * Reset all coordination metrics */ resetCoordinationMetrics(): Promise<void>; /** * Enable or disable coordination metrics tracking */ enableCoordinationMetrics(enabled: boolean): Promise<void>; /** * Record a notification latency in milliseconds */ recordNotificationLatency(latency_ms: number): Promise<void>; /** * Check if coordination metrics tracking is enabled */ isCoordinationMetricsEnabled(): Promise<boolean>; sync(): Promise<void>; close(): Promise<void>; execute(sql: string): Promise<any>; static newDatabase(name: string): Promise<Database>; /** * Check if this instance is the leader (non-wasm version for internal use/tests) */ is_leader(): Promise<boolean>; /** * Test method for concurrent locking - simple increment counter */ testLock(value: number): Promise<number>; /** * Get the database name */ readonly name: string; } export class WasmColumnValue { private constructor(); free(): void; [Symbol.dispose](): void; static createBlob(value: Uint8Array): WasmColumnValue; static createDate(timestamp: number): WasmColumnValue; static createNull(): WasmColumnValue; static createReal(value: number): WasmColumnValue; static createText(value: string): WasmColumnValue; static createBigInt(value: string): WasmColumnValue; static fromJsValue(value: any): WasmColumnValue; static createInteger(value: bigint): WasmColumnValue; static blob(value: Uint8Array): WasmColumnValue; static date(timestamp_ms: number): WasmColumnValue; static null(): WasmColumnValue; static real(value: number): WasmColumnValue; static text(value: string): WasmColumnValue; static big_int(value: string): WasmColumnValue; static integer(value: number): WasmColumnValue; } export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; export interface InitOutput { readonly memory: WebAssembly.Memory; readonly __wbg_database_free: (a: number, b: number) => void; readonly __wbg_wasmcolumnvalue_free: (a: number, b: number) => void; readonly database_allowNonLeaderWrites: (a: number, b: number) => any; readonly database_clearOptimisticWrites: (a: number) => any; readonly database_close: (a: number) => any; readonly database_deleteDatabase: (a: number, b: number) => any; readonly database_enableCoordinationMetrics: (a: number, b: number) => any; readonly database_enableOptimisticUpdates: (a: number, b: number) => any; readonly database_execute: (a: number, b: number, c: number) => any; readonly database_executeWithParams: (a: number, b: number, c: number, d: any) => any; readonly database_exportToFile: (a: number) => any; readonly database_forceCloseConnection: (a: number) => any; readonly database_getAllDatabases: () => any; readonly database_getCoordinationMetrics: (a: number) => any; readonly database_getLeaderInfo: (a: number) => any; readonly database_getPendingWritesCount: (a: number) => any; readonly database_importFromFile: (a: number, b: any) => any; readonly database_isCoordinationMetricsEnabled: (a: number) => any; readonly database_isLeader: (a: number) => any; readonly database_isOptimisticMode: (a: number) => any; readonly database_is_leader: (a: number) => any; readonly database_name: (a: number) => [number, number]; readonly database_newDatabase: (a: number, b: number) => any; readonly database_onDataChange: (a: number, b: any) => [number, number]; readonly database_queueWrite: (a: number, b: number, c: number) => any; readonly database_queueWriteWithTimeout: (a: number, b: number, c: number, d: number) => any; readonly database_recordFollowerRefresh: (a: number) => any; readonly database_recordLeadershipChange: (a: number, b: number) => any; readonly database_recordNotificationLatency: (a: number, b: number) => any; readonly database_recordWriteConflict: (a: number) => any; readonly database_requestLeadership: (a: number) => any; readonly database_resetCoordinationMetrics: (a: number) => any; readonly database_sync: (a: number) => any; readonly database_testLock: (a: number, b: number) => any; readonly database_trackOptimisticWrite: (a: number, b: number, c: number) => any; readonly database_waitForLeadership: (a: number) => any; readonly init_logger: () => void; readonly wasmcolumnvalue_big_int: (a: number, b: number) => number; readonly wasmcolumnvalue_blob: (a: number, b: number) => number; readonly wasmcolumnvalue_createBigInt: (a: number, b: number) => number; readonly wasmcolumnvalue_createBlob: (a: number, b: number) => number; readonly wasmcolumnvalue_createDate: (a: number) => number; readonly wasmcolumnvalue_createInteger: (a: bigint) => number; readonly wasmcolumnvalue_createNull: () => number; readonly wasmcolumnvalue_createReal: (a: number) => number; readonly wasmcolumnvalue_createText: (a: number, b: number) => number; readonly wasmcolumnvalue_fromJsValue: (a: any) => number; readonly wasmcolumnvalue_integer: (a: number) => number; readonly wasmcolumnvalue_date: (a: number) => number; readonly wasmcolumnvalue_text: (a: number, b: number) => number; readonly wasmcolumnvalue_real: (a: number) => number; readonly wasmcolumnvalue_null: () => number; readonly rust_sqlite_wasm_shim_acosh: (a: number) => number; readonly rust_sqlite_wasm_shim_asinh: (a: number) => number; readonly rust_sqlite_wasm_shim_atanh: (a: number) => number; readonly rust_sqlite_wasm_shim_calloc: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_free: (a: number) => void; readonly rust_sqlite_wasm_shim_localtime: (a: number) => number; readonly rust_sqlite_wasm_shim_malloc: (a: number) => number; readonly rust_sqlite_wasm_shim_memchr: (a: number, b: number, c: number) => number; readonly rust_sqlite_wasm_shim_realloc: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_sqrt: (a: number) => number; readonly rust_sqlite_wasm_shim_strchr: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_strcmp: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_strcspn: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_strncmp: (a: number, b: number, c: number) => number; readonly rust_sqlite_wasm_shim_strrchr: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_strspn: (a: number, b: number) => number; readonly rust_sqlite_wasm_shim_trunc: (a: number) => number; readonly sqlite3_os_init: () => number; readonly wasm_bindgen__convert__closures_____invoke__h6abecb241d1738b0: (a: number, b: number) => void; readonly wasm_bindgen__closure__destroy__h47d289641270ee29: (a: number, b: number) => void; readonly wasm_bindgen__convert__closures_____invoke__h2c2a1ce572f368db: (a: number, b: number, c: any) => void; readonly wasm_bindgen__convert__closures_____invoke__h6867d68f48037fa4: (a: number, b: number, c: any) => any; readonly wasm_bindgen__closure__destroy__h6182d69b68c5e453: (a: number, b: number) => void; readonly wasm_bindgen__convert__closures_____invoke__h7f337ef9eafd31ce: (a: number, b: number, c: any) => void; readonly wasm_bindgen__closure__destroy__hd6eb0d215b976ad9: (a: number, b: number) => void; readonly wasm_bindgen__convert__closures_____invoke__h11d242e614582409: (a: number, b: number, c: any) => void; readonly wasm_bindgen__convert__closures_____invoke__h1ad58e6badc0dc17: (a: number, b: number, c: any, d: any) => void; readonly __wbindgen_malloc: (a: number, b: number) => number; readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; readonly __wbindgen_exn_store: (a: number) => void; readonly __externref_table_alloc: () => number; readonly __wbindgen_externrefs: WebAssembly.Table; readonly __externref_table_dealloc: (a: number) => void; readonly __wbindgen_free: (a: number, b: number, c: number) => void; readonly __wbindgen_start: () => void; } export type SyncInitInput = BufferSource | WebAssembly.Module; /** * Instantiates the given `module`, which can either be bytes or * a precompiled `WebAssembly.Module`. * * @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. * * @returns {InitOutput} */ export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; /** * If `module_or_path` is {RequestInfo} or {URL}, makes a request and * for everything else, calls `WebAssembly.instantiate` directly. * * @param {{ module_or_path: InitInput | Promise<InitInput> }} module_or_path - Passing `InitInput` directly is deprecated. * * @returns {Promise<InitOutput>} */ export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise<InitInput> } | InitInput | Promise<InitInput>): Promise<InitOutput>;