promist
This commit is contained in:
105
start.js
Normal file
105
start.js
Normal 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);
|
||||
});
|
||||
Reference in New Issue
Block a user