sentinel-proxy 0.2.4

A security-first reverse proxy built on Pingora with sleepable ops at the edge
Documentation
[package]
name = "sentinel-proxy"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
rust-version.workspace = true
description = "A security-first reverse proxy built on Pingora with sleepable ops at the edge"
keywords = ["proxy", "reverse-proxy", "http", "security", "pingora"]
categories = ["network-programming", "web-programming::http-server"]
readme = "../../README.md"

[lib]
name = "sentinel_proxy"
path = "src/lib.rs"

[[bin]]
name = "sentinel"
path = "src/main.rs"

[dependencies]
# Pingora core
pingora = { workspace = true }
pingora-core = { workspace = true }
pingora-http = { workspace = true }
pingora-proxy = { workspace = true }
pingora-load-balancing = { workspace = true }
pingora-timeout = { workspace = true }
pingora-limits = { workspace = true }
pingora-cache = { workspace = true }
pingora-memory-cache = { workspace = true }

# Local crates
sentinel-config = { path = "../config", version = "0.2.4" }
sentinel-common = { path = "../common", version = "0.2.4" }
sentinel-agent-protocol = { path = "../agent-protocol", version = "0.2.4" }

# Async runtime
tokio = { workspace = true }
async-trait = { workspace = true }

# Serialization
serde = { workspace = true }
serde_json = { workspace = true }

# Logging and tracing
tracing = { workspace = true }
tracing-subscriber = { workspace = true }
prometheus = { workspace = true }

# Error handling
thiserror = { workspace = true }
anyhow = { workspace = true }

# HTTP
http = { workspace = true }
bytes = { workspace = true }

# TLS
rustls = { workspace = true }
rustls-pemfile = { workspace = true }
webpki-roots = "0.26"

# Utilities
uuid = { workspace = true }
chrono = { workspace = true }
dashmap = { workspace = true }
parking_lot = { workspace = true }
arc-swap = { workspace = true }
base64 = { workspace = true }
regex = "1.10"
urlencoding = "2.1"
once_cell = "1.20"

# GeoIP filtering
maxminddb = "0.24"
ip2location = "0.5"

# Schema validation
jsonschema = "0.17"
serde_yaml = "0.9"

# Static file serving
mime_guess = "2.0"
http-body-util = "0.1"
httpdate = "1.0"
html-escape = "0.2"

# Compression
flate2 = "1.0"
brotli = "7.0"

# CLI
clap = { version = "4.5", features = ["derive", "env"] }

# System
nix = { version = "0.29", features = ["signal"] }
libc = "0.2"
signal-hook = "0.3"
num_cpus = "1.16"

# Memory allocator
tikv-jemallocator = { workspace = true }

# Random number generation
rand = "0.8"

# Hex encoding
hex = "0.4"

# Distributed rate limiting
redis = { version = "0.27", features = ["tokio-comp", "connection-manager"], optional = true }
async-memcached = { version = "0.5", optional = true }

# OpenTelemetry for distributed tracing
opentelemetry = { version = "0.27", optional = true }
opentelemetry_sdk = { version = "0.27", features = ["rt-tokio"], optional = true }
opentelemetry-otlp = { version = "0.27", features = ["tonic"], optional = true }
opentelemetry-semantic-conventions = { version = "0.27", optional = true }

# Hashing
xxhash-rust = { version = "0.8", features = ["xxh3"] }
murmur3 = "0.5"

# File watching for hot reload
notify = "6.1"

# Networking
tokio-util = { version = "0.7", features = ["codec"] }
futures = "0.3"

# gRPC health checking
tonic = { workspace = true }
tonic-health = "0.12"

# Kubernetes service discovery (optional)
reqwest = { version = "0.12", features = ["rustls-tls", "json"], optional = true }

[features]
default = []
distributed-rate-limit = ["redis", "async-memcached"]
distributed-rate-limit-redis = ["redis"]
distributed-rate-limit-memcached = ["async-memcached"]
opentelemetry = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:opentelemetry-semantic-conventions"]
kubernetes = ["reqwest"]

[dev-dependencies]
criterion = { workspace = true }
proptest = { workspace = true }
insta = { workspace = true }
tempfile = "3.12"
reqwest = { version = "0.12", features = ["rustls-tls"] }
tokio-tungstenite = "0.24"
futures-util = "0.3"