import type { Event } from '@skyway-sdk/common';
import type model from '@skyway-sdk/model';
import type { ChannelImpl, ChannelInit, ChannelQuery, MemberInit, PublicationInit } from '@skyway-sdk/rtc-api-client';
import type { LocalMemberConfig, MemberInternalConfig } from '../config';
import type { SkyWayContext } from '../context';
import type { Member, MemberImpl } from '../member';
import { type LocalPerson, type LocalPersonImpl } from '../member/localPerson';
import type { RemoteMember } from '../member/remoteMember';
import type { Publication, PublicationImpl } from '../publication';
import type { Subscription, SubscriptionImpl } from '../subscription';
import type { ChannelClosedEvent, ChannelMetadataUpdatedEvent, ListChangedEvent, MemberJoinedEvent, MemberLeftEvent, MemberMetadataUpdatedEvent, PublicationDisabledEvent, PublicationEnabledEvent, PublicationMetadataUpdatedEvent, StreamPublishedEvent, StreamSubscribedEvent, StreamUnpublishedEvent, StreamUnsubscribedEvent } from './event';
export type { ChannelInit, ChannelQuery, MemberInit };
export interface Channel {
    readonly id: string;
    readonly name?: string;
    readonly appId: string;
    metadata?: string;
    state: ChannelState;
    /**
     * @description [japanese] このChannelが閉じられた時に発生するイベント
     */
    readonly onClosed: Event<ChannelClosedEvent>;
    /**
     * @description [japanese] このChannelのMetadataが更新された時に発生するイベント
     */
    readonly onMetadataUpdated: Event<ChannelMetadataUpdatedEvent>;
    /**@description [japanese] このChannelのMemberの数が変化した時に発生するイベント */
    readonly onMemberListChanged: Event<ListChangedEvent>;
    /**
     * @description [japanese] ChannelにMemberが参加した時に発生するイベント
     */
    readonly onMemberJoined: Event<MemberJoinedEvent>;
    /**
     * @description [japanese] ChannelからMemberが退出した時に発生するイベント
     */
    readonly onMemberLeft: Event<MemberLeftEvent>;
    /**
     * @description [japanese] MemberのMetadataが更新された時に発生するイベント
     */
    readonly onMemberMetadataUpdated: Event<MemberMetadataUpdatedEvent>;
    /**
     * @description [japanese] ChannelにStreamがPublishされた時に発生するイベント
     */
    readonly onStreamPublished: Event<StreamPublishedEvent>;
    /**
     * @description [japanese] ChannelからStreamがUnpublishされた時に発生するイベント
     */
    readonly onStreamUnpublished: Event<StreamUnpublishedEvent>;
    /**@description [japanese] このChannelのPublicationの数が変化した時に発生するイベント */
    readonly onPublicationListChanged: Event<ListChangedEvent>;
    /**
     * @description [japanese] StreamのPublicationのMetadataが更新された時に発生するイベント
     */
    readonly onPublicationMetadataUpdated: Event<PublicationMetadataUpdatedEvent>;
    /**@description [japanese] このChannelのPublicationが有効化された時に発生するイベント */
    readonly onPublicationEnabled: Event<PublicationEnabledEvent>;
    /**@description [japanese] このChannelのPublicationが無効化された時に発生するイベント */
    readonly onPublicationDisabled: Event<PublicationDisabledEvent>;
    /**
     * @description [japanese] ChannelのPublicationがSubscribeされた時に発生するイベント
     */
    readonly onPublicationSubscribed: Event<StreamSubscribedEvent>;
    /**
     * @description [japanese] ChannelのPublicationがUnsubscribeされた時に発生するイベント
     */
    readonly onPublicationUnsubscribed: Event<StreamUnsubscribedEvent>;
    /**@description [japanese] このChannelのSubscriptionの数が変化した時に発生するイベント */
    readonly onSubscriptionListChanged: Event<ListChangedEvent>;
    /**
     * @description [japanese] Channel中のMemberの一覧を取得する
     */
    members: Member[];
    /**
     * @description [japanese] Channel中のLocalPersonを取得する
     */
    localPerson?: LocalPerson;
    /**
     * @description [japanese] Channel中のBotの一覧を取得する
     */
    bots: RemoteMember[];
    /**
     * @description [japanese] Channel中のPublicationの一覧を取得する
     */
    publications: Publication[];
    /**
     * @description [japanese] Channel中のSubscriptionの一覧を取得する
     */
    subscriptions: Subscription[];
    /**
     * @description [japanese] ChannelにMemberを追加する
     */
    join: (memberInit?: {
        name?: MemberInit['name'];
        metadata?: MemberInit['metadata'];
    } & Partial<LocalMemberConfig>) => Promise<LocalPerson>;
    /**
     * @description [japanese] ChannelからMemberを退出させる
     */
    leave: (member: Member) => Promise<void>;
    /**
     * @description [japanese] ChannelのMetadataを更新する
     */
    updateMetadata: (metadata: string) => Promise<void>;
    /**
     * @description [japanese] Channelを閉じる。
     */
    close: () => Promise<void>;
    /**
     * @description [japanese] Channelを閉じずにChannelインスタンスの利用を終了し次のリソースを解放する。
     * - サーバとの通信
     * - イベントリスナー
     * - LocalPersonのインスタンス
     */
    dispose: () => void;
}
/**@internal */
export declare class SkyWayChannelImpl implements Channel {
    /**@private */
    readonly _context: SkyWayContext;
    /**@private */
    private readonly _channelImpl;
    readonly id: model.Channel['id'];
    readonly name: model.Channel['name'];
    readonly appId: string;
    _localPerson?: LocalPersonImpl;
    disposed: boolean;
    readonly config: import("../config").ContextConfig;
    private _state;
    private readonly _api;
    private _members;
    /**@private */
    _getMember: (id: string) => MemberImpl;
    private _addLocalPerson;
    private _addRemoteMember;
    private _removeMember;
    private _publications;
    /**@private */
    _getPublication: (id: string) => PublicationImpl<import("..").LocalStream>;
    /**@private */
    _addPublication(p: model.Publication): PublicationImpl<import("..").LocalStream>;
    private _removePublication;
    private _subscriptions;
    /**@private */
    _getSubscription: (id: string) => SubscriptionImpl<import("..").RemoteStream>;
    /**@private */
    _addSubscription(s: model.Subscription): SubscriptionImpl<import("..").RemoteStream>;
    private _removeSubscription;
    private readonly _events;
    readonly onClosed: Event<ChannelClosedEvent>;
    readonly onMetadataUpdated: Event<ChannelMetadataUpdatedEvent>;
    readonly onMemberListChanged: Event<ListChangedEvent>;
    readonly onMemberJoined: Event<MemberJoinedEvent>;
    readonly onMemberLeft: Event<MemberLeftEvent>;
    readonly onMemberMetadataUpdated: Event<MemberMetadataUpdatedEvent>;
    readonly onPublicationListChanged: Event<ListChangedEvent>;
    readonly onStreamPublished: Event<StreamPublishedEvent>;
    readonly onStreamUnpublished: Event<StreamUnpublishedEvent>;
    readonly onPublicationMetadataUpdated: Event<PublicationMetadataUpdatedEvent>;
    readonly onPublicationEnabled: Event<PublicationEnabledEvent>;
    readonly onPublicationDisabled: Event<PublicationDisabledEvent>;
    readonly onSubscriptionListChanged: Event<ListChangedEvent>;
    readonly onPublicationSubscribed: Event<StreamSubscribedEvent>;
    readonly onPublicationUnsubscribed: Event<StreamUnsubscribedEvent>;
    /**@private */
    readonly _onDisposed: Event<void>;
    constructor(
    /**@private */
    _context: SkyWayContext, 
    /**@private */
    _channelImpl: ChannelImpl);
    get localPerson(): LocalPersonImpl | undefined;
    get members(): MemberImpl[];
    get bots(): RemoteMember[];
    get publications(): Publication[];
    get subscriptions(): Subscription[];
    get metadata(): string | undefined;
    get state(): ChannelState;
    toJSON(): {
        id: string;
        name: string;
        appId: string;
        metadata: string | undefined;
        members: MemberImpl[];
        publications: Publication<import("..").LocalStream>[];
        subscriptions: Subscription<import("..").RemoteStream>[];
    };
    private _setupPropertiesFromChannel;
    private _setupListenChannelEvent;
    private _handleOnChannelClose;
    private _handleOnChannelMetadataUpdate;
    private _handleOnMemberJoin;
    private _handleOnMemberLeft;
    private _handleOnMemberMetadataUpdate;
    private _handleOnStreamPublish;
    private _handleOnStreamUnpublish;
    private _handleOnPublicationMetadataUpdate;
    private _handleOnPublicationEnabled;
    private _handleOnPublicationDisabled;
    private _handleOnStreamSubscribe;
    private _handleOnStreamUnsubscribe;
    join(options?: PersonInit): Promise<LocalPerson>;
    readonly leave: (member: Member) => Promise<void>;
    readonly updateMetadata: (metadata: string) => Promise<void>;
    readonly close: () => Promise<void>;
    /**@private */
    readonly _updateMemberTtl: (memberId: string, ttlSec: number) => Promise<void>;
    /**@private */
    readonly _updateMemberMetadata: (memberId: string, metadata: string) => Promise<void>;
    /**@private */
    /**@throws  {SkyWayError} */
    readonly _publish: (init: PublicationInit) => Promise<model.Publication>;
    /**@private */
    readonly _unpublish: (publicationId: string) => Promise<void>;
    /**@private
     * @throws {@link SkyWayError}
     */
    readonly _subscribe: (subscriberId: string, publicationId: string) => Promise<model.Subscription>;
    /**@private */
    readonly _unsubscribe: (subscriptionId: string) => Promise<void>;
    /**@private */
    readonly _updatePublicationMetadata: (publicationId: string, metadata: string) => Promise<void>;
    /**@private */
    readonly _disablePublication: (publicationId: string) => Promise<void>;
    /**@private */
    readonly _enablePublication: (publicationId: string) => Promise<void>;
    dispose(): void;
}
export declare class SkyWayChannel {
    /**
     * @description [japanese] Channelの作成
     */
    static Create(context: SkyWayContext, init?: ChannelInit): Promise<Channel>;
    /**
     * @description [japanese] 既存のChannelの取得
     */
    static Find(context: SkyWayContext, query: ChannelQuery): Promise<Channel>;
    /**
     * @description [japanese] Channelの取得を試み、存在しなければ作成する
     */
    static FindOrCreate(context: SkyWayContext, query: ChannelInit): Promise<Channel>;
    private constructor();
}
export declare type ChannelState = 'opened' | 'closed';
export declare type PersonInit = {
    name?: MemberInit['name'];
    metadata?: MemberInit['metadata'];
} & Partial<LocalMemberConfig> & MemberInternalConfig;
//# sourceMappingURL=index.d.ts.map