import { Event } from '@skyway-sdk/common';
import type { Encoding } from '@skyway-sdk/model';
import type { SkyWayChannelImpl } from '../channel';
import type { StreamSubscribedEvent, StreamUnsubscribedEvent } from '../channel/event';
import type { AnalyticsSession } from '../external/analytics';
import type { Codec, EncodingParameters } from '../media';
import type { ContentType, WebRTCStats } from '../media/stream';
import type { LocalMediaStreamBase, LocalStream } from '../media/stream/local';
import type { LocalAudioStream } from '../media/stream/local/audio';
import type { LocalCustomVideoStream } from '../media/stream/local/customVideo';
import type { LocalVideoStream } from '../media/stream/local/video';
import type { Member } from '../member';
import type { RemoteMember, RemoteMemberImplInterface } from '../member/remoteMember';
import type { TransportConnectionState } from '../plugin/interface';
import type { Subscription } from '../subscription';
export * from './factory';
export interface Publication<T extends LocalStream = LocalStream> {
    readonly id: string;
    readonly contentType: ContentType;
    metadata?: string;
    readonly publisher: Member;
    readonly subscriptions: Subscription[];
    readonly origin?: Publication;
    readonly codecCapabilities: Codec[];
    readonly encodings: Encoding[];
    readonly type: PublicationType;
    /**
     * @description [japanese] publishしたstreamの実体。
     * ローカルで作られたPublicationでなければundefinedとなる
     */
    stream?: T;
    state: PublicationState;
    /** @description [japanese] Subscribeされた時に発火するイベント */
    onSubscribed: Event<StreamSubscribedEvent>;
    /** @description [japanese] このPublicationをSubscribeしたSubscriptionがUnsubscribeされた時に発火するイベント */
    onUnsubscribed: Event<StreamUnsubscribedEvent>;
    /** @description [japanese] このPublicationをSubscribeしたSubscriptionの数が変化した時に発火するイベント */
    onSubscriptionListChanged: Event<void>;
    /** @description [japanese] Metadataが変更された時に発火するイベント */
    onMetadataUpdated: Event<{
        metadata: string;
    }>;
    /** @description [japanese] 有効化された時に発火するイベント */
    onEnabled: Event<void>;
    /** @description [japanese] 無効化された時に発火するイベント */
    onDisabled: Event<void>;
    /** @description [japanese] stateが変化した時に発火するイベント */
    onStateChanged: Event<void>;
    /**
     * @description [japanese] メディア通信の状態が変化した時に発火するイベント
     */
    onConnectionStateChanged: Event<{
        remoteMember: RemoteMember;
        state: TransportConnectionState;
    }>;
    /**
     * @description [japanese] Metadataの更新
     */
    updateMetadata: (metadata: string) => Promise<void>;
    /**
     * @description [japanese] Video|Audio Streamの場合、encoding設定を更新する
     */
    updateEncodings: (encodings: EncodingParameters[]) => void;
    /** @description [japanese] 有効化する */
    /**@throws {SkyWayError} */
    enable: () => Promise<void>;
    /** @description [japanese] 無効化する */
    disable: () => Promise<void>;
    /**
     * @description [japanese] Publicationのstreamを同じContentTypeの別のStreamに入れ替える。
     * dataStreamを入れ替えることはできない。
     * RemoteのPublication(streamがnull)では利用不可。
     */
    replaceStream: (stream: LocalAudioStream | LocalVideoStream | LocalCustomVideoStream, options?: ReplaceStreamOptions) => void;
    /**
     * @experimental
     * @description [japanese] 試験的なAPIです。今後インターフェースや仕様が変更される可能性があります
     * @description [japanese] StreamをSubscribeしているMemberとの通信の統計情報を取得する
     * @param selector [japanese] 接続相手
     */
    getStats(selector: Member | string): Promise<WebRTCStats>;
    /**
     * @experimental
     * @description [japanese] 試験的なAPIです。今後インターフェースや仕様が変更される可能性があります
     * @description [japanese] 対象のMemberとのRTCPeerConnectionを取得する。RTCPeerConnectionを直接操作すると SDK は正しく動作しなくなる可能性があります。
     * @param selector [japanese] 接続相手
     */
    getRTCPeerConnection(selector: Member | string): RTCPeerConnection | undefined;
    /**
     * @description [japanese] メディア通信の状態を取得する
     * @param selector [japanese] 接続相手
     */
    getConnectionState(selector: Member | string): TransportConnectionState;
}
/**@internal */
export declare class PublicationImpl<T extends LocalStream = LocalStream> implements Publication {
    readonly id: string;
    readonly contentType: ContentType;
    readonly publisher: RemoteMemberImplInterface;
    private _codecCapabilities;
    get codecCapabilities(): Codec[];
    setCodecCapabilities(_codecCapabilities: Codec[]): void;
    private _encodings;
    get encodings(): Encoding[];
    setEncodings(_encodings: Encoding[]): void;
    private _stream?;
    get stream(): T | undefined;
    /**@internal */
    _setStream(stream: LocalStream | undefined): void;
    /**@private */
    readonly _channel: SkyWayChannelImpl;
    origin?: PublicationImpl;
    private _metadata?;
    get metadata(): string | undefined;
    private _state;
    get state(): PublicationState;
    get deviceName(): string | undefined;
    private readonly _events;
    readonly onSubscribed: Event<StreamSubscribedEvent>;
    readonly onUnsubscribed: Event<StreamUnsubscribedEvent>;
    readonly onSubscriptionListChanged: Event<void>;
    readonly onMetadataUpdated: Event<{
        metadata: string;
    }>;
    readonly onEnabled: Event<void>;
    readonly onDisabled: Event<void>;
    readonly onStateChanged: Event<void>;
    readonly onConnectionStateChanged: Event<{
        remoteMember: RemoteMember;
        state: TransportConnectionState;
    }>;
    /**@private */
    readonly _onEncodingsChanged: Event<EncodingParameters[]>;
    /**@private */
    readonly _onReplaceStream: Event<{
        newStream: LocalMediaStreamBase;
        oldStream: LocalMediaStreamBase;
    }>;
    private readonly _onEnabled;
    private streamEventDisposer;
    /**@private */
    readonly _analytics?: AnalyticsSession;
    readonly type: PublicationType;
    private _context;
    constructor(args: {
        channel: SkyWayChannelImpl;
        id: string;
        publisher: RemoteMemberImplInterface;
        contentType: ContentType;
        metadata?: string;
        origin?: PublicationImpl;
        codecCapabilities?: Codec[];
        encodings?: EncodingParameters[];
        stream?: T;
        isEnabled: boolean;
        type: PublicationType;
    });
    get subscriptions(): Subscription[];
    /**@private */
    _updateMetadata(metadata: string): void;
    /**@private */
    _disable(): Promise<void>;
    /**@private */
    _enable(): void;
    /**@private */
    _unpublished(): void;
    /**@private */
    _subscribed(subscription: Subscription): void;
    /**@private */
    _unsubscribed(subscription: Subscription): void;
    updateMetadata: (metadata: string) => Promise<void>;
    updateEncodings(encodings: EncodingParameters[]): void;
    disable: () => Promise<void>;
    private _disableStream;
    enable: () => Promise<void>;
    private _enableStream;
    replaceStream(stream: LocalAudioStream | LocalVideoStream | LocalCustomVideoStream, options?: ReplaceStreamOptions): void;
    getStats(selector: string | Member): Promise<WebRTCStats>;
    getRTCPeerConnection(selector: string | Member): RTCPeerConnection | undefined;
    getConnectionState(selector: string | Member): TransportConnectionState;
    /**@private */
    toJSON(): {
        id: string;
        channelId: string;
        publisherId: string;
        origin: string | undefined;
        contentType: ContentType;
        metadata: string | undefined;
        codecCapabilities: Codec[];
        encodings: Encoding[];
        state: PublicationState;
        stream: T | undefined;
        type: PublicationType;
    };
    private _dispose;
}
/**
 * @description [japanese] Publicationの状態
 * - enabled : 配信中
 * - disabled : 配信停止中
 * - canceled : 配信終了
 * */
export declare type PublicationState = 'enabled' | 'disabled' | 'canceled';
/**@internal */
export declare const normalizeEncodings: (encodings: EncodingParameters[]) => Encoding[];
export declare const sortEncodingParameters: (encodings: EncodingParameters[]) => EncodingParameters[];
export declare type ReplaceStreamOptions = {
    /**@description [japanese] 入れ替え前のstreamを開放する。デフォルトで有効 */
    releaseOldStream?: boolean;
};
export declare type PublicationType = 'p2p' | 'sfu';
//# sourceMappingURL=index.d.ts.map