2026-02-17 12:22:36 +00:00

124 lines
3.3 KiB
TypeScript

/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see <https://www.gnu.org/licenses/>.
*/
import {createApp} from '@app/App';
import type {BootstrapRelayConfig} from '@app/Config';
import {Config} from '@app/Config';
import {createDatabase} from '@app/database/Database';
import {Logger} from '@app/Logger';
import type {IRelayRepository, RelayInfo} from '@app/repositories/RelayRepository';
import {serve} from '@hono/node-server';
function loadBootstrapRelays(repository: IRelayRepository, bootstrapRelays: Array<BootstrapRelayConfig>): void {
for (const bootstrapRelay of bootstrapRelays) {
const existingRelay = repository.getRelay(bootstrapRelay.id);
if (existingRelay) {
Logger.debug({relay_id: bootstrapRelay.id}, 'Bootstrap relay already exists, skipping');
continue;
}
const now = new Date().toISOString();
const relayInfo: RelayInfo = {
id: bootstrapRelay.id,
name: bootstrapRelay.id,
url: bootstrapRelay.url,
latitude: bootstrapRelay.lat,
longitude: bootstrapRelay.lon,
region: bootstrapRelay.region,
capacity: bootstrapRelay.capacity,
current_connections: 0,
public_key: bootstrapRelay.public_key ?? '',
registered_at: now,
last_seen_at: now,
healthy: true,
failed_checks: 0,
};
repository.saveRelay(relayInfo);
Logger.info(
{
relay_id: bootstrapRelay.id,
url: bootstrapRelay.url,
region: bootstrapRelay.region,
},
'Registered bootstrap relay',
);
}
}
function main(): void {
Logger.info(
{
host: Config.server.host,
port: Config.server.port,
database_path: Config.database.path,
},
'Starting Fluxer Relay Directory',
);
const db = createDatabase(Config.database.path);
Logger.info({path: Config.database.path}, 'Database initialized');
const {app, repository, shutdown} = createApp({
db,
healthCheckConfig: Config.health_check,
logger: Logger,
});
if (Config.bootstrap_relays.length > 0) {
Logger.info({count: Config.bootstrap_relays.length}, 'Loading bootstrap relays from config');
loadBootstrapRelays(repository, Config.bootstrap_relays);
}
const server = serve({
fetch: app.fetch,
hostname: Config.server.host,
port: Config.server.port,
});
Logger.info(
{
host: Config.server.host,
port: Config.server.port,
},
'Fluxer Relay Directory listening',
);
function gracefulShutdown(signal: string): void {
Logger.info({signal}, 'Received shutdown signal');
shutdown();
server.close(() => {
Logger.info('HTTP server closed');
});
db.close();
Logger.info('Database connection closed');
process.exit(0);
}
process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
process.on('SIGINT', () => gracefulShutdown('SIGINT'));
}
main();