import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire";
import { Network } from "../../common/net/network";
import { PortList } from "../../common/net/port";
import { TypedMessage } from "../../common/serial/typed_message";
export declare const protobufPackage = "xray.app.router";
/** Domain for routing decision. */
export interface Domain {
    $type: "xray.app.router.Domain";
    /** Domain matching type. */
    type: Domain_Type;
    /** Domain value. */
    value: string;
    /** Attributes of this domain. May be used for filtering. */
    attribute: Domain_Attribute[];
}
/** Type of domain value. */
export declare enum Domain_Type {
    /** Plain - The value is used as is. */
    Plain = 0,
    /** Regex - The value is used as a regular expression. */
    Regex = 1,
    /** Domain - The value is a root domain. */
    Domain = 2,
    /** Full - The value is a domain. */
    Full = 3,
    UNRECOGNIZED = -1
}
export declare function domain_TypeFromJSON(object: any): Domain_Type;
export declare function domain_TypeToJSON(object: Domain_Type): string;
export interface Domain_Attribute {
    $type: "xray.app.router.Domain.Attribute";
    key: string;
    boolValue?: boolean | undefined;
    intValue?: number | undefined;
}
/** IP for routing decision, in CIDR form. */
export interface CIDR {
    $type: "xray.app.router.CIDR";
    /** IP address, should be either 4 or 16 bytes. */
    ip: Uint8Array;
    /** Number of leading ones in the network mask. */
    prefix: number;
}
export interface GeoIP {
    $type: "xray.app.router.GeoIP";
    countryCode: string;
    cidr: CIDR[];
    reverseMatch: boolean;
}
export interface GeoIPList {
    $type: "xray.app.router.GeoIPList";
    entry: GeoIP[];
}
export interface GeoSite {
    $type: "xray.app.router.GeoSite";
    countryCode: string;
    domain: Domain[];
}
export interface GeoSiteList {
    $type: "xray.app.router.GeoSiteList";
    entry: GeoSite[];
}
export interface RoutingRule {
    $type: "xray.app.router.RoutingRule";
    /** Tag of outbound that this rule is pointing to. */
    tag?: string | undefined;
    /** Tag of routing balancer. */
    balancingTag?: string | undefined;
    ruleTag: string;
    /** List of domains for target domain matching. */
    domain: Domain[];
    /**
     * List of GeoIPs for target IP address matching. If this entry exists, the
     * cidr above will have no effect. GeoIP fields with the same country code are
     * supposed to contain exactly same content. They will be merged during
     * runtime. For customized GeoIPs, please leave country code empty.
     */
    geoip: GeoIP[];
    /** List of ports. */
    portList: PortList | undefined;
    /** List of networks for matching. */
    networks: Network[];
    /**
     * List of GeoIPs for source IP address matching. If this entry exists, the
     * source_cidr above will have no effect.
     */
    sourceGeoip: GeoIP[];
    /** List of ports for source port matching. */
    sourcePortList: PortList | undefined;
    userEmail: string[];
    inboundTag: string[];
    protocol: string[];
    attributes: {
        [key: string]: string;
    };
    domainMatcher: string;
}
export interface RoutingRule_AttributesEntry {
    $type: "xray.app.router.RoutingRule.AttributesEntry";
    key: string;
    value: string;
}
export interface BalancingRule {
    $type: "xray.app.router.BalancingRule";
    tag: string;
    outboundSelector: string[];
    strategy: string;
    strategySettings: TypedMessage | undefined;
    fallbackTag: string;
}
export interface StrategyWeight {
    $type: "xray.app.router.StrategyWeight";
    regexp: boolean;
    match: string;
    value: number;
}
export interface StrategyLeastLoadConfig {
    $type: "xray.app.router.StrategyLeastLoadConfig";
    /** weight settings */
    costs: StrategyWeight[];
    /** RTT baselines for selecting, int64 values of time.Duration */
    baselines: number[];
    /** expected nodes count to select */
    expected: number;
    /** max acceptable rtt, filter away high delay nodes. default 0 */
    maxRTT: number;
    /** acceptable failure rate */
    tolerance: number;
}
export interface Config {
    $type: "xray.app.router.Config";
    domainStrategy: Config_DomainStrategy;
    rule: RoutingRule[];
    balancingRule: BalancingRule[];
}
export declare enum Config_DomainStrategy {
    /** AsIs - Use domain as is. */
    AsIs = 0,
    /** UseIp - Always resolve IP for domains. */
    UseIp = 1,
    /** IpIfNonMatch - Resolve to IP if the domain doesn't match any rules. */
    IpIfNonMatch = 2,
    /** IpOnDemand - Resolve to IP if any rule requires IP matching. */
    IpOnDemand = 3,
    UNRECOGNIZED = -1
}
export declare function config_DomainStrategyFromJSON(object: any): Config_DomainStrategy;
export declare function config_DomainStrategyToJSON(object: Config_DomainStrategy): string;
export declare const Domain: MessageFns<Domain, "xray.app.router.Domain">;
export declare const Domain_Attribute: MessageFns<Domain_Attribute, "xray.app.router.Domain.Attribute">;
export declare const CIDR: MessageFns<CIDR, "xray.app.router.CIDR">;
export declare const GeoIP: MessageFns<GeoIP, "xray.app.router.GeoIP">;
export declare const GeoIPList: MessageFns<GeoIPList, "xray.app.router.GeoIPList">;
export declare const GeoSite: MessageFns<GeoSite, "xray.app.router.GeoSite">;
export declare const GeoSiteList: MessageFns<GeoSiteList, "xray.app.router.GeoSiteList">;
export declare const RoutingRule: MessageFns<RoutingRule, "xray.app.router.RoutingRule">;
export declare const RoutingRule_AttributesEntry: MessageFns<RoutingRule_AttributesEntry, "xray.app.router.RoutingRule.AttributesEntry">;
export declare const BalancingRule: MessageFns<BalancingRule, "xray.app.router.BalancingRule">;
export declare const StrategyWeight: MessageFns<StrategyWeight, "xray.app.router.StrategyWeight">;
export declare const StrategyLeastLoadConfig: MessageFns<StrategyLeastLoadConfig, "xray.app.router.StrategyLeastLoadConfig">;
export declare const Config: MessageFns<Config, "xray.app.router.Config">;
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
export type DeepPartial<T> = T extends Builtin ? T : T extends globalThis.Array<infer U> ? globalThis.Array<DeepPartial<U>> : T extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : T extends {} ? {
    [K in Exclude<keyof T, "$type">]?: DeepPartial<T[K]>;
} : Partial<T>;
export interface MessageFns<T, V extends string> {
    readonly $type: V;
    encode(message: T, writer?: BinaryWriter): BinaryWriter;
    decode(input: BinaryReader | Uint8Array, length?: number): T;
    fromJSON(object: any): T;
    toJSON(message: T): unknown;
    create(base?: DeepPartial<T>): T;
    fromPartial(object: DeepPartial<T>): T;
}
export {};
//# sourceMappingURL=config.d.ts.map