syntax = "proto3";

package v2ray.core.app.proxyman;
option csharp_namespace = "V2Ray.Core.App.Proxyman";
option go_package = "github.com/v2fly/v2ray-core/v5/app/proxyman";
option java_package = "com.v2ray.core.app.proxyman";
option java_multiple_files = true;

import "common/net/address.proto";
import "common/net/port.proto";
import "transport/internet/config.proto";
import "google/protobuf/any.proto";

message InboundConfig {}

message AllocationStrategy {
  enum Type {
    // Always allocate all connection handlers.
    Always = 0;

    // Randomly allocate specific range of handlers.
    Random = 1;

    // External. Not supported yet.
    External = 2;
  }

  Type type = 1;

  message AllocationStrategyConcurrency {
    uint32 value = 1;
  }

  // Number of handlers (ports) running in parallel.
  // Default value is 3 if unset.
  AllocationStrategyConcurrency concurrency = 2;

  message AllocationStrategyRefresh {
    uint32 value = 1;
  }

  // Number of minutes before a handler is regenerated.
  // Default value is 5 if unset.
  AllocationStrategyRefresh refresh = 3;
}

enum KnownProtocols {
  HTTP = 0;
  TLS = 1;
}

message SniffingConfig {
  // Whether or not to enable content sniffing on an inbound connection.
  bool enabled = 1;

  // Override target destination if sniff'ed protocol is in the given list.
  // Supported values are "http", "tls", "fakedns".
  repeated string destination_override = 2;

  // Whether should only try to sniff metadata without waiting for client input.
  // Can be used to support SMTP like protocol where server send the first message.
  bool metadata_only = 3;
}

message ReceiverConfig {
  // PortRange specifies the ports which the Receiver should listen on.
  v2ray.core.common.net.PortRange port_range = 1;
  // Listen specifies the IP address that the Receiver should listen on.
  v2ray.core.common.net.IPOrDomain listen = 2;
  AllocationStrategy allocation_strategy = 3;
  v2ray.core.transport.internet.StreamConfig stream_settings = 4;
  bool receive_original_destination = 5;
  reserved 6;
  // Override domains for the given protocol.
  // Deprecated. Use sniffing_settings.
  repeated KnownProtocols domain_override = 7 [deprecated = true];
  SniffingConfig sniffing_settings = 8;
}

message InboundHandlerConfig {
  string tag = 1;
  google.protobuf.Any receiver_settings = 2;
  google.protobuf.Any proxy_settings = 3;
}

message OutboundConfig {}

message SenderConfig {
  enum DomainStrategy {
    AS_IS = 0;
    USE_IP = 1;
    USE_IP4 = 2;
    USE_IP6 = 3;
  }

  // Send traffic through the given IP. Only IP is allowed.
  v2ray.core.common.net.IPOrDomain via = 1;
  v2ray.core.transport.internet.StreamConfig stream_settings = 2;
  v2ray.core.transport.internet.ProxyConfig proxy_settings = 3;
  MultiplexingConfig multiplex_settings = 4;
  DomainStrategy domain_strategy = 5;
}

message MultiplexingConfig {
  // Whether or not Mux is enabled.
  bool enabled = 1;
  // Max number of concurrent connections that one Mux connection can handle.
  uint32 concurrency = 2;
}
