/* * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace RequestServer { class DiskCache { public: enum class Mode { Normal, // In test mode, we only enable caching of responses on a per-request basis, signified by a request header. The // response headers will include some status on how the request was handled. Testing, }; static ErrorOr create(Mode); Mode mode() const { return m_mode; } struct CacheHasOpenEntry { }; Variant, CacheHasOpenEntry> create_entry(Request&); Variant, CacheHasOpenEntry> open_entry(Request&); Requests::CacheSizes estimate_cache_size_accessed_since(UnixDateTime since) const; void remove_entries_accessed_since(UnixDateTime since); LexicalPath const& cache_directory() { return m_cache_directory; } void cache_entry_closed(Badge, CacheEntry const&); private: DiskCache(Mode, NonnullRefPtr, LexicalPath cache_directory, CacheIndex); enum class CheckReaderEntries { No, Yes, }; bool check_if_cache_has_open_entry(Request&, u64 cache_key, CheckReaderEntries); Mode m_mode; NonnullRefPtr m_database; HashMap, 1>> m_open_cache_entries; HashMap, 1>> m_requests_waiting_completion; LexicalPath m_cache_directory; CacheIndex m_index; }; }