import { DownstreamChunkAckComplete, DownstreamChunk as Message$DownstreamChunk, DownstreamMetadata as Message$DownstreamMetadata, DataId, QoS, DownstreamFilter, DownstreamChunkAck, DownstreamResumeRequest, DownstreamResumeResponse, DownstreamCloseRequest, DownstreamCloseResponse, DownstreamMetadataAck } from './message';
import { EventListenerOptions, DownstreamChunk as Model$DownstreamChunk, DownstreamMetadata as Model$DownstreamMetadata, DownstreamState } from './model';
import { Sequence } from './sequence';
import { Logger } from './logger';
export interface DownstreamConfig {
    logger: Logger;
    id: string;
    idAlias: number;
    serverTime: bigint;
    qos: QoS;
    expiryInterval: number;
    filters: DownstreamFilter[];
    dataIdAliases?: Record<number, DataId>;
    dataIdAliasSequence?: Sequence;
    ackInterval: number;
    omitEmptyChunk: boolean;
    resumeRequester: (request: DownstreamResumeRequest) => Promise<DownstreamResumeResponse>;
    closeRequester: (request: DownstreamCloseRequest) => Promise<DownstreamCloseResponse>;
    chunkAckSender: (message: DownstreamChunkAck) => Promise<void>;
    metadataAckSender: (message: DownstreamMetadataAck) => Promise<void>;
    chunkIterator: AsyncIterableIterator<Message$DownstreamChunk>;
    chunkAckCompleteIterator: AsyncIterableIterator<DownstreamChunkAckComplete>;
    metadataIterator: AsyncIterableIterator<Message$DownstreamMetadata>;
    reopenIterator: AsyncIterableIterator<void>;
}
type DownstreamEvent = typeof Downstream.EVENT;
/**
 * ダウンストリームを閉じた時のイベントです。
 * @category Downstream
 */
export declare class DownstreamClosedEvent {
    /** ダウンストリームの状態。 */
    state: DownstreamState;
    /** 内部エラーが発生した場合の例外。 */
    error?: Error;
    constructor(init: {
        state: DownstreamClosedEvent['state'];
        error: DownstreamClosedEvent['error'];
    });
}
/**
 * {@link DownstreamChunk}を取得するイベントリスナーです。
 * {@link Downstream}の{@link Downstream.addEventListener}、{@link Downstream.removeEventListener}で指定します。
 * @category Downstream
 */
export type DownstreamChunkEventListener = (chunk: Model$DownstreamChunk) => void;
/**
 * {@link DownstreamMetadata}を取得するイベントリスナーです。
 * {@link Downstream}の{@link Downstream.addEventListener}、{@link Downstream.removeEventListener}で指定します。
 * @category Downstream
 */
export type DownstreamMetadataEventListener = (metadata: Model$DownstreamMetadata) => void;
/**
 * {@link DownstreamClosedEvent}を取得するイベントリスナーです。
 * {@link Downstream}の{@link Downstream.addEventListener}、{@link Downstream.removeEventListener}で指定します。
 * @category Downstream
 */
export type DownstreamClosedEventListener = (event: DownstreamClosedEvent) => void;
/**
 * ダウンストリームを表すクラスです。
 *
 * @attention このクラスのオブジェクトは、必ず{@link Conn}の{@link Conn.openDownstream}を使用して生成してください。
 *
 * @category Downstream
 *
 * @example
 * ```ts
 * const example = async () => {
 *   const conn = await Conn.connect(...)
 *   const downstream = conn.openDownstream(...)
 *   try
 *     // ...
 *   finally {
 *     await downstream.close()
 *   }
 * }
 * ```
 */
