Skip to main content
Glama

autonomous-frontend-browser-tools

bottom-scaffold.js4.82 kB
// Refactor Temp: Bottom Scaffolding — hosts cleanup, shutdown handlers, trailing listeners/exports // This file will temporarily collect post-tool, non-tool-specific code moved from browser-connector.ts. import os from 'os'; import { BrowserConnector } from '../browser-connector.js'; import { getAvailablePort, clearAllLogs } from './top-scaffold.js'; /** * Server startup and initialization logic */ export async function startServer(app, REQUESTED_PORT, currentSettings) { let PORT; console.log(`Starting Browser Tools Server...`); console.log(`Requested port: ${REQUESTED_PORT}`); // Find an available port try { PORT = await getAvailablePort(REQUESTED_PORT); if (PORT !== REQUESTED_PORT) { console.log(`\n====================================`); console.log(`NOTICE: Requested port ${REQUESTED_PORT} was in use.`); console.log(`Using port ${PORT} instead.`); console.log(`====================================\n`); } } catch (portError) { console.error(`Failed to find an available port:`, portError); process.exit(1); } // Create the server with the available port const server = app.listen(PORT, currentSettings.serverHost, () => { console.log(`\n=== Browser Tools Server Started ===`); console.log(`Aggregator listening on http://${currentSettings.serverHost}:${PORT}`); if (PORT !== REQUESTED_PORT) { console.log(`NOTE: Using fallback port ${PORT} instead of requested port ${REQUESTED_PORT}`); } // Log all available network interfaces for easier discovery const networkInterfaces = os.networkInterfaces(); console.log("\nAvailable on the following network addresses:"); Object.keys(networkInterfaces).forEach((interfaceName) => { const interfaces = networkInterfaces[interfaceName]; if (interfaces) { interfaces.forEach((iface) => { if (!iface.internal && iface.family === "IPv4") { console.log(` - http://${iface.address}:${PORT}`); } }); } }); console.log(`\nFor local access use: http://localhost:${PORT}`); }); // Handle server startup errors server.on("error", (err) => { if (err.code === "EADDRINUSE") { console.error(`ERROR: Port ${PORT} is still in use, despite our checks!`); console.error(`This might indicate another process started using this port after our check.`); } else { console.error(`Server error:`, err); } process.exit(1); }); // Initialize the browser connector with the existing app AND server const browserConnector = new BrowserConnector(app, server); return { server, PORT, browserConnector }; } /** * Setup graceful shutdown handlers */ export function setupShutdownHandlers(server, browserConnector) { // Handle shutdown gracefully with improved error handling process.on("SIGINT", async () => { console.log("\nReceived SIGINT signal. Starting graceful shutdown..."); try { // First shutdown WebSocket connections await browserConnector.shutdown(); // Then close the HTTP server await new Promise((resolve, reject) => { server.close((err) => { if (err) { console.error("Error closing HTTP server:", err); reject(err); } else { console.log("HTTP server closed successfully"); resolve(); } }); }); // Clear all logs clearAllLogs(); console.log("Shutdown completed successfully"); process.exit(0); } catch (error) { console.error("Error during shutdown:", error); // Force exit in case of error process.exit(1); } }); // Also handle SIGTERM process.on("SIGTERM", () => { console.log("\nReceived SIGTERM signal"); process.emit("SIGINT"); }); } /** * Main server initialization function */ export async function initializeServer(app, REQUESTED_PORT, currentSettings) { try { const { server, PORT, browserConnector } = await startServer(app, REQUESTED_PORT, currentSettings); setupShutdownHandlers(server, browserConnector); } catch (error) { console.error("Failed to start server:", error); process.exit(1); } } export const bottomScaffold = { startServer, setupShutdownHandlers, initializeServer }; export default bottomScaffold;

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Winds-AI/Frontend-development-MCP-tools-public'

If you have feedback or need assistance with the MCP directory API, please join our Discord server