@wuwei-labs/srsly
Version:
TypeScript SDK for SRSLY
120 lines • 4.35 kB
JavaScript
;
/**
* @purpose Duration parameter conversion utilities
*
* Converts user-friendly duration formats to seconds for use with Solana programs.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertDuration = convertDuration;
exports.validateDuration = validateDuration;
exports.formatDuration = formatDuration;
/**
* 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
* ```
*/
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
*/
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"
* ```
*/
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