/// <reference types="node" />
import Wire from './Wire';
import { IExtension, ExtensionExtraFields } from './models/IExtension';
import { TypedEmitter, ListenerSignature } from 'tiny-typed-emitter';
export declare type ExtendedHandshakeMessageParams = {
    [key: string]: any;
};
/**
 * http://www.bittorrent.org/beps/bep_0010.html
 */
export declare type ExtendedHandshake = {
    m?: {
        [name: string]: number;
    };
    exts: {
        [extName: string]: ExtensionExtraFields;
    };
} & ExtendedHandshakeMessageParams;
export declare type HandshakeExtensions = {
    [name: string]: boolean;
};
export declare abstract class Extension implements IExtension {
    wire: Wire;
    abstract name: string;
    abstract requirePeer?: boolean;
    extraFields?: ExtensionExtraFields;
    constructor(wire: Wire);
    sendExtendedMessage: (data: object) => void;
    abstract onHandshake: (infoHash: string, peerId: string, extensions: HandshakeExtensions) => void;
    abstract onExtendedHandshake: (handshake: ExtendedHandshake) => void;
    abstract onMessage: (buf: Buffer) => void;
}
export declare abstract class EventExtension<L extends ListenerSignature<L>> extends TypedEmitter<L> implements IExtension {
    wire: Wire;
    abstract name: string;
    abstract requirePeer?: boolean;
    extraFields?: ExtensionExtraFields;
    constructor(wire: Wire);
    sendExtendedMessage: (data: object) => void;
    abstract onHandshake: (infoHash: string, peerId: string, extensions: HandshakeExtensions) => void;
    abstract onExtendedHandshake: (handshake: ExtendedHandshake) => void;
    abstract onMessage: (buf: Buffer) => void;
}
