From 4d4311d3124f528d1332ae228da52ea138498a7d Mon Sep 17 00:00:00 2001 From: rhld16 Date: Mon, 30 Dec 2024 19:59:07 +0000 Subject: [PATCH] feat(api): utilise more caching for single-page route --- api/routes/single-page.ts | 32 ++++++++++++++++++++++++++------ nitro.config.ts | 2 ++ package.json | 6 +++--- pnpm-lock.yaml | Bin 256324 -> 270289 bytes wrangler.toml | 7 ++++++- 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/api/routes/single-page.ts b/api/routes/single-page.ts index 2a9416b6e..5ca8105bf 100644 --- a/api/routes/single-page.ts +++ b/api/routes/single-page.ts @@ -15,8 +15,10 @@ */ import { fetcher } from 'itty-fetcher' +import { createStorage } from 'unstorage' +import cloudflareKVBindingDriver from 'unstorage/drivers/cloudflare-kv-binding' -// Look inside tbe docs directory +// Look inside the docs directory const GITHUB_REPO = 'https://api.github.com/repos/fmhy/edit/contents/docs/' const EXCLUDE_FILES = [ 'README.md', @@ -45,6 +47,10 @@ interface File { } export default defineEventHandler(async (event) => { + const markdownStorage = createStorage({ + driver: cloudflareKVBindingDriver({ binding: 'STORAGE' }) + }) + let body = '\n' const f = fetcher({ headers: { @@ -54,7 +60,13 @@ export default defineEventHandler(async (event) => { try { // Fetch the list of files in the repository - const files = await f.get(GITHUB_REPO) + const indexCacheKey = "INDEX" + let files = await markdownStorage.getItem(indexCacheKey) + + if (!files) { + files = await f.get(GITHUB_REPO) + await markdownStorage.setItem(indexCacheKey, files, { ttl: 60 * 60 * 24 * 7 }) + } // Filter out the excluded files and non-markdown files const markdownFiles = files.filter((file: File) => { @@ -67,12 +79,17 @@ export default defineEventHandler(async (event) => { return isMarkdownFile && !isExcludedFile && !isInExcludedDirectory }) - // console.info(markdownFiles.map((f) => f.name)) - - // Fetch and concatenate the contents of the markdown files + // Fetch and concatenate the contents of the markdown files with caching const contents = await Promise.all( markdownFiles.map(async (file: File) => { + const cached = await markdownStorage.getItem(file.name) + if (cached) return cached + const content = await f.get(file.download_url) + if (content) { + await markdownStorage.setItem(file.name, content, { ttl: 60 * 60 }) + } + return content }) ) @@ -86,6 +103,9 @@ export default defineEventHandler(async (event) => { } // biome-ignore lint/correctness/noUndeclaredVariables: - appendResponseHeader(event, 'content-type', 'text/markdown;charset=utf-8') + appendResponseHeaders(event, { + 'content-type': 'text/markdown;charset=utf-8', + 'cache-control': 'public, max-age=3600' + }) return body }) diff --git a/nitro.config.ts b/nitro.config.ts index 02bcb293e..e35947e88 100644 --- a/nitro.config.ts +++ b/nitro.config.ts @@ -15,6 +15,8 @@ */ //https://nitro.unjs.io/config export default defineNitroConfig({ + preset: 'cloudflare_module', + compatibilityDate: '2024-11-01', runtimeConfig: { WEBHOOK_URL: process.env.WEBHOOK_URL }, diff --git a/package.json b/package.json index 9176eb78f..709c1a8f8 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,11 @@ "feed": "^4.2.2", "itty-fetcher": "^0.9.4", "nitro-cors": "^0.7.1", - "nitropack": "^2.9.7", + "nitropack": "^2.10.4", "nprogress": "^0.2.0", "pathe": "^1.1.2", "unocss": "^0.63.4", - "vitepress": "^1.4.1", + "vitepress": "^1.5.0", "vue": "^3.5.12", "x-satori": "^0.2.0", "zod": "^3.23.8" @@ -61,7 +61,7 @@ "unplugin-auto-import": "^0.18.3", "vite-plugin-optimize-exclude": "^0.0.1", "vite-plugin-terminal": "^1.2.0", - "wrangler": "^3.80.5" + "wrangler": "^3.99.0" }, "pnpm": { "peerDependencyRules": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b99ceb04f63b86b0a120d3402579ee81612df634..2fd7174e487560af0ea02ba2242883a35b26ca98 100644 GIT binary patch delta 28659 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 delta 21095 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