// @ts-check import { WebSocketServer } from 'ws'; import { readFileSync, mkdirSync, writeFileSync } from "fs"; const PORT = 8080 const wss = new WebSocketServer({ port: PORT }); console.log(`WebSocket server running on ws://localhost:${PORT}`); wss.on('connection', (ws) => { console.log('New client connected'); ws.on('message', (message) => { const { name, ...payload } = JSON.parse(message.toString('utf-8')); console.log(name, payload) switch (name) { case 'download_q': { const { q } = payload; try { mkdirSync(`docs/${q}`); } catch (e) {} let outMd = ""; const re = /^(?\d{1,2}):(?\d{2})\s*$/; for (const line of readFileSync(`docs/${q}.md`, "utf-8").trimEnd().split("\n")) { const m = re.exec(line); if (m?.groups) { const { min, sec } = m.groups; const t = parseInt(min) * 60 + parseInt(sec); ws.send(JSON.stringify({ name: "seek_q", t })); outMd += `\n[${line}](./${q}/${t}.png)\n\n`; } else { outMd += `${line}\n`; } } writeFileSync(`docs/${q}.md`, outMd); } break; case 'timed_q' : { const { q, t, data } = payload; writeFileSync( `docs/${q}/${t}.png`, data.replace(/^data:image\/png;base64,/, ""), "base64", ); } break; } }); ws.on('close', () => { console.log('Client disconnected'); }); });