From 26f6a37e807568d89dd8e380f4acb8ccf9a2f125 Mon Sep 17 00:00:00 2001 From: Sammwy Date: Sun, 26 Jan 2025 18:45:22 -0300 Subject: [PATCH] =?UTF-8?q?feature:=20=F0=9F=8E=82=20production=20mode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gruntfile.cjs | 49 +++++++++++++++++++++++++++++++++ bun.lockb | Bin 176583 -> 220715 bytes package.json | 26 +++++++++++++----- server/index.ts | 64 +++++++++++++++++++++++++------------------ tsconfig.server.json | 29 ++++++++++++++++++++ vite.config.ts | 8 ++++-- 6 files changed, 141 insertions(+), 35 deletions(-) create mode 100644 Gruntfile.cjs create mode 100644 tsconfig.server.json diff --git a/Gruntfile.cjs b/Gruntfile.cjs new file mode 100644 index 0000000..9bf80c4 --- /dev/null +++ b/Gruntfile.cjs @@ -0,0 +1,49 @@ +module.exports = function (grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON("package.json"), + + // Build from source. + shell: { + clean: { + command: "rimraf dist", + }, + + buildClient: { + command: "vite build", + }, + buildServer: { + command: + "tsc --project tsconfig.server.json && tsc-alias -p tsconfig.server.json", + }, + }, + + // Copy worker files (Backend attack methods) + copy: { + static: { + expand: true, + cwd: "server/workers/", + src: "*", + dest: "dist/workers/", + }, + }, + + // Run concurrent tasks + concurrent: { + build: ["shell:buildClient", "shell:buildServer"], + }, + }); + + grunt.loadNpmTasks("grunt-contrib-copy"); + grunt.loadNpmTasks("grunt-shell"); + grunt.loadNpmTasks("grunt-concurrent"); + + // Run our tasks + grunt.registerTask("build", [ + "shell:clean", + "concurrent:build", + "copy:static", + ]); + + grunt.registerTask("build_server", ["shell:buildServer"]); + grunt.registerTask("build_client", ["shell:buildClient"]); +}; diff --git a/bun.lockb b/bun.lockb index 228d6ecb745380beb2f3d3ef6f8098017ca5cf9e..381a6430f8a7c7cc82735f05c6454d18767adfcf 100644 GIT binary patch delta 59682 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 Q-^w(*U5Yj>WmPQyAGN>m(EtDd delta 33768 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 Pe4 { console.log("Client connected"); @@ -109,47 +112,56 @@ io.on("connection", (socket) => { }); app.get("/configuration", (req, res) => { - res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173") + res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173"); res.setHeader("Content-Type", "application/json"); - let proxiesText = readFileSync(join(currentPath(), "data", "proxies.txt"), "utf-8"); - let uasText = readFileSync(join(currentPath(), "data", "uas.txt"), "utf-8"); + + const proxiesText = readFileSync( + join(currentPath(), "data", "proxies.txt"), + "utf-8" + ); + const uasText = readFileSync(join(currentPath(), "data", "uas.txt"), "utf-8"); res.send({ proxies: btoa(proxiesText), uas: btoa(uasText), - }) -}) + }); +}); -app.options('/configuration', (req, res) => { - res.setHeader('Access-Control-Allow-Origin', 'http://localhost:5173'); - res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); +app.options("/configuration", (req, res) => { + res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173"); + res.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); res.send(); }); - app.post("/configuration", bodyParser.json(), (req, res) => { res.setHeader("Access-Control-Allow-Methods", "POST"); - res.setHeader("Access-Control-Allow-Headers", "Content-Type") - res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173") + res.setHeader("Access-Control-Allow-Headers", "Content-Type"); + res.setHeader("Access-Control-Allow-Origin", "http://localhost:5173"); res.setHeader("Content-Type", "application/text"); // console.log(req.body) // atob and btoa are used to avoid the problems in sending data with // characters, etc. - let proxies = atob(req.body["proxies"]); - let uas = atob(req.body["uas"]); + const proxies = atob(req.body["proxies"]); + const uas = atob(req.body["uas"]); writeFileSync(join(currentPath(), "data", "proxies.txt"), proxies, { - encoding: "utf-8" + encoding: "utf-8", }); writeFileSync(join(currentPath(), "data", "uas.txt"), uas, { - encoding: "utf-8" + encoding: "utf-8", }); - res.send("OK") -}) - -const PORT = 3000; -httpServer.listen(PORT, () => { - console.log(`Server running on port ${PORT}`); + res.send("OK"); +}); + +const PORT = parseInt(process.env.PORT || "3000"); +httpServer.listen(PORT, () => { + if (__prod) { + console.log( + `(Production Mode) Client and server is running under http://localhost:${PORT}` + ); + } else { + console.log(`Server is running under development port ${PORT}`); + } }); diff --git a/tsconfig.server.json b/tsconfig.server.json new file mode 100644 index 0000000..e5e6231 --- /dev/null +++ b/tsconfig.server.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "*": ["*"] + }, + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "outDir": "dist", + "rootDir": "server", + "allowSyntheticDefaultImports": true, + "noImplicitAny": false + }, + "include": ["server/**/*.ts"], + "exclude": ["node_modules"], + "tsc-alias": { + "verbose": false, + "resolveFullPaths": true, + "fileExtensions": { + "inputGlob": "{js,jsx,mjs}", + "outputCheck": ["js", "json", "jsx", "mjs"] + } + } +} diff --git a/vite.config.ts b/vite.config.ts index 0d707ee..6bad039 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,6 @@ -import react from '@vitejs/plugin-react'; -import { defineConfig } from 'vite'; +import react from "@vitejs/plugin-react"; +import path from "path"; +import { defineConfig } from "vite"; // https://vitejs.dev/config/ export default defineConfig({ @@ -7,4 +8,7 @@ export default defineConfig({ optimizeDeps: { exclude: [], }, + build: { + outDir: path.resolve(__dirname, "dist/public"), + }, });