- Клиентская часть Vue 3 + Vite - Серверная часть Node.js + WebSocket - Система авторизации и смен - Управление игровыми портами - Поддержка тем (светлая/темная) - Адаптивный дизайн 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
92 lines
3.0 KiB
JavaScript
92 lines
3.0 KiB
JavaScript
"use strict";
|
|
|
|
|
|
const url = require('url');
|
|
const fs = require('fs');
|
|
|
|
|
|
global.apiSubscrubers = {};
|
|
|
|
|
|
exports.go = (req, res, postData)=> {
|
|
const urlParsed = url.parse(req.url, true);
|
|
urlParsed.pathname = urlParsed.pathname.replaceAll("..", "");
|
|
//let upath = urlParsed.pathname; //let uquery = urlParsed.query;
|
|
|
|
try {
|
|
//console.log("API=", urlParsed.pathname.substring(1, 4));
|
|
if (urlParsed.pathname.substring(1, 4)=="api") {
|
|
|
|
res.setHeader('Content-Type', 'application/json');
|
|
if (fs.existsSync("."+urlParsed.pathname+".js")) { // если запрос к api
|
|
let dapi = require("."+urlParsed.pathname+".js");
|
|
if (typeof postData === 'string' && postData.length>5) postData=JSON.parse(postData);
|
|
try {
|
|
dapi.go(req, res, postData, urlParsed);
|
|
} catch (err) {
|
|
res.end('{"err":"'+JSON.stringify(err)+'", "errcode":3}'); //console.log("ОШИБКА API "+JSON.stringify(err));
|
|
}
|
|
} else {
|
|
res.end('{"err":"api не существует", "errcode":4}'); //console.log("ОШИБКА API - не существует ");
|
|
}
|
|
} else {
|
|
if (urlParsed.pathname=="/") urlParsed.pathname="/index.html";
|
|
// application/javascript
|
|
|
|
let path="./www"+urlParsed.pathname;
|
|
|
|
for (let i = path.length-1; i>0 ; i--) {
|
|
|
|
if (path[i]==".") {
|
|
// console.log(path.substring(i+1, path.length));
|
|
switch(path.substring(i+1, path.length)) {
|
|
case 'html': res.setHeader('Content-Type', 'text/html'); break;
|
|
case 'webmanifest': res.setHeader('Content-Type', 'application/json'); break;
|
|
case 'js': res.setHeader('Content-Type', 'application/javascript'); break;
|
|
case 'css': res.setHeader('Content-Type', 'text/css'); break;
|
|
case 'png': res.setHeader('Content-Type', 'image/png'); break;
|
|
case 'jpg': res.setHeader('Content-Type', 'image/jpg'); break;
|
|
case 'ico': res.setHeader('Content-Type', 'image/ico'); break;
|
|
case 'gif': res.setHeader('Content-Type', 'image/gif'); break;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
// console.log("path",path);
|
|
if (fs.existsSync(path)) {
|
|
fs.createReadStream(path).pipe(res);
|
|
return;
|
|
} else {
|
|
|
|
}
|
|
|
|
}
|
|
} catch (error) {
|
|
res.end('{"error"='+JSON.stringify(error) +'}');
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
global.genHash=(col,str='qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM0123456789')=> {
|
|
let ret='';
|
|
for (let i=0;i<col;i++) {
|
|
ret+=str[Math.floor(Math.random() * str.length)];
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
// API маршруты удалены - используем WebSocket команды:
|
|
// - esp-test для диагностики
|
|
// - force-resume для принудительного снятия паузы
|
|
// - force-start для запуска игр без ESP
|
|
|