Source: ptolemy/actor/lib/jjs/node/apiai/module/apiai.js

/*!
 * apiai
 * Copyright(c) 2015 http://api.ai/
 * Apache 2.0 Licensed
 */

'use strict';

/**
 * Module dependencies.
 * @private
 */

var http = require('httpClient');

var ContextsRequest = require('./contexts_request').ContextsRequest;
var DeleteContextsRequest = require('./delete_contexts_request').DeleteContextsRequest;
var TextRequest = require('./text_request').TextRequest;
var EventRequest = require('./event_request').EventRequest;
var VoiceRequest = require('./voice_request').VoiceRequest;
var UserEntitiesRequest = require('./user_entities_request').UserEntitiesRequest;
var TTSRequest = require('./tts_request').TTSRequest;

/**
 * Module variables.
 * @private
 */

var version = '20150910';
var language = 'en';
var hostname = 'api.api.ai';
var endpoint = '/v1/';
var defaultSource = 'node';

/**
 * Module exports.
 * @public
 */

exports = module.exports = createApplication;

/**
 * Old version function for creation application instance.
 * @param  {string} clientAccessToken Access token. You can get it on https://api.ai
 * @param  {string} subscriptionKey   Subscribtion key. It has not been used anymore.
 * @param  {object} _options          Default option for apllication.
 * @return {Application}              [description]
 */
function createApplicationDeprecated(clientAccessToken, subscriptionKey, _options) {
    var options = _options || {};

    if (!clientAccessToken) {
        throw new Error('\'clientAccessToken\' cannot be empty.');
    }

    return new Application(clientAccessToken, options);
}

/**
 * New version function for creation application instance.
 * @param  {string} clientAccessToken Access token. You can get it on https://api.ai
 * @param  {string} subscriptionKey   Subscribtion key. It has not been used anymore.
 * @param  {object} _options          Default option for apllication.
 * @return {Application}              [description]
 */
function createApplicationNew(clientAccessToken, _options) {
    var options = _options || {};

    if (!clientAccessToken) {
        throw new Error('\'clientAccessToken\' cannot be empty.');
    }

    return new Application(clientAccessToken, options);
}

/**
 * Create an api.ai application.
 *
 * @param {*} args [description]
 * @return {Function}
 * @api public
 */
function createApplication() {
    if (arguments.length > 1) {
        if (typeof arguments[1] == "string") {
            return createApplicationDeprecated.apply(this, arguments);
        } else if (typeof arguments[1] == "object") {
            return createApplicationNew.apply(this, arguments);
        } else {
            throw new Error('Wrong parameters of initialization.');
        }
    } else {
        return createApplicationNew.apply(this, arguments);
    }
}

function Application(clientAccessToken, options) {
    var self = this;

    self.language = options.language || language;

    self.clientAccessToken = clientAccessToken;

    self.hostname = options.hostname || hostname;
    self.version = options.version || version;

    self.endpoint = options.endpoint || endpoint;
    self.requestSource = options.requestSource || defaultSource;

    if ('secure' in options) {
        self.secure = options.secure;
    } else {
        self.secure = true;
    }

    self._http = http;
}

Application.prototype.contextsRequest = function (contexts, options) {
    var self = this;

    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    return new ContextsRequest(self, contexts, opt);
};

/**
 * Delete/Reset all contexts for session by ID.
 * @param  {object} options Options for DeleteContextsRequest. Should contain sessionId.
 * @return {ContextsRequest}           Returns a ContextsRequest object.
 */
Application.prototype.deleteContextsRequest = function (options) {
    var self = this;

    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    return new DeleteContextsRequest(self, opt);
}

Application.prototype.textRequest = function (query, options) {
    var self = this;
    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    if (!('version' in opt)) {
        opt.version = self.version;
    }

    return new TextRequest(self, query, opt);
};

Application.prototype.eventRequest = function (event, options) {
    var self = this;
    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    if (!('version' in opt)) {
        opt.version = self.version;
    }

    return new EventRequest(self, event, opt);
};

/**
 * Make voice request object.
 * @param  {object} [options={}] Optionos for voice request.
 * @param  {string} [options.endpoint] [description]
 * @param  {string} [options.version] [description]
 * @return {VoiceRequest}         [description]
 * @deprecated since version 2.0
 */
Application.prototype.voiceRequest = function (options) {
    var self = this;
    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    if (!('version' in opt)) {
        opt.version = self.version;
    }

    return new VoiceRequest(self, opt);
};

Application.prototype.userEntitiesRequest = function (user_entities_body, options) {
    var self = this;
    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    return new UserEntitiesRequest(self, user_entities_body, opt);
};

Application.prototype.ttsRequest = function (text, options) {
    var self = this;
    var opt = options || {};

    if (!('endpoint' in opt)) {
        opt.endpoint = self.endpoint;
    }

    return new TTSRequest(self, text, opt);
};