/**
 * @author Martin Karkowski
 * @email m.karkowski@zema.de
 */
/// <reference types="node" />
import { EventEmitter } from "events";
import { ILogger } from "js-logger";
import { ValidLoggerDefinition } from "../logger/index.browser";
import { Eventname, EventnameToEventType, ICommunicationBridge, ICommunicationInterface, INopeObservable } from "../types/nope";
export declare class Bridge implements ICommunicationBridge {
    connected: INopeObservable<boolean>;
    considerConnection: boolean;
    ownDispatcherId: string;
    id: string;
    protected _useInternalEmitter: boolean;
    protected _logger: ILogger;
    protected _internalEmitter: EventEmitter;
    protected _layers: Map<string, {
        layer: ICommunicationInterface;
        considerConnection: boolean;
        forwardData: boolean;
    }>;
    protected _callbacks: Map<Eventname, Array<(...args: any[]) => any>>;
    /**
     * Creates an instance of Bridge.
     * @param {*} [id=generateId()] The ID. (this can be adapted later and is only used to simplify debugging)
     * @param {string} [loggerName="bridge"] The Name of the Logger.
     * @param {LoggerLevel} [level="info"] The Level of the Logger.
     * @memberof Bridge
     */
    constructor(id?: string, logger?: ValidLoggerDefinition);
    on<T extends keyof EventnameToEventType>(eventname: T, cb: (data: EventnameToEventType[T]) => void): Promise<void>;
    emit<T extends keyof EventnameToEventType>(eventname: T, data: EventnameToEventType[T]): Promise<void>;
    detailListeners(type: "event" | "rpc" | "data" | "response", listeners: string[]): void;
    get receivesOwnMessages(): boolean;
    dispose(): Promise<void>;
    protected _checkInternalEmitter(): void;
    /**
     * Helper Function, which will internally subscribe to the Events of the Layer.
     *
     * @protected
     * @param {ICommunicationInterface} layer The Layer to consinder, on this layer, we will subscribe to the events
     * @param {keyof ICommunicationInterface} method The method used for subscription
     * @param {string} event The name of the Event
     * @param {boolean} forwardData Flag, showing whether data will be forwarded or not.
     * @memberof BridgeV2
     */
    protected _subscribeToCallback(layer: ICommunicationInterface, event: Eventname, forwardData: boolean): void;
    protected _on(event: Eventname, cb: any): void;
    protected _emit(event: Eventname, toExclude: ICommunicationInterface, dataToSend: any, force?: boolean): void;
    addCommunicationLayer(layer: ICommunicationInterface, forwardData?: boolean, considerConnection?: boolean): Promise<void>;
    removeCommunicationLayer(layer: ICommunicationInterface): Promise<void>;
    toDescription(): {
        connected: boolean;
        layers: {
            forwardData: boolean;
            receivesOwnMessages: boolean;
            id: string;
            considerConnection: boolean;
        }[];
    };
}
