reactive_graph_runtime_web_impl/
web_resource_manager_impl.rs1use std::sync::Arc;
2
3use async_trait::async_trait;
4use dashmap::DashMap;
5use log::debug;
6use uuid::Uuid;
7
8use reactive_graph_config_api::ConfigManager;
9use reactive_graph_lifecycle::Lifecycle;
10use reactive_graph_plugin_api::WebResourceProvider;
11use reactive_graph_runtime_web_api::WebResourceManager;
12use springtime_di::Component;
13use springtime_di::component_alias;
14
15#[derive(Component)]
16pub struct WebResourceManagerImpl {
17 config_manager: Arc<dyn ConfigManager + Send + Sync>,
18
19 #[component(default = "DashMap::new")]
20 web_resource_providers: DashMap<String, Arc<dyn WebResourceProvider>>, #[component(default = "DashMap::new")]
22 web_resource_provider_context_paths: DashMap<Uuid, String>, }
24
25#[async_trait]
26#[component_alias]
27impl WebResourceManager for WebResourceManagerImpl {
28 fn has(&self, context_path: String) -> bool {
29 self.get(context_path).is_some()
30 }
31
32 fn get(&self, context_path: String) -> Option<Arc<dyn WebResourceProvider>> {
33 self.web_resource_providers.get(context_path.as_str()).map(|p| p.value().clone())
34 }
35
36 fn get_default(&self) -> Option<Arc<dyn WebResourceProvider>> {
37 self.config_manager
38 .get_graphql_default_context_path()
39 .and_then(|default_context_path| self.web_resource_providers.get(default_context_path.as_str()).map(|p| p.value().clone()))
40 }
41
42 async fn register_provider(&self, web_resource_provider: Arc<dyn WebResourceProvider>) {
43 let id = web_resource_provider.id();
44 let context_path: String = web_resource_provider.get_context_path();
45 debug!("Registering web resource provider with context path: {context_path}");
46 self.web_resource_providers.insert(context_path.clone(), web_resource_provider.clone());
47 self.web_resource_provider_context_paths.insert(id, context_path);
48 }
49
50 async fn unregister_provider(&self, id: Uuid) {
51 if let Some(context_path) = self.web_resource_provider_context_paths.get(&id) {
52 self.web_resource_providers.remove(context_path.value());
53 }
54 self.web_resource_provider_context_paths.remove(&id);
55 }
56}
57
58#[async_trait]
59impl Lifecycle for WebResourceManagerImpl {
60 async fn shutdown(&self) {
61 self.web_resource_provider_context_paths.clear();
62 self.web_resource_providers.clear();
63 }
64}