import { Encoding } from './encoding';
import { DownstreamFilter, DataId, QoS, BaseTime } from './message';
import { Connector, EncodingName, NegotiationParams } from './transport';
import { LogLevel, EventListenerOptions, UpstreamCall as Model$UpstreamCall, UpstreamReplyCall as Model$UpstreamReplyCall, DownstreamCall as Model$DownstreamCall, DownstreamReplyCall as Model$DownstreamReplyCall } from './model';
import { Upstream } from './upstream';
import { Downstream } from './downstream';
import { FlushPolicy } from './flush-policy';
/**
 * iSCP接続時に{@link Conn}.{@link Conn.connect}に指定するコンフィグです。
 * @category Connection
 */
export interface ConnConfig {
    /** 接続先のアドレス。`127.0.0.1:8080` 形式。 */
    address: string;
    /** トランスポートのコネクターです。 */
    connector: Connector;
    /**
     * エンコーディング名。
     * @default {@link Conn}.{@link Conn.DEFAULT_ENCODING_NAME}
     */
    encoding?: EncodingName;
    /** ノードID。 */
    nodeId?: string;
    /**
     * Ping間隔（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_PING_INTERVAL}
     */
    pingInterval?: number;
    /**
     *  Pingタイムアウト（秒）。タイムアウトが発生した場合トランスポートを切断します。
     * @default {@link Conn}.{@link Conn.DEFAULT_PING_TIMEOUT}
     */
    pingTimeout?: number;
    /** プロジェクトUUID。 */
    projectUuid?: string;
    /** トークンソース。iSCPコネクションを開くたびに、このメソッドをコールしトークンを取得します。 */
    tokenSource?: TokenSource;
    /**
     * ログの出力レベル。
     * @default {@link LOG_LEVEL}.{@link LOG_LEVEL.WARNING}
     */
    logLevel?: LogLevel;
    /**
     * 自動で再接続するか指定します。
     * @default {@link Conn}.{@link Conn.DEFAULT_AUTO_RECONNECT}
     */
    autoReconnect?: boolean;
    /**
     * 自動で再接続する際の、リトライ間隔の初期値を秒で指定します。
     * 再接続に失敗すると、リトライ間隔を倍にしながらリトライを繰り返します。
     * @default {@link Conn}.{@link Conn.DEFAULT_RECONNECT_BASE_INTERVAL}
     */
    reconnectBaseInterval?: number;
    /**
     * 自動で再接続する際の、リトライ間隔を秒で指定します。
     * @default {@link Conn}.{@link Conn.DEFAULT_RECONNECT_MAX_INTERVAL}
     */
    reconnectMaxInterval?: number;
}
/**
 * ダウンストリームを開く時に{@link Conn}.{@link Conn.openDownstream}に指定するコンフィグです。
 * @category Connection
 */
export interface DownstreamConfig {
    /** ダウンストリームフィルタのリスト。 */
    filters: DownstreamFilter[];
    /** データIDのリスト。 */
    dataIds?: DataId[];
    /**
     * QoS。
     * @default {@link Conn}.{@link Conn.DEFAULT_QOS}
     */
    qos?: QoS;
    /**
     * 有効期限（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_EXPIRY_INTERVAL}
     */
    expiryInterval?: number;
    /**
     * Ack返却間隔（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_ACK_INTERVAL}
     */
    ackInterval?: number;
    /**
     * 空チャンク省略フラグ。trueの場合、{@link DownstreamChunk}内の{@link DownstreamChunk.dataPointGroups}が空の時、{@link DownstreamChunk}の送信を省略します。
     * @default {@link Conn}.{@link Conn.DEFAULT_OMIT_EMPTY_CHUNK}
     */
    omitEmptyChunk?: boolean;
}
/**
 * アップストリームを開く時に{@link Conn}.{@link Conn.openUpstream}に指定するコンフィグです。
 * @category Connection
 */
