From 0f2075fcdaf0b5fbca7d336882870e84fb35d861 Mon Sep 17 00:00:00 2001 From: John Crepezzi Date: Mon, 21 Nov 2011 21:48:09 -0500 Subject: [PATCH] Ensure conflict resolution in keyspace --- TODO | 4 ++-- lib/document_handler.js | 38 ++++++++++++++++++++++++++------------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/TODO b/TODO index 2a1f9f3..3e355f3 100644 --- a/TODO +++ b/TODO @@ -1,4 +1,4 @@ -cache headers for static assets +cache headers for static assets (and on document GET) tests fix any annoying visual quirks add FAVICON @@ -6,7 +6,7 @@ cache static in memory add feedback for errors to UI - esp. too long copy URL to clipboard button add about page -add conflict resolution for keys when creating a post +support built-in expiration # shared version only some way to do announcements easily (and use for ads) diff --git a/lib/document_handler.js b/lib/document_handler.js index 50d5796..d92297c 100644 --- a/lib/document_handler.js +++ b/lib/document_handler.js @@ -29,7 +29,6 @@ DocumentHandler.prototype.handleGet = function(key, response) { // Handle adding a new Document DocumentHandler.prototype.handlePost = function(request, response) { var _this = this; - var key = this.randomKey(); var buffer = ''; request.on('data', function(data) { if (!buffer) { @@ -38,23 +37,25 @@ DocumentHandler.prototype.handlePost = function(request, response) { buffer += data.toString(); if (_this.maxLength && buffer.length > _this.maxLength) { _this.cancelled = true; - winston.warn('attempted to upload a document >maxLength', { maxLength: _this.maxLength }); + winston.warn('document >maxLength', { maxLength: _this.maxLength }); response.writeHead(400, { 'content-type': 'application/json' }); response.end(JSON.stringify({ message: 'document exceeds maximum length' })); } }); request.on('end', function(end) { if (_this.cancelled) return; - _this.store.set(key, buffer, function(res) { - if (res) { - winston.verbose('added document', { key: key }); - response.end(JSON.stringify({ key: key })); - } - else { - winston.verbose('error adding document'); - response.writeHead(500, { 'content-type': 'application/json' }); - response.end(JSON.stringify({ message: 'error adding document' })); - } + _this.chooseKey(function(key) { + _this.store.set(key, buffer, function(res) { + if (res) { + winston.verbose('added document', { key: key }); + response.end(JSON.stringify({ key: key })); + } + else { + winston.verbose('error adding document'); + response.writeHead(500, { 'content-type': 'application/json' }); + response.end(JSON.stringify({ message: 'error adding document' })); + } + }); }); }); request.on('error', function(error) { @@ -64,6 +65,19 @@ DocumentHandler.prototype.handlePost = function(request, response) { }); }; +// Get a random key that hasn't been already used +DocumentHandler.prototype.chooseKey = function(callback) { + var key = this.randomKey(); + var _this = this; + this.store.get(key, function(ret) { + if (ret) { + _this.chooseKey(callback); + } else { + callback(key); + } + }); +}; + // Generate a random key DocumentHandler.prototype.randomKey = function() { var text = '';