This repository has been archived on 2023-10-27. You can view files and clone it, but cannot push or open issues or pull requests.
Files
scoresaber-reloaded/src/network/queues/queues.js
2023-10-17 23:38:18 +01:00

100 lines
2.6 KiB
JavaScript

import { writable } from "svelte/store";
import { PRIORITY } from "./http-queue";
import createScoreSaberApiQueue from "./scoresaber/api-queue";
import createScoreSaberPageQueue from "./scoresaber/page-queue";
import createBeatMapsApiQueue from "./beatmaps/api-queue";
import createBeatSaviorApiQueue from "./beatsavior/api-queue";
import createTwitchApiQueue from "./twitch/api-queue";
import createAccSaberApiQueue from "./accsaber/api-queue";
export const getResponseBody = (response) => (response ? response.body : null);
export const isResponseCached = (response) => !!(response && response.cached);
export const updateResponseBody = (response, body) =>
response ? { ...response, body } : null;
const initQueue = (queue) => {
let queueState = {
size: 0,
pending: 0,
rateLimit: { waiting: 0, remaining: null, limit: null, resetAt: null },
progress: { num: 0, count: 0, progress: 1 },
};
const { subscribe, set } = writable(queueState);
queue.on("change", ({ size, pending }) => {
const {
rateLimit: { waiting },
} = queueState;
const { remaining, limit, resetAt } = queue.getRateLimit();
queueState = {
...queueState,
size,
pending,
rateLimit: { waiting, remaining, limit, resetAt },
};
set(queueState);
});
queue.on("progress", ({ progress, num, count }) => {
const {
rateLimit: { waiting },
} = queueState;
const { remaining, limit, resetAt } = queue.getRateLimit();
queueState = {
...queueState,
progress: { num, count, progress },
rateLimit: { waiting, remaining, limit, resetAt },
};
set(queueState);
});
queue.on("waiting", ({ waiting, remaining, limit, resetAt }) => {
queueState = {
...queueState,
rateLimit: { waiting, remaining, limit, resetAt },
};
set(queueState);
});
return {
subscribe,
...queue,
};
};
export default {
SCORESABER_API: initQueue(
createScoreSaberApiQueue({ concurrency: 3, timeout: 95000 }),
),
SCORESABER_PAGE: initQueue(
createScoreSaberPageQueue({ concurrency: 3, timeout: 30000 }),
),
BEATMAPS: initQueue(
createBeatMapsApiQueue({
concurrency: 1,
timeout: 10000,
intervalCap: 10,
interval: 1000,
}),
),
BEATSAVIOR: initQueue(
createBeatSaviorApiQueue({
concurrency: 1,
timeout: 10000,
intervalCap: 60,
interval: 60000,
}),
),
TWITCH: initQueue(
createTwitchApiQueue({
concurrency: 8,
timeout: 8000,
intervalCap: 800,
interval: 60000,
}),
),
ACCSABER: initQueue(
createAccSaberApiQueue({ concurrency: 2, timeout: 10000 }),
),
PRIORITY,
};