import { Observable } from 'rxjs';
import { Channel } from '../Channel';
import { IStream } from '../misc/util';
import { InSigMsg, OutSigMsg } from '../Signaling';
import { InWcMsg, OutWcMessage, WebChannel } from '../WebChannel';
export interface IMessageFactory<OutMsg, InMsg extends OutMsg> {
    create: (properties?: OutMsg) => InMsg;
    encode: (message: OutMsg) => {
        finish: () => Uint8Array;
    };
    decode: (reader: Uint8Array) => InMsg;
}
export interface IWebChannelStream<OutMsg, InMsg> {
    id: number;
    message: Observable<{
        senderId: number;
        msg: InMsg;
        channel: Channel;
        recipientId: number;
    }>;
    send: (msg: Uint8Array | OutMsg, recipientId: number) => void;
}
export interface ISignalingStream<OutMsg, InMsg> {
    id: number;
    message: Observable<{
        senderId: number;
        recipientId: number;
        msg: InMsg;
    }>;
    send: (msg: Uint8Array | OutMsg, recipientId: number, senderId: number) => void;
}
export interface IAllStreams<OutMsg, InMsg> {
    message: Observable<{
        streamId: number;
        senderId: number;
        recipientId: number;
        msg: InMsg;
    }>;
    sendOver: (streamId: number, msg: Uint8Array | OutMsg, recipientId: number, senderId: number) => void;
}
export declare abstract class Service<OutMsg, InMsg extends OutMsg> {
    private serviceId;
    private proto;
    constructor(serviceId: number, proto: IMessageFactory<OutMsg, InMsg>);
    protected useWebChannelStream(wc: IStream<OutWcMessage, InWcMsg> & WebChannel): IWebChannelStream<OutMsg, InMsg>;
    protected useSignalingStream(sig: IStream<OutSigMsg, InSigMsg>): ISignalingStream<OutMsg, InMsg>;
    protected useAllStreams(wc: IStream<OutWcMessage, InWcMsg> & WebChannel, sig: IStream<OutSigMsg, InSigMsg>): IAllStreams<OutMsg, InMsg>;
    protected encode(msg: OutMsg): Uint8Array;
    protected decode(bytes: Uint8Array): InMsg;
}
