Files
smom-dbis-138/services/token-aggregation/src/database/client.ts
defiQUG 76143a8fe3 feat(token-aggregation): reports, PMM quotes, config; Engine X flash vaults
- Expand token-aggregation API (report routes), canonical tokens, pools
- Add flash vault contracts + tests (indexed, DODO cwUSDC, XAUT borrow)
- PMM pools JSON, deploy/export scripts, metamask verified list

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-10 12:56:30 -07:00

56 lines
1.4 KiB
TypeScript

import { Pool, PoolConfig } from 'pg';
import * as dotenv from 'dotenv';
import { logger } from '../utils/logger';
dotenv.config();
let pool: Pool | null = null;
export interface DatabaseConfig {
connectionString?: string;
host?: string;
port?: number;
database?: string;
user?: string;
password?: string;
min?: number;
max?: number;
}
export function getDatabasePool(): Pool {
if (pool) {
return pool;
}
const config: PoolConfig = {
connectionString: process.env.DATABASE_URL,
min: parseInt(process.env.DATABASE_POOL_MIN || '2', 10),
max: parseInt(process.env.DATABASE_POOL_MAX || '10', 10),
connectionTimeoutMillis: parseInt(process.env.DATABASE_CONNECTION_TIMEOUT_MS || '3000', 10),
};
// If connectionString is not provided, use individual config
if (!config.connectionString) {
config.host = process.env.DB_HOST || 'localhost';
config.port = parseInt(process.env.DB_PORT || '5432', 10);
config.database = process.env.DB_NAME || 'explorer_db';
config.user = process.env.DB_USER || 'postgres';
config.password = process.env.DB_PASSWORD || '';
}
pool = new Pool(config);
pool.on('error', (err) => {
logger.error('Unexpected error on idle database client', err);
});
return pool;
}
export async function closeDatabasePool(): Promise<void> {
if (pool) {
await pool.end();
pool = null;
}
}