# ngdp-cache
Generic caching functionality for NGDP (Next Generation Distribution Pipeline) components.
## Features
This crate provides specialized cache implementations for different NGDP components:
- **Generic Cache**: For arbitrary key-value storage
- **TACT Cache**: For TACT protocol data (configs, indices, data files)
- **CDN Cache**: For CDN content (archives, loose files)
- **Ribbit Cache**: For Ribbit protocol responses with TTL support
- **Cached Ribbit Client**: Wrapper around RibbitClient for transparent caching
- **Cached TACT Client**: Wrapper around TactClient for transparent caching of metadata
- **Cached CDN Client**: Wrapper around CdnClient for transparent caching of CDN content
## Usage
Add this to your `Cargo.toml`:
```toml
[dependencies]
ngdp-cache = "0.1.0"
```
### Example
```rust
use ngdp_cache::{
generic::GenericCache,
cdn::CdnCache,
cached_ribbit_client::CachedRibbitClient,
cached_cdn_client::CachedCdnClient,
};
use ribbit_client::{Endpoint, Region};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Generic cache for arbitrary data
let cache = GenericCache::new().await?;
cache.write("my_key", b"Hello, World!").await?;
let data = cache.read("my_key").await?;
// CDN cache follows CDN directory structure
let cdn_cache = CdnCache::new().await?;
let hash = "abcdef1234567890abcdef1234567890";
cdn_cache.write_config(hash, b"config data").await?;
// Cached Ribbit client - a complete drop-in replacement for RibbitClient
let ribbit_client = CachedRibbitClient::new(Region::US).await?;
// All RibbitClient methods work with transparent caching:
let summary = ribbit_client.get_summary().await?; // Cached for 5 minutes
let versions = ribbit_client.get_product_versions("wow").await?; // Also cached
let cert = ribbit_client.request_raw(&Endpoint::Cert("abc123".to_string())).await?; // Cached for 30 days
// Cached CDN client - transparent caching for CDN content
let cdn_client = CachedCdnClient::new().await?;
// Download content with automatic caching
let response = cdn_client.download(
"blzddist1-a.akamaihd.net",
"tpr/wow",
"2e9c1e3b5f5a0c9d9e8f1234567890ab"
).await?;
// Check if response came from cache
println!("From cache: {}", response.is_from_cache());
let data = response.bytes().await?;
Ok(())
}
```
## Cache Location
The cache is stored in the platform-specific cache directory:
- **Linux**: `~/.cache/ngdp/`
- **macOS**: `~/Library/Caches/ngdp/`
- **Windows**: `C:\Users\{user}\AppData\Local\ngdp\cache\`
Each cache type has its own subdirectory:
- `generic/` - Generic cache data
- `tact/` - TACT protocol metadata responses (versions, CDN configs, BGDL)
- `cdn/` - CDN content (config/, data/, patch/, indices)
- `ribbit/` - Ribbit responses organized by region/product/endpoint
- `ribbit/cached/` - Cached Ribbit client responses using Blizzard MIME naming
## 📄 License
This project is dual-licensed under either:
- Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE))
- MIT license ([LICENSE-MIT](LICENSE-MIT))
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in this project by you, as defined in the Apache-2.0 license, shall
be dual licensed as above, without any additional terms or conditions.
## 🫶 Acknowledgments
This crate is part of the `cascette-rs` project, providing tools for World of Warcraft
emulation development.