tiny-essentials
Version:
Collection of small, essential scripts designed to be used across various projects. These simple utilities are crafted for speed, ease of use, and versatility.
123 lines (122 loc) • 5.58 kB
JavaScript
// @ts-nocheck
import _ from 'lodash';
import objType from '../../../get/objType.mjs';
import refreshTokenApi from '../api/refreshToken.mjs';
/**
* Refreshes the Discord token using the provided refresh token.
*
* @async
* @function refreshToken
* @param {Record<string, any>} req - The request object containing query parameters and csrfToken.
* @param {Record<string, any>} cfg - The configuration object containing auth and state configurations.
* @param {boolean} existSession - A flag indicating if the user session exists.
*
* @returns {Promise<Record<string, any>>} Resolves to an object containing the status of the refresh and the new token data, or rejects with an error object.
*
* @throws {Record<string, any>} Rejects with an error object containing the following properties:
* - `code` {number} The error code (e.g., 401 for invalid CSRF token, 500 for server errors).
* - `message` {string} The error message describing the issue.
*
* @example
* const result = await refreshToken(req, cfg, existSession);
* if (result.refreshed) {
* console.log('Token refreshed:', result.tokenRequest);
* } else {
* console.log('Token refresh failed');
* }
*/
export default async function refreshToken(req, cfg, existSession) {
return new Promise(function (resolve, reject) {
// Detect Config
if (objType(cfg, 'object')) {
// Create Settings
const tinyCfg = _.defaultsDeep({}, cfg.auth, {
redirect: 'http://localhost/redirect',
discordScope: [],
client_id: '',
client_secret: '',
});
// Check Session
if (typeof tinyCfg.csrfToken !== 'string' ||
tinyCfg.csrfToken.length < 1 ||
(typeof req.csrfToken.now.value === 'string' &&
req.csrfToken.now.value === tinyCfg.csrfToken)) {
// Prepare more settings
const tinyQuery = _.defaultsDeep({}, cfg.auth, {
redirect: 'redirect',
});
const tinyState = _.defaultsDeep({}, cfg.state, {
redirect: '',
});
// Result
const result = { refreshed: false };
// Prepare Final Redirect
result.redirect = '/';
// Redirect
if (typeof tinyState.redirect === 'string' && tinyState.redirect.length > 0) {
if (tinyState.redirect.startsWith('/'))
result.redirect = tinyState.redirect.substring(1);
else
result.redirect = tinyState.redirect;
}
// Get Query
else if (objType(tinyQuery, 'object') &&
objType(req.query, 'object') &&
typeof tinyQuery.redirect === 'string' &&
typeof req.query[tinyQuery.redirect] === 'string') {
if (req.query[tinyQuery.redirect].startsWith('/'))
result.redirect = req.query[tinyQuery.redirect].substring(1);
else
result.redirect = req.query[tinyQuery.redirect];
}
// Exist Session
if (existSession) {
if ((typeof cfg.refresh_token === 'string' && cfg.refresh_token.length > 0) ||
(typeof cfg.refresh_token === 'number' && !isNaN(cfg.refresh_token))) {
// Discord Token
refreshTokenApi({
client_id: tinyCfg.client_id,
client_secret: tinyCfg.client_secret,
refresh_token: cfg.refresh_token,
redirect_uri: tinyCfg.redirect,
scope: tinyCfg.discordScope.join(' '),
})
// Success
.then((json) => {
// Valid Json Data
if (objType(json, 'object')) {
// Check Token
if (typeof json.access_token === 'string' ||
typeof json.access_token === 'number') {
// Token
result.refreshed = true;
result.tokenRequest = json;
// Return Result
resolve(result);
}
// Nope
else
reject({ code: 500, message: 'Invalid User Token Data!' });
}
// Nope
else
reject({ code: 500, message: 'Invalid JSON Token Data!' });
})
// Fail
.catch(reject);
}
// Nope
else
reject({ code: 401, message: 'Invalid Refresh Token Data!' });
}
else
resolve(result);
}
else
reject({ code: 401, message: 'Incorrect csrfToken!' });
}
// Nope
else
reject({ code: 500, message: 'Invalid Config Values!' });
});
}