From 98c6c5bbb7959db1a69eb8bc0567f8d5d93ebb14 Mon Sep 17 00:00:00 2001 From: mat <27899617+mat-1@users.noreply.github.com> Date: Fri, 28 May 2021 16:12:24 -0500 Subject: Don't fetch leaderboards multiple times when they're already being fetched (#47) --- src/database.ts | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/database.ts b/src/database.ts index 2105183..b198012 100644 --- a/src/database.ts +++ b/src/database.ts @@ -254,11 +254,24 @@ function isLeaderboardReversed(name: string): boolean { return false } +/** A set of names of the raw leaderboards that are currently being fetched. This is used to make sure two leaderboads aren't fetched at the same time */ +const fetchingRawLeaderboardNames: Set = new Set() + async function fetchMemberLeaderboardRaw(name: string): Promise { if (!client) throw Error('Client isn\'t initialized yet') if (cachedRawLeaderboards.has(name)) return cachedRawLeaderboards.get(name) as DatabaseMemberLeaderboardItem[] + + // if it's currently being fetched, check every 100ms until it's in cachedRawLeaderboards + if (fetchingRawLeaderboardNames.has(name)) { + while (true) { + await sleep(100) + if (cachedRawLeaderboards.has(name)) + return cachedRawLeaderboards.get(name) as DatabaseMemberLeaderboardItem[] + } + } + // typescript forces us to make a new variable and set it this way because it gives an error otherwise const query = {} query[`stats.${name}`] = { '$exists': true, '$ne': NaN } @@ -266,12 +279,13 @@ async function fetchMemberLeaderboardRaw(name: string): Promise { if (cachedRawLeaderboards.has(name)) return cachedRawLeaderboards.get(name) as DatabaseProfileLeaderboardItem[] + + // if it's currently being fetched, check every 100ms until it's in cachedRawLeaderboards + if (fetchingRawLeaderboardNames.has(name)) { + while (true) { + await sleep(100) + if (cachedRawLeaderboards.has(name)) + return cachedRawLeaderboards.get(name) as DatabaseProfileLeaderboardItem[] + } + } + // typescript forces us to make a new variable and set it this way because it gives an error otherwise const query = {} query[`stats.${name}`] = { '$exists': true, '$ne': NaN } @@ -286,11 +310,13 @@ async function fetchProfileLeaderboardRaw(name: string): Promise