import Database from "libsql";
import type { Message, SessionState, MessengerConfig } from "./types.js";
type KeyPairType = {
    pubKey: ArrayBuffer;
    privKey: ArrayBuffer;
};
interface StorageType {
    getIdentityKeyPair(): Promise<KeyPairType | undefined>;
    getLocalRegistrationId(): Promise<number | undefined>;
    isTrustedIdentity(identifier: string, identityKey: ArrayBuffer, direction?: number): Promise<boolean>;
    saveIdentity(encodedAddress: string, publicKey: ArrayBuffer): Promise<boolean>;
    loadIdentity(address: string): Promise<ArrayBuffer | undefined>;
    loadPreKey(keyId: string | number): Promise<KeyPairType | undefined>;
    storePreKey(keyId: string | number, keyPair: KeyPairType): Promise<void>;
    removePreKey(keyId: string | number): Promise<void>;
    loadSignedPreKey(keyId: string | number): Promise<KeyPairType | undefined>;
    storeSignedPreKey(keyId: string | number, keyPair: KeyPairType): Promise<void>;
    removeSignedPreKey(keyId: string | number): Promise<void>;
    loadSession(encodedAddress: string): Promise<string | undefined>;
    storeSession(encodedAddress: string, record: string): Promise<void>;
    removeSession(encodedAddress: string): Promise<void>;
}
export declare function getDatabase(userAddress: string): Database.Database;
export declare function resetDbConnection(): void;
interface PersistedMeta {
    nextPreKeyId: number;
}
export declare class SignalProtocolStorage implements StorageType {
    private storePrefix;
    private userAddress;
    constructor(userAddress: string, storeType?: string);
    private get db();
    setIdentity(identity: KeyPairType, registrationId: number): Promise<void>;
    getIdentityKeyPair(): Promise<KeyPairType | undefined>;
    getLocalRegistrationId(): Promise<number | undefined>;
    isTrustedIdentity(identifier: string, identityKey: ArrayBuffer): Promise<boolean>;
    saveIdentity(encodedAddress: string, publicKey: ArrayBuffer): Promise<boolean>;
    loadIdentity(address: string): Promise<ArrayBuffer | undefined>;
    loadPreKey(keyId: string | number): Promise<KeyPairType | undefined>;
    storePreKey(keyId: string | number, keyPair: KeyPairType): Promise<void>;
    removePreKey(keyId: string | number): Promise<void>;
    loadSignedPreKey(keyId: string | number): Promise<KeyPairType | undefined>;
    storeSignedPreKey(keyId: string | number, keyPair: KeyPairType): Promise<void>;
    removeSignedPreKey(keyId: string | number): Promise<void>;
    loadSignedPreKeyWithSignature(keyId: string | number): Promise<(KeyPairType & {
        signature: ArrayBuffer;
    }) | undefined>;
    storeSignedPreKeyWithSignature(keyId: string | number, keyPair: KeyPairType, signature: ArrayBuffer): Promise<void>;
    loadSession(encodedAddress: string): Promise<string | undefined>;
    storeSession(encodedAddress: string, record: string): Promise<void>;
    removeSession(encodedAddress: string): Promise<void>;
    getMeta(): Promise<PersistedMeta>;
    setMeta(meta: Partial<PersistedMeta>): Promise<void>;
    listPreKeys(): number[];
    private getValue;
    private putValue;
    private delValue;
}
export declare class MessageStorage {
    private userAddress;
    constructor(userAddress: string);
    private get db();
    saveMessage(message: Message): void;
    getMessage(messageId: string): Message | undefined;
    getMessagesBySession(myAddress: string, peerAddress: string): Message[];
    getPendingMessages(myAddress: string): Message[];
    updateMessageStatus(messageId: string, status: Message["status"], updates?: Partial<Message>): void;
    updateMessageViewed(messageId: string, viewedAt?: number): boolean;
    updateMessagesViewed(messageIds: string[], viewedAt?: number): number;
    getAllMessages(userAddress: string): Message[];
    getMessageById(messageId: string): Message | undefined;
    updateMessageId(oldMessageId: string, newMessageId: string, updates?: Partial<Message>): boolean;
    private rowToMessage;
    getLastReceivedLeafIndex(myAddress: string, peerAddress: string): number;
}
export declare class SessionStateStorage {
    private userAddress;
    constructor(userAddress: string);
    private get db();
    private getSessionId;
    getSessionState(myAddress: string, peerAddress: string): SessionState | undefined;
    updateSessionState(myAddress: string, peerAddress: string, updates: Partial<Omit<SessionState, "sessionId" | "myAddress" | "peerAddress">>): void;
    getCurrentRoot(myAddress: string, peerAddress: string): string;
}
export interface PersistedMessengerState {
    version: string;
    accounts: string[];
    config: Partial<MessengerConfig>;
    updatedAt: number;
}
export declare class MessengerPersistStorage {
    private initialized;
    private get db();
    private initTable;
    saveState(instanceId: string, state: PersistedMessengerState): void;
    loadState(instanceId: string): PersistedMessengerState | null;
    deleteState(instanceId: string): void;
    getAllInstanceIds(): string[];
    private get processId();
    tryAcquireSSELock(accountAddress: string, instanceId: string): boolean;
    updateSSELockHeartbeat(accountAddress: string, instanceId: string): void;
    releaseSSELock(accountAddress: string, instanceId: string): void;
    holdsSSELock(accountAddress: string, instanceId: string): boolean;
    tryAcquirePollingLock(accountAddress: string, instanceId: string): boolean;
    updatePollingLockHeartbeat(accountAddress: string, instanceId: string): void;
    releasePollingLock(accountAddress: string, instanceId: string): void;
    holdsPollingLock(accountAddress: string, instanceId: string): boolean;
}
export declare const defaultPersistStorage: MessengerPersistStorage;
export {};
