From 3f96cc43a04581fed33067a4712abbc56ee0a8af Mon Sep 17 00:00:00 2001 From: Daryl Ronningen Date: Wed, 7 Jul 2021 12:49:35 -0500 Subject: [PATCH] fix(api): fix int overflow --- src/api/apiHandler.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/api/apiHandler.ts b/src/api/apiHandler.ts index 00e5022..a487975 100644 --- a/src/api/apiHandler.ts +++ b/src/api/apiHandler.ts @@ -9,6 +9,19 @@ import type { ApiManager } from './apiManager'; import type { Client } from '../client/client'; import type { IMakeRequestOptions, IRouteIdentifier } from '../utils/types'; +function calculateReset(reset: number, resetAfter: number, serverDate: number): number { + // Use direct reset time when available, server date becomes irrelevant in this case + if (resetAfter) { + return Date.now() + Number(resetAfter) * 1000; + } + return new Date(Number(reset) * 1000).getTime() - getAPIOffset(serverDate); +} + +function getAPIOffset(serverDate: number): number { + return new Date(serverDate).getTime() - Date.now(); +} + + export class ApiHandler { public client: Client; public hash: string; @@ -32,10 +45,6 @@ export class ApiHandler { this.majorParameter = majorParameter; this.manager = manager; this.queue = new AsyncQueue(); - // this.queue = queue(async (task: { routeId: IRouteIdentifier, requestOptions: IMakeRequestOptions; }, callback) => { - // if (this.limited) await sleep(this.timeToReset); - // callback(await this.makeRequest(task.routeId, task.requestOptions)); - // }); this.remaining = -1; this.reset = -1; } @@ -77,16 +86,14 @@ export class ApiHandler { const serverDate = res.headers.get('date'); if (!resetAfter && options.path.includes('reactions')) { - this.reset = new Date(Number(serverDate)).getTime() - (new Date(Number(serverDate)).getTime() - Date.now()) + 250; + this.reset = new Date(Number(serverDate)).getTime() - getAPIOffset(Number(serverDate)) + 250; } let retryAfter = 0; this.limit = limit !== null ? Number(limit) : Number.MAX_VALUE; this.remaining = remaining !== null ? Number(remaining) : Number.MAX_VALUE; - this.reset = reset || resetAfter - ? Number(reset) * 1000 + Date.now() + this.client.options.api.offset - : Date.now(); + this.reset = reset || resetAfter ? calculateReset(Number(reset), Number(resetAfter), Number(serverDate)) : Date.now(); if (retry !== null) retryAfter = retry ? Number(retry) * 1000 : -1; @@ -105,7 +112,7 @@ export class ApiHandler { if (res.ok) { return res.json() as unknown as T; } else if (res.status === 429) { - await sleep(retryAfter); + await sleep(this.timeToReset); return this.makeRequest(routeId, options, retries++); } else { throw new Error('An unknown status code was returned!');