headplane/app/server/index.ts

73 lines
2.2 KiB
TypeScript
Raw Normal View History

2025-03-20 15:30:34 -04:00
import { versions } from 'node:process';
import { createHonoServer } from 'react-router-hono-server/node';
import log from '~/utils/log';
import { configureConfig, configureLogger, envVariables } from './config/env';
import { loadConfig } from './config/loader';
import { createApiClient } from './headscale/api-client';
2025-03-22 01:36:27 -04:00
import { loadHeadscaleConfig } from './headscale/config-loader';
import { createOidcClient } from './web/oidc';
2025-03-20 15:30:34 -04:00
import { createSessionStorage } from './web/sessions';
2025-03-22 01:36:27 -04:00
declare global {
const __PREFIX__: string;
const __VERSION__: string;
}
2025-03-20 15:30:34 -04:00
// MARK: Side-Effects
// This module contains a side-effect because everything running here
// exists for the lifetime of the process, making it appropriate.
log.info('server', 'Running Node.js %s', versions.node);
configureLogger(process.env[envVariables.debugLog]);
const config = await loadConfig(
configureConfig({
loadEnv: process.env[envVariables.envOverrides],
path: process.env[envVariables.configPath],
}),
);
// We also use this file to load anything needed by the react router code.
// These are usually per-request things that we need access to, like the
// helper that can issue and revoke cookies.
export type LoadContext = typeof appLoadContext;
const appLoadContext = {
config,
2025-03-22 01:36:27 -04:00
hs: await loadHeadscaleConfig(
config.headscale.config_path,
config.headscale.config_strict,
),
2025-03-20 15:30:34 -04:00
// TODO: Better cookie options in config
2025-03-22 01:36:27 -04:00
sessions: createSessionStorage({
2025-03-20 15:30:34 -04:00
name: '_hp_session',
maxAge: 60 * 60 * 24, // 24 hours
secure: config.server.cookie_secure,
secrets: [config.server.cookie_secret],
}),
client: await createApiClient(
config.headscale.url,
config.headscale.tls_cert_path,
),
2025-03-22 01:36:27 -04:00
oidc: config.oidc ? await createOidcClient(config.oidc) : undefined,
2025-03-20 15:30:34 -04:00
};
declare module 'react-router' {
interface AppLoadContext extends LoadContext {}
}
export default await createHonoServer({
useWebSocket: true,
2025-03-22 01:36:27 -04:00
// overrideGlobalObjects: true,
2025-03-20 15:30:34 -04:00
getLoadContext(c, { build, mode }) {
// This is the place where we can handle reverse proxy translation
return appLoadContext;
},
2025-03-22 01:36:27 -04:00
configure(server) {},
2025-03-20 15:30:34 -04:00
listeningListener(info) {
console.log(`Server is listening on http://localhost:${info.port}`);
},
});