82 lines
2.0 KiB
TypeScript
82 lines
2.0 KiB
TypeScript
import { Application, Router, type Context, type Next } from "jsr:@oak/oak";
|
|
import { join } from "jsr:@std/path";
|
|
import { Eta } from "jsr:@eta-dev/eta";
|
|
|
|
// Create Eta instance
|
|
const eta = new Eta({
|
|
views: join(Deno.cwd(), "views"),
|
|
cache: Deno.env.get("SERVICE_DOMAIN") === "production",
|
|
});
|
|
|
|
// Create Oak application
|
|
const app = new Application();
|
|
const router = new Router();
|
|
|
|
// Serve static files
|
|
app.use(async (ctx: Context, next: Next) => {
|
|
const staticPath = join(Deno.cwd(), "static");
|
|
|
|
try {
|
|
// Strip /static prefix from path
|
|
const path = ctx.request.url.pathname.replace(/^\/static/, '');
|
|
|
|
await ctx.send({
|
|
root: staticPath,
|
|
path: path,
|
|
index: "index.html",
|
|
});
|
|
} catch {
|
|
await next();
|
|
}
|
|
});
|
|
|
|
// Main route handler
|
|
router.get("/", async (ctx: Context) => {
|
|
const params = ctx.request.url.searchParams;
|
|
let back_to_url = params.get("back_to") || "";
|
|
let domain = "";
|
|
|
|
// If no back_to parameter, check host header
|
|
if (!back_to_url) {
|
|
const host = ctx.request.headers.get("host") || "";
|
|
const serviceDomain = Deno.env.get("SERVICE_DOMAIN") || "localhost";
|
|
const domainRegex = new RegExp(`^(${serviceDomain.replace(/\./g, '\\.')}|localhost)`);
|
|
// Exclude our own hosts
|
|
if (host && !domainRegex.test(host)) {
|
|
back_to_url = `http://${host}`;
|
|
}
|
|
}
|
|
|
|
// Extract domain from URL
|
|
if (back_to_url) {
|
|
try {
|
|
domain = new URL(back_to_url).hostname;
|
|
} catch {
|
|
// Invalid URL, ignore
|
|
}
|
|
}
|
|
|
|
// Render template with context
|
|
const html = await eta.render("index", {
|
|
back_to_url,
|
|
domain: domain || "This part of the Internet",
|
|
});
|
|
|
|
ctx.response.body = html;
|
|
ctx.response.type = "text/html";
|
|
});
|
|
|
|
router.get("/guide", async (ctx: Context) => {
|
|
const html = await eta.render("ipv6-guide", {});
|
|
ctx.response.body = html;
|
|
ctx.response.type = "text/html";
|
|
});
|
|
|
|
app.use(router.routes());
|
|
app.use(router.allowedMethods());
|
|
|
|
// Start server
|
|
const port = 8080;
|
|
console.log(`Server running on http://localhost:${port}`);
|
|
await app.listen({ port });
|