From 4c83d6d1b221eb4767e2f3283242de05b19e43c5 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sun, 4 Aug 2024 13:26:05 -0500 Subject: [PATCH] Do frontendController like I want to --- src/app.ts | 3 +- .../frontend.ts} | 52 ++++++------------- src/utils/og-metadata.ts | 1 + 3 files changed, 19 insertions(+), 37 deletions(-) rename src/{middleware/serveStaticWithOG.ts => controllers/frontend.ts} (72%) diff --git a/src/app.ts b/src/app.ts index cec7f131..a99fd255 100644 --- a/src/app.ts +++ b/src/app.ts @@ -108,6 +108,7 @@ import { trendingTagsController, } from '@/controllers/api/trends.ts'; import { errorHandler } from '@/controllers/error.ts'; +import { frontendController } from '@/controllers/frontend.ts'; import { metricsController } from '@/controllers/metrics.ts'; import { indexController } from '@/controllers/site.ts'; import '@/startup.ts'; @@ -121,7 +122,6 @@ import { requireSigner } from '@/middleware/requireSigner.ts'; import { signerMiddleware } from '@/middleware/signerMiddleware.ts'; import { storeMiddleware } from '@/middleware/storeMiddleware.ts'; import { uploaderMiddleware } from '@/middleware/uploaderMiddleware.ts'; -import { serveStaticWithOG } from './middleware/serveStaticWithOG.ts'; interface AppEnv extends HonoEnv { Variables: { @@ -315,7 +315,6 @@ app.use('/oauth/*', notImplementedController); const publicFiles = serveStatic({ root: './public/' }); const staticFiles = serveStatic({ root: './static/' }); -const frontendController = serveStaticWithOG({ path: './public/index.html' }); // Known frontend routes app.get('/@:acct', frontendController); diff --git a/src/middleware/serveStaticWithOG.ts b/src/controllers/frontend.ts similarity index 72% rename from src/middleware/serveStaticWithOG.ts rename to src/controllers/frontend.ts index 486ef76b..8a1c5c0c 100644 --- a/src/middleware/serveStaticWithOG.ts +++ b/src/controllers/frontend.ts @@ -1,5 +1,3 @@ -import { Context, Env, MiddlewareHandler, Next } from '@hono/hono'; -import { serveStatic as baseServeStatic, ServeStaticOptions } from '@hono/hono/serve-static'; import { html, r } from '@/utils/html.ts'; import { Conf } from '@/config.ts'; import { @@ -10,6 +8,7 @@ import { OpenGraphTemplateOpts, PathParams, } from '@/utils/og-metadata.ts'; +import { AppMiddleware } from '@/app.ts'; /** Placeholder to find & replace with metadata. */ const OG_META_PLACEHOLDER = '' as const; @@ -108,37 +107,20 @@ const buildMetaTags = async (params: PathParams, url: string): Promise = return await BLANK_META(url); }; -export function serveStaticWithOG( - options: ServeStaticOptions, -): MiddlewareHandler { - // deno-lint-ignore require-await - return async function serveStatic(c: Context, next: Next) { - let file = ''; - const getContent = async (path: string) => { - try { - if (!file) file = await Deno.readTextFile(path); - if (!file) throw new Error(`File at ${path} was empty!`); - if (file.includes(OG_META_PLACEHOLDER)) { - const params = getPathParams(c.req.path); - if (params) { - const meta = await buildMetaTags(params, Conf.local(c.req.path)); - return file.replace(OG_META_PLACEHOLDER, meta); - } - } - return file; - } catch (e) { - console.warn(`${e}`); - } +export const frontendController: AppMiddleware = async (c, next) => { + try { + const content = await Deno.readTextFile(new URL('../../public/index.html', import.meta.url)); + if (content.includes(OG_META_PLACEHOLDER)) { + const params = getPathParams(c.req.path); - return ''; - }; - const pathResolve = (path: string) => { - return `./${path}`; - }; - return baseServeStatic({ - ...options, - getContent, - pathResolve, - })(c, next); - }; -} + if (params) { + const meta = await buildMetaTags(params, Conf.local(c.req.path)); + return c.html(content.replace(OG_META_PLACEHOLDER, meta)); + } + } + return c.html(content); + } catch (e) { + console.log(e); + await next(); + } +}; diff --git a/src/utils/og-metadata.ts b/src/utils/og-metadata.ts index c368a07d..a9685961 100644 --- a/src/utils/og-metadata.ts +++ b/src/utils/og-metadata.ts @@ -27,6 +27,7 @@ interface StatusInfo { } const store = await Storages.db(); + export const getInstanceName = async () => { const meta = await getInstanceMetadata(store, AbortSignal.timeout(1000)); return meta?.name || 'Ditto';