Example #1
0
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;
}
Example #2
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;
    }
};
Example #3
0
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);
            });
        }
    };
}