webpods
Version:
Append-only log service with OAuth authentication
80 lines • 2.97 kB
JavaScript
/**
* WebPods server entry point
*/
import { config } from "dotenv";
import { createLogger } from "./logger.js";
import { closeDb, checkDbConnection } from "./db.js";
import { cleanupExpiredStates } from "./auth/pkce-store.js";
import { createApp } from "./server.js";
import { getConfig } from "./config-loader.js";
import { getVersion } from "./version.js";
// Load environment variables (for secrets referenced in config.json)
config();
const logger = createLogger("webpods");
export async function start() {
try {
// Load configuration (will validate required fields)
const appConfig = getConfig();
// Check OAuth configuration
const { getConfiguredProviders } = await import("./auth/oauth-config.js");
const configuredProviders = getConfiguredProviders();
if (configuredProviders.length === 0) {
logger.error("At least one OAuth provider must be configured in config.json");
process.exit(1);
}
logger.info("Configuration loaded", {
providers: configuredProviders,
defaultProvider: appConfig.oauth.defaultProvider,
publicUrl: appConfig.server.publicUrl,
host: appConfig.server.host,
port: appConfig.server.port,
});
// Test database connection
const dbConnected = await checkDbConnection();
if (!dbConnected) {
logger.error("Failed to connect to database");
process.exit(1);
}
// Start PKCE state cleanup
setInterval(() => {
cleanupExpiredStates().catch((err) => logger.error("Failed to cleanup expired states", err));
}, 60 * 60 * 1000); // Run every hour
// Create app
const app = createApp();
const port = appConfig.server.port;
const server = app.listen(port, appConfig.server.host, () => {
logger.info(`WebPods server started`, {
version: getVersion(),
host: appConfig.server.host,
port,
publicUrl: appConfig.server.publicUrl,
cors: appConfig.server.corsOrigin,
});
});
// Graceful shutdown
process.on("SIGTERM", async () => {
logger.info("SIGTERM received, shutting down gracefully");
server.close(async () => {
await closeDb();
process.exit(0);
});
});
process.on("SIGINT", async () => {
logger.info("SIGINT received, shutting down gracefully");
server.close(async () => {
await closeDb();
process.exit(0);
});
});
}
catch (error) {
console.error(`\nError: ${error.message}`);
process.exit(1);
}
}
// Start if run directly
if (import.meta.url === `file://${process.argv[1]}`) {
start();
}
export { start as default };
//# sourceMappingURL=index.js.map