From fd61dae1c1224a062709029ad4df605568077fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tr=C3=A8sAbhi?= <43380238+tresabhi@users.noreply.github.com> Date: Fri, 20 Oct 2023 10:50:54 -0500 Subject: [PATCH] feat: added queues to fetchBlitz --- src/app/embeds/session/page.tsx | 2 +- src/commands/searchClans.ts | 2 +- src/commands/searchPlayers.ts | 2 +- src/core/blitz/fetchBlitz.ts | 53 ++++++++++++++++++++ src/core/blitz/fetchWargaming.ts | 23 --------- src/core/blitz/getAccountAchievements.ts | 2 +- src/core/blitz/getAccountInfo.ts | 2 +- src/core/blitz/getClanAccountInfo.ts | 2 +- src/core/blitz/getClanInfo.ts | 2 +- src/core/blitz/getTankStats.ts | 2 +- src/core/blitz/searchClansAcrossRegions.ts | 2 +- src/core/blitz/searchPlayersAcrossRegions.ts | 2 +- src/core/blitzstars/tankopedia.ts | 2 +- src/stores/session.ts | 2 +- 14 files changed, 65 insertions(+), 35 deletions(-) create mode 100644 src/core/blitz/fetchBlitz.ts delete mode 100644 src/core/blitz/fetchWargaming.ts diff --git a/src/app/embeds/session/page.tsx b/src/app/embeds/session/page.tsx index 728f84710..0b75c1617 100644 --- a/src/app/embeds/session/page.tsx +++ b/src/app/embeds/session/page.tsx @@ -5,7 +5,7 @@ import { useEffect, useState } from 'react'; import * as Breakdown from '../../../components/Breakdown'; import { TreeTypeEnum } from '../../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID'; -import fetchBlitz from '../../../core/blitz/fetchWargaming'; +import fetchBlitz from '../../../core/blitz/fetchBlitz'; import { tankAverages } from '../../../core/blitzstars/tankAverages'; import { TankopediaEntry, diff --git a/src/commands/searchClans.ts b/src/commands/searchClans.ts index 8eb4bc83d..9b4860799 100644 --- a/src/commands/searchClans.ts +++ b/src/commands/searchClans.ts @@ -2,7 +2,7 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import fetchBlitz from '../core/blitz/fetchWargaming'; +import fetchBlitz from '../core/blitz/fetchBlitz'; import addClanChoices from '../core/discord/addClanChoices'; import addRegionChoices from '../core/discord/addRegionChoices'; import embedInfo from '../core/discord/embedInfo'; diff --git a/src/commands/searchPlayers.ts b/src/commands/searchPlayers.ts index 9a376d9c7..3d6037bcc 100644 --- a/src/commands/searchPlayers.ts +++ b/src/commands/searchPlayers.ts @@ -2,7 +2,7 @@ import { SlashCommandBuilder } from 'discord.js'; import markdownEscape from 'markdown-escape'; import { REGION_NAMES, Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import fetchBlitz from '../core/blitz/fetchWargaming'; +import fetchBlitz from '../core/blitz/fetchBlitz'; import { AccountList, usernamePattern, diff --git a/src/core/blitz/fetchBlitz.ts b/src/core/blitz/fetchBlitz.ts new file mode 100644 index 000000000..23ed3c945 --- /dev/null +++ b/src/core/blitz/fetchBlitz.ts @@ -0,0 +1,53 @@ +export type BlitzResponse = + | { + status: 'error'; + error: { field: string; message: string; code: 402; value: null }; + } + | { + status: 'ok'; + data: Data; + }; + +const MAX_CALLS_PER_SECOND = 10; + +const queue: { url: string; resolve: (data: object) => void }[] = []; +let inProgress = 0; + +async function manageQueue() { + if (queue.length > 0 && inProgress < MAX_CALLS_PER_SECOND) { + inProgress++; + + setTimeout(() => { + inProgress--; + }, 1000); + + const { url, resolve } = queue.shift()!; + const data = (await fetch(url) + .then((response) => response.json()) + .catch((error) => ({ status: 'error', error }))) as BlitzResponse< + typeof resolve + >; + + manageQueue(); + + if (data.status === 'ok') { + resolve(data.data); + } else { + throw new Error(`Wargaming response error status:"${data.status}"`, { + cause: `Message: "${data.error.message}"\nURL: "${url}"`, + }); + } + } +} + +export default function fetchBlitz(url: string) { + return new Promise>((resolve) => { + queue.push({ + url, + resolve(data) { + resolve(data as BlitzResponse); + }, + }); + manageQueue(); + }); +} diff --git a/src/core/blitz/fetchWargaming.ts b/src/core/blitz/fetchWargaming.ts deleted file mode 100644 index a17c98d5c..000000000 --- a/src/core/blitz/fetchWargaming.ts +++ /dev/null @@ -1,23 +0,0 @@ -export type BlitzResponse = - | { - status: 'error'; - error: { field: string; message: string; code: 402; value: null }; - } - | { - status: 'ok'; - data: Data; - }; - -export default async function fetchBlitz(url: string) { - const data = (await fetch(url).then((response) => - response.json(), - )) as BlitzResponse; - - if (data.status === 'ok') { - return data.data; - } else { - throw new Error(`Wargaming response error status:"${data.status}"`, { - cause: `Message: "${data.error.message}"\nURL: "${url}"`, - }); - } -} diff --git a/src/core/blitz/getAccountAchievements.ts b/src/core/blitz/getAccountAchievements.ts index edb21ca14..98b7c9cfd 100644 --- a/src/core/blitz/getAccountAchievements.ts +++ b/src/core/blitz/getAccountAchievements.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; interface IndividualAccountAchievements { diff --git a/src/core/blitz/getAccountInfo.ts b/src/core/blitz/getAccountInfo.ts index 5852ea073..efb795c41 100644 --- a/src/core/blitz/getAccountInfo.ts +++ b/src/core/blitz/getAccountInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; export interface AllStats { diff --git a/src/core/blitz/getClanAccountInfo.ts b/src/core/blitz/getClanAccountInfo.ts index 6c36fc15f..ffb334ca2 100644 --- a/src/core/blitz/getClanAccountInfo.ts +++ b/src/core/blitz/getClanAccountInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; import { normalizeExtra } from './normalizeExtra'; import { normalizeIds } from './normalizeIds'; diff --git a/src/core/blitz/getClanInfo.ts b/src/core/blitz/getClanInfo.ts index 625daca67..7a9150fcf 100644 --- a/src/core/blitz/getClanInfo.ts +++ b/src/core/blitz/getClanInfo.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; import { normalizeIds } from './normalizeIds'; export interface IndividualClanInfo { diff --git a/src/core/blitz/getTankStats.ts b/src/core/blitz/getTankStats.ts index acb9fcc39..4965c43d7 100644 --- a/src/core/blitz/getTankStats.ts +++ b/src/core/blitz/getTankStats.ts @@ -2,7 +2,7 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import { TanksStats } from '../../types/tanksStats'; import { UserError } from '../blitzkrieg/userError'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; export default async function getTankStats(region: Region, id: number) { const tankStats = await fetchBlitz( diff --git a/src/core/blitz/searchClansAcrossRegions.ts b/src/core/blitz/searchClansAcrossRegions.ts index 1e62aa981..98b4cfabb 100644 --- a/src/core/blitz/searchClansAcrossRegions.ts +++ b/src/core/blitz/searchClansAcrossRegions.ts @@ -1,7 +1,7 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; import { Clan, ClanList } from '../../types/clanList'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; export type ClanListWithRegion = (Clan & { region: 'com' | 'eu' | 'asia'; diff --git a/src/core/blitz/searchPlayersAcrossRegions.ts b/src/core/blitz/searchPlayersAcrossRegions.ts index b24315ee1..e8a12a17a 100644 --- a/src/core/blitz/searchPlayersAcrossRegions.ts +++ b/src/core/blitz/searchPlayersAcrossRegions.ts @@ -1,6 +1,6 @@ import { Region } from '../../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from './fetchWargaming'; +import fetchBlitz from './fetchBlitz'; interface Account { nickname: string; diff --git a/src/core/blitzstars/tankopedia.ts b/src/core/blitzstars/tankopedia.ts index 7be335929..d3619ec72 100644 --- a/src/core/blitzstars/tankopedia.ts +++ b/src/core/blitzstars/tankopedia.ts @@ -1,7 +1,7 @@ import { deburr } from 'lodash'; import { TreeTypeString } from '../../components/Tanks'; import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID'; -import fetchBlitz from '../blitz/fetchWargaming'; +import fetchBlitz from '../blitz/fetchBlitz'; import { context } from '../blitzkrieg/context'; export interface TankopediaEntry { diff --git a/src/stores/session.ts b/src/stores/session.ts index 9c125f933..fd3786189 100644 --- a/src/stores/session.ts +++ b/src/stores/session.ts @@ -4,7 +4,7 @@ import { devtools, persist } from 'zustand/middleware'; import { CustomColumnDisplay } from '../app/tools/session/components/CustomColumn'; import { Region } from '../constants/regions'; import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID'; -import fetchBlitz from '../core/blitz/fetchWargaming'; +import fetchBlitz from '../core/blitz/fetchBlitz'; import { NormalizedTankStats, TanksStats } from '../types/tanksStats'; type Session = (