import { ClientRoleOptions } from '@agora-js/shared';
import { CloudProxyServerMode } from '@agora-js/shared';
import { EncryptionMode } from '@agora-js/shared';
import { Extmap } from '@agora-js/shared';
import { FingerPrint } from '@agora-js/shared';
import type { JsonObject } from '@bufbuild/protobuf';
import type { Message } from '@bufbuild/protobuf';
import { PayloadAttribute } from '@agora-js/shared';
import { RemoteStreamType } from '@agora-js/media';
import { RetryConfiguration } from '@agora-js/shared';
import { RTMConfiguration } from '@agora-js/shared';
import { SDK_CODEC } from '@agora-js/shared';
import { SDK_MODE } from '@agora-js/shared';
import { SDKStore } from '@agora-js/shared';
import { TurnServerConfigWithMode } from '@agora-js/shared';
import { UID } from '@agora-js/shared';
import type { Value } from '@bufbuild/protobuf/wkt';

/**
 * @generated from enum io.agora.pb.AudioExtensionName
 */
declare enum AudioExtensionName {
    /**
     * "urn:ietf:params:rtp-hdrext:ssrc-audio-level"
     *
     * @generated from enum value: AUDIO_EXT_AUDIO_LEVEL = 0;
     */
    AUDIO_EXT_AUDIO_LEVEL = 0,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"
     *
     * @generated from enum value: AUDIO_EXT_ABS_SEND_TIME = 1;
     */
    AUDIO_EXT_ABS_SEND_TIME = 1,
    /**
     * "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"
     *
     * @generated from enum value: AUDIO_EXT_TWCC = 2;
     */
    AUDIO_EXT_TWCC = 2,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:mid"
     *
     * @generated from enum value: AUDIO_EXT_SDES_MID = 3;
     */
    AUDIO_EXT_SDES_MID = 3,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
     *
     * @generated from enum value: AUDIO_EXT_SDES_RTP_STREAM_ID = 4;
     */
    AUDIO_EXT_SDES_RTP_STREAM_ID = 4,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"
     *
     * @generated from enum value: AUDIO_EXT_SDS_REPAIRED_RTP_STREAM_ID = 5;
     */
    AUDIO_EXT_SDS_REPAIRED_RTP_STREAM_ID = 5
}

export declare interface ChooseServerResponse {
    code: number;
    addresses: ServerAddress[];
    server_ts: number;
    uid: number;
    cid: number;
    cert: string;
    detail?: {
        [id: number]: string;
        candidate?: string;
    };
    cname?: string;
    flag?: number;
    opid?: number;
    signalResponse?: SignalResponse;
}

export declare interface DtlsParameters {
    fingerprints: FingerPrint[];
}

/**
 * Encoding Name
 * 枚举定义了已知的编码名称，用于类型规范和文档说明
 *
 * @generated from enum io.agora.pb.EncodingName
 */
declare enum EncodingName {
    /**
     * @generated from enum value: ENCODING_NAME_UNSPECIFIED = 0;
     */
    UNSPECIFIED = 0,
    /**
     * "VP8"
     *
     * @generated from enum value: ENCODING_NAME_VP8 = 1;
     */
    VP8 = 1,
    /**
     * "VP9"
     *
     * @generated from enum value: ENCODING_NAME_VP9 = 2;
     */
    VP9 = 2,
    /**
     * "H264"
     *
     * @generated from enum value: ENCODING_NAME_H264 = 3;
     */
    H264 = 3,
    /**
     * "H265"
     *
     * @generated from enum value: ENCODING_NAME_H265 = 4;
     */
    H265 = 4,
    /**
     * "AV1"
     *
     * @generated from enum value: ENCODING_NAME_AV1 = 5;
     */
    AV1 = 5,
    /**
     * "G711"
     *
     * @generated from enum value: ENCODING_NAME_G711 = 6;
     */
    G711 = 6,
    /**
     * "G722"
     *
     * @generated from enum value: ENCODING_NAME_G722 = 7;
     */
    G722 = 7,
    /**
     * "opus"
     *
     * @generated from enum value: ENCODING_NAME_OPUS = 8;
     */
    OPUS = 8,
    /**
     * "PCMU"
     *
     * @generated from enum value: ENCODING_NAME_PCMU = 9;
     */
    PCMU = 9,
    /**
     * "PCMA"
     *
     * @generated from enum value: ENCODING_NAME_PCMA = 10;
     */
    PCMA = 10,
    /**
     * "CN"
     *
     * @generated from enum value: ENCODING_NAME_CN = 11;
     */
    CN = 11,
    /**
     * "telephone-event"
     *
     * @generated from enum value: ENCODING_NAME_TELEPHONE_EVENT = 12;
     */
    TELEPHONE_EVENT = 12,
    /**
     * "rtx"
     *
     * @generated from enum value: ENCODING_NAME_RTX = 13;
     */
    RTX = 13,
    /**
     * "red"
     *
     * @generated from enum value: ENCODING_NAME_RED = 14;
     */
    RED = 14
}

/**
 * Extmap
 *
 * @generated from message io.agora.pb.Extmap
 */
export declare type ExtmapProto = Message<"io.agora.pb.Extmap"> & {
    /**
     * 必需字段，extension id
     *
     * @generated from field: uint32 entry = 1;
     */
    entry: number;
    /**
     * extension name
     * 如果在 VideoExtensionName 或 AudioExtensionName 枚举中，使用枚举值（数字）
     * 否则使用完整的字符串
     * 使用 google.protobuf.Value 来支持 string | number 类型
     *
     * 必需字段（message 类型本身就是可选的）
     *
     * @generated from field: google.protobuf.Value extension_name = 2;
     */
    extensionName?: Value;
    /**
     * extension direction
     *
     * @generated from field: optional string direction = 3;
     */
    direction?: string;
    /**
     * extension attributes
     *
     * @generated from field: optional string extension_attributes = 4;
     */
    extensionAttributes?: string;
};

