This commit is contained in:
2026-07-23 09:45:21 +00:00
parent e388dc2cf4
commit 08816695c9
405 changed files with 13784 additions and 686 deletions

105
start.js Normal file
View File

@@ -0,0 +1,105 @@
import { createServer } from 'node:http';
import { readFileSync, statSync, existsSync } from 'node:fs';
import { extname, join } from 'node:path';
const PORT = parseInt(process.env.PORT || '8005', 10);
const CLIENT_DIR = new URL('./dist/client/', import.meta.url).pathname;
const MIME_TYPES = {
'.html': 'text/html',
'.css': 'text/css',
'.js': 'application/javascript',
'.mjs': 'application/javascript',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.gif': 'image/gif',
'.svg': 'image/svg+xml',
'.ico': 'image/x-icon',
'.webp': 'image/webp',
'.woff': 'font/woff',
'.woff2': 'font/woff2',
'.xml': 'application/xml',
'.txt': 'text/plain',
};
async function run() {
const handler = (await import('./dist/server/server.js')).default;
const server = createServer(async (req, res) => {
try {
const url = new URL(req.url, `http://${req.headers.host || 'localhost'}`);
let pathname = url.pathname;
// Serve static files from dist/client/
if (pathname === '/') pathname = '/index.html';
const filePath = join(CLIENT_DIR, pathname);
if (existsSync(filePath) && statSync(filePath).isFile()) {
const ext = extname(filePath).toLowerCase();
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
const content = readFileSync(filePath);
res.statusCode = 200;
res.setHeader('Content-Type', contentType);
res.setHeader('Content-Length', content.length);
res.end(content);
return;
}
// Fall back to SSR handler
let body;
if (req.method !== 'GET' && req.method !== 'HEAD') {
body = await new Promise((resolve) => {
const chunks = [];
req.on('data', (chunk) => chunks.push(chunk));
req.on('end', () => resolve(Buffer.concat(chunks)));
req.on('error', () => resolve(null));
});
}
const request = new Request(url, {
method: req.method,
headers: Object.entries(req.headers).map(([k, v]) => [k, Array.isArray(v) ? v.join(', ') : v]),
body: body || undefined,
});
const response = await handler.fetch(request, {}, {});
res.statusCode = response.status;
response.headers.forEach((value, key) => {
res.setHeader(key, value);
});
if (response.body) {
const reader = response.body.getReader();
const pump = () => {
reader.read().then(({ done, value }) => {
if (done) { res.end(); return; }
res.write(value);
pump();
}).catch(() => { res.end(); });
};
pump();
} else {
res.end();
}
} catch (error) {
console.error(error);
if (!res.headersSent) {
res.statusCode = 500;
res.setHeader('Content-Type', 'text/plain');
res.end('Internal Server Error');
}
}
});
server.listen(PORT, () => {
console.log(`Promist server listening on port ${PORT}`);
});
}
run().catch((err) => {
console.error('Failed to start server:', err);
process.exit(1);
});