wangzhibo
2026-05-09 53418655c061ac26f66058253f39200aced1ab1d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT License.
 */
 
/**
 * Utility functions for managing date and time operations.
 */
 
/**
 * return the current time in Unix time (seconds).
 */
export function nowSeconds(): number {
    // Date.getTime() returns in milliseconds.
    return Math.round(new Date().getTime() / 1000.0);
}
 
/**
 * Converts JS Date object to seconds
 * @param date Date
 */
export function toSecondsFromDate(date: Date): number {
    // Convert date to seconds
    return date.getTime() / 1000;
}
 
/**
 * Convert seconds to JS Date object. Seconds can be in a number or string format or undefined (will still return a date).
 * @param seconds
 */
export function toDateFromSeconds(seconds: number | string | undefined): Date {
    if (seconds) {
        return new Date(Number(seconds) * 1000);
    }
    return new Date();
}
 
/**
 * check if a token is expired based on given UTC time in seconds.
 * @param expiresOn
 */
export function isTokenExpired(expiresOn: string, offset: number): boolean {
    // check for access token expiry
    const expirationSec = Number(expiresOn) || 0;
    const offsetCurrentTimeSec = nowSeconds() + offset;
 
    // If current time + offset is greater than token expiration time, then token is expired.
    return offsetCurrentTimeSec > expirationSec;
}
 
/**
 * Checks if a cache entry is expired based on the last updated time and cache retention days.
 * @param lastUpdatedAt
 * @param cacheRetentionDays
 * @returns
 */
export function isCacheExpired(
    lastUpdatedAt: string,
    cacheRetentionDays: number
): boolean {
    const cacheExpirationTimestamp =
        Number(lastUpdatedAt) + cacheRetentionDays * 24 * 60 * 60 * 1000;
    return Date.now() > cacheExpirationTimestamp;
}
 
/**
 * If the current time is earlier than the time that a token was cached at, we must discard the token
 * i.e. The system clock was turned back after acquiring the cached token
 * @param cachedAt
 * @param offset
 */
export function wasClockTurnedBack(cachedAt: string): boolean {
    const cachedAtSec = Number(cachedAt);
 
    return cachedAtSec > nowSeconds();
}
 
/**
 * Waits for t number of milliseconds
 * @param t number
 * @param value T
 */
export function delay<T>(t: number, value?: T): Promise<T | void> {
    return new Promise((resolve) => setTimeout(() => resolve(value), t));
}