import { PeerId, TopicValidatorResult } from "@libp2p/interface";
import { RootHex, phase0 } from "@lodestar/types";
import { BlockInput, NullBlockInput } from "../chain/blocks/types.js";
import { PeerIdStr } from "../util/peerId.js";
import { StrictEventEmitterSingleArg } from "../util/strictEvents.js";
import { EventDirection } from "../util/workerEvents.js";
import { PendingGossipsubMessage } from "./processor/types.js";
import { RequestTypedContainer } from "./reqresp/ReqRespBeaconNode.js";
export declare enum NetworkEvent {
    /** A relevant peer has connected or has been re-STATUS'd */
    peerConnected = "peer-manager.peer-connected",
    /** A peer has been disconnected */
    peerDisconnected = "peer-manager.peer-disconnected",
    reqRespRequest = "req-resp.request",
    unknownBlockParent = "unknownBlockParent",
    unknownBlock = "unknownBlock",
    unknownBlockInput = "unknownBlockInput",
    /** (Network -> App) A gossip message is ready for validation */
    pendingGossipsubMessage = "gossip.pendingGossipsubMessage",
    /** (App -> Network) A gossip message has been validated */
    gossipMessageValidationResult = "gossip.messageValidationResult"
}
export type NetworkEventData = {
    [NetworkEvent.peerConnected]: {
        peer: PeerIdStr;
        status: phase0.Status;
    };
    [NetworkEvent.peerDisconnected]: {
        peer: PeerIdStr;
    };
    [NetworkEvent.reqRespRequest]: {
        request: RequestTypedContainer;
        peer: PeerId;
    };
    [NetworkEvent.unknownBlockParent]: {
        blockInput: BlockInput;
        peer: PeerIdStr;
    };
    [NetworkEvent.unknownBlock]: {
        rootHex: RootHex;
        peer?: PeerIdStr;
    };
    [NetworkEvent.unknownBlockInput]: {
        blockInput: BlockInput | NullBlockInput;
        peer?: PeerIdStr;
    };
    [NetworkEvent.pendingGossipsubMessage]: PendingGossipsubMessage;
    [NetworkEvent.gossipMessageValidationResult]: {
        msgId: string;
        propagationSource: PeerIdStr;
        acceptance: TopicValidatorResult;
    };
};
export declare const networkEventDirection: Record<NetworkEvent, EventDirection>;
export type INetworkEventBus = StrictEventEmitterSingleArg<NetworkEventData>;
declare const NetworkEventBus_base: {
    new (): INetworkEventBus;
};
export declare class NetworkEventBus extends NetworkEventBus_base {
}
export {};
//# sourceMappingURL=events.d.ts.map