├── .babelrc ├── .eslintrc.json ├── .github └── workflows │ └── codeql-analysis.yml ├── .gitignore ├── .npmignore ├── .travis.yml ├── LICENSE ├── README.md ├── SECURITY.md ├── dist ├── apigClient.js └── lib │ └── apiGatewayCore │ ├── apiGatewayClient.js │ ├── sigV4Client.js │ ├── simpleHttpClient.js │ └── utils.js ├── package-lock.json ├── package.json ├── src ├── apigClient.js └── lib │ └── apiGatewayCore │ ├── apiGatewayClient.js │ ├── sigV4Client.js │ ├── simpleHttpClient.js │ └── utils.js └── test └── apigClient.test.js /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "@babel/preset-env" 4 | ], 5 | "plugins": [ 6 | "@babel/plugin-transform-runtime" 7 | ], 8 | "ignore": [], 9 | "env": { 10 | "development": { 11 | "sourceMaps": "inline" 12 | } 13 | } 14 | } -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es6": true, 5 | "node": true 6 | }, 7 | "extends": "eslint:recommended", 8 | "globals": { 9 | "Atomics": "readonly", 10 | "SharedArrayBuffer": "readonly" 11 | }, 12 | "parserOptions": { 13 | "ecmaVersion": 2018, 14 | "sourceType": "module" 15 | }, 16 | "rules": { 17 | } 18 | } -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '43 17 * * 4' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | permissions: 28 | actions: read 29 | contents: read 30 | security-events: write 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | language: [ 'javascript' ] 36 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 37 | # Learn more: 38 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 39 | 40 | steps: 41 | - name: Checkout repository 42 | uses: actions/checkout@v2 43 | 44 | # Initializes the CodeQL tools for scanning. 45 | - name: Initialize CodeQL 46 | uses: github/codeql-action/init@v1 47 | with: 48 | languages: ${{ matrix.language }} 49 | # If you wish to specify custom queries, you can do so here or in a config file. 50 | # By default, queries listed here will override any specified in a config file. 51 | # Prefix the list here with "+" to use these queries and those in the config file. 52 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 53 | 54 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 55 | # If this step fails, then you should remove it and run the build manually (see below) 56 | - name: Autobuild 57 | uses: github/codeql-action/autobuild@v1 58 | 59 | # ℹ️ Command-line programs to run using the OS shell. 60 | # 📚 https://git.io/JvXDl 61 | 62 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 63 | # and modify them (or add more) to build your code if your project 64 | # uses a compiled language 65 | 66 | #- run: | 67 | # make bootstrap 68 | # make release 69 | 70 | - name: Perform CodeQL Analysis 71 | uses: github/codeql-action/analyze@v1 72 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | coverage 3 | .nyc_output 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src/* 2 | test/* 3 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 'stable' 4 | - 'lts/*' 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Takashi Kaneda 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![dependencies Status](https://david-dm.org/kndt84/aws-api-gateway-client/status.svg)](https://david-dm.org/kndt84/aws-api-gateway-client) 2 | [![Build Status](https://travis-ci.org/kndt84/aws-api-gateway-client.svg?branch=master)](https://travis-ci.org/kndt84/aws-api-gateway-client) 3 | [![npm](https://img.shields.io/npm/dm/aws-api-gateway-client.svg)](https://www.npmjs.com/package/aws-api-gateway-client) 4 | 5 | 6 | # Overview 7 | A module for AWS API gateway client based on auto-generated JavaScript SDK. This module can be used not only for Node.js but for front-end. In addition, it generalizes original SDK's endpoint specific methods. 8 | 9 | Reference: 10 | https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-generate-sdk.html 11 | 12 | # Prerequisites 13 | For the JavaScript SDK to work your APIs need to support CORS. The Amazon API Gateway developer guide explains how to [setup CORS for an endpoint](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html). 14 | 15 | # Install 16 | ``` 17 | npm install aws-api-gateway-client 18 | ``` 19 | 20 | # Use the SDK in your project 21 | 22 | Require module 23 | ``` 24 | var apigClientFactory = require('aws-api-gateway-client').default; 25 | ``` 26 | 27 | Set invokeUrl to config and create a client. For authorization, additional information is required as explained below. 28 | ``` 29 | config = {invokeUrl:'https://xxxxx.execute-api.us-east-1.amazonaws.com'} 30 | var apigClient = apigClientFactory.newClient(config); 31 | ``` 32 | 33 | Calls to an API take the form outlined below. Each API call returns a promise, that invokes either a success and failure callback 34 | 35 | ``` 36 | var pathParams = { 37 | //This is where path request params go. 38 | userId: '1234', 39 | }; 40 | // Template syntax follows url-template https://www.npmjs.com/package/url-template 41 | var pathTemplate = '/users/{userID}/profile' 42 | var method = 'GET'; 43 | var additionalParams = { 44 | //If there are query parameters or headers that need to be sent with the request you can add them here 45 | headers: { 46 | param0: '', 47 | param1: '' 48 | }, 49 | queryParams: { 50 | param0: '', 51 | param1: '' 52 | } 53 | }; 54 | var body = { 55 | //This is where you define the body of the request 56 | }; 57 | 58 | apigClient.invokeApi(pathParams, pathTemplate, method, additionalParams, body) 59 | .then(function(result){ 60 | //This is where you would put a success callback 61 | }).catch( function(result){ 62 | //This is where you would put an error callback 63 | }); 64 | ``` 65 | 66 | # Using AWS IAM for authorization 67 | To initialize the SDK with AWS Credentials use the code below. Note, if you use credentials all requests to the API will be signed. This means you will have to set the appropriate CORS accept-* headers for each request. 68 | 69 | ``` 70 | var apigClient = apigClientFactory.newClient({ 71 | invokeUrl:'https://xxxxx.execute-api.us-east-1.amazonaws.com', // REQUIRED 72 | 73 | region: 'eu-west-1', // REQUIRED: The region where the API is deployed. 74 | 75 | accessKey: 'ACCESS_KEY', // REQUIRED 76 | 77 | secretKey: 'SECRET_KEY', // REQUIRED 78 | 79 | sessionToken: 'SESSION_TOKEN', // OPTIONAL: If you are using temporary credentials 80 | you must include the session token. 81 | 82 | systemClockOffset: 0, // OPTIONAL: An offset value in milliseconds to apply to signing time 83 | 84 | retries: 4, // OPTIONAL: Number of times to retry before failing. Uses axios-retry plugin. 85 | 86 | retryCondition: (err) => { // OPTIONAL: Callback to further control if request should be retried. 87 | return err.response && err.response.status === 500; // Uses axios-retry plugin. 88 | }, 89 | 90 | retryDelay: 100 || 'exponential' || (retryCount, error) => { // OPTIONAL: Define delay (in ms) as a number, a callback, or 91 | return retryCount * 100 // 'exponential' to use the in-built exponential backoff 92 | }, // function. Uses axios-retry plugin. Default is no delay. 93 | 94 | shouldResetTimeout: false // OPTIONAL: Defines if the timeout should be reset between retries. Unless 95 | // `shouldResetTimeout` is set to `true`, the request timeout is 96 | // interpreted as a global value, so it is not used for each retry, 97 | // but for the whole request lifecycle. 98 | }); 99 | ``` 100 | 101 | # Using API Keys 102 | To use an API Key with the client SDK you can pass the key as a parameter to the Factory object. Note, if you use an apiKey it will be attached as the header 'x-api-key' to all requests to the API will be signed. This means you will have to set the appropriate CORS accept-* headers for each request. 103 | 104 | ``` 105 | var apigClient = apigClientFactory.newClient({ 106 | invokeUrl:'https://xxxxx.execute-api.us-east-1.amazonaws.com', // REQUIRED 107 | apiKey: 'API_KEY', // REQUIRED 108 | region: 'eu-west-1' // REQUIRED 109 | }); 110 | ``` 111 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | Use this section to tell people about which versions of your project are 6 | currently being supported with security updates. 7 | 8 | | Version | Supported | 9 | | ------- | ------------------ | 10 | | 5.1.x | :white_check_mark: | 11 | | 5.0.x | :x: | 12 | | 4.0.x | :white_check_mark: | 13 | | < 4.0 | :x: | 14 | 15 | ## Reporting a Vulnerability 16 | 17 | Use this section to tell people how to report a vulnerability. 18 | 19 | Tell them where to go, how often they can expect to get an update on a 20 | reported vulnerability, what to expect if the vulnerability is accepted or 21 | declined, etc. 22 | -------------------------------------------------------------------------------- /dist/apigClient.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 11 | 12 | var _urlTemplate = _interopRequireDefault(require("url-template")); 13 | 14 | var _apiGatewayClient = _interopRequireDefault(require("./lib/apiGatewayCore/apiGatewayClient")); 15 | 16 | /* 17 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 18 | * 19 | * Licensed under the Apache License, Version 2.0 (the "License"). 20 | * You may not use this file except in compliance with the License. 21 | * A copy of the License is located at 22 | * 23 | * http://aws.amazon.com/apache2.0 24 | * 25 | * or in the "license" file accompanying this file. This file is distributed 26 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 27 | * express or implied. See the License for the specific language governing 28 | * permissions and limitations under the License. 29 | */ 30 | var apigClientFactory = {}; 31 | 32 | var removeEmpty = function removeEmpty(obj) { 33 | Object.keys(obj).forEach(function (key) { 34 | return obj[key] && (0, _typeof2["default"])(obj[key]) === 'object' && removeEmpty(obj[key]) || obj[key] === undefined && delete obj[key]; 35 | }); 36 | return obj; 37 | }; 38 | 39 | apigClientFactory.newClient = function () { 40 | var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 41 | var apigClient = {}; 42 | config = Object.assign({ 43 | accessKey: '', 44 | secretKey: '', 45 | sessionToken: '', 46 | region: '', 47 | apiKey: '', 48 | invokeUrl: '', 49 | service: 'execute-api', 50 | defaultContentType: 'application/json', 51 | defaultAcceptType: 'application/json', 52 | systemClockOffset: 0, 53 | headers: {}, 54 | host: undefined 55 | }, removeEmpty(config)); // extract endpoint and path from url 56 | 57 | var invokeUrl = config.invokeUrl; 58 | var endpoint = /(^https?:\/\/[^/]+)/g.exec(invokeUrl)[1]; 59 | var pathComponent = invokeUrl.substring(endpoint.length); 60 | var sigV4ClientConfig = { 61 | accessKey: config.accessKey, 62 | secretKey: config.secretKey, 63 | sessionToken: config.sessionToken, 64 | serviceName: config.service, 65 | region: config.region, 66 | endpoint: endpoint, 67 | defaultContentType: config.defaultContentType, 68 | defaultAcceptType: config.defaultAcceptType, 69 | systemClockOffset: config.systemClockOffset, 70 | retries: config.retries, 71 | retryCondition: config.retryCondition, 72 | retryDelay: config.retryDelay, 73 | host: config.host 74 | }; 75 | var authType = 'NONE'; 76 | 77 | if (sigV4ClientConfig.accessKey !== undefined && sigV4ClientConfig.accessKey !== '' && sigV4ClientConfig.secretKey !== undefined && sigV4ClientConfig.secretKey !== '') { 78 | authType = 'AWS_IAM'; 79 | } 80 | 81 | var simpleHttpClientConfig = { 82 | endpoint: endpoint, 83 | defaultContentType: config.defaultContentType, 84 | defaultAcceptType: config.defaultAcceptType, 85 | retries: config.retries, 86 | retryCondition: config.retryCondition, 87 | retryDelay: config.retryDelay, 88 | headers: config.headers 89 | }; 90 | 91 | var apiGatewayClient = _apiGatewayClient["default"].newClient(simpleHttpClientConfig, sigV4ClientConfig); 92 | 93 | apigClient.invokeApi = function (params, pathTemplate, method, additionalParams, body) { 94 | if (additionalParams === undefined) additionalParams = {}; 95 | if (body === undefined) body = ''; 96 | var request = { 97 | verb: method.toUpperCase(), 98 | path: pathComponent + _urlTemplate["default"].parse(pathTemplate).expand(params), 99 | headers: additionalParams.headers || {}, 100 | timeout: additionalParams.timeout || 0, 101 | queryParams: additionalParams.queryParams, 102 | body: body 103 | }; 104 | return apiGatewayClient.makeRequest(request, authType, additionalParams, config.apiKey); 105 | }; 106 | 107 | return apigClient; 108 | }; 109 | 110 | var _default = apigClientFactory; 111 | exports["default"] = _default; 112 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hcGlnQ2xpZW50LmpzIl0sIm5hbWVzIjpbImFwaWdDbGllbnRGYWN0b3J5IiwicmVtb3ZlRW1wdHkiLCJvYmoiLCJPYmplY3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsInVuZGVmaW5lZCIsIm5ld0NsaWVudCIsImNvbmZpZyIsImFwaWdDbGllbnQiLCJhc3NpZ24iLCJhY2Nlc3NLZXkiLCJzZWNyZXRLZXkiLCJzZXNzaW9uVG9rZW4iLCJyZWdpb24iLCJhcGlLZXkiLCJpbnZva2VVcmwiLCJzZXJ2aWNlIiwiZGVmYXVsdENvbnRlbnRUeXBlIiwiZGVmYXVsdEFjY2VwdFR5cGUiLCJzeXN0ZW1DbG9ja09mZnNldCIsImhlYWRlcnMiLCJob3N0IiwiZW5kcG9pbnQiLCJleGVjIiwicGF0aENvbXBvbmVudCIsInN1YnN0cmluZyIsImxlbmd0aCIsInNpZ1Y0Q2xpZW50Q29uZmlnIiwic2VydmljZU5hbWUiLCJyZXRyaWVzIiwicmV0cnlDb25kaXRpb24iLCJyZXRyeURlbGF5IiwiYXV0aFR5cGUiLCJzaW1wbGVIdHRwQ2xpZW50Q29uZmlnIiwiYXBpR2F0ZXdheUNsaWVudCIsImFwaUdhdGV3YXlDbGllbnRGYWN0b3J5IiwiaW52b2tlQXBpIiwicGFyYW1zIiwicGF0aFRlbXBsYXRlIiwibWV0aG9kIiwiYWRkaXRpb25hbFBhcmFtcyIsImJvZHkiLCJyZXF1ZXN0IiwidmVyYiIsInRvVXBwZXJDYXNlIiwicGF0aCIsInVyaXRlbXBsYXRlIiwicGFyc2UiLCJleHBhbmQiLCJ0aW1lb3V0IiwicXVlcnlQYXJhbXMiLCJtYWtlUmVxdWVzdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFlQTs7QUFDQTs7QUFoQkE7Ozs7Ozs7Ozs7Ozs7O0FBa0JBLElBQU1BLGlCQUFpQixHQUFHLEVBQTFCOztBQUVBLElBQU1DLFdBQVcsR0FBRyxTQUFkQSxXQUFjLENBQUNDLEdBQUQsRUFBUztBQUMzQkMsRUFBQUEsTUFBTSxDQUFDQyxJQUFQLENBQVlGLEdB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S0FBaEI7QUFTQSxXQUFPUCxnQkFBZ0IsQ0FBQ2lCLFdBQWpCLENBQTZCVCxPQUE3QixFQUFzQ1YsUUFBdEMsRUFBZ0RRLGdCQUFoRCxFQUFrRWpDLE1BQU0sQ0FBQ08sTUFBekUsQ0FBUDtBQUNELEdBZEQ7O0FBZ0JBLFNBQU9OLFVBQVA7QUFDRCxDQWpGRDs7ZUFtRmVWLGlCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDEwLTIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLlxuICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgaHR0cDovL2F3cy5hbWF6b24uY29tL2FwYWNoZTIuMFxuICpcbiAqIG9yIGluIHRoZSBcImxpY2Vuc2VcIiBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZFxuICogb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZ1xuICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB1cml0ZW1wbGF0ZSBmcm9tICd1cmwtdGVtcGxhdGUnO1xuaW1wb3J0IGFwaUdhdGV3YXlDbGllbnRGYWN0b3J5IGZyb20gJy4vbGliL2FwaUdhdGV3YXlDb3JlL2FwaUdhdGV3YXlDbGllbnQnO1xuXG5jb25zdCBhcGlnQ2xpZW50RmFjdG9yeSA9IHt9O1xuXG5jb25zdCByZW1vdmVFbXB0eSA9IChvYmopID0+IHtcbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrZXkpID0+XG4gICAgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpICYmIHJlbW92ZUVtcHR5KG9ialtrZXldKVxuICAgIHx8IChvYmpba2V5XSA9PT0gdW5kZWZpbmVkKSAmJiBkZWxldGUgb2JqW2tleV1cbiAgKTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbmFwaWdDbGllbnRGYWN0b3J5Lm5ld0NsaWVudCA9IChjb25maWcgPSB7fSkgPT4ge1xuICBjb25zdCBhcGlnQ2xpZW50ID0ge307XG5cbiAgY29uZmlnID0gT2JqZWN0LmFzc2lnbih7XG4gICAgYWNjZXNzS2V5OiAnJyxcbiAgICBzZWNyZXRLZXk6ICcnLFxuICAgIHNlc3Npb25Ub2tlbjogJycsXG4gICAgcmVnaW9uOiAnJyxcbiAgICBhcGlLZXk6ICcnLFxuICAgIGludm9rZVVybDogJycsXG4gICAgc2VydmljZTogJ2V4ZWN1dGUtYXBpJyxcbiAgICBkZWZhdWx0Q29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICBkZWZhdWx0QWNjZXB0VHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIHN5c3RlbUNsb2NrT2Zmc2V0OiAwLFxuICAgIGhlYWRlcnM6IHt9LFxuICAgIGhvc3Q6IHVuZGVmaW5lZCxcbiAgfSwgcmVtb3ZlRW1wdHkoY29uZmlnKSk7XG5cbiAgLy8gZXh0cmFjdCBlbmRwb2ludCBhbmQgcGF0aCBmcm9tIHVybFxuICBjb25zdCBpbnZva2VVcmwgPSBjb25maWcuaW52b2tlVXJsO1xuICBjb25zdCBlbmRwb2ludCA9IC8oXmh0dHBzPzpcXC9cXC9bXi9dKykvZy5leGVjKGludm9rZVVybClbMV07XG4gIGNvbnN0IHBhdGhDb21wb25lbnQgPSBpbnZva2VVcmwuc3Vic3RyaW5nKGVuZHBvaW50Lmxlbmd0aCk7XG5cbiAgY29uc3Qgc2lnVjRDbGllbnRDb25maWcgPSB7XG4gICAgYWNjZXNzS2V5OiBjb25maWcuYWNjZXNzS2V5LFxuICAgIHNlY3JldEtleTogY29uZmlnLnNlY3JldEtleSxcbiAgICBzZXNzaW9uVG9rZW46IGNvbmZpZy5zZXNzaW9uVG9rZW4sXG4gICAgc2VydmljZU5hbWU6IGNvbmZpZy5zZXJ2aWNlLFxuICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICBlbmRwb2ludDogZW5kcG9pbnQsXG4gICAgZGVmYXVsdENvbnRlbnRUeXBlOiBjb25maWcuZGVmYXVsdENvbnRlbnRUeXBlLFxuICAgIGRlZmF1bHRBY2NlcHRUeXBlOiBjb25maWcuZGVmYXVsdEFjY2VwdFR5cGUsXG4gICAgc3lzdGVtQ2xvY2tPZmZzZXQ6IGNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCxcbiAgICByZXRyaWVzOiBjb25maWcucmV0cmllcyxcbiAgICByZXRyeUNvbmRpdGlvbjogY29uZmlnLnJldHJ5Q29uZGl0aW9uLFxuICAgIHJldHJ5RGVsYXk6IGNvbmZpZy5yZXRyeURlbGF5LFxuICAgIGhvc3Q6IGNvbmZpZy5ob3N0LFxuICB9O1xuXG4gIGxldCBhdXRoVHlwZSA9ICdOT05FJztcbiAgaWYgKFxuICAgIHNpZ1Y0Q2xpZW50Q29uZmlnLmFjY2Vzc0tleSAhPT0gdW5kZWZpbmVkXG4gICAgJiYgc2lnVjRDbGllbnRDb25maWcuYWNjZXNzS2V5ICE9PSAnJ1xuICAgICYmIHNpZ1Y0Q2xpZW50Q29uZmlnLnNlY3JldEtleSAhPT0gdW5kZWZpbmVkXG4gICAgJiYgc2lnVjRDbGllbnRDb25maWcuc2VjcmV0S2V5ICE9PSAnJ1xuICApIHtcbiAgICAgIGF1dGhUeXBlID0gJ0FXU19JQU0nO1xuICB9XG5cbiAgY29uc3Qgc2ltcGxlSHR0cENsaWVudENvbmZpZyA9IHtcbiAgICBlbmRwb2ludDogZW5kcG9pbnQsXG4gICAgZGVmYXVsdENvbnRlbnRUeXBlOiBjb25maWcuZGVmYXVsdENvbnRlbnRUeXBlLFxuICAgIGRlZmF1bHRBY2NlcHRUeXBlOiBjb25maWcuZGVmYXVsdEFjY2VwdFR5cGUsXG4gICAgcmV0cmllczogY29uZmlnLnJldHJpZXMsXG4gICAgcmV0cnlDb25kaXRpb246IGNvbmZpZy5yZXRyeUNvbmRpdGlvbixcbiAgICByZXRyeURlbGF5OiBjb25maWcucmV0cnlEZWxheSxcbiAgICBoZWFkZXJzOiBjb25maWcuaGVhZGVycyxcbiAgfTtcblxuICBjb25zdCBhcGlHYXRld2F5Q2xpZW50ID0gYXBpR2F0ZXdheUNsaWVudEZhY3RvcnkubmV3Q2xpZW50KFxuICAgIHNpbXBsZUh0dHBDbGllbnRDb25maWcsXG4gICAgc2lnVjRDbGllbnRDb25maWdcbiAgKTtcblxuICBhcGlnQ2xpZW50Lmludm9rZUFwaSA9IChwYXJhbXMsIHBhdGhUZW1wbGF0ZSwgbWV0aG9kLCBhZGRpdGlvbmFsUGFyYW1zLCBib2R5KSA9PiB7XG4gICAgaWYgKGFkZGl0aW9uYWxQYXJhbXM9PT11bmRlZmluZWQpIGFkZGl0aW9uYWxQYXJhbXM9e307XG4gICAgaWYgKGJvZHk9PT11bmRlZmluZWQpIGJvZHk9Jyc7XG5cbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgICB2ZXJiOiBtZXRob2QudG9VcHBlckNhc2UoKSxcbiAgICAgICAgcGF0aDogcGF0aENvbXBvbmVudCArIHVyaXRlbXBsYXRlLnBhcnNlKHBhdGhUZW1wbGF0ZSkuZXhwYW5kKHBhcmFtcyksXG4gICAgICAgIGhlYWRlcnM6IGFkZGl0aW9uYWxQYXJhbXMuaGVhZGVycyB8fCB7fSxcbiAgICAgICAgdGltZW91dDogYWRkaXRpb25hbFBhcmFtcy50aW1lb3V0IHx8IDAsXG4gICAgICAgIHF1ZXJ5UGFyYW1zOiBhZGRpdGlvbmFsUGFyYW1zLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBib2R5OiBib2R5XG4gICAgfTtcblxuICAgIHJldHVybiBhcGlHYXRld2F5Q2xpZW50Lm1ha2VSZXF1ZXN0KHJlcXVlc3QsIGF1dGhUeXBlLCBhZGRpdGlvbmFsUGFyYW1zLCBjb25maWcuYXBpS2V5KTtcbiAgfTtcblxuICByZXR1cm4gYXBpZ0NsaWVudDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFwaWdDbGllbnRGYWN0b3J5O1xuIl19 -------------------------------------------------------------------------------- /dist/lib/apiGatewayCore/apiGatewayClient.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _utils = _interopRequireDefault(require("./utils")); 11 | 12 | var _sigV4Client = _interopRequireDefault(require("./sigV4Client.js")); 13 | 14 | var _simpleHttpClient = _interopRequireDefault(require("./simpleHttpClient.js")); 15 | 16 | /* 17 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 18 | * 19 | * Licensed under the Apache License, Version 2.0 (the "License"). 20 | * You may not use this file except in compliance with the License. 21 | * A copy of the License is located at 22 | * 23 | * http://aws.amazon.com/apache2.0 24 | * 25 | * or in the "license" file accompanying this file. This file is distributed 26 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 27 | * express or implied. See the License for the specific language governing 28 | * permissions and limitations under the License. 29 | */ 30 | var apiGatewayClientFactory = {}; 31 | 32 | apiGatewayClientFactory.newClient = function (simpleHttpClientConfig, sigV4ClientConfig) { 33 | var apiGatewayClient = {}; // Spin up 2 httpClients, one for simple requests, one for SigV4 34 | 35 | var sigV4Client = _sigV4Client["default"].newClient(sigV4ClientConfig); 36 | 37 | var simpleHttpClient = _simpleHttpClient["default"].newClient(simpleHttpClientConfig); 38 | 39 | apiGatewayClient.makeRequest = function (request, authType, additionalParams, apiKey) { 40 | // Default the request to use the simple http client 41 | var clientToUse = simpleHttpClient; // Attach the apiKey to the headers request if one was provided 42 | 43 | if (apiKey !== undefined && apiKey !== '' && apiKey !== null) { 44 | request.headers['x-api-key'] = apiKey; 45 | } 46 | 47 | if (request.body === undefined || request.body === '' || request.body === null || Object.keys(request.body).length === 0) { 48 | request.body = undefined; 49 | } // If the user specified any additional headers or query params that may not have been modeled 50 | // merge them into the appropriate request properties 51 | 52 | 53 | request.headers = _utils["default"].mergeInto(request.headers, additionalParams.headers); 54 | request.queryParams = _utils["default"].mergeInto(request.queryParams, additionalParams.queryParams); 55 | request.timeout = _utils["default"].mergeInto(request.timeout, additionalParams.timeout); // If an auth type was specified inject the appropriate auth client 56 | 57 | if (authType === 'AWS_IAM') { 58 | clientToUse = sigV4Client; 59 | } // Call the selected http client to make the request, 60 | // returning a promise once the request is sent 61 | 62 | 63 | return clientToUse.makeRequest(request); 64 | }; 65 | 66 | return apiGatewayClient; 67 | }; 68 | 69 | var _default = apiGatewayClientFactory; 70 | exports["default"] = _default; 71 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBpR2F0ZXdheUNvcmUvYXBpR2F0ZXdheUNsaWVudC5qcyJdLCJuYW1lcyI6WyJhcGlHYXRld2F5Q2xpZW50RmFjdG9yeSIsIm5ld0NsaWVudCIsInNpbXBsZUh0dHBDbGllbnRDb25maWciLCJzaWdWNENsaWVudENvbmZpZyIsImFwaUdhdGV3YXlDbGllbnQiLCJzaWdWNENsaWVudCIsInNpZ1Y0Q2xpZW50RmFjdG9yeSIsInNpbXBsZUh0dHBDbGllbnQiLCJzaW1wbGVIdHRwQ2xpZW50RmFjdG9yeSIsIm1ha2VSZXF1ZXN0IiwicmVxdWVzdCIsImF1dGhUeXBlIiwiYWRkaXRpb25hbFBhcmFtcyIsImFwaUtleSIsImNsaWVudFRvVXNlIiwidW5kZWZpbmVkIiwiaGVhZGVycyIsImJvZHkiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwidXRpbHMiLCJtZXJnZUludG8iLCJxdWVyeVBhcmFtcyIsInRpbWVvdXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWVBOztBQUNBOztBQUNBOztBQWpCQTs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsSUFBTUEsdUJBQXVCLEdBQUcsRUFBaEM7O0FBQ0FBLHVCQUF1QixDQUFDQyxTQUF4QixHQUFvQyxVQUFTQyxzQkFBVCxFQUFpQ0MsaUJBQWpDLEVBQW9EO0FBQ3RGLE1BQUlDLGdCQUFnQixHQUFHLEVBQXZCLENBRHNGLENBRXRGOztBQUNBLE1BQUlDLFdBQVcsR0FBR0Msd0JBQW1CTCxTQUFuQixDQUE2QkUsaUJBQTdCLENBQWxCOztBQUNBLE1BQUlJLGdCQUFnQixHQUFHQyw2QkFBd0JQLFNBQXhCLENBQWtDQyxzQkFBbEMsQ0FBdkI7O0FBRUFFLEVBQUFBLGdCQUFnQixDQUFDSyxXQUFqQixHQUErQixVQUFTQyxPQUFULEVBQWtCQyxRQUFsQixFQUE0QkMsZ0JBQTVCLEVBQThDQyxNQUE5QyxFQUFzRDtBQUNuRjtBQUNBLFFBQUlDLFdBQVcsR0FBR1AsZ0JBQWxCLENBRm1GLENBSW5GOztBQUNBLFFBQUlNLE1BQU0sS0FBS0UsU0FBWCxJQUF3QkYsTUFBTSxLQUFLLEVBQW5DLElBQXlDQSxNQUFNLEtBQUssSUFBeEQsRUFBOEQ7QUFDNURILE1BQUFBLE9BQU8sQ0FBQ00sT0FBUixDQUFnQixXQUFoQixJQUErQkgsTUFBL0I7QUFDRDs7QUFFRCxRQUNFSCxPQUFPLENBQUNPLElBQVIsS0FBaUJGLFNBQWpCLElBQ0dMLE9BQU8sQ0FBQ08sSUFBUixLQUFpQixFQURwQixJQUVHUCxPQUFPLENBQUNPLElBQVIsS0FBaUIsSUFGcEIsSUFHR0MsTUFBTSxDQUFDQyxJQUFQLENBQVlULE9BQU8sQ0FBQ08sSUFBcEIsRUFBMEJHLE1BQTFCLEtBQXFDLENBSjFDLEVBS0U7QUFDQVYsTUFBQUEsT0FBTyxDQUFDTyxJQUFSLEdBQWVGLFNBQWY7QUFDRCxLQWhCa0YsQ0FrQm5GO0FBQ0E7OztBQUNBTCxJQUFBQSxPQUFPLENBQUNNLE9BQVIsR0FBa0JLLGtCQUFNQyxTQUFOLENBQWdCWixPQUFPLENBQUNNLE9BQXhCLEVBQWlDSixnQkFBZ0IsQ0FBQ0ksT0FBbEQsQ0FBbEI7QUFDQU4sSUFBQUEsT0FBTyxDQUFDYSxXQUFSLEdBQXNCRixrQkFBTUMsU0FBTixDQUFnQlosT0FBTyxDQUFDYSxXQUF4QixFQUFxQ1gsZ0JBQWdCLENBQUNXLFdBQXRELENBQXRCO0FBQ0FiLElBQUFBLE9BQU8sQ0FBQ2MsT0FBUixHQUFrQkgsa0JBQU1DLFNBQU4sQ0FBZ0JaLE9BQU8sQ0FBQ2MsT0FBeEIsRUFBaUNaLGdCQUFnQixDQUFDWSxPQUFsRCxDQUFsQixDQXRCbUYsQ0F3Qm5GOztBQUNBLFFBQUliLFFBQVEsS0FBSyxTQUFqQixFQUE0QjtBQUMxQkcsTUFBQUEsV0FBVyxHQUFHVCxXQUFkO0FBQ0QsS0EzQmtGLENBNkJuRjtBQUNBOzs7QUFDQSxXQUFPUyxXQUFXLENBQUNMLFdBQVosQ0FBd0JDLE9BQXhCLENBQVA7QUFDRCxHQWhDRDs7QUFpQ0EsU0FBT04sZ0JBQVA7QUFDRCxDQXhDRDs7ZUEwQ2VKLHVCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDEwLTIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLlxuICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgaHR0cDovL2F3cy5hbWF6b24uY29tL2FwYWNoZTIuMFxuICpcbiAqIG9yIGluIHRoZSBcImxpY2Vuc2VcIiBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZFxuICogb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZ1xuICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBzaWdWNENsaWVudEZhY3RvcnkgZnJvbSAnLi9zaWdWNENsaWVudC5qcyc7XG5pbXBvcnQgc2ltcGxlSHR0cENsaWVudEZhY3RvcnkgZnJvbSAnLi9zaW1wbGVIdHRwQ2xpZW50LmpzJztcblxuY29uc3QgYXBpR2F0ZXdheUNsaWVudEZhY3RvcnkgPSB7fTtcbmFwaUdhdGV3YXlDbGllbnRGYWN0b3J5Lm5ld0NsaWVudCA9IGZ1bmN0aW9uKHNpbXBsZUh0dHBDbGllbnRDb25maWcsIHNpZ1Y0Q2xpZW50Q29uZmlnKSB7XG4gIGxldCBhcGlHYXRld2F5Q2xpZW50ID0geyB9O1xuICAvLyBTcGluIHVwIDIgaHR0cENsaWVudHMsIG9uZSBmb3Igc2ltcGxlIHJlcXVlc3RzLCBvbmUgZm9yIFNpZ1Y0XG4gIGxldCBzaWdWNENsaWVudCA9IHNpZ1Y0Q2xpZW50RmFjdG9yeS5uZXdDbGllbnQoc2lnVjRDbGllbnRDb25maWcpO1xuICBsZXQgc2ltcGxlSHR0cENsaWVudCA9IHNpbXBsZUh0dHBDbGllbnRGYWN0b3J5Lm5ld0NsaWVudChzaW1wbGVIdHRwQ2xpZW50Q29uZmlnKTtcblxuICBhcGlHYXRld2F5Q2xpZW50Lm1ha2VSZXF1ZXN0ID0gZnVuY3Rpb24ocmVxdWVzdCwgYXV0aFR5cGUsIGFkZGl0aW9uYWxQYXJhbXMsIGFwaUtleSkge1xuICAgIC8vIERlZmF1bHQgdGhlIHJlcXVlc3QgdG8gdXNlIHRoZSBzaW1wbGUgaHR0cCBjbGllbnRcbiAgICBsZXQgY2xpZW50VG9Vc2UgPSBzaW1wbGVIdHRwQ2xpZW50O1xuXG4gICAgLy8gQXR0YWNoIHRoZSBhcGlLZXkgdG8gdGhlIGhlYWRlcnMgcmVxdWVzdCBpZiBvbmUgd2FzIHByb3ZpZGVkXG4gICAgaWYgKGFwaUtleSAhPT0gdW5kZWZpbmVkICYmIGFwaUtleSAhPT0gJycgJiYgYXBpS2V5ICE9PSBudWxsKSB7XG4gICAgICByZXF1ZXN0LmhlYWRlcnNbJ3gtYXBpLWtleSddID0gYXBpS2V5O1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHJlcXVlc3QuYm9keSA9PT0gdW5kZWZpbmVkXG4gICAgICB8fCByZXF1ZXN0LmJvZHkgPT09ICcnXG4gICAgICB8fCByZXF1ZXN0LmJvZHkgPT09IG51bGxcbiAgICAgIHx8IE9iamVjdC5rZXlzKHJlcXVlc3QuYm9keSkubGVuZ3RoID09PSAwXG4gICAgKSB7XG4gICAgICByZXF1ZXN0LmJvZHkgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHVzZXIgc3BlY2lmaWVkIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgb3IgcXVlcnkgcGFyYW1zIHRoYXQgbWF5IG5vdCBoYXZlIGJlZW4gbW9kZWxlZFxuICAgIC8vIG1lcmdlIHRoZW0gaW50byB0aGUgYXBwcm9wcmlhdGUgcmVxdWVzdCBwcm9wZXJ0aWVzXG4gICAgcmVxdWVzdC5oZWFkZXJzID0gdXRpbHMubWVyZ2VJbnRvKHJlcXVlc3QuaGVhZGVycywgYWRkaXRpb25hbFBhcmFtcy5oZWFkZXJzKTtcbiAgICByZXF1ZXN0LnF1ZXJ5UGFyYW1zID0gdXRpbHMubWVyZ2VJbnRvKHJlcXVlc3QucXVlcnlQYXJhbXMsIGFkZGl0aW9uYWxQYXJhbXMucXVlcnlQYXJhbXMpO1xuICAgIHJlcXVlc3QudGltZW91dCA9IHV0aWxzLm1lcmdlSW50byhyZXF1ZXN0LnRpbWVvdXQsIGFkZGl0aW9uYWxQYXJhbXMudGltZW91dCk7XG5cbiAgICAvLyBJZiBhbiBhdXRoIHR5cGUgd2FzIHNwZWNpZmllZCBpbmplY3QgdGhlIGFwcHJvcHJpYXRlIGF1dGggY2xpZW50XG4gICAgaWYgKGF1dGhUeXBlID09PSAnQVdTX0lBTScpIHtcbiAgICAgIGNsaWVudFRvVXNlID0gc2lnVjRDbGllbnQ7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCB0aGUgc2VsZWN0ZWQgaHR0cCBjbGllbnQgdG8gbWFrZSB0aGUgcmVxdWVzdCxcbiAgICAvLyByZXR1cm5pbmcgYSBwcm9taXNlIG9uY2UgdGhlIHJlcXVlc3QgaXMgc2VudFxuICAgIHJldHVybiBjbGllbnRUb1VzZS5tYWtlUmVxdWVzdChyZXF1ZXN0KTtcbiAgfTtcbiAgcmV0dXJuIGFwaUdhdGV3YXlDbGllbnQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhcGlHYXRld2F5Q2xpZW50RmFjdG9yeTtcbiJdfQ== -------------------------------------------------------------------------------- /dist/lib/apiGatewayCore/sigV4Client.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 11 | 12 | var _axios = _interopRequireDefault(require("axios")); 13 | 14 | var _axiosRetry = _interopRequireDefault(require("axios-retry")); 15 | 16 | var _sha = _interopRequireDefault(require("crypto-js/sha256")); 17 | 18 | var _encHex = _interopRequireDefault(require("crypto-js/enc-hex")); 19 | 20 | var _hmacSha = _interopRequireDefault(require("crypto-js/hmac-sha256")); 21 | 22 | var _url = _interopRequireDefault(require("url")); 23 | 24 | var _utils = _interopRequireDefault(require("./utils")); 25 | 26 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 27 | 28 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 29 | 30 | var sigV4ClientFactory = {}; 31 | 32 | sigV4ClientFactory.newClient = function (config) { 33 | var AWS_SHA_256 = 'AWS4-HMAC-SHA256'; 34 | var AWS4_REQUEST = 'aws4_request'; 35 | var AWS4 = 'AWS4'; 36 | var X_AMZ_DATE = 'x-amz-date'; 37 | var X_AMZ_SECURITY_TOKEN = 'x-amz-security-token'; 38 | var HOST = 'host'; 39 | var AUTHORIZATION = 'Authorization'; 40 | 41 | function hash(value) { 42 | return (0, _sha["default"])(value); // eslint-disable-line 43 | } 44 | 45 | function hexEncode(value) { 46 | return value.toString(_encHex["default"]); 47 | } 48 | 49 | function hmac(secret, value) { 50 | return (0, _hmacSha["default"])(value, secret, { 51 | asBytes: true 52 | }); // eslint-disable-line 53 | } 54 | 55 | function buildCanonicalRequest(method, path, queryParams, headers, payload) { 56 | return method + '\n' + buildCanonicalUri(path) + '\n' + buildCanonicalQueryString(queryParams) + '\n' + buildCanonicalHeaders(headers) + '\n' + buildCanonicalSignedHeaders(headers) + '\n' + hexEncode(hash(payload)); 57 | } 58 | 59 | function hashCanonicalRequest(request) { 60 | return hexEncode(hash(request)); 61 | } 62 | 63 | function buildCanonicalUri(uri) { 64 | return encodeURI(uri); 65 | } 66 | 67 | function buildCanonicalQueryString(queryParams) { 68 | if (Object.keys(queryParams).length < 1) { 69 | return ''; 70 | } 71 | 72 | var sortedQueryParams = []; 73 | 74 | for (var property in queryParams) { 75 | if (Object.prototype.hasOwnProperty.call(queryParams, property)) { 76 | sortedQueryParams.push(property); 77 | } 78 | } 79 | 80 | sortedQueryParams.sort(); 81 | var canonicalQueryString = ''; 82 | 83 | for (var i = 0; i < sortedQueryParams.length; i++) { 84 | canonicalQueryString += sortedQueryParams[i] + '=' + fixedEncodeURIComponent(queryParams[sortedQueryParams[i]]) + '&'; 85 | } 86 | 87 | return canonicalQueryString.substr(0, canonicalQueryString.length - 1); 88 | } 89 | 90 | function fixedEncodeURIComponent(str) { 91 | return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { 92 | return '%' + c.charCodeAt(0).toString(16); 93 | }); 94 | } 95 | 96 | function buildCanonicalHeaders(headers) { 97 | var canonicalHeaders = ''; 98 | var sortedKeys = []; 99 | 100 | for (var property in headers) { 101 | if (Object.prototype.hasOwnProperty.call(headers, property)) { 102 | sortedKeys.push(property); 103 | } 104 | } 105 | 106 | sortedKeys.sort(function (a, b) { 107 | return a.toLowerCase().localeCompare(b.toLowerCase()); 108 | }); 109 | 110 | for (var i = 0; i < sortedKeys.length; i++) { 111 | canonicalHeaders += sortedKeys[i].toLowerCase() + ':' + headers[sortedKeys[i]] + '\n'; 112 | } 113 | 114 | return canonicalHeaders; 115 | } 116 | 117 | function buildCanonicalSignedHeaders(headers) { 118 | var sortedKeys = []; 119 | 120 | for (var property in headers) { 121 | if (Object.prototype.hasOwnProperty.call(headers, property)) { 122 | sortedKeys.push(property.toLowerCase()); 123 | } 124 | } 125 | 126 | sortedKeys.sort(); 127 | return sortedKeys.join(';'); 128 | } 129 | 130 | function buildStringToSign(datetime, credentialScope, hashedCanonicalRequest) { 131 | return AWS_SHA_256 + '\n' + datetime + '\n' + credentialScope + '\n' + hashedCanonicalRequest; 132 | } 133 | 134 | function buildCredentialScope(datetime, region, service) { 135 | return datetime.substr(0, 8) + '/' + region + '/' + service + '/' + AWS4_REQUEST; 136 | } 137 | 138 | function calculateSigningKey(secretKey, datetime, region, service) { 139 | return hmac(hmac(hmac(hmac(AWS4 + secretKey, datetime.substr(0, 8)), region), service), AWS4_REQUEST); 140 | } 141 | 142 | function calculateSignature(key, stringToSign) { 143 | return hexEncode(hmac(key, stringToSign)); 144 | } 145 | 146 | function buildAuthorizationHeader(accessKey, credentialScope, headers, signature) { 147 | return AWS_SHA_256 + ' Credential=' + accessKey + '/' + credentialScope + ', SignedHeaders=' + buildCanonicalSignedHeaders(headers) + ', Signature=' + signature; 148 | } 149 | 150 | var awsSigV4Client = {}; 151 | 152 | if (config.accessKey === undefined || config.secretKey === undefined) { 153 | return awsSigV4Client; 154 | } 155 | 156 | awsSigV4Client.accessKey = _utils["default"].assertDefined(config.accessKey, 'accessKey'); 157 | awsSigV4Client.secretKey = _utils["default"].assertDefined(config.secretKey, 'secretKey'); 158 | awsSigV4Client.sessionToken = config.sessionToken; 159 | awsSigV4Client.serviceName = _utils["default"].assertDefined(config.serviceName, 'serviceName'); 160 | awsSigV4Client.region = _utils["default"].assertDefined(config.region, 'region'); 161 | awsSigV4Client.endpoint = _utils["default"].assertDefined(config.endpoint, 'endpoint'); 162 | awsSigV4Client.retries = config.retries; 163 | awsSigV4Client.retryCondition = config.retryCondition; 164 | awsSigV4Client.retryDelay = config.retryDelay; 165 | awsSigV4Client.host = config.host; 166 | 167 | awsSigV4Client.makeRequest = function (request) { 168 | var verb = _utils["default"].assertDefined(request.verb, 'verb'); 169 | 170 | var path = _utils["default"].assertDefined(request.path, 'path'); 171 | 172 | var queryParams = _utils["default"].copy(request.queryParams); 173 | 174 | var timeout = _utils["default"].copy(request.timeout); 175 | 176 | if (queryParams === undefined) { 177 | queryParams = {}; 178 | } 179 | 180 | if (timeout === undefined) { 181 | timeout = 0; 182 | } 183 | 184 | var headers = _utils["default"].copy(request.headers); 185 | 186 | if (headers === undefined) { 187 | headers = {}; 188 | } // If the user has not specified an override for Content type the use default 189 | 190 | 191 | if (headers['Content-Type'] === undefined) { 192 | headers['Content-Type'] = config.defaultContentType; 193 | } // If the user has not specified an override for Accept type the use default 194 | 195 | 196 | if (headers['Accept'] === undefined) { 197 | headers['Accept'] = config.defaultAcceptType; 198 | } 199 | 200 | var body = _utils["default"].copy(request.body); // stringify request body if content type is JSON 201 | 202 | 203 | if (body && headers['Content-Type'] && headers['Content-Type'] === 'application/json') { 204 | body = JSON.stringify(body); 205 | } // If there is no body remove the content-type header so it is not included in SigV4 calculation 206 | 207 | 208 | if (body === '' || body === undefined || body === null) { 209 | delete headers['Content-Type']; 210 | } 211 | 212 | var datetime = new Date(new Date().getTime() + config.systemClockOffset).toISOString().replace(/\.\d{3}Z$/, 'Z').replace(/[:-]|\.\d{3}/g, ''); 213 | headers[X_AMZ_DATE] = datetime; 214 | 215 | if (awsSigV4Client.host) { 216 | headers[HOST] = awsSigV4Client.host; 217 | } else { 218 | var parser = _url["default"].parse(awsSigV4Client.endpoint); 219 | 220 | headers[HOST] = parser.hostname; 221 | } 222 | 223 | var canonicalRequest = buildCanonicalRequest(verb, path, queryParams, headers, body); 224 | var hashedCanonicalRequest = hashCanonicalRequest(canonicalRequest); 225 | var credentialScope = buildCredentialScope(datetime, awsSigV4Client.region, awsSigV4Client.serviceName); 226 | var stringToSign = buildStringToSign(datetime, credentialScope, hashedCanonicalRequest); 227 | var signingKey = calculateSigningKey(awsSigV4Client.secretKey, datetime, awsSigV4Client.region, awsSigV4Client.serviceName); 228 | var signature = calculateSignature(signingKey, stringToSign); 229 | headers[AUTHORIZATION] = buildAuthorizationHeader(awsSigV4Client.accessKey, credentialScope, headers, signature); 230 | 231 | if (awsSigV4Client.sessionToken !== undefined && awsSigV4Client.sessionToken !== '') { 232 | headers[X_AMZ_SECURITY_TOKEN] = awsSigV4Client.sessionToken; 233 | } 234 | 235 | delete headers[HOST]; 236 | var url = config.endpoint + path; 237 | var queryString = buildCanonicalQueryString(queryParams); 238 | 239 | if (queryString !== '') { 240 | url += '?' + queryString; 241 | } // Need to re-attach Content-Type if it is not specified at this point 242 | 243 | 244 | if (headers['Content-Type'] === undefined) { 245 | headers['Content-Type'] = config.defaultContentType; 246 | } 247 | 248 | var signedRequest = { 249 | headers: headers, 250 | timeout: timeout, 251 | data: body, 252 | method: verb, 253 | url: url 254 | }; 255 | 256 | if (config.retries !== undefined) { 257 | signedRequest.baseURL = url; 258 | 259 | var client = _axios["default"].create(signedRequest); // Allow user configurable delay, or built-in exponential delay 260 | 261 | 262 | var retryDelay = function retryDelay() { 263 | return 0; 264 | }; 265 | 266 | if (config.retryDelay === 'exponential') { 267 | retryDelay = _axiosRetry["default"].exponentialDelay; 268 | } else if (typeof config.retryDelay === 'number') { 269 | retryDelay = function retryDelay() { 270 | return parseInt(config.retryDelay); 271 | }; 272 | } else if (typeof config.retryDelay === 'function') { 273 | retryDelay = config.retryDelay; 274 | } 275 | 276 | (0, _axiosRetry["default"])(client, _objectSpread(_objectSpread({}, config), {}, { 277 | retryCondition: config.retryCondition, 278 | retryDelay: retryDelay 279 | })); 280 | return client.request(signedRequest); 281 | } 282 | 283 | return (0, _axios["default"])(signedRequest); 284 | }; 285 | 286 | return awsSigV4Client; 287 | }; 288 | 289 | var _default = sigV4ClientFactory; 290 | exports["default"] = _default; 291 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBpR2F0ZXdheUNvcmUvc2lnVjRDbGllbnQuanMiXSwibmFtZXMiOlsic2lnVjRDbGllbnRGYWN0b3J5IiwibmV3Q2xpZW50IiwiY29uZmlnIiwiQVdTX1NIQV8yNTYiLCJBV1M0X1JFUVVFU1QiLCJBV1M0IiwiWF9BTVpfREFURSIsIlhfQU1aX1NFQ1VSSVRZX1RPS0VOIiwiSE9TVCIsIkFVVEhPUklaQVRJT04iLCJoYXNoIiwidmFsdWUiLCJoZXhFbmNvZGUiLCJ0b1N0cmluZyIsImVuY0hleCIsImhtYWMiLCJzZWNyZXQiLCJhc0J5dGVzIiwiYnVpbGRDYW5vbmljYWxSZXF1ZXN0IiwibWV0aG9kIiwicGF0aCIsInF1ZXJ5UGFyYW1zIiwiaGVhZGVycyIsInBheWxvYWQiLCJidWlsZENhbm9uaWNhbFVyaSIsImJ1aWxkQ2Fub25pY2FsUXVlcnlTdHJpbmciLCJidWlsZENhbm9uaWNhbEhlYWRlcnMiLCJidWlsZENhbm9uaWNhbFNpZ25lZEhlYWRlcnMiLCJoYXNoQ2Fub25pY2FsUmVxdWVzdCIsInJlcXVlc3QiLCJ1cmkiLCJlbmNvZGVVUkkiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwic29ydGVkUXVlcnlQYXJhbXMiLCJwcm9wZXJ0eSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInB1c2giLCJzb3J0IiwiY2Fub25pY2FsUXVlcnlTdHJpbmciLCJpIiwiZml4ZWRFbmNvZGVVUklDb21wb25lbnQiLCJzdWJzdHIiLCJzdHIiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiYyIsImNoYXJDb2RlQXQiLCJjYW5vbmljYWxIZWFkZXJzIiwic29ydGVkS2V5cyIsInRvTG93ZXJDYXNlIiwiam9pbiIsImJ1aWxkU3RyaW5nVG9TaWduIiwiZGF0ZXRpbWUiLCJjcmVkZW50aWFsU2NvcGUiLCJoYXNoZWRDYW5vbmljYWxSZXF1ZXN0IiwiYnVpbGRDcmVkZW50aWFsU2NvcGUiLCJyZWdpb24iLCJzZXJ2aWNlIiwiY2FsY3VsYXRlU2lnbmluZ0tleSIsInNlY3JldEtleSIsImNhbGN1bGF0ZVNpZ25hdHVyZSIsImtleSIsInN0cmluZ1RvU2lnbiIsImJ1aWxkQXV0aG9yaXphdGlvbkhlYWRlciIsImFjY2Vzc0tleSIsInNpZ25hdHVyZSIsImF3c1NpZ1Y0Q2xpZW50IiwidW5kZWZpbmVkIiwidXRpbHMiLCJhc3NlcnREZWZpbmVkIiwic2Vzc2lvblRva2VuIiwic2VydmljZU5hbWUiLCJlbmRwb2ludCIsInJldHJpZXMiLCJyZXRyeUNvbmRpdGlvbiIsInJldHJ5RGVsYXkiLCJob3N0IiwibWFrZVJlcXVlc3QiLCJ2ZXJiIiwiY29weSIsInRpbWVvdXQiLCJkZWZhdWx0Q29udGVudFR5cGUiLCJkZWZhdWx0QWNjZXB0VHlwZSIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwiRGF0ZSIsImdldFRpbWUiLCJzeXN0ZW1DbG9ja09mZnNldCIsInRvSVNPU3RyaW5nIiwicGFyc2VyIiwidXJsUGFyc2VyIiwicGFyc2UiLCJob3N0bmFtZSIsImNhbm9uaWNhbFJlcXVlc3QiLCJzaWduaW5nS2V5IiwidXJsIiwicXVlcnlTdHJpbmciLCJzaWduZWRSZXF1ZXN0IiwiZGF0YSIsImJhc2VVUkwiLCJjbGllbnQiLCJheGlvcyIsImNyZWF0ZSIsImF4aW9zUmV0cnkiLCJleHBvbmVudGlhbERlbGF5IiwicGFyc2VJbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7OztBQUVBLElBQU1BLGtCQUFrQixHQUFHLEVBQTNCOztBQUNBQSxrQkFBa0IsQ0FBQ0MsU0FBbkIsR0FBK0IsVUFBU0MsTUFBVCxFQUFpQjtBQUM5QyxNQUFJQyxXQUFXLEdBQUcsa0JBQWxCO0FBQ0EsTUFBSUMsWUFBWSxHQUFHLGNBQW5CO0FBQ0EsTUFBSUMsSUFBSSxHQUFHLE1BQVg7QUFDQSxNQUFJQyxVQUFVLEdBQUcsWUFBakI7QUFDQSxNQUFJQyxvQkFB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LFVBQXBCO0FBQ0Q7O0FBRUQsa0NBQVcwQixNQUFYLGtDQUNLdkcsTUFETDtBQUVFNEUsUUFBQUEsY0FBYyxFQUFFNUUsTUFBTSxDQUFDNEUsY0FGekI7QUFHRUMsUUFBQUEsVUFBVSxFQUFWQTtBQUhGO0FBS0EsYUFBTzBCLE1BQU0sQ0FBQzVFLE9BQVAsQ0FBZXlFLGFBQWYsQ0FBUDtBQUNEOztBQUVELFdBQU8sdUJBQU1BLGFBQU4sQ0FBUDtBQUNELEdBdEhEOztBQXdIQSxTQUFPaEMsY0FBUDtBQUNELENBaFFEOztlQWtRZXRFLGtCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAyMDEwLTIwMTYgQW1hem9uLmNvbSwgSW5jLiBvciBpdHMgYWZmaWxpYXRlcy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpLlxuICogWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogQSBjb3B5IG9mIHRoZSBMaWNlbnNlIGlzIGxvY2F0ZWQgYXRcbiAqXG4gKiAgaHR0cDovL2F3cy5hbWF6b24uY29tL2FwYWNoZTIuMFxuICpcbiAqIG9yIGluIHRoZSBcImxpY2Vuc2VcIiBmaWxlIGFjY29tcGFueWluZyB0aGlzIGZpbGUuIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZFxuICogb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyXG4gKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZ1xuICogcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgYXhpb3NSZXRyeSBmcm9tICdheGlvcy1yZXRyeSc7XG5pbXBvcnQgU0hBMjU2IGZyb20gJ2NyeXB0by1qcy9zaGEyNTYnO1xuaW1wb3J0IGVuY0hleCBmcm9tICdjcnlwdG8tanMvZW5jLWhleCc7XG5pbXBvcnQgSG1hY1NIQTI1NiBmcm9tICdjcnlwdG8tanMvaG1hYy1zaGEyNTYnO1xuaW1wb3J0IHVybFBhcnNlciBmcm9tICd1cmwnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBzaWdWNENsaWVudEZhY3RvcnkgPSB7fTtcbnNpZ1Y0Q2xpZW50RmFjdG9yeS5uZXdDbGllbnQgPSBmdW5jdGlvbihjb25maWcpIHtcbiAgbGV0IEFXU19TSEFfMjU2ID0gJ0FXUzQtSE1BQy1TSEEyNTYnO1xuICBsZXQgQVdTNF9SRVFVRVNUID0gJ2F3czRfcmVxdWVzdCc7XG4gIGxldCBBV1M0ID0gJ0FXUzQnO1xuICBsZXQgWF9BTVpfREFURSA9ICd4LWFtei1kYXRlJztcbiAgbGV0IFhfQU1aX1NFQ1VSSVRZX1RPS0VOID0gJ3gtYW16LXNlY3VyaXR5LXRva2VuJztcbiAgbGV0IEhPU1QgPSAnaG9zdCc7XG4gIGxldCBBVVRIT1JJWkFUSU9OID0gJ0F1dGhvcml6YXRpb24nO1xuXG4gIGZ1bmN0aW9uIGhhc2godmFsdWUpIHtcbiAgICByZXR1cm4gU0hBMjU2KHZhbHVlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICB9XG5cbiAgZnVuY3Rpb24gaGV4RW5jb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKGVuY0hleCk7XG4gIH1cblxuICBmdW5jdGlvbiBobWFjKHNlY3JldCwgdmFsdWUpIHtcbiAgICByZXR1cm4gSG1hY1NIQTI1Nih2YWx1ZSwgc2VjcmV0LCB7YXNCeXRlczogdHJ1ZX0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENhbm9uaWNhbFJlcXVlc3QobWV0aG9kLCBwYXRoLCBxdWVyeVBhcmFtcywgaGVhZGVycywgcGF5bG9hZCkge1xuICAgIHJldHVybiBtZXRob2QgKyAnXFxuJyArXG4gICAgICBidWlsZENhbm9uaWNhbFVyaShwYXRoKSArICdcXG4nICtcbiAgICAgIGJ1aWxkQ2Fub25pY2FsUXVlcnlTdHJpbmcocXVlcnlQYXJhbXMpICsgJ1xcbicgK1xuICAgICAgYnVpbGRDYW5vbmljYWxIZWFkZXJzKGhlYWRlcnMpICsgJ1xcbicgK1xuICAgICAgYnVpbGRDYW5vbmljYWxTaWduZWRIZWFkZXJzKGhlYWRlcnMpICsgJ1xcbicgK1xuICAgICAgaGV4RW5jb2RlKGhhc2gocGF5bG9hZCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGFzaENhbm9uaWNhbFJlcXVlc3QocmVxdWVzdCkge1xuICAgIHJldHVybiBoZXhFbmNvZGUoaGFzaChyZXF1ZXN0KSk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENhbm9uaWNhbFVyaSh1cmkpIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJKHVyaSk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENhbm9uaWNhbFF1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgbGV0IHNvcnRlZFF1ZXJ5UGFyYW1zID0gW107XG4gICAgZm9yIChsZXQgcHJvcGVydHkgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnlQYXJhbXMsIHByb3BlcnR5KSkge1xuICAgICAgICBzb3J0ZWRRdWVyeVBhcmFtcy5wdXNoKHByb3BlcnR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGVkUXVlcnlQYXJhbXMuc29ydCgpO1xuXG4gICAgbGV0IGNhbm9uaWNhbFF1ZXJ5U3RyaW5nID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRRdWVyeVBhcmFtcy5sZW5ndGg7IGkrKykge1xuICAgICAgY2Fub25pY2FsUXVlcnlTdHJpbmcgKz0gc29ydGVkUXVlcnlQYXJhbXNbaV1cbiAgICAgICAgKyAnPScgKyBmaXhlZEVuY29kZVVSSUNvbXBvbmVudChxdWVyeVBhcmFtc1tzb3J0ZWRRdWVyeVBhcmFtc1tpXV0pICsgJyYnO1xuICAgIH1cbiAgICByZXR1cm4gY2Fub25pY2FsUXVlcnlTdHJpbmcuc3Vic3RyKDAsIGNhbm9uaWNhbFF1ZXJ5U3RyaW5nLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgZnVuY3Rpb24gZml4ZWRFbmNvZGVVUklDb21wb25lbnQoc3RyKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1shJygpKl0vZywgZnVuY3Rpb24oYykge1xuICAgICAgcmV0dXJuICclJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNik7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZENhbm9uaWNhbEhlYWRlcnMoaGVhZGVycykge1xuICAgIGxldCBjYW5vbmljYWxIZWFkZXJzID0gJyc7XG4gICAgbGV0IHNvcnRlZEtleXMgPSBbXTtcbiAgICBmb3IgKGxldCBwcm9wZXJ0eSBpbiBoZWFkZXJzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGhlYWRlcnMsIHByb3BlcnR5KSkge1xuICAgICAgICBzb3J0ZWRLZXlzLnB1c2gocHJvcGVydHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBzb3J0ZWRLZXlzLnNvcnQoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkS2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgY2Fub25pY2FsSGVhZGVycyArPSBzb3J0ZWRLZXlzW2ldLnRvTG93ZXJDYXNlKCkgKyAnOicgKyBoZWFkZXJzW3NvcnRlZEtleXNbaV1dICsgJ1xcbic7XG4gICAgfVxuICAgIHJldHVybiBjYW5vbmljYWxIZWFkZXJzO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRDYW5vbmljYWxTaWduZWRIZWFkZXJzKGhlYWRlcnMpIHtcbiAgICBsZXQgc29ydGVkS2V5cyA9IFtdO1xuICAgIGZvciAobGV0IHByb3BlcnR5IGluIGhlYWRlcnMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaGVhZGVycywgcHJvcGVydHkpKSB7XG4gICAgICAgIHNvcnRlZEtleXMucHVzaChwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc29ydGVkS2V5cy5zb3J0KCk7XG5cbiAgICByZXR1cm4gc29ydGVkS2V5cy5qb2luKCc7Jyk7XG4gIH1cblxuICBmdW5jdGlvbiBidWlsZFN0cmluZ1RvU2lnbihkYXRldGltZSwgY3JlZGVudGlhbFNjb3BlLCBoYXNoZWRDYW5vbmljYWxSZXF1ZXN0KSB7XG4gICAgcmV0dXJuIEFXU19TSEFfMjU2ICsgJ1xcbicgK1xuICAgICAgZGF0ZXRpbWUgKyAnXFxuJyArXG4gICAgICBjcmVkZW50aWFsU2NvcGUgKyAnXFxuJyArXG4gICAgICBoYXNoZWRDYW5vbmljYWxSZXF1ZXN0O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRDcmVkZW50aWFsU2NvcGUoZGF0ZXRpbWUsIHJlZ2lvbiwgc2VydmljZSkge1xuICAgIHJldHVybiBkYXRldGltZS5zdWJzdHIoMCwgOCkgKyAnLycgKyByZWdpb24gKyAnLycgKyBzZXJ2aWNlICsgJy8nICsgQVdTNF9SRVFVRVNUO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FsY3VsYXRlU2lnbmluZ0tleShzZWNyZXRLZXksIGRhdGV0aW1lLCByZWdpb24sIHNlcnZpY2UpIHtcbiAgICByZXR1cm4gaG1hYyhobWFjKGhtYWMoXG4gICAgICBobWFjKEFXUzQgKyBzZWNyZXRLZXksIGRhdGV0aW1lLnN1YnN0cigwLCA4KSksXG4gICAgICByZWdpb25cbiAgICApLCBzZXJ2aWNlKSwgQVdTNF9SRVFVRVNUKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbGN1bGF0ZVNpZ25hdHVyZShrZXksIHN0cmluZ1RvU2lnbikge1xuICAgIHJldHVybiBoZXhFbmNvZGUoaG1hYyhrZXksIHN0cmluZ1RvU2lnbikpO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRBdXRob3JpemF0aW9uSGVhZGVyKGFjY2Vzc0tleSwgY3JlZGVudGlhbFNjb3BlLCBoZWFkZXJzLCBzaWduYXR1cmUpIHtcbiAgICByZXR1cm4gQVdTX1NIQV8yNTYgKyAnIENyZWRlbnRpYWw9JyArIGFjY2Vzc0tleSArICcvJyArIGNyZWRlbnRpYWxTY29wZVxuICAgICAgKyAnLCBTaWduZWRIZWFkZXJzPScgKyBidWlsZENhbm9uaWNhbFNpZ25lZEhlYWRlcnMoaGVhZGVycykgKyAnLCBTaWduYXR1cmU9JyArIHNpZ25hdHVyZTtcbiAgfVxuXG4gIGxldCBhd3NTaWdWNENsaWVudCA9IHsgfTtcbiAgaWYgKGNvbmZpZy5hY2Nlc3NLZXkgPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc2VjcmV0S2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYXdzU2lnVjRDbGllbnQ7XG4gIH1cbiAgYXdzU2lnVjRDbGllbnQuYWNjZXNzS2V5ID0gdXRpbHMuYXNzZXJ0RGVmaW5lZChjb25maWcuYWNjZXNzS2V5LCAnYWNjZXNzS2V5Jyk7XG4gIGF3c1NpZ1Y0Q2xpZW50LnNlY3JldEtleSA9IHV0aWxzLmFzc2VydERlZmluZWQoY29uZmlnLnNlY3JldEtleSwgJ3NlY3JldEtleScpO1xuICBhd3NTaWdWNENsaWVudC5zZXNzaW9uVG9rZW4gPSBjb25maWcuc2Vzc2lvblRva2VuO1xuICBhd3NTaWdWNENsaWVudC5zZXJ2aWNlTmFtZSA9IHV0aWxzLmFzc2VydERlZmluZWQoY29uZmlnLnNlcnZpY2VOYW1lLCAnc2VydmljZU5hbWUnKTtcbiAgYXdzU2lnVjRDbGllbnQucmVnaW9uID0gdXRpbHMuYXNzZXJ0RGVmaW5lZChjb25maWcucmVnaW9uLCAncmVnaW9uJyk7XG4gIGF3c1NpZ1Y0Q2xpZW50LmVuZHBvaW50ID0gdXRpbHMuYXNzZXJ0RGVmaW5lZChjb25maWcuZW5kcG9pbnQsICdlbmRwb2ludCcpO1xuICBhd3NTaWdWNENsaWVudC5yZXRyaWVzID0gY29uZmlnLnJldHJpZXM7XG4gIGF3c1NpZ1Y0Q2xpZW50LnJldHJ5Q29uZGl0aW9uID0gY29uZmlnLnJldHJ5Q29uZGl0aW9uO1xuICBhd3NTaWdWNENsaWVudC5yZXRyeURlbGF5ID0gY29uZmlnLnJldHJ5RGVsYXk7XG4gIGF3c1NpZ1Y0Q2xpZW50Lmhvc3QgPSBjb25maWcuaG9zdDtcblxuICBhd3NTaWdWNENsaWVudC5tYWtlUmVxdWVzdCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICBsZXQgdmVyYiA9IHV0aWxzLmFzc2VydERlZmluZWQocmVxdWVzdC52ZXJiLCAndmVyYicpO1xuICAgIGxldCBwYXRoID0gdXRpbHMuYXNzZXJ0RGVmaW5lZChyZXF1ZXN0LnBhdGgsICdwYXRoJyk7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gdXRpbHMuY29weShyZXF1ZXN0LnF1ZXJ5UGFyYW1zKTtcbiAgICBsZXQgdGltZW91dCA9IHV0aWxzLmNvcHkocmVxdWVzdC50aW1lb3V0KTtcblxuICAgIGlmIChxdWVyeVBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHt9O1xuICAgIH1cblxuICAgIGlmICh0aW1lb3V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRpbWVvdXQgPSAwO1xuICAgIH1cbiAgICBsZXQgaGVhZGVycyA9IHV0aWxzLmNvcHkocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBpZiAoaGVhZGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBoZWFkZXJzID0ge307XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgYW4gb3ZlcnJpZGUgZm9yIENvbnRlbnQgdHlwZSB0aGUgdXNlIGRlZmF1bHRcbiAgICBpZiAoaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb25maWcuZGVmYXVsdENvbnRlbnRUeXBlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGFuIG92ZXJyaWRlIGZvciBBY2NlcHQgdHlwZSB0aGUgdXNlIGRlZmF1bHRcbiAgICBpZiAoaGVhZGVyc1snQWNjZXB0J10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snQWNjZXB0J10gPSBjb25maWcuZGVmYXVsdEFjY2VwdFR5cGU7XG4gICAgfVxuXG4gICAgbGV0IGJvZHkgPSB1dGlscy5jb3B5KHJlcXVlc3QuYm9keSk7XG5cbiAgICAvLyBzdHJpbmdpZnkgcmVxdWVzdCBib2R5IGlmIGNvbnRlbnQgdHlwZSBpcyBKU09OXG4gICAgaWYgKGJvZHkgJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09ICdhcHBsaWNhdGlvbi9qc29uJykge1xuICAgICAgYm9keSA9IEpTT04uc3RyaW5naWZ5KGJvZHkpO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIG5vIGJvZHkgcmVtb3ZlIHRoZSBjb250ZW50LXR5cGUgaGVhZGVyIHNvIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiBTaWdWNCBjYWxjdWxhdGlvblxuICAgIGlmIChib2R5ID09PSAnJyB8fCBib2R5ID09PSB1bmRlZmluZWQgfHwgYm9keSA9PT0gbnVsbCkge1xuICAgICAgZGVsZXRlIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddO1xuICAgIH1cblxuICAgIGxldCBkYXRldGltZSA9IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0KS50b0lTT1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLlxcZHszfVokLywgJ1onKS5yZXBsYWNlKC9bOi1dfFxcLlxcZHszfS9nLCAnJyk7XG4gICAgaGVhZGVyc1tYX0FNWl9EQVRFXSA9IGRhdGV0aW1lO1xuXG4gICAgaWYgKGF3c1NpZ1Y0Q2xpZW50Lmhvc3QpIHtcbiAgICAgIGhlYWRlcnNbSE9TVF0gPSBhd3NTaWdWNENsaWVudC5ob3N0O1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgcGFyc2VyID0gdXJsUGFyc2VyLnBhcnNlKGF3c1NpZ1Y0Q2xpZW50LmVuZHBvaW50KTtcbiAgICAgIGhlYWRlcnNbSE9TVF0gPSBwYXJzZXIuaG9zdG5hbWU7XG4gICAgfVxuXG4gICAgbGV0IGNhbm9uaWNhbFJlcXVlc3QgPSBidWlsZENhbm9uaWNhbFJlcXVlc3QodmVyYiwgcGF0aCwgcXVlcnlQYXJhbXMsIGhlYWRlcnMsIGJvZHkpO1xuICAgIGxldCBoYXNoZWRDYW5vbmljYWxSZXF1ZXN0ID0gaGFzaENhbm9uaWNhbFJlcXVlc3QoY2Fub25pY2FsUmVxdWVzdCk7XG4gICAgbGV0IGNyZWRlbnRpYWxTY29wZSA9IGJ1aWxkQ3JlZGVudGlhbFNjb3BlKFxuICAgICAgZGF0ZXRpbWUsXG4gICAgICBhd3NTaWdWNENsaWVudC5yZWdpb24sXG4gICAgICBhd3NTaWdWNENsaWVudC5zZXJ2aWNlTmFtZVxuICAgICk7XG4gICAgbGV0IHN0cmluZ1RvU2lnbiA9IGJ1aWxkU3RyaW5nVG9TaWduKGRhdGV0aW1lLCBjcmVkZW50aWFsU2NvcGUsIGhhc2hlZENhbm9uaWNhbFJlcXVlc3QpO1xuICAgIGxldCBzaWduaW5nS2V5ID0gY2FsY3VsYXRlU2lnbmluZ0tleShcbiAgICAgIGF3c1NpZ1Y0Q2xpZW50LnNlY3JldEtleSxcbiAgICAgIGRhdGV0aW1lLFxuICAgICAgYXdzU2lnVjRDbGllbnQucmVnaW9uLFxuICAgICAgYXdzU2lnVjRDbGllbnQuc2VydmljZU5hbWVcbiAgICApO1xuICAgIGxldCBzaWduYXR1cmUgPSBjYWxjdWxhdGVTaWduYXR1cmUoc2lnbmluZ0tleSwgc3RyaW5nVG9TaWduKTtcbiAgICBoZWFkZXJzW0FVVEhPUklaQVRJT05dID0gYnVpbGRBdXRob3JpemF0aW9uSGVhZGVyKFxuICAgICAgYXdzU2lnVjRDbGllbnQuYWNjZXNzS2V5LFxuICAgICAgY3JlZGVudGlhbFNjb3BlLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHNpZ25hdHVyZVxuICAgICk7XG4gICAgaWYgKGF3c1NpZ1Y0Q2xpZW50LnNlc3Npb25Ub2tlbiAhPT0gdW5kZWZpbmVkICYmIGF3c1NpZ1Y0Q2xpZW50LnNlc3Npb25Ub2tlbiAhPT0gJycpIHtcbiAgICAgIGhlYWRlcnNbWF9BTVpfU0VDVVJJVFlfVE9LRU5dID0gYXdzU2lnVjRDbGllbnQuc2Vzc2lvblRva2VuO1xuICAgIH1cbiAgICBkZWxldGUgaGVhZGVyc1tIT1NUXTtcblxuICAgIGxldCB1cmwgPSBjb25maWcuZW5kcG9pbnQgKyBwYXRoO1xuICAgIGxldCBxdWVyeVN0cmluZyA9IGJ1aWxkQ2Fub25pY2FsUXVlcnlTdHJpbmcocXVlcnlQYXJhbXMpO1xuICAgIGlmIChxdWVyeVN0cmluZyAhPT0gJycpIHtcbiAgICAgIHVybCArPSAnPycgKyBxdWVyeVN0cmluZztcbiAgICB9XG5cbiAgICAvLyBOZWVkIHRvIHJlLWF0dGFjaCBDb250ZW50LVR5cGUgaWYgaXQgaXMgbm90IHNwZWNpZmllZCBhdCB0aGlzIHBvaW50XG4gICAgaWYgKGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gY29uZmlnLmRlZmF1bHRDb250ZW50VHlwZTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmVkUmVxdWVzdCA9IHtcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgZGF0YTogYm9keSxcbiAgICAgIG1ldGhvZDogdmVyYixcbiAgICAgIHVybCxcbiAgICB9O1xuICAgIGlmIChjb25maWcucmV0cmllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBzaWduZWRSZXF1ZXN0LmJhc2VVUkwgPSB1cmw7XG4gICAgICBsZXQgY2xpZW50ID0gYXhpb3MuY3JlYXRlKHNpZ25lZFJlcXVlc3QpO1xuXG4gICAgICAvLyBBbGxvdyB1c2VyIGNvbmZpZ3VyYWJsZSBkZWxheSwgb3IgYnVpbHQtaW4gZXhwb25lbnRpYWwgZGVsYXlcbiAgICAgIGxldCByZXRyeURlbGF5ID0gKCkgPT4gMDtcbiAgICAgIGlmIChjb25maWcucmV0cnlEZWxheSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICByZXRyeURlbGF5ID0gYXhpb3NSZXRyeS5leHBvbmVudGlhbERlbGF5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnLnJldHJ5RGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHJ5RGVsYXkgPSAoKSA9PiBwYXJzZUludChjb25maWcucmV0cnlEZWxheSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcucmV0cnlEZWxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXRyeURlbGF5ID0gY29uZmlnLnJldHJ5RGVsYXk7XG4gICAgICB9XG5cbiAgICAgIGF4aW9zUmV0cnkoY2xpZW50LCB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgcmV0cnlDb25kaXRpb246IGNvbmZpZy5yZXRyeUNvbmRpdGlvbixcbiAgICAgICAgcmV0cnlEZWxheSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGNsaWVudC5yZXF1ZXN0KHNpZ25lZFJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBheGlvcyhzaWduZWRSZXF1ZXN0KTtcbiAgfTtcblxuICByZXR1cm4gYXdzU2lnVjRDbGllbnQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzaWdWNENsaWVudEZhY3Rvcnk7XG4iXX0= 292 | -------------------------------------------------------------------------------- /dist/lib/apiGatewayCore/simpleHttpClient.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); 11 | 12 | var _axios = _interopRequireDefault(require("axios")); 13 | 14 | var _axiosRetry = _interopRequireDefault(require("axios-retry")); 15 | 16 | var _utils = _interopRequireDefault(require("./utils")); 17 | 18 | function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } 19 | 20 | function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 21 | 22 | var simpleHttpClientFactory = {}; 23 | 24 | simpleHttpClientFactory.newClient = function (config) { 25 | function buildCanonicalQueryString(queryParams) { 26 | // Build a properly encoded query string from a QueryParam object 27 | if (Object.keys(queryParams).length < 1) { 28 | return ''; 29 | } 30 | 31 | var canonicalQueryString = ''; 32 | 33 | for (var property in queryParams) { 34 | if (Object.prototype.hasOwnProperty.call(queryParams, property)) { 35 | canonicalQueryString += encodeURIComponent(property) + '=' + encodeURIComponent(queryParams[property]) + '&'; 36 | } 37 | } 38 | 39 | return canonicalQueryString.substr(0, canonicalQueryString.length - 1); 40 | } 41 | 42 | var simpleHttpClient = {}; 43 | simpleHttpClient.endpoint = _utils["default"].assertDefined(config.endpoint, 'endpoint'); 44 | 45 | simpleHttpClient.makeRequest = function (request) { 46 | var verb = _utils["default"].assertDefined(request.verb, 'verb'); 47 | 48 | var path = _utils["default"].assertDefined(request.path, 'path'); 49 | 50 | var queryParams = _utils["default"].copy(request.queryParams); 51 | 52 | var timeout = _utils["default"].copy(request.timeout); 53 | 54 | if (queryParams === undefined) { 55 | queryParams = {}; 56 | } 57 | 58 | if (timeout === undefined) { 59 | timeout = 0; 60 | } 61 | 62 | var headers = _objectSpread(_objectSpread({}, _utils["default"].copy(request.headers)), config.headers); // If the user has not specified an override for Content type the use default 63 | 64 | 65 | if (headers['Content-Type'] === undefined) { 66 | headers['Content-Type'] = config.defaultContentType; 67 | } // If the user has not specified an override for Accept type the use default 68 | 69 | 70 | if (headers['Accept'] === undefined) { 71 | headers['Accept'] = config.defaultAcceptType; 72 | } 73 | 74 | var body = _utils["default"].copy(request.body); 75 | 76 | var url = config.endpoint + path; 77 | var queryString = buildCanonicalQueryString(queryParams); 78 | 79 | if (queryString !== '') { 80 | url += '?' + queryString; 81 | } 82 | 83 | var simpleHttpRequest = { 84 | headers: headers, 85 | timeout: timeout, 86 | data: body, 87 | method: verb, 88 | url: url 89 | }; 90 | 91 | if (config.retries !== undefined) { 92 | simpleHttpRequest.baseURL = url; 93 | 94 | var client = _axios["default"].create(simpleHttpRequest); // Allow user configurable delay, or built-in exponential delay 95 | 96 | 97 | var retryDelay = function retryDelay() { 98 | return 0; 99 | }; 100 | 101 | if (config.retryDelay === 'exponential') { 102 | retryDelay = _axiosRetry["default"].exponentialDelay; 103 | } else if (typeof config.retryDelay === 'number') { 104 | retryDelay = function retryDelay() { 105 | return parseInt(config.retryDelay); 106 | }; 107 | } else if (typeof config.retryDelay === 'function') { 108 | retryDelay = config.retryDelay; 109 | } 110 | 111 | (0, _axiosRetry["default"])(client, _objectSpread(_objectSpread({}, config), {}, { 112 | retryCondition: typeof config.retryCondition === 'function' ? config.retryCondition : _axiosRetry["default"].isNetworkOrIdempotentRequestError, 113 | retryDelay: retryDelay 114 | })); 115 | return client.request(simpleHttpRequest); 116 | } 117 | 118 | return (0, _axios["default"])(simpleHttpRequest); 119 | }; 120 | 121 | return simpleHttpClient; 122 | }; 123 | 124 | var _default = simpleHttpClientFactory; 125 | exports["default"] = _default; 126 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBpR2F0ZXdheUNvcmUvc2ltcGxlSHR0cENsaWVudC5qcyJdLCJuYW1lcyI6WyJzaW1wbGVIdHRwQ2xpZW50RmFjdG9yeSIsIm5ld0NsaWVudCIsImNvbmZpZyIsImJ1aWxkQ2Fub25pY2FsUXVlcnlTdHJpbmciLCJxdWVyeVBhcmFtcyIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJjYW5vbmljYWxRdWVyeVN0cmluZyIsInByb3BlcnR5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZW5jb2RlVVJJQ29tcG9uZW50Iiwic3Vic3RyIiwic2ltcGxlSHR0cENsaWVudCIsImVuZHBvaW50IiwidXRpbHMiLCJhc3NlcnREZWZpbmVkIiwibWFrZVJlcXVlc3QiLCJyZXF1ZXN0IiwidmVyYiIsInBhdGgiLCJjb3B5IiwidGltZW91dCIsInVuZGVmaW5lZCIsImhlYWRlcnMiLCJkZWZhdWx0Q29udGVudFR5cGUiLCJkZWZhdWx0QWNjZXB0VHlwZSIsImJvZHkiLCJ1cmwiLCJxdWVyeVN0cmluZyIsInNpbXBsZUh0dHBSZXF1ZXN0IiwiZGF0YSIsIm1ldGhvZCIsInJldHJpZXMiLCJiYXNlVVJMIiwiY2xpZW50IiwiYXhpb3MiLCJjcmVhdGUiLCJyZXRyeURlbGF5IiwiYXhpb3NSZXRyeSIsImV4cG9uZW50aWFsRGVsYXkiLCJwYXJzZUludCIsInJldHJ5Q29uZGl0aW9uIiwiaXNOZXR3b3JrT3JJZGVtcG90ZW50UmVxdWVzdEVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQWVBOztBQUNBOztBQUNBOzs7Ozs7QUFFQSxJQUFNQSx1QkFBdUIsR0FBRyxFQUFoQzs7QUFDQUEsdUJBQXVCLENBQUNDLFNBQXhCLEdBQW9DLFVBQUNDLE1BQUQsRUFBWTtBQUM5QyxXQUFTQyx5QkFBVCxDQUFtQ0MsV0FBbkMsRUFBZ0Q7QUFDOUM7QUFDQSxRQUFJQyxNQUFNLENBQUNDLElBQVAsQ0FBWUYsV0FBWixFQUF5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bmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIikuXG4gKiBZb3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBBIGNvcHkgb2YgdGhlIExpY2Vuc2UgaXMgbG9jYXRlZCBhdFxuICpcbiAqICBodHRwOi8vYXdzLmFtYXpvbi5jb20vYXBhY2hlMi4wXG4gKlxuICogb3IgaW4gdGhlIFwibGljZW5zZVwiIGZpbGUgYWNjb21wYW55aW5nIHRoaXMgZmlsZS4gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkXG4gKiBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXJcbiAqIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nXG4gKiBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBheGlvc1JldHJ5IGZyb20gJ2F4aW9zLXJldHJ5JztcbmltcG9ydCB1dGlscyBmcm9tICcuL3V0aWxzJztcblxuY29uc3Qgc2ltcGxlSHR0cENsaWVudEZhY3RvcnkgPSB7fTtcbnNpbXBsZUh0dHBDbGllbnRGYWN0b3J5Lm5ld0NsaWVudCA9IChjb25maWcpID0+IHtcbiAgZnVuY3Rpb24gYnVpbGRDYW5vbmljYWxRdWVyeVN0cmluZyhxdWVyeVBhcmFtcykge1xuICAgIC8vIEJ1aWxkIGEgcHJvcGVybHkgZW5jb2RlZCBxdWVyeSBzdHJpbmcgZnJvbSBhIFF1ZXJ5UGFyYW0gb2JqZWN0XG4gICAgaWYgKE9iamVjdC5rZXlzKHF1ZXJ5UGFyYW1zKS5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgbGV0IGNhbm9uaWNhbFF1ZXJ5U3RyaW5nID0gJyc7XG4gICAgZm9yIChsZXQgcHJvcGVydHkgaW4gcXVlcnlQYXJhbXMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocXVlcnlQYXJhbXMsIHByb3BlcnR5KSkge1xuICAgICAgICBjYW5vbmljYWxRdWVyeVN0cmluZyArPSBlbmNvZGVVUklDb21wb25lbnQocHJvcGVydHkpXG4gICAgICAgICAgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocXVlcnlQYXJhbXNbcHJvcGVydHldKSArICcmJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2Fub25pY2FsUXVlcnlTdHJpbmcuc3Vic3RyKDAsIGNhbm9uaWNhbFF1ZXJ5U3RyaW5nLmxlbmd0aCAtIDEpO1xuICB9XG5cbiAgbGV0IHNpbXBsZUh0dHBDbGllbnQgPSB7IH07XG4gIHNpbXBsZUh0dHBDbGllbnQuZW5kcG9pbnQgPSB1dGlscy5hc3NlcnREZWZpbmVkKGNvbmZpZy5lbmRwb2ludCwgJ2VuZHBvaW50Jyk7XG5cbiAgc2ltcGxlSHR0cENsaWVudC5tYWtlUmVxdWVzdCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcbiAgICBsZXQgdmVyYiA9IHV0aWxzLmFzc2VydERlZmluZWQocmVxdWVzdC52ZXJiLCAndmVyYicpO1xuICAgIGxldCBwYXRoID0gdXRpbHMuYXNzZXJ0RGVmaW5lZChyZXF1ZXN0LnBhdGgsICdwYXRoJyk7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zID0gdXRpbHMuY29weShyZXF1ZXN0LnF1ZXJ5UGFyYW1zKTtcbiAgICBsZXQgdGltZW91dCA9IHV0aWxzLmNvcHkocmVxdWVzdC50aW1lb3V0KTtcbiAgICBpZiAocXVlcnlQYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcXVlcnlQYXJhbXMgPSB7fTtcbiAgICB9XG4gICAgaWYgKHRpbWVvdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGltZW91dCA9IDA7XG4gICAgfVxuICAgIGxldCBoZWFkZXJzID0gey4uLnV0aWxzLmNvcHkocmVxdWVzdC5oZWFkZXJzKSwgLi4uY29uZmlnLmhlYWRlcnN9O1xuXG4gICAgLy8gSWYgdGhlIHVzZXIgaGFzIG5vdCBzcGVjaWZpZWQgYW4gb3ZlcnJpZGUgZm9yIENvbnRlbnQgdHlwZSB0aGUgdXNlIGRlZmF1bHRcbiAgICBpZiAoaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSBjb25maWcuZGVmYXVsdENvbnRlbnRUeXBlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB1c2VyIGhhcyBub3Qgc3BlY2lmaWVkIGFuIG92ZXJyaWRlIGZvciBBY2NlcHQgdHlwZSB0aGUgdXNlIGRlZmF1bHRcbiAgICBpZiAoaGVhZGVyc1snQWNjZXB0J10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snQWNjZXB0J10gPSBjb25maWcuZGVmYXVsdEFjY2VwdFR5cGU7XG4gICAgfVxuXG4gICAgbGV0IGJvZHkgPSB1dGlscy5jb3B5KHJlcXVlc3QuYm9keSk7XG5cbiAgICBsZXQgdXJsID0gY29uZmlnLmVuZHBvaW50ICsgcGF0aDtcbiAgICBsZXQgcXVlcnlTdHJpbmcgPSBidWlsZENhbm9uaWNhbFF1ZXJ5U3RyaW5nKHF1ZXJ5UGFyYW1zKTtcbiAgICBpZiAocXVlcnlTdHJpbmcgIT09ICcnKSB7XG4gICAgICB1cmwgKz0gJz8nICsgcXVlcnlTdHJpbmc7XG4gICAgfVxuXG4gICAgbGV0IHNpbXBsZUh0dHBSZXF1ZXN0ID0ge1xuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICBkYXRhOiBib2R5LFxuICAgICAgbWV0aG9kOiB2ZXJiLFxuICAgICAgdXJsOiB1cmwsXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLnJldHJpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2ltcGxlSHR0cFJlcXVlc3QuYmFzZVVSTCA9IHVybDtcbiAgICAgIGxldCBjbGllbnQgPSBheGlvcy5jcmVhdGUoc2ltcGxlSHR0cFJlcXVlc3QpO1xuXG4gICAgICAvLyBBbGxvdyB1c2VyIGNvbmZpZ3VyYWJsZSBkZWxheSwgb3IgYnVpbHQtaW4gZXhwb25lbnRpYWwgZGVsYXlcbiAgICAgIGxldCByZXRyeURlbGF5ID0gKCkgPT4gMDtcbiAgICAgIGlmIChjb25maWcucmV0cnlEZWxheSA9PT0gJ2V4cG9uZW50aWFsJykge1xuICAgICAgICByZXRyeURlbGF5ID0gYXhpb3NSZXRyeS5leHBvbmVudGlhbERlbGF5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnLnJldHJ5RGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHJldHJ5RGVsYXkgPSAoKSA9PiBwYXJzZUludChjb25maWcucmV0cnlEZWxheSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcucmV0cnlEZWxheSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXRyeURlbGF5ID0gY29uZmlnLnJldHJ5RGVsYXk7XG4gICAgICB9XG5cbiAgICAgIGF4aW9zUmV0cnkoY2xpZW50LCB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgcmV0cnlDb25kaXRpb246ICh0eXBlb2YgY29uZmlnLnJldHJ5Q29uZGl0aW9uID09PSAnZnVuY3Rpb24nKSA/IGNvbmZpZy5yZXRyeUNvbmRpdGlvbiA6IGF4aW9zUmV0cnkuaXNOZXR3b3JrT3JJZGVtcG90ZW50UmVxdWVzdEVycm9yLFxuICAgICAgICByZXRyeURlbGF5LFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gY2xpZW50LnJlcXVlc3Qoc2ltcGxlSHR0cFJlcXVlc3QpO1xuICAgIH1cbiAgICByZXR1cm4gYXhpb3Moc2ltcGxlSHR0cFJlcXVlc3QpO1xuICB9O1xuXG4gIHJldHVybiBzaW1wbGVIdHRwQ2xpZW50O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc2ltcGxlSHR0cENsaWVudEZhY3Rvcnk7XG4iXX0= -------------------------------------------------------------------------------- /dist/lib/apiGatewayCore/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); 4 | 5 | Object.defineProperty(exports, "__esModule", { 6 | value: true 7 | }); 8 | exports["default"] = void 0; 9 | 10 | var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); 11 | 12 | /* 13 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 14 | * 15 | * Licensed under the Apache License, Version 2.0 (the "License"). 16 | * You may not use this file except in compliance with the License. 17 | * A copy of the License is located at 18 | * 19 | * http://aws.amazon.com/apache2.0 20 | * 21 | * or in the "license" file accompanying this file. This file is distributed 22 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 23 | * express or implied. See the License for the specific language governing 24 | * permissions and limitations under the License. 25 | */ 26 | var utils = { 27 | assertDefined: function assertDefined(object, name) { 28 | if (object === undefined) { 29 | throw new Error("".concat(name, " must be defined")); 30 | } else { 31 | return object; 32 | } 33 | }, 34 | assertParametersDefined: function assertParametersDefined(params, keys, ignore) { 35 | if (keys === undefined) { 36 | return; 37 | } 38 | 39 | if (keys.length > 0 && params === undefined) { 40 | params = {}; 41 | } 42 | 43 | for (var i = 0; i < keys.length; i++) { 44 | if (!utils.contains(ignore, keys[i])) { 45 | utils.assertDefined(params[keys[i]], keys[i]); 46 | } 47 | } 48 | }, 49 | parseParametersToObject: function parseParametersToObject(params, keys) { 50 | if (params === undefined) { 51 | return {}; 52 | } 53 | 54 | var object = {}; 55 | 56 | for (var i = 0; i < keys.length; i++) { 57 | object[keys[i]] = params[keys[i]]; 58 | } 59 | 60 | return object; 61 | }, 62 | contains: function contains(a, obj) { 63 | if (a === undefined) { 64 | return false; 65 | } 66 | 67 | var i = a.length; 68 | 69 | while (i--) { 70 | if (a[i] === obj) { 71 | return true; 72 | } 73 | } 74 | 75 | return false; 76 | }, 77 | copy: function copy(obj) { 78 | if (null === obj || 'object' !== (0, _typeof2["default"])(obj)) return obj; 79 | 80 | var Buffer = require('buffer').Buffer; 81 | 82 | if (Buffer.isBuffer(obj)) return Buffer.from(obj); 83 | var copy = obj.constructor(); 84 | var attr = null; 85 | 86 | for (attr in obj) { 87 | if (Object.prototype.hasOwnProperty.call(obj, attr)) copy[attr] = obj[attr]; 88 | } 89 | 90 | return copy; 91 | }, 92 | mergeInto: function mergeInto(baseObj, additionalProps) { 93 | if (null === baseObj || 'object' !== (0, _typeof2["default"])(baseObj)) return baseObj; 94 | var merged = baseObj.constructor(); 95 | var attr = null; 96 | 97 | for (attr in baseObj) { 98 | if (Object.prototype.hasOwnProperty.call(baseObj, attr)) merged[attr] = baseObj[attr]; 99 | } 100 | 101 | if (null == additionalProps || 'object' != (0, _typeof2["default"])(additionalProps)) return baseObj; 102 | 103 | for (attr in additionalProps) { 104 | if (Object.prototype.hasOwnProperty.call(additionalProps, attr)) { 105 | merged[attr] = additionalProps[attr]; 106 | } 107 | } 108 | 109 | return merged; 110 | } 111 | }; 112 | var _default = utils; 113 | exports["default"] = _default; 114 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvYXBpR2F0ZXdheUNvcmUvdXRpbHMuanMiXSwibmFtZXMiOlsidXRpbHMiLCJhc3NlcnREZWZpbmVkIiwib2JqZWN0IiwibmFtZSIsInVuZGVmaW5lZCIsIkVycm9yIiwiYXNzZXJ0UGFyYW1ldGVyc0RlZmluZWQiLCJwYXJhbXMiLCJrZXlzIiwiaWdub3JlIiwibGVuZ3RoIiwiaSIsImNvbnRhaW5zIiwicGFyc2VQYXJhbWV0ZXJzVG9PYmplY3QiLCJhIiwib2JqIiwiY29weSIsIkJ1ZmZlciIsInJlcXVpcmUiLCJpc0J1ZmZlciIsImZyb20iLCJjb25zdHJ1Y3RvciIsImF0dHIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJtZXJnZUludG8iLCJiYXNlT2JqIiwiYWRkaXRpb25hbFByb3BzIiwibWVyZ2VkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7OztBQWVBLElBQU1BLEtBQUssR0FBRztBQUNaQyxFQUFBQSxhQUFhLEVBQUUsdUJBQVNDLE1BQVQsRUFBaUJDLElBQWpCLEVBQXVCO0FBQ3BDLFFBQUlELE1BQU0sS0FBS0UsU0FBZixFQUEwQjtBQUN4QixZQUFNLElBQUlDLEtBQUosV0FBYUYsSUFBYixzQkFBTjtBQUNELEtBRkQsTUFFTztBQUNMLGFBQU9ELE1BQVA7QUFDRDtBQUNGLEdBUFc7QUFRWkksRUFBQUEsdUJBQXVCLEVBQUUsaUNBQVNDLE1BQVQsRUFBaUJDLElBQWpCLEVBQXVCQyxNQUF2QixFQUErQjtBQUN0RCxRQUFJRCxJQUFJLEtBQUtKLFNBQWIsRUFBd0I7QUFDdEI7QUFDRDs7QUFDRCxRQUFJSSxJQUFJLENBQUNFLE1BQUwsR0FBYyxDQUFkLElBQW1CSCxNQUFNLEtBQUtILFNBQWxDLEVBQTZDO0FBQzNDRyxNQUFBQSxNQUFNLEdBQUcsRUFBVDtBQUNEOztBQUNELFNBQUssSUFBSUksQ0FBQyxHQUFHLENBQWIsRUFBZ0JBLENBQUMs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QVFPLGVBQVIsSUFBMkIscUNBQW1CQSxlQUFuQixDQUEvQixFQUFtRSxPQUFPRCxPQUFQOztBQUNuRSxTQUFLTixJQUFMLElBQWFPLGVBQWIsRUFBOEI7QUFDNUIsVUFBSU4sTUFBTSxDQUFDQyxTQUFQLENBQWlCQyxjQUFqQixDQUFnQ0MsSUFBaEMsQ0FBcUNHLGVBQXJDLEVBQXNEUCxJQUF0RCxDQUFKLEVBQWlFO0FBQy9EUSxRQUFBQSxNQUFNLENBQUNSLElBQUQsQ0FBTixHQUFlTyxlQUFlLENBQUNQLElBQUQsQ0FBOUI7QUFDRDtBQUNGOztBQUNELFdBQU9RLE1BQVA7QUFDRDtBQXBFVyxDQUFkO2VBdUVlOUIsSyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAxMC0yMDE2IEFtYXpvbi5jb20sIEluYy4gb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKS5cbiAqIFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIEEgY29weSBvZiB0aGUgTGljZW5zZSBpcyBsb2NhdGVkIGF0XG4gKlxuICogIGh0dHA6Ly9hd3MuYW1hem9uLmNvbS9hcGFjaGUyLjBcbiAqXG4gKiBvciBpbiB0aGUgXCJsaWNlbnNlXCIgZmlsZSBhY2NvbXBhbnlpbmcgdGhpcyBmaWxlLiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWRcbiAqIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlclxuICogZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmdcbiAqIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5jb25zdCB1dGlscyA9IHtcbiAgYXNzZXJ0RGVmaW5lZDogZnVuY3Rpb24ob2JqZWN0LCBuYW1lKSB7XG4gICAgaWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bmFtZX0gbXVzdCBiZSBkZWZpbmVkYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfVxuICB9LFxuICBhc3NlcnRQYXJhbWV0ZXJzRGVmaW5lZDogZnVuY3Rpb24ocGFyYW1zLCBrZXlzLCBpZ25vcmUpIHtcbiAgICBpZiAoa2V5cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChrZXlzLmxlbmd0aCA+IDAgJiYgcGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhcmFtcyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghdXRpbHMuY29udGFpbnMoaWdub3JlLCBrZXlzW2ldKSkge1xuICAgICAgICB1dGlscy5hc3NlcnREZWZpbmVkKHBhcmFtc1trZXlzW2ldXSwga2V5c1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwYXJzZVBhcmFtZXRlcnNUb09iamVjdDogZnVuY3Rpb24ocGFyYW1zLCBrZXlzKSB7XG4gICAgaWYgKHBhcmFtcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGxldCBvYmplY3QgPSB7IH07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3Rba2V5c1tpXV0gPSBwYXJhbXNba2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG4gIH0sXG4gIGNvbnRhaW5zOiBmdW5jdGlvbihhLCBvYmopIHtcbiAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCBpID0gYS5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgaWYgKGFbaV0gPT09IG9iaikge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBjb3B5OiBmdW5jdGlvbihvYmopIHtcbiAgICBpZiAobnVsbCA9PT0gb2JqIHx8ICdvYmplY3QnICE9PSB0eXBlb2Ygb2JqKSByZXR1cm4gb2JqO1xuICAgIGxldCBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG4gICAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSByZXR1cm4gQnVmZmVyLmZyb20ob2JqKTtcbiAgICBsZXQgY29weSA9IG9iai5jb25zdHJ1Y3RvcigpO1xuICAgIGxldCBhdHRyID0gbnVsbDtcbiAgICBmb3IgKGF0dHIgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgYXR0cikpIGNvcHlbYXR0cl0gPSBvYmpbYXR0cl07XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xuICB9LFxuICBtZXJnZUludG86IGZ1bmN0aW9uKGJhc2VPYmosIGFkZGl0aW9uYWxQcm9wcykge1xuICAgIGlmIChudWxsID09PSBiYXNlT2JqIHx8ICdvYmplY3QnICE9PSB0eXBlb2YgYmFzZU9iaikgcmV0dXJuIGJhc2VPYmo7XG4gICAgbGV0IG1lcmdlZCA9IGJhc2VPYmouY29uc3RydWN0b3IoKTtcbiAgICBsZXQgYXR0ciA9IG51bGw7XG4gICAgZm9yIChhdHRyIGluIGJhc2VPYmopIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYmFzZU9iaiwgYXR0cikpIG1lcmdlZFthdHRyXSA9IGJhc2VPYmpbYXR0cl07XG4gICAgfVxuICAgIGlmIChudWxsID09IGFkZGl0aW9uYWxQcm9wcyB8fCAnb2JqZWN0JyAhPSB0eXBlb2YgYWRkaXRpb25hbFByb3BzKSByZXR1cm4gYmFzZU9iajtcbiAgICBmb3IgKGF0dHIgaW4gYWRkaXRpb25hbFByb3BzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGFkZGl0aW9uYWxQcm9wcywgYXR0cikpIHtcbiAgICAgICAgbWVyZ2VkW2F0dHJdID0gYWRkaXRpb25hbFByb3BzW2F0dHJdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVyZ2VkO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1dGlscztcbiJdfQ== -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aws-api-gateway-client", 3 | "version": "0.3.7", 4 | "description": "A module for AWS API Gateway client", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/kndt84/aws-api-gateway-client.git" 8 | }, 9 | "keywords": [ 10 | "aws", 11 | "apigateway" 12 | ], 13 | "author": "kndt84", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/kndt84/aws-api-gateway-client/issues" 17 | }, 18 | "homepage": "https://github.com/kndt84/aws-api-gateway-client#readme", 19 | "main": "dist/apigClient.js", 20 | "scripts": { 21 | "build": "babel src -d dist", 22 | "prepare": "npm run lint && npm run build", 23 | "lint": "node node_modules/eslint/bin/eslint.js src", 24 | "test": "nyc ava" 25 | }, 26 | "ava": { 27 | "require": [ 28 | "@babel/register" 29 | ] 30 | }, 31 | "dependencies": { 32 | "@babel/runtime": "^7.12.5", 33 | "axios": "^0.21.1", 34 | "axios-retry": "^3.1.9", 35 | "crypto-js": "^4.0.0", 36 | "url": "^0.11.0", 37 | "url-template": "^2.0.8" 38 | }, 39 | "devDependencies": { 40 | "@babel/cli": "^7.14.5", 41 | "@babel/core": "^7.14.6", 42 | "@babel/plugin-transform-runtime": "^7.14.5", 43 | "@babel/preset-env": "^7.14.7", 44 | "@babel/register": "^7.14.5", 45 | "ava": "^3.15.0", 46 | "eslint": "^7.29.0", 47 | "nyc": "^15.1.0" 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/apigClient.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"). 5 | * You may not use this file except in compliance with the License. 6 | * A copy of the License is located at 7 | * 8 | * http://aws.amazon.com/apache2.0 9 | * 10 | * or in the "license" file accompanying this file. This file is distributed 11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 | * express or implied. See the License for the specific language governing 13 | * permissions and limitations under the License. 14 | */ 15 | 16 | import uritemplate from 'url-template'; 17 | import apiGatewayClientFactory from './lib/apiGatewayCore/apiGatewayClient'; 18 | 19 | const apigClientFactory = {}; 20 | 21 | const removeEmpty = (obj) => { 22 | Object.keys(obj).forEach((key) => 23 | (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key]) 24 | || (obj[key] === undefined) && delete obj[key] 25 | ); 26 | return obj; 27 | }; 28 | 29 | apigClientFactory.newClient = (config = {}) => { 30 | const apigClient = {}; 31 | 32 | config = Object.assign({ 33 | accessKey: '', 34 | secretKey: '', 35 | sessionToken: '', 36 | region: '', 37 | apiKey: '', 38 | invokeUrl: '', 39 | service: 'execute-api', 40 | defaultContentType: 'application/json', 41 | defaultAcceptType: 'application/json', 42 | systemClockOffset: 0, 43 | headers: {}, 44 | host: undefined, 45 | }, removeEmpty(config)); 46 | 47 | // extract endpoint and path from url 48 | const invokeUrl = config.invokeUrl; 49 | if (!invokeUrl) { 50 | throw new Error("invokeUrl must be specified!"); 51 | } 52 | 53 | const endpoint = /(^https?:\/\/[^/]+)/g.exec(invokeUrl)[1]; 54 | const pathComponent = invokeUrl.substring(endpoint.length); 55 | 56 | const sigV4ClientConfig = { 57 | accessKey: config.accessKey, 58 | secretKey: config.secretKey, 59 | sessionToken: config.sessionToken, 60 | serviceName: config.service, 61 | region: config.region, 62 | endpoint: endpoint, 63 | defaultContentType: config.defaultContentType, 64 | defaultAcceptType: config.defaultAcceptType, 65 | systemClockOffset: config.systemClockOffset, 66 | retries: config.retries, 67 | retryCondition: config.retryCondition, 68 | retryDelay: config.retryDelay, 69 | host: config.host, 70 | }; 71 | 72 | let authType = 'NONE'; 73 | if ( 74 | sigV4ClientConfig.accessKey !== undefined 75 | && sigV4ClientConfig.accessKey !== '' 76 | && sigV4ClientConfig.secretKey !== undefined 77 | && sigV4ClientConfig.secretKey !== '' 78 | ) { 79 | authType = 'AWS_IAM'; 80 | } 81 | 82 | const simpleHttpClientConfig = { 83 | endpoint: endpoint, 84 | defaultContentType: config.defaultContentType, 85 | defaultAcceptType: config.defaultAcceptType, 86 | retries: config.retries, 87 | retryCondition: config.retryCondition, 88 | retryDelay: config.retryDelay, 89 | headers: config.headers, 90 | }; 91 | 92 | const apiGatewayClient = apiGatewayClientFactory.newClient( 93 | simpleHttpClientConfig, 94 | sigV4ClientConfig 95 | ); 96 | 97 | apigClient.invokeApi = (params, pathTemplate, method, additionalParams, body) => { 98 | if (additionalParams===undefined) additionalParams={}; 99 | if (body===undefined) body=''; 100 | 101 | const request = { 102 | verb: method.toUpperCase(), 103 | path: pathComponent + uritemplate.parse(pathTemplate).expand(params), 104 | headers: additionalParams.headers || {}, 105 | timeout: additionalParams.timeout || 0, 106 | queryParams: additionalParams.queryParams, 107 | body: body 108 | }; 109 | 110 | return apiGatewayClient.makeRequest(request, authType, additionalParams, config.apiKey); 111 | }; 112 | 113 | return apigClient; 114 | }; 115 | 116 | export default apigClientFactory; 117 | -------------------------------------------------------------------------------- /src/lib/apiGatewayCore/apiGatewayClient.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"). 5 | * You may not use this file except in compliance with the License. 6 | * A copy of the License is located at 7 | * 8 | * http://aws.amazon.com/apache2.0 9 | * 10 | * or in the "license" file accompanying this file. This file is distributed 11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 | * express or implied. See the License for the specific language governing 13 | * permissions and limitations under the License. 14 | */ 15 | 16 | import utils from './utils'; 17 | import sigV4ClientFactory from './sigV4Client.js'; 18 | import simpleHttpClientFactory from './simpleHttpClient.js'; 19 | 20 | const apiGatewayClientFactory = {}; 21 | apiGatewayClientFactory.newClient = function(simpleHttpClientConfig, sigV4ClientConfig) { 22 | let apiGatewayClient = { }; 23 | // Spin up 2 httpClients, one for simple requests, one for SigV4 24 | let sigV4Client = sigV4ClientFactory.newClient(sigV4ClientConfig); 25 | let simpleHttpClient = simpleHttpClientFactory.newClient(simpleHttpClientConfig); 26 | 27 | apiGatewayClient.makeRequest = function(request, authType, additionalParams, apiKey) { 28 | // Default the request to use the simple http client 29 | let clientToUse = simpleHttpClient; 30 | 31 | // Attach the apiKey to the headers request if one was provided 32 | if (apiKey !== undefined && apiKey !== '' && apiKey !== null) { 33 | request.headers['x-api-key'] = apiKey; 34 | } 35 | 36 | if ( 37 | request.body === undefined 38 | || request.body === '' 39 | || request.body === null 40 | || Object.keys(request.body).length === 0 41 | ) { 42 | request.body = undefined; 43 | } 44 | 45 | // If the user specified any additional headers or query params that may not have been modeled 46 | // merge them into the appropriate request properties 47 | request.headers = utils.mergeInto(request.headers, additionalParams.headers); 48 | request.queryParams = utils.mergeInto(request.queryParams, additionalParams.queryParams); 49 | request.timeout = utils.mergeInto(request.timeout, additionalParams.timeout); 50 | 51 | // If an auth type was specified inject the appropriate auth client 52 | if (authType === 'AWS_IAM') { 53 | clientToUse = sigV4Client; 54 | } 55 | 56 | // Call the selected http client to make the request, 57 | // returning a promise once the request is sent 58 | return clientToUse.makeRequest(request); 59 | }; 60 | return apiGatewayClient; 61 | }; 62 | 63 | export default apiGatewayClientFactory; 64 | -------------------------------------------------------------------------------- /src/lib/apiGatewayCore/sigV4Client.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"). 5 | * You may not use this file except in compliance with the License. 6 | * A copy of the License is located at 7 | * 8 | * http://aws.amazon.com/apache2.0 9 | * 10 | * or in the "license" file accompanying this file. This file is distributed 11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 | * express or implied. See the License for the specific language governing 13 | * permissions and limitations under the License. 14 | */ 15 | 16 | import axios from 'axios'; 17 | import axiosRetry from 'axios-retry'; 18 | import SHA256 from 'crypto-js/sha256'; 19 | import encHex from 'crypto-js/enc-hex'; 20 | import HmacSHA256 from 'crypto-js/hmac-sha256'; 21 | import urlParser from 'url'; 22 | import utils from './utils'; 23 | 24 | const sigV4ClientFactory = {}; 25 | sigV4ClientFactory.newClient = function(config) { 26 | let AWS_SHA_256 = 'AWS4-HMAC-SHA256'; 27 | let AWS4_REQUEST = 'aws4_request'; 28 | let AWS4 = 'AWS4'; 29 | let X_AMZ_DATE = 'x-amz-date'; 30 | let X_AMZ_SECURITY_TOKEN = 'x-amz-security-token'; 31 | let HOST = 'host'; 32 | let AUTHORIZATION = 'Authorization'; 33 | 34 | function hash(value) { 35 | return SHA256(value); // eslint-disable-line 36 | } 37 | 38 | function hexEncode(value) { 39 | return value.toString(encHex); 40 | } 41 | 42 | function hmac(secret, value) { 43 | return HmacSHA256(value, secret, {asBytes: true}); // eslint-disable-line 44 | } 45 | 46 | function buildCanonicalRequest(method, path, queryParams, headers, payload) { 47 | return method + '\n' + 48 | buildCanonicalUri(path) + '\n' + 49 | buildCanonicalQueryString(queryParams) + '\n' + 50 | buildCanonicalHeaders(headers) + '\n' + 51 | buildCanonicalSignedHeaders(headers) + '\n' + 52 | hexEncode(hash(payload)); 53 | } 54 | 55 | function hashCanonicalRequest(request) { 56 | return hexEncode(hash(request)); 57 | } 58 | 59 | function buildCanonicalUri(uri) { 60 | return encodeURI(uri); 61 | } 62 | 63 | function buildCanonicalQueryString(queryParams) { 64 | if (Object.keys(queryParams).length < 1) { 65 | return ''; 66 | } 67 | 68 | let sortedQueryParams = []; 69 | for (let property in queryParams) { 70 | if (Object.prototype.hasOwnProperty.call(queryParams, property)) { 71 | sortedQueryParams.push(property); 72 | } 73 | } 74 | sortedQueryParams.sort(); 75 | 76 | let canonicalQueryString = ''; 77 | for (let i = 0; i < sortedQueryParams.length; i++) { 78 | canonicalQueryString += sortedQueryParams[i] 79 | + '=' + fixedEncodeURIComponent(queryParams[sortedQueryParams[i]]) + '&'; 80 | } 81 | return canonicalQueryString.substr(0, canonicalQueryString.length - 1); 82 | } 83 | 84 | function fixedEncodeURIComponent(str) { 85 | return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { 86 | return '%' + c.charCodeAt(0).toString(16); 87 | }); 88 | } 89 | 90 | function buildCanonicalHeaders(headers) { 91 | let canonicalHeaders = ''; 92 | let sortedKeys = []; 93 | for (let property in headers) { 94 | if (Object.prototype.hasOwnProperty.call(headers, property)) { 95 | sortedKeys.push(property); 96 | } 97 | } 98 | sortedKeys.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase())); 99 | 100 | for (let i = 0; i < sortedKeys.length; i++) { 101 | canonicalHeaders += sortedKeys[i].toLowerCase() + ':' + headers[sortedKeys[i]] + '\n'; 102 | } 103 | return canonicalHeaders; 104 | } 105 | 106 | function buildCanonicalSignedHeaders(headers) { 107 | let sortedKeys = []; 108 | for (let property in headers) { 109 | if (Object.prototype.hasOwnProperty.call(headers, property)) { 110 | sortedKeys.push(property.toLowerCase()); 111 | } 112 | } 113 | sortedKeys.sort(); 114 | 115 | return sortedKeys.join(';'); 116 | } 117 | 118 | function buildStringToSign(datetime, credentialScope, hashedCanonicalRequest) { 119 | return AWS_SHA_256 + '\n' + 120 | datetime + '\n' + 121 | credentialScope + '\n' + 122 | hashedCanonicalRequest; 123 | } 124 | 125 | function buildCredentialScope(datetime, region, service) { 126 | return datetime.substr(0, 8) + '/' + region + '/' + service + '/' + AWS4_REQUEST; 127 | } 128 | 129 | function calculateSigningKey(secretKey, datetime, region, service) { 130 | return hmac(hmac(hmac( 131 | hmac(AWS4 + secretKey, datetime.substr(0, 8)), 132 | region 133 | ), service), AWS4_REQUEST); 134 | } 135 | 136 | function calculateSignature(key, stringToSign) { 137 | return hexEncode(hmac(key, stringToSign)); 138 | } 139 | 140 | function buildAuthorizationHeader(accessKey, credentialScope, headers, signature) { 141 | return AWS_SHA_256 + ' Credential=' + accessKey + '/' + credentialScope 142 | + ', SignedHeaders=' + buildCanonicalSignedHeaders(headers) + ', Signature=' + signature; 143 | } 144 | 145 | let awsSigV4Client = { }; 146 | if (config.accessKey === undefined || config.secretKey === undefined) { 147 | return awsSigV4Client; 148 | } 149 | awsSigV4Client.accessKey = utils.assertDefined(config.accessKey, 'accessKey'); 150 | awsSigV4Client.secretKey = utils.assertDefined(config.secretKey, 'secretKey'); 151 | awsSigV4Client.sessionToken = config.sessionToken; 152 | awsSigV4Client.serviceName = utils.assertDefined(config.serviceName, 'serviceName'); 153 | awsSigV4Client.region = utils.assertDefined(config.region, 'region'); 154 | awsSigV4Client.endpoint = utils.assertDefined(config.endpoint, 'endpoint'); 155 | awsSigV4Client.retries = config.retries; 156 | awsSigV4Client.retryCondition = config.retryCondition; 157 | awsSigV4Client.retryDelay = config.retryDelay; 158 | awsSigV4Client.host = config.host; 159 | 160 | awsSigV4Client.makeRequest = function(request) { 161 | let verb = utils.assertDefined(request.verb, 'verb'); 162 | let path = utils.assertDefined(request.path, 'path'); 163 | let queryParams = utils.copy(request.queryParams); 164 | let timeout = utils.copy(request.timeout); 165 | 166 | if (queryParams === undefined) { 167 | queryParams = {}; 168 | } 169 | 170 | if (timeout === undefined) { 171 | timeout = 0; 172 | } 173 | let headers = utils.copy(request.headers); 174 | if (headers === undefined) { 175 | headers = {}; 176 | } 177 | 178 | // If the user has not specified an override for Content type the use default 179 | if (headers['Content-Type'] === undefined) { 180 | headers['Content-Type'] = config.defaultContentType; 181 | } 182 | 183 | // If the user has not specified an override for Accept type the use default 184 | if (headers['Accept'] === undefined) { 185 | headers['Accept'] = config.defaultAcceptType; 186 | } 187 | 188 | let body = utils.copy(request.body); 189 | 190 | // stringify request body if content type is JSON 191 | if (body && headers['Content-Type'] && headers['Content-Type'] === 'application/json') { 192 | body = JSON.stringify(body); 193 | } 194 | 195 | // If there is no body remove the content-type header so it is not included in SigV4 calculation 196 | if (body === '' || body === undefined || body === null) { 197 | delete headers['Content-Type']; 198 | } 199 | 200 | let datetime = new Date(new Date().getTime() + config.systemClockOffset).toISOString() 201 | .replace(/\.\d{3}Z$/, 'Z').replace(/[:-]|\.\d{3}/g, ''); 202 | headers[X_AMZ_DATE] = datetime; 203 | 204 | if (awsSigV4Client.host) { 205 | headers[HOST] = awsSigV4Client.host; 206 | } else { 207 | let parser = urlParser.parse(awsSigV4Client.endpoint); 208 | headers[HOST] = parser.hostname; 209 | } 210 | 211 | let canonicalRequest = buildCanonicalRequest(verb, path, queryParams, headers, body); 212 | let hashedCanonicalRequest = hashCanonicalRequest(canonicalRequest); 213 | let credentialScope = buildCredentialScope( 214 | datetime, 215 | awsSigV4Client.region, 216 | awsSigV4Client.serviceName 217 | ); 218 | let stringToSign = buildStringToSign(datetime, credentialScope, hashedCanonicalRequest); 219 | let signingKey = calculateSigningKey( 220 | awsSigV4Client.secretKey, 221 | datetime, 222 | awsSigV4Client.region, 223 | awsSigV4Client.serviceName 224 | ); 225 | let signature = calculateSignature(signingKey, stringToSign); 226 | headers[AUTHORIZATION] = buildAuthorizationHeader( 227 | awsSigV4Client.accessKey, 228 | credentialScope, 229 | headers, 230 | signature 231 | ); 232 | if (awsSigV4Client.sessionToken !== undefined && awsSigV4Client.sessionToken !== '') { 233 | headers[X_AMZ_SECURITY_TOKEN] = awsSigV4Client.sessionToken; 234 | } 235 | delete headers[HOST]; 236 | 237 | let url = config.endpoint + path; 238 | let queryString = buildCanonicalQueryString(queryParams); 239 | if (queryString !== '') { 240 | url += '?' + queryString; 241 | } 242 | 243 | // Need to re-attach Content-Type if it is not specified at this point 244 | if (headers['Content-Type'] === undefined) { 245 | headers['Content-Type'] = config.defaultContentType; 246 | } 247 | 248 | let signedRequest = { 249 | headers: headers, 250 | timeout: timeout, 251 | data: body, 252 | method: verb, 253 | url, 254 | }; 255 | if (config.retries !== undefined) { 256 | signedRequest.baseURL = url; 257 | let client = axios.create(signedRequest); 258 | 259 | // Allow user configurable delay, or built-in exponential delay 260 | let retryDelay = () => 0; 261 | if (config.retryDelay === 'exponential') { 262 | retryDelay = axiosRetry.exponentialDelay; 263 | } else if (typeof config.retryDelay === 'number') { 264 | retryDelay = () => parseInt(config.retryDelay); 265 | } else if (typeof config.retryDelay === 'function') { 266 | retryDelay = config.retryDelay; 267 | } 268 | 269 | axiosRetry(client, { 270 | ...config, 271 | retryCondition: config.retryCondition, 272 | retryDelay, 273 | }); 274 | return client.request(signedRequest); 275 | } 276 | 277 | return axios(signedRequest); 278 | }; 279 | 280 | return awsSigV4Client; 281 | }; 282 | 283 | export default sigV4ClientFactory; 284 | -------------------------------------------------------------------------------- /src/lib/apiGatewayCore/simpleHttpClient.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"). 5 | * You may not use this file except in compliance with the License. 6 | * A copy of the License is located at 7 | * 8 | * http://aws.amazon.com/apache2.0 9 | * 10 | * or in the "license" file accompanying this file. This file is distributed 11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 | * express or implied. See the License for the specific language governing 13 | * permissions and limitations under the License. 14 | */ 15 | 16 | import axios from 'axios'; 17 | import axiosRetry from 'axios-retry'; 18 | import utils from './utils'; 19 | 20 | const simpleHttpClientFactory = {}; 21 | simpleHttpClientFactory.newClient = (config) => { 22 | function buildCanonicalQueryString(queryParams) { 23 | // Build a properly encoded query string from a QueryParam object 24 | if (Object.keys(queryParams).length < 1) { 25 | return ''; 26 | } 27 | 28 | let canonicalQueryString = ''; 29 | for (let property in queryParams) { 30 | if (Object.prototype.hasOwnProperty.call(queryParams, property)) { 31 | canonicalQueryString += encodeURIComponent(property) 32 | + '=' + encodeURIComponent(queryParams[property]) + '&'; 33 | } 34 | } 35 | 36 | return canonicalQueryString.substr(0, canonicalQueryString.length - 1); 37 | } 38 | 39 | let simpleHttpClient = { }; 40 | simpleHttpClient.endpoint = utils.assertDefined(config.endpoint, 'endpoint'); 41 | 42 | simpleHttpClient.makeRequest = function(request) { 43 | let verb = utils.assertDefined(request.verb, 'verb'); 44 | let path = utils.assertDefined(request.path, 'path'); 45 | let queryParams = utils.copy(request.queryParams); 46 | let timeout = utils.copy(request.timeout); 47 | if (queryParams === undefined) { 48 | queryParams = {}; 49 | } 50 | if (timeout === undefined) { 51 | timeout = 0; 52 | } 53 | let headers = {...utils.copy(request.headers), ...config.headers}; 54 | 55 | // If the user has not specified an override for Content type the use default 56 | if (headers['Content-Type'] === undefined) { 57 | headers['Content-Type'] = config.defaultContentType; 58 | } 59 | 60 | // If the user has not specified an override for Accept type the use default 61 | if (headers['Accept'] === undefined) { 62 | headers['Accept'] = config.defaultAcceptType; 63 | } 64 | 65 | let body = utils.copy(request.body); 66 | 67 | let url = config.endpoint + path; 68 | let queryString = buildCanonicalQueryString(queryParams); 69 | if (queryString !== '') { 70 | url += '?' + queryString; 71 | } 72 | 73 | let simpleHttpRequest = { 74 | headers: headers, 75 | timeout: timeout, 76 | data: body, 77 | method: verb, 78 | url: url, 79 | }; 80 | if (config.retries !== undefined) { 81 | simpleHttpRequest.baseURL = url; 82 | let client = axios.create(simpleHttpRequest); 83 | 84 | // Allow user configurable delay, or built-in exponential delay 85 | let retryDelay = () => 0; 86 | if (config.retryDelay === 'exponential') { 87 | retryDelay = axiosRetry.exponentialDelay; 88 | } else if (typeof config.retryDelay === 'number') { 89 | retryDelay = () => parseInt(config.retryDelay); 90 | } else if (typeof config.retryDelay === 'function') { 91 | retryDelay = config.retryDelay; 92 | } 93 | 94 | axiosRetry(client, { 95 | ...config, 96 | retryCondition: (typeof config.retryCondition === 'function') ? config.retryCondition : axiosRetry.isNetworkOrIdempotentRequestError, 97 | retryDelay, 98 | }); 99 | return client.request(simpleHttpRequest); 100 | } 101 | return axios(simpleHttpRequest); 102 | }; 103 | 104 | return simpleHttpClient; 105 | }; 106 | 107 | export default simpleHttpClientFactory; 108 | -------------------------------------------------------------------------------- /src/lib/apiGatewayCore/utils.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2010-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"). 5 | * You may not use this file except in compliance with the License. 6 | * A copy of the License is located at 7 | * 8 | * http://aws.amazon.com/apache2.0 9 | * 10 | * or in the "license" file accompanying this file. This file is distributed 11 | * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 12 | * express or implied. See the License for the specific language governing 13 | * permissions and limitations under the License. 14 | */ 15 | 16 | const utils = { 17 | assertDefined: function(object, name) { 18 | if (object === undefined) { 19 | throw new Error(`${name} must be defined`); 20 | } else { 21 | return object; 22 | } 23 | }, 24 | assertParametersDefined: function(params, keys, ignore) { 25 | if (keys === undefined) { 26 | return; 27 | } 28 | if (keys.length > 0 && params === undefined) { 29 | params = {}; 30 | } 31 | for (let i = 0; i < keys.length; i++) { 32 | if (!utils.contains(ignore, keys[i])) { 33 | utils.assertDefined(params[keys[i]], keys[i]); 34 | } 35 | } 36 | }, 37 | parseParametersToObject: function(params, keys) { 38 | if (params === undefined) { 39 | return {}; 40 | } 41 | let object = { }; 42 | for (let i = 0; i < keys.length; i++) { 43 | object[keys[i]] = params[keys[i]]; 44 | } 45 | return object; 46 | }, 47 | contains: function(a, obj) { 48 | if (a === undefined) { 49 | return false; 50 | } 51 | let i = a.length; 52 | while (i--) { 53 | if (a[i] === obj) { 54 | return true; 55 | } 56 | } 57 | return false; 58 | }, 59 | copy: function(obj) { 60 | if (null === obj || 'object' !== typeof obj) return obj; 61 | let Buffer = require('buffer').Buffer; 62 | if (Buffer.isBuffer(obj)) return Buffer.from(obj); 63 | let copy = obj.constructor(); 64 | let attr = null; 65 | for (attr in obj) { 66 | if (Object.prototype.hasOwnProperty.call(obj, attr)) copy[attr] = obj[attr]; 67 | } 68 | return copy; 69 | }, 70 | mergeInto: function(baseObj, additionalProps) { 71 | if (null === baseObj || 'object' !== typeof baseObj) return baseObj; 72 | let merged = baseObj.constructor(); 73 | let attr = null; 74 | for (attr in baseObj) { 75 | if (Object.prototype.hasOwnProperty.call(baseObj, attr)) merged[attr] = baseObj[attr]; 76 | } 77 | if (null == additionalProps || 'object' != typeof additionalProps) return baseObj; 78 | for (attr in additionalProps) { 79 | if (Object.prototype.hasOwnProperty.call(additionalProps, attr)) { 80 | merged[attr] = additionalProps[attr]; 81 | } 82 | } 83 | return merged; 84 | } 85 | }; 86 | 87 | export default utils; 88 | -------------------------------------------------------------------------------- /test/apigClient.test.js: -------------------------------------------------------------------------------- 1 | /* eslint arrow-parens: off */ 2 | import test from 'ava'; 3 | import apigClientFactory from '../src/apigClient.js'; 4 | 5 | // TEST CONFIG -- TODO fill in with "real" testable values 6 | const config = { 7 | invokeUrl: 'https://0000000000.execute-api.us-east-1.amazonaws.com', 8 | region: 'us-east-1', 9 | accessKey: '00000000000000000000', 10 | secretKey: '0000000000000000000000000000000000000000', 11 | apiKey: '0000000000000000000000000000000000000000', 12 | retry: 4, 13 | retryCondition: (err) => { 14 | return err.response.status === 500; 15 | }, 16 | }; 17 | 18 | test('apigClientFactory exists', t => { 19 | t.deepEqual(typeof apigClientFactory, 'object'); 20 | t.deepEqual(typeof apigClientFactory.newClient, 'function'); 21 | }); 22 | 23 | test('apigClientFactory creates client', t => { 24 | const client = apigClientFactory.newClient(config); 25 | t.deepEqual(typeof client, 'object'); 26 | }); 27 | 28 | // IF we make a public test API endpoint, we can do a real request and response here... 29 | // (I did this for my own, non-public endpoint, but have not built a TEST one @alan) 30 | // test('apigClient works', async t => { 31 | // const additionalParams = {}; 32 | // const body = {}; 33 | // const path = '/mytest/path'; 34 | // const prom = await apigClient.invokeApi({}, path, 'POST', additionalParams, body); 35 | // t.deepEqual(typeof prom, 'object'); 36 | // t.deepEqual(prom.result, 'myresposne'); 37 | // }); 38 | 39 | --------------------------------------------------------------------------------