/**
 * Feedback
 *
 * @generated from message io.agora.pb.Feedback
 */
declare type Feedback = Message<"io.agora.pb.Feedback"> & {
    /**
     * 使用 FeedbackType 枚举值（推荐用于已知类型）
     *
     * 值为 FeedbackType 枚举值
     *
     * @generated from field: optional uint32 enum_type = 1;
     */
    enumType?: number;
    /**
     * 使用字符串（用于自定义类型或向后兼容，如 "ack" | "nack" | "trr-int" | string）
     *
     * 值为字符串
     *
     * @generated from field: optional string string_type = 2;
     */
    stringType?: string;
    /**
     * parameter: "rpsi" | "app" | string
     *
     * @generated from field: optional string parameter = 3;
     */
    parameter?: string;
    /**
     * additional
     *
     * @generated from field: optional string additional = 4;
     */
    additional?: string;
    /**
     * 对应 type 为 trr-int 时，interval 的值
     *
     * @generated from field: optional string interval = 5;
     */
    interval?: string;
};

/**
 * Feedback Type
 * 枚举定义了已知的反馈类型，用于类型规范和文档说明
 *
 * @generated from enum io.agora.pb.FeedbackType
 */
declare enum FeedbackType {
    /**
     * @generated from enum value: FEEDBACK_TYPE_UNSPECIFIED = 0;
     */
    UNSPECIFIED = 0,
    /**
     * "goog-remb"
     *
     * @generated from enum value: FEEDBACK_TYPE_GOOG_REMB = 1;
     */
    GOOG_REMB = 1,
    /**
     * "transport-cc"
     *
     * @generated from enum value: FEEDBACK_TYPE_TRANSPORT_CC = 2;
     */
    TRANSPORT_CC = 2,
    /**
     * "ccm"
     *
     * @generated from enum value: FEEDBACK_TYPE_CCM = 3;
     */
    CCM = 3,
    /**
     * "nack"
     *
     * @generated from enum value: FEEDBACK_TYPE_NACK = 4;
     */
    NACK = 4,
    /**
     * "rrtr"
     *
     * @generated from enum value: FEEDBACK_TYPE_RRTR = 5;
     */
    RRTR = 5
}

/**
 * FMTP
 *
 * @generated from message io.agora.pb.Fmtp
 */
declare type Fmtp = Message<"io.agora.pb.Fmtp"> & {
    /**
     * params: Record<string, string | null>
     * 使用 google.protobuf.Value 来支持 string | null 类型
     * 使用 FmtpParameter 枚举值作为键（推荐用于已知参数）
     *
     * 键为 FmtpParameter 枚举值
     *
     * @generated from field: map<uint32, google.protobuf.Value> enum_parameters = 1;
     */
    enumParameters: {
        [key: number]: Value;
    };
    /**
     * 使用字符串作为键（用于自定义参数或向后兼容）
     *
     * 键为字符串
     *
     * @generated from field: map<string, google.protobuf.Value> string_parameters = 2;
     */
    stringParameters: {
        [key: string]: Value;
    };
};

/**
 * FMTP Parameter Names
 * 枚举定义了已知的 FMTP 参数名称，用于类型规范和文档说明
 *
 * @generated from enum io.agora.pb.FmtpParameter
 */
declare enum FmtpParameter {
    /**
     * @generated from enum value: FMTP_PARAMETER_UNSPECIFIED = 0;
     */
    UNSPECIFIED = 0,
    /**
     * "minptime"
     *
     * @generated from enum value: FMTP_PARAMETER_MINPTIME = 1;
     */
    MINPTIME = 1,
    /**
     * "useinbandfec"
     *
     * @generated from enum value: FMTP_PARAMETER_USEINBANDFEC = 2;
     */
    USEINBANDFEC = 2,
    /**
     * "level-id"
     *
     * @generated from enum value: FMTP_PARAMETER_LEVEL_ID = 3;
     */
    LEVEL_ID = 3,
    /**
     * "profile-id"
     *
     * @generated from enum value: FMTP_PARAMETER_PROFILE_ID = 4;
     */
    PROFILE_ID = 4,
    /**
     * "tier-flag"
     *
     * @generated from enum value: FMTP_PARAMETER_TIER_FLAG = 5;
     */
    TIER_FLAG = 5,
    /**
     * "tx-mode"
     *
     * @generated from enum value: FMTP_PARAMETER_TX_MODE = 6;
     */
    TX_MODE = 6,
    /**
     * "level-asymmetry-allowed"
     *
     * @generated from enum value: FMTP_PARAMETER_LEVEL_ASYMMETRY_ALLOWED = 7;
     */
    LEVEL_ASYMMETRY_ALLOWED = 7,
    /**
     * "packetization-mode"
     *
     * @generated from enum value: FMTP_PARAMETER_PACKETIZATION_MODE = 8;
     */
    PACKETIZATION_MODE = 8,
    /**
     * "profile-level-id"
     *
     * @generated from enum value: FMTP_PARAMETER_PROFILE_LEVEL_ID = 9;
     */
    PROFILE_LEVEL_ID = 9,
    /**
     * "level-idx"
     *
     * @generated from enum value: FMTP_PARAMETER_LEVEL_IDX = 10;
     */
    LEVEL_IDX = 10,
    /**
     * "profile"
     *
     * @generated from enum value: FMTP_PARAMETER_PROFILE = 11;
     */
    PROFILE = 11,
    /**
     * "tier"
     *
     * @generated from enum value: FMTP_PARAMETER_TIER = 12;
     */
    TIER = 12
}

export declare interface GatewayAddress {
    ip?: string;
    ip6?: string;
    port?: number;
    address: string;
}

