mirror of
https://github.com/SunRed/haste-server.git
synced 2024-11-23 17:50:19 +01:00
Support for redis expiration
This commit is contained in:
parent
0f2075fcda
commit
d0e3e4cd02
5 changed files with 43 additions and 15 deletions
1
TODO
1
TODO
|
@ -6,7 +6,6 @@ cache static in memory
|
||||||
add feedback for errors to UI - esp. too long
|
add feedback for errors to UI - esp. too long
|
||||||
copy URL to clipboard button
|
copy URL to clipboard button
|
||||||
add about page
|
add about page
|
||||||
support built-in expiration
|
|
||||||
|
|
||||||
# shared version only
|
# shared version only
|
||||||
some way to do announcements easily (and use for ads)
|
some way to do announcements easily (and use for ads)
|
||||||
|
|
|
@ -19,7 +19,8 @@
|
||||||
"type": "redis",
|
"type": "redis",
|
||||||
"host": "localhost",
|
"host": "localhost",
|
||||||
"port": 6379,
|
"port": 6379,
|
||||||
"db": 2
|
"db": 2,
|
||||||
|
"expire": 3600
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,8 @@ var winston = require('winston');
|
||||||
var hashlib = require('hashlib');
|
var hashlib = require('hashlib');
|
||||||
|
|
||||||
// For storing in files
|
// For storing in files
|
||||||
|
// options[type] = file
|
||||||
|
// options[path] - Where to store
|
||||||
|
|
||||||
var FileDocumentStore = function(options) {
|
var FileDocumentStore = function(options) {
|
||||||
this.basePath = options.path || './data';
|
this.basePath = options.path || './data';
|
||||||
|
|
|
@ -2,7 +2,15 @@ var redis = require('redis');
|
||||||
var winston = require('winston');
|
var winston = require('winston');
|
||||||
var hashlib = require('hashlib');
|
var hashlib = require('hashlib');
|
||||||
|
|
||||||
|
// For storing in redis
|
||||||
|
// options[type] = redis
|
||||||
|
// options[host] - The host to connect to (default localhost)
|
||||||
|
// options[port] - The port to connect to (default 5379)
|
||||||
|
// options[db] - The db to use (default 0)
|
||||||
|
// options[expire] - The time to live for each key set (default never)
|
||||||
|
|
||||||
var RedisDocumentStore = function(options) {
|
var RedisDocumentStore = function(options) {
|
||||||
|
this.expire = options.expire;
|
||||||
if (!RedisDocumentStore.client) {
|
if (!RedisDocumentStore.client) {
|
||||||
RedisDocumentStore.connect(options);
|
RedisDocumentStore.connect(options);
|
||||||
}
|
}
|
||||||
|
@ -27,11 +35,31 @@ RedisDocumentStore.connect = function(options) {
|
||||||
|
|
||||||
// Save file in a key
|
// Save file in a key
|
||||||
RedisDocumentStore.prototype.set = function(key, data, callback) {
|
RedisDocumentStore.prototype.set = function(key, data, callback) {
|
||||||
|
var _this = this;
|
||||||
RedisDocumentStore.client.set(key, data, function(err, reply) {
|
RedisDocumentStore.client.set(key, data, function(err, reply) {
|
||||||
callback(!err);
|
if (err) {
|
||||||
|
callback(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_this.setExpiration(key);
|
||||||
|
callback(true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Expire a key in expire time if set
|
||||||
|
RedisDocumentStore.prototype.setExpiration = function(key) {
|
||||||
|
if (this.expire) {
|
||||||
|
RedisDocumentStore.client.expire(key, this.expire, function(err, reply) {
|
||||||
|
if (err || !reply) {
|
||||||
|
winston.error('failed to set expiry on key: ' + key);
|
||||||
|
} else {
|
||||||
|
console.log('set');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Get a file from a key
|
// Get a file from a key
|
||||||
RedisDocumentStore.prototype.get = function(key, callback) {
|
RedisDocumentStore.prototype.get = function(key, callback) {
|
||||||
RedisDocumentStore.client.get(key, function(err, reply) {
|
RedisDocumentStore.client.get(key, function(err, reply) {
|
||||||
|
|
22
server.js
22
server.js
|
@ -28,16 +28,14 @@ if (config.logging) {
|
||||||
|
|
||||||
// build the store from the config on-demand - so that we don't load it
|
// build the store from the config on-demand - so that we don't load it
|
||||||
// for statics
|
// for statics
|
||||||
var preferredStore = function() {
|
if (!config.storage) {
|
||||||
if (!config.storage) {
|
config.storage = { type: 'file' };
|
||||||
config.storage = { type: 'file' };
|
}
|
||||||
}
|
if (!config.storage.type) {
|
||||||
if (!config.storage.type) {
|
config.storage.type = 'file';
|
||||||
config.storage.type = 'file';
|
}
|
||||||
}
|
var Store = require('./lib/' + config.storage.type + '_document_store');
|
||||||
var Store = require('./lib/' + config.storage.type + '_document_store');
|
var preferredStore = new Store(config.storage);
|
||||||
return new Store(config.storage);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Set the server up and listen forever
|
// Set the server up and listen forever
|
||||||
http.createServer(function(request, response) {
|
http.createServer(function(request, response) {
|
||||||
|
@ -48,7 +46,7 @@ http.createServer(function(request, response) {
|
||||||
handler = new DocumentHandler({
|
handler = new DocumentHandler({
|
||||||
keyLength: config.keyLength,
|
keyLength: config.keyLength,
|
||||||
maxLength: config.maxLength,
|
maxLength: config.maxLength,
|
||||||
store: preferredStore()
|
store: preferredStore
|
||||||
});
|
});
|
||||||
return handler.handlePost(request, response);
|
return handler.handlePost(request, response);
|
||||||
}
|
}
|
||||||
|
@ -56,7 +54,7 @@ http.createServer(function(request, response) {
|
||||||
var match = incoming.pathname.match(/^\/documents\/([A-Za-z0-9]+)$/);
|
var match = incoming.pathname.match(/^\/documents\/([A-Za-z0-9]+)$/);
|
||||||
if (request.method == 'GET' && match) {
|
if (request.method == 'GET' && match) {
|
||||||
handler = new DocumentHandler({
|
handler = new DocumentHandler({
|
||||||
store: preferredStore()
|
store: preferredStore
|
||||||
});
|
});
|
||||||
return handler.handleGet(match[1], response);
|
return handler.handleGet(match[1], response);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue