70 lines
1.7 KiB
JavaScript
70 lines
1.7 KiB
JavaScript
// @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 = /^(?<min>\d{1,2}):(?<sec>\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\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');
|
|
});
|
|
});
|