export declare interface GatewayClientSpec {
    role?: "host" | "audience";
    codec: SDK_CODEC;
    mode: SDK_MODE;
    clientId: string;
    httpRetryConfig: RetryConfiguration;
    websocketRetryConfig: RetryConfiguration;
    /**
     * 如果请求网关时网关断开，打开这个配置会等待网关恢复而不是直接抛错，默认打开
     */
    forceWaitGatewayResponse: boolean;
    clientRoleOptions?: ClientRoleOptions;
}

export declare interface GatewayEstablishParams extends RestartICEResponse {
    dtlsParameters: {
        role: "server" | "client" | "auto";
        fingerprints: {
            algorithm: string;
            fingerprint: string;
        }[];
    };
    rtpCapabilities: RTPCapabilitiesBeforeMerge;
    cname: string;
}

export declare interface GatewayInfo {
    gatewayAddrs: GatewayAddress[];
    apGatewayAddress?: GatewayAddress;
    uid: number;
    cid: number;
    cert: string;
    vid?: string;
    uni_lbs_ip?: string;
    res: ChooseServerResponse;
    csIp?: string;
}

export declare interface GatewayJoinResponse {
    attributes: {
        userAttributes: {
            preSubSsrcs?: PreSubSsrc[];
            subscribeAudioFilterTopN?: number;
        } & {
            [key: string]: any;
        };
    };
    rejoin_token: string;
    return_vosip: false;
    uid: UID;
    /**
     * sdp endpoint 返回 才会有这个字段
     */
    intUid?: number;
    vid?: number;
    ortc: GatewayEstablishParams;
    rtpCapabilities: RTPCapabilitiesWithDirection;
}

export declare function getEncodingName(encodingName?: EncodingName): string | undefined;

export declare function getEncodingNameEnum(encodingName?: string): EncodingName | undefined;

export declare function getExtmapName(type: "audio" | "video", extmapName?: AudioExtensionName | VideoExtensionName): string | undefined;

export declare function getExtmapNameEnum(type: "audio" | "video", extmapName: string): AudioExtensionName | VideoExtensionName | undefined;

export declare function getFeedbackTypeName(feedbackTypeName?: FeedbackType): string | undefined;

export declare function getFeedbackTypeNameEnum(feedbackTypeName?: string): FeedbackType | undefined;

export declare function getFmtpParameterName(parameterName?: FmtpParameter): string | undefined;

export declare function getFmtpParameterNameEnum(parameterName?: string): FmtpParameter | undefined;

export declare function getGatewayOrtc(localCap: RTPCapabilitiesBeforeMerge, addOrtcPb?: RtpCapBeforeMerge, delOrtcPb?: RtpCapBeforeMerge): RTPCapabilitiesWithDirection;

export declare function getJoinV3Message(store: SDKStore, joinInfo: JoinInfoWithAPResponse, spec: GatewayClientSpec, { key, role, joinGatewayStartTime, hasChangeBGPAddress, isPreallocation, ortc, currentURLIndex, }: {
    key: string;
    role: "host" | "audience";
    joinGatewayStartTime: number;
    hasChangeBGPAddress: boolean;
    isPreallocation: boolean;
    ortc?: JoinV3MessageOrtc;
    currentURLIndex: number;
}): JoinV3;

export declare function getJoinV4Message(store: SDKStore, joinInfo: JoinInfoWithAPResponse | JoinInfo, { mode, codec, joinGatewayStartTime, hasChangeBGPAddress, }: {
    mode: SDK_MODE;
    codec: SDK_CODEC;
    joinGatewayStartTime: number;
    hasChangeBGPAddress: boolean;
}): JoinV4;

export declare function getJoinV4MessageOrtc(ortc: JoinV3MessageOrtc): JoinV4ORTC;

export declare function getSDPEndPointPb(store: SDKStore, info: JoinInfo, areaCode: string | undefined, serviceIds: SERVICE_IDS[], { opid, mode, codec, hasChangeBGPAddress, ortc, }: {
    opid: number;
    mode: SDK_MODE;
    codec: SDK_CODEC;
    hasChangeBGPAddress: boolean;
    ortc: JoinV3MessageOrtc;
}): ArrayBuffer;

export declare interface ICEParameters {
    iceUfrag: string;
    icePwd: string;
}

export declare interface JoinInfo extends Partial<RTMConfiguration> {
    clientId: string;
    appId: string;
    sid: string;
    cname: string;
    turnServer: TurnServerConfigWithMode;
    proxyServer?: string;
    token: string;
    cloudProxyServer: CloudProxyServerMode;
    uid?: number | null;
    stringUid?: string;
    aespassword?: string;
    aessalt?: string;
    aesmode?: EncryptionMode;
    multiIP?: MultiIpOptions;
    optionalInfo?: string;
    appScenario?: string;
    useLocalAccessPoint: boolean;
    apUrl?: string;
    defaultVideoStream?: RemoteStreamType;
    license?: string;
    setLocalAPVersion?: number;
    preload?: boolean;
    apRequestDetail?: string;
    role?: "host" | "audience";
}

export declare interface JoinInfoWithAPResponse extends JoinInfo {
    cid: number;
    uid: number;
    vid?: string;
    apResponse: ChooseServerResponse;
    /** 本次 SDP Endpoint 请求所使用的本地 ICE，用于确认 join_v3 仍在使用同一个 PC。 */
    sdpEndpointLocalIceParameters?: ICEParameters;
    apGatewayAddress?: GatewayAddress;
    gatewayAddrs: GatewayAddress[];
    uni_lbs_ip?: string;
    signalResponse?: SignalResponse;
}

declare interface JoinMessageAttributes {
    userAttributes: JoinMessageUserAttributes;
}

