From 47018b4cff538c3d485a8b1d522dbe080af02dd9 Mon Sep 17 00:00:00 2001
From: naskya <m@naskya.net>
Date: Thu, 1 Aug 2024 16:49:06 +0900
Subject: [PATCH] chore (backend-rs): set cache ttl

---
 packages/backend-rs/index.d.ts                |  2 --
 packages/backend-rs/index.js                  |  1 -
 packages/backend-rs/src/cache/bare.rs         | 14 +++++++++--
 packages/backend-rs/src/config/meta.rs        | 11 +++++----
 .../src/federation/nodeinfo/generate.rs       | 23 +++++--------------
 packages/backend-rs/src/misc/should_nyaify.rs |  6 +----
 .../backend-rs/src/service/antenna/mod.rs     |  2 +-
 packages/backend/src/boot/master.ts           |  7 ------
 8 files changed, 26 insertions(+), 40 deletions(-)

diff --git a/packages/backend-rs/index.d.ts b/packages/backend-rs/index.d.ts
index 37c07f2f6a..10060ccc5a 100644
--- a/packages/backend-rs/index.d.ts
+++ b/packages/backend-rs/index.d.ts
@@ -1455,8 +1455,6 @@ export declare function updateAntennasOnNewNote(note: Note, noteAuthor: Acct, no
 
 export declare function updateMetaCache(): Promise<void>
 
-export declare function updateNodeinfoCache(): Promise<void>
-
 /** Usage statistics for this server. */
 export interface Usage {
   users: Users
diff --git a/packages/backend-rs/index.js b/packages/backend-rs/index.js
index f7458cb3b0..b2ea8e0c4b 100644
--- a/packages/backend-rs/index.js
+++ b/packages/backend-rs/index.js
@@ -457,7 +457,6 @@ module.exports.unwatchNote = nativeBinding.unwatchNote
 module.exports.updateAntennaCache = nativeBinding.updateAntennaCache
 module.exports.updateAntennasOnNewNote = nativeBinding.updateAntennasOnNewNote
 module.exports.updateMetaCache = nativeBinding.updateMetaCache
-module.exports.updateNodeinfoCache = nativeBinding.updateNodeinfoCache
 module.exports.UserEmojiModPerm = nativeBinding.UserEmojiModPerm
 module.exports.UserEvent = nativeBinding.UserEvent
 module.exports.UserProfileFfvisibility = nativeBinding.UserProfileFfvisibility
diff --git a/packages/backend-rs/src/cache/bare.rs b/packages/backend-rs/src/cache/bare.rs
index a6af17e0b8..a1b17b8789 100644
--- a/packages/backend-rs/src/cache/bare.rs
+++ b/packages/backend-rs/src/cache/bare.rs
@@ -14,13 +14,23 @@ struct TimedData<T: Clone> {
 }
 
 impl<T: Clone> Cache<T> {
-    pub const fn new(ttl: Option<Duration>) -> Self {
+    pub const fn new() -> Self {
         Self {
             cache: Mutex::new(TimedData {
                 value: None,
                 last_updated: DateTime::UNIX_EPOCH,
             }),
-            ttl,
+            ttl: None,
+        }
+    }
+
+    pub const fn new_with_ttl(ttl: Duration) -> Self {
+        Self {
+            cache: Mutex::new(TimedData {
+                value: None,
+                last_updated: DateTime::UNIX_EPOCH,
+            }),
+            ttl: Some(ttl),
         }
     }
 
diff --git a/packages/backend-rs/src/config/meta.rs b/packages/backend-rs/src/config/meta.rs
index f0d7beddf8..18e0c874da 100644
--- a/packages/backend-rs/src/config/meta.rs
+++ b/packages/backend-rs/src/config/meta.rs
@@ -1,26 +1,27 @@
 //! Server information
 
 use crate::{cache::Cache, database::db_conn, model::entity::meta};
+use chrono::Duration;
 use sea_orm::{prelude::*, ActiveValue};
 
 type Meta = meta::Model;
 
-static INSTANCE_META_CACHE: Cache<Meta> = Cache::new(None);
+static INSTANCE_META_CACHE: Cache<Meta> = Cache::new_with_ttl(Duration::minutes(5));
 
 #[macros::export(js_name = "fetchMeta")]
 pub async fn local_server_info() -> Result<Meta, DbErr> {
-    local_server_info_impl(true).await
+    local_server_info_impl(false).await
 }
 
 #[macros::export(js_name = "updateMetaCache")]
 pub async fn update() -> Result<(), DbErr> {
-    local_server_info_impl(false).await?;
+    local_server_info_impl(true).await?;
     Ok(())
 }
 
-async fn local_server_info_impl(use_cache: bool) -> Result<Meta, DbErr> {
+async fn local_server_info_impl(force_update_cache: bool) -> Result<Meta, DbErr> {
     // try using cache
-    if use_cache {
+    if !force_update_cache {
         if let Some(cache) = INSTANCE_META_CACHE.get() {
             return Ok(cache);
         }
diff --git a/packages/backend-rs/src/federation/nodeinfo/generate.rs b/packages/backend-rs/src/federation/nodeinfo/generate.rs
index 430e5a1e7a..58baa7d64c 100644
--- a/packages/backend-rs/src/federation/nodeinfo/generate.rs
+++ b/packages/backend-rs/src/federation/nodeinfo/generate.rs
@@ -8,11 +8,12 @@ use crate::{
     misc,
     model::entity::{note, user},
 };
+use chrono::Duration;
 use sea_orm::prelude::*;
 use serde_json::json;
 use std::collections::HashMap;
 
-static NODEINFO_CACHE: Cache<Nodeinfo21> = Cache::new(None);
+static NODEINFO_CACHE: Cache<Nodeinfo21> = Cache::new_with_ttl(Duration::hours(1));
 
 /// Fetches the number of total/active local users and local posts.
 ///
@@ -122,11 +123,10 @@ async fn generate_nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> {
     })
 }
 
-async fn nodeinfo_2_1_impl(use_cache: bool) -> Result<Nodeinfo21, DbErr> {
-    if use_cache {
-        if let Some(nodeinfo) = NODEINFO_CACHE.get() {
-            return Ok(nodeinfo);
-        }
+/// Returns NodeInfo (version 2.1) of the local server.
+pub async fn nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> {
+    if let Some(nodeinfo) = NODEINFO_CACHE.get() {
+        return Ok(nodeinfo);
     }
 
     let nodeinfo = generate_nodeinfo_2_1().await?;
@@ -137,11 +137,6 @@ async fn nodeinfo_2_1_impl(use_cache: bool) -> Result<Nodeinfo21, DbErr> {
     Ok(nodeinfo)
 }
 
-/// Returns NodeInfo (version 2.1) of the local server.
-pub async fn nodeinfo_2_1() -> Result<Nodeinfo21, DbErr> {
-    nodeinfo_2_1_impl(true).await
-}
-
 /// Returns NodeInfo (version 2.0) of the local server.
 pub async fn nodeinfo_2_0() -> Result<Nodeinfo20, DbErr> {
     Ok(nodeinfo_2_1().await?.into())
@@ -166,9 +161,3 @@ pub async fn nodeinfo_2_1_as_json() -> Result<serde_json::Value, Error> {
 pub async fn nodeinfo_2_0_as_json() -> Result<serde_json::Value, Error> {
     Ok(serde_json::to_value(nodeinfo_2_0().await?)?)
 }
-
-#[macros::ts_export(js_name = "updateNodeinfoCache")]
-pub async fn update_cache() -> Result<(), DbErr> {
-    nodeinfo_2_1_impl(false).await?;
-    Ok(())
-}
diff --git a/packages/backend-rs/src/misc/should_nyaify.rs b/packages/backend-rs/src/misc/should_nyaify.rs
index 6b71068eb5..9f609c69a3 100644
--- a/packages/backend-rs/src/misc/should_nyaify.rs
+++ b/packages/backend-rs/src/misc/should_nyaify.rs
@@ -1,10 +1,6 @@
 //! Determine whether to enable the cat language conversion
 
-use crate::{
-    cache,
-    database::db_conn,
-    model::entity::user,
-};
+use crate::{cache, database::db_conn, model::entity::user};
 use sea_orm::{DbErr, EntityTrait, QuerySelect, SelectColumns};
 
 #[macros::errors]
diff --git a/packages/backend-rs/src/service/antenna/mod.rs b/packages/backend-rs/src/service/antenna/mod.rs
index e90693c6ac..975b1a66d8 100644
--- a/packages/backend-rs/src/service/antenna/mod.rs
+++ b/packages/backend-rs/src/service/antenna/mod.rs
@@ -6,7 +6,7 @@ use crate::{cache::Cache, database::db_conn, model::entity::antenna};
 use sea_orm::prelude::*;
 use std::sync::Arc;
 
-static ANTENNAS_CACHE: Cache<Arc<[antenna::Model]>> = Cache::new(None);
+static ANTENNAS_CACHE: Cache<Arc<[antenna::Model]>> = Cache::new();
 
 async fn update() -> Result<Arc<[antenna::Model]>, DbErr> {
     tracing::debug!("updating cache");
diff --git a/packages/backend/src/boot/master.ts b/packages/backend/src/boot/master.ts
index 801d2cf5fa..0585f34bc1 100644
--- a/packages/backend/src/boot/master.ts
+++ b/packages/backend/src/boot/master.ts
@@ -7,8 +7,6 @@ import {
 	greet,
 	removeOldAttestationChallenges,
 	showServerInfo,
-	updateMetaCache,
-	updateNodeinfoCache,
 	type Config,
 } from "backend-rs";
 import { config } from "@/config.js";
@@ -29,7 +27,6 @@ export async function masterMain() {
 		showEnvironment();
 		showNodejsVersion();
 		await connectDb();
-		await updateMetaCache();
 	} catch (e) {
 		bootLogger.error(
 			`Fatal error occurred during initialization:\n${inspect(e)}`,
@@ -51,10 +48,6 @@ export async function masterMain() {
 
 	import("../daemons/server-stats.js").then((x) => x.default());
 	import("../daemons/queue-stats.js").then((x) => x.default());
-	// Update meta cache every 5 minitues
-	setInterval(() => updateMetaCache(), 1000 * 60 * 5);
-	// Update nodeinfo cache every hour
-	setInterval(() => updateNodeinfoCache(), 1000 * 60 * 60);
 	// Remove old attestation challenges
 	setInterval(() => removeOldAttestationChallenges(), 1000 * 60 * 30);
 }