File size: 2,542 Bytes
5ac74dc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
const WebSocket = require('ws');
const pty = require('node-pty');
const http = require('http');
const express = require('express');
const path = require('path');
console.log('===== Application Startup =====');
// Initialize Express for serving static files and health check
const app = express();
// Serve static files from the public directory
app.use(express.static(path.join(__dirname, '../public')));
// Health check endpoint
app.get('/health', (req, res) => {
res.status(200).json({ status: 'OK', timestamp: new Date().toISOString() });
});
// Create HTTP server
const server = http.createServer(app);
// Initialize WebSocket server
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
console.log('New WebSocket client connected');
try {
// Spawn a new shell (bash) for the connection
const shell = pty.spawn('bash', [], {
name: 'xterm-color',
env: process.env,
});
// Relay terminal output to the client
shell.onData((data) => {
ws.send(data);
});
// Handle input from the client
ws.on('message', (message) => {
shell.write(message.toString());
});
// Handle terminal exit
shell.onExit(({ exitCode }) => {
console.log(`Shell exited with code ${exitCode}`);
ws.close();
});
// Handle WebSocket close
ws.on('close', () => {
shell.kill();
console.log('WebSocket client disconnected');
});
} catch (error) {
console.error('Error spawning shell:', error.message);
ws.send(`Error: Failed to spawn shell - ${error.message}\r\n`);
ws.close();
}
});
wss.on('error', (error) => {
console.error('WebSocket server error:', error.message);
});
// Start the server on port 7860
const PORT = process.env.PORT || 7860;
server.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log(`Health check available at http://localhost:${PORT}/health`);
});
server.on('error', (error) => {
console.error('HTTP server error:', error.message);
});
// Log Node.js and dependency versions for debugging
console.log(`Node.js version: ${process.version}`);
try {
console.log(`ws version: ${require('ws/package.json').version}`);
console.log(`node-pty version: ${require('node-pty/package.json').version}`);
console.log(`express version: ${require('express/package.json').version}`);
} catch (error) {
console.error('Error loading dependency versions:', error.message);
}; |