declare const getBitwiseDistance: (a: Uint8Array, b: Uint8Array, byteLength?: number) => number;

declare namespace KademliaTable {
    interface Options<Node> {
        bucketSize?: number;
        errorLimit?: number;
        getId: (node: Node) => Uint8Array;
    }
    interface Bucket<T> {
        items: Array<Item<T>>;
        replacementItems: Array<Item<T>>;
    }
    interface Item<T> {
        node: T;
        errorCount: number;
    }
}
declare class KademliaTable<T> {
    readonly id: Uint8Array;
    readonly bucketSize: number;
    readonly buckets: Array<KademliaTable.Bucket<T>>;
    readonly errorLimit: number;
    getId: (node: T) => Uint8Array;
    constructor(id: Uint8Array, options: KademliaTable.Options<T>);
    get length(): number;
    [Symbol.iterator](): IterableIterator<T>;
    add(node: T, d?: number): boolean;
    clear(): void;
    iterateClosestToId(id: Uint8Array): IterableIterator<T>;
    listClosestToId(id: Uint8Array, limit?: number): Array<T>;
    get(id: Uint8Array, d?: number): T | undefined;
    getBucket(d: number): KademliaTable.Bucket<T> | undefined;
    getDistance(id: Uint8Array): number;
    protected iterateNodes(id: Uint8Array, d?: number): IterableIterator<T>;
    protected listNodes(id: Uint8Array, d?: number, limit?: number): Array<T>;
    has(id: Uint8Array, d?: number): boolean;
    markError(id: Uint8Array, d?: number): boolean;
    markSuccess(id: Uint8Array, d?: number): boolean;
    update(node: T, d?: number): boolean;
    remove(id: Uint8Array, d?: number, force?: boolean): boolean;
}

export { KademliaTable, getBitwiseDistance };
