mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-06 07:49:52 +03:00
134 lines
3.9 KiB
JavaScript
134 lines
3.9 KiB
JavaScript
// used to simulate
|
|
// - file uploads
|
|
// - EventSource (SSE) for log messages
|
|
import formidable from 'formidable';
|
|
|
|
function pad(number) {
|
|
let r = String(number);
|
|
if (r.length === 1) {
|
|
r = '0' + r;
|
|
}
|
|
return r;
|
|
}
|
|
|
|
// e.g. 2024-03-29 07:02:37.856
|
|
Date.prototype.toISOString = function () {
|
|
return (
|
|
this.getUTCFullYear() +
|
|
'-' +
|
|
pad(this.getUTCMonth() + 1) +
|
|
'-' +
|
|
pad(this.getUTCDate()) +
|
|
' ' +
|
|
pad(this.getUTCHours()) +
|
|
':' +
|
|
pad(this.getUTCMinutes()) +
|
|
':' +
|
|
pad(this.getUTCSeconds()) +
|
|
'.' +
|
|
String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5)
|
|
);
|
|
};
|
|
|
|
export default () => {
|
|
return {
|
|
name: 'vite:mockserver',
|
|
configureServer: async (server) => {
|
|
server.middlewares.use(async (req, res, next) => {
|
|
// catch any file uploads
|
|
if (req.url.startsWith('/rest/uploadFile')) {
|
|
// show progress
|
|
let progress = 0;
|
|
const file_size = req.headers['content-length'];
|
|
console.log('File size: ' + file_size);
|
|
req.on('data', async (chunk) => {
|
|
progress += chunk.length;
|
|
const percentage = (progress / file_size) * 100;
|
|
console.log(`Progress: ${Math.round(percentage)}%`);
|
|
// await new Promise((resolve) => setTimeout(() => resolve(), 3000)); // slow it down
|
|
});
|
|
|
|
const form = formidable({});
|
|
let fields;
|
|
let files;
|
|
try {
|
|
[fields, files] = await form.parse(req);
|
|
} catch (err) {
|
|
console.error('Not json form content');
|
|
res.writeHead(err.httpCode || 400, {
|
|
'Content-Type': 'text/plain'
|
|
});
|
|
res.end(String(err));
|
|
return;
|
|
}
|
|
|
|
// only process when we have a file
|
|
if (Object.keys(files).length > 0) {
|
|
const uploaded_file = files.file[0];
|
|
const file_name = uploaded_file.originalFilename;
|
|
const file_extension = file_name.substring(
|
|
file_name.lastIndexOf('.') + 1
|
|
);
|
|
|
|
console.log('Filename: ' + file_name);
|
|
console.log('Extension: ' + file_extension);
|
|
console.log('File size: ' + file_size);
|
|
|
|
if (file_extension === 'bin' || file_extension === 'json') {
|
|
console.log('File uploaded successfully!');
|
|
} else if (file_extension === 'md5') {
|
|
console.log('MD5 hash generated successfully!');
|
|
res.end(
|
|
JSON.stringify({
|
|
md5: 'ef4304fc4d9025a58dcf25d71c882d2c'
|
|
})
|
|
);
|
|
} else {
|
|
res.statusCode = 406;
|
|
console.log('Invalid file extension!');
|
|
}
|
|
}
|
|
|
|
res.end();
|
|
}
|
|
|
|
// SSE Eventsource
|
|
else if (req.url.startsWith('/es/log')) {
|
|
res.writeHead(200, {
|
|
Connection: 'keep-alive',
|
|
'Cache-Control': 'no-cache',
|
|
'Content-Type': 'text/event-stream'
|
|
});
|
|
|
|
let count = 0;
|
|
const interval = setInterval(() => {
|
|
let message = 'message #' + count;
|
|
if (count % 6 === 1) {
|
|
message +=
|
|
' with a long message that will be wrapped, to see if it stays one a single line';
|
|
}
|
|
const data = {
|
|
t: new Date().toISOString(),
|
|
l: 3 + (count % 6),
|
|
i: count,
|
|
n: 'system',
|
|
m: message
|
|
};
|
|
count++;
|
|
res.write(`data: ${JSON.stringify(data)}\n\n`);
|
|
}, 500);
|
|
|
|
// if client closes connection
|
|
res.on('close', () => {
|
|
console.log('Closing ES connection');
|
|
clearInterval(interval);
|
|
res.end();
|
|
});
|
|
} else {
|
|
next(); // move on to the next middleware function in chain
|
|
}
|
|
});
|
|
}
|
|
};
|
|
};
|