Files
MOHPortal/backend/scripts/wait-for-db.js

66 lines
1.9 KiB
JavaScript
Executable File

#!/usr/bin/env node
const { Client } = require('pg');
const SECOND = 1000;
const DEFAULT_TIMEOUT = Number.parseInt(process.env.DB_WAIT_TIMEOUT_MS || `${60 * SECOND}`, 10);
const RETRY_INTERVAL = Number.parseInt(process.env.DB_WAIT_RETRY_MS || '2000', 10);
function deriveConnectionString() {
if (process.env.DATABASE_URL) {
return process.env.DATABASE_URL;
}
const {
POSTGRES_USER = 'merchantsofhope_user',
POSTGRES_PASSWORD,
POSTGRES_DB = 'merchantsofhope_supplyanddemandportal',
POSTGRES_HOST = 'merchantsofhope-supplyanddemandportal-database',
POSTGRES_PORT = '5432'
} = process.env;
if (!POSTGRES_PASSWORD) {
return null;
}
return `postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}`;
}
const connectionString = deriveConnectionString();
if (!connectionString) {
console.error('[wait-for-db] DATABASE_URL or POSTGRES_PASSWORD must be provided.');
process.exit(1);
}
const startTime = Date.now();
async function waitForDatabase() {
const client = new Client({
connectionString,
connectionTimeoutMillis: Math.min(RETRY_INTERVAL, DEFAULT_TIMEOUT)
});
try {
await client.connect();
} catch (error) {
const elapsed = Date.now() - startTime;
if (elapsed >= DEFAULT_TIMEOUT) {
console.error('[wait-for-db] Timed out waiting for database connection.');
console.error(error);
process.exit(1);
}
const remaining = DEFAULT_TIMEOUT - elapsed;
const delay = Math.min(RETRY_INTERVAL, remaining);
console.info(`[wait-for-db] Database not ready yet. Retrying in ${delay}ms...`);
await new Promise((resolve) => setTimeout(resolve, delay));
return waitForDatabase();
} finally {
await client.end().catch(() => {});
}
console.info('[wait-for-db] Database connection established.');
}
waitForDatabase().then(() => process.exit(0));