import type ClientBase from "@tai-kun/surrealdb/basic-client";
import type { ClientCloseOptions, ClientConfig } from "@tai-kun/surrealdb/basic-client";
import { type CreateSurqlConfig, type Surql } from "./surql/create-surql";
type ClientConstructor = new (config: ClientConfig) => ClientBase;
/**
 * @experimental
 */
export interface PoolSetupOptions {
    readonly signal?: AbortSignal | undefined;
}
type Alias = {
    readonly [name: string]: string | URL;
};
/**
 * @experimental
 */
export interface PoolInit<TClientConstructor extends ClientConstructor, TAlias extends Alias> extends ClientConfig, CreateSurqlConfig {
    readonly Client: TClientConstructor;
    readonly alias?: TAlias | undefined;
    readonly setup?: (this: InstanceType<TClientConstructor>, endpoint: URL, options: PoolSetupOptions, alias: keyof TAlias | undefined) => PromiseLike<void>;
}
/**
 * @experimental
 */
export type PoolSurreal<TClientConstructor extends ClientConstructor> = InstanceType<TClientConstructor> & Disposable & {
    disconnect(options?: ClientCloseOptions | undefined): void;
};
type Endpoint<TAlias extends Alias> = Extract<keyof TAlias, string>;
/**
 * @experimental
 */
export interface PoolInstance<TClientConstructor extends ClientConstructor, TAlias extends Alias> extends AsyncDisposable {
    get(endpoint: Endpoint<TAlias> | URL, options?: PoolSetupOptions | undefined): Promise<PoolSurreal<TClientConstructor>>;
    close(endpoint: Endpoint<TAlias> | URL, options?: ClientCloseOptions | undefined): Promise<void>;
    closeAll(options?: ClientCloseOptions | undefined): Promise<void>;
}
/**
 * @experimental
 */
export interface PoolOptions<TClientConstructor extends ClientConstructor, TAlias extends Alias> {
    readonly alias?: TAlias | undefined;
    readonly setup?: PoolInit<TClientConstructor, TAlias>["setup"];
    readonly closeDelay?: number | undefined;
}
/**
 * @experimental
 */
export interface InitializedPool<TClientConstructor extends ClientConstructor, TAlias extends Alias> {
    Pool: new <const TPoolAlias extends Alias = {}>(options?: PoolOptions<TClientConstructor, TPoolAlias> | undefined) => PoolInstance<TClientConstructor, Omit<TAlias, keyof TPoolAlias> & TPoolAlias>;
    surql: Surql;
}
/**
 * @experimental
 */
export default function initPool<TClientConstructor extends ClientConstructor, const TAlias extends Alias = {}>(init: PoolInit<TClientConstructor, TAlias>): InitializedPool<TClientConstructor, TAlias>;
export {};
//# sourceMappingURL=init-pool.d.ts.map