load("@fbcode//quic:defs.bzl", "mvfst_cpp_library")

oncall("traffic_protocols")

mvfst_cpp_library(
    name = "outstanding_packet",
    headers = [
        "OutstandingPacket.h",
    ],
    exported_deps = [
        ":cloned_packet_identifier",
        ":loss_state",
        "//folly/io:socket_option_map",
        "//quic/codec:types",
    ],
)

mvfst_cpp_library(
    name = "loss_event",
    headers = [
        "LossEvent.h",
    ],
    exported_deps = [
        ":outstanding_packet",
        "//quic:constants",
        "//quic/common:optional",
    ],
)

mvfst_cpp_library(
    name = "early_data_app_params_handler",
    headers = [
        "EarlyDataAppParamsHandler.h",
    ],
    exported_deps = [
        "//quic/common:buf_util",
        "//quic/common:optional",
    ],
)

mvfst_cpp_library(
    name = "loss_state",
    headers = [
        "LossState.h",
    ],
    exported_deps = [
        "//quic/codec:types",
        "//quic/common:enum_array",
    ],
)

mvfst_cpp_library(
    name = "transport_settings",
    headers = [
        "TransportSettings.h",
    ],
    exported_deps = [
        "//folly:network_address",
        "//quic:constants",
        "//quic/common:optional",
        "//quic/priority:priority_queue",
    ],
)

mvfst_cpp_library(
    name = "ack_states",
    headers = [
        "AckStates.h",
    ],
    exported_deps = [
        "//folly:random",
        "//quic:constants",
        "//quic/codec:types",
        "//quic/common:interval_set",
    ],
)

mvfst_cpp_library(
    name = "cloned_packet_identifier",
    srcs = [
        "ClonedPacketIdentifier.cpp",
    ],
    headers = [
        "ClonedPacketIdentifier.h",
    ],
    deps = [],
    exported_deps = [
        "//quic/codec:types",
    ],
)

mvfst_cpp_library(
    name = "quic_stream_utilities",
    srcs = [
        "QuicStreamUtilities.cpp",
    ],
    headers = [
        "QuicStreamUtilities.h",
    ],
    exported_deps = [
        "//quic:constants",
        "//quic/codec:types",
    ],
)

mvfst_cpp_library(
    name = "quic_state_machine",
    srcs = [
        "QuicPathManager.cpp",
        "QuicStreamManager.cpp",
        "StateData.cpp",
    ],
    headers = [
        "QuicPathManager.h",
        "QuicStreamManager.h",
        "QuicStreamUtilities.h",
        "StateData.h",
        "StreamData.h",
    ],
    deps = [
        "//quic/logging:qlogger_macros",
        "//quic/priority:http_priority_queue",
    ],
    exported_deps = [
        ":ack_event",
        ":ack_states",
        ":cloned_packet_identifier",
        ":early_data_app_params_handler",
        ":loss_state",
        ":outstanding_packet",
        ":quic_connection_stats",
        ":stats_callback",
        ":transport_settings",
        "//folly:token_bucket",
        "//folly/container:f14_hash",
        "//folly/io/async:delayed_destruction",
        "//quic:config",
        "//quic:constants",
        "//quic/codec:codec",
        "//quic/codec:types",
        "//quic/common:buf_accessor",
        "//quic/common:circular_deque",
        "//quic/common:expected",
        "//quic/common:function_ref",
        "//quic/common:interval_set",
        "//quic/common:mvfst_logging",
        "//quic/common:optional",
        "//quic/common/udpsocket:quic_async_udp_socket",
        "//quic/congestion_control:congestion_controller",
        "//quic/congestion_control:packet_processor",
        "//quic/congestion_control:throttling_signal_provider",
        "//quic/datagram:datagram_flow_manager",
        "//quic/handshake:handshake",
        "//quic/logging:qlogger",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/observer:socket_observer_types",
        "//quic/priority:priority_queue",
    ],
)

mvfst_cpp_library(
    name = "connection_oops_fields",
    headers = [
        "ConnectionOopsFields.h",
    ],
    exported_deps = [
        ":quic_state_machine",
        "//quic/logging/oops_logger:oops_fields",
    ],
)

mvfst_cpp_library(
    name = "ack_handler",
    srcs = [
        "AckHandlers.cpp",
        "AckedPacketIterator.cpp",
    ],
    headers = [
        "AckHandlers.h",
        "AckedPacketIterator.h",
    ],
    deps = [
        ":connection_oops_fields",
        ":state_functions",
        ":stream_functions",
        "//folly:map_util",
        "//folly/tracing:static_tracepoint",
        "//quic/common:mvfst_logging",
        "//quic/congestion_control:congestion_control_functions",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/loss:loss",
        "//quic/observer:socket_observer_macros",
    ],
    exported_deps = [
        ":outstanding_packet",
        ":quic_state_machine",
        "//quic:constants",
        "//quic/codec:types",
        "//quic/common:expected",
        "//quic/common:function_ref",
        "//quic/common:interval_set",
        "//quic/common:optional",
        "//quic/congestion_control:congestion_controller",
    ],
)

mvfst_cpp_library(
    name = "stream_functions",
    srcs = [
        "QuicStreamFunctions.cpp",
    ],
    headers = [
        "QuicStreamFunctions.h",
    ],
    deps = [
        "//quic:constants",
        "//quic:exception",
        "//quic/common:mvfst_logging",
        "//quic/flowcontrol:flow_control",
        "//quic/logging/oops_logger:oops_logger",
    ],
    exported_deps = [
        ":quic_state_machine",
        "//quic/common:expected",
        "//quic/common:function_ref",
    ],
)

mvfst_cpp_library(
    name = "state_functions",
    srcs = [
        "QuicStateFunctions.cpp",
    ],
    headers = [
        "QuicStateFunctions.h",
    ],
    deps = [
        "//quic/common:mvfst_logging",
        "//quic/common:time_util",
        "//quic/logging:qlogger_macros",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state:connection_oops_fields",
    ],
    exported_deps = [
        ":quic_state_machine",
        "//quic:constants",
        "//quic/codec:pktbuilder",
        "//quic/codec:types",
        "//quic/common:expected",
        "//quic/common:interval_set",
        "//quic/common:network_data",
    ],
)

mvfst_cpp_library(
    name = "stats_callback",
    headers = select({
        "DEFAULT": {"QuicTransportStatsCallback.h": "QuicTransportStatsCallback.h"},
        # Mobile: use minimal stats callback (no TransportKnob methods)
        # ARVR Android uses full stats callback
        "ovr_config//os/constraints:android": select({
            "DEFAULT": {"QuicTransportStatsCallback.h": "facebook/QuicTransportStatsCallbackMobile.h"},
            "ovr_config//build_mode:arvr_mode[enabled]": {"QuicTransportStatsCallback.h": "QuicTransportStatsCallback.h"},
        }),
        "ovr_config//os/constraints:iphoneos": {"QuicTransportStatsCallback.h": "facebook/QuicTransportStatsCallbackMobile.h"},
    }),
    exported_deps = select({
        "DEFAULT": [
            "//quic:constants",
            "//quic:exception",
            "//quic/common:optional",
        ],
        "ovr_config//os/constraints:android": select({
            "DEFAULT": [
                "//quic:constants",
                "//quic:exception",
                "//quic/common:optional",
            ],
            "ovr_config//build_mode:arvr_mode[enabled]": [
                "//quic:constants",
                "//quic:exception",
                "//quic/common:optional",
            ],
        }),
        "ovr_config//os/constraints:iphoneos": [
            "//quic:constants",
            "//quic:exception",
            "//quic/common:optional",
        ],
    }),
)

mvfst_cpp_library(
    name = "pacing_functions",
    srcs = [
        "QuicPacingFunctions.cpp",
    ],
    headers = [
        "QuicPacingFunctions.h",
    ],
    exported_deps = [
        ":quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "simple_frame_functions",
    srcs = [
        "SimpleFrameFunctions.cpp",
    ],
    headers = [
        "SimpleFrameFunctions.h",
    ],
    deps = [
        ":connection_oops_fields",
        ":state_functions",
        "//quic:constants",
        "//quic/common:mvfst_logging",
        "//quic/logging/oops_logger:oops_logger",
        "//quic/state/stream:stream",
    ],
    exported_deps = [
        ":quic_state_machine",
        "//quic/codec:types",
        "//quic/common:expected",
    ],
)

mvfst_cpp_library(
    name = "quic_connection_stats",
    srcs = [],
    headers = [
        "QuicConnectionStats.h",
    ],
    exported_deps = [
        "//quic:config",
        "//quic:constants",
        "//quic/congestion_control:congestion_controller",
    ],
)

mvfst_cpp_library(
    name = "datagram_handler",
    srcs = [
        "DatagramHandlers.cpp",
    ],
    headers = [
        "DatagramHandlers.h",
    ],
    exported_deps = [
        ":quic_state_machine",
        "//quic/codec:types",
    ],
)

mvfst_cpp_library(
    name = "ack_event",
    srcs = [
        "AckEvent.cpp",
    ],
    headers = [
        "AckEvent.h",
    ],
    deps = [
        "//folly:map_util",
        "//quic/common:mvfst_logging",
    ],
    exported_deps = [
        ":outstanding_packet",
        "//quic/codec:types",
        "//quic/common:optional",
        "//quic/congestion_control:congestion_controller",
    ],
)

mvfst_cpp_library(
    name = "ack_frequency_functions",
    srcs = [
        "QuicAckFrequencyFunctions.cpp",
    ],
    headers = [
        "QuicAckFrequencyFunctions.h",
    ],
    deps = [
        "//quic/common:mvfst_logging",
        "//quic/common:time_util",
    ],
    exported_deps = [
        "//quic/state:quic_state_machine",
    ],
)

mvfst_cpp_library(
    name = "transport_settings_functions",
    srcs = [
        "TransportSettingsFunctions.cpp",
    ],
    headers = [
        "TransportSettingsFunctions.h",
    ],
    exported_deps = [
        ":transport_settings",
        "//folly:dynamic",
    ],
)
