cache-storage
Version:
[ABANDONED] Advanced cache storage for node js
166 lines (144 loc) • 4.66 kB
JavaScript
// Generated by CoffeeScript 1.6.3
(function() {
var RedisStorage, Storage, assert, redis,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
Storage = require('./Storage');
redis = require('redis');
assert = require('assert');
RedisStorage = (function(_super) {
__extends(RedisStorage, _super);
RedisStorage.META_KEY = '__redis__storage__meta__key__';
RedisStorage.prototype.client = null;
function RedisStorage() {
if (typeof window !== 'undefined') {
throw new Error('FileStorage: Can not use this storage in browser');
}
this.client = redis.createClient();
}
RedisStorage.prototype.selectDatabase = function(database, fn) {
return this.client.SELECT(database, fn);
};
RedisStorage.prototype._read = function(name, fn, defaults) {
var _this = this;
if (defaults == null) {
defaults = null;
}
return this.client.GET(name, function(err, data) {
if (err) {
return fn(err, null);
} else if (data === null) {
if (defaults === null) {
return fn(null, null);
} else {
return _this._write(name, defaults, function(err) {
if (err) {
return fn(err, null);
} else {
return _this._read(name, function(err, data) {
if (err) {
return fn(err, null);
} else {
return fn(null, data);
}
});
}
});
}
} else {
return fn(null, JSON.parse(data));
}
});
};
RedisStorage.prototype._write = function(name, data, fn) {
return this.client.SET(name, JSON.stringify(data), function(err) {
if (err) {
return fn(err);
} else {
return fn(null);
}
});
};
RedisStorage.prototype._remove = function(name, fn) {
return this.client.DEL(name, fn);
};
RedisStorage.prototype._removeAll = function(fn) {
return this.client.FLUSHDB(fn);
};
RedisStorage.prototype.getMeta = function(fn) {
return this._read(RedisStorage.META_KEY, fn, {});
};
RedisStorage.prototype.read = function(key, fn) {
var _this = this;
return this._read(key, function(err, data) {
if (err) {
return fn(err, null);
} else if (data === null) {
return fn(null, null);
} else {
return _this.findMeta(key, function(err, meta) {
if (err) {
return fn(err, null);
} else {
return _this.verify(meta, function(err, state) {
if (err) {
return fn(err, null);
} else if (state) {
return fn(null, data);
} else {
return _this.remove(key, function() {
return fn(null, null);
});
}
});
}
});
}
});
};
RedisStorage.prototype.write = function(key, data, dependencies, fn) {
var _this = this;
if (dependencies == null) {
dependencies = {};
}
return this._write(key, data, function(err) {
if (err) {
return fn(err);
} else {
return _this.getMeta(function(err, meta) {
if (err) {
return fn(err);
} else {
meta[key] = dependencies;
return _this._write(RedisStorage.META_KEY, meta, fn);
}
});
}
});
};
RedisStorage.prototype.remove = function(key, fn) {
var _this = this;
return this.getMeta(function(err, meta) {
if (err) {
return fn(err);
} else {
if (typeof meta[key] !== 'undefined') {
delete meta[key];
}
return _this._remove(key, function(err) {
if (err) {
return fn(err);
} else {
return _this._write(RedisStorage.META_KEY, meta, fn);
}
});
}
});
};
RedisStorage.prototype.removeAll = function(fn) {
return this._removeAll(fn);
};
return RedisStorage;
})(Storage);
module.exports = RedisStorage;
}).call(this);