function RiakPBC(options) { var self = this; options = options || {}; self.host = options.host || '127.0.0.1'; self.port = options.port || 8087; self.timeout = options.timeout || 1000; self.bucket = options.bucket || undefined; self.translator = protobuf.loadSchema(path.join(__dirname, './spec/riak_kv.proto')); self.client = new net.Socket(); self.connected = false; self.client.on('end', self.disconnect.bind(this)); self.client.on('error', self.disconnect.bind(this)); self.client.on('data', self._processPacket.bind(this)); self.paused = false; self.queue = []; self.reply = {}; self.resBuffers = []; self.numBytesAwaiting = 0; }
function RiakPBC(options) { var self = this; options = options || {}; self.host = options.host || 'localhost'; self.port = options.port || 8087; self.bucket = options.bucket || undefined; self.translator = protobuf.loadSchema('./spec/riak_kv.proto'); self.client = net.connect(self.port, self.host, function () { self.connected = true; }); self.queue = async.queue(function (task, callback) { var mc, reply = {}; var checkReply = function (chunk) { splitPacket(chunk).forEach(function (packet) { mc = messageCodes['' + packet.readInt8(0)]; reply = _merge(reply, self.translator.decode(mc, packet.slice(1))); if (!task.expectMultiple || reply.done || mc === 'RpbErrorResp') { self.client.removeListener('data', checkReply); task.callback(reply); callback(); } }); } self.client.on('data', checkReply); self.client.write(task.message); }, 1); function splitPacket(pkt) { var ret = []; while (pkt.length > 0) { var len = pkt.readUInt32BE(0), buf = new Buffer(len); pkt.copy(buf, 0, 4, len + 4); ret.push(buf); pkt = pkt.slice(len + 4); } return ret; } };
function RiakPBC(options) { var self = this; options = options || {}; self.host = options.host || '127.0.0.1'; self.port = options.port || 8087; self.bucket = options.bucket || undefined; self.translator = protobuf.loadSchema(path.join(__dirname, './spec/riak_kv.proto')); self.client = new net.Socket(); self.connected = false; self.client.on('end', self.disconnect); self.client.on('error', self.disconnect); self.paused = false; self.queue = []; var mc, reply = {}, resBuffers = [], numBytesAwaiting = 0; function splitPacket(pkt) { var pos = 0, len; if (numBytesAwaiting > 0) { len = Math.min(pkt.length, numBytesAwaiting); var oldBuf = resBuffers[resBuffers.length - 1]; var newBuf = new Buffer(oldBuf.length + len); oldBuf.copy(newBuf, 0); pkt.slice(0, len).copy(newBuf, oldBuf.length); resBuffers[resBuffers.length - 1] = newBuf; pos = len; numBytesAwaiting -= len; } else { resBuffers = []; } while (pos < pkt.length) { len = butils.readInt32(pkt, pos); numBytesAwaiting = len + 4 - pkt.length; resBuffers.push(pkt.slice(pos + 4, Math.min(pos + len + 4, pkt.length))); pos += len + 4; } } self.client.on('data', function (chunk) { splitPacket(chunk); if (numBytesAwaiting > 0) { return; } resBuffers.forEach(function (packet) { mc = messageCodes['' + packet[0]]; reply = _merge(reply, self.translator.decode(mc, packet.slice(1))); if (!self.task.expectMultiple || reply.done || mc === 'RpbErrorResp') { self.task.callback(reply); mc = undefined; self.task = undefined; reply = {}; self.paused = false; self.processNext(); } }); }); self.processNext = function () { if (self.queue.length && !self.paused) { self.paused = true; self.connect(function () { self.task = self.queue.shift(); self.client.write(self.task.message); }); } }; }