pub fn create_proxy(config: CreateProxyConfig) -> (Router, RefreshTrigger)Expand description
The main library interface for using phantom-frame as a library Returns a proxy handler function and a refresh trigger
Examples found in repository?
examples/library_usage.rs (line 25)
5async fn main() {
6 // Initialize tracing (optional but recommended)
7 // tracing_subscriber::fmt::init();
8
9 // Create proxy configuration
10 // You can specify method prefixes to filter by HTTP method
11 let proxy_config = CreateProxyConfig::new("http://localhost:8080".to_string())
12 .with_include_paths(vec![
13 "/api/*".to_string(),
14 "/public/*".to_string(),
15 "GET /admin/stats".to_string(), // Only cache GET requests to this endpoint
16 ])
17 .with_exclude_paths(vec![
18 "/api/admin/*".to_string(),
19 "POST *".to_string(), // Don't cache any POST requests
20 "PUT *".to_string(), // Don't cache any PUT requests
21 "DELETE *".to_string(), // Don't cache any DELETE requests
22 ]);
23
24 // Create proxy - proxy_url is the backend server to proxy requests to
25 let (proxy_app, refresh_trigger): (Router, RefreshTrigger) = create_proxy(proxy_config);
26
27 // You can clone and use the refresh_trigger in your code
28 let trigger_clone = refresh_trigger.clone();
29
30 // Example: Trigger cache refresh from another part of your application
31 tokio::spawn(async move {
32 tokio::time::sleep(tokio::time::Duration::from_secs(60)).await;
33
34 // Clear all cache entries
35 trigger_clone.trigger();
36 println!("All cache cleared!");
37
38 tokio::time::sleep(tokio::time::Duration::from_secs(30)).await;
39
40 // Clear only cache entries matching a pattern (supports wildcards)
41 trigger_clone.trigger_by_key_match("GET:/api/*");
42 println!("Cache cleared for GET:/api/* pattern!");
43 });
44
45 // Start the proxy server
46 let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
47
48 println!("Proxy server listening on http://0.0.0.0:3000");
49 println!("Caching paths: /api/*, /public/*, GET /admin/stats");
50 println!("Excluding: /api/admin/*, POST *, PUT *, DELETE *");
51 println!("Note: Only GET requests will be cached (POST/PUT/DELETE are excluded)");
52
53 axum::serve(listener, proxy_app).await.unwrap();
54}