forked from komunikator/sip.server
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cache.js
executable file
·125 lines (112 loc) · 4.31 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
'use strict';
let Caching = require('caching');
// .set('key',ttl/*ms*/,'value') //ttl - время жизни в mc
// .get('key', calback) //calback(err,result)
// .remove('key')
function Cache() {
let caching = Caching.apply(this, arguments);
if (arguments[0] === 'redis') {
this.get = function(pattern, callback) {
let self = this;
let work = function(key, callback) {
self.client.get(key, function(err, result) {
try {
result = JSON.parse(result);
} catch (e) {
console.log('JSON.parse', e);
}
callback(err, result);
})
};
if (~pattern.indexOf('*')) {
self.client.keys(pattern, function(err, keys) {
if (keys.length) {
let total = keys.length;
let data = [];
function _job(err, res) {
if (!err)
data.push(res);
if (!--total)
callback(err, data);
};
keys.forEach(function(key) {
work(key, _job);
})
} else
callback(null, null);
});
} else {
work(pattern, callback);
}
};
this.set = caching.store.set.bind(caching.store);
this.remove = caching.store.remove.bind(caching.store);
} else {
let selfCache = this;
this.set = function (key, ttl, result) {
key = key.replace("+","");
if (this.cache && this.cache[key] && this.cache[key]._timeOut)
clearTimeout(this.cache[key]._timeOut);
this.cache[key] = result;
if (ttl) {
let self = this;
this.cache[key]._timeOut = setTimeout(function () {
delete self.cache[key];
if (selfCache.onChange) {
selfCache.onChange();
}
}, ttl);
}
if (selfCache.onChange) {
selfCache.onChange();
}
};
this.set = this.set.bind(caching.store);
this.get = function(pattern, callback) {
pattern = pattern.replace("+","");
let self = this;
if (~pattern.indexOf('*')) {
pattern = new RegExp(pattern.replace(/\*/g, '.*'), 'g');
let data = [];
let keys = Object.keys(this.cache);
if (!keys.length)
process.nextTick(function() {
callback(null, null);
});
else
keys.forEach(function(key, i, array) {
if (pattern.test(key)) {
data.push(self.cache[key]);
};
pattern.lastIndex = 0;
if (array.length == i + 1) {
process.nextTick(function() {
callback(null, (data.length && data) || null);
});
}
});
} else {
process.nextTick(function() {
callback(null, self.cache[pattern] || null);
});
}
};
this.remove = function(pattern) {
if (~pattern.indexOf('*')) {
let self = this;
pattern = new RegExp(pattern.replace(/\*/g, '.*'), 'g');
Object.keys(this.cache).forEach(function(key) {
if (pattern.test(key)) {
delete self.cache[key];
}
pattern.lastIndex = 0;
});
} else {
delete this.cache[pattern];
}
};
this.remove = this.remove.bind(caching.store);
}
this.get = this.get.bind(caching.store);
};
module.exports = Cache;