export interface UpstreamConfig {
    /** セッションID。 */
    sessionId: string;
    /**
     * 有効期限（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_EXPIRY_INTERVAL}
     */
    expiryInterval?: number;
    /** データIDのリスト。 */
    dataIds?: DataId[];
    /**
     * QoS。
     * @default {@link Conn}.{@link Conn.DEFAULT_QOS}
     */
    qos?: QoS;
    /**
     * Ack返却間隔（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_ACK_INTERVAL}
     */
    ackInterval?: number;
    /**
     * 永続化するかどうか。
     * @default {@link Conn}.{@link Conn.DEFAULT_PERSIST}
     */
    persist?: boolean;
    /**
     * データポイントのフラッシュポリシー。
     * @default {@link FlushPolicy}.{@link FlushPolicy.intervalOrBufferSize}()の戻り値。
     */
    flushPolicy?: FlushPolicy;
    /**
     * クローズのタイムアウト（秒）。
     * @default {@link Conn}.{@link Conn.DEFAULT_CLOSE_TIMEOUT}
     */
    closeTimeout?: number;
    /**
     * アップストリームクローズ時にセッションをクローズするかどうか。
     * @default {@link Conn}.{@link Conn.DEFAULT_CLOSE_SESSION}
     */
    closeSession?: boolean;
}
/**
 * トークンソースです。
 * @returns トークン
 * @category Connection
 */
export type TokenSource = () => Promise<string>;
/**
 * 基準時刻を送信する時に{@link Conn}.{@link Conn.sendBaseTime}に指定するオプションです。
 * @category Connection
 */
export interface SendBaseTimeOptions {
    /**
     * 永続化するかどうか。
     * @default {@link Conn}.{@link Conn.DEFAULT_SEND_BASE_TIME_OPTIONS_PERSIST}
     */
    persist?: boolean;
}
type ConnEvent = typeof Conn.EVENT;
/**
 * iSCPを切断した時のイベントです。
 * @category Connection
 */
export declare class DisconnectedEvent {
    /** 内部エラーが発生した場合の例外。 */
    error?: Error;
    constructor(init: {
        error?: DisconnectedEvent['error'];
    });
}
/**
 * iSCPの再接続を開始した時のイベントです。
 * @category Connection
 */
export declare class ReconnectingEvent {
    /** 再接続を開始する原因となった例外。 */
    error: Error;
    constructor(init: {
        error: ReconnectingEvent['error'];
    });
}
/**
 * {@link DownstreamCall}を取得するイベントリスナーです。
 * {@link Conn}の{@link Conn.addEventListener}、{@link Conn.removeEventListener}で指定します。
 * @category Connection
 */
export type CallEventListener = (downstreamCall: Model$DownstreamCall) => void;
/**
 * {@link DownstreamReplyCall}を取得するイベントリスナーです。
 * {@link Conn}の{@link Conn.addEventListener}、{@link Conn.removeEventListener}で指定します。
 * @category Connection
 */
export type ReplyCallEventListener = (downstreamReplyCall: Model$DownstreamReplyCall) => void;
/**
 * {@link DisconnectedEvent}を取得するイベントリスナーです。
 * {@link Conn}の{@link Conn.addEventListener}、{@link Conn.removeEventListener}で指定します。
 * @category Connection
 */
export type DisconnectedEventListener = (event: DisconnectedEvent) => void;
/**
 * {@link ReconnectingEvent}を取得するイベントリスナーです。
 * {@link Conn}の{@link Conn.addEventListener}、{@link Conn.removeEventListener}で指定します。
 * @category Connection
 */
export type ReconnectingEventListener = (event: ReconnectingEvent) => void;
/**
 * iSCPが再接続した時のイベントを取得するイベントリスナーです。
 * {@link Conn}の{@link Conn.addEventListener}、{@link Conn.removeEventListener}で指定します。
 * @category Connection
 */
export type ReconnectedEventListener = () => void;
/**
 * iSCPのコネクションを表すクラスです。
 *
 * @category Connection
 *
 * @attention
 * このクラスのオブジェクトは、必ず{@link Conn}の{@link Conn.connect}を使用して生成してください。
 *
 * @example
 * ```ts
 * const example = async () => {
 *   const conn = await Conn.connect(...)
 *   try {
 *     // ...
 *   } finally {
 *     await conn.close()
 *   }
 * }
 * ```
 */
