UNPKG

convex

Version:

Client for the Convex Cloud

81 lines (80 loc) 2.44 kB
"use strict"; const PARSE_ERROR_MESSAGE = `Supported formats: "none" \u2014 no expiration "in 7 days" \u2014 relative (minutes, hours, days) "2026-04-01T00:00:00Z" \u2014 UTC datetime "1711828382" \u2014 Unix timestamp (seconds) "1711828382000" \u2014 Unix timestamp (milliseconds)`; const UNIT_MS = { minute: 60 * 1e3, hour: 60 * 60 * 1e3, day: 24 * 60 * 60 * 1e3 }; export function parseExpiration(input) { const trimmed = input.trim(); if (trimmed.toLowerCase() === "none") { return { kind: "none" }; } if (/^\d+$/.test(trimmed)) { const n = Number(trimmed); return { kind: "absolute", timestampMs: n < 1e12 ? n * 1e3 : n // already milliseconds }; } if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/.test(trimmed)) { const date = new Date(trimmed); if (isNaN(date.getTime())) { return { kind: "error", message: `Invalid UTC datetime: "${trimmed}". ${PARSE_ERROR_MESSAGE}` }; } return { kind: "absolute", timestampMs: date.getTime() }; } const relativeMatch = trimmed.match(/^in\s+(\d+)\s+(minute|hour|day)s?$/i); if (relativeMatch) { const amount = Number(relativeMatch[1]); const unit = relativeMatch[2].toLowerCase(); return { kind: "relative", amount, unit }; } return { kind: "error", message: `Invalid expiration format: "${trimmed}". ${PARSE_ERROR_MESSAGE}` }; } export function resolveExpiration(parsed, now) { switch (parsed.kind) { case "none": return null; case "absolute": return parsed.timestampMs; case "relative": { const base = now ?? Date.now(); return base + parsed.amount * UNIT_MS[parsed.unit]; } } } export function validateExpiration(timestampMs, now) { const base = now ?? Date.now(); const thirtyMinutes = 30 * 60 * 1e3; const oneYear = 365 * 24 * 60 * 60 * 1e3; if (timestampMs <= base) { return { kind: "error", message: "Expiration must be in the future." }; } if (timestampMs - base < thirtyMinutes) { return { kind: "error", message: "Expiration must be at least 30 minutes from now." }; } if (timestampMs - base > oneYear) { return { kind: "error", message: "Expiration must be at most 1 year from now." }; } return { kind: "success" }; } //# sourceMappingURL=expiration.js.map