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} 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;