export declare class Conn {
    #private;
    /** エンコーディング名のデフォルト値です。 */
    static readonly DEFAULT_ENCODING_NAME: "proto";
    /** Ping間隔のデフォルト値です（秒）。 */
    static readonly DEFAULT_PING_INTERVAL = 10;
    /** Pingタイムアウトのデフォルト値です（秒）。 */
    static readonly DEFAULT_PING_TIMEOUT = 1;
    /** 有効期限のデフォルト値です（秒）。 */
    static readonly DEFAULT_EXPIRY_INTERVAL = 1;
    /** Ack返却間隔のデフォルト値です（秒）。 */
    static readonly DEFAULT_ACK_INTERVAL = 1;
    /** QoSのデフォルト値です。 */
    static readonly DEFAULT_QOS: 1;
    /** 空チャンク省略フラグのデフォルト値です。 */
    static readonly DEFAULT_OMIT_EMPTY_CHUNK = false;
    /** 永続化するかどうかのデフォルト値です。 */
    static readonly DEFAULT_PERSIST = false;
    /** クローズのタイムアウトのデフォルト値です（秒）。 */
    static readonly DEFAULT_CLOSE_TIMEOUT = 1;
    /** アップストリームクローズ時にセッションをクローズするかどうかのデフォルト値です。 */
    static readonly DEFAULT_CLOSE_SESSION = false;
    /** 自動で再接続するかのデフォルト値です。 */
    static readonly DEFAULT_AUTO_RECONNECT = true;
    /** 自動で再接続する際の、リトライ間隔の初期値のデフォルト値です（秒）。 */
    static readonly DEFAULT_RECONNECT_BASE_INTERVAL = 0.1;
    /** 自動で再接続する際の、リトライ間隔のデフォルト値です（秒）。 */
    static readonly DEFAULT_RECONNECT_MAX_INTERVAL = 5;
    /** 基準時刻を送信する際に永続化するかどうかのデフォルト値です。 */
    static readonly DEFAULT_SEND_BASE_TIME_OPTIONS_PERSIST = false;
    /**
     * @event イベント
     */
    static EVENT: {
        /**
         * E2Eコールを受信した時に呼び出されるイベントです。
         */
        readonly CALL: "call";
        /**
         * E2Eリプライコールを受信した時に呼び出されるイベントです。
         */
        readonly REPLY_CALL: "replyCall";
        /**
         * iSCPが切断された時に呼び出されるイベントです。
         */
        readonly DISCONNECTED: "disconnected";
        /**
         * iSCPの再接続が開始された時に呼び出されるイベントです。
         */
        readonly RECONNECTING: "reconnecting";
        /**
         * iSCPの再接続が成功した時に呼び出されるイベントです。
         */
        readonly RECONNECTED: "reconnected";
    };
    /**
     * iSCP接続を行い{@link Conn}を返却します。
     */
    static connect(config: ConnConfig): Promise<Conn>;
    /**
     * @internal
     */
    constructor(config: {
        logLevel?: LogLevel;
        address: string;
        negotiationParams: NegotiationParams;
        connector: Connector;
        encoding: Encoding;
        nodeId?: string;
        protocolVersion: string;
        pingInterval: number;
        pingTimeout: number;
        projectUuid?: string;
        tokenSource?: TokenSource;
        autoReconnect: boolean;
        reconnectBaseInterval: number;
        reconnectMaxInterval: number;
    });
    /**
     * ノードIDを取得します。
     * @returns ノードID
     */
    get nodeId(): string | undefined;
    /**
     * Ping間隔（秒）を取得します。
     * @returns Ping間隔（秒）
     */
    get pingInterval(): number;
    /**
     * Pingタイムアウト（秒）を取得します。
     * @returns Pingタイムアウト（秒）
     */
    get pingTimeout(): number;
    /**
     * プロジェクトUUIDを取得します。
     * @returns プロジェクトUUID
     */
    get projectUuid(): string | undefined;
    /**
     * アドレスを取得します。
     * @returns アドレス
     */
    get address(): string;
    /**
     * エンコーディング名を取得します。
     * @returns エンコーディング名
     */
    get encoding(): EncodingName;
    /**
     * トランスポート名を取得します。
     * @returns トランスポート名
     */
    get transport(): import("./transport").TransportName;
    /**
     * アップストリームを開きます。
     * @returns アップストリーム
     */
    openUpstream(config: UpstreamConfig): Promise<Upstream>;
    /**
     * ダウンストリームを開きます。
     * @returns ダウンストリーム
     */
    openDownstream(config: DownstreamConfig): Promise<Downstream>;
    /**
     * E2Eコールを送信します。
     * @param upstreamCall アップストリームコール。
     * @returns コールID。
     */
    sendCall(upstreamCall: Model$UpstreamCall): Promise<string>;
    /**
     * E2Eコールのリプライを送信します。
     * @param replyCall アップストリームリプライコール。
     * @returns コールID。
     */
    sendReplyCall(replyCall: Model$UpstreamReplyCall): Promise<string>;
    /**
     * E2Eコールを送信し、リプライコールを受信するまで待ちます。
     * @param upstreamCall アップストリームコール。
     * @returns ダウンストリームリプライコール
     */
    sendCallAndWaitReplyCall(upstreamCall: Model$UpstreamCall): Promise<Model$DownstreamReplyCall>;
    /**
     * 基準時刻を送信します。
     * @param baseTime 基準時刻。
     * @param options 基準時刻を送信する際のオプションを指定します。
     */
    sendBaseTime(baseTime: BaseTime, options?: SendBaseTimeOptions): Promise<void>;
    /**
     * コネクションを閉じます。
     */
    close(): Promise<void>;
    /**
     * コネクションが閉じるまで待機します。
     */
    waitClosed(): Promise<void>;
    /**
     * {@link Conn.EVENT}.CALLのイベントリスナーを追加します。
     * E2Eコールを受信した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * conn.addEventListener(Conn.EVENT.CALL, (downstreamCall: DownstreamCall) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: ConnEvent['CALL'], listener: CallEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.REPLY_CALLのイベントリスナーを追加します。
     * E2Eリプライコールを受信した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * conn.addEventListener(Conn.EVENT.REPLY_CALL, (downstreamReplyCall: DownstreamReplyCall) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: ConnEvent['REPLY_CALL'], listener: ReplyCallEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.DISCONNECTEDのイベントリスナーを追加します。
     * iSCPが切断された時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * conn.addEventListener(Conn.EVENT.DISCONNECTED, (disconnectedEvent) => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: ConnEvent['DISCONNECTED'], listener: DisconnectedEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.RECONNECTINGのイベントリスナーを追加します。
     * iSCPの再接続が開始された時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * conn.addEventListener(Conn.EVENT.RECONNECTING, () => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: ConnEvent['RECONNECTING'], listener: ReconnectingEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.RECONNECTEDのイベントリスナーを追加します。
     * iSCPの再接続が成功した時にイベントリスナーが呼び出されます。
     *
     * @example
     * ```ts
     * conn.addEventListener(Conn.EVENT.RECONNECTED, () => {
     *   ...
     * })
     * ```
     */
    addEventListener(name: ConnEvent['RECONNECTED'], listener: ReconnectedEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.CALLのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (downstreamCall: DownstreamCall) => {
     *   ...
     * }
     *
     * conn.addEventListener(Conn.EVENT.CALL, listener)
     *
     * ...
     *
     * conn.removeEventListener(Conn.EVENT.CALL, listener)
     * ```
     */
    removeEventListener(name: ConnEvent['CALL'], listener: CallEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.REPLY_CALLのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (downstreamReplyCall: DownstreamReplyCall) => {
     *   ...
     * }
     *
     * conn.addEventListener(Conn.EVENT.REPLY_CALL, listener)
     *
     * ...
     *
     * conn.removeEventListener(Conn.EVENT.REPLY_CALL, listener)
     * ```
     */
    removeEventListener(name: ConnEvent['REPLY_CALL'], listener: ReplyCallEventListener, options?: EventListenerOptions): void;
    /**
     * {@link Conn.EVENT}.DISCONNECTEDのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = (closedEvent: DisconnectedEvent) => {
     *   ...
     * }
     *
     * conn.addEventListener(Conn.EVENT.DISCONNECTED, listener)
     *
     * ...
     *
     * conn.removeEventListener(Conn.EVENT.DISCONNECTED, listener)
     * ```
     */
    removeEventListener(name: ConnEvent['DISCONNECTED'], listener: DisconnectedEventListener): void;
    /**
     * {@link Conn.EVENT}.RECONNECTINGのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = () => {
     *   ...
     * }
     *
     * conn.addEventListener(Conn.EVENT.RECONNECTING, listener)
     *
     * ...
     *
     * conn.removeEventListener(Conn.EVENT.RECONNECTING, listener)
     * ```
     */
    removeEventListener(name: ConnEvent['RECONNECTING'], listener: ReconnectingEventListener): void;
    /**
     * {@link Conn.EVENT}.RECONNECTEDのイベントリスナーを削除します。
     * {@link addEventListener}で指定したイベントリスナーを指定してください。
     *
     * @example
     * ```ts
     * const listener = () => {
     *   ...
     * }
     *
     * conn.addEventListener(Conn.EVENT.RECONNECTED, listener)
     *
     * ...
     *
     * conn.removeEventListener(Conn.EVENT.RECONNECTED, listener)
     * ```
     */
    removeEventListener(name: ConnEvent['RECONNECTED'], listener: ReconnectedEventListener): void;
}
export {};
