import process from 'node:process'; import type { MaybePromise } from '@wener/utils'; import type { Hono } from 'hono'; import { showRoutes } from 'hono/dev'; import { App } from '../app'; import { loadEnvs } from '../utils/loadEnvs'; import { createHono } from './createHono'; import { serve } from './serve'; export interface RunHonoServerOptions> { port?: number; app?: T; createApp?: () => T; onApp?: (app: T) => MaybePromise; onServe?: (arg: { port: number; address: string }) => void; env?: false; } export async function runServer>(opts: RunHonoServerOptions) { let app = opts.app; const { createApp = createHono, onApp = (v) => v, onServe = ({ port, address }) => { showRoutes(app!); console.log(`Listening on http://${address}:${port}`); // Listening on http://localhost:3000 }, } = opts; if (opts.env === false) { // skip } else { await loadEnvs({ name: App.service }); } app ||= createApp() as T; app = await onApp(app); let { port = process.env.PORT } = opts; return serve({ fetch: app.fetch, port: typeof port === 'string' ? Number.parseInt(port, 10) : port }, onServe); }