mongoose-elasticsearch-xp
Version:
A mongoose plugin that indexes models into Elasticsearch 2 / 5 (an alternative to mongoosastic)
76 lines (65 loc) • 1.84 kB
JavaScript
;
const EventEmitter = require('events').EventEmitter;
module.exports = Bulker;
/**
* Bulk buffer handler
* @param {Object} client - Elasticsearch client
* @param {Object} [options] - bulk options
* @param {Number} [options.delay=1000] - delay before sending the buffer when buffer is not full
* @param {Number} [options.size=1000] - buffer size before sending without waiting delay
* @inherits NodeJS EventEmitter http://nodejs.org/api/events.html#events_class_events_eventemitter
* @event `error`: Emitted when bulk return an error.
* @event `sent`: Emitted when bulk has sent a buffer.
*/
function Bulker(client, options) {
options = options || {}; // eslint-disable-line
let timeout;
let flushing = false;
const self = this;
const delay = options.delay || 1000;
const size = options.size || 1000;
let buffer = [];
self.push = function() {
let sending = false;
if (arguments.length) {
buffer.push.apply(buffer, arguments);
sending = buffer.length >= size;
if (sending) {
self.flush();
} else {
self.delay();
}
}
return sending;
};
self.delay = function() {
clearTimeout(timeout);
timeout = setTimeout(() => {
self.flush();
}, delay);
};
self.filled = function() {
return !!buffer.length;
};
self.isFlushing = function() {
return flushing;
};
self.flush = function() {
const len = buffer.length;
clearTimeout(timeout);
if (len) {
flushing = true;
client.bulk({ body: buffer }, err => {
flushing = false;
if (err) {
self.emit('error', err);
} else {
self.emit('sent', len);
}
});
buffer = [];
}
};
}
Bulker.prototype = Object.create(EventEmitter.prototype);
Bulker.prototype.constructor = Bulker;