import epoch from '../lib/epoch.js'; import secs from '../lib/secs.js'; import isObject from '../lib/is_object.js'; import { encoder } from '../lib/buffer_utils.js'; function validateInput(label, input) { if (!Number.isFinite(input)) { throw new TypeError(`Invalid ${label} input`); } return input; } export class ProduceJWT { #payload; constructor(payload) { if (!isObject(payload)) { throw new TypeError('JWT Claims Set MUST be an object'); } this.#payload = structuredClone(payload); } data() { return encoder.encode(JSON.stringify(this.#payload)); } get iss() { return this.#payload.iss; } set iss(value) { this.#payload.iss = value; } get sub() { return this.#payload.sub; } set sub(value) { this.#payload.sub = value; } get aud() { return this.#payload.aud; } set aud(value) { this.#payload.aud = value; } get jti() { return this.#payload.jti; } set jti(value) { this.#payload.jti = value; } get nbf() { return this.#payload.nbf; } set nbf(value) { if (typeof value === 'number') { this.#payload.nbf = validateInput('setNotBefore', value); } else if (value instanceof Date) { this.#payload.nbf = validateInput('setNotBefore', epoch(value)); } else { this.#payload.nbf = epoch(new Date()) + secs(value); } } get exp() { return this.#payload.exp; } set exp(value) { if (typeof value === 'number') { this.#payload.exp = validateInput('setExpirationTime', value); } else if (value instanceof Date) { this.#payload.exp = validateInput('setExpirationTime', epoch(value)); } else { this.#payload.exp = epoch(new Date()) + secs(value); } } get iat() { return this.#payload.iat; } set iat(value) { if (typeof value === 'undefined') { this.#payload.iat = epoch(new Date()); } else if (value instanceof Date) { this.#payload.iat = validateInput('setIssuedAt', epoch(value)); } else if (typeof value === 'string') { this.#payload.iat = validateInput('setIssuedAt', epoch(new Date()) + secs(value)); } else { this.#payload.iat = validateInput('setIssuedAt', value); } } }