edc_dataplane_proxy/extensions/
web.rs1use 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}