|
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 =====');
|
|
|
|
|
|
const app = express();
|
|
|
|
|
|
app.use(express.static(path.join(__dirname, '../public')));
|
|
|
|
|
|
app.get('/health', (req, res) => {
|
|
res.status(200).json({ status: 'OK', timestamp: new Date().toISOString() });
|
|
});
|
|
|
|
|
|
const server = http.createServer(app);
|
|
|
|
|
|
const wss = new WebSocket.Server({ server });
|
|
|
|
wss.on('connection', (ws) => {
|
|
console.log('New WebSocket client connected');
|
|
|
|
try {
|
|
|
|
const shell = pty.spawn('bash', [], {
|
|
name: 'xterm-color',
|
|
env: process.env,
|
|
});
|
|
|
|
|
|
shell.onData((data) => {
|
|
ws.send(data);
|
|
});
|
|
|
|
|
|
ws.on('message', (message) => {
|
|
shell.write(message.toString());
|
|
});
|
|
|
|
|
|
shell.onExit(({ exitCode }) => {
|
|
console.log(`Shell exited with code ${exitCode}`);
|
|
ws.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);
|
|
});
|
|
|
|
|
|
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);
|
|
});
|
|
|
|
|
|
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);
|
|
}; |