UNPKG

watson-developer-cloud

Version:

Client library to use the IBM Watson Services and AlchemyAPI

119 lines (98 loc) 3.68 kB
/** * Copyright 2014 IBM Corp. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ "use strict"; var extend = require('extend'); var vcapServices = require('vcap_services'); var helper = require('./helper'); var omit = require('object.omit'); var request = require('request'); /** * Base class that other services inherit from * @private * @param {Object} [options] * @constructor */ function BaseService(user_options) { if (!(this instanceof BaseService)) { // it might be better to just create a new instance and return that.. but that can't be done here, it has to be done in each individual service. So this is still a good failsafe even in that case. throw new Error('"new" keyword required to create Watson service instances'); } var options = extend({}, user_options); options = this.initCredentials(options); options = omit(options, ['version', 'username', 'password', 'use_vcap_services', 'use_unauthenticated', 'apikey']); if (options.url) options.url = helper.stripTrailingSlash(options.url); this._options = extend({qs: {}, url: this.constructor.URL}, this.serviceDefaults, options); } BaseService.prototype.initCredentials = function(options) { if (options.token) { options.headers = options.headers || {}; options.headers['X-Watson-Authorization-Token'] = options.token; return options; } options.jar = request.jar(); // Get credentials from environment properties or Bluemix // but prefer credentials provided pragmatically! options = extend( {}, this.getCredentialsFromBluemix(this.name), this.getCredentialsFromEnvironment(this.name), options ); // Use api_key or username and password as Authorization var user = options.username, pass = options.password, api_key = options.api_key; if (!options.use_unauthenticated) { // Check if 'api_key' or 'username' and 'password' were provided if (typeof api_key === 'undefined') { if (typeof user === 'undefined' || typeof pass === 'undefined') { throw new Error('Argument error: api_key or username and password were not specified'); } // Calculate and add api_key options.api_key = new Buffer(user + ':' + pass).toString('base64'); } } return options; }; /** * Pulls credentials from env properties * * Property checked is uppercase service.name suffixed by _USERNAME and _PASSWORD * * For example, if service.name is speech_to_text, env properties are SPEECH_TO_TEXT_USERNAME and SPEECH_TO_TEXT_PASSWORD * * @param name * @returns {{username: String|undefined, password: String|undefined}} */ BaseService.prototype.getCredentialsFromEnvironment = function(name) { name = name.toUpperCase(); return { username: process.env[name + '_USERNAME'], password: process.env[name + '_PASSWORD'] } }; /** * Pulls credentials from VCAP_SERVICES env property that bluemix sets * * @private * @returns {{}} */ BaseService.prototype.getCredentialsFromBluemix = function(vcap_services_name) { return vcapServices.getCredentials(vcap_services_name); }; module.exports = BaseService;