export declare class Downstream {
    #private;
    /**
     * @event イベント
     */
    static EVENT: {
        /** ダウンストリームチャンクを受信した時に呼び出されるイベントです。 */
        readonly CHUNK: "chunk";
        /** ダウンストリームメタデータを受信した時に呼び出されるイベントです。 */
        readonly METADATA: "metadata";
        /** ダウンストリームを閉じた時に呼び出されるイベントです。 */
        readonly CLOSED: "closed";
    };
    /**
     * @internal
     */
    static start(config: DownstreamConfig): Promise<Downstream>;
    /**
     * @internal
     */
    constructor(config: DownstreamConfig);
    /**
     * ストリームIDを取得します。
     * @returns ストリームID
     */
    get id(): string;
    /**
     * ダウンストリームを開いた時のサーバー時刻（ナノ秒）を取得します。
     * @returns ダウンストリームを開いた時のサーバー時刻（ナノ秒）
     */
    get serverTime(): bigint;
    /**
     * 有効期限を取得します。
     * @returns ストリームの有効期限（秒）
     */
    get expiryInterval(): number;
    /**
     * QoSを取得します。
     * @returns QoS
     */
    get qos(): QoS;
    /**
     * Ack返却間隔（秒）を取得します。
     * @returns Ack返却間隔（秒）
     */
    get ackInterval(): number;
    /**
     * 空チャンク省略フラグを取得します。
     */
    get omitEmptyChunk(): boolean;
    /**
     * ダウンストリームフィルタのリストを取得します。
     * @returns ダウンストリームフィルタのリスト
     */
    get filters(): DownstreamFilter[];
    /**
     * ストリームの状態を取得します。
     * @returns ダウンストリームの状態
     */
    get state(): DownstreamState;
    /**
     * ダウンストリームが閉じるまで待機します。
     */
    waitClosed(): Promise<void>;
    /**
     * ダウンストリームを閉じます。
     */
    close(): Promise<void>;
    /**
     * {@link Downstream.EVENT}.CHUNKのイベントリスナーを追加します。
     * ダウンストリームチャンクを受信した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * downstream.addEventListener(Downstream.EVENT.CHUNK, (chunk: DownstreamChunk) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: DownstreamEvent['CHUNK'], listener: DownstreamChunkEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Downstream.EVENT}.METADATAのイベントリスナーを追加します。
     * ダウンストリームメタデータを受信した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * downstream.addEventListener(Downstream.EVENT.METADATA, (metadata: DownstreamMetadata) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: DownstreamEvent['METADATA'], listener: DownstreamMetadataEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Downstream.EVENT}.CLOSEDのイベントリスナーを追加します。
     * ダウンストリームを閉じた時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * downstream.addEventListener(Downstream.EVENT.CLOSED, (state) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: DownstreamEvent['CLOSED'], listener: DownstreamClosedEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Downstream.EVENT}.CHUNKのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (chunk: DownstreamChunk) => {
     *   ...
     * }
     *
     * downstream.addEventListener(Downstream.EVENT.CHUNK, listener)
     *
     * ...
     *
     * downstream.removeEventListener(Downstream.EVENT.CHUNK, listener)
     * ```
     */
    removeEventListener(name: DownstreamEvent['CHUNK'], listener: DownstreamChunkEventListener): void;
    /**
     * {@link Downstream.EVENT}.METADATAのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (metadata: DownstreamMetadata) => {
     *   ...
     * }
     *
     * downstream.addEventListener(Downstream.EVENT.METADATA, listener)
     *
     * ...
     *
     * downstream.removeEventListener(Downstream.EVENT.METADATA, listener)
     * ```
     */
    removeEventListener(name: DownstreamEvent['METADATA'], listener: DownstreamMetadataEventListener): void;
    /**
     * {@link Downstream.EVENT}.CLOSEDのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (closedEvent: DownstreamClosedEvent) => {
     *   ...
     * }
     *
     * downstream.addEventListener(Downstream.EVENT.CLOSED, listener)
     *
     * ...
     *
     * downstream.removeEventListener(Downstream.EVENT.CLOSED, listener)
     * ```
     */
    removeEventListener(name: DownstreamEvent['CLOSED'], listener: DownstreamClosedEventListener): void;
}
export {};
