/*jshint laxcomma: true, smarttabs: true, node:true, esnext:true*/ 'use strict'; /** * Small wrapper around nats for quickly connecting / disconnecting * @module skyring/lib/nats * @author Eric Satterwhite * @since 1.0.0 * @requires url * @requires nats * @requires keef * @requires debug * @example const nats= require('skyring/lib/nats') const client = nats.createClient() client.publish('foobar', JSON.stringify({'foo':'bar'}), () => { nats.quit() }) */ const nats = require('nats') , parseHosts = require('./parse-hosts') , config = require('../../conf') , debug = require('debug')('skyring:nats') , nats_hosts = config.get('nats:hosts') /** * Creates a new nats client * @method module:skyring/lib/nats#createClient * @param {Object} [options] nats client configuration * @param {String} [options.hosts=localhost:4222] a comma separated list of addresses of nats hosts to connect to * @return {NatsClient} A nats client instance * @example nats.createClient({ hosts:'nats-1.domain.com:4222,nats-2.domain.com:4223,localhost:4222' }) **/ exports.createClient = createClient; function createClient(options) { const hosts = (options && options.hosts) || nats_hosts; const servers = parseHosts(hosts); const opts = Object.assign({json: true}, options, {servers}); debug('creating nats client', opts); const client = nats.connect(opts); /* istanbul ignore next*/ client.on('error', (err) => { console.error('nats error', err); }); client.on('connect', () => { debug('nats connection successful'); }); /* istanbul ignore next*/ client.on('close', () => { debug('nats connection closed'); client.removeAllListeners(); }); /* istanbul ignore next*/ client.on('disconnect', () => { debug('nats connection disconnected'); }); /* istanbul ignore next*/ client.on('reconnecting', () => { debug('nats client reconnecting'); }); client.quit = (cb) => { debug('closing nats', client.info.server_id); client.close(); client.once('disconnect', cb); }; return client; }