redis configuration with bottleneck and shutdown method
parent
76e9014173
commit
39b9d3d9e2
|
@ -1,6 +1,10 @@
|
||||||
import axios, { AxiosInstance, AxiosError, AxiosResponse, AxiosRequestConfig } from 'axios';
|
import axios, { AxiosInstance, AxiosError, AxiosResponse, AxiosRequestConfig } from 'axios';
|
||||||
import axiosRetry from 'axios-retry';
|
import axiosRetry from 'axios-retry';
|
||||||
import Bottleneck from 'bottleneck';
|
import Bottleneck from 'bottleneck';
|
||||||
|
import dotenv from 'dotenv';
|
||||||
|
|
||||||
|
// Load environment variables from .env file
|
||||||
|
dotenv.config();
|
||||||
|
|
||||||
class SessionManager {
|
class SessionManager {
|
||||||
private static instance: SessionManager;
|
private static instance: SessionManager;
|
||||||
|
@ -8,8 +12,19 @@ class SessionManager {
|
||||||
private limiter: Bottleneck;
|
private limiter: Bottleneck;
|
||||||
|
|
||||||
private constructor() {
|
private constructor() {
|
||||||
|
|
||||||
|
|
||||||
// Initialize the Bottleneck limiter
|
// Initialize the Bottleneck limiter
|
||||||
this.limiter = new Bottleneck({
|
this.limiter = new Bottleneck({
|
||||||
|
id: "rDramaAPI-limiter",
|
||||||
|
datastore: "ioredis",
|
||||||
|
clearDatastore: false,
|
||||||
|
clientOptions: {
|
||||||
|
host: process.env.REDIS_HOST,
|
||||||
|
port: Number(process.env.REDIS_PORT),
|
||||||
|
password: process.env.REDIS_PASSWORD || undefined, // Use undefined if no password is set
|
||||||
|
enableOfflineQueue: true
|
||||||
|
},
|
||||||
maxConcurrent: 1, // Maximum number of concurrent requests
|
maxConcurrent: 1, // Maximum number of concurrent requests
|
||||||
minTime: 1000 // Minimum time between dispatches of requests in milliseconds
|
minTime: 1000 // Minimum time between dispatches of requests in milliseconds
|
||||||
});
|
});
|
||||||
|
@ -38,6 +53,10 @@ class SessionManager {
|
||||||
return SessionManager.instance;
|
return SessionManager.instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async shutdown(): Promise<void> {
|
||||||
|
await this.limiter.disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
private retryDelayStrategy(retryCount: number, error: AxiosError): number {
|
private retryDelayStrategy(retryCount: number, error: AxiosError): number {
|
||||||
const retryAfter = error.response?.headers['retry-after'];
|
const retryAfter = error.response?.headers['retry-after'];
|
||||||
if (retryAfter) {
|
if (retryAfter) {
|
||||||
|
@ -52,6 +71,7 @@ class SessionManager {
|
||||||
return status === 429 || status >= 500;
|
return status === 429 || status >= 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private wrapAxiosInstance(instance: AxiosInstance): void {
|
private wrapAxiosInstance(instance: AxiosInstance): void {
|
||||||
// Wrap the get method
|
// Wrap the get method
|
||||||
const originalGet = instance.get;
|
const originalGet = instance.get;
|
||||||
|
@ -81,6 +101,8 @@ class SessionManager {
|
||||||
public setAuthorizationToken(token: string): void {
|
public setAuthorizationToken(token: string): void {
|
||||||
this.axiosInstance.defaults.headers.common['Authorization'] = `${token}`;
|
this.axiosInstance.defaults.headers.common['Authorization'] = `${token}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default SessionManager;
|
export default SessionManager;
|
||||||
|
|
Loading…
Reference in New Issue