From ff6a91f916330276f98bdcb0ed5871ed4b7df62a Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Mon, 15 Apr 2024 00:46:19 -1000 Subject: [PATCH] feat(frontend): :sparkles: Allow usage of glitch-soc as frontend (alpha) --- .gitignore | 3 +- bun.lockb | Bin 152164 -> 152484 bytes config/config.example.toml | 8 ++++++ packages/config-manager/config.type.ts | 16 +++++++++++ packages/glitch-server/main.ts | 37 +++++++++++++++++++++++++ packages/glitch-server/package.json | 6 ++++ server.ts | 12 ++++++++ 7 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 packages/glitch-server/main.ts create mode 100644 packages/glitch-server/package.json diff --git a/.gitignore b/.gitignore index 5dd1bb5e..01d75f32 100644 --- a/.gitignore +++ b/.gitignore @@ -174,4 +174,5 @@ pages/dist log.txt *.log build -config/extended_description_test.md \ No newline at end of file +config/extended_description_test.md +glitch \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 6627542838af61a07e5dca2e17d8b834f2b3a462..0280bdd636d5ebf3b070aae83b8d15c6c0e34f32 100755 GIT binary patch delta 19338 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 mx?u2hWUK#10`L&>_eEeS&ckLzs diff --git a/config/config.example.toml b/config/config.example.toml index 0335c88e..c1798df0 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -90,6 +90,14 @@ bait_user_agents = ["curl", "wget"] # The URL to reach the frontend at (should be on a local network) url = "http://localhost:3000" +[frontend.glitch] +# Enable the Glitch frontend integration +enabled = false +# Glitch assets folder +assets = "glitch" +# Server the assets were ripped from (and any eventual CDNs) +server = ["https://glitch.social", "https://static.glitch.social"] + [smtp] # SMTP server to use for sending emails server = "smtp.example.com" diff --git a/packages/config-manager/config.type.ts b/packages/config-manager/config.type.ts index 4483f10e..8b655b55 100644 --- a/packages/config-manager/config.type.ts +++ b/packages/config-manager/config.type.ts @@ -123,6 +123,17 @@ export interface Config { frontend: { /** @default "http://localhost:3000" */ url: string; + + glitch: { + /** @default false */ + enabled: boolean; + + /** @default "glitch" */ + assets: string; + + /** @default [] */ + server: string[]; + }; }; smtp: { @@ -437,6 +448,11 @@ export const defaultConfig: Config = { }, frontend: { url: "http://localhost:3000", + glitch: { + enabled: false, + assets: "glitch", + server: [], + }, }, smtp: { server: "smtp.example.com", diff --git a/packages/glitch-server/main.ts b/packages/glitch-server/main.ts new file mode 100644 index 00000000..cac5a745 --- /dev/null +++ b/packages/glitch-server/main.ts @@ -0,0 +1,37 @@ +import { dualLogger } from "@loggers"; +import { errorResponse } from "@response"; +import { config } from "config-manager"; +import { join } from "node:path"; +import { + LogLevel, + type LogManager, + type MultiLogManager, +} from "~packages/log-manager"; + +export const handleGlitchRequest = async ( + req: Request, + logger: LogManager | MultiLogManager, +): Promise => { + const url = new URL(req.url); + let path = url.pathname; + + // Strip leading /web from path + if (path.startsWith("/web")) path = path.slice(4); + + // Redirect / to /index.html + if (path === "/" || path === "") path = "/index.html"; + // If path doesn't have an extension (e.g. /about), serve index.html + // Also check if Accept header contains text/html + if (!path.includes(".") && req.headers.get("Accept")?.includes("text/html")) + path = "/index.html"; + + const file = Bun.file(join(config.frontend.glitch.assets, path)); + + if (await file.exists()) { + return new Response(file); + } + + dualLogger.log(LogLevel.WARNING, "Glitch-Soc", `Asset not found: ${path}`); + + return errorResponse("Glitch-Soc route not found", 404); +}; diff --git a/packages/glitch-server/package.json b/packages/glitch-server/package.json new file mode 100644 index 00000000..cb46f74f --- /dev/null +++ b/packages/glitch-server/package.json @@ -0,0 +1,6 @@ +{ + "name": "glitch-server", + "version": "0.0.0", + "main": "index.ts", + "dependencies": {} +} diff --git a/server.ts b/server.ts index 90f5476a..5564bec4 100644 --- a/server.ts +++ b/server.ts @@ -1,9 +1,11 @@ +import { dualLogger } from "@loggers"; import { errorResponse, response } from "@response"; import type { Config } from "config-manager"; import { matches } from "ip-matching"; import type { LogManager, MultiLogManager } from "log-manager"; import { LogLevel } from "log-manager"; import { processRoute } from "server-handler"; +import { handleGlitchRequest } from "~packages/glitch-server/main"; import { matchRoute } from "~routes"; export const createServer = ( @@ -115,6 +117,16 @@ export const createServer = ( ); } + if (config.frontend.glitch.enabled) { + // Proxy all /web requests to Glitch-Soc + if ( + new URL(req.url).pathname.startsWith("/web") || + new URL(req.url).pathname.startsWith("/packs") + ) { + return await handleGlitchRequest(req, dualLogger); + } + } + // If route is .well-known, remove dot because the filesystem router can't handle dots for some reason const matchedRoute = matchRoute( req.url.replace(".well-known", "well-known"),