/* * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC * * SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL * * Modified by Coffey Labs in 2026 for INBUXA. */ use coordinator::Coordinator; use directory::{Directories, Directory}; use registry::schema::prelude::ObjectType; use std::{collections::HashMap, sync::Arc}; use store::{ BlobStore, InMemoryStore, RegistryStore, SearchStore, Store, registry::bootstrap::Bootstrap, }; pub type IdMap = HashMap, nohash_hasher::BuildNoHashHasher>; #[derive(Clone)] pub struct Storage { pub registry: RegistryStore, pub data: Store, pub blob: BlobStore, pub search: SearchStore, pub memory: InMemoryStore, pub metrics: Store, pub tracing: Store, pub coordinator: Coordinator, pub directory: Option>, pub directories: IdMap, } impl Storage { pub async fn parse(bp: &mut Bootstrap) -> Self { let memory = InMemoryStore::build(bp).await.unwrap_or_default(); let directory = Directories::build(bp).await; let search = SearchStore::build(bp).await.unwrap_or_default(); if let Err(err) = search.create_indexes().await { bp.build_warning( ObjectType::SearchStore.singleton(), format!("Failed to create search indexes: {err}"), ); } let coordinator = Coordinator::build(bp, &memory).await.unwrap_or_default(); // inbuxa: ST-7: with more than one node, read replicas share // high-water marks through the in-memory store if !matches!(coordinator, Coordinator::None) { bp.data_store.share_marks(&memory); } Storage { registry: bp.registry.clone(), data: bp.data_store.clone(), blob: BlobStore::build(bp).await.unwrap_or_default(), search, coordinator, memory, tracing: Store::build_tracing(bp).await.unwrap_or_default(), metrics: Store::build_metrics(bp).await.unwrap_or_default(), directory: directory.default_directory, directories: directory.directories, } } }