summary refs log tree commit diff
path: root/src/api/Server.ts
diff options
context:
space:
mode:
authorRory& <root@rory.gay>2025-12-17 11:00:51 +0100
committerRory& <root@rory.gay>2025-12-17 11:01:27 +0100
commit491c0de845a886954262e3ddb24959ba37a014b6 (patch)
treec0251f3779a5cd2842320e1278232b48fbea0390 /src/api/Server.ts
parentPre-commit: use spaces for formatting, regenerate schemas if changed (diff)
downloadserver-ts-491c0de845a886954262e3ddb24959ba37a014b6.tar.xz
lintstagedrc: regenerate schemas/openapi if schemas changed
Diffstat (limited to 'src/api/Server.ts')
-rw-r--r--src/api/Server.ts236
1 files changed, 118 insertions, 118 deletions
diff --git a/src/api/Server.ts b/src/api/Server.ts

index 0969e5e8..f81898e8 100644 --- a/src/api/Server.ts +++ b/src/api/Server.ts
@@ -31,149 +31,149 @@ const PUBLIC_ASSETS_FOLDER = path.join(ASSETS_FOLDER, "public"); export type SpacebarServerOptions = ServerOptions; declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace Express { - interface Request { - server: SpacebarServer; - } - } + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace Express { + interface Request { + server: SpacebarServer; + } + } } export class SpacebarServer extends Server { - declare public options: SpacebarServerOptions; + declare public options: SpacebarServerOptions; - constructor(opts?: Partial<SpacebarServerOptions>) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - super({ ...opts, errorHandler: false, jsonBody: false }); - } + constructor(opts?: Partial<SpacebarServerOptions>) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + super({ ...opts, errorHandler: false, jsonBody: false }); + } - async start() { - await initDatabase(); - await Config.init(); - await initEvent(); - await Email.init(); - await ConnectionConfig.init(); - await initInstance(); - WebAuthn.init(); + async start() { + await initDatabase(); + await Config.init(); + await initEvent(); + await Email.init(); + await ConnectionConfig.init(); + await initInstance(); + WebAuthn.init(); - const logRequests = process.env["LOG_REQUESTS"] != undefined; - if (logRequests) { - this.app.use( - morgan("combined", { - skip: (req, res) => { - let skip = !(process.env["LOG_REQUESTS"]?.includes(res.statusCode.toString()) ?? false); - if (process.env["LOG_REQUESTS"]?.charAt(0) == "-") skip = !skip; - return skip; - }, - }), - ); - } + const logRequests = process.env["LOG_REQUESTS"] != undefined; + if (logRequests) { + this.app.use( + morgan("combined", { + skip: (req, res) => { + let skip = !(process.env["LOG_REQUESTS"]?.includes(res.statusCode.toString()) ?? false); + if (process.env["LOG_REQUESTS"]?.charAt(0) == "-") skip = !skip; + return skip; + }, + }), + ); + } - this.app.set("json replacer", JSONReplacer); - this.app.disable("x-powered-by"); + this.app.set("json replacer", JSONReplacer); + this.app.disable("x-powered-by"); - const trustedProxies = Config.get().security.trustedProxies; - if (trustedProxies) this.app.set("trust proxy", trustedProxies); + const trustedProxies = Config.get().security.trustedProxies; + if (trustedProxies) this.app.set("trust proxy", trustedProxies); - this.app.use(CORS); - this.app.use(BodyParser({ inflate: true, limit: "10mb" })); + this.app.use(CORS); + this.app.use(BodyParser({ inflate: true, limit: "10mb" })); - const app = this.app; - const api = Router({ mergeParams: true }); - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this.app = api; + const app = this.app; + const api = Router({ mergeParams: true }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + this.app = api; - api.use(Authentication); - await initRateLimits(api); - await initTranslation(api); + api.use(Authentication); + await initRateLimits(api); + await initTranslation(api); - this.routes = (await registerRoutes(this, path.join(__dirname, "routes", "/"))).filter((r) => !!r); + this.routes = (await registerRoutes(this, path.join(__dirname, "routes", "/"))).filter((r) => !!r); - // 404 is not an error in express, so this should not be an error middleware - // this is a fine place to put the 404 handler because its after we register the routes - // and since its not an error middleware, our error handler below still works. - // Emma [it/its] @ Rory& - the _ is required now, as pillarjs throw an error if you don't pass a param name now - api.use("*_", (req: Request, res: Response) => { - res.status(404).json({ - message: "404 endpoint not found", - code: 0, - }); - }); + // 404 is not an error in express, so this should not be an error middleware + // this is a fine place to put the 404 handler because its after we register the routes + // and since its not an error middleware, our error handler below still works. + // Emma [it/its] @ Rory& - the _ is required now, as pillarjs throw an error if you don't pass a param name now + api.use("*_", (req: Request, res: Response) => { + res.status(404).json({ + message: "404 endpoint not found", + code: 0, + }); + }); - this.app = app; + this.app = app; - //app.use("/__development", ) - //app.use("/__internals", ) - app.use("/api/v6", api); - app.use("/api/v7", api); - app.use("/api/v8", api); - app.use("/api/v9", api); - app.use("/api", api); // allow unversioned requests + //app.use("/__development", ) + //app.use("/__internals", ) + app.use("/api/v6", api); + app.use("/api/v7", api); + app.use("/api/v8", api); + app.use("/api/v9", api); + app.use("/api", api); // allow unversioned requests - app.use("/imageproxy/:hash/:size/:url", ImageProxy); + app.use("/imageproxy/:hash/:size/:url", ImageProxy); - app.get("/", (req, res) => res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "index.html"))); + app.get("/", (req, res) => res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "index.html"))); - app.get("/verify-email", (req, res) => res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "verify.html"))); + app.get("/verify-email", (req, res) => res.sendFile(path.join(PUBLIC_ASSETS_FOLDER, "verify.html"))); - app.get("/_spacebar/api/schemas.json", (req, res) => { - res.sendFile(path.join(ASSETS_FOLDER, "schemas.json")); - }); + app.get("/_spacebar/api/schemas.json", (req, res) => { + res.sendFile(path.join(ASSETS_FOLDER, "schemas.json")); + }); - app.get("/_spacebar/api/openapi.json", (req, res) => { - res.sendFile(path.join(ASSETS_FOLDER, "openapi.json")); - }); + app.get("/_spacebar/api/openapi.json", (req, res) => { + res.sendFile(path.join(ASSETS_FOLDER, "openapi.json")); + }); - // current well-known location - app.get("/.well-known/spacebar", (req, res) => { - res.json({ - api: Config.get().api.endpointPublic, - }); - }); + // current well-known location + app.get("/.well-known/spacebar", (req, res) => { + res.json({ + api: Config.get().api.endpointPublic, + }); + }); - // new well-known location - app.get("/.well-known/spacebar/client", (req, res) => { - let erlpackSupported = false; - try { - require("@yukikaze-bot/erlpack"); - erlpackSupported = true; - } catch (e) { - // empty - } + // new well-known location + app.get("/.well-known/spacebar/client", (req, res) => { + let erlpackSupported = false; + try { + require("@yukikaze-bot/erlpack"); + erlpackSupported = true; + } catch (e) { + // empty + } - res.json({ - api: { - baseUrl: Config.get().api.endpointPublic?.split("/api")[0] || "", // TODO: migrate database values to not include /api/v9 - apiVersions: { - default: Config.get().api.defaultVersion, - active: Config.get().api.activeVersions, - }, - }, - cdn: { - baseUrl: Config.get().cdn.endpointPublic, - }, - gateway: { - baseUrl: Config.get().gateway.endpointPublic, - encoding: [...(erlpackSupported ? ["etf"] : []), "json"], - compression: ["zstd-stream", "zlib-stream", null], - }, - admin: - Config.get().admin.endpointPublic === null - ? undefined - : { - baseUrl: Config.get().admin.endpointPublic, - }, - }); - }); + res.json({ + api: { + baseUrl: Config.get().api.endpointPublic?.split("/api")[0] || "", // TODO: migrate database values to not include /api/v9 + apiVersions: { + default: Config.get().api.defaultVersion, + active: Config.get().api.activeVersions, + }, + }, + cdn: { + baseUrl: Config.get().cdn.endpointPublic, + }, + gateway: { + baseUrl: Config.get().gateway.endpointPublic, + encoding: [...(erlpackSupported ? ["etf"] : []), "json"], + compression: ["zstd-stream", "zlib-stream", null], + }, + admin: + Config.get().admin.endpointPublic === null + ? undefined + : { + baseUrl: Config.get().admin.endpointPublic, + }, + }); + }); - this.app.use(ErrorHandler); + this.app.use(ErrorHandler); - ConnectionLoader.loadConnections(); + ConnectionLoader.loadConnections(); - if (logRequests) console.log(red(`Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!`)); + if (logRequests) console.log(red(`Warning: Request logging is enabled! This will spam your console!\nTo disable this, unset the 'LOG_REQUESTS' environment variable!`)); - return super.start(); - } + return super.start(); + } }