keymetrics.js

'use strict';

var Bucket  = require('./Bucket.js');
var User  = require('./User.js');
var Authenticate = require('./Authenticate');
var Realtime = require('./Realtime');
var Node = require('./Node');
var Changelog = require('./Changelog');
var EventEmitter2 = require('eventemitter2');


/**
 * @constructor
 * Keymetrics
 *
 * @param {object} opts                 The options are passed to the children instances
 * @param {string} opts.refresh_token   [Required] Refresh token (retrieved from Keymetrics dashboard)
 * @param {string} opts.token_type      [Required] Type: 'refresh_token' or 'access_token'
 * @param {string} opts.access_token    [Optional] Access token
 * @param {string} opts.public_key      [Optional] Bucket public key
 * @param {string} opts.realtime        [Optional] When true, attempts realtime connection on .init() 
 * @param {string} opts.public_key      [Optional] Bucket id
 * @param {string} opts.host            [Optional] Base url used (default 'http://app.keymetrics.io:3000')
 * @param {string} opts.basePath        [Optional] Base API path (default '/api')
 * @param {function} opts.bus           [Optional] EventEmitter2 instance
 */

var Keymetrics = function (opts) {
  var self = this;
  if (!(this instanceof Keymetrics)) {
    return new Keymetrics(opts);
  }
  opts = opts || {};

  this.api = {
    host : opts.host ||  'http://app.km.io:3000',
    basePath : opts.path || '/api'
  };
  opts.root_url = this.api.host + this.api.basePath;

  if (!opts.bus)
    opts.bus = new EventEmitter2({
      wildcard: true,
      delimiter: ':',
      maxListeners: 20
    });

  this.bus = opts.bus;

  this.auth = new Authenticate(opts);
  this.node = new Node(opts);
  this.changelog = new Changelog(opts);
  this.bucket = new Bucket(opts);
  this.realtime = new Realtime(opts);
  this.user = new User(opts);
  this.options = opts;
};


/**
 * Start the Keymetrics connection
 *
 * @param {function} callback Runs once connection is complete
 *
 */

Keymetrics.prototype.init = function (cb) {
  var self = this;
  var cb = cb || function(){};

  this.auth.init(this.options, function(err, res) {
    if (err) return cb(err);

    //If public key already setup
    if (self.options.public_key) {
      self.bucket.retrieve(self.options.public_key, function(err, res) {
        if (err) return cb(err);

        self.bus.emit("bucket:active", res._id);
        //If realtime is to be launched at start
        if (self.options.realtime)
          self.realtime.init(function (err, res) {
              return cb(err, res);
          });
        else
          return cb(null, res);
      });
    }
    else {
      return cb(new Error('Please setup public key for Keymetrics'), res);
    }
  });
};

module.exports = Keymetrics;