declare interface JoinMessageDetails {
    /**
     * 等同于 ap_response.detail?.[6]，感觉没必要，直接用 ap_response.detail 即可
     */
    6?: string;
    /**
     * 判别当前是否开了 proxy， 1 表示开了proxy3，2 表示开proxy5, undefined 表示没有开
     */
    cservice_map?: "1" | "2";
}

export declare interface JoinMessageUserAttributes extends Partial<Record<keyof typeof UserAttributeFeature1, boolean>>, Partial<Omit<Required<UserAttributes>, "$typeName" | "$unknown" | "feature2" | "feature1">> {
    [key: string]: any;
}

/**
 * 网关 join v3 参数
 * @public
 */
export declare interface JoinV3 {
    /**
     * 许可证
     * 保留字段，内部接口 client.setLicense 可以设置
     */
    license?: string | undefined;
    /**
     * P2P ID
     * 表示 第几个 pc，从 0 开始
     */
    p2p_id: number;
    /**
     * 会话 ID
     */
    session_id: string;
    /**
     * 客户 appid
     */
    app_id: string;
    /**
     * 客户传进来的token
     */
    channel_key: string;
    /**
     * 频道名
     */
    channel_name: string;
    /**
     * SDK 版本
     */
    sdk_version: string;
    /**
     * 浏览器 ua
     */
    browser: string;
    /**
     * 进程 ID，页面唯一
     */
    process_id?: string;
    /**
     * SDK 模式
     */
    mode: SDK_MODE;
    /**
     * 视频预设编码格式
     */
    codec: SDK_CODEC;
    /**
     * 角色
     */
    role?: "host" | "audience";
    /**
     * 和 multi-ip 相关的 flag
     */
    has_changed_gateway: boolean;
    /**
     * AP 响应
     */
    ap_response: ChooseServerResponse & {
        ticket?: string;
    };
    /**
     * 扩展, 对应私有参数：JOIN_EXTEND
     */
    extend?: any;
    /**
     * 一些拓展字段，目前有 6，cservice_map
     */
    details: JoinMessageDetails;
    /**
     * 保留字段，感觉无用可删
     * @deprecated
     */
    features: {
        rejoin: true;
        multi_signaling?: boolean;
    };
    /**
     * 兼容老的 join 参数， client.join 的 optionalInfo 参数
     */
    optionalInfo?: string;
    /**
     * 保留字段
     * 私有参数 REPORT_APP_SCENARIO
     */
    appScenario?: string;
    /**
     * 网关的一些 实验性功能 开关
     */
    attributes: JoinMessageAttributes;
    /**
     * 开始加入网关的时间戳，ws connect 前, xx_ts 都是64位
     */
    join_ts: number;
    /**
     * 客户的 string uid
     */
    string_uid?: string;
    /**
     * 客户开启加密后，加密方式
     */
    aes_mode?: EncryptionMode;
    /**
     * 客户开启加密后，加密密钥
     */
    aes_secret?: string;
    /**
     * 客户开启加密后，是否开启加密
     */
    aes_encrypt?: boolean;
    /**
     * 客户开启加密后，加密盐
     */
    aes_salt?: string;
    /**
     * 默认视频流类型
     */
    default_video_stream?: RemoteStreamType;
    /**
     * ORTC 参数
     */
    ortc: JoinV3MessageOrtc;
}

export declare type JoinV3MessageOrtc = {
    iceParameters: ICEParameters;
    dtlsParameters: DtlsParameters;
    rtpCapabilities: RTPCapabilitiesBeforeMerge;
    version?: string;
};

export declare type JoinV3WithoutAPResponse = Omit<JoinV3, "ap_response">;

export declare type JoinV4 = Omit<SignalRequest, "$typeName" | "attributes"> & {
    attributes: JoinV4UserAttributes;
};

export declare type JoinV4Extmap = Omit<ExtmapProto, "$typeName" | "$unknown" | "extensionName"> & {
    extensionName: number | string;
};

export declare type JoinV4Feedback = Omit<Feedback, "$typeName" | "$unknown">;

export declare type JoinV4Fmtp = Partial<Omit<Fmtp, "$typeName" | "$unknown">>;

export declare type JoinV4ORTC = Omit<ORTC, "$typeName" | "$unknown" | "send" | "recv" | "sendRecv"> & {
    send?: JoinV4RtpCap;
    recv?: JoinV4RtpCap;
    sendRecv?: JoinV4RtpCap;
};

export declare type JoinV4PayloadAttribute = Omit<PayloadAttributeProto, "$typeName" | "$unknown" | "rtpMap" | "fmtp" | "rtcpFeedbacks"> & {
    rtpMap?: JoinV4RtpMap;
    fmtp?: JoinV4Fmtp;
    rtcpFeedbacks: JoinV4Feedback[];
};

export declare type JoinV4RtpCap = Omit<RtpCap, "$typeName" | "$unknown" | "audioCodecs" | "videoCodecs" | "audioExtensions" | "videoExtensions"> & {
    audioCodecs: JoinV4PayloadAttribute[];
    videoCodecs: JoinV4PayloadAttribute[];
    audioExtensions: JoinV4Extmap[];
    videoExtensions: JoinV4Extmap[];
};

export declare type JoinV4RtpMap = Omit<RtpMap, "$typeName" | "$unknown" | "clockRate"> & {
    clockRate: string;
};

export declare type JoinV4UserAttributes = Partial<Omit<UserAttributes, "$typeName" | "$unknown">>;

export declare interface MultiIpOptions {
    gateway_ip: string;
    uni_lbs_ip: string;
}

/**
 * 对应 TypeScript 的 MultiUnilbsRequest 接口
 *
 * @generated from message io.agora.pb.MultiUnilbsRequest
 */
