Skip to content

Commit c504de5

Browse files
committed
Add /api/events endpoint and host-triggered reset
1 parent 0d272e6 commit c504de5

1 file changed

Lines changed: 21 additions & 39 deletions

File tree

server.js

Lines changed: 21 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -228,46 +228,27 @@ const server = http.createServer(async (req, res) => {
228228
}
229229
}
230230

231-
// POST /api/reset - proxy to demo-admin reset endpoint
231+
// POST /api/reset - trigger full demo reset via host-side reset server
232232
if (pathName === '/api/reset' && method === 'POST') {
233-
const adminHost = process.env.ADMIN_HOST || 'demo-admin';
234-
const adminPort = process.env.ADMIN_PORT || '8080';
235-
return new Promise((resolve) => {
236-
let responded = false;
237-
const proxyReq = http.request({
238-
hostname: adminHost,
239-
port: parseInt(adminPort),
240-
path: '/api/reset',
241-
method: 'POST',
242-
headers: { 'Content-Type': 'application/json' },
243-
timeout: 30000,
244-
}, (proxyRes) => {
245-
let body = '';
246-
proxyRes.on('data', chunk => { body += chunk; });
247-
proxyRes.on('end', () => {
248-
if (responded) return;
249-
responded = true;
250-
events = [];
251-
res.writeHead(proxyRes.statusCode, { 'Content-Type': 'application/json' });
252-
res.end(body);
253-
resolve();
233+
const resetServerUrl = process.env.RESET_SERVER_URL || 'http://host.docker.internal:8765/reset';
234+
try {
235+
await new Promise((resolve, reject) => {
236+
const resetReq = http.request(resetServerUrl, { method: 'POST' }, (resetRes) => {
237+
resetRes.resume();
238+
if (resetRes.statusCode === 200) resolve();
239+
else reject(new Error(`reset server returned ${resetRes.statusCode}`));
254240
});
241+
resetReq.on('error', reject);
242+
resetReq.setTimeout(180000, () => { resetReq.destroy(); reject(new Error('reset timed out')); });
243+
resetReq.end();
255244
});
256-
proxyReq.on('error', (err) => {
257-
if (responded) return;
258-
responded = true;
259-
sendJson(res, 502, { error: 'Failed to reach demo-admin: ' + err.message });
260-
resolve();
261-
});
262-
proxyReq.on('timeout', () => {
263-
proxyReq.destroy();
264-
if (responded) return;
265-
responded = true;
266-
sendJson(res, 504, { error: 'demo-admin request timed out' });
267-
resolve();
268-
});
269-
proxyReq.end();
270-
});
245+
} catch (err) {
246+
return sendJson(res, 502, { error: `reset failed: ${err.message}` });
247+
}
248+
events = [];
249+
const resetEvent = { source: 'dashboard', event_type: 'demo.reset', timestamp: new Date().toISOString(), attributes: {}, received_at: new Date().toISOString() };
250+
broadcastEvent(resetEvent);
251+
return sendJson(res, 200, {});
271252
}
272253

273254
// Serve static files for everything else
@@ -283,8 +264,9 @@ const wss = new WebSocketServer({ server, path: '/ws' });
283264
wss.on('connection', (ws) => {
284265
wsClients.add(ws);
285266

286-
// Send event history on connect
287-
ws.send(JSON.stringify({ type: 'history', events }));
267+
// Send event history on connect, sorted chronologically
268+
const sortedEvents = [...events].sort((a, b) => (a.timestamp < b.timestamp ? -1 : a.timestamp > b.timestamp ? 1 : 0));
269+
ws.send(JSON.stringify({ type: 'history', events: sortedEvents }));
288270

289271
ws.on('close', () => {
290272
wsClients.delete(ws);

0 commit comments

Comments
 (0)