Wait before retrying failed requests

This commit is contained in:
Samuel Elliott 2023-07-24 17:10:27 +01:00
parent cd6f614a99
commit c7514a0635
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
3 changed files with 30 additions and 3 deletions

View File

@ -227,6 +227,7 @@ abstract class SplatNet3User {
fest_vote_status: GraphQLSuccessResponse<DetailVotingStatusResult> | null = null;
promise = new Map<string, Promise<void>>();
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<void>, 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;
});

View File

@ -22,6 +22,7 @@ export default class Coral {
expires_at = Date.now() + (2 * 60 * 60 * 1000);
promise = new Map<string, Promise<void>>();
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<void>, 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;
});

View File

@ -98,6 +98,7 @@ export class CoralUser<T extends CoralApiInterface = CoralApi> implements CoralU
expires_at = Infinity;
promise = new Map<string, Promise<void>>();
delay_retry_after_error_until: number | null = null;
updated = {
announcements: Date.now(),
@ -105,6 +106,8 @@ export class CoralUser<T extends CoralApiInterface = CoralApi> 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<T extends CoralApiInterface = CoralApi> implements CoralU
private async update(key: keyof CoralUser['updated'], callback: () => Promise<void>, 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;
});