Monorepo for Aesthetic.Computer aesthetic.computer
at main 66 lines 1.7 kB view raw
1#!/usr/bin/env node 2// Build Stream Server - WebSocket server for streaming build progress 3import { WebSocketServer } from 'ws'; 4import http from 'http'; 5import express from 'express'; 6 7const PORT = 8890; 8const app = express(); 9app.use(express.text()); 10 11const clients = new Set(); 12 13// HTTP endpoint to receive log lines 14app.post('/log', (req, res) => { 15 const line = req.body; 16 broadcast({ type: 'log', line, timestamp: Date.now() }); 17 res.status(200).send('OK'); 18}); 19 20// HTTP endpoint to send build status updates 21app.post('/status', express.json(), (req, res) => { 22 broadcast({ type: 'status', ...req.body, timestamp: Date.now() }); 23 res.status(200).send('OK'); 24}); 25 26// Create HTTP + WebSocket server 27const server = http.createServer(app); 28const wss = new WebSocketServer({ server, path: '/stream' }); 29 30wss.on('connection', (ws) => { 31 console.log('📡 Client connected'); 32 clients.add(ws); 33 34 // Send welcome message 35 ws.send(JSON.stringify({ 36 type: 'connected', 37 message: 'Build stream connected', 38 timestamp: Date.now() 39 })); 40 41 ws.on('close', () => { 42 console.log('📡 Client disconnected'); 43 clients.delete(ws); 44 }); 45 46 ws.on('error', (err) => { 47 console.error('WebSocket error:', err); 48 clients.delete(ws); 49 }); 50}); 51 52function broadcast(data) { 53 const message = JSON.stringify(data); 54 clients.forEach(client => { 55 if (client.readyState === 1) { // OPEN 56 client.send(message); 57 } 58 }); 59} 60 61server.listen(PORT, () => { 62 console.log(`🔥 Build stream server running on http://localhost:${PORT}`); 63 console.log(` POST /log - Send log lines`); 64 console.log(` POST /status - Send status updates`); 65 console.log(` WebSocket: ws://localhost:${PORT}/stream`); 66});