66 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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));
 |