MitocGroup/deep-framework

View on GitHub
src/deep-search/lib/Client/Connection/Aws4SignedHttpConnection.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * Created by CCristi <ccovali@mitocgroup.com> on 3/28/16.
 */

'use strict';

import HttpConnection from 'elasticsearch/src/lib/connectors/http';
import aws4 from 'aws4';
import util from 'util';

/**
 * Aws4 Signed Http Connection Factory
 */
export class Aws4SignedHttpConnection extends HttpConnection {
  /**
   * @param {{accessKeyId: String, secretAccessKey: String}|null} awsCredentials
   * @param {Object[]} args
   */
  constructor(awsCredentials, ...args) {
    super(...args);

    this._awsCredentials = awsCredentials;
  }

  /**
   * @param {Object} params
   * @returns {*}
   */
  makeReqParams(params) {
    let body = params.body;

    params = super.makeReqParams(params);
    params.headers = params.headers || {};

    let signParams = {
      service: 'es',
      region: Aws4SignedHttpConnection.getEsDomainRegion(params.hostname),
      host: params.hostname,
      method: params.method,
      path: params.path,
      headers: util._extend(params.headers, {}),
    };

    if (body) {
      signParams.body = body;
    }

    let aws4Signature = this._createAws4Signature(signParams);

    ['X-Amz-Date', 'X-Amz-Security-Token', 'Authorization'].forEach((header) => {
      params.headers[header] = aws4Signature.headers[header];
    });

    return params;
  }

  /**
   * @param {Object} optsToSign
   * @returns {Object}
   * @private
   */
  _createAws4Signature(optsToSign) {
    return aws4.sign(optsToSign, this._awsCredentials);
  }

  /**
   * @param {String} esDomainHostname
   * @returns {String}
   */
  static getEsDomainRegion(esDomainHostname) {
    let regionParts = esDomainHostname.match(/\.([^\.]+)\.es\.amazonaws\.com$/i);

    if (regionParts && regionParts.length >= 2) {
      return regionParts[1];
    }

    throw new Error(`Invalid ES domain hostname "${esDomainHostname}".`);
  }

  /**
   * @param {{accessKeyId: String, secretAccessKey: String}|null} awsCredentials
   * @returns {Aws4SignedHttpConnection.prototype}
   */
  static createPrototype(awsCredentials = null) {
    return Aws4SignedHttpConnection.bind(null, awsCredentials);
  }
}