memcaching
Advanced tools
Comparing version 0.2.1 to 0.2.2
@@ -41,7 +41,7 @@ module.exports = CommandQueue | ||
// When the command finishes, try to run the next command | ||
var me = this | ||
var self = this | ||
command(this.resource, function() { | ||
me._next() | ||
self._next() | ||
}) | ||
} | ||
@@ -76,6 +76,11 @@ module.exports = ConnectionPool | ||
ConnectionPool.prototype._connection = function(server) { | ||
var self = this | ||
function onEnd() { | ||
delete self.connections[server] | ||
} | ||
if (!this.connections.hasOwnProperty(server)) | ||
this.connections[server] = this.connect(server) | ||
this.connections[server] = this.connect(server, onEnd) | ||
return this.connections[server] | ||
} |
@@ -15,5 +15,11 @@ var Buffers = require('buffers') | ||
var self = this | ||
this.stream = stream | ||
this.open = true | ||
this.delimiter = Buffer.isBuffer(delimiter) ? delimiter : Buffer(delimiter) | ||
this.queue = CommandQueue(stream) | ||
this.stream.on('end', function() { | ||
self.open = false | ||
}) | ||
} | ||
@@ -26,4 +32,7 @@ | ||
* delimiter. | ||
* | ||
* Throws an error if the stream is closed | ||
*/ | ||
DelimitedStream.prototype.send = function send(message) { | ||
if (!this.open) throw Error("write after end") | ||
this.stream.write(message) | ||
@@ -42,3 +51,3 @@ this.stream.write(this.delimiter) | ||
var buffers = new Buffers | ||
, delimiter = this.delimiter | ||
, self = this | ||
@@ -56,3 +65,3 @@ if (typeof bytes === 'function') cb = bytes | ||
var end = buffers.indexOf(delimiter, bytes) | ||
var end = buffers.indexOf(self.delimiter, bytes) | ||
if (end === -1) return | ||
@@ -63,4 +72,4 @@ | ||
// If there is part of the buffer we read, but are not consuming, put it back | ||
if (buffers.length > end + delimiter.length) | ||
stream.unshift(buffers.slice(end + delimiter.length)) | ||
if (buffers.length > end + self.delimiter.length) | ||
stream.unshift(buffers.slice(end + self.delimiter.length)) | ||
} | ||
@@ -71,2 +80,3 @@ | ||
stream.removeListener('error', finish) | ||
stream.removeListener('end', end) | ||
cb(err, resp) | ||
@@ -76,6 +86,14 @@ done() | ||
function end() { | ||
finish(Error("read after end")) | ||
} | ||
stream.on('readable', read) | ||
stream.on('error', finish) | ||
read() | ||
stream.on('end', end) | ||
if (!self.open) end() | ||
else read() | ||
}) | ||
return true | ||
} |
@@ -11,5 +11,7 @@ var MemcacheSocket = require('./memcachesocket') | ||
function connect(server) { | ||
function connect(server, onEnd) { | ||
var parts = server.split(':') | ||
return new MemcacheSocket({ host: parts[0], port: parts[1] }, opts) | ||
var socket = new MemcacheSocket({ host: parts[0], port: parts[1] }, opts) | ||
socket.socket.on('error', onEnd).on('end', onEnd) | ||
return socket | ||
} | ||
@@ -59,9 +61,9 @@ | ||
, error = null | ||
, me = this | ||
, self = this | ||
, prefix = this.prefix | ||
this.pool.use(keys, function(socket, keys) { | ||
var params = me.parseParams({ verb: verb, keys: keys }) | ||
var params = self.parseParams({ verb: verb, keys: keys }) | ||
socket.execute(params, function(err, response) { | ||
if (err) error = null | ||
if (err) error = err | ||
else results = results.concat(response) | ||
@@ -68,0 +70,0 @@ |
@@ -46,4 +46,8 @@ var SetCommand = require('./commands/set') | ||
return command(params, stream, done) | ||
try { | ||
command(params, stream, done) | ||
} catch (e) { | ||
done(e) | ||
} | ||
} | ||
} |
{ | ||
"name": "memcaching", | ||
"version": "0.2.1", | ||
"version": "0.2.2", | ||
"description": "Library to speak the memcache text protocol", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -82,1 +82,26 @@ var DelimitedStream = require('../lib/delimitedstream') | ||
}) | ||
test("handle end-of-stream", function(t) { | ||
var stream = PassThrough() | ||
, testStream = DelimitedStream(stream, "----") | ||
testStream.recv(function(err, msg1) { | ||
t.error(err, "no error") | ||
t.equal(msg1.toString(), "msg1", "msg1 should be intact") | ||
testStream.recv(function(err, msg) { | ||
t.same(err, Error("read after end"), "got error reading during end") | ||
t.type(msg, 'undefined', "no response") | ||
t.throws(function() { | ||
testStream.send("foo") | ||
}, Error("write after end"), "got error writing after end") | ||
testStream.recv(function(err, msg) { | ||
t.same(err, Error("read after end"), "got error reading after end") | ||
t.type(msg, 'undefined', "no response") | ||
t.end() | ||
}) | ||
}) | ||
stream.end() | ||
}) | ||
stream.write("msg1----ms") | ||
}) |
var MemcacheClient = require('../../lib/memcacheclient') | ||
, MemcacheServer = require('./memcacheserver') | ||
, test = require('tap').test | ||
console.log("This test requires a running memcache server on port 11211") | ||
test("can talk to memcache", function(t) { | ||
var server = new MemcacheServer() | ||
var client = new MemcacheClient({ unref: false }) | ||
client.addServer('127.0.0.1:11211') | ||
client.addServer('127.0.0.1:' + server.port) | ||
@@ -64,4 +64,5 @@ client.flush(0, function(err, result) { | ||
client.end() | ||
server.end() | ||
t.end() | ||
}) | ||
}) |
var MemcacheClient = require('../../lib/memcacheclient') | ||
, MemcacheServer = require('./memcacheserver') | ||
, test = require('tap').test | ||
console.log("This test requires a running memcache server on port 11211") | ||
test("can use cas with memcache", function(t) { | ||
var client = new MemcacheClient({ servers: [ '127.0.0.1:11211' ] }) | ||
var server = new MemcacheServer() | ||
var client = new MemcacheClient({ servers: [ '127.0.0.1:' + server.port ] }) | ||
@@ -40,2 +40,3 @@ client.flush(0, function(err, result) { | ||
t.equals(result, "OK", "should get result OK for a FLUSH") | ||
server.end() | ||
t.end() | ||
@@ -42,0 +43,0 @@ }) |
var MemcacheClient = require('../../lib/memcacheclient') | ||
, MemcacheServer = require('./memcacheserver') | ||
, test = require('tap').test | ||
console.log("This test requires a running memcache server on port 11211") | ||
test("can use prefixes correctly", function(t) { | ||
var server = new MemcacheServer() | ||
var client = new MemcacheClient({ unref: false }) | ||
client.addServer('127.0.0.1:11211') | ||
client.addServer('127.0.0.1:' + server.port) | ||
@@ -49,4 +49,5 @@ client.flush(0, function(err, result) { | ||
client.end() | ||
server.end() | ||
t.end() | ||
}) | ||
}) |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
48923
39
1495
2