From c7514a0635b5402bb7fbfc04a9dfce364bc773fb Mon Sep 17 00:00:00 2001 From: Samuel Elliott Date: Mon, 24 Jul 2023 17:10:27 +0100 Subject: [PATCH] Wait before retrying failed requests --- src/cli/presence-server.ts | 11 ++++++++++- src/client/coral.ts | 11 ++++++++++- src/common/users.ts | 11 ++++++++++- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/cli/presence-server.ts b/src/cli/presence-server.ts index c4dffb1..2d4e739 100644 --- a/src/cli/presence-server.ts +++ b/src/cli/presence-server.ts @@ -227,6 +227,7 @@ abstract class SplatNet3User { fest_vote_status: GraphQLSuccessResponse | null = null; promise = new Map>(); + delay_retry_after_error_until: number | null = null; updated = { friends: Date.now(), @@ -235,6 +236,8 @@ abstract class SplatNet3User { current_fest: null as number | null, fest_vote_status: null as number | null, }; + + delay_retry_after_error = 5 * 1000; // 5 seconds update_interval = 10 * 1000; // 10 seconds update_interval_schedules = 60 * 60 * 1000; // 60 minutes update_interval_fest_voting_status: number | null = null; // 10 seconds @@ -245,10 +248,16 @@ abstract class SplatNet3User { protected async update(key: keyof SplatNet3User['updated'], callback: () => Promise, ttl: number) { if (((this.updated[key] ?? 0) + ttl) < Date.now()) { - const promise = this.promise.get(key) ?? callback.call(null).then(() => { + const promise = this.promise.get(key) ?? Promise.resolve().then(() => { + const delay_retry = (this.delay_retry_after_error_until ?? 0) - Date.now(); + + return delay_retry > 0 ? new Promise(rs => setTimeout(rs, delay_retry)) : null; + }).then(() => callback.call(null)).then(() => { this.updated[key] = Date.now(); + this.delay_retry_after_error_until = null; this.promise.delete(key); }).catch(err => { + this.delay_retry_after_error_until = Date.now() + this.delay_retry_after_error; this.promise.delete(key); throw err; }); diff --git a/src/client/coral.ts b/src/client/coral.ts index da2fd9d..2dc1bae 100644 --- a/src/client/coral.ts +++ b/src/client/coral.ts @@ -22,6 +22,7 @@ export default class Coral { expires_at = Date.now() + (2 * 60 * 60 * 1000); promise = new Map>(); + delay_retry_after_error_until: number | null = null; updated = { announcements: null as number | null, @@ -29,6 +30,8 @@ export default class Coral { webservices: null as number | null, active_event: null as number | null, }; + + delay_retry_after_error = 5 * 1000; // 5 seconds update_interval = 10 * 1000; // 10 seconds update_interval_announcements = 30 * 60 * 1000; // 30 minutes @@ -50,10 +53,16 @@ export default class Coral { private update(key: keyof Coral['updated'], callback: () => Promise, ttl: number) { if (((this.updated[key] ?? 0) + ttl) < Date.now()) { - const promise = this.promise.get(key) ?? Promise.resolve().then(() => callback.call(null)).then(() => { + const promise = this.promise.get(key) ?? Promise.resolve().then(() => { + const delay_retry = (this.delay_retry_after_error_until ?? 0) - Date.now(); + + return delay_retry > 0 ? new Promise(rs => setTimeout(rs, delay_retry)) : null; + }).then(() => callback.call(null)).then(() => { this.updated[key] = Date.now(); + this.delay_retry_after_error_until = null; this.promise.delete(key); }).catch(err => { + this.delay_retry_after_error_until = Date.now() + this.delay_retry_after_error; this.promise.delete(key); throw err; }); diff --git a/src/common/users.ts b/src/common/users.ts index 4ec9c5a..fbaa830 100644 --- a/src/common/users.ts +++ b/src/common/users.ts @@ -98,6 +98,7 @@ export class CoralUser implements CoralU expires_at = Infinity; promise = new Map>(); + delay_retry_after_error_until: number | null = null; updated = { announcements: Date.now(), @@ -105,6 +106,8 @@ export class CoralUser implements CoralU webservices: Date.now(), active_event: Date.now(), }; + + delay_retry_after_error = 5 * 1000; // 5 seconds update_interval = 10 * 1000; // 10 seconds update_interval_announcements = 30 * 60 * 1000; // 30 minutes @@ -121,10 +124,16 @@ export class CoralUser implements CoralU private async update(key: keyof CoralUser['updated'], callback: () => Promise, ttl: number) { if ((this.updated[key] + ttl) < Date.now()) { - const promise = this.promise.get(key) ?? callback.call(null).then(() => { + const promise = this.promise.get(key) ?? Promise.resolve().then(() => { + const delay_retry = (this.delay_retry_after_error_until ?? 0) - Date.now(); + + return delay_retry > 0 ? new Promise(rs => setTimeout(rs, delay_retry)) : null; + }).then(() => callback.call(null)).then(() => { this.updated[key] = Date.now(); + this.delay_retry_after_error_until = null; this.promise.delete(key); }).catch(err => { + this.delay_retry_after_error_until = Date.now() + this.delay_retry_after_error; this.promise.delete(key); throw err; });