const jose = require('jose'); | |
const jwt = require('jsonwebtoken'); | |
/** | |
* Signs a given payload using either the `jose` library (for Bun runtime) or `jsonwebtoken`. | |
* | |
* @async | |
* @function | |
* @param {Object} options - The options for signing the payload. | |
* @param {Object} options.payload - The payload to be signed. | |
* @param {string} options.secret - The secret key used for signing. | |
* @param {number} options.expirationTime - The expiration time in seconds. | |
* @returns {Promise<string>} Returns a promise that resolves to the signed JWT. | |
* @throws {Error} Throws an error if there's an issue during signing. | |
* | |
* @example | |
* const signedPayload = await signPayload({ | |
* payload: { userId: 123 }, | |
* secret: 'my-secret-key', | |
* expirationTime: 3600 | |
* }); | |
*/ | |
async function signPayload({ payload, secret, expirationTime }) { | |
if (typeof Bun !== 'undefined') { | |
// this code will only run when the file is run with Bun | |
const encodedSecret = new TextEncoder().encode(secret); | |
return await new jose.SignJWT(payload) | |
.setProtectedHeader({ alg: 'HS256' }) | |
.setExpirationTime(expirationTime + 's') | |
.sign(encodedSecret); | |
} | |
return jwt.sign(payload, secret, { expiresIn: expirationTime }); | |
} | |
module.exports = signPayload; | |