import { Buffer } from "buffer" import { createHmac } from "crypto" const decode = (str: string):string => Buffer.from(str, 'base64').toString('binary'); const encode = (str: string):string => Buffer.from(str, 'binary').toString('base64'); const secret = process.env.JWT_SECRET ? process.env.JWT_SECRET : "" interface tokenData { // eslint-disable-next-line data: any, maxAge: number } export function createToken({data, maxAge}: tokenData) { const tokenData = data tokenData.maxAge = maxAge const header = encode(JSON.stringify({"alg":"HS256", "typ":"jwt"})) const body = encode(JSON.stringify(tokenData)) const signature = createHmac('sha256',secret).update(header + "." + body).digest('hex') return header + "." + body + "." + signature } export function validateToken(token: string) { const rawData = token.split(".") const header = rawData[0] const body = rawData[1] const signature = rawData[2] const calculatedSignature = createHmac('sha256',secret).update(header + "." + body).digest('hex') return signature == calculatedSignature } export function decryptToken(token: string) { const rawData = token.split(".") const body = rawData[1] return JSON.parse(decode(body)) }