automate twitch credential refresh

This commit is contained in:
Huskydog9988
2025-03-12 18:34:36 -04:00
parent 7a3b30b012
commit f8ae5b70c0
4 changed files with 40 additions and 3 deletions

View File

@ -29,6 +29,8 @@ export default defineNuxtConfig({
scheduledTasks: {
"0 * * * *": ["cleanup:invitations"],
// every two hours, check if creds need updating
"0 */2 * * *": ["metadata:refreshCredentials"],
},
},

View File

@ -132,6 +132,7 @@ export class IGDBProvider implements MetadataProvider {
private client_id: string;
private client_secret: string;
private access_token: string;
private access_token_expire: moment.Moment;
constructor() {
const client_id = process.env.IGDB_CLIENT_ID;
@ -148,6 +149,7 @@ export class IGDBProvider implements MetadataProvider {
this.client_secret = client_secret;
this.access_token = "";
this.access_token_expire = moment();
this.authWithTwitch();
}
@ -167,9 +169,17 @@ export class IGDBProvider implements MetadataProvider {
console.log(inspect(response.data));
this.access_token = response.data.access_token;
// TODO: handle token expiration, time in seconds is provided, on a long running server
// this WILL be an issue. Can use node timers, or maybe nuxt tasks? problem is
// that idk if tasks can be variable like twitch wants, expires_in is variable
this.access_token_expire = moment().add(
response.data.expires_in,
"seconds"
);
}
public async refreshCredentials() {
const futureTime = moment().add(1, "day");
// if the token expires before this future time (aka soon), refresh
if (this.access_token_expire.isBefore(futureTime)) this.authWithTwitch();
}
private async request<T extends Object>(

View File

@ -51,6 +51,8 @@ export abstract class MetadataProvider {
abstract fetchDeveloper(
params: _FetchDeveloperMetadataParams
): Promise<DeveloperMetadata>;
abstract refreshCredentials?: () => void;
}
export class MetadataHandler {
@ -253,6 +255,17 @@ export class MetadataHandler {
`No metadata provider found a ${databaseName} for "${query}"`
);
}
/**
* Refresh creds for all providers that need it
*/
public refreshCredentials() {
for (const provider of this.providers.values()) {
if (provider.refreshCredentials) {
provider.refreshCredentials();
}
}
}
}
export const metadataHandler = new MetadataHandler();

View File

@ -0,0 +1,12 @@
import { metadataHandler } from "~/server/plugins/metadata";
export default defineTask({
meta: {
name: "metadata:refreshCredentials",
description: "Refresh credentials for metadata providers",
},
run({ payload, context }) {
metadataHandler.refreshCredentials();
return { result: "Success" };
},
});