lib/client.js
function Client(options) {
  options = options || {};

  this.isClient = true;
  this.subdomain = options.subdomain;
  this.endpoint = options.endpoint;
  if (!this.subdomain && !this.endpoint) throw new Error('No subdomain was specified.');

  // Determine if we construct a URL from the subdomain or use a custom one
  if(this.endpoint && typeof this.endpoint !== 'undefined') {
    this.baseUrl = this.endpoint;
  } else {
    this.baseUrl = 'https://' + this.subdomain + '.desk.com';
  }

  if (options.username && options.password) {
    this.auth = { username: options.username, password: options.password, sendImmediately: true };
  } else if (options.consumerKey && options.consumerSecret && options.token && options.tokenSecret) {
    this.auth = {
      consumer_key: options.consumerKey,
      consumer_secret: options.consumerSecret,
      token: options.token,
      token_secret: options.tokenSecret
    };
  } else {
    throw new Error('No authentication specified, use either Basic Authentication or OAuth.');
  }

  this.retry = options.retry || false;
  this.maxRetry = options.maxRetry || 3;
  this.timeout = options.timeout;
  this.logger = options.logger || null;
  this.queue = async.queue(this.request.bind(this), 60);

  linkMixin.call(this, JSON.parse(fs.readFileSync(__dirname + '/resources.json', 'utf-8')));
}
function Client(options) {
  options = options || {};

  this.isClient = true;
  this.subdomain = options.subdomain;
  this.endpoint = options.endpoint;
  if (!this.subdomain && !this.endpoint) throw new Error('No subdomain was specified.');

  // Determine if we construct a URL from the subdomain or use a custom one
  if(this.endpoint && typeof this.endpoint !== 'undefined') {
    this.baseUrl = this.endpoint;
  } else {
    this.baseUrl = 'https://' + this.subdomain + '.desk.com';
  }

  if (options.username && options.password) {
    this.auth = { username: options.username, password: options.password, sendImmediately: true };
  } else if (options.consumerKey && options.consumerSecret && options.token && options.tokenSecret) {
    this.auth = {
      consumer_key: options.consumerKey,
      consumer_secret: options.consumerSecret,
      token: options.token,
      token_secret: options.tokenSecret
    };
  } else {
    throw new Error('No authentication specified, use either Basic Authentication or OAuth.');
  }

  this.retry = options.retry || false;
  this.maxRetry = options.maxRetry || 3;
  this.timeout = options.timeout;
  this.logger = options.logger || null;
  this.queue = async.queue(this.request.bind(this), 60);

  linkMixin.call(this, JSON.parse(fs.readFileSync(__dirname + '/resources.json', 'utf-8')));
}
Initialize a new `Client` with the given `options`.

Options:

- `subdomain` the desk.com subdomain to use
- `endpoint` the desk.com custom domain to use - if you use your own domain
- `username` username for basic authentication
- `password` password for basic authentication
- `consumerKey` consumer key for the oauth application
- `consumerSecret` secret for the oauth application
- `token` the token for the oauth authentication
- `tokenSecret` secret for the oauth authentication
- `retry` retry request on 429 and 503
- `logger` logging function to use for request logging

@param {Object} options
@api private