From 524ddb96770690455b82522104a543c5b0b1f3b3 Mon Sep 17 00:00:00 2001
From: Hazelnoot <acomputerdog@gmail.com>
Date: Sat, 26 Oct 2024 08:57:26 -0400
Subject: [PATCH] fix race conditions in check_connect.js

---
 packages/backend/scripts/check_connect.js | 56 ++++++++++++++++-------
 1 file changed, 39 insertions(+), 17 deletions(-)

diff --git a/packages/backend/scripts/check_connect.js b/packages/backend/scripts/check_connect.js
index 47be1c90d4..f33a450325 100644
--- a/packages/backend/scripts/check_connect.js
+++ b/packages/backend/scripts/check_connect.js
@@ -12,27 +12,49 @@ const config = loadConfig();
 // createPostgresDataSource handels primaries and replicas automatically.
 // usually, it only opens connections first use, so we force it using
 // .initialize()
-createPostgresDataSource(config)
-	.initialize()
-	.then(c => { c.destroy() })
-	.catch(e => { throw e });
-
+async function connectToPostgres(){
+	const source = createPostgresDataSource(config);
+	await source.initialize();
+	await source.destroy();
+}
 
 // Connect to all redis servers
-function connectToRedis(redisOptions) {
-	const redis = new Redis(redisOptions);
-	redis.on('connect', () => redis.disconnect());
-	redis.on('error', (e) => {
-		throw e;
+async function connectToRedis(redisOptions) {
+	return await new Promise(async (resolve, reject) => {
+		const redis = new Redis({
+			...redisOptions,
+			lazyConnect: true,
+			reconnectOnError: false,
+			showFriendlyErrorStack: true,
+		});
+		redis.on('error', e => reject(e));
+
+		try {
+			await redis.connect();
+			resolve();
+
+		} catch (e) {
+			reject(e);
+
+		} finally {
+			redis.disconnect(false);
+		}
 	});
 }
 
 // If not all of these are defined, the default one gets reused.
 // so we use a Set to only try connecting once to each **uniq** redis.
-(new Set([
-	config.redis,
-	config.redisForPubsub,
-	config.redisForJobQueue,
-	config.redisForTimelines,
-	config.redisForReactions,
-])).forEach(connectToRedis);
+const promises = Array
+	.from(new Set([
+		config.redis,
+		config.redisForPubsub,
+		config.redisForJobQueue,
+		config.redisForTimelines,
+		config.redisForReactions,
+	]))
+	.map(connectToRedis)
+	.concat([
+		connectToPostgres()
+	]);
+
+await Promise.allSettled(promises);