|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export type Deadline = Date | number; |
|
|
|
export function minDeadline(...deadlineList: Deadline[]): Deadline { |
|
let minValue = Infinity; |
|
for (const deadline of deadlineList) { |
|
const deadlineMsecs = |
|
deadline instanceof Date ? deadline.getTime() : deadline; |
|
if (deadlineMsecs < minValue) { |
|
minValue = deadlineMsecs; |
|
} |
|
} |
|
return minValue; |
|
} |
|
|
|
const units: Array<[string, number]> = [ |
|
['m', 1], |
|
['S', 1000], |
|
['M', 60 * 1000], |
|
['H', 60 * 60 * 1000], |
|
]; |
|
|
|
export function getDeadlineTimeoutString(deadline: Deadline) { |
|
const now = new Date().getTime(); |
|
if (deadline instanceof Date) { |
|
deadline = deadline.getTime(); |
|
} |
|
const timeoutMs = Math.max(deadline - now, 0); |
|
for (const [unit, factor] of units) { |
|
const amount = timeoutMs / factor; |
|
if (amount < 1e8) { |
|
return String(Math.ceil(amount)) + unit; |
|
} |
|
} |
|
throw new Error('Deadline is too far in the future'); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const MAX_TIMEOUT_TIME = 2147483647; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
export function getRelativeTimeout(deadline: Deadline) { |
|
const deadlineMs = deadline instanceof Date ? deadline.getTime() : deadline; |
|
const now = new Date().getTime(); |
|
const timeout = deadlineMs - now; |
|
if (timeout < 0) { |
|
return 0; |
|
} else if (timeout > MAX_TIMEOUT_TIME) { |
|
return Infinity; |
|
} else { |
|
return timeout; |
|
} |
|
} |
|
|
|
export function deadlineToString(deadline: Deadline): string { |
|
if (deadline instanceof Date) { |
|
return deadline.toISOString(); |
|
} else { |
|
const dateDeadline = new Date(deadline); |
|
if (Number.isNaN(dateDeadline.getTime())) { |
|
return '' + deadline; |
|
} else { |
|
return dateDeadline.toISOString(); |
|
} |
|
} |
|
} |
|
|