prasi-api/pkgs/prod.ts

65 lines
1.5 KiB
TypeScript

import { $ } from "execa";
import exitHook from "exit-hook";
import { existsAsync } from "fs-jetpack";
import { dir } from "utils/dir";
import { g } from "utils/global";
g.main = {
old: null,
process: null,
restart: {
timeout: null as any,
},
};
const main = g.main;
exitHook((signal) => {
if (main.process) {
main.process.terminate();
}
console.log(`Exiting with signal: ${signal}`);
});
if (process.env.DATABASE_URL) {
if (
!(await existsAsync(dir("node_modules/.prisma"))) &&
process.env.DATABASE_URL
) {
try {
await Bun.write(
dir("app/db/.env"),
`DATABASE_URL=${process.env.DATABASE_URL}`
);
await $({ cwd: dir(`app/db`) })`bun install`;
await $({ cwd: dir(`app/db`) })`bun prisma db pull --force`;
await $({ cwd: dir(`app/db`) })`bun prisma generate`;
} catch (e) {
console.error(e);
}
}
}
const startMain = () => {
let mode = "started";
const worker = new Worker("pkgs/index.ts");
worker.onmessage = (event) => {
if (event.data === "restart") {
main.old = main.process;
setTimeout(() => {
if (main.old) {
main.old.terminate();
}
}, 1000);
main.process = startMain();
}
};
worker.addEventListener("close", (event) => {
console.log("Main worker being closed, thread-id: " + worker.threadId);
});
console.log(`Main worker`, mode, "thread-id:", worker.threadId);
return worker;
};
main.process = startMain();
setTimeout(() => new Promise(() => 0), 0);