-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
45 lines (37 loc) · 1.26 KB
/
index.js
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
import fetchHeadDate from './fetch-head-date'
// Use google server to retrieve the exact date and time
const SERVER_HOST = '//www.googleapis.com'
const SERVER_PATH = '/discovery/v1/apis?fields='
// Resync if more than an hour has passed
const TIME_BETWEEN_REQ = 36 * 1e5
let lastRequestTime = 0
let lastOffset = 0
let lastExactTime
const getDateTime = forceNetSync => {
const timeSinceLastRequest = Date.now() - lastRequestTime
if (!forceNetSync && lastExactTime && timeSinceLastRequest < TIME_BETWEEN_REQ) {
return Promise.resolve({
utc: lastExactTime + timeSinceLastRequest,
offset: lastOffset
})
} else {
lastRequestTime = Date.now()
return fetchHeadDate(SERVER_HOST, SERVER_PATH)
// take net delay into account
.then(date => Date.parse(date) + (Date.now() - lastRequestTime))
.then(utc => {
// cache values
lastExactTime = utc
lastRequestTime = Date.now()
lastOffset = Math.floor((lastRequestTime - utc) / 1e3)
return {
utc,
offset: lastOffset
}
})
}
}
export const getDate = forceNetSync => getDateTime(forceNetSync)
.then(date => new Date(date.utc))
export const getOffset = forceNetSync => getDateTime(forceNetSync)
.then(date => date.offset)