diff --git a/classes/search/search-manager.ts b/classes/search/search-manager.ts index 23dd85a1..a7e17a3e 100644 --- a/classes/search/search-manager.ts +++ b/classes/search/search-manager.ts @@ -27,6 +27,7 @@ export enum SonicIndexType { export class SonicSearchManager { private searchChannel: SonicChannelSearch; private ingestChannel: SonicChannelIngest; + private connected = false; private logger = getLogger("sonic"); /** @@ -55,6 +56,10 @@ export class SonicSearchManager { return; } + if (this.connected) { + return; + } + !silent && this.logger.info`Connecting to Sonic...`; // Connect to Sonic @@ -110,6 +115,7 @@ export class SonicSearchManager { this.searchChannel.ping(), this.ingestChannel.ping(), ]); + this.connected = true; !silent && this.logger.info`Connected to Sonic`; } catch (error) { this.logger.fatal`Error while connecting to Sonic: ${error}`; diff --git a/cli/commands/start.ts b/cli/commands/start.ts index 0f6124ae..f16830e5 100644 --- a/cli/commands/start.ts +++ b/cli/commands/start.ts @@ -35,17 +35,12 @@ export default class Start extends BaseCommand { const numCpus = flags["all-threads"] ? os.cpus().length : flags.threads; - // Check if index is a JS or TS file (depending on the environment) - const index = (await Bun.file("index.ts").exists()) - ? "index.ts" - : "index.js"; + // Resolves the path to the main module + const resolved = import.meta.resolve("../../index"); - await import("../../setup"); + process.env.NUM_CPUS = String(numCpus); + process.env.SILENT = flags.silent ? "true" : "false"; - for (let i = 0; i < numCpus; i++) { - new Worker(index, { - type: "module", - }); - } + await import(resolved); } } diff --git a/index.ts b/index.ts index 8f66fa52..aa699bb5 100644 --- a/index.ts +++ b/index.ts @@ -1,16 +1,15 @@ -import { configureLoggers } from "@/loggers"; +import cluster from "node:cluster"; import { sentry } from "@/sentry"; import { createServer } from "@/server"; import { appFactory } from "~/app"; import { config } from "~/packages/config-manager/index"; -import { setupDatabase } from "./drizzle/db"; -if (import.meta.main) { +if (cluster.isPrimary) { + for (let i = 0; i < (Number(process.env.NUM_CPUS) ?? 1); i++) { + cluster.fork(); + } await import("./setup"); sentry?.captureMessage("Server started", "info"); +} else { + createServer(config, await appFactory()); } - -await setupDatabase(); -await configureLoggers(); - -createServer(config, await appFactory());