Monorepo for Aesthetic.Computer
aesthetic.computer
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});