Skip to main content

steamkit/steam/discovery/
memory_server_list_provider.rs

1//! A server list provider that keeps the list in memory.
2
3use std::time::SystemTime;
4
5use async_trait::async_trait;
6use tokio::sync::RwLock;
7
8use crate::error::SteamError;
9
10use super::i_server_list_provider::IServerListProvider;
11use super::server_record::ServerRecord;
12
13/// A server list provider that uses an in-memory list.
14#[derive(Debug, Default)]
15pub struct MemoryServerListProvider {
16    servers: RwLock<Vec<ServerRecord>>,
17    last_updated: RwLock<Option<SystemTime>>,
18}
19
20impl MemoryServerListProvider {
21    /// Creates a new, empty provider.
22    pub fn new() -> Self {
23        MemoryServerListProvider::default()
24    }
25}
26
27#[async_trait]
28impl IServerListProvider for MemoryServerListProvider {
29    /// When the list was last updated.
30    async fn last_server_list_refresh(&self) -> Result<SystemTime, SteamError> {
31        Ok(self
32            .last_updated
33            .read()
34            .await
35            .unwrap_or(SystemTime::UNIX_EPOCH))
36    }
37
38    /// Returns the stored server list.
39    async fn fetch_server_list(&self) -> Result<Vec<ServerRecord>, SteamError> {
40        Ok(self.servers.read().await.clone())
41    }
42
43    /// Stores the server list.
44    async fn update_server_list(&self, endpoints: Vec<ServerRecord>) -> Result<(), SteamError> {
45        *self.servers.write().await = endpoints;
46        *self.last_updated.write().await = Some(SystemTime::now());
47
48        Ok(())
49    }
50}