diff --git a/newServer.ts b/newServer.ts new file mode 100644 index 0000000..b70d7ba --- /dev/null +++ b/newServer.ts @@ -0,0 +1,160 @@ +import fastify from "fastify"; +import fastifyStatic from "@fastify/static"; +import { fileURLToPath } from "url"; +import path from "path"; +import fs from "fs"; +import cookieParser from "@fastify/cookie"; +import { createServer } from "http"; + +import { createBareServer } from "@tomphttp/bare-server-node"; +import createRammerhead from "rammerhead/src/server/index.js"; +import wisp from "wisp-server-node"; +import { Socket } from "net"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const bare = createBareServer("/bare/"); +const rh = createRammerhead(); + +const failureFile = fs.readFileSync("Checkfailed.html", "utf8"); + +const LICENSE_SERVER_URL = "https://license.mercurywork.shop/validate?license="; + +const rammerheadScopes = [ + "/rammerhead.js", + "/hammerhead.js", + "/transport-worker.js", + "/task.js", + "/iframe-task.js", + "/worker-hammerhead.js", + "/messaging", + "/sessionexists", + "/deletesession", + "/newsession", + "/editsession", + "/needpassword", + "/syncLocalStorage", + "/api/shuffleDict", + "/mainport" +]; + +const rammerheadSession = /^\/[a-z0-9]{32}/; + +function shouldRouteRh(req) { + const url = new URL(req.url, "http://0.0.0.0"); + return ( + rammerheadScopes.includes(url.pathname) || + rammerheadSession.test(url.pathname) + ); +} + +function routeRhRequest(req, res) { + rh.emit("request", req, res); +} + +function routeRhUpgrade(req, socket, head) { + rh.emit("upgrade", req, socket, head); +} + +const serverFactory = (handler, opts) => { + return createServer() + .on("request", (req, res) => { + if (bare.shouldRoute(req)) { + bare.routeRequest(req, res); + } else if (shouldRouteRh(req)) { + routeRhRequest(req, res); + } else { + handler(req, res); + } + }) + .on("upgrade", (req, socket, head) => { + if (bare.shouldRoute(req)) { + bare.routeUpgrade(req, socket, head); + } else if (shouldRouteRh(req)) { + routeRhUpgrade(req, socket, head); + } else { + wisp.routeRequest(req, socket as Socket, head); + } + }); +}; + +const app = fastify({ logger: false, serverFactory }); + +app.register(cookieParser); +await app.register(import("@fastify/compress")); + +// Uncomment if you wish to add masqr. +/* +app.addHook("preHandler", async (req, reply) => { + if (req.cookies["authcheck"]) { + return reply; + } + + const authheader = req.headers.authorization; + + if (req.cookies["refreshcheck"] != "true") { + reply + .setCookie("refreshcheck", "true", { maxAge: 10000 }) + .type("text/html") + .send(failureFile); + return reply; + } + + if (!authheader) { + reply + .code(401) + .header("WWW-Authenticate", "Basic") + .type("text/html") + .send(failureFile); + return reply; + } + + const auth = Buffer.from(authheader.split(" ")[1], "base64") + .toString() + .split(":"); + const user = auth[0]; + const pass = auth[1]; + + const licenseCheck = ( + await ( + await fetch(`${LICENSE_SERVER_URL}${pass}&host=${req.headers.host}`) + ).json() + )["status"]; + console.log( + `${LICENSE_SERVER_URL}${pass}&host=${req.headers.host} returned ${licenseCheck}` + ); + + if (licenseCheck === "License valid") { + reply.setCookie("authcheck", "true"); + return reply; + } + + reply.type("text/html").send(failureFile); + return reply; +}); */ + +app.register(fastifyStatic, { + root: path.join(__dirname, "dist"), + prefix: "/", + serve: true, + wildcard: false +}); + +app.get("/search=:query", async (req, res) => { + const { query } = req.params as { query: string }; // Define the type for req.params + + const response = await fetch( + `http://api.duckduckgo.com/ac?q=${query}&format=json` + ).then((apiRes) => apiRes.json()); + + res.send(response); +}); + +app.setNotFoundHandler((req, res) => { + res.sendFile("index.html"); // SPA catch-all +}); + +app.listen({ + port: 8080 +});