/// <reference types="node" />
import { EventEmitter } from 'events';
import { Brolog } from 'brolog';
export declare const log: Brolog;
export declare const VERSION: any;
export declare type WatchdogEvent = 'feed' | 'reset' | 'sleep';
export declare type WatchdogListener<T, D> = (food: WatchdogFood<T, D>, time: number) => void;
export interface WatchdogFood<T = any, D = any> {
    data: D;
    timeout?: number;
    type?: T;
}
export declare class Watchdog<T = any, D = any> extends EventEmitter {
    defaultTimeout: number;
    name: string;
    private timer;
    private lastFeed?;
    private lastFood?;
    /**
     * A Timer used to detect and recover from malfunctions
     *
     * @class Watchdog
     * @param {number} [defaultTimeout=60 * 1000]
     * @param {string} [name='Bark']
     * @example
     * const TIMEOUT = 1 * 1000  // 1 second
     * const dog = new watchdog(TIMEOUT)
     *
     * const food = { data: 'delicious' }
     *
     * dog.on('reset', () => console.log('reset-ed'))
     * dog.on('feed',  () => console.log('feed-ed'))
     *
     * dog.feed(food)
     * // Output: feed-ed
     *
     * setTimeout(function() {
     *   dog.sleep()
     *   console.log('dog sleep-ed. Demo over.')
     * }, TIMEOUT + 1)
     * // Output: reset-ed.
     * // Output: dog sleep-ed. Demo over.
     *
     */
    constructor(defaultTimeout?: number, name?: string);
    version(): string;
    on(event: 'feed', listener: WatchdogListener<T, D>): this;
    on(event: 'reset', listener: WatchdogListener<T, D>): this;
    on(event: 'sleep', listener: WatchdogListener<T, D>): this;
    on(event: never, listener: never): never;
    private startTimer;
    private stopTimer;
    /**
     * Get the left time
     * @returns {number}
     */
    left(): number;
    /**
     * Dog Feed content
     *
     * @typedef    WatchdogFood
     * @property   {D}      data     - feed content.
     * @property   {number} timeout  - option, set timeout.
     * @property   {T}      type     - option.
     */
    /**
     * feed the dog
     * @param {WatchdogFood} food
     * @returns {number}
     * @example
     * const food = {
     *   data:    'delicious',
     *   timeout: 1 * 1000,
     * }
     * const dog = new Watchdog()
     * dog.feed(food)
     */
    feed(food: WatchdogFood<T, D>): number;
    /**
     * Clear timer.
     * @example
     * const dog = new Watchdog()
     * dog.sleep()
     */
    sleep(): void;
    /**
     *
     */
    unref(): void;
}
export default Watchdog;
