const express = require('express'); const path = require('path'); const fs = require('fs'); const { exec } = require('child_process'); const LargeFileHandler = require('./src/largeFile'); const xmlJsonHandler = require('./src/xmlJson'); const performanceMonitor = require('./src/performance'); const CoreApiDemo = require('./src/coreApiDemo'); const app = express(); const PORT = 7860; const DATA_DIR = path.join(__dirname, 'data'); // Ensure data directory exists if (!fs.existsSync(DATA_DIR)) { fs.mkdirSync(DATA_DIR); } const LARGE_FILE_PATH = path.join(DATA_DIR, 'large_data.csv'); const XML_FILE_PATH = path.join(DATA_DIR, 'data.xml'); const LARGE_JSON_PATH = path.join(DATA_DIR, 'large_data.json'); // Global lock to prevent concurrent demos global.isDemoRunning = false; // Feature 1: Large File Stream async function runLargeFileDemo() { console.log('=== 1. 大文件流式处理演示 ==='); try { const largeFileHandler = new LargeFileHandler(LARGE_FILE_PATH); const lineCount = 100000; console.log(`正在生成测试数据 (${lineCount} 行)...`); await largeFileHandler.generateTestFile(lineCount); console.log('开始流式处理...'); await largeFileHandler.processFileStream(); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 2: XML Processing async function runXmlDemo() { console.log('=== 2. XML 处理演示 ==='); try { const xmlContent = xmlJsonHandler.generateXml(1000); fs.writeFileSync(XML_FILE_PATH, xmlContent); console.log(`XML 文件已保存: ${XML_FILE_PATH}`); const parsedXml = xmlJsonHandler.parseXml(xmlContent); console.log('XML 解析完成'); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 3: JSON Stream async function runJsonDemo() { console.log('=== 3. JSON 大文件流式处理演示 ==='); try { console.log('正在生成 JSON 数据...'); await xmlJsonHandler.generateLargeJson(LARGE_JSON_PATH, 10000); console.log('开始流式解析 JSON...'); await xmlJsonHandler.processLargeJsonStream(LARGE_JSON_PATH); logMemoryUsage(); } catch (err) { console.error('发生错误:', err); } } // Feature 4: Core APIs Demo async function runCoreApiDemo() { const coreDemo = new CoreApiDemo(DATA_DIR); await coreDemo.run(); } function logMemoryUsage() { const used = process.memoryUsage(); console.log('Memory Usage:'); for (let key in used) { console.log(`${key}: ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`); } } // Serve the main page app.get('/', (req, res) => { res.send(` Node.js Performance Demo

Node.js Performance Demo

点击上方按钮开始测试...
`); }); // SSE Endpoint for running the demo app.get('/api/run-demo', async (req, res) => { const type = req.query.type; if (global.isDemoRunning) { res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); res.write(`data: ${JSON.stringify({ type: 'error', message: 'Demo is already running. Please wait.' })}\n\n`); res.write(`data: ${JSON.stringify({ type: 'end' })}\n\n`); return res.end(); } res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }); global.isDemoRunning = true; // Helper to send SSE messages const send = (type, message) => { res.write(`data: ${JSON.stringify({ type, message })}\n\n`); }; // Override console methods const originalConsoleLog = console.log; const originalConsoleError = console.error; console.log = (...args) => { const msg = args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg))).join(' '); send('log', msg); originalConsoleLog.apply(console, args); }; console.error = (...args) => { const msg = args.map(arg => (typeof arg === 'object' ? JSON.stringify(arg, null, 2) : String(arg))).join(' '); send('error', msg); originalConsoleError.apply(console, args); }; try { switch (type) { case 'large-file': await runLargeFileDemo(); break; case 'xml': await runXmlDemo(); break; case 'json': await runJsonDemo(); break; case 'core-api': await runCoreApiDemo(); break; default: console.log('未知的任务类型'); } } catch (e) { console.error('Unhandled error:', e); } finally { // Restore console console.log = originalConsoleLog; console.error = originalConsoleError; global.isDemoRunning = false; send('end', 'Done'); res.end(); } }); // API for system info app.get('/api/system-info', (req, res) => { exec('uname -a && echo "\\nDisk Usage:" && df -h | head -n 5', (error, stdout, stderr) => { if (error) { res.status(500).send(`Error: ${error.message}`); return; } res.send(stdout); }); }); app.listen(PORT, () => { console.log(`Server is running on http://localhost:${PORT}`); });