UNPKG

@wuwei-labs/srsly

Version:
115 lines 4.17 kB
/** * @purpose Duration parameter conversion utilities * * Converts user-friendly duration formats to seconds for use with Solana programs. */ /** * Time unit conversion constants */ const SECONDS_PER_MINUTE = 60; const SECONDS_PER_HOUR = 3600; const SECONDS_PER_DAY = 86400; const SECONDS_PER_WEEK = 604800; const SECONDS_PER_MONTH = 2678400; // 31 days /** * Convert duration parameter to seconds * * @param duration - Duration in any supported format * @returns Duration in seconds * @throws Error if duration is invalid or negative * * @example * ```typescript * convertDuration(3600) // 3600 seconds * convertDuration({ hours: 1 }) // 3600 seconds * convertDuration({ days: 7 }) // 604800 seconds * convertDuration({ weeks: 2 }) // 1209600 seconds * ``` */ export function convertDuration(duration) { // Handle plain number (seconds) if (typeof duration === 'number') { if (duration < 0) { throw new Error(`Duration must be positive, got ${duration}`); } return Math.floor(duration); } // Handle object format if (typeof duration === 'object' && duration !== null) { if ('seconds' in duration && duration.seconds !== undefined) { return Math.floor(duration.seconds); } if ('minutes' in duration && duration.minutes !== undefined) { return Math.floor(duration.minutes * SECONDS_PER_MINUTE); } if ('hours' in duration && duration.hours !== undefined) { return Math.floor(duration.hours * SECONDS_PER_HOUR); } if ('days' in duration && duration.days !== undefined) { return Math.floor(duration.days * SECONDS_PER_DAY); } if ('weeks' in duration && duration.weeks !== undefined) { return Math.floor(duration.weeks * SECONDS_PER_WEEK); } if ('months' in duration && duration.months !== undefined) { return Math.floor(duration.months * SECONDS_PER_MONTH); } } throw new Error(`Invalid duration format. Expected number or object with time unit. ` + `Got: ${JSON.stringify(duration)}`); } /** * Validate duration limits * * Ensures duration is within reasonable bounds for rental contracts. * * @param durationSeconds - Duration in seconds * @param min - Minimum allowed duration (default: 1 hour) * @param max - Maximum allowed duration (default: 1 year) * @throws Error if duration is out of bounds */ export function validateDuration(durationSeconds, min = SECONDS_PER_HOUR, max = SECONDS_PER_DAY * 365) { if (durationSeconds < min) { throw new Error(`Duration too short: ${durationSeconds}s. Minimum: ${min}s (${formatDuration(min)})`); } if (durationSeconds > max) { throw new Error(`Duration too long: ${durationSeconds}s. Maximum: ${max}s (${formatDuration(max)})`); } } /** * Format duration in seconds to human-readable string * * @param seconds - Duration in seconds * @returns Human-readable duration string * * @example * ```typescript * formatDuration(3600) // "1 hour" * formatDuration(86400) // "1 day" * formatDuration(7200) // "2 hours" * ``` */ export function formatDuration(seconds) { if (seconds >= SECONDS_PER_MONTH) { const months = Math.floor(seconds / SECONDS_PER_MONTH); return `${months} month${months > 1 ? 's' : ''}`; } if (seconds >= SECONDS_PER_WEEK) { const weeks = Math.floor(seconds / SECONDS_PER_WEEK); return `${weeks} week${weeks > 1 ? 's' : ''}`; } if (seconds >= SECONDS_PER_DAY) { const days = Math.floor(seconds / SECONDS_PER_DAY); return `${days} day${days > 1 ? 's' : ''}`; } if (seconds >= SECONDS_PER_HOUR) { const hours = Math.floor(seconds / SECONDS_PER_HOUR); return `${hours} hour${hours > 1 ? 's' : ''}`; } if (seconds >= SECONDS_PER_MINUTE) { const minutes = Math.floor(seconds / SECONDS_PER_MINUTE); return `${minutes} minute${minutes > 1 ? 's' : ''}`; } return `${seconds} second${seconds !== 1 ? 's' : ''}`; } //# sourceMappingURL=duration.js.map