@hirosystems/api-toolkit
Version:
API development toolkit
69 lines (68 loc) • 2.95 kB
TypeScript
import { AsyncLocalStorage } from 'async_hooks';
import { PgSqlClient } from '.';
/**
* AsyncLocalStorage used to determine if the current async context is running inside a SQL
* transaction.
*/
export declare const sqlTransactionContext: AsyncLocalStorage<SqlTransactionContext>;
type SqlTransactionContext = {
[dbName: string]: PgSqlClient;
};
type UnwrapPromiseArray<T> = T extends any[] ? {
[k in keyof T]: T[k] extends Promise<infer R> ? R : T[k];
} : T;
/**
* Base class that provides access to a SQL client and SQL transaction management.
*/
export declare abstract class BasePgStore {
/**
* Getter for a SQL client. If used inside `sqlTransaction`, the scoped client within the current
* async context will be returned to guarantee transaction consistency.
*/
get sql(): PgSqlClient;
/** The raw SQL client instance. */
readonly _sql: PgSqlClient;
constructor(sql: PgSqlClient);
close(args?: {
timeout?: number;
}): Promise<void>;
/**
* Start a SQL transaction. If any SQL client used within the callback was already scoped inside a
* `BEGIN` transaction, no new transaction will be opened. This flexibility allows us to avoid
* repeating code while making sure we don't arrive at SQL errors such as
* `WARNING: there is already a transaction in progress` which may cause result inconsistencies.
* @param callback - Callback with a scoped SQL client
* @param readOnly - If a `BEGIN` transaction should be marked as `READ ONLY`
* @returns Transaction results
*/
sqlTransaction<T>(callback: (sql: PgSqlClient) => T | Promise<T>, readOnly?: boolean): Promise<UnwrapPromiseArray<T>>;
/**
* Start a SQL write transaction. See `sqlTransaction`.
* @param callback - Callback with a scoped SQL client
* @returns Transaction results
*/
sqlWriteTransaction<T>(callback: (sql: PgSqlClient) => T | Promise<T>): Promise<UnwrapPromiseArray<T>>;
/**
* Refreshes a materialized view concurrently depending on the current environment.
* @param viewName - Materialized view name
*/
refreshMaterializedView(viewName: string): Promise<void>;
/**
* Checks if the database connection is alive.
* @returns True if connected, false otherwise.
*/
isConnected(): Promise<boolean>;
}
/**
* Base module that extends PgStore functionality and allows organizing queries in separate files.
*/
export declare abstract class BasePgStoreModule {
private readonly parent;
constructor(db: BasePgStore);
protected get sql(): PgSqlClient;
sqlTransaction<T>(callback: (sql: PgSqlClient) => T | Promise<T>, readOnly?: boolean): Promise<UnwrapPromiseArray<T>>;
sqlWriteTransaction<T>(callback: (sql: PgSqlClient) => T | Promise<T>): Promise<UnwrapPromiseArray<T>>;
refreshMaterializedView(viewName: string): Promise<void>;
isConnected(): Promise<boolean>;
}
export {};