newmax-utils
Version:
Utils & Libs for Newmax Tech
117 lines (116 loc) • 4.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.refreshToken = exports.verifyToken = exports.signToken = void 0;
const moment_1 = __importDefault(require("moment"));
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
const env_1 = require("../configs/env");
const ApiError_1 = require("../ApiError");
const crypto_1 = require("./crypto");
const typeTime = {
days: 'd',
minutes: 'm',
seconds: 's',
};
const secretKey = env_1.env.JWT_SECRET_KEY || 'secret_key';
const expiresDays = 30;
const healthToken = async (accessToken) => {
const decodedToken = jsonwebtoken_1.default.verify(accessToken, secretKey);
if (!decodedToken || decodedToken instanceof jsonwebtoken_1.default.JsonWebTokenError) {
return false;
}
return true;
};
const signToken = async (data, options) => {
if (!typeTime[options.type]) {
return {
error: {
message: 'This time type is not supported',
description: `Supported types: ${Object.keys(typeTime).join(', ')}`,
},
};
}
try {
const payload = (0, crypto_1.encryptData)(JSON.stringify(data));
const accessToken = jsonwebtoken_1.default.sign({ payload }, secretKey, {
expiresIn: `${options.expiredAt}${typeTime[options.type]}`,
});
const refreshToken = jsonwebtoken_1.default.sign({ payload }, secretKey, {
expiresIn: `${expiresDays}d`,
});
const accessTokenExpired = (0, moment_1.default)().add(options.expiredAt, options.type);
const refreshTokenExpired = (0, moment_1.default)().add(expiresDays, 'days');
return {
data: {
accessToken,
refreshToken,
accessTokenExpired,
refreshTokenExpired,
},
};
}
catch (e) {
return { error: new ApiError_1.ApiError(401, 'Generate accessToken and refreshToken failed') };
}
};
exports.signToken = signToken;
const verifyToken = async (accessToken) => {
try {
const data = jsonwebtoken_1.default.verify(accessToken, secretKey);
return { data };
}
catch (e) {
return { error: new ApiError_1.ApiError(401, 'Verified accessToken expired or invalid') };
}
};
exports.verifyToken = verifyToken;
const refreshToken = async (accessToken, refreshToken, options) => {
if (!typeTime[options.type]) {
throw new ApiError_1.ApiError(400, 'This time type is not supported', {
description: `Supported types: ${Object.keys(typeTime).join(', ')}`,
});
}
try {
let data;
if (!accessToken || !refreshToken) {
throw new ApiError_1.ApiError(400, 'AccessToken and RefreshToken not found');
}
const decodedAccessToken = jsonwebtoken_1.default.decode(accessToken);
const decodedRefreshToken = jsonwebtoken_1.default.decode(refreshToken);
if (!!healthToken(accessToken)) {
const newAccessToken = jsonwebtoken_1.default.sign({ payload: decodedAccessToken.payload }, secretKey, {
expiresIn: `${options.expiredAt}${typeTime[options.type]}`,
});
const newRefreshToken = jsonwebtoken_1.default.sign({ payload: decodedRefreshToken.payload }, secretKey, {
expiresIn: `${expiresDays}d`,
});
const accessTokenExpired = (0, moment_1.default)().add(options.expiredAt, options.type);
const refreshTokenExpired = (0, moment_1.default)().add(expiresDays, 'days');
data = {
status: 'AccessToken and RefreshToken has been updated',
accessToken: newAccessToken,
refreshToken: newRefreshToken,
accessTokenExpired,
refreshTokenExpired,
};
}
else {
const accessTokenExpired = (0, moment_1.default)(decodedAccessToken.exp, 'X').format();
const refreshTokenExpired = (0, moment_1.default)(decodedRefreshToken.exp, 'X').format();
data = {
status: 'AccessToken and RefreshToken is health. Returned is old tokens',
accessToken,
refreshToken,
accessTokenExpired,
refreshTokenExpired,
};
}
return { data };
}
catch (e) {
return new ApiError_1.ApiError(401, 'Generate new accessToken and refreshToken failed');
}
};
exports.refreshToken = refreshToken;