declare type MultiUnilbsRequest = Message<"io.agora.pb.MultiUnilbsRequest"> & {
    /**
     * uri 固定为 22
     *
     * @generated from field: uint32 uri = 1;
     */
    uri: number;
    /**
     * detail 使用 google.protobuf.Struct 来支持 { [id: number]: string | undefined | number } 结构
     * 注意：number 类型的 key 在 protobuf 中需要转换为 string
     *
     * @generated from field: google.protobuf.Struct detail = 2;
     */
    detail?: JsonObject;
    /**
     * service IDs 数组
     *
     * @generated from field: repeated uint32 service_ids = 3;
     */
    serviceIds: number[];
};

export declare type MultiUnilbsRequestBody = Omit<MultiUnilbsRequest, "$typeName">;

export declare interface MultiUnilbsResponse {
    detail: {
        502: string;
    };
    enter_ts: number;
    leave_ts: number;
    opid: number;
    response_body: MultiUnilbsResponseBody[];
    wan_ip?: string;
}

export declare interface MultiUnilbsResponseBody {
    buffer: {
        cert: string;
        cid: number;
        cname: string;
        code: number;
        detail: {
            [id: number]: string;
        };
        edges_services: {
            ip: string;
            port: number;
            fingerprint?: string;
            iceUfrag?: string;
            icePwd?: string;
        }[];
        flag: number;
        uid: number;
    };
    uri: 23 | 29;
}

/**
 * Message ORTC
 *
 * @generated from message io.agora.pb.ORTC
 */
declare type ORTC = Message<"io.agora.pb.ORTC"> & {
    /**
     * ice Ufrag 和 ice Pwd
     * 格式为 [iceUfrag, icePwd]
     *
     * [string, string]，空数组表示未设置
     *
     * @generated from field: repeated string ice = 1;
     */
    ice: string[];
    /**
     * fingerprints，可能存在多个
     * 格式为 [{"sha-256": "fingerprint1"}, {"sha-256": "fingerprint2"}]
     * 使用 google.protobuf.Struct 数组来支持动态 key-value 对
     *
     * 空数组表示未设置
     *
     * @generated from field: repeated google.protobuf.Struct dtls = 2;
     */
    dtls: JsonObject[];
    /**
     * rtp capabilities
     *
     * send（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap send = 3;
     */
    send?: RtpCap;
    /**
     * recv（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap recv = 4;
     */
    recv?: RtpCap;
    /**
     * sendrecv（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap send_recv = 5;
     */
    sendRecv?: RtpCap;
};

export declare function parseSDPEndPointResponse(info: JoinInfo, ortc: JoinV3MessageOrtc, data: ArrayBuffer): SDPEndPointResponse;

export declare function parseSDPEndPointResponseJson(data: ArrayBuffer): MultiUnilbsResponse;

/**
 * Payload Attribute
 *
 * @generated from message io.agora.pb.PayloadAttribute
 */
export declare type PayloadAttributeProto = Message<"io.agora.pb.PayloadAttribute"> & {
    /**
     * rtp map（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpMap rtp_map = 1;
     */
    rtpMap?: RtpMap;
    /**
     * fmtp（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.Fmtp fmtp = 2;
     */
    fmtp?: Fmtp;
    /**
     * 必需字段，rtcp feedbacks
     *
     * @generated from field: repeated io.agora.pb.Feedback rtcp_feedbacks = 3;
     */
    rtcpFeedbacks: Feedback[];
    /**
     * 必需字段，payload type
     *
     * @generated from field: uint32 payload_type = 4;
     */
    payloadType: number;
};

export declare interface PreSubSsrc {
    a: number;
    a_rtx: number;
    v: number;
    v_rtx: number;
}

export declare interface RestartICEResponse {
    iceParameters: {
        candidates: {
            foundation: string;
            priority: number;
            ip: string;
            port: number;
            protocol: string;
            type: string;
        }[];
        icePwd: string;
        iceUfrag: string;
    };
}

/**
 * RTP Capabilities
 *
 * @generated from message io.agora.pb.RtpCap
 */
declare type RtpCap = Message<"io.agora.pb.RtpCap"> & {
    /**
     * audio codecs
     *
     * @generated from field: repeated io.agora.pb.PayloadAttribute audio_codecs = 1;
     */
    audioCodecs: PayloadAttributeProto[];
    /**
     * video codecs
     *
     * @generated from field: repeated io.agora.pb.PayloadAttribute video_codecs = 2;
     */
    videoCodecs: PayloadAttributeProto[];
    /**
     * audio extensions
     *
     * @generated from field: repeated io.agora.pb.Extmap audio_extensions = 3;
     */
    audioExtensions: ExtmapProto[];
    /**
     * video extensions
     *
     * @generated from field: repeated io.agora.pb.Extmap video_extensions = 4;
     */
    videoExtensions: ExtmapProto[];
};

export declare interface RTPCapabilities {
    audioCodecs: PayloadAttribute[];
    videoCodecs: PayloadAttribute[];
    audioExtensions: Extmap[];
    videoExtensions: Extmap[];
}

export declare interface RTPCapabilitiesBeforeMerge extends Partial<RTPCapabilitiesWithDirection> {
    sendrecv?: RTPCapabilities;
}

export declare interface RTPCapabilitiesWithDirection {
    send: RTPCapabilities;
    recv: RTPCapabilities;
}

/**
 * RTP Capabilities Before Merge
 *
 * @generated from message io.agora.pb.RtpCapBeforeMerge
 */
declare type RtpCapBeforeMerge = Message<"io.agora.pb.RtpCapBeforeMerge"> & {
    /**
     * send（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap send = 1;
     */
    send?: RtpCap;
    /**
     * recv（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap recv = 2;
     */
    recv?: RtpCap;
    /**
     * sendrecv（message 类型本身就是可选的）
     *
     * @generated from field: io.agora.pb.RtpCap send_recv = 3;
     */
    sendRecv?: RtpCap;
};

