mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-05-06 21:34:28 -05:00
* Initial * CSS lint * Test CI * Add 1v1, 2v2, and 3v3 Tags (#1771) * Initial * CSS lint * Test CI * Rename step --------- Co-authored-by: xi <104683822+ximk@users.noreply.github.com>
40 lines
997 B
TypeScript
40 lines
997 B
TypeScript
import { cachified } from "@epic-web/cachified";
|
|
import { cache } from "~/utils/cache.server";
|
|
import { tokenResponseSchema } from "./schemas";
|
|
import { getTwitchEnvVars } from "./utils";
|
|
|
|
async function getFreshToken() {
|
|
const { TWITCH_CLIENT_ID, TWITCH_CLIENT_SECRET } = getTwitchEnvVars();
|
|
|
|
const res = await fetch(
|
|
`https://id.twitch.tv/oauth2/token?client_id=${TWITCH_CLIENT_ID}&client_secret=${TWITCH_CLIENT_SECRET}&grant_type=client_credentials`,
|
|
{ method: "POST" },
|
|
);
|
|
if (!res.ok) {
|
|
throw new Error(
|
|
`Getting Twitch token failed with status code: ${res.status}`,
|
|
);
|
|
}
|
|
|
|
const parsed = tokenResponseSchema.safeParse(await res.json());
|
|
if (!parsed.success) {
|
|
throw new Error("Token response schema validation failed");
|
|
}
|
|
|
|
return parsed.data.access_token;
|
|
}
|
|
|
|
export function getToken() {
|
|
return cachified({
|
|
key: "twitch-token",
|
|
cache,
|
|
getFreshValue() {
|
|
return getFreshToken();
|
|
},
|
|
});
|
|
}
|
|
|
|
export function purgeCachedToken() {
|
|
cache.delete("twitch-token");
|
|
}
|