import { BinaryReader, BinaryWriter } from '@bufbuild/protobuf/wire';
import { type CallContext, type CallOptions } from 'nice-grpc-common';
import { Network } from '../../../common/net/network';
import { TypedMessage } from '../../../common/serial/typed_message';
export declare const protobufPackage = "xray.app.router.command";
/**
 * RoutingContext is the context with information relative to routing process.
 * It conforms to the structure of xray.features.routing.Context and
 * xray.features.routing.Route.
 */
export interface RoutingContext {
    $type: 'xray.app.router.command.RoutingContext';
    InboundTag: string;
    Network: Network;
    SourceIPs: Uint8Array[];
    TargetIPs: Uint8Array[];
    SourcePort: number;
    TargetPort: number;
    TargetDomain: string;
    Protocol: string;
    User: string;
    Attributes: {
        [key: string]: string;
    };
    OutboundGroupTags: string[];
    OutboundTag: string;
}
export interface RoutingContext_AttributesEntry {
    $type: 'xray.app.router.command.RoutingContext.AttributesEntry';
    key: string;
    value: string;
}
/**
 * SubscribeRoutingStatsRequest subscribes to routing statistics channel if
 * opened by xray-core.
 * * FieldSelectors selects a subset of fields in routing statistics to return.
 * Valid selectors:
 *  - inbound: Selects connection's inbound tag.
 *  - network: Selects connection's network.
 *  - ip: Equivalent as "ip_source" and "ip_target", selects both source and
 *  target IP.
 *  - port: Equivalent as "port_source" and "port_target", selects both source
 *  and target port.
 *  - domain: Selects target domain.
 *  - protocol: Select connection's protocol.
 *  - user: Select connection's inbound user email.
 *  - attributes: Select connection's additional attributes.
 *  - outbound: Equivalent as "outbound" and "outbound_group", select both
 *  outbound tag and outbound group tags.
 * * If FieldSelectors is left empty, all fields will be returned.
 */
export interface SubscribeRoutingStatsRequest {
    $type: 'xray.app.router.command.SubscribeRoutingStatsRequest';
    FieldSelectors: string[];
}
/**
 * TestRouteRequest manually tests a routing result according to the routing
 * context message.
 * * RoutingContext is the routing message without outbound information.
 * * FieldSelectors selects the fields to return in the routing result. All
 * fields are returned if left empty.
 * * PublishResult broadcasts the routing result to routing statistics channel
 * if set true.
 */