/**
 * RTP Map
 *
 * @generated from message io.agora.pb.RtpMap
 */
declare type RtpMap = Message<"io.agora.pb.RtpMap"> & {
    /**
     * 使用 EncodingName 枚举值（推荐用于已知编码）
     *
     * 值为 EncodingName 枚举值
     *
     * @generated from field: optional uint32 enum_encoding_name = 1;
     */
    enumEncodingName?: number;
    /**
     * 使用字符串（用于自定义编码或向后兼容）
     *
     * 值为字符串
     *
     * @generated from field: optional string string_encoding_name = 2;
     */
    stringEncodingName?: string;
    /**
     * 必需字段，clockRate
     *
     * @generated from field: google.protobuf.Value clock_rate = 3;
     */
    clockRate?: Value;
    /**
     * encodingParameters
     *
     * @generated from field: optional uint32 encoding_parameters = 4;
     */
    encodingParameters?: number;
};

export declare type SdpEndpointRequest = Omit<SdpEndpointRequest_2, "$typeName" | "unilbs" | "signal" | "ortc" | "opid"> & {
    opid: number;
    unilbs: MultiUnilbsRequestBody[];
    signal: JoinV4;
    ortc: JoinV4ORTC;
};

/**
 * 主请求消息
 * 对应 TypeScript 的 SdpEndpointRequest 接口
 *
 * @generated from message io.agora.pb.SdpEndpointRequest
 */
declare type SdpEndpointRequest_2 = Message<"io.agora.pb.SdpEndpointRequest"> & {
    /**
     * unilbs 数组
     *
     * @generated from field: repeated io.agora.pb.MultiUnilbsRequest unilbs = 1;
     */
    unilbs: MultiUnilbsRequest[];
    /**
     * 用户 ID(实际使用uint32_t)
     *
     * @generated from field: uint32 uid = 2;
     */
    uid: number;
    /**
     * 操作 ID, 64 位
     *
     * @generated from field: uint64 opid = 3;
     */
    opid: bigint;
    /**
     * @generated from field: io.agora.pb.SignalRequest signal = 4;
     */
    signal?: SignalRequest;
    /**
     * ORTC协商
     *
     * @generated from field: io.agora.pb.ORTC ortc = 5;
     */
    ortc?: ORTC;
};

export declare interface SDPEndPointResponse extends MultiUnilbsResponse {
    signalResponse?: SignalResponse;
}

export declare interface ServerAddress {
    ip: string;
    port: number;
    fingerprint?: string;
    domain_prefix?: string;
    ticket: string;
    iceUfrag?: string;
    icePwd?: string;
}

export declare enum SERVICE_IDS {
    CHOOSE_SERVER = 11,
    CLOUD_PROXY = 18,
    CLOUD_PROXY_5 = 20,
    CLOUD_PROXY_FALLBACK = 26
}

/**
 * @generated from message io.agora.pb.SignalRequest
 */
declare type SignalRequest = Message<"io.agora.pb.SignalRequest"> & {
    /**
     * 使用 optional 关键字来区分 undefined 和默认值
     *
     * 许可证，保留字段
     *
     * @generated from field: optional string license = 1;
     */
    license?: string;
    /**
     * 必需字段，P2P ID，表示第几个 pc，从 0 开始
     *
     * @generated from field: uint32 p2p_id = 2;
     */
    p2pId: number;
    /**
     * 必需字段，会话 ID
     *
     * @generated from field: string session_id = 3;
     */
    sessionId: string;
    /**
     * 必需字段，客户 appid
     *
     * @generated from field: string app_id = 4;
     */
    appId: string;
    /**
     * 必需字段，客户传进来的channel_key(token)
     *
     * @generated from field: string channel_key = 5;
     */
    channelKey: string;
    /**
     * 必需字段，频道名
     *
     * @generated from field: string channel_name = 6;
     */
    channelName: string;
    /**
     * 必需字段，SDK 版本
     *
     * @generated from field: string sdk_version = 7;
     */
    sdkVersion: string;
    /**
     * 选填字段，浏览器 ua
     *
     * @generated from field: optional string browser = 8;
     */
    browser?: string;
    /**
     * 进程 ID，页面唯一，可能是任意类型（message 类型本身就是可选的）
     *
     * @generated from field: google.protobuf.Value process_id = 9;
     */
    processId?: Value;
    /**
     * 必需字段，SDK_MODE | "p2p"
     *
     * @generated from field: string mode = 10;
     */
    mode: string;
    /**
     * 必需字段，SDK_CODEC
     *
     * @generated from field: string codec = 11;
     */
    codec: string;
    /**
     * "host" | "audience"
     *
     * @generated from field: optional string role = 12;
     */
    role?: string;
    /**
     * 和 multi-ip 相关的 flag
     *
     * @generated from field: optional bool has_changed_gateway = 13;
     */
    hasChangedGateway?: boolean;
    /**
     * 扩展, 对应私有参数：JOIN_EXTEND（message 类型本身就是可选的）
     *
     * @generated from field: optional string extend = 14;
     */
    extend?: string;
    /**
     * "1" | "2"，判别当前是否开了 proxy
     *
     * @generated from field: optional string cservice_map = 15;
     */
    cserviceMap?: string;
    /**
     * 兼容老的 join 参数，client.join 的 optionalInfo 参数
     *
     * @generated from field: optional string optional_info = 16;
     */
    optionalInfo?: string;
    /**
     * 保留字段，私有参数 REPORT_APP_SCENARIO
     *
     * @generated from field: optional string app_scenario = 17;
     */
    appScenario?: string;
    /**
     * 必需字段，网关的一些实验性功能开关
     *
     * @generated from field: io.agora.pb.UserAttributes attributes = 18;
     */
    attributes?: UserAttributes;
    /**
     * 必需字段，开始加入网关的时间戳，ws connect 前
     *
     * @generated from field: uint64 request_ts = 19;
     */
    requestTs: bigint;
    /**
     * 客户的 string uid
     *
     * @generated from field: optional string string_uid = 20;
     */
    stringUid?: string;
    /**
     * EncryptionMode
     *
     * @generated from field: optional string aes_mode = 21;
     */
    aesMode?: string;
    /**
     * 客户开启加密后，加密密钥
     *
     * @generated from field: optional string aes_secret = 22;
     */
    aesSecret?: string;
    /**
     * 客户开启加密后，是否开启加密
     *
     * @generated from field: optional bool aes_encrypt = 23;
     */
    aesEncrypt?: boolean;
    /**
     * 客户开启加密后，加密盐
     *
     * @generated from field: optional string aes_salt = 24;
     */
    aesSalt?: string;
    /**
     * RemoteStreamType，默认视频流类型
     *
     * @generated from field: optional uint32 default_video_stream = 25;
     */
    defaultVideoStream?: number;
};

