96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
		
			Executable File
		
	
	
	
	
// @ts-check
 | 
						|
 | 
						|
import http from "http";
 | 
						|
import path from "path";
 | 
						|
import childProcess, { ChildProcess } from "child_process";
 | 
						|
const { spawn, spawnSync, execSync } = childProcess;
 | 
						|
 | 
						|
require("dotenv").config({
 | 
						|
    path: path.resolve(__dirname, "../.env"),
 | 
						|
});
 | 
						|
 | 
						|
const environment = process.env.NODE_ENVIRONMENT;
 | 
						|
 | 
						|
const workingDirectory = path.resolve(__dirname, "../");
 | 
						|
 | 
						|
// process.stdin.addListener("data", (message) => {
 | 
						|
//     console.log("MEssage received =>", message);
 | 
						|
// });
 | 
						|
 | 
						|
process.on("message", (message) => {
 | 
						|
    console.log("Message received =>", message);
 | 
						|
    if (message == "exit") {
 | 
						|
        process.exit();
 | 
						|
    }
 | 
						|
});
 | 
						|
 | 
						|
const args = environment?.match(/prod/i) ? ["start"] : ["run", "dev"];
 | 
						|
 | 
						|
let child: ChildProcess = spawn("bun", args, {
 | 
						|
    cwd: workingDirectory,
 | 
						|
    stdio: "inherit",
 | 
						|
    shell: environment?.match(/prod/i) ? undefined : "bash.exe",
 | 
						|
});
 | 
						|
 | 
						|
const PORT = process.env.DSQL_DEPLOY_SERVER_PORT || 1276;
 | 
						|
 | 
						|
// deepcode ignore NoRateLimitingForExpensiveWebOperation: <Web Server is only accessible locally>, deepcode ignore HttpToHttps: <Server is not exposed to the web>
 | 
						|
http.createServer((req, res) => {
 | 
						|
    if (req.url == "/" + process.env.DEPLOY_ROUTE) {
 | 
						|
        async function redeploy() {
 | 
						|
            /** @type {import("child_process").SpawnSyncOptionsWithBufferEncoding} */
 | 
						|
            const options: import("child_process").SpawnSyncOptionsWithBufferEncoding =
 | 
						|
                {
 | 
						|
                    cwd: workingDirectory,
 | 
						|
                    stdio: "inherit",
 | 
						|
                };
 | 
						|
 | 
						|
            if (process.platform?.match(/win/i)) {
 | 
						|
                options.shell = "bash.exe";
 | 
						|
            }
 | 
						|
 | 
						|
            if (environment?.match(/prod/i)) {
 | 
						|
                spawnSync("git", ["checkout", "."], options);
 | 
						|
                spawnSync("git", ["pull"], options);
 | 
						|
                spawnSync("bun", ["install"], options);
 | 
						|
                spawnSync("bun", ["run", "build"], options);
 | 
						|
 | 
						|
                try {
 | 
						|
                    child.kill();
 | 
						|
                    const existingProcessId = execSync(
 | 
						|
                        `lsof -i :2763 | grep LISTEN | awk '{print $2}'`
 | 
						|
                    );
 | 
						|
                    console.log(
 | 
						|
                        "Existing Process Id GREPED",
 | 
						|
                        existingProcessId.toString()
 | 
						|
                    );
 | 
						|
                    execSync(`kill ${existingProcessId.toString()}`);
 | 
						|
                    // spawnSync("kill", [existingProcessId.toString()], options);
 | 
						|
                    // spawnSync("kill", [`${child.pid}`], options);
 | 
						|
                } catch (/** @type {any} */ error: any) {
 | 
						|
                    console.log("Error killing child process", error.message);
 | 
						|
                }
 | 
						|
 | 
						|
                child = spawn("bun", args, {
 | 
						|
                    cwd: workingDirectory,
 | 
						|
                    stdio: "inherit",
 | 
						|
                    shell: environment?.match(/prod/i) ? undefined : "bash.exe",
 | 
						|
                });
 | 
						|
            } else {
 | 
						|
                spawnSync("git", ["status"], options);
 | 
						|
                spawnSync("bun", ["list", "next"], options);
 | 
						|
 | 
						|
                console.log("Not in production, Continuing ...");
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        redeploy();
 | 
						|
 | 
						|
        res.statusCode = 200;
 | 
						|
        res.end("Deployed");
 | 
						|
    } else {
 | 
						|
        res.statusCode = 402;
 | 
						|
        res.end("Unauthorized");
 | 
						|
    }
 | 
						|
}).listen(PORT, () => console.log("Deployment Server Started on Port", PORT));
 |