export interface TestRouteRequest {
    $type: 'xray.app.router.command.TestRouteRequest';
    RoutingContext: RoutingContext | undefined;
    FieldSelectors: string[];
    PublishResult: boolean;
}
export interface PrincipleTargetInfo {
    $type: 'xray.app.router.command.PrincipleTargetInfo';
    tag: string[];
}
export interface OverrideInfo {
    $type: 'xray.app.router.command.OverrideInfo';
    target: string;
}
export interface BalancerMsg {
    $type: 'xray.app.router.command.BalancerMsg';
    override: OverrideInfo | undefined;
    principleTarget: PrincipleTargetInfo | undefined;
}
export interface GetBalancerInfoRequest {
    $type: 'xray.app.router.command.GetBalancerInfoRequest';
    tag: string;
}
export interface GetBalancerInfoResponse {
    $type: 'xray.app.router.command.GetBalancerInfoResponse';
    balancer: BalancerMsg | undefined;
}
export interface OverrideBalancerTargetRequest {
    $type: 'xray.app.router.command.OverrideBalancerTargetRequest';
    balancerTag: string;
    target: string;
}
export interface OverrideBalancerTargetResponse {
    $type: 'xray.app.router.command.OverrideBalancerTargetResponse';
}
export interface AddRuleRequest {
    $type: 'xray.app.router.command.AddRuleRequest';
    config: TypedMessage | undefined;
    shouldAppend: boolean;
}
export interface AddRuleResponse {
    $type: 'xray.app.router.command.AddRuleResponse';
}
export interface RemoveRuleRequest {
    $type: 'xray.app.router.command.RemoveRuleRequest';
    ruleTag: string;
}
export interface RemoveRuleResponse {
    $type: 'xray.app.router.command.RemoveRuleResponse';
}
export interface Config {
    $type: 'xray.app.router.command.Config';
}
export declare const RoutingContext: MessageFns<RoutingContext, 'xray.app.router.command.RoutingContext'>;
export declare const RoutingContext_AttributesEntry: MessageFns<RoutingContext_AttributesEntry, 'xray.app.router.command.RoutingContext.AttributesEntry'>;
export declare const SubscribeRoutingStatsRequest: MessageFns<SubscribeRoutingStatsRequest, 'xray.app.router.command.SubscribeRoutingStatsRequest'>;
export declare const TestRouteRequest: MessageFns<TestRouteRequest, 'xray.app.router.command.TestRouteRequest'>;
export declare const PrincipleTargetInfo: MessageFns<PrincipleTargetInfo, 'xray.app.router.command.PrincipleTargetInfo'>;
export declare const OverrideInfo: MessageFns<OverrideInfo, 'xray.app.router.command.OverrideInfo'>;
export declare const BalancerMsg: MessageFns<BalancerMsg, 'xray.app.router.command.BalancerMsg'>;
export declare const GetBalancerInfoRequest: MessageFns<GetBalancerInfoRequest, 'xray.app.router.command.GetBalancerInfoRequest'>;
export declare const GetBalancerInfoResponse: MessageFns<GetBalancerInfoResponse, 'xray.app.router.command.GetBalancerInfoResponse'>;
export declare const OverrideBalancerTargetRequest: MessageFns<OverrideBalancerTargetRequest, 'xray.app.router.command.OverrideBalancerTargetRequest'>;
export declare const OverrideBalancerTargetResponse: MessageFns<OverrideBalancerTargetResponse, 'xray.app.router.command.OverrideBalancerTargetResponse'>;
export declare const AddRuleRequest: MessageFns<AddRuleRequest, 'xray.app.router.command.AddRuleRequest'>;
export declare const AddRuleResponse: MessageFns<AddRuleResponse, 'xray.app.router.command.AddRuleResponse'>;
export declare const RemoveRuleRequest: MessageFns<RemoveRuleRequest, 'xray.app.router.command.RemoveRuleRequest'>;
export declare const RemoveRuleResponse: MessageFns<RemoveRuleResponse, 'xray.app.router.command.RemoveRuleResponse'>;
export declare const Config: MessageFns<Config, 'xray.app.router.command.Config'>;
export type RoutingServiceDefinition = typeof RoutingServiceDefinition;
export declare const RoutingServiceDefinition: {
    readonly name: "RoutingService";
    readonly fullName: "xray.app.router.command.RoutingService";
    readonly methods: {
        readonly subscribeRoutingStats: {
            readonly name: "SubscribeRoutingStats";
            readonly requestType: MessageFns<SubscribeRoutingStatsRequest, "xray.app.router.command.SubscribeRoutingStatsRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<RoutingContext, "xray.app.router.command.RoutingContext">;
            readonly responseStream: true;
            readonly options: {};
        };
        readonly testRoute: {
            readonly name: "TestRoute";
            readonly requestType: MessageFns<TestRouteRequest, "xray.app.router.command.TestRouteRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<RoutingContext, "xray.app.router.command.RoutingContext">;
            readonly responseStream: false;
            readonly options: {};
        };
        readonly getBalancerInfo: {
            readonly name: "GetBalancerInfo";
            readonly requestType: MessageFns<GetBalancerInfoRequest, "xray.app.router.command.GetBalancerInfoRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<GetBalancerInfoResponse, "xray.app.router.command.GetBalancerInfoResponse">;
            readonly responseStream: false;
            readonly options: {};
        };
        readonly overrideBalancerTarget: {
            readonly name: "OverrideBalancerTarget";
            readonly requestType: MessageFns<OverrideBalancerTargetRequest, "xray.app.router.command.OverrideBalancerTargetRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<OverrideBalancerTargetResponse, "xray.app.router.command.OverrideBalancerTargetResponse">;
            readonly responseStream: false;
            readonly options: {};
        };
        readonly addRule: {
            readonly name: "AddRule";
            readonly requestType: MessageFns<AddRuleRequest, "xray.app.router.command.AddRuleRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<AddRuleResponse, "xray.app.router.command.AddRuleResponse">;
            readonly responseStream: false;
            readonly options: {};
        };
        readonly removeRule: {
            readonly name: "RemoveRule";
            readonly requestType: MessageFns<RemoveRuleRequest, "xray.app.router.command.RemoveRuleRequest">;
            readonly requestStream: false;
            readonly responseType: MessageFns<RemoveRuleResponse, "xray.app.router.command.RemoveRuleResponse">;
            readonly responseStream: false;
            readonly options: {};
        };
    };
};
export interface RoutingServiceImplementation<CallContextExt = {}> {
    subscribeRoutingStats(request: SubscribeRoutingStatsRequest, context: CallContext & CallContextExt): ServerStreamingMethodResult<DeepPartial<RoutingContext>>;
    testRoute(request: TestRouteRequest, context: CallContext & CallContextExt): Promise<DeepPartial<RoutingContext>>;
    getBalancerInfo(request: GetBalancerInfoRequest, context: CallContext & CallContextExt): Promise<DeepPartial<GetBalancerInfoResponse>>;
    overrideBalancerTarget(request: OverrideBalancerTargetRequest, context: CallContext & CallContextExt): Promise<DeepPartial<OverrideBalancerTargetResponse>>;
    addRule(request: AddRuleRequest, context: CallContext & CallContextExt): Promise<DeepPartial<AddRuleResponse>>;
    removeRule(request: RemoveRuleRequest, context: CallContext & CallContextExt): Promise<DeepPartial<RemoveRuleResponse>>;
}
export interface RoutingServiceClient<CallOptionsExt = {}> {
    subscribeRoutingStats(request: DeepPartial<SubscribeRoutingStatsRequest>, options?: CallOptions & CallOptionsExt): AsyncIterable<RoutingContext>;
    testRoute(request: DeepPartial<TestRouteRequest>, options?: CallOptions & CallOptionsExt): Promise<RoutingContext>;
    getBalancerInfo(request: DeepPartial<GetBalancerInfoRequest>, options?: CallOptions & CallOptionsExt): Promise<GetBalancerInfoResponse>;
    overrideBalancerTarget(request: DeepPartial<OverrideBalancerTargetRequest>, options?: CallOptions & CallOptionsExt): Promise<OverrideBalancerTargetResponse>;
    addRule(request: DeepPartial<AddRuleRequest>, options?: CallOptions & CallOptionsExt): Promise<AddRuleResponse>;
    removeRule(request: DeepPartial<RemoveRuleRequest>, options?: CallOptions & CallOptionsExt): Promise<RemoveRuleResponse>;
}
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 type ServerStreamingMethodResult<Response> = {
    [Symbol.asyncIterator](): AsyncIterator<Response, void>;
};
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=command.d.ts.map