-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.js
104 lines (82 loc) · 2.71 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
var RedisAdapter = require('./adapters/redis')
, MemoryAdapter = require('./adapters/memory')
, FileAdapter = require('./adapters/file')
, MongoAdapter = require('./adapters/mongo')
, EventEmitter = require('events').EventEmitter
, util = require('util')
, arrg = require('arrg')
, when = require('when')
, _ = require('underscore')
var adapters = {
'redis': RedisAdapter,
'memory': MemoryAdapter,
'file': FileAdapter,
'mongo': MongoAdapter
}
var Cacheup = function(options){
var self = this;
var Adapter = adapters[options.type];
this.adapter = new Adapter(options);
this.adapter.on('error', function(error){
self.emit('error', error);
});
this.DEFAULTS = this.adapter.DEFAULTS;
EventEmitter.call(this);
};
util.inherits(Cacheup, EventEmitter);
Cacheup.prototype._callAdapter = function() {
var args = Array.prototype.slice.apply(arguments);
var methodName = args.shift();
var method = this.adapter[methodName];
var callback = _.last(args);
if (_.isFunction(callback)) {
callback = args.pop();
} else {
callback = null;
}
promise = method.apply(this.adapter, args);
promise.then(function(data){
if (callback) callback(null, data);
}).otherwise(function(error){
if (callback) callback(error, null);
});
return promise;
};
Cacheup.prototype._processArguments = function(args, positions) {
args = arrg(args, positions, {
options: {}
});
if (_.isFunction(args.options)) {
args.callback = args.options;
args.options = {};
}
return args;
};
// Public methods
Cacheup.prototype.set = function() {
var args = this._processArguments(arguments, ['key', 'value', 'options', 'callback']);
return this._callAdapter('set', args.key, args.value, args.options, args.callback);
};
Cacheup.prototype.get = function() {
var args = this._processArguments(arguments, ['key', 'options', 'callback']);
return this._callAdapter('get', args.key, args.options, args.callback);
};
Cacheup.prototype.del = function() {
var args = this._processArguments(arguments, ['key', 'options', 'callback']);
return this._callAdapter('del', args.key, args.options, args.callback);
};
Cacheup.prototype.fetch = function() {
var args = this._processArguments(arguments, ['key', 'fetch', 'options', 'callback']);
return this._callAdapter('fetch', args.key, args.fetch, args.options, args.callback);
};
Cacheup.prototype.ttl = function(key) {
return this._callAdapter('ttl', key);
};
Cacheup.prototype.touch = function(key) {
var args = this._processArguments(arguments, ['key', 'options', 'callback']);
return this._callAdapter('touch', args.key, args.options, args.callback);
};
Cacheup.prototype.clear = function() {
this.adapter.clear();
};
module.exports = Cacheup;