[package]
name = "rustapi-extras"
description = "Production-ready middleware collection for RustAPI. Includes JWT auth, CORS, Rate Limiting, SQLx integration, and OpenTelemetry observability."
documentation = "https://docs.rs/rustapi-extras"
version.workspace = true
edition.workspace = true
authors.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
[dependencies]
rustapi-core = { workspace = true }
rustapi-openapi = { workspace = true }
tokio = { workspace = true }
futures-util = { workspace = true }
http = { workspace = true }
bytes = { workspace = true }
http-body-util = { workspace = true }
serde = { workspace = true }
serde_json = { workspace = true }
thiserror = { workspace = true }
tracing = { workspace = true }
jsonwebtoken = { version = "9.3", optional = true }
dashmap = { version = "6.0", optional = true }
sqlx = { version = "0.8", optional = true, default-features = false }
diesel = { version = "2.2", optional = true, default-features = false, features = ["r2d2"] }
r2d2 = { version = "0.8", optional = true }
dotenvy = { version = "0.15", optional = true }
envy = { version = "0.4", optional = true }
cookie = { version = "0.18", optional = true }
urlencoding = { version = "2.1", optional = true }
reqwest = { version = "0.12", optional = true, default-features = false, features = ["json", "rustls-tls"] }
opentelemetry = { version = "0.22", optional = true }
opentelemetry_sdk = { version = "0.31", optional = true, features = ["rt-tokio"] }
opentelemetry-otlp = { version = "0.15", optional = true }
opentelemetry-semantic-conventions = { version = "0.14", optional = true }
tracing-opentelemetry = { version = "0.32", optional = true }
rand = { version = "0.8", optional = true }
base64 = { version = "0.22", optional = true }
sha2 = { version = "0.10", optional = true }
[dev-dependencies]
tokio = { workspace = true, features = ["macros", "rt-multi-thread"] }
proptest = "1.4"
rustapi-core = { workspace = true, features = ["test-utils"] }
rustapi-testing = { workspace = true }
tempfile = "3.10"
serial_test = "3.2"
[features]
default = []
jwt = ["dep:jsonwebtoken"]
cors = []
rate-limit = ["dep:dashmap"]
config = ["dep:dotenvy", "dep:envy"]
cookies = ["dep:cookie"]
sqlx = ["dep:sqlx"]
sqlx-postgres = ["sqlx", "sqlx/postgres", "sqlx/runtime-tokio"]
sqlx-mysql = ["sqlx", "sqlx/mysql", "sqlx/runtime-tokio"]
sqlx-sqlite = ["sqlx", "sqlx/sqlite", "sqlx/runtime-tokio"]
diesel = ["dep:diesel", "dep:r2d2"]
diesel-postgres = ["diesel", "diesel/postgres"]
diesel-mysql = ["diesel", "diesel/mysql"]
diesel-sqlite = ["diesel", "diesel/sqlite"]
insight = ["dep:dashmap", "dep:urlencoding"]
webhook = ["insight", "dep:reqwest"]
timeout = []
guard = ["jwt"]
logging = []
circuit-breaker = []
retry = []
security-headers = []
api-key = []
cache = ["dep:dashmap"]
dedup = ["dep:dashmap"]
sanitization = []
otel = ["dep:opentelemetry", "dep:opentelemetry_sdk", "dep:opentelemetry-otlp", "dep:opentelemetry-semantic-conventions", "dep:tracing-opentelemetry"]
structured-logging = []
csrf = ["dep:cookie", "dep:rand", "dep:base64"]
oauth2-client = ["dep:sha2", "dep:rand", "dep:base64", "dep:reqwest", "dep:urlencoding"]
audit = ["dep:rand"]
extras = ["jwt", "cors", "rate-limit"]
observability = ["otel", "structured-logging"]
full = ["extras", "config", "cookies", "sqlx", "insight", "webhook", "timeout", "guard", "logging", "circuit-breaker", "security-headers", "api-key", "cache", "dedup", "sanitization", "retry", "otel", "structured-logging", "csrf", "oauth2-client", "audit"]