#!/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));