Files
sendou.ink/app/modules/twitch/token.ts
2026-08-21 17:36:48 +03:00

41 lines
1.0 KiB
TypeScript

import { cachified } from "@epic-web/cachified";
import * as v from "valibot";
import { cache } from "~/utils/cache.server";
import { tokenResponseSchema } from "./schemas";
import { getTwitchEnvVars } from "./utils.server";
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 = v.safeParse(tokenResponseSchema, await res.json());
if (!parsed.success) {
throw new Error("Token response schema validation failed");
}
return parsed.output.access_token;
}
export function getToken() {
return cachified({
key: "twitch-token",
cache,
getFreshValue() {
return getFreshToken();
},
});
}
export function purgeCachedToken() {
cache.delete("twitch-token");
}