UNPKG

@lobehub/chat

Version:

Lobe Chat - an open-source, high-performance chatbot framework that supports speech synthesis, multimodal, and extensible Function Call plugin system. Supports one-click free deployment of your private ChatGPT/LLM web application.

53 lines (43 loc) 1.58 kB
'use server'; import { existsSync, promises } from 'node:fs'; import pMap from 'p-map'; import { ZodError } from 'zod'; import { type NextCacheFileData, nextCacheFileSchema } from './schema'; const cachePath = '.next/cache/fetch-cache'; export const getCacheFiles = async (): Promise<NextCacheFileData[]> => { if (!existsSync(cachePath)) { return []; } const files = await promises.readdir(cachePath); let result: NextCacheFileData[] = (await pMap(files, async (file) => { // ignore tags-manifest file if (/manifest/.test(file)) return false; try { const fileContent = await promises.readFile(`${cachePath}/${file}`).catch((err) => { throw new Error(`Error reading file ${file}`, { cause: err, }); }); const fileStats = await promises.stat(`${cachePath}/${file}`).catch((err) => { throw new Error(`Error reading file ${file}`, { cause: err, }); }); const jsonData = JSON.parse(fileContent.toString()); return nextCacheFileSchema.parse({ ...jsonData, id: file, timestamp: new Date(fileStats.birthtime), }); } catch (error) { if (error instanceof ZodError) { const issues = error.issues; console.error(`File ${file} do not match the schema`, issues); } console.error(`Error parsing ${file}`); return false; } })) as NextCacheFileData[]; result = result.filter(Boolean) as NextCacheFileData[]; return result.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); };