mirror of
https://github.com/Drop-OSS/drop.git
synced 2025-11-09 20:12:10 +10:00
automate twitch credential refresh
This commit is contained in:
@ -29,6 +29,8 @@ export default defineNuxtConfig({
|
||||
|
||||
scheduledTasks: {
|
||||
"0 * * * *": ["cleanup:invitations"],
|
||||
// every two hours, check if creds need updating
|
||||
"0 */2 * * *": ["metadata:refreshCredentials"],
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
@ -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>(
|
||||
|
||||
@ -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();
|
||||
|
||||
12
server/tasks/metadata/refreshCredentials.ts
Normal file
12
server/tasks/metadata/refreshCredentials.ts
Normal 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" };
|
||||
},
|
||||
});
|
||||
Reference in New Issue
Block a user