/**
 * Copyright 2024 Mytra Control S.L. All rights reserved.
 *
 * Use of this source code is governed by an MIT-style license that can be found in the LICENSE file
 * or at https://opensource.org/licenses/MIT.
 */
import { Health, Layer } from '@mdf.js/core';
import { Crash } from '@mdf.js/crash';
import EventEmitter from 'events';
import { Control } from '../../types';
export declare interface ConsumerMap {
    /** Emitted when a producer's operation has some problem */
    on(event: 'error', listener: (error: Crash | Error) => void): this;
    /** Emitted on every state change */
    on(event: 'status', listener: (status: Health.Status) => void): this;
    /** Emitted when new nodes are included included map */
    on(event: 'new', listener: (nodes: string[]) => void): this;
    /** Emitted when some nodes has been aged */
    on(event: 'aged', listener: (nodes: string[]) => void): this;
    /** Emitted when nodes are updated */
    on(event: 'update', listener: (nodes: string[]) => void): this;
    /** Emitted when the consumer has been updated */
    on(event: 'updated', listener: (nodes: string[]) => void): this;
}
export declare class ConsumerMap extends EventEmitter implements Layer.App.Resource {
    readonly name: string;
    private readonly agingInterval;
    private readonly maxAge;
    /** Flag to indicate that an unhealthy status has been emitted recently */
    private lastStatusEmitted?;
    /** Component identification */
    readonly componentId: string;
    /** Consumer Map */
    private readonly map;
    /** Aging timer  */
    private agingTimer?;
    /**
     * Create a new instance of the consumer map
     * @param name - name of the producer
     * @param agingInterval - agingInterval to update the consumer map
     * @param maxAge - Max allowed age in in milliseconds for a table entry
     */
    constructor(name: string, agingInterval: number, maxAge: number);
    /** Get the actual nodes */
    get nodes(): Control.Response[];
    /**
     * Returns the grouped features of all the consumer in the map
     * @returns
     */
    getGroupedFeatures(): {
        pairs: Control.ActionTargetPairs;
        profiles: string[];
    };
    /**
     * Return the consumers identifiers that has the indicated action/target pair
     * @param action - action to search
     * @param target - target requested
     */
    getConsumersWithPair(action: string, target: string): string[];
    /**
     * Perform the update of the health map
     * @param responses - responses to update the consumer map
     */
    update(responses: Control.ResponseMessage[]): void;
    /**
     * Get one node from the map
     * @param consumerId - consumer id to get the status
     * @returns
     */
    getNode(consumerId: string): Health.Check<Control.Response> | undefined;
    /** Return the state of all the underlying consumers */
    get checks(): Health.Checks<Control.Response>;
    /** Perform the aging of the consumer map */
    private readonly aging;
    /**
     * Update the consumer map with a new response
     * @param response - response to update the consumer map
     */
    private updateEntry;
    /** Overall component status */
    get status(): Health.Status;
    /** Emit the status if it's different from the last emitted status */
    private emitStatus;
    /** Clean the nodes map */
    clear(): void;
    /** Fake start method used to implement the Resource interface */
    start(): Promise<void>;
    /** Fake stop method used to implement the Resource interface */
    stop(): Promise<void>;
    /** Fake close method used to implement the Resource interface */
    close(): Promise<void>;
}
//# sourceMappingURL=ConsumerMap.d.ts.map