45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
import Bun from 'bun';
|
|
import path from 'path';
|
|
import browser from 'browser-detect';
|
|
import { buildHTML } from './html';
|
|
import { isGame } from './isGame';
|
|
|
|
Bun.serve({
|
|
async fetch(req) {
|
|
const url = new URL(req.url);
|
|
const pathname = path.basename(url.pathname);
|
|
const gameParam = url.searchParams.get('game');
|
|
const game = (gameParam && await isGame(gameParam)) ? gameParam : 'index';
|
|
|
|
switch (pathname) {
|
|
case '':
|
|
case '/':
|
|
case 'index.html':
|
|
try {
|
|
const detectedBrowser = browser(req.headers.get('user-agent') ?? '');
|
|
const html = await buildHTML(
|
|
game,
|
|
{
|
|
production: url.searchParams.get('production') === 'true', // to debug production builds
|
|
portable: url.searchParams.get('portable') === 'true', // to skip AssemblyScript compilation,
|
|
mobile: detectedBrowser.mobile || url.searchParams.get('mobile') === 'true',
|
|
}
|
|
);
|
|
if (html) {
|
|
return new Response(html, {
|
|
headers: {
|
|
'Content-Type': 'text/html;charset=utf-8'
|
|
}
|
|
});
|
|
}
|
|
} catch (e) {
|
|
console.error(e);
|
|
return new Response(`Error building HTML: ${e}`, { status: 500 });
|
|
}
|
|
return new Response(`Error building HTML`, { status: 500 });
|
|
default:
|
|
console.log(`[Dev Server] requested unknown pathname: ${pathname}`);
|
|
return new Response(null, { status: 404 });
|
|
}
|
|
}
|
|
}) |