import { Observable } from 'rxjs';
import { Channel } from '../../Channel';
import { IMessage } from '../../proto/index';
import { WebChannel } from '../../WebChannel';
import { IMessageFactory, IWebChannelStream, Service } from '../Service';
export declare enum TopologyEnum {
    FULL_MESH = 0
}
export declare enum TopologyState {
    CONSTRUCTING = 0,
    CONSTRUCTED = 1,
    IDLE = 2
}
export declare abstract class Topology<OutMsg, InMsg extends OutMsg> extends Service<OutMsg, InMsg> {
    protected wcStream: IWebChannelStream<OutMsg, InMsg>;
    protected wc: WebChannel;
    private _state;
    private stateSubject;
    constructor(wc: WebChannel, serviceId: number, proto: IMessageFactory<OutMsg, InMsg>);
    readonly onState: Observable<TopologyState>;
    readonly state: TopologyState;
    setJoinedState(): void;
    protected setState(state: TopologyState): void;
    abstract readonly neighbors: Channel[];
}
export interface ITopology {
    onState: Observable<TopologyState>;
    state: TopologyState;
    neighbors: Channel[];
    setJoinedState(): void;
    send(msg: IMessage): void;
    forward(msg: IMessage): void;
    sendTo(msg: IMessage): void;
    leave(): void;
    onChannelClose(channel: Channel): void;
}
