/// <reference types="node" />
import type { TransportPlugin } from './transportPlugin';
import type { Peer } from '../peer';
import type { PeerChunk } from '../chunk';
export interface PeerTransportAdapter<T = any> {
    transport?: T;
    send?(data: any): void;
    subscribe?(cb: (data: any) => any): () => void;
    binaryFormat: 'string' | 'binary';
    binaryEncoder?: PeerTransportBinaryEncoder;
    stringEncoder?: PeerTransportStringEncoder;
}
export interface PeerTransportBinaryEncoder {
    encode: (data: any) => Buffer | Promise<Buffer>;
    decode: (data: Buffer) => any;
}
export interface PeerTransportStringEncoder {
    encode: (data: Buffer) => string | Promise<string>;
    decode: (data: string) => Buffer | Promise<Buffer>;
}
export interface PeerTransportEventEmitterMap {
    subscribe: any;
}
export declare class PeerTransport<Adapter extends PeerTransportAdapter<any> = PeerTransportAdapter<any>> {
    private _transportAdapter;
    private _plugins;
    private _cacheEmitter;
    private _isConnected;
    constructor(transportAdapter: Adapter, plugins?: TransportPlugin[]);
    get transportAdapter(): Adapter;
    get binaryEncoder(): PeerTransportBinaryEncoder;
    get stringEncoder(): PeerTransportStringEncoder;
    get plugins(): TransportPlugin[];
    send(peer: Peer, data: PeerChunk<any>): Promise<boolean>;
    subscribe(peer: Peer, callback: (data: PeerChunk<any>) => void): string;
    unsubscribe(eventHash: string): void;
    private _beforeSend;
    private _beforeResponse;
    private _beforeDataSend;
    private _beforeTransportSend;
    private _beforeDataResponse;
    private _beforeTransportResponse;
}
//# sourceMappingURL=transport.d.ts.map