Files
vue-pult/server/api.js
sasha 3e90269b0b Initial commit: Vue.js тир управления система
- Клиентская часть Vue 3 + Vite
- Серверная часть Node.js + WebSocket
- Система авторизации и смен
- Управление игровыми портами
- Поддержка тем (светлая/темная)
- Адаптивный дизайн

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 12:24:22 +03:00

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