forked from stumbleupon/stumblebar
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcache.js
106 lines (96 loc) · 2.4 KB
/
cache.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
function Cache(defaults) {
this.defaults = {}
this.init(defaults || {})
this.map = function() {
var r = this.mget.apply(this, arguments);
return function() { return r };
}
}
Cache.prototype = {
mget: function() {
// Lazy mget w/array
if (arguments.length == 1 && Array.isArray(arguments[0]))
return this.mget.apply(this, arguments[0]);
var reqs = [];
var keys = [];
next: for (var i = 0; i < arguments.length; i++) {
v = arguments[i];
if (typeof(v) == "string") {
reqs.push(this.get(v));
keys.push(v);
continue next;
}
if (typeof(v) == "object") {
for (var k in v) {
reqs.push(this.get(k, v[k]));
keys.push(k);
continue next;
}
}
keys.push(v);
reqs.push(null);
}
return Promise.all(reqs)
.then(function(r) {
var retval = {};
r.forEach(function(v, k) {
retval[keys[k]] = v;
})
return retval;
});
},
get: function(key, fallback) {
key = this.defaults.prefix + key;
return new Promise(function (resolve, reject) {
return browser.storage.local.get(key, function(result) {
if (!key)
resolve(result);
else if (result.hasOwnProperty(key)) {
var val = result[key];
if(typeof val === 'object' && val) {
// see if it has an expiration
if(val.hasOwnProperty(('_expires')) && typeof val._expires === "number" && val._expires <= Date.now()) {
return resolve(null);
}
// if it has a value set, return it
if(val.hasOwnProperty('_setValue')) {
val = val._setValue;
}
}
resolve(val);
}
else if (typeof fallback != 'undefined')
resolve(fallback)
else if (typeof this.defaults[key] != 'undefined')
resolve(this.defaults[key])
else
resolve(null);
}.bind(this));
}.bind(this));
},
mset: function(map) {
return new Promise(function (resolve, reject) {
return browser.storage.local.set(map, resolve);
});
},
/**
*
* @param key
* @param value
* @param msTtl -- time to live in milliseconds
* @returns {*}
*/
set: function(key, value, msTtl) {
var obj = new Object(),
obj = {[this.defaults.prefix + key]: value}
if((typeof msTtl === "number")) {
var expires = Date.now() + msTtl;
obj[this.defaults.prefix + key] = {_setValue: value, _expires: expires};
}
return this.mset(obj);
},
init: function(kvpairs) {
this.defaults = kvpairs
this.defaults.prefix = this.defaults.prefix || '';
}
}