UNPKG

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.

137 lines (121 loc) 4.73 kB
'use strict'; var _ = require('lodash'); var objFilter = require('../../../../v1/basics/objFilter.cjs'); var refreshToken$1 = require('../api/refreshToken.cjs'); // @ts-nocheck /** * 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'); * } */ async function refreshToken(req, cfg, existSession) { return new Promise(function (resolve, reject) { // Detect Config if (objFilter.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 ( objFilter.objType(tinyQuery, 'object') && objFilter.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 refreshToken$1({ 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 (objFilter.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!' }); }); } module.exports = refreshToken;