import { checkRateLimits } from "./checkRateLimits.ts"; import { cleanupQueues } from "./cleanupQueues.ts"; import { createRequestBody } from "./createRequestBody.ts"; import { processGlobalQueue } from "./processGlobalQueue.ts"; import { processQueue } from "./processQueue.ts"; import { processRateLimitedPaths } from "./processRateLimitedPaths.ts"; import { processRequest } from "./processRequest.ts"; import { processRequestHeaders } from "./processRequestHeaders.ts"; import { convertRestError } from "./convertRestError.ts"; import { RestPayload, RestRateLimitedPath, RestRequest } from "./rest.ts"; import { runMethod } from "./runMethod.ts"; import { simplifyUrl } from "./simplifyUrl.ts"; import { baseEndpoints } from "../util/constants.ts"; import { API_VERSION } from "../util/constants.ts"; import { removeTokenPrefix } from "../util/token.ts"; import { sendRequest } from "./sendRequest.ts"; export function createRestManager(options: CreateRestManagerOptions) { const version = options.version || API_VERSION; if (options.customUrl) { baseEndpoints.BASE_URL = `${options.customUrl}/v${version}`; } return { // current invalid amount invalidRequests: 0, // max invalid requests allowed until ban maxInvalidRequests: 10000, // 10 minutes invalidRequestsInterval: 600000, // timer to reset to 0 invalidRequestsTimeoutId: 0, // how safe to be from max invalidRequestsSafetyAmount: 1, // when first request in this period was made invalidRequestFrozenAt: 0, invalidRequestErrorStatuses: [401, 403, 429], version, token: removeTokenPrefix(options.token), maxRetryCount: options.maxRetryCount || 10, secretKey: options.secretKey || "discordeno_best_lib_ever", customUrl: options.customUrl || "", pathQueues: new Map< string, { isWaiting: boolean; requests: { request: RestRequest; payload: RestPayload; }[]; } >(), processingQueue: false, processingRateLimitedPaths: false, globallyRateLimited: false, globalQueue: [] as { request: RestRequest; payload: RestPayload; basicURL: string; urlToUse: string; }[], globalQueueProcessing: false, rateLimitedPaths: new Map(), debug: options.debug || function (_text: string) {}, checkRateLimits: options.checkRateLimits || checkRateLimits, cleanupQueues: options.cleanupQueues || cleanupQueues, processQueue: options.processQueue || processQueue, processRateLimitedPaths: options.processRateLimitedPaths || processRateLimitedPaths, processRequestHeaders: options.processRequestHeaders || processRequestHeaders, processRequest: options.processRequest || processRequest, createRequestBody: options.createRequestBody || createRequestBody, runMethod: options.runMethod || runMethod, simplifyUrl: options.simplifyUrl || simplifyUrl, processGlobalQueue: options.processGlobalQueue || processGlobalQueue, convertRestError: options.convertRestError || convertRestError, sendRequest: options.sendRequest || sendRequest, }; } export interface CreateRestManagerOptions { token: string; customUrl?: string; maxRetryCount?: number; version?: number; secretKey?: string; debug?: (text: string) => unknown; checkRateLimits?: typeof checkRateLimits; cleanupQueues?: typeof cleanupQueues; processQueue?: typeof processQueue; processRateLimitedPaths?: typeof processRateLimitedPaths; processRequestHeaders?: typeof processRequestHeaders; processRequest?: typeof processRequest; createRequestBody?: typeof createRequestBody; runMethod?: typeof runMethod; simplifyUrl?: typeof simplifyUrl; processGlobalQueue?: typeof processGlobalQueue; convertRestError?: typeof convertRestError; sendRequest?: typeof sendRequest; } export type RestManager = ReturnType;