import { ReadableStreamDefaultReader } from 'web-streams-polyfill';
import { FlushPolicy } from './flush-policy';
import { Logger } from './logger';
import { UpstreamState, UpstreamChunk as Model$UpstreamChunk, UpstreamChunkAck as Model$UpstreamChunkAck, EventListenerOptions } from './model';
import { DataId, QoS, DataPoint, UpstreamResumeRequest, UpstreamResumeResponse, UpstreamCloseRequest, UpstreamCloseResponse, UpstreamChunk, UpstreamChunkAck } from './message';
export interface UpstreamConfig {
    logger: Logger;
    id: string;
    idAlias: number;
    sessionId: string;
    dataIdAliases: Record<number, DataId>;
    serverTime: bigint;
    closeTimeout: number;
    ackInterval: number;
    expiryInterval: number;
    qos: QoS;
    flushPolicy: FlushPolicy;
    persist: boolean;
    closeSession: boolean;
    resumeRequester: (request: UpstreamResumeRequest) => Promise<UpstreamResumeResponse>;
    closeRequester: (request: UpstreamCloseRequest) => Promise<UpstreamCloseResponse>;
    chunkSender: (chunk: UpstreamChunk) => Promise<void>;
    chunkAckStreamReader: ReadableStreamDefaultReader<UpstreamChunkAck>;
    reopenStreamReader: ReadableStreamDefaultReader<void>;
}
/**
 * アップストリームをクローズした時に呼び出されるイベントです。
 * @category Upstream
 */
export declare class UpstreamClosedEvent {
    /** クローズした時のアップストリームの状態。 */
    state: UpstreamState;
    /** 内部エラーが発生した場合の例外。 */
    error?: Error;
    constructor(init: {
        state: UpstreamClosedEvent['state'];
        error: UpstreamClosedEvent['error'];
    });
}
/**
 * データポイントを送信する直前に呼び出されるイベントです。
 * @category Upstream
 */
export declare class UpstreamBeforeSendDataPointsEvent {
    /** ストリームID。 */
    streamId: string;
    /** アップストリームチャンク。 */
    chunk: Model$UpstreamChunk;
    constructor(init: {
        streamId: UpstreamAfterReceiveAckEvent['streamId'];
        chunk: Model$UpstreamChunk;
    });
}
/**
 * アップストリームチャンクに対する確認応答を受信した時に呼び出されるイベントです。
 * @category Upstream
 */
export declare class UpstreamAfterReceiveAckEvent {
    /** ストリームID。 */
    streamId: string;
    /** アップストリームチャンクに対する確認応答。 */
    chunkAck: Model$UpstreamChunkAck;
    constructor(init: {
        streamId: UpstreamAfterReceiveAckEvent['streamId'];
        chunkAck: UpstreamAfterReceiveAckEvent['chunkAck'];
    });
}
/**
 * {@link UpstreamBeforeSendDataPointsEvent}を取得するイベントリスナーです。
 * {@link Upstream}の{@link Upstream.addEventListener}、{@link Upstream.removeEventListener}で指定します。
 * @category Upstream
 */
export type UpstreamBeforeSendDataPointsEventListener = (event: UpstreamBeforeSendDataPointsEvent) => void;
/**
 * {@link UpstreamAfterReceiveAckEvent}を取得するイベントリスナーです。
 * {@link Upstream}の{@link Upstream.addEventListener}、{@link Upstream.removeEventListener}で指定します。
 * @category Upstream
 */
export type UpstreamAfterReceiveAckEventListener = (event: UpstreamAfterReceiveAckEvent) => void;
/**
 * {@link UpstreamClosedEvent}を取得するイベントリスナーです。
 * {@link Upstream}の{@link Upstream.addEventListener}、{@link Upstream.removeEventListener}で指定します。
 * @category Upstream
 */
export type UpstreamClosedEventListener = (event: UpstreamClosedEvent) => void;
/**
 * アップストリームを閉じる時に{@link Upstream}.{@link Upstream.close}で指定するオプションです。
 * @category Upstream
 */
export interface UpstreamCloseOptions {
    /**
     * ストリームのクローズ時にセッションをクローズするかどうかを指定します。
     * ここでの指定は、アップストリームの{@link Upstream.closeSession}の値より優先されます。
     */
    overwriteCloseSession?: boolean;
}
type UpstreamEvent = typeof Upstream.EVENT;
/**
 * アップストリームを表すクラスです。
 *
 * @attention このクラスのオブジェクトは、必ず{@link Conn}の{@link Conn.openUpstream}を使用して生成してください。
 *
 * @category Upstream
 */
export declare class Upstream {
    #private;
    static EVENT: {
        /** データポイントを送信する直前に呼び出されるイベントです。 */
        readonly BEFORE_SEND_DATA_POINTS: "beforeSendDataPoints";
        /** アップストリームチャンクに対する確認応答を受信した時に呼び出されるイベントです。 */
        readonly AFTER_RECEIVE_ACK: "afterReceiveAck";
        /** アップストリームチャンクに対する確認応答を受信した時に呼び出されるイベントです。 */
        readonly CLOSED: "closed";
    };
    /**
     * @internal
     */
    constructor(config: UpstreamConfig);
    /**
     * ストリームIDを取得します。
     * @returns ストリームID
     */
    get id(): string;
    /**
     * アップストリームを開いた時のサーバー時刻（ナノ秒）を取得します。
     * @returns アップストリームを開いた時のサーバー時刻（ナノ秒）
     */
    get serverTime(): bigint;
    /**
     * ストリームの状態を取得します。
     * @returns アップストリームの状態
     */
    get state(): UpstreamState;
    /**
     * セッションIDを取得します。
     * @returns セッションID
     */
    get sessionId(): string;
    /**
     * Ackの返却間隔を取得します。
     * @returns Ackの返却間隔（秒）
     */
    get ackInterval(): number;
    /**
     * 有効期限を取得します。
     * @returns ストリームの有効期限（秒）
     */
    get expiryInterval(): number;
    /**
     * QoSを取得します。
     * @returns QoS
     */
    get qos(): QoS;
    /**
     * 永続化フラグを取得します。
     * @returns 永続化フラグ
     */
    get persist(): boolean;
    /**
     * フラッシュポリシーを取得します。
     * @returns フラッシュポリシー
     */
    get flushPolicy(): FlushPolicy;
    /**
     * クローズタイムアウト（秒）を取得します。
     * @returns クローズタイムアウト（秒）
     */
    get closeTimeout(): number;
    /**
     * クローズ時にセッションをクローズするかどうかを取得します。
     * @returns クローズ時にセッションをクローズするかどうか
     */
    get closeSession(): boolean;
    /**
     * @internal
     */
    static start(config: UpstreamConfig): Promise<Upstream>;
    /**
     * アップストリームを閉じます。
     * @param options アップストリームに指定するオプションです。
     */
    close(options?: UpstreamCloseOptions): Promise<void>;
    /**
     * アップストリームが閉じるまで待機します。
     */
    waitClosed(): Promise<void>;
    /**
     * データポイントの内部バッファをUpstreamChunkとしてサーバーへ送信します。
     */
    flush(): Promise<void>;
    /**
     * データポイントを送信します。
     * @param dataId データID。
     * @param dataPoints データポイントのリスト。
     */
    writeDataPoints(dataId: DataId, dataPoints: DataPoint[]): Promise<void>;
    /**
     * {@link Upstream.EVENT}.BEFORE_SEND_DATA_POINTS のイベントリスナーを追加します。
     * データポイントを送信する直前にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * upstream.addEventListener(Upstream.EVENT.BEFORE_SEND_DATA_POINTS, (event: UpstreamBeforeSendDataPointsEventListener) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: UpstreamEvent['BEFORE_SEND_DATA_POINTS'], listener: UpstreamBeforeSendDataPointsEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Upstream.EVENT}.AFTER_RECEIVE_ACK のイベントリスナーを追加します。
     * アップストリームチャンクに対する確認応答を受信した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * upstream.addEventListener(Upstream.EVENT.AFTER_RECEIVE_ACK, (event: UpstreamAfterReceiveAckEvent) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: UpstreamEvent['AFTER_RECEIVE_ACK'], listener: UpstreamAfterReceiveAckEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Upstream.EVENT}.CLOSED のイベントリスナーを追加します。
     * アップストリームを閉じた時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * upstream.addEventListener(Upstream.EVENT.CLOSED, (event: UpstreamClosedEvent) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: UpstreamEvent['CLOSED'], listener: UpstreamClosedEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Upstream.EVENT}.BEFORE_SEND_DATA_POINTS のイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (event: UpstreamBeforeSendDataPointsEventListener) => {
     *   ...
     * })
     *
     * upstream.addEventListener(Upstream.EVENT.BEFORE_SEND_DATA_POINTS, listener)
     *
     * ...
     *
     * upstream.removeEventListener(Upstream.EVENT.BEFORE_SEND_DATA_POINTS, listener)
     * ```
     */
    removeEventListener(name: UpstreamEvent['BEFORE_SEND_DATA_POINTS'], listener: UpstreamBeforeSendDataPointsEventListener): void;
    /**
     * {@link Upstream.EVENT}.AFTER_RECEIVE_ACK のイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (event: UpstreamAfterReceiveAckEvent) => {
     *   ...
     * })
     *
     * upstream.addEventListener(Upstream.EVENT.AFTER_RECEIVE_ACK, listener)
     *
     * ...
     *
     * upstream.removeEventListener(Upstream.EVENT.AFTER_RECEIVE_ACK, listener)
     * ```
     */
    removeEventListener(name: UpstreamEvent['AFTER_RECEIVE_ACK'], listener: UpstreamAfterReceiveAckEventListener): void;
    /**
     * {@link Upstream.EVENT}.CLOSED のイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (event: UpstreamClosedEvent) => {
     *   ...
     * })
     *
     * upstream.addEventListener(Upstream.EVENT.CLOSED, listener)
     *
     * ...
     *
     * upstream.removeEventListener(Upstream.EVENT.CLOSED, listener)
     * ```
     */
    removeEventListener(name: UpstreamEvent['CLOSED'], listener: UpstreamClosedEventListener): void;
}
export {};
