diff --git a/app/cron.mjs b/app/cron.mjs index 3fe0dc1..651322b 100644 --- a/app/cron.mjs +++ b/app/cron.mjs @@ -1,6 +1,6 @@ import { CronJob } from "cron"; -import { sendTweets } from "./twitter/index.mjs"; +import { warmCache } from "./splatnet/index.mjs"; export default function() { - new CronJob('1 16 * * *', sendTweets, null, true); + new CronJob('5,20,35,50 * * * *', warmCache, null, true); } diff --git a/app/splatnet/NsoClient.mjs b/app/splatnet/NsoClient.mjs index 9a6aed6..bf3b272 100644 --- a/app/splatnet/NsoClient.mjs +++ b/app/splatnet/NsoClient.mjs @@ -39,8 +39,10 @@ export default class NsoClient return new ValueCache(`${this.cachePrefix}.coral`); } - async getCoralApi() { - let data = await this._getCoralCache().getData(); + async getCoralApi(useCache = true) { + let data = useCache + ? await this._getCoralCache().getData() + : null; if (!data) { data = await this._createCoralSession(); @@ -66,9 +68,11 @@ export default class NsoClient return new ValueCache(`${this.cachePrefix}.webservicetoken.${id}`); } - async getWebServiceToken(id) { + async getWebServiceToken(id, useCache = true) { let tokenCache = this._getWebServiceTokenCache(id); - let token = await tokenCache.getData(); + let token = useCache + ? await tokenCache.getData() + : null; if (!token) { token = await this._createWebServiceToken(id, tokenCache); diff --git a/app/splatnet/SplatNet3Client.mjs b/app/splatnet/SplatNet3Client.mjs index 45ae845..703454b 100644 --- a/app/splatnet/SplatNet3Client.mjs +++ b/app/splatnet/SplatNet3Client.mjs @@ -1,11 +1,12 @@ import ValueCache from "../common/ValueCache.mjs"; import NsoClient from "./NsoClient.mjs"; +export const SPLATNET3_WEB_SERVICE_ID = '4834290508791808'; + export default class SplatNet3Client { baseUrl = 'https://api.lp1.av5ja.srv.nintendo.net'; webViewVersion = '1.0.0-5e2bcdfb'; - webServiceId = '4834290508791808'; bulletToken = null; constructor(nsoClient = null) { @@ -35,12 +36,15 @@ export default class SplatNet3Client } } - async getBulletToken() { + async getBulletToken(useCache = true) { let bulletTokenCache = new ValueCache(`${this.nsoClient.cachePrefix}.bulletToken`); - let bulletToken = await bulletTokenCache.getData(); + + let bulletToken = useCache + ? await bulletTokenCache.getData() + : null; if (!bulletToken) { - let webServiceToken = await this.nsoClient.getWebServiceToken(this.webServiceId); + let webServiceToken = await this.nsoClient.getWebServiceToken(SPLATNET3_WEB_SERVICE_ID); bulletToken = await this._createBulletToken(webServiceToken, bulletTokenCache); } diff --git a/app/splatnet/index.mjs b/app/splatnet/index.mjs new file mode 100644 index 0000000..54ddf86 --- /dev/null +++ b/app/splatnet/index.mjs @@ -0,0 +1,27 @@ +import NsoClient from "./NsoClient.mjs"; +import SplatNet3Client, { SPLATNET3_WEB_SERVICE_ID } from "./SplatNet3Client.mjs"; + +/** + * Cache Warming + * + * This helps ensure we have reliable access to the SplatNet 3 API, + * even if e.g. the imink API has intermittent downtime. + */ +export async function warmCache() { + console.debug('Warming caches...'); + + let nso = new NsoClient; + let splatnet = new SplatNet3Client; + + await safe(() => nso.getCoralApi(false)); + await safe(() => nso.getWebServiceToken(SPLATNET3_WEB_SERVICE_ID, false)); + await safe(() => splatnet.getBulletToken(false)); +} + +async function safe(callable) { + try { + await callable(); + } catch (e) { + console.error(e); + } +}