fix: readEnvVariable throws error when variable is string

This commit is contained in:
2024-09-10 22:17:40 -04:00
parent a421fe66d9
commit 56b2677eaf
4 changed files with 53 additions and 13 deletions

View File

@@ -43,16 +43,19 @@ app.post(
`Internal new episode route, aniListId: ${aniListId}, episodeNumber: ${episodeNumber}`, `Internal new episode route, aniListId: ${aniListId}, episodeNumber: ${episodeNumber}`,
); );
// if (!(await verifyQstashHeader(env<Env, typeof c>(c, "workerd"), c.req))) { if (!(await verifyQstashHeader(env<Env, typeof c>(c, "workerd"), c.req))) {
// return c.json(ErrorResponse, { status: 401 }); return c.json(ErrorResponse, { status: 401 });
// } }
const domain = getCurrentDomain(c.req); const domain = getCurrentDomain(c.req);
const { success, result: fetchEpisodesResult } = await fetch( const { success, result: fetchEpisodesResult } = await fetch(
`${domain}/episodes/${aniListId}`, `${domain}/episodes/${aniListId}`,
).then((res) => res.json<EpisodesResponseSchema>()); ).then((res) => res.json<EpisodesResponseSchema>());
if (!success) { if (!success) {
await scheduleRetry(readEnvVariable(c.env, "QSTASH_TOKEN"), c.req); await scheduleRetry(
readEnvVariable(env<Env, typeof c>(c, "workerd"), "QSTASH_TOKEN"),
c.req,
);
return c.json(ErrorResponse, { status: 500 }); return c.json(ErrorResponse, { status: 500 });
} }
@@ -61,7 +64,10 @@ app.post(
(episode) => episode.number === episodeNumber, (episode) => episode.number === episodeNumber,
); );
if (!episode) { if (!episode) {
await scheduleRetry(readEnvVariable(c.env, "QSTASH_TOKEN"), c.req); await scheduleRetry(
readEnvVariable(env<Env, typeof c>(c, "workerd"), "QSTASH_TOKEN"),
c.req,
);
return c.json(ErrorResponse, { status: 404 }); return c.json(ErrorResponse, { status: 404 });
} }
@@ -79,7 +85,10 @@ app.post(
}, },
).then((res) => res.json<FetchUrlResponse>()); ).then((res) => res.json<FetchUrlResponse>());
if (!fetchUrlSuccess) { if (!fetchUrlSuccess) {
await scheduleRetry(readEnvVariable(c.env, "QSTASH_TOKEN"), c.req); await scheduleRetry(
readEnvVariable(env<Env, typeof c>(c, "workerd"), "QSTASH_TOKEN"),
c.req,
);
return c.json(ErrorResponse, { status: 500 }); return c.json(ErrorResponse, { status: 500 });
} }
@@ -92,7 +101,10 @@ app.post(
tokens.map(async (token) => { tokens.map(async (token) => {
return sendFcmMessage( return sendFcmMessage(
mapKeys( mapKeys(
readEnvVariable<AdminSdkCredentials>(c.env, "ADMIN_SDK_JSON"), readEnvVariable<AdminSdkCredentials>(
env<Env, typeof c>(c, "workerd"),
"ADMIN_SDK_JSON",
),
(_, key) => changeStringCase(key, Case.snake_case, Case.camelCase), (_, key) => changeStringCase(key, Case.snake_case, Case.camelCase),
) as unknown as AdminSdkCredentials, ) as unknown as AdminSdkCredentials,
{ {

View File

@@ -3,12 +3,29 @@ import { describe, expect, it } from "bun:test";
import { readEnvVariable } from "./readEnvVariable"; import { readEnvVariable } from "./readEnvVariable";
describe("readEnvVariable", () => { describe("readEnvVariable", () => {
it("env & variable defined, returns env value", () => { describe("env & variable defined", () => {
it("returns boolean", () => {
expect( expect(
readEnvVariable<boolean>({ ENABLE_ANIFY: "false" }, "ENABLE_ANIFY"), readEnvVariable<boolean>({ ENABLE_ANIFY: "false" }, "ENABLE_ANIFY"),
).toBe(false); ).toBe(false);
}); });
it("returns string", () => {
expect(
readEnvVariable<string>(
{ QSTASH_TOKEN: "ehf73g8gyriuvnieojwicbg83hc" },
"QSTASH_TOKEN",
),
).toBe("ehf73g8gyriuvnieojwicbg83hc");
});
it("returns number", () => {
expect(
readEnvVariable<number>({ NUM_RETRIES: "123" }, "NUM_RETRIES"),
).toBe(123);
});
});
it("env defined but variable not defined, returns default value", () => { it("env defined but variable not defined, returns default value", () => {
expect(readEnvVariable<boolean>({ FOO: "bar" }, "ENABLE_ANIFY")).toBe(true); expect(readEnvVariable<boolean>({ FOO: "bar" }, "ENABLE_ANIFY")).toBe(true);
}); });

View File

@@ -11,5 +11,13 @@ export function readEnvVariable<T>(
env: Bindings | undefined, env: Bindings | undefined,
envVariable: EnvVariable, envVariable: EnvVariable,
): T { ): T {
try {
return JSON.parse(env?.[envVariable] ?? null) ?? defaultValues[envVariable]; return JSON.parse(env?.[envVariable] ?? null) ?? defaultValues[envVariable];
} catch (error) {
if (error instanceof SyntaxError) {
return env![envVariable];
}
throw error;
}
} }

View File

@@ -9,6 +9,10 @@ const args = new Set(process.argv.slice(2));
const isDevMode = args.has("--dev"); const isDevMode = args.has("--dev");
const shouldTriggerLatestEpisode = args.has("--trigger-latest-episode"); const shouldTriggerLatestEpisode = args.has("--trigger-latest-episode");
if (isDevMode) {
console.log("Running in dev mode");
}
await getTitleIds().then((titles) => await getTitleIds().then((titles) =>
Promise.all( Promise.all(
titles.map((title) => titles.map((title) =>
@@ -89,7 +93,6 @@ async function triggerNextEpisodeRoute(titleId: number) {
episodeNumber: mostRecentEpisodeNumber, episodeNumber: mostRecentEpisodeNumber,
}, },
retries: 0, retries: 0,
contentBasedDeduplication: true,
}) })
.then(() => true) .then(() => true)
.catch((error) => { .catch((error) => {