diff --git a/astro.config.ts b/astro.config.ts index bb04d7c..95ff0c8 100644 --- a/astro.config.ts +++ b/astro.config.ts @@ -5,43 +5,46 @@ import tailwind from "@astrojs/tailwind"; import { baremuxPath } from "@mercuryworkshop/bare-mux/node"; import { epoxyPath } from "@mercuryworkshop/epoxy-transport"; import { libcurlPath } from "@mercuryworkshop/libcurl-transport"; +import { scramjetPath } from "@mercuryworkshop/scramjet"; import playformCompress from "@playform/compress"; import { uvPath } from "@titaniumnetwork-dev/ultraviolet"; -import { scramjetPath } from "@mercuryworkshop/scramjet"; import icon from "astro-icon"; import { defineConfig, envField } from "astro/config"; import { viteStaticCopy } from "vite-plugin-static-copy"; import { version } from "./package.json"; import { parsedDoc } from "./server/config.js"; +import { wispPlugin } from "./server/vite-plugin-wisp"; const workerwarePath = fileURLToPath(new URL("./workerware/src", import.meta.url)); export default defineConfig({ - site: parsedDoc.seo.enabled ? parsedDoc.seo.domain || process.env.SITE : 'http://localhost:4321', - env: { - schema: { - VERSION: envField.string({ - context: "client", - access: "public", - optional: true, - default: version - }), - MARKETPLACE_ENABLED: envField.boolean({ - context: "client", - access: "public", - optional: true, - default: parsedDoc.marketplace.enabled - }), - SEO: envField.string({ - context: "client", - access: "public", - optional: true, - default: JSON.stringify({ - enabled: parsedDoc.seo.enabled, - domain: new URL(parsedDoc.seo.domain).host - }) + site: parsedDoc.seo.enabled + ? parsedDoc.seo.domain || process.env.SITE + : "http://localhost:4321", + env: { + schema: { + VERSION: envField.string({ + context: "client", + access: "public", + optional: true, + default: version + }), + MARKETPLACE_ENABLED: envField.boolean({ + context: "client", + access: "public", + optional: true, + default: parsedDoc.marketplace.enabled + }), + SEO: envField.string({ + context: "client", + access: "public", + optional: true, + default: JSON.stringify({ + enabled: parsedDoc.seo.enabled, + domain: new URL(parsedDoc.seo.domain).host }) - } - }, + }) + } + }, integrations: [ tailwind(), //sitemap(), @@ -77,7 +80,7 @@ export default defineConfig({ { src: `${scramjetPath}/**/*`.replace(/\\/g, "/"), dest: "scram", - overwrite: false + overwrite: false }, { src: `${baremuxPath}/**/*`.replace(/\\/g, "/"), @@ -90,7 +93,8 @@ export default defineConfig({ overwrite: false } ] - }) + }), + wispPlugin ], server: { proxy: { @@ -113,12 +117,6 @@ export default defineConfig({ target: "http://localhost:8080", changeOrigin: true }, - "/wisp/": { - target: "ws://localhost:8080/wisp/", - changeOrigin: true, - ws: true, - rewrite: (path) => path.replace(/^\/wisp\//, "") - }, "/styles": { target: "http://localhost:8080", changeOrigin: true diff --git a/package.json b/package.json index 3e17c1e..594d018 100644 --- a/package.json +++ b/package.json @@ -32,9 +32,9 @@ "@mercuryworkshop/bare-mux": "^2.1.7", "@mercuryworkshop/epoxy-transport": "^2.1.27", "@mercuryworkshop/libcurl-transport": "^1.3.15", + "@mercuryworkshop/scramjet": "https://github.com/MercuryWorkshop/scramjet/releases/download/latest/mercuryworkshop-scramjet-1.0.2-dev.tgz", "@playform/compress": "^0.1.6", "@titaniumnetwork-dev/ultraviolet": "^3.2.10", - "@mercuryworkshop/scramjet": "https://github.com/MercuryWorkshop/scramjet/releases/download/latest/mercuryworkshop-scramjet-1.0.2-dev.tgz", "@types/node": "^22.10.2", "@types/sequelize": "^4.28.20", "astro": "^5.1.1", @@ -62,5 +62,16 @@ "ora": "^8.1.1", "sharp": "^0.33.5", "tsx": "^4.19.2" + }, + "packageManager": "pnpm@10.4.1+sha512.c753b6c3ad7afa13af388fa6d808035a008e30ea9993f58c6663e2bc5ff21679aa834db094987129aa4d488b86df57f7b634981b2f827cdcacc698cc0cfb88af", + "pnpm": { + "onlyBuiltDependencies": [ + "@biomejs/biome", + "bufferutil", + "esbuild", + "sharp", + "sqlite3", + "utf-8-validate" + ] } } diff --git a/server/server.ts b/server/server.ts index 752a8e0..0cd1a34 100644 --- a/server/server.ts +++ b/server/server.ts @@ -10,22 +10,20 @@ import fastifyStatic from "@fastify/static"; import chalk from "chalk"; import Fastify, { FastifyReply, FastifyRequest } from "fastify"; import gradient from "gradient-string"; -//@ts-ignore WHY would I want this typechecked AT ALL -import { handler as ssrHandler } from "../dist/server/entry.mjs"; import { parsedDoc } from "./config.js"; import { setupDB } from "./dbSetup.js"; import { catalogAssets, marketplaceAPI } from "./marketplace.js"; import { serverFactory } from "./serverFactory.js"; const app = Fastify({ - logger: parsedDoc.server.server.logging, - ignoreDuplicateSlashes: true, - ignoreTrailingSlash: true, - serverFactory: serverFactory + logger: parsedDoc.server.server.logging, + ignoreDuplicateSlashes: true, + ignoreTrailingSlash: true, + serverFactory: serverFactory }); await app.register(fastifyCompress, { - encodings: ["br", "gzip", "deflate"] + encodings: ["br", "gzip", "deflate"] }); await app.register(fastifyMultipart, { @@ -36,58 +34,60 @@ await app.register(fastifyMultipart, { }); await app.register(fastifyHelmet, { - xPoweredBy: false, - crossOriginEmbedderPolicy: true, - crossOriginOpenerPolicy: true, - contentSecurityPolicy: false //Disabled because astro DOES NOT LIKE IT + xPoweredBy: false, + crossOriginEmbedderPolicy: true, + crossOriginOpenerPolicy: true, + contentSecurityPolicy: false //Disabled because astro DOES NOT LIKE IT }); await app.register(fastifyStatic, { - root: fileURLToPath(new URL("../dist/client", import.meta.url)) + root: fileURLToPath(new URL("../dist/client", import.meta.url)) }); //Our marketplace API. Not middleware as I don't want to deal with that LOL. Just a function that passes our app to it. if (parsedDoc.marketplace.enabled) { - await app.register(fastifyStatic, { - root: fileURLToPath(new URL("../database_assets", import.meta.url)), - prefix: "/packages/", - decorateReply: false - }); - marketplaceAPI(app); + await app.register(fastifyStatic, { + root: fileURLToPath(new URL("../database_assets", import.meta.url)), + prefix: "/packages/", + decorateReply: false + }); + marketplaceAPI(app); } await app.register(fastifyMiddie); - -app.use(ssrHandler); - +if (process.env.NODE_ENV === "production") { + //@ts-ignore WHY would I want this typechecked AT ALL + const { handler: ssrHandler } = await import("../dist/server/entry.mjs") + app.use(ssrHandler); +} const port: number = - parseInt(process.env.PORT as string) || parsedDoc.server.server.port || parseInt("8080"); -const titleText = ` - _ _ _ _ ____ _ -| \\ | | ___| |__ _ _| | __ _ / ___| ___ _ ____ _(_) ___ ___ ___ + parseInt(process.env.PORT as string) || parsedDoc.server.server.port || parseInt("8080"); +const titleText = ` + _ _ _ _ ____ _ +| \\ | | ___| |__ _ _| | __ _ / ___| ___ _ ____ _(_) ___ ___ ___ | \\| |/ _ \\ '_ \\| | | | |/ _' | \\___ \\ / _ \\ '__\\ \\ / / |/ __/ _ \\/ __| | |\\ | __/ |_) | |_| | | (_| | ___) | __/ | \\ V /| | (_| __/\\__ \\ |_| \\_|\\___|_.__/ \\__,_|_|\\__,_| |____/ \\___|_| \\_/ |_|\\___\\___||___/ `; const titleColors = { - purple: "#7967dd", - pink: "#eb6f92" + purple: "#7967dd", + pink: "#eb6f92" }; console.log(gradient(Object.values(titleColors)).multiline(titleText as string)); app.listen({ port: port, host: "0.0.0.0" }).then(async () => { - console.log( - chalk.hex("#7967dd")( - `Server listening on ${chalk.hex("#eb6f92").bold("http://localhost:" + port + "/")}` - ) - ); - console.log( - chalk.hex("#7967dd")( - `Server also listening on ${chalk.hex("#eb6f92").bold("http://0.0.0.0:" + port + "/")}` - ) - ); - if (parsedDoc.marketplace.enabled) { - await catalogAssets.sync(); - await setupDB(catalogAssets); - } + console.log( + chalk.hex("#7967dd")( + `Server listening on ${chalk.hex("#eb6f92").bold("http://localhost:" + port + "/")}` + ) + ); + console.log( + chalk.hex("#7967dd")( + `Server also listening on ${chalk.hex("#eb6f92").bold("http://0.0.0.0:" + port + "/")}` + ) + ); + if (parsedDoc.marketplace.enabled) { + await catalogAssets.sync(); + await setupDB(catalogAssets); + } }); diff --git a/server/serverFactory.ts b/server/serverFactory.ts index 6e770da..e211808 100644 --- a/server/serverFactory.ts +++ b/server/serverFactory.ts @@ -26,4 +26,4 @@ const serverFactory: FastifyServerFactory = ( return httpServer; }; -export { serverFactory }; +export { serverFactory, wispOptions }; diff --git a/server/vite-plugin-wisp.ts b/server/vite-plugin-wisp.ts new file mode 100644 index 0000000..0f4c576 --- /dev/null +++ b/server/vite-plugin-wisp.ts @@ -0,0 +1,15 @@ +import { Socket } from "node:net"; +import wisp from "wisp-server-node"; +import { wispOptions } from "./serverFactory"; + +export const wispPlugin = { + name: "vite-plugin-wisp", + configureServer(server) { + server.wisp = wisp; + server.httpServer?.on("upgrade", (req, socket: Socket, head) => + req.url?.endsWith("/wisp/") + ? wisp.routeRequest(req, socket, head, wispOptions) + : undefined + ); + } +};