mirror of
https://github.com/blitzkit/blitzkit.git
synced 2026-10-23 19:49:50 +02:00
feat: added queues to fetchBlitz
This commit is contained in:
1 parent
2c45f9759f
commit
fd61dae1c1
14 files changed
+65
-35
No files matched your search
@@ -5,7 +5,7 @@ import { useEffect, useState } from 'react';
|
|||||||
import * as Breakdown from '../../../components/Breakdown';
|
import * as Breakdown from '../../../components/Breakdown';
|
||||||
import { TreeTypeEnum } from '../../../components/Tanks';
|
import { TreeTypeEnum } from '../../../components/Tanks';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../../constants/wargamingApplicationID';
|
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 { tankAverages } from '../../../core/blitzstars/tankAverages';
|
||||||
import {
|
import {
|
||||||
TankopediaEntry,
|
TankopediaEntry,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { SlashCommandBuilder } from 'discord.js';
|
|||||||
import markdownEscape from 'markdown-escape';
|
import markdownEscape from 'markdown-escape';
|
||||||
import { REGION_NAMES, Region } from '../constants/regions';
|
import { REGION_NAMES, Region } from '../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID';
|
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 addClanChoices from '../core/discord/addClanChoices';
|
||||||
import addRegionChoices from '../core/discord/addRegionChoices';
|
import addRegionChoices from '../core/discord/addRegionChoices';
|
||||||
import embedInfo from '../core/discord/embedInfo';
|
import embedInfo from '../core/discord/embedInfo';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { SlashCommandBuilder } from 'discord.js';
|
|||||||
import markdownEscape from 'markdown-escape';
|
import markdownEscape from 'markdown-escape';
|
||||||
import { REGION_NAMES, Region } from '../constants/regions';
|
import { REGION_NAMES, Region } from '../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from '../core/blitz/fetchWargaming';
|
import fetchBlitz from '../core/blitz/fetchBlitz';
|
||||||
import {
|
import {
|
||||||
AccountList,
|
AccountList,
|
||||||
usernamePattern,
|
usernamePattern,
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
export type BlitzResponse<Data extends object> =
|
||||||
|
| {
|
||||||
|
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<Data extends object>(url: string) {
|
||||||
|
return new Promise<BlitzResponse<Data>>((resolve) => {
|
||||||
|
queue.push({
|
||||||
|
url,
|
||||||
|
resolve(data) {
|
||||||
|
resolve(data as BlitzResponse<Data>);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
manageQueue();
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
export type BlitzResponse<Data extends object> =
|
|
||||||
| {
|
|
||||||
status: 'error';
|
|
||||||
error: { field: string; message: string; code: 402; value: null };
|
|
||||||
}
|
|
||||||
| {
|
|
||||||
status: 'ok';
|
|
||||||
data: Data;
|
|
||||||
};
|
|
||||||
|
|
||||||
export default async function fetchBlitz<Data extends object>(url: string) {
|
|
||||||
const data = (await fetch(url).then((response) =>
|
|
||||||
response.json(),
|
|
||||||
)) as BlitzResponse<Data>;
|
|
||||||
|
|
||||||
if (data.status === 'ok') {
|
|
||||||
return data.data;
|
|
||||||
} else {
|
|
||||||
throw new Error(`Wargaming response error status:"${data.status}"`, {
|
|
||||||
cause: `Message: "${data.error.message}"\nURL: "${url}"`,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
import { normalizeIds } from './normalizeIds';
|
import { normalizeIds } from './normalizeIds';
|
||||||
|
|
||||||
interface IndividualAccountAchievements {
|
interface IndividualAccountAchievements {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
import { normalizeIds } from './normalizeIds';
|
import { normalizeIds } from './normalizeIds';
|
||||||
|
|
||||||
export interface AllStats {
|
export interface AllStats {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
import { normalizeExtra } from './normalizeExtra';
|
import { normalizeExtra } from './normalizeExtra';
|
||||||
import { normalizeIds } from './normalizeIds';
|
import { normalizeIds } from './normalizeIds';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
import { normalizeIds } from './normalizeIds';
|
import { normalizeIds } from './normalizeIds';
|
||||||
|
|
||||||
export interface IndividualClanInfo {
|
export interface IndividualClanInfo {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import { Region } from '../../constants/regions';
|
|||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import { TanksStats } from '../../types/tanksStats';
|
import { TanksStats } from '../../types/tanksStats';
|
||||||
import { UserError } from '../blitzkrieg/userError';
|
import { UserError } from '../blitzkrieg/userError';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
|
|
||||||
export default async function getTankStats(region: Region, id: number) {
|
export default async function getTankStats(region: Region, id: number) {
|
||||||
const tankStats = await fetchBlitz<TanksStats>(
|
const tankStats = await fetchBlitz<TanksStats>(
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import { Clan, ClanList } from '../../types/clanList';
|
import { Clan, ClanList } from '../../types/clanList';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
|
|
||||||
export type ClanListWithRegion = (Clan & {
|
export type ClanListWithRegion = (Clan & {
|
||||||
region: 'com' | 'eu' | 'asia';
|
region: 'com' | 'eu' | 'asia';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Region } from '../../constants/regions';
|
import { Region } from '../../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from './fetchWargaming';
|
import fetchBlitz from './fetchBlitz';
|
||||||
|
|
||||||
interface Account {
|
interface Account {
|
||||||
nickname: string;
|
nickname: string;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { deburr } from 'lodash';
|
import { deburr } from 'lodash';
|
||||||
import { TreeTypeString } from '../../components/Tanks';
|
import { TreeTypeString } from '../../components/Tanks';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
import { WARGAMING_APPLICATION_ID } from '../../constants/wargamingApplicationID';
|
||||||
import fetchBlitz from '../blitz/fetchWargaming';
|
import fetchBlitz from '../blitz/fetchBlitz';
|
||||||
import { context } from '../blitzkrieg/context';
|
import { context } from '../blitzkrieg/context';
|
||||||
|
|
||||||
export interface TankopediaEntry {
|
export interface TankopediaEntry {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { devtools, persist } from 'zustand/middleware';
|
|||||||
import { CustomColumnDisplay } from '../app/tools/session/components/CustomColumn';
|
import { CustomColumnDisplay } from '../app/tools/session/components/CustomColumn';
|
||||||
import { Region } from '../constants/regions';
|
import { Region } from '../constants/regions';
|
||||||
import { WARGAMING_APPLICATION_ID } from '../constants/wargamingApplicationID';
|
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';
|
import { NormalizedTankStats, TanksStats } from '../types/tanksStats';
|
||||||
|
|
||||||
type Session = (
|
type Session = (
|
||||||
|
|||||||
Reference in new issue
Block a user