Initial commit
This commit is contained in:
75
app.ts
Normal file
75
app.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
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(), "src", "views"),
|
||||
cache: Deno.env.get("DENO_ENV") === "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(), "src", "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";
|
||||
});
|
||||
|
||||
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 });
|
||||
Reference in New Issue
Block a user