export declare type SignalResponse = Omit<GatewayJoinResponse, "ortc">;

/**
 * UserAttributes 位标志枚举
 * 用于 UserAttributes.f 字段的位标志值
 * 注意：这些值对应 TypeScript 中的 USER_ATTRIBUTE_BOOLEAN_FIELD_MAP
 *
 * @generated from enum io.agora.pb.UserAttributeFeature1
 */
declare enum UserAttributeFeature1 {
    /**
     * 未指定（必须为 0，proto3 要求第一个枚举值必须为 0）
     *
     * @generated from enum value: UNSPECIFIED = 0;
     */
    UNSPECIFIED = 0,
    /**
     * 位标志值（1 << 0 = 1, 1 << 1 = 2, 1 << 2 = 4, ...）
     *
     * 1 << 0
     *
     * @generated from enum value: enableEncodedTransform = 1;
     */
    enableEncodedTransform = 1,
    /**
     * 1 << 1
     *
     * @generated from enum value: enableAudioMetadata = 2;
     */
    enableAudioMetadata = 2,
    /**
     * 1 << 2
     *
     * @generated from enum value: enableAudioPts = 4;
     */
    enableAudioPts = 4,
    /**
     * 1 << 3
     *
     * @generated from enum value: enableNetworkQualityProbe = 8;
     */
    enableNetworkQualityProbe = 8,
    /**
     * 1 << 4
     *
     * @generated from enum value: enablePublishedUserList = 16;
     */
    enablePublishedUserList = 16,
    /**
     * 1 << 5
     *
     * @generated from enum value: enablePublishAudioFilter = 32;
     */
    enablePublishAudioFilter = 32,
    /**
     * 1 << 6
     *
     * @generated from enum value: enableUserLicenseCheck = 64;
     */
    enableUserLicenseCheck = 64,
    /**
     * 1 << 7
     *
     * @generated from enum value: enableRTX = 128;
     */
    enableRTX = 128,
    /**
     * 1 << 8
     *
     * @generated from enum value: enableNTPReport = 256;
     */
    enableNTPReport = 256,
    /**
     * 1 << 9
     *
     * @generated from enum value: enableInstantVideo = 512;
     */
    enableInstantVideo = 512,
    /**
     * 1 << 10
     *
     * @generated from enum value: enableFulllinkAvSync = 1024;
     */
    enableFulllinkAvSync = 1024,
    /**
     * 1 << 11
     *
     * @generated from enum value: enableDataStream2 = 2048;
     */
    enableDataStream2 = 2048,
    /**
     * 1 << 12
     *
     * @generated from enum value: enableAutFeedback = 4096;
     */
    enableAutFeedback = 4096,
    /**
     * 1 << 13
     *
     * @generated from enum value: enableUserAutoRebalanceCheck = 8192;
     */
    enableUserAutoRebalanceCheck = 8192,
    /**
     * 1 << 14
     *
     * @generated from enum value: enableXR = 16384;
     */
    enableXR = 16384,
    /**
     * 1 << 15
     *
     * @generated from enum value: enableLossbasedBwe = 32768;
     */
    enableLossbasedBwe = 32768,
    /**
     * 1 << 16
     *
     * @generated from enum value: enableAutCC = 65536;
     */
    enableAutCC = 65536,
    /**
     * 1 << 17
     *
     * @generated from enum value: enableCCFallback = 131072;
     */
    enableCCFallback = 131072,
    /**
     * 1 << 18
     *
     * @generated from enum value: enablePreallocPC = 262144;
     */
    enablePreallocPC = 262144,
    /**
     * 1 << 19
     *
     * @generated from enum value: enablePubTWCC = 524288;
     */
    enablePubTWCC = 524288,
    /**
     * 1 << 20
     *
     * @generated from enum value: enableSubTWCC = 1048576;
     */
    enableSubTWCC = 1048576,
    /**
     * 1 << 21
     *
     * @generated from enum value: enablePubRTX = 2097152;
     */
    enablePubRTX = 2097152,
    /**
     * 1 << 22
     *
     * @generated from enum value: enableSubRTX = 4194304;
     */
    enableSubRTX = 4194304,
    /**
     * 1 << 23
     *
     * @generated from enum value: enableQualityFallback = 8388608;
     */
    enableQualityFallback = 8388608,
    /**
     * 1 << 24
     *
     * @generated from enum value: senttsUsesAbsSendTime = 16777216;
     */
    senttsUsesAbsSendTime = 16777216,
    /**
     * 1 << 25
     *
     * @generated from enum value: enableDualStreamFlag = 33554432;
     */
    enableDualStreamFlag = 33554432,
    /**
     * 1 << 26
     *
     * @generated from enum value: disableFEC = 67108864;
     */
    disableFEC = 67108864,
    /**
     * 1 << 27
     *
     * @generated from enum value: enableVosFallback = 134217728;
     */
    enableVosFallback = 134217728
}

/**
 * UserAttributes
 * 使用位标志压缩 boolean 属性，简化其他属性的 key 名
 *
 * @generated from message io.agora.pb.UserAttributes
 */
declare type UserAttributes = Message<"io.agora.pb.UserAttributes"> & {
    /**
     * 位标志字段，存储前 32 个 boolean 类型的属性
     * 使用位与操作判断是否开启某个功能
     *
     * 只有当 feature 不为 0 时才添加
     *
     * @generated from field: optional uint32 feature1 = 1;
     */
    feature1?: number;
    /**
     * 如果 boolean 属性超过 64 个，使用 feature2 存储第 54-106 个属性
     *
     * @generated from field: optional uint32 feature2 = 2;
     */
    feature2?: number;
    /**
     * TopN 相关
     *
     * topnSmoothLevel
     *
     * @generated from field: optional uint32 topnSmoothLevel = 3;
     */
    topnSmoothLevel?: number;
    /**
     * topnNewSpeakerDelay
     *
     * @generated from field: optional uint32 topnNewSpeakerDelay = 4;
     */
    topnNewSpeakerDelay?: number;
    /**
     * topnSwitchHoldMs
     *
     * @generated from field: optional uint32 topnSwitchHoldMs = 5;
     */
    topnSwitchHoldMs?: number;
    /**
     * topnAudioGain
     *
     * @generated from field: optional uint32 topnAudioGain = 6;
     */
    topnAudioGain?: number;
    /**
     * 订阅相关
     *
     * maxSubscription
     *
     * @generated from field: optional uint32 maxSubscription = 7;
     */
    maxSubscription?: number;
    /**
     * subscribeAudioFilterTopN
     *
     * @generated from field: optional uint32 subscribeAudioFilterTopN = 8;
     */
    subscribeAudioFilterTopN?: number;
    /**
     * 其他
     *
     * rtm2Flag
     *
     * @generated from field: optional uint32 rtm2Flag = 9;
     */
    rtm2Flag?: number;
    /**
     * preSubNum
     *
     * @generated from field: optional uint32 preSubNum = 10;
     */
    preSubNum?: number;
    /**
     * preSubUid uid可以为number也可以为string
     *
     * @generated from field: repeated google.protobuf.Value preSubUid = 11;
     */
    preSubUid: Value[];
    /**
     * enableSubSVC (SDK_CODEC[])，空数组表示未设置
     *
     * @generated from field: repeated string enableSubSVC = 12;
     */
    enableSubSVC: string[];
    /**
     * enableSvcExtended (SDK_CODEC[])，空数组表示未设置
     *
     * @generated from field: repeated string enableSvcExtended = 13;
     */
    enableSvcExtended: string[];
    /**
     * audioDuplicate
     *
     * @generated from field: optional uint32 audioDuplicate = 14;
     */
    audioDuplicate?: number;
    /**
     * ntpFixedOffset
     *
     * @generated from field: optional int32 ntpFixedOffset = 15;
     */
    ntpFixedOffset?: number;
    /**
     * 扩展属性（来自 gatewayAttributes）
     * 使用 google.protobuf.Struct 来支持动态 key-value 对
     *
     * message 类型本身就是可选的
     *
     * @generated from field: optional google.protobuf.Struct experiments = 16;
     */
    experiments?: JsonObject;
};

/**
 * @generated from enum io.agora.pb.VideoExtensionName
 */
declare enum VideoExtensionName {
    /**
     * "urn:ietf:params:rtp-hdrext:toffset"
     *
     * @generated from enum value: VIDEO_EXT_HDR_TOFFSET = 0;
     */
    VIDEO_EXT_HDR_TOFFSET = 0,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time"
     *
     * @generated from enum value: VIDEO_EXT_ABS_SEND_TIME = 1;
     */
    VIDEO_EXT_ABS_SEND_TIME = 1,
    /**
     * "urn:3gpp:video-orientation"
     *
     * @generated from enum value: VIDEO_EXT_ORIENTATION = 2;
     */
    VIDEO_EXT_ORIENTATION = 2,
    /**
     * "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"
     *
     * @generated from enum value: VIDEO_EXT_TWCC = 3;
     */
    VIDEO_EXT_TWCC = 3,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/playout-delay"
     *
     * @generated from enum value: VIDEO_EXT_PLAYOUT_DELAY = 4;
     */
    VIDEO_EXT_PLAYOUT_DELAY = 4,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/video-content-type"
     *
     * @generated from enum value: VIDEO_EXT_CONTENT_TYPE = 5;
     */
    VIDEO_EXT_CONTENT_TYPE = 5,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/video-timing"
     *
     * @generated from enum value: VIDEO_EXT_VIDEO_TIMING = 6;
     */
    VIDEO_EXT_VIDEO_TIMING = 6,
    /**
     * "http://www.webrtc.org/experiments/rtp-hdrext/color-space"
     *
     * @generated from enum value: VIDEO_EXT_COLOR_SPACE = 7;
     */
    VIDEO_EXT_COLOR_SPACE = 7,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:mid"
     *
     * @generated from enum value: VIDEO_EXT_SDES_MID = 8;
     */
    VIDEO_EXT_SDES_MID = 8,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id"
     *
     * @generated from enum value: VIDEO_EXT_SDES_RTP_STREAM_ID = 9;
     */
    VIDEO_EXT_SDES_RTP_STREAM_ID = 9,
    /**
     * "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id"
     *
     * @generated from enum value: VIDEO_EXT_SDED_REPAIRED_RTP_STREAM_ID = 10;
     */
    VIDEO_EXT_SDED_REPAIRED_RTP_STREAM_ID = 10
}

export { }
