webapp basics
This commit is contained in:
parent
931bb597f4
commit
c3e10559c7
2
nose/app/hello.ts
Normal file
2
nose/app/hello.ts
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export default (c: Context) =>
|
||||
c.text("Hello, world!")
|
||||
2
nose/app/ping.ts
Normal file
2
nose/app/ping.ts
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
export default (c: Context) =>
|
||||
c.text("pong")
|
||||
3
nose/bin/hello.ts
Normal file
3
nose/bin/hello.ts
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
export default function (): string {
|
||||
return "Hello, world!"
|
||||
}
|
||||
6
nose/global.d.ts
vendored
Normal file
6
nose/global.d.ts
vendored
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
// src/global.d.ts
|
||||
import type { Context as HonoContext } from "hono"
|
||||
|
||||
declare global {
|
||||
type Context = HonoContext
|
||||
}
|
||||
6
src/config.ts
Normal file
6
src/config.ts
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
import { resolve, join } from "node:path"
|
||||
|
||||
export const NOSE_ICON = ` ͡° ͜ʖ ͡°`
|
||||
export const NOSE_DIR = resolve("./nose")
|
||||
export const NOSE_BIN = resolve(join(NOSE_DIR, "bin"))
|
||||
export const NOSE_APP = resolve(join(NOSE_DIR, "app"))
|
||||
0
src/js/.gitignore
vendored
Normal file
0
src/js/.gitignore
vendored
Normal file
|
|
@ -3,9 +3,9 @@ import { serveStatic } from "hono/bun"
|
|||
import { prettyJSON } from "hono/pretty-json"
|
||||
import color from "kleur"
|
||||
|
||||
import { NOSE_ICON, NOSE_DIR, NOSE_BIN, NOSE_APP } from "./config"
|
||||
import { transpile, isFile } from "./utils"
|
||||
|
||||
export const NOSE_ICON = ` ͡° ͜ʖ ͡°`
|
||||
import { serveApp } from "./webapp"
|
||||
|
||||
//
|
||||
// Hono setup
|
||||
|
|
@ -43,7 +43,13 @@ app.get("/js/:path{.+}", async c => {
|
|||
// app routes
|
||||
//
|
||||
|
||||
app.get("*", async c => {
|
||||
const url = new URL(c.req.url)
|
||||
const domains = url.hostname.split(".")
|
||||
const subdomain = domains.length > 1 ? domains[0]! : "none"
|
||||
|
||||
return await serveApp(c, subdomain)
|
||||
})
|
||||
|
||||
//
|
||||
// server shutdown
|
||||
|
|
@ -70,9 +76,13 @@ for (const sig of ["SIGINT", "SIGTERM"] as const) {
|
|||
//
|
||||
|
||||
console.log(color.cyan(NOSE_ICON))
|
||||
console.log(color.blue("NOSE_DIR:"), color.yellow(NOSE_DIR))
|
||||
console.log(color.blue("NOSE_BIN:"), color.yellow(NOSE_BIN))
|
||||
console.log(color.blue("NOSE_APP:"), color.yellow(NOSE_APP))
|
||||
|
||||
export default {
|
||||
port: process.env.PORT || 3000,
|
||||
hostname: "0.0.0.0",
|
||||
fetch: app.fetch,
|
||||
idleTimeout: 0,
|
||||
}
|
||||
25
src/webapp.ts
Normal file
25
src/webapp.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import type { Context } from "hono"
|
||||
import { join } from "node:path"
|
||||
import { NOSE_APP } from "./config"
|
||||
import { isFile } from "./utils"
|
||||
|
||||
export async function serveApp(c: Context, subdomain: string): Promise<Response> {
|
||||
const app = await findApp(subdomain)
|
||||
|
||||
if (app)
|
||||
return app(c)
|
||||
|
||||
return c.text(`App Not Found: ${subdomain}`, 404)
|
||||
}
|
||||
|
||||
async function findApp(name: string): Promise<((r: Context) => Response) | undefined> {
|
||||
const path = join(NOSE_APP, `${name}.ts`)
|
||||
|
||||
if (isFile(path)) {
|
||||
const mod = await import(path + `?t=${Date.now()}`)
|
||||
if (mod?.default)
|
||||
return mod.default as (r: Context) => Response
|
||||
}
|
||||
|
||||
console.error("can't find app:", name)
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user