edc_dataplane_proxy/extensions/
manager.rs1use chrono::Duration;
2use edc_dataplane_core::core::service::transfer::TransferManagerRef;
3use jsonwebtoken::Algorithm;
4use miwa::core::ExtensionConfig;
5use miwa::{
6 core::{Extension, MiwaContext, MiwaResult},
7 derive::extension,
8};
9use std::str::FromStr;
10
11use crate::db::edr::EdrRepoRef;
12use crate::service::edr::EdrManager;
13use crate::{manager::TransferProxyManager, service::token::TokenManagerImpl};
14
15use super::config::Proxy;
16
17pub struct TransferManagerExtension;
18
19#[async_trait::async_trait]
20impl Extension for TransferManagerExtension {
21 async fn start(&self) -> MiwaResult<()> {
22 Ok(())
23 }
24
25 async fn shutdown(&self) -> MiwaResult<()> {
26 Ok(())
27 }
28}
29
30#[extension(name = "Transfer Pull manager extension", provides(TransferManagerRef))]
31pub async fn transfer_proxy_extension(
32 ctx: &MiwaContext,
33 ExtensionConfig(cfg): ExtensionConfig<Proxy>,
34 edrs: EdrRepoRef,
35) -> MiwaResult<TransferManagerExtension> {
36 ctx.register(TransferManagerRef::of(manager_from_config(cfg, edrs)?));
37 Ok(TransferManagerExtension)
38}
39
40pub fn manager_from_config(
41 proxy: Proxy,
42 edrs: EdrRepoRef,
43) -> anyhow::Result<TransferProxyManager<TokenManagerImpl>> {
44 let token_manager = create_token_manager(proxy.clone())?;
45
46 let edr_manager = create_edr_manager(edrs.clone(), token_manager, proxy)?;
47
48 Ok(TransferProxyManager::new(edr_manager, edrs))
49}
50
51pub fn create_token_manager(proxy: Proxy) -> anyhow::Result<TokenManagerImpl> {
52 let proxy_url = proxy
53 .proxy_url
54 .clone()
55 .unwrap_or_else(|| format!("http://localhost:{}/api/v1/public", proxy.port));
56
57 Ok(TokenManagerImpl::builder()
58 .encoding_key(proxy.keys.private_key.clone())
59 .decoding_key(proxy.keys.public_key)
60 .algorithm(Algorithm::from_str(&proxy.keys.algorithm)?)
61 .audience(proxy_url)
62 .kid(proxy.keys.kid.clone())
63 .format(proxy.keys.format)
64 .leeway(proxy.token_leeway)
65 .build())
66}
67
68pub fn create_edr_manager(
69 edrs: EdrRepoRef,
70 tokens: TokenManagerImpl,
71 proxy: Proxy,
72) -> anyhow::Result<EdrManager<TokenManagerImpl>> {
73 let token_duration = Duration::seconds(proxy.token_duration as i64);
74 let refresh_token_duration = Duration::seconds(proxy.refresh_token_duration as i64);
75
76 let token_url = proxy
77 .token_url
78 .clone()
79 .unwrap_or_else(|| format!("http://localhost:{}/api/v1/token", proxy.renewal.port));
80
81 let jwks_url = proxy.jwks_url.clone().unwrap_or_else(|| {
82 format!(
83 "http://localhost:{}/.well-known/jwks.json",
84 proxy.renewal.port
85 )
86 });
87 Ok(EdrManager::builder()
88 .tokens(tokens.clone())
89 .proxy_url(tokens.audience().to_string())
90 .issuer(proxy.issuer.clone())
91 .token_duration(token_duration)
92 .refresh_token_duration(refresh_token_duration)
93 .token_url(token_url)
94 .jwks_url(jwks_url)
95 .store(edrs)
96 .build())
97}