import 'dotenv/config'; import express from 'express'; import cookieParser from 'cookie-parser'; import http from 'http'; import { WebSocketServer } from 'ws'; import tunnelsRouter from './routes/tunnels'; import proxyRouter from './routes/proxy'; import { handleAgentUpgrade } from './routes/agent'; const app = express(); app.set( 'trust proxy', 1 ); app.use( cookieParser() ); // Apply JSON parsing only to API routes — proxy routes need raw body streams app.use( '/api/tunnels', express.json(), tunnelsRouter ); app.use( '/t', proxyRouter ); const server = http.createServer( app ); const wss = new WebSocketServer( { noServer: true } ); server.on( 'upgrade', ( req, socket, head ) => { if ( req.url?.startsWith( '/api/agent/' ) ) { wss.handleUpgrade( req, socket, head, ws => handleAgentUpgrade( req, ws ) ); } else { socket.destroy(); } } ); const PORT = process.env.PORT ? Number( process.env.PORT ) : 3002; server.listen( PORT, () => console.log( `rokojori-tunnel running on http://localhost:${ PORT }` ) );