automate twitch credential refresh

This commit is contained in:
Huskydog9988
2025-03-12 18:34:36 -04:00
parent 2cf8b72cef
commit bb634cb90b
4 changed files with 40 additions and 3 deletions
+2
View File
@@ -29,6 +29,8 @@ export default defineNuxtConfig({
scheduledTasks: { scheduledTasks: {
"0 * * * *": ["cleanup:invitations"], "0 * * * *": ["cleanup:invitations"],
// every two hours, check if creds need updating
"0 */2 * * *": ["metadata:refreshCredentials"],
}, },
}, },
+13 -3
View File
@@ -132,6 +132,7 @@ export class IGDBProvider implements MetadataProvider {
private client_id: string; private client_id: string;
private client_secret: string; private client_secret: string;
private access_token: string; private access_token: string;
private access_token_expire: moment.Moment;
constructor() { constructor() {
const client_id = process.env.IGDB_CLIENT_ID; const client_id = process.env.IGDB_CLIENT_ID;
@@ -148,6 +149,7 @@ export class IGDBProvider implements MetadataProvider {
this.client_secret = client_secret; this.client_secret = client_secret;
this.access_token = ""; this.access_token = "";
this.access_token_expire = moment();
this.authWithTwitch(); this.authWithTwitch();
} }
@@ -167,9 +169,17 @@ export class IGDBProvider implements MetadataProvider {
console.log(inspect(response.data)); console.log(inspect(response.data));
this.access_token = response.data.access_token; this.access_token = response.data.access_token;
// TODO: handle token expiration, time in seconds is provided, on a long running server this.access_token_expire = moment().add(
// this WILL be an issue. Can use node timers, or maybe nuxt tasks? problem is response.data.expires_in,
// that idk if tasks can be variable like twitch wants, expires_in is variable "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>( private async request<T extends Object>(
+13
View File
@@ -51,6 +51,8 @@ export abstract class MetadataProvider {
abstract fetchDeveloper( abstract fetchDeveloper(
params: _FetchDeveloperMetadataParams params: _FetchDeveloperMetadataParams
): Promise<DeveloperMetadata>; ): Promise<DeveloperMetadata>;
abstract refreshCredentials?: () => void;
} }
export class MetadataHandler { export class MetadataHandler {
@@ -253,6 +255,17 @@ export class MetadataHandler {
`No metadata provider found a ${databaseName} for "${query}"` `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(); export const metadataHandler = new MetadataHandler();
@@ -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" };
},
});