edc_dataplane_proxy/extensions/
manager.rs

1use 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}