-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
114 lines (90 loc) · 3.07 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
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
'use strict';
module.exports = class CacheStore {
constructor(cacheKeyPrefix = null) {
this.cacheKeyPrefix = cacheKeyPrefix;
}
isNumber(value) {
return !isNaN(parseFloat(value)) && !isNaN(value - 0)
}
isDate(value) {
return value instanceof Date && !isNaN(value.valueOf())
}
put(key, value, ttl = null) {
let createdAt = new Date();
let expiresAt = null;
if (this.isNumber(ttl)) {
let date = new Date();
date.setSeconds(date.getSeconds() + ttl);
expiresAt = date.toISOString();
}
if (this.isDate(ttl)) {
expiresAt = ttl.toISOString();
}
let cachedData = {
value, createdAt, expiresAt
};
if (this.cacheKeyPrefix) {
key = this.cacheKeyPrefix + key;
}
localStorage.setItem(key, JSON.stringify(cachedData));
return value;
}
delete(key) {
if (this.cacheKeyPrefix) {
key = this.cacheKeyPrefix + key;
}
return localStorage.removeItem(key);
}
remember(key, ttl, callback) {
if (this.cacheKeyPrefix) {
key = this.cacheKeyPrefix + key;
}
let localStorageItem = localStorage.getItem(key);
let cachedData = localStorageItem ? JSON.parse(localStorageItem) : undefined;
// If cached data exists and doesn't expire, or if cached data expires, but still hasn't
if (cachedData && (!cachedData.expiresAt || (cachedData.expiresAt && cachedData.expiresAt > new Date().toISOString()))) {
return cachedData.value;
}
this.put(key, undefined, ttl);
let value = callback();
return this.put(key, value, ttl);
}
async rememberAsync(key, ttl, callback) {
if (this.cacheKeyPrefix) {
key = this.cacheKeyPrefix + key;
}
let localStorageItem = localStorage.getItem(key);
let cachedData = localStorageItem
? JSON.parse(localStorageItem)
: undefined;
// If cached data exists and doesn't expire, or if cached data expires, but still hasn't
if (
cachedData &&
(!cachedData.expiresAt ||
(cachedData.expiresAt &&
cachedData.expiresAt > new Date().toISOString()))
) {
return cachedData.value;
}
this.put(key, undefined, ttl);
let value = await callback();
return this.put(key, value, ttl);
}
rememberForever(key, callback) {
return this.remember(key, null, callback);
}
get(key, defaultValue = undefined) {
if (this.cacheKeyPrefix) {
key = this.cacheKeyPrefix + key;
}
let localStorageItem = localStorage.getItem(key);
if (!localStorageItem) {
return defaultValue;
}
let cachedData = JSON.parse(localStorageItem);
if (cachedData.expiresAt && cachedData.expiresAt < new Date().toISOString()) {
return defaultValue;
}
return cachedData.value;
}
}