edc_dataplane_proxy/extensions/
web.rs

1use std::sync::Arc;
2
3use miwa::{
4    core::{Extension, ExtensionConfig, MiwaResult},
5    derive::extension,
6};
7use tokio::sync::Mutex;
8
9use crate::{
10    db::edr::EdrRepoRef,
11    extensions::{
12        config::Proxy,
13        manager::{create_edr_manager, create_token_manager},
14    },
15    service::{refresh::RefreshManager, token::TokenManagerImpl},
16    web::state::Context,
17};
18use edc_dataplane_core::{
19    core::{db::transfer::TransferRepoRef, service::transfer::TransferService},
20    web::{start_server, ServerHandle},
21};
22
23use crate::web;
24pub struct DataPlaneProxyApiExtension {
25    cfg: Proxy,
26    ctx: Context<TokenManagerImpl>,
27    handle: Arc<Mutex<Option<ServerHandle>>>,
28}
29
30#[async_trait::async_trait]
31impl Extension for DataPlaneProxyApiExtension {
32    async fn start(&self) -> MiwaResult<()> {
33        let token_server = start_server(
34            self.cfg.renewal.bind,
35            self.cfg.renewal.port,
36            web::token_app(),
37            self.ctx.clone(),
38            "Token renewal API",
39        )
40        .await?;
41
42        self.handle.lock().await.replace(token_server);
43
44        crate::web::proxy::server::start(&self.cfg, self.ctx.clone()).await;
45        Ok(())
46    }
47
48    async fn shutdown(&self) -> MiwaResult<()> {
49        Ok(())
50    }
51}
52
53#[extension(name = "Proxy api extension")]
54pub async fn proxy_api_extension(
55    ExtensionConfig(cfg): ExtensionConfig<Proxy>,
56    repo: TransferRepoRef,
57    edrs: EdrRepoRef,
58    transfer_service: TransferService,
59) -> MiwaResult<DataPlaneProxyApiExtension> {
60    let tokens = create_token_manager(cfg.clone())?;
61    let edr_manager = create_edr_manager(edrs, tokens.clone(), cfg.clone())?;
62
63    let refresh_manager = RefreshManager::new(edr_manager, repo);
64    let ctx = Context::new(transfer_service, tokens, refresh_manager);
65    Ok(DataPlaneProxyApiExtension {
66        cfg,
67        ctx,
68        handle: Arc::default(),
69    })
70}