mirror of
https://github.com/misenhower/splatoon3.ink.git
synced 2026-03-21 17:54:13 -05:00
76 lines
1.9 KiB
JavaScript
76 lines
1.9 KiB
JavaScript
import CoralApi from 'nxapi/coral';
|
|
import { addUserAgent } from "nxapi";
|
|
import ValueCache from '../common/ValueCache.mjs';
|
|
|
|
let _nxapiInitialized = false;
|
|
|
|
function initializeNxapi() {
|
|
if (!_nxapiInitialized) {
|
|
addUserAgent(process.env.USER_AGENT);
|
|
}
|
|
|
|
_nxapiInitialized = true;
|
|
}
|
|
|
|
export default class NsoClient
|
|
{
|
|
constructor(nintendoToken = null) {
|
|
initializeNxapi();
|
|
|
|
this.nintendoToken = nintendoToken || process.env.NINTENDO_TOKEN;
|
|
this.coralCache = new ValueCache('coral');
|
|
}
|
|
|
|
_calculateCacheExpiry(expiresIn) {
|
|
let expires = Date.now() + expiresIn * 1000;
|
|
|
|
// Expire 5min early to make sure we have time to execute requests
|
|
return expires - 5 * 60 * 1000;
|
|
}
|
|
|
|
async getCoralApi() {
|
|
let data = await this.coralCache.getData();
|
|
|
|
if (!data) {
|
|
data = await this._createCoralSession();
|
|
}
|
|
|
|
return CoralApi.createWithSavedToken(data);
|
|
}
|
|
|
|
async _createCoralSession() {
|
|
console.debug('Creating Coral session');
|
|
let { data } = await CoralApi.createWithSessionToken(this.nintendoToken);
|
|
|
|
let expires = this._calculateCacheExpiry(data.credential.expiresIn);
|
|
console.debug(`Caching Coral session until: ${expires}`);
|
|
await this.coralCache.setData(data, expires);
|
|
|
|
return data;
|
|
}
|
|
|
|
async getWebServiceToken(id) {
|
|
let tokenCache = new ValueCache(`webservicetoken.${id}`);
|
|
let token = await tokenCache.getData();
|
|
|
|
if (!token) {
|
|
token = await this._createWebServiceToken(id, tokenCache);
|
|
}
|
|
|
|
return token.accessToken;
|
|
}
|
|
|
|
async _createWebServiceToken(id, tokenCache) {
|
|
let coral = await this.getCoralApi();
|
|
|
|
console.debug(`Creating web service token for ID ${id}`);
|
|
let { result } = await coral.getWebServiceToken(id);
|
|
|
|
let expires = this._calculateCacheExpiry(result.expiresIn);
|
|
console.debug(`Caching web service token for ID ${id} until: ${expires}`);
|
|
await tokenCache.setData(result, expires);
|
|
|
|
return result;
|
|
}
|
|
}
|