--- /dev/null
+import type { Request, Response } from "express";
+import { LemmyHttp } from "lemmy-js-client";
+import { getHttpBaseInternal } from "../../shared/env";
+import { wrapClient } from "../../shared/services/HttpService";
+import generateManifestJson from "../utils/generate-manifest-json";
+import { setForwardedHeaders } from "../utils/set-forwarded-headers";
+
+let manifest: Awaited<ReturnType<typeof generateManifestJson>> | undefined =
+ undefined;
+
+export default async (req: Request, res: Response) => {
+ if (!manifest) {
+ const headers = setForwardedHeaders(req.headers);
+ const client = wrapClient(new LemmyHttp(getHttpBaseInternal(), headers));
+ const site = await client.getSite({});
+
+ if (site.state === "success") {
+ manifest = await generateManifestJson(site.data);
+ } else {
+ res.sendStatus(500);
+ return;
+ }
+ }
+
+ res.setHeader("content-type", "application/manifest+json");
+
+ res.send(manifest);
+};
import path from "path";
import process from "process";
import CatchAllHandler from "./handlers/catch-all-handler";
+import ManifestHandler from "./handlers/manifest-handler";
import RobotsHandler from "./handlers/robots-handler";
import ServiceWorkerHandler from "./handlers/service-worker-handler";
import ThemeHandler from "./handlers/theme-handler";
server.get("/robots.txt", RobotsHandler);
server.get("/service-worker.js", ServiceWorkerHandler);
+server.get("/manifest", ManifestHandler);
server.get("/css/themes/:name", ThemeHandler);
server.get("/css/themelist", ThemesListHandler);
server.get("/*", CatchAllHandler);
import { ILemmyConfig, IsoDataOptionalSite } from "../../shared/interfaces";
import { favIconPngUrl, favIconUrl } from "../../shared/utils";
import { fetchIconPng } from "./fetch-icon-png";
-import { generateManifestBase64 } from "./generate-manifest-base64";
const customHtmlHeader = process.env["LEMMY_UI_CUSTOM_HTML_HEADER"] || "";
+let appleTouchIcon: string | undefined = undefined;
+
export async function createSsrHtml(
root: string,
isoData: IsoDataOptionalSite
) {
const site = isoData.site_res;
- const appleTouchIcon = site?.site_view.site.icon
- ? `data:image/png;base64,${sharp(
- await fetchIconPng(site.site_view.site.icon)
- )
- .resize(180, 180)
- .extend({
- bottom: 20,
- top: 20,
- left: 20,
- right: 20,
- background: "#222222",
- })
- .png()
- .toBuffer()
- .then(buf => buf.toString("base64"))}`
- : favIconPngUrl;
+ if (!appleTouchIcon) {
+ appleTouchIcon = site?.site_view.site.icon
+ ? `data:image/png;base64,${sharp(
+ await fetchIconPng(site.site_view.site.icon)
+ )
+ .resize(180, 180)
+ .extend({
+ bottom: 20,
+ top: 20,
+ left: 20,
+ right: 20,
+ background: "#222222",
+ })
+ .png()
+ .toBuffer()
+ .then(buf => buf.toString("base64"))}`
+ : favIconPngUrl;
+ }
const erudaStr =
process.env["LEMMY_UI_DEBUG"] === "true"
/>
<!-- Web app manifest -->
- ${
- site &&
- `<link
- rel="manifest"
- href=${`data:application/manifest+json;base64,${await generateManifestBase64(
- site
- )}`}
- />`
- }
+ <link rel="manifest" href="/manifest" />
<link rel="apple-touch-icon" href=${appleTouchIcon} />
<link rel="apple-touch-startup-image" href=${appleTouchIcon} />
import { getHttpBaseExternal } from "../../shared/env";
import { fetchIconPng } from "./fetch-icon-png";
-const iconSizes = [72, 96, 144, 192, 512];
+const iconSizes = [72, 96, 128, 144, 152, 192, 384, 512];
const defaultLogoPathDirectory = path.join(
process.cwd(),
"icons"
);
-export async function generateManifestBase64({
+export default async function ({
my_user,
site_view: {
site,
const icon = site.icon ? await fetchIconPng(site.icon) : null;
- const manifest = {
+ return {
name: site.name,
description: site.description ?? "A link aggregator for the fediverse",
start_url: url,
short_name: "Communities",
description: "Browse communities",
},
- ]
- .concat(
- my_user
- ? [
- {
- name: "Create Post",
- url: "/create_post",
- short_name: "Create Post",
- description: "Create a post.",
- },
- ]
- : []
- )
- .concat(
- my_user?.local_user_view.person.admin || !community_creation_admin_only
- ? [
- {
- name: "Create Community",
- url: "/create_community",
- short_name: "Create Community",
- description: "Create a community",
- },
- ]
- : []
- ),
+ {
+ name: "Create Post",
+ url: "/create_post",
+ short_name: "Create Post",
+ description: "Create a post.",
+ },
+ ].concat(
+ my_user?.local_user_view.person.admin || !community_creation_admin_only
+ ? [
+ {
+ name: "Create Community",
+ url: "/create_community",
+ short_name: "Create Community",
+ description: "Create a community",
+ },
+ ]
+ : []
+ ),
related_applications: [
{
platform: "f-droid",
},
],
};
-
- return Buffer.from(JSON.stringify(manifest)).toString("base64");
}