diff --git a/src/index.ts b/src/index.ts index e3eff7c..246cebf 100755 --- a/src/index.ts +++ b/src/index.ts @@ -103,6 +103,14 @@ export class Jetpath { & Record; } async listen(): Promise { + this.server = server(this.plugs, this.options); + if (this.server.isPrimary) { + this.server.listen(this.options.port); + this.listening = true; + this._nativeServer = this.server; + return; + } + // ? {-view-} here is replaced at build time to html const UI = await readFile(html_path, { encoding: "utf-8", @@ -188,9 +196,7 @@ export class Jetpath { // assignMiddleware(_JetPath_paths, _jet_middleware); - // ? start server - // ? check if server is already listening - this.server = server(this.plugs, this.options); + // ? add plugins to the server if ( this.server.edge && diff --git a/src/primitives/functions.ts b/src/primitives/functions.ts index 69f80ec..9decc35 100755 --- a/src/primitives/functions.ts +++ b/src/primitives/functions.ts @@ -73,7 +73,13 @@ export const _jet_middleware: Record< export const server = ( plugs: JetPlugin[], options: jetOptions, -): { listen: any; edge: boolean } => { +): { + listen: any; + edge: boolean; + isPrimary?: boolean; + stop?: () => void; + close?: (cb?: () => void) => void; +} => { let server; let server_else; const runtimeConfig = options.runtimes; @@ -144,6 +150,40 @@ export const server = ( }; } if (runtime["bun"]) { + const clusterConfig = runtimeConfig?.bun?.cluster; + if (clusterConfig) { + const cluster = require("node:cluster"); + const os = require("node:os"); + + if (cluster.isPrimary) { + const numWorkers = typeof clusterConfig === "number" + ? clusterConfig + : os.cpus().length; + + server = { + listen(port: number) { + LOG.log(`Primary ${process.pid} is starting ${numWorkers} workers`, "info"); + for (let i = 0; i < numWorkers; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker: any) => { + LOG.log(`worker ${worker.process.pid} died, restarting...`, "warn"); + cluster.fork(); + }); + }, + stop() { + for (const id in cluster.workers) { + cluster.workers[id].kill(); + } + }, + edge: false, + isPrimary: true, + }; + return server; + } + } + if (options.upgrade && options.upgrade === true) { server = { listen(port: number) { diff --git a/src/primitives/types.ts b/src/primitives/types.ts index 9fc830b..994543a 100755 --- a/src/primitives/types.ts +++ b/src/primitives/types.ts @@ -197,6 +197,7 @@ export type jetOptions = { runtimes?: { bun?: { reusePort?: boolean; + cluster?: boolean | number; }; deno?: {}; node?: {};