import { PQSessionCipher } from "./pq/index.js";
import type { PQSessionStore } from "./pq/session.js";
import type { MessengerConfig, RemoteBundle } from "./types.js";
import type { X25519KeyPair } from "./pq/types.js";
export interface LocalIdentity {
    x25519KeyPair: X25519KeyPair;
    registrationId: number;
}
export interface EncryptedMessage {
    type: number;
    body: ArrayBuffer;
    registrationId?: number;
}
export declare class MessengerSession {
    private pqStore;
    private pqCipher;
    private serverClient;
    private config;
    private identity;
    private userAddress;
    constructor(userAddress: string, config?: Partial<MessengerConfig>);
    get store(): PQSessionStore;
    get cipher(): PQSessionCipher;
    ensureIdentity(_userAddress?: string): Promise<LocalIdentity>;
    private deriveRegistrationId;
    registerDevice(userAddress: string): Promise<void>;
    private verifyRegistrationComplete;
    isDeviceRegistered(userAddress: string): Promise<boolean>;
    private generatePreKeyBatch;
    ensurePreKeys(userAddress: string, force?: boolean): Promise<void>;
    private generateNonce;
    establishSession(myAddress: string, peerAddress: string, peerDeviceId?: number, remoteBundle?: RemoteBundle): Promise<void>;
    encryptMessage(myAddress: string, peerAddress: string, plaintext: string, peerDeviceId?: number): Promise<EncryptedMessage>;
    decryptMessage(myAddress: string, peerAddress: string, ciphertext: ArrayBuffer, msgType: number, peerDeviceId?: number): Promise<string>;
    getIdentityKey(): Promise<string>;
    getRegistrationId(): Promise<number>;
}
export interface SessionSnapshot {
    sessionData: string | null;
    timestamp: number;
}
export declare class SessionStateManager {
    private store;
    constructor(store: PQSessionStore);
    snapshotSession(peerAddress: string, peerDeviceId: number): Promise<SessionSnapshot>;
    rollbackSession(peerAddress: string, peerDeviceId: number, snapshot: SessionSnapshot): Promise<void>;
    commitSession(_peerAddress: string, _peerDeviceId: number): Promise<void>;
}
export interface DecryptResult {
    success: boolean;
    plaintext?: string;
    sessionUpdated: boolean;
    sessionRolledBack: boolean;
    messageType: "PREKEY" | "WHISPER";
    error?: string;
}
export declare class DecryptionEngine {
    private sessionManager;
    private store;
    private cipher;
    constructor(store: PQSessionStore);
    decryptMessage(myAddress: string, peerAddress: string, ciphertext: ArrayBuffer, msgType: number, peerDeviceId?: number): Promise<DecryptResult>;
    private handlePreKeyMessage;
    private handleWhisperMessage;
}
