// @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'); let filename = '' ws.on('message', (message, isBinary) => { if (message instanceof Buffer && isBinary) { writeFileSync(filename, message); return; } const { name, ...payload } = JSON.parse(message.toString('utf-8')); switch (name) { case 'download_q': { const { q } = payload; console.log(`Start ${q}`) try { mkdirSync(`docs/${q}`); } catch (e) {} let outMd = ""; const re = /^(?\d{1,2}):(?\d{2})\s*$/; const ts = []; 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 = `${min}_${sec}`; ts.push(t); outMd += `\n![${line}](./${q}/${t}.png)\n\n`; } else { outMd += `${line}\n`; } } writeFileSync(`docs/${q}.md`, outMd); ws.send(JSON.stringify({ name: "seek_q_ts", q, ts })); } break; case 'timed_q' : { const { q, t } = payload; filename = t ? `docs/${q}/${t}.png` : ''; } break; case 'done' : { const { q } = payload console.log(`Done ${q}`) } break; } }); ws.on('close', () => { console.log('Client disconnected'); }); });