Files
astro-tina/server.js
Kunthawat Greethong 18c4dbdb84
Some checks failed
Deploy to Easypanel / deploy (push) Has been cancelled
Simplified: remove Tailwind, standalone static HTML
2026-04-28 10:18:57 +07:00

72 lines
1.7 KiB
JavaScript

import { createServer } from 'node:http'
import { readFile } from 'node:fs/promises'
import { join, extname } from 'node:path'
import { existsSync } from 'node:fs'
const PORT = process.env.PORT || 4321
const DIST_DIR = './dist'
const mimeTypes = {
'.html': 'text/html',
'.js': 'application/javascript',
'.css': 'text/css',
'.json': 'application/json',
'.png': 'image/png',
'.jpg': 'image/jpeg',
'.svg': 'image/svg+xml',
'.ico': 'image/x-icon',
'.woff': 'font/woff',
'.woff2': 'font/woff2',
}
async function serveFile(res, filePath) {
try {
const content = await readFile(filePath)
const ext = extname(filePath)
const contentType = mimeTypes[ext] || 'application/octet-stream'
res.writeHead(200, { 'Content-Type': contentType })
res.end(content)
} catch {
res.writeHead(404)
res.end('Not found')
}
}
const server = createServer(async (req, res) => {
let url = req.url.split('?')[0]
// Try exact file first
let filePath = join(DIST_DIR, url)
if (existsSync(filePath) && !existsSync(join(DIST_DIR, url, 'index.html'))) {
await serveFile(res, filePath)
return
}
// Try directory index
const indexPaths = [
join(DIST_DIR, url, 'index.html'),
join(DIST_DIR, 'index.html'),
]
for (const idx of indexPaths) {
if (existsSync(idx)) {
await serveFile(res, idx)
return
}
}
// Try with .html extension
if (!extname(url)) {
const htmlPath = join(DIST_DIR, url + '.html')
if (existsSync(htmlPath)) {
await serveFile(res, htmlPath)
return
}
}
res.writeHead(404)
res.end('Not found')
})
server.listen(PORT, '0.0.0.0', () => {
console.log(`Server running at http://0.0.0.0:${PORT}`)
})