const Promise = require("bluebird"); const elasticsearch = require("elasticsearch"); import { defaults, clone } from "lodash"; import { logger as defaultLogger } from "../utils/Logger"; import { AppError } from "../errors"; export class ElasticSearch { private esClient: any; //elasticsearch.client; private logger: any = null; private tracer: any = null; private config; //https://www.elastic.co/guide/en/elasticsearch/client/javascript-api/current/host-reference.html constructor(opts?, _logger = defaultLogger, _tracer = undefined) { let my = this; my.logger = _logger; my.tracer = _tracer; my.config = defaults({}, opts, { host: "localhost:9200", //hosts: [host:port, {host:, port: }] //read this if u start banging head https://github.com/elastic/elasticsearch-js/issues/196 sniffOnStart: false, //sniffing additional nodes from seed host(s) above, //!!! if true ES servers HAS TO LIST prop "http_address" requestTimeout: 12000, //12s keepAlive: true, log: "warning" //error | warning | info | debug | trace }); my.esClient = new elasticsearch.Client(my.config); // my.esClient.ping({ // //requestTimeout: 30000, // }, function (error) { // if (error) { // my.logger.error( my.host + ' cluster is down!', error); // } else { // my.logger.info('cluster up @' + my.host); // } // }); } /** * [index description] * @param {Obj} opt {index:, type:, id:, body:, refresh:, pretty:,} */ public index(opt, cb = undefined) { this._log(opt); let my = this; return new Promise((resolve, reject) => { my.esClient.index(opt, my._reqHandler(resolve, reject)); }).nodeify(cb); } /** * [delete description] * @param {Obj} opt {} */ public delete(opt, cb = undefined) { this._log(opt); let my = this; return new Promise((resolve, reject) => { my.esClient.delete(opt, my._reqHandler(resolve, reject)); }).nodeify(cb); } /** * [update description] * @param {Obj} opt {index:, type:, id:, body:, size:, pretty:,} */ public update(opt, cb = undefined) { this._log(opt); let my = this; return new Promise((resolve, reject) => { my.esClient.update(opt, my._reqHandler(resolve, reject)); }).nodeify(cb); } /** * [search description] * @param {Obj} opt {index:, type:, id:, body:, size:, pretty:,} */ public search(opt, cb = undefined) { this._log(opt); let my = this; return new Promise((resolve, reject) => { my.esClient.search(opt, my._reqHandler(resolve, reject)); }).nodeify(cb); } /** * [bulk description] * @param {Obj} opt {body:,} */ public bulk(opt, cb = undefined) { this._log(opt); let my = this; return new Promise((resolve, reject) => { my.esClient.bulk(opt, my._reqHandler(resolve, reject)); }).nodeify(cb); } private _reqHandler(resolve, reject) { let my = this; return (err, res, status) => { if (err) { my.logger.debug(err.stack); return reject(new AppError(err.message, "ESHelperError", status)); } return resolve(res); }; } private _log(req) { let my = this; my.logger.debug(my.config.host + ": " + JSON.stringify(req)); } }