mirror of
https://github.com/BigBodyCobain/Shadowbroker.git
synced 2026-04-23 11:06:07 +02:00
668ce16dc7
Gate messages now propagate via the Infonet hashchain as encrypted blobs — every node syncs them through normal chain sync while only Gate members with MLS keys can decrypt. Added mesh reputation system, peer push workers, voluntary Wormhole opt-in for node participation, fork recovery, killwormhole scripts, obfuscated terminology, and hardened the self-updater to protect encryption keys and chain state during updates. New features: Shodan search, train tracking, Sentinel Hub imagery, 8 new intelligence layers, CCTV expansion to 11,000+ cameras across 6 countries, Mesh Terminal CLI, prediction markets, desktop-shell scaffold, and comprehensive mesh test suite (215 frontend + backend tests passing). Community contributors: @wa1id, @AlborzNazari, @adust09, @Xpirix, @imqdcr, @csysp, @suranyami, @chr0n1x, @johan-martensson, @singularfailure, @smithbh, @OrfeoTerkuci, @deuza, @tm-const, @Elhard1, @ttulttul
62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
const { spawn } = require("child_process");
|
|
const path = require("path");
|
|
|
|
const frontendDir = path.resolve(__dirname, "..");
|
|
const backendLauncher = path.resolve(frontendDir, "..", "start-backend.js");
|
|
const nextBin = require.resolve("next/dist/bin/next");
|
|
|
|
/** @type {import("child_process").ChildProcess[]} */
|
|
const children = [];
|
|
|
|
function start(label, file, args, cwd) {
|
|
const child = spawn(file, args, {
|
|
cwd,
|
|
env: process.env,
|
|
stdio: "inherit",
|
|
windowsHide: false,
|
|
});
|
|
|
|
child.on("error", (error) => {
|
|
console.error(`[${label}] failed to start:`, error);
|
|
shutdown(1);
|
|
});
|
|
|
|
child.on("exit", (code, signal) => {
|
|
if (signal || (code ?? 0) !== 0) {
|
|
console.error(`[${label}] exited with ${signal ?? code}`);
|
|
shutdown(typeof code === "number" ? code : 1);
|
|
return;
|
|
}
|
|
shutdown(0);
|
|
});
|
|
|
|
children.push(child);
|
|
return child;
|
|
}
|
|
|
|
let shuttingDown = false;
|
|
|
|
function shutdown(exitCode) {
|
|
if (shuttingDown) {
|
|
return;
|
|
}
|
|
shuttingDown = true;
|
|
for (const child of children) {
|
|
if (!child.killed) {
|
|
child.kill();
|
|
}
|
|
}
|
|
process.exit(exitCode);
|
|
}
|
|
|
|
process.on("SIGINT", () => shutdown(0));
|
|
process.on("SIGTERM", () => shutdown(0));
|
|
|
|
start(
|
|
"frontend",
|
|
process.execPath,
|
|
[nextBin, "dev", "--hostname", "127.0.0.1", "--port", "3000"],
|
|
frontendDir,
|
|
);
|
|
start("backend", process.execPath, [backendLauncher], frontendDir);
|