4bnode
Version:
4bnode is a CLI-powered backend development platform with a built-in visual dashboard to generate, manage, and test Node.js/Express APIs faster.
88 lines (72 loc) • 1.91 kB
JavaScript
import { input } from "@inquirer/prompts";
import {
addImport,
insertBeforeRoutes,
replaceAppListen,
} from "./lib/indexFile.js";
import {
showHeader,
showTaskDone,
showError,
showFileAction,
installDeps,
} from "./lib/ui.js";
async function main() {
showHeader("add-socket", "Add Socket.IO real-time support");
const ipAddresses = await input({
message: "CORS origins (comma-separated, or * for all):",
default: "*",
});
console.log();
let corsOrigins;
if (ipAddresses.trim() === "*") {
corsOrigins = '["*"]';
} else {
const ipArray = ipAddresses.split(",").map((ip) => ip.trim());
corsOrigins = `[${ipArray.map((ip) => `"http://${ip}"`).join(", ")}]`;
}
addImport('import { Server } from "socket.io";');
addImport('import http from "http";');
showFileAction("updated", "index.js");
const socketSetup = `
const server = http.createServer(app);
const io = new Server(server, {
cors: {
origin: ${corsOrigins},
methods: ["GET", "POST"]
}
});
io.on("connection", (socket) => {
console.log("A user connected");
socket.on("disconnect", () => {
console.log("User disconnected");
});
});
app.use((req, res, next) => {
req.io = io;
next();
});`;
insertBeforeRoutes(socketSetup);
replaceAppListen(`
server.listen(port, () => {
const localIp = getLocalNetworkIp();
console.log(\`App is running on http://localhost:\${port}\`);
if (localIp) {
console.log(
\`App is also accessible on your local network at http://\${localIp}:\${port}\`
);
}
});`);
await installDeps("socket.io");
showTaskDone("Socket.IO integration complete", [
`CORS: ${ipAddresses.trim()}`,
"Access via req.io in routes",
"Events: connection, disconnect",
]);
}
main().catch((err) => {
if (err.name === "ExitPromptError") process.exit(0);
showError(err.message);
process.exit(1);
});