import { TypedEmitter } from "tiny-typed-emitter";
import type { types } from "@constl/ipa";
import { MessageActionDIpa, MessageConfirmationRéceptionRetourDIpa, MessageDIpa, MessageErreurDIpa, MessagePourIpa, MessageSuivrePrêtDIpa } from "./messages.js";
interface Tâche {
    idRequête: string;
    fSuivre: types.schémaFonctionSuivi<unknown>;
    fRetour: (fonction: string, args?: unknown[]) => Promise<void>;
}
declare class Callable extends Function {
    constructor();
}
export type ErreurMandataire = {
    code: string;
    erreur: string;
    idRequête?: string;
};
type ÉvénementsMandataire = {
    erreur: (e: ErreurMandataire) => void;
};
export declare abstract class Mandatairifiable extends Callable {
    dernièreErreur?: ErreurMandataire;
    événements: TypedEmitter<ÉvénementsMandataire>;
    événementsInternes: TypedEmitter<{
        [id: string]: (x: MessageActionDIpa | MessageSuivrePrêtDIpa | MessageErreurDIpa | MessageConfirmationRéceptionRetourDIpa) => void;
    }>;
    tâches: {
        [key: string]: Tâche;
    };
    constructor();
    __call__(fonction: string[], args?: {
        [key: string]: unknown;
    }): Promise<unknown>;
    appelerFonctionSuivre(idRequête: string, fonction: string[], args: {
        [key: string]: unknown;
    }, nomArgFonction: string): Promise<types.schémaFonctionOublier | {
        [key: string]: (...args: unknown[]) => void;
    }>;
    appelerFonctionAction<T>(idRequête: string, fonction: string[], args: {
        [key: string]: unknown;
    }): Promise<T>;
    erreur({ erreur, code, idRequête, }: {
        erreur: string;
        code: string;
        idRequête?: string;
    }): void;
    oublierTâche(idRequête: string): Promise<void>;
    abstract envoyerMessageÀIpa(message: MessagePourIpa): void;
    recevoirMessageDIpa(message: MessageDIpa): Promise<void>;
    suivreErreurs({ f, }: {
        f: (x: ErreurMandataire | undefined) => void;
    }): types.schémaFonctionOublier;
}
export type MandataireConstellation<T> = Required<T> & Mandatairifiable;
export declare const générerMandataire: <T>(mandataireClient: Mandatairifiable) => MandataireConstellation<T>;
export {};
