import { db } from '@/db/postgre.js'; import { Meta } from '@/models/entities/meta.js'; let cache: Meta; export async function fetchMeta(noCache = false): Promise { if (!noCache && cache) return cache; return await db.transaction(async transactionalEntityManager => { // New IDs are prioritized because multiple records may have been created due to past bugs. const metas = await transactionalEntityManager.find(Meta, { order: { id: 'DESC', }, }); const meta = metas[0]; if (meta) { cache = meta; return meta; } else { // If fetchMeta is called at the same time when meta is empty, this part may be called at the same time, so use fail-safe upsert. const saved = await transactionalEntityManager .upsert( Meta, { id: 'x', }, ['id'], ) .then((x) => transactionalEntityManager.findOneByOrFail(Meta, x.identifiers[0])); cache = saved; return saved; } }); } setInterval(() => { fetchMeta(true).then(meta => { cache = meta; }); }, 1000 * 10);