import { Message, MessagePeerType, RoutedMessage, ServiceMessage, MessageError, PeerConnectionFilter, PeerConnectionOptions, PeerSendOptions, PeerOptions } from '@amadeus-it-group/microfrontends';
import { Observable } from 'rxjs';
import * as i0 from '@angular/core';
import { OnDestroy, InjectionToken } from '@angular/core';

/**
 * Interface for the peer service that provides an observable for incoming messages
 */
interface MessagePeerServiceType<M extends Message> extends Omit<MessagePeerType<M>, 'messages' | 'serviceMessages' | 'errors'> {
    /**
     * Observable for incoming messages
     */
    get messages$(): Observable<RoutedMessage<M>>;
    /**
     * Observable for incoming service messages
     */
    get serviceMessages$(): Observable<RoutedMessage<ServiceMessage>>;
    /**
     * Observable for peer local errors when processing messages
     */
    get errors$(): Observable<MessageError>;
}
/**
 * @inheritDoc
 */
interface MessagePeerConfig extends PeerOptions {
}
/**
 * Injection token for {@link MessagePeerConfig}, required for the {@link MessagePeerService} configuration.
 */
declare const MESSAGE_PEER_CONFIG: InjectionToken<MessagePeerConfig>;
/**
 * Injection token for {@link PeerConnectionOptions} used as default options to pass to {@link MessagePeerService#connect}.
 */
declare const MESSAGE_PEER_CONNECT_OPTIONS: InjectionToken<PeerConnectionOptions>;
/**
 * Injection token for {@link PeerConnectionOptions} used as default options to pass to {@link MessagePeerService#listen}.
 */
declare const MESSAGE_PEER_LISTEN_OPTIONS: InjectionToken<string | PeerConnectionFilter | PeerConnectionFilter[]>;
/**
 * Angular service that wraps {@link MessagePeer} and provides an observable for incoming messages and errors
 * It is essentially just a wrapper around {@link MessagePeer} that integrates with Angular's DI system.
 */
declare class MessagePeerService<M extends Message> implements MessagePeerServiceType<M>, OnDestroy {
    #private;
    /**
     * @inheritDoc
     */
    messages$: Observable<RoutedMessage<M>>;
    /**
     * @inheritDoc
     */
    serviceMessages$: Observable<RoutedMessage<ServiceMessage>>;
    /**
     * @inheritDoc
     */
    errors$: Observable<MessageError>;
    constructor();
    ngOnDestroy(): void;
    /**
     * @inheritDoc
     */
    get id(): string;
    /**
     * @inheritDoc
     */
    get knownPeers(): Map<string, Message[]>;
    /**
     * @inheritDoc
     */
    get peerConnections(): Map<string, Set<string>>;
    /**
     * @inheritDoc
     */
    listen(filters?: string | PeerConnectionFilter | (string | PeerConnectionFilter)[]): () => void;
    /**
     * @inheritDoc
     */
    connect(remoteId: string, options?: PeerConnectionOptions): Promise<() => void>;
    /**
     * @inheritDoc
     */
    registerMessage(message: Message): void;
    /**
     * @inheritDoc
     */
    send(message: M, options?: PeerSendOptions): void;
    /**
     * @inheritDoc
     */
    disconnect(peerId?: string): void;
    static ɵfac: i0.ɵɵFactoryDeclaration<MessagePeerService<any>, never>;
    static ɵprov: i0.ɵɵInjectableDeclaration<MessagePeerService<any>>;
}

export { MESSAGE_PEER_CONFIG, MESSAGE_PEER_CONNECT_OPTIONS, MESSAGE_PEER_LISTEN_OPTIONS, MessagePeerService };
export type { MessagePeerConfig, MessagePeerServiceType };
