From d0d19362338daaad5976cbd5c696712bda85121a Mon Sep 17 00:00:00 2001 From: Abhay Date: Fri, 29 Mar 2024 16:20:38 -0700 Subject: [PATCH] Update to version v5.5.1 --- .nightswatch/deployment/taskcat.yml | 9 - .../helpers/cfn_parameter_fetcher.py | 4 + .nightswatch/functional/test_1_login.py | 4 +- .nightswatch/functional/test_llm.py | 2 +- .nightswatch/requirements.txt | 3 +- .nightswatch/scripts/delete_admin_users.py | 4 + .../scripts/delete_kendra_data_source.py | 4 + .nightswatch/scripts/delete_role.py | 3 + .nightswatch/scripts/delete_s3_bucket.py | 6 +- .nightswatch/scripts/post_undeploy.sh | 2 - .nightswatch/scripts/run_regression_tests.sh | 19 +- .nightswatch/scripts/utils/listregions.py | 2 +- CHANGELOG.md | 10 + README.md | 7 + .../README.md | 2 - lambda/aws-sdk-layer/package-lock.json | 4 +- lambda/aws-sdk-layer/package.json | 2 +- lambda/cfn-lambda-layer/package-lock.json | 4 +- lambda/cfn-lambda-layer/package.json | 2 +- lambda/cfn/lib/CognitoLogin.js | 2 +- lambda/cfn/lib/CognitoUrl.js | 2 +- lambda/cfn/package-lock.json | 4 +- lambda/cfn/package.json | 2 +- lambda/common-modules-layer/package-lock.json | 4 +- lambda/common-modules-layer/package.json | 2 +- lambda/connect/package-lock.json | 4 +- lambda/connect/package.json | 2 +- .../lib/fulfillment-event/invokeLambda.js | 2 +- lambda/es-proxy-layer/package-lock.json | 20 +- lambda/es-proxy-layer/package.json | 4 +- lambda/export/package-lock.json | 4 +- lambda/export/package.json | 2 +- lambda/fulfillment/lib/warmer/index.js | 13 +- lambda/fulfillment/package-lock.json | 4 +- lambda/fulfillment/package.json | 2 +- lambda/genesys/package-lock.json | 4 +- lambda/genesys/package.json | 2 +- lambda/import/package-lock.json | 4 +- lambda/import/package.json | 2 +- lambda/js_lambda_hook_sdk/package-lock.json | 4 +- lambda/js_lambda_hook_sdk/package.json | 2 +- lambda/lex-build/package-lock.json | 4 +- lambda/lex-build/package.json | 2 +- lambda/proxy-es/package-lock.json | 4 +- lambda/proxy-es/package.json | 2 +- lambda/qnabot-common-layer/package-lock.json | 4 +- lambda/qnabot-common-layer/package.json | 2 +- lambda/schema/package-lock.json | 4 +- lambda/schema/package.json | 2 +- lambda/testall/package-lock.json | 4 +- lambda/testall/package.json | 2 +- lambda/translate/package-lock.json | 4 +- lambda/translate/package.json | 2 +- package-lock.json | 90 +++---- package.json | 6 +- solution-manifest.yaml | 2 +- source/aws_solutions/qnabot/cli/qnabot_cli.py | 2 +- templates/examples/examples/package-lock.json | 4 +- templates/examples/examples/package.json | 2 +- .../package-lock.json | 4 +- .../CreateRecentTopicsResponse/package.json | 2 +- .../CustomJSHook/package-lock.json | 4 +- .../js_lambda_hooks/CustomJSHook/package.json | 2 +- .../extensions/ui_imports/package-lock.json | 4 +- .../extensions/ui_imports/package.json | 2 +- .../master/__snapshots__/index.test.js.snap | 6 +- templates/master/cognito/index.js | 2 +- templates/master/index.js | 4 +- templates/package-lock.json | 4 +- templates/package.json | 2 +- templates/sagemaker-embeddings/index.js | 4 + website/__tests__/lib/client-auth.test.js | 233 ++++++++++++++---- website/js/lib/client-auth.js | 85 ++++++- 73 files changed, 456 insertions(+), 228 deletions(-) mode change 100644 => 100755 .nightswatch/scripts/run_regression_tests.sh diff --git a/.nightswatch/deployment/taskcat.yml b/.nightswatch/deployment/taskcat.yml index f398a217..597ab16b 100644 --- a/.nightswatch/deployment/taskcat.yml +++ b/.nightswatch/deployment/taskcat.yml @@ -91,9 +91,6 @@ tests: FulfillmentConcurrency: '0' EmbeddingsApi: SAGEMAKER SagemakerInitialInstanceCount: 1 - LLMSagemakerInitialInstanceCount: 1 - LLMApi: SAGEMAKER - LLMSagemakerInstanceType: ml.g5.12xlarge regions: - ap-southeast-2 qnabot-t5: @@ -188,9 +185,6 @@ tests: FulfillmentConcurrency: '0' EmbeddingsApi: SAGEMAKER SagemakerInitialInstanceCount: 1 - LLMSagemakerInitialInstanceCount: 1 - LLMApi: SAGEMAKER - LLMSagemakerInstanceType: ml.g5.12xlarge regions: - eu-west-2 qnabot-t10: @@ -208,9 +202,6 @@ tests: FulfillmentConcurrency: '0' EmbeddingsApi: SAGEMAKER SagemakerInitialInstanceCount: 1 - LLMSagemakerInitialInstanceCount: 1 - LLMApi: SAGEMAKER - LLMSagemakerInstanceType: ml.g5.12xlarge regions: - ap-northeast-2 ##ca-central-1 only supports Lexv2 not Lexv1 \ No newline at end of file diff --git a/.nightswatch/functional/helpers/cfn_parameter_fetcher.py b/.nightswatch/functional/helpers/cfn_parameter_fetcher.py index 651f53b8..7a14c63a 100644 --- a/.nightswatch/functional/helpers/cfn_parameter_fetcher.py +++ b/.nightswatch/functional/helpers/cfn_parameter_fetcher.py @@ -14,6 +14,7 @@ from typing import Optional import boto3 import re +import os class ParameterFetcher: """ @@ -34,6 +35,9 @@ def __init__(self, region: str, stack_name: str) -> None: """ self.region = region self.stack_name = stack_name + profile_name = os.environ.get('TEST_ACCOUNT_PROFILE_NAMES') + if profile_name is not None and profile_name != '': + boto3.setup_default_session(profile_name=profile_name) self.cloudformation_client = boto3.client('cloudformation', region_name=region) def get_user_pool_id(self) -> Optional[str]: diff --git a/.nightswatch/functional/test_1_login.py b/.nightswatch/functional/test_1_login.py index f31d5fe3..8a479f58 100644 --- a/.nightswatch/functional/test_1_login.py +++ b/.nightswatch/functional/test_1_login.py @@ -53,10 +53,12 @@ def test_designer_logout(self, designer_login, dom_operator: DomOperator): assert title == 'Signin' - def test_client_login(self, client_login): + def test_client_login(self, client_login, dom_operator: DomOperator): """ Test login to client """ title = client_login + url = dom_operator.get_current_url() assert title == 'QnABot Client' + assert 'code' in url diff --git a/.nightswatch/functional/test_llm.py b/.nightswatch/functional/test_llm.py index 394d1591..90fe5830 100644 --- a/.nightswatch/functional/test_llm.py +++ b/.nightswatch/functional/test_llm.py @@ -23,7 +23,7 @@ QUESTION_FILEPATH = './question_bank/llm_questions.json' region = os.environ.get('CURRENT_STACK_REGION') -g5_instance_regions = ['us-east-1', 'us-west-2', 'ap-northeast-2', 'ap-northeast-1', 'ap-southeast-2', 'ca-central-1', 'eu-central-1', 'eu-west-1', 'eu-west-2'] +g5_instance_regions = ['us-east-1', 'us-west-2', 'ap-northeast-1', 'ca-central-1', 'eu-central-1', 'eu-west-1'] unsupported_region_reason = 'Region Not Supported' @pytest.mark.skipif(region not in g5_instance_regions, reason=unsupported_region_reason) diff --git a/.nightswatch/requirements.txt b/.nightswatch/requirements.txt index 773d2d0e..0f4a9735 100644 --- a/.nightswatch/requirements.txt +++ b/.nightswatch/requirements.txt @@ -1,4 +1,5 @@ pytest pytest-json boto3 -selenium==4.16 \ No newline at end of file +selenium==4.16 +pyyaml \ No newline at end of file diff --git a/.nightswatch/scripts/delete_admin_users.py b/.nightswatch/scripts/delete_admin_users.py index 051a78cc..3f8afd36 100644 --- a/.nightswatch/scripts/delete_admin_users.py +++ b/.nightswatch/scripts/delete_admin_users.py @@ -12,6 +12,10 @@ ###################################################################################################################### import boto3 +import os + +profile_name = os.environ.get('TEST_ACCOUNT_PROFILE_NAMES') +boto3.setup_default_session(profile_name=profile_name) cloudformation_client = boto3.client('cloudformation', region_name=region) cognito_idp_client = boto3.client('cognito-idp', region_name=region) diff --git a/.nightswatch/scripts/delete_kendra_data_source.py b/.nightswatch/scripts/delete_kendra_data_source.py index 885ec958..29288306 100644 --- a/.nightswatch/scripts/delete_kendra_data_source.py +++ b/.nightswatch/scripts/delete_kendra_data_source.py @@ -12,6 +12,10 @@ ###################################################################################################################### import boto3 +import os + +profile_name = os.environ.get('TEST_ACCOUNT_PROFILE_NAMES') +boto3.setup_default_session(profile_name=profile_name) kendra_regions = ['us-east-1', 'us-west-2', 'ap-southeast-1', 'ap-southeast-2', 'ca-central-1', 'eu-west-1'] diff --git a/.nightswatch/scripts/delete_role.py b/.nightswatch/scripts/delete_role.py index 152f831b..03694b38 100644 --- a/.nightswatch/scripts/delete_role.py +++ b/.nightswatch/scripts/delete_role.py @@ -12,8 +12,11 @@ ###################################################################################################################### import boto3 +import os import sys +profile_name = os.environ.get('TEST_ACCOUNT_PROFILE_NAMES') +boto3.setup_default_session(profile_name=profile_name) client = boto3.client('iam') def delete_role(): diff --git a/.nightswatch/scripts/delete_s3_bucket.py b/.nightswatch/scripts/delete_s3_bucket.py index 281c0a6a..e8d85369 100644 --- a/.nightswatch/scripts/delete_s3_bucket.py +++ b/.nightswatch/scripts/delete_s3_bucket.py @@ -15,12 +15,16 @@ # Deletes S3 buckets created by stack deployment +import boto3 import logging +import os import time -import boto3 from botocore.exceptions import ClientError +profile_name = os.environ.get('TEST_ACCOUNT_PROFILE_NAMES') +boto3.setup_default_session(profile_name=profile_name) + s3 = boto3.resource("s3") bucket_name = ["tcat-qnabot"] diff --git a/.nightswatch/scripts/post_undeploy.sh b/.nightswatch/scripts/post_undeploy.sh index ea9fc2bf..bf3259cd 100644 --- a/.nightswatch/scripts/post_undeploy.sh +++ b/.nightswatch/scripts/post_undeploy.sh @@ -12,8 +12,6 @@ # and limitations under the License. # ###################################################################################################################### -set -e -x - python3 ${NIGHTSWATCH_TEST_DIR}/scripts/delete_s3_bucket.py sleep 20 diff --git a/.nightswatch/scripts/run_regression_tests.sh b/.nightswatch/scripts/run_regression_tests.sh old mode 100644 new mode 100755 index 51dddc07..80485662 --- a/.nightswatch/scripts/run_regression_tests.sh +++ b/.nightswatch/scripts/run_regression_tests.sh @@ -25,16 +25,21 @@ cd ${NIGHTSWATCH_TEST_DIR}/functional/ aws configure list -### Issue: Test are taking too long to run sequentially and tests fail when run in parallel when Selenium operating within the same browser instance. -### Action: So running functional test in one random regions -REGIONS=($(${NIGHTSWATCH_TEST_DIR}/scripts/utils/listregions.py yaml-filename=taskcat.yml | tr -d "[],'")) -NUMBER_OF_REGIONS=${#REGIONS[@]} -RANDOM_NUM=$(( $RANDOM % $NUMBER_OF_REGIONS )) -echo "Regression test selected for region: ${REGIONS[RANDOM_NUM]}" +if [ -z "$CURRENT_STACK_REGION" ]; then + ### Issue: Test are taking too long to run sequentially and tests fail when run in parallel when Selenium operating within the same browser instance. + ### Action: So running functional test in one random regions + chmod +x ${NIGHTSWATCH_TEST_DIR}/scripts/utils/listregions.py + REGIONS=($(${NIGHTSWATCH_TEST_DIR}/scripts/utils/listregions.py yaml-filename=taskcat.yml | tr -d "[],'")) + NUMBER_OF_REGIONS=${#REGIONS[@]} + RANDOM_NUM=$(( $RANDOM % $NUMBER_OF_REGIONS )) + CURRENT_STACK_REGION=${REGIONS[RANDOM_NUM]} +fi + +echo "Regression test selected for region: ${CURRENT_STACK_REGION}" function runRegressionTest { export STACK_FILE_NAME=$1 - regex="(.*)-(${REGIONS[RANDOM_NUM]})-cfnlogs.txt" + regex="(.*)-(${CURRENT_STACK_REGION})-cfnlogs.txt" if [[ $STACK_FILE_NAME =~ $regex ]]; then export CURRENT_STACK_NAME=${BASH_REMATCH[1]}; diff --git a/.nightswatch/scripts/utils/listregions.py b/.nightswatch/scripts/utils/listregions.py index 0c4d642e..43e23ed6 100755 --- a/.nightswatch/scripts/utils/listregions.py +++ b/.nightswatch/scripts/utils/listregions.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 ###################################################################################################################### # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # # # @@ -10,7 +11,6 @@ # OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions # # and limitations under the License. # ###################################################################################################################### -#!/usr/bin/env python3 import os import yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 90c368de..497a8ff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [5.5.1] - 2024-04-01 +### Fixed +- Document chaining was not working when using Lambda functions for chaining. This has been resolved. ([issue #687](https://github.com/aws-solutions/qnabot-on-aws/issues/687)) +- ESWarmer lambda was generating a big amount of log data in CloudWatch. This is now fixed. ([issue #692](https://github.com/aws-solutions/qnabot-on-aws/issues/692)) + +### Updated +- QnaBot Client to now use code grant instead of implicit grant for Cognito Authorization +- Security patch for webpack-dev-middleware +- Template to ensure an embedding instance size of 1 is at least choosen since serverless is no longer available for the embedding model + ## [5.5.0] - 2024-01-04 ### Added - Added Core-Language parameter to the QnABot deployment. This parameter allows the user to select during the deployment a core language which will be used by the OpenSearch language analyzers to look for question and answers. With this update, QnABot can now be deployed natively in 33 Languages with a more syntactical accuracy for matching questions and answers diff --git a/README.md b/README.md index 6fc52104..ff861a42 100644 --- a/README.md +++ b/README.md @@ -171,6 +171,12 @@ If you'd like to see to start and end time for each test: export TIMESTAMPS='true' ``` +If you want to use a specific AWS profile for the test. If not set, the regression test will use the current AWS session that it's running in. + +```bash +export TEST_ACCOUNT_PROFILE_NAMES= +``` + 5. The LLM and Kendra tests will only run if the deployed bot has these features enabled. Follow the steps in the Implementation Guide to enable these features to test them: - LLM - Set LLMApi to SAGEMAKER. For more information, please [Enabling LLM support](https://docs.aws.amazon.com/solutions/latest/qnabot-on-aws/enabling-llm-support.html). If stack update fails, check your quota for __ml.g5.12xlarge for endpoint__ usage as mentioned in the note of this article. @@ -299,6 +305,7 @@ As QnABot evolves over the years, it makes use of various services and functiona _Note: **Deployable solution versions** refers to the ability to deploy the version of QnABot in their AWS accounts. **Actively supported versions** for QnABot is only available for the latest version of QnABot._ ### Deployable Versions +- [v5.5.1](https://github.com/aws-solutions/qnabot-on-aws/releases/tag/v5.5.1) - [Public](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.5.1/qnabot-on-aws-main.template)/[VPC](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.5.1/qnabot-on-aws-vpc.template) - [v5.5.0](https://github.com/aws-solutions/qnabot-on-aws/releases/tag/v5.5.0) - [Public](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.5.0/qnabot-on-aws-main.template)/[VPC](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.5.0/qnabot-on-aws-vpc.template) - _Vue has been upgraded from Vue 2 to 3. We highly recommend to use or upgrade to this version due to Vue 2 reaching End of Life (EOL), which affects all previous versions of QnABot. For more information, see [below](#upcomingrecent-deprecations)._ - [v5.4.5](https://github.com/aws-solutions/qnabot-on-aws/releases/tag/v5.4.5) - [Public](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.4.5/qnabot-on-aws-main.template)/[VPC](https://solutions-reference.s3.amazonaws.com/qnabot-on-aws/v5.4.5/qnabot-on-aws-vpc.template) diff --git a/docs/semantic_matching_using_LLM_embeddings/README.md b/docs/semantic_matching_using_LLM_embeddings/README.md index 43366257..ba131e40 100644 --- a/docs/semantic_matching_using_LLM_embeddings/README.md +++ b/docs/semantic_matching_using_LLM_embeddings/README.md @@ -18,8 +18,6 @@ With this release, QnaBot can now use QnABot provisions a Sagemaker endpoint running the Hugging Face el5-large model - see https://huggingface.co/intfloat/e5-large. By default a 1-node ml.m5.xlarge endpoint is automatically provisioned. For large volume deployments, add additional nodes by setting the parameter `SagemakerInitialInstanceCount`. Please check [SageMaker pricing documentation](https://aws.amazon.com/sagemaker/pricing/) for relevant costs and information on Free Tier eligibility. - -By setting the parameter `SagemakerInitialInstanceCount` to `0`, a [Serverless Sagemaker endpoint](https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html) is enabled. A serverless endpoint can save you money by scaling down to zero when not in use, however, there is a 'cold start' time of approximately 2 minutes during which QnABot requests, imports, or add/modify items operations will time out or be delayed. QnABot creates the endpoint with default 4GB model memory, and max concurrency of 50 requests. ### Deploy Stack for SageMaker Embeddings diff --git a/lambda/aws-sdk-layer/package-lock.json b/lambda/aws-sdk-layer/package-lock.json index 43771aba..03df1874 100644 --- a/lambda/aws-sdk-layer/package-lock.json +++ b/lambda/aws-sdk-layer/package-lock.json @@ -1,12 +1,12 @@ { "name": "aws-layer", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "aws-layer", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "aws-sdk": "^2.1404.0", diff --git a/lambda/aws-sdk-layer/package.json b/lambda/aws-sdk-layer/package.json index 41b82396..deae1ae2 100644 --- a/lambda/aws-sdk-layer/package.json +++ b/lambda/aws-sdk-layer/package.json @@ -1,6 +1,6 @@ { "name": "aws-layer", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda aws-sdk-layer", "main": "index.js", "scripts": { diff --git a/lambda/cfn-lambda-layer/package-lock.json b/lambda/cfn-lambda-layer/package-lock.json index b96df21c..64868a9d 100644 --- a/lambda/cfn-lambda-layer/package-lock.json +++ b/lambda/cfn-lambda-layer/package-lock.json @@ -1,12 +1,12 @@ { "name": "cfn-lambda-layer", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cfn-lambda-layer", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "cfn-lambda": "^5.1.0" diff --git a/lambda/cfn-lambda-layer/package.json b/lambda/cfn-lambda-layer/package.json index 2f2d0c31..3645e713 100644 --- a/lambda/cfn-lambda-layer/package.json +++ b/lambda/cfn-lambda-layer/package.json @@ -1,6 +1,6 @@ { "name": "cfn-lambda-layer", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Cfn Lambda Layer", "main": "index.js", "scripts": { diff --git a/lambda/cfn/lib/CognitoLogin.js b/lambda/cfn/lib/CognitoLogin.js index 99e158ff..62b870ed 100644 --- a/lambda/cfn/lib/CognitoLogin.js +++ b/lambda/cfn/lib/CognitoLogin.js @@ -35,7 +35,7 @@ module.exports = class CognitoLogin extends require('./base') { ExplicitAuthFlows: ['ADMIN_NO_SRP_AUTH'], RefreshTokenValidity: 1, SupportedIdentityProviders: ['COGNITO'], - AllowedOAuthFlows: ['code', 'implicit'], + AllowedOAuthFlows: ['code'], AllowedOAuthScopes: ['phone', 'email', 'openid', 'profile'], AllowedOAuthFlowsUserPoolClient: true, } diff --git a/lambda/cfn/lib/CognitoUrl.js b/lambda/cfn/lib/CognitoUrl.js index 75487bdc..31a82f63 100644 --- a/lambda/cfn/lib/CognitoUrl.js +++ b/lambda/cfn/lib/CognitoUrl.js @@ -27,7 +27,7 @@ module.exports = class CognitoUrl extends require('./base') { reply(null, params.Domain, { Domain, loginUrl, - logoutUrl: `${Domain}/logout?redirect_uri=${encodeURIComponent(loginUrl)}&response_type=token&client_id=${params.ClientId}`, + logoutUrl: `${Domain}/logout?redirect_uri=${encodeURIComponent(loginUrl)}&response_type=${params.response_type}&client_id=${params.ClientId}`, }); } }; diff --git a/lambda/cfn/package-lock.json b/lambda/cfn/package-lock.json index 717734a0..672c4ccb 100644 --- a/lambda/cfn/package-lock.json +++ b/lambda/cfn/package-lock.json @@ -1,12 +1,12 @@ { "name": "cfn", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "cfn", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-api-gateway": "^3.418.0", diff --git a/lambda/cfn/package.json b/lambda/cfn/package.json index d6b206de..a46c9186 100644 --- a/lambda/cfn/package.json +++ b/lambda/cfn/package.json @@ -1,6 +1,6 @@ { "name": "cfn", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Cfn Lambda", "main": "index.js", "scripts": { diff --git a/lambda/common-modules-layer/package-lock.json b/lambda/common-modules-layer/package-lock.json index ba823c9c..60ff18e4 100644 --- a/lambda/common-modules-layer/package-lock.json +++ b/lambda/common-modules-layer/package-lock.json @@ -1,12 +1,12 @@ { "name": "common-modules-layer", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "common-modules-layer", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "bodybuilder": "^2.4.0", diff --git a/lambda/common-modules-layer/package.json b/lambda/common-modules-layer/package.json index c0fb3dab..d9a5dcdc 100644 --- a/lambda/common-modules-layer/package.json +++ b/lambda/common-modules-layer/package.json @@ -1,6 +1,6 @@ { "name": "common-modules-layer", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Common-modules-layer lambda", "main": "index.js", "scripts": { diff --git a/lambda/connect/package-lock.json b/lambda/connect/package-lock.json index 920447b5..e3f25305 100644 --- a/lambda/connect/package-lock.json +++ b/lambda/connect/package-lock.json @@ -1,12 +1,12 @@ { "name": "connect", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "connect", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "devDependencies": { "jest": "^29.7.0" diff --git a/lambda/connect/package.json b/lambda/connect/package.json index 46e1a804..9d8162cf 100644 --- a/lambda/connect/package.json +++ b/lambda/connect/package.json @@ -1,6 +1,6 @@ { "name": "connect", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda function used to support the Connect setup wizard", "repository": { "type": "git", diff --git a/lambda/es-proxy-layer/lib/fulfillment-event/invokeLambda.js b/lambda/es-proxy-layer/lib/fulfillment-event/invokeLambda.js index 0ed08eae..35b58cb3 100644 --- a/lambda/es-proxy-layer/lib/fulfillment-event/invokeLambda.js +++ b/lambda/es-proxy-layer/lib/fulfillment-event/invokeLambda.js @@ -51,6 +51,6 @@ async function invokeLambda(lambdaRef, req, res) { // response is not JSON - noop } qnabot.log('Lambda returned payload: ', payload); - return [req, res]; + return [req, res, payload]; } exports.invokeLambda = invokeLambda; diff --git a/lambda/es-proxy-layer/package-lock.json b/lambda/es-proxy-layer/package-lock.json index 6932be81..222bef7b 100644 --- a/lambda/es-proxy-layer/package-lock.json +++ b/lambda/es-proxy-layer/package-lock.json @@ -1,12 +1,12 @@ { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-comprehend": "^3.418.0", @@ -21,7 +21,7 @@ "@dqbd/tiktoken": "^1.0.7", "@smithy/util-retry": "^2.0.2", "aws4": "^1.6.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "bodybuilder": "^2.5.1", "handlebars": "^4.7.2", "langchain": "^0.0.209", @@ -3552,11 +3552,11 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -4575,9 +4575,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", diff --git a/lambda/es-proxy-layer/package.json b/lambda/es-proxy-layer/package.json index 9d8e5723..4eb49cd9 100644 --- a/lambda/es-proxy-layer/package.json +++ b/lambda/es-proxy-layer/package.json @@ -1,6 +1,6 @@ { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda managing querying of data store", "main": "index.js", "scripts": { @@ -26,7 +26,7 @@ "@dqbd/tiktoken": "^1.0.7", "@smithy/util-retry": "^2.0.2", "aws4": "^1.6.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "bodybuilder": "^2.5.1", "handlebars": "^4.7.2", "langchain": "^0.0.209", diff --git a/lambda/export/package-lock.json b/lambda/export/package-lock.json index ddf39671..cc637293 100644 --- a/lambda/export/package-lock.json +++ b/lambda/export/package-lock.json @@ -1,12 +1,12 @@ { "name": "export", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "export", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-kendra": "^3.468.0", diff --git a/lambda/export/package.json b/lambda/export/package.json index 59e65dcc..4175607a 100644 --- a/lambda/export/package.json +++ b/lambda/export/package.json @@ -1,6 +1,6 @@ { "name": "export", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda handling export of QIDs", "main": "index.js", "scripts": { diff --git a/lambda/fulfillment/lib/warmer/index.js b/lambda/fulfillment/lib/warmer/index.js index 259237c2..7fea2c5d 100644 --- a/lambda/fulfillment/lib/warmer/index.js +++ b/lambda/fulfillment/lib/warmer/index.js @@ -87,7 +87,7 @@ const main = async function () { time1.t1 = d1.getTime(); time1.t2 = d2.getTime(); time1.duration = d2.getTime() - d1.getTime(); - qnabot.log(`${JSON.stringify(time1)}`); + qnabot.debug(`${JSON.stringify(time1)}`); const e1 = new Date(); res = await execute(url, region, method, input); const e2 = new Date(); @@ -96,7 +96,7 @@ const main = async function () { time2.t1 = e1.getTime(); time2.t2 = e2.getTime(); time2.duration = e2.getTime() - e1.getTime(); - qnabot.log(`${JSON.stringify(time2)}`); + qnabot.debug(`${JSON.stringify(time2)}`); } return res; }; @@ -104,16 +104,15 @@ const main = async function () { module.exports = class warmer { async perform(event, context, callback) { const count = process.env.REPEAT_COUNT ? parseInt(process.env.REPEAT_COUNT) : 4; - qnabot.log(`Incoming payload: ${JSON.stringify(event, null, 2)}`); + qnabot.log(`ESWarmer Incoming payload: ${JSON.stringify(event, null, 2)}`); try { for (let i = 0; i < count; i++) { - qnabot.log(`main ${i}`); - const res = await main(); - qnabot.log(res); + await main(); } + qnabot.log('ESWarmer lambda executed sucessfully') return ('success'); } catch (e) { - qnabot.log(`Error detected ${e}`); + qnabot.log('An error was detected in ESWarmer lambda: ', e); return ('failure'); } } diff --git a/lambda/fulfillment/package-lock.json b/lambda/fulfillment/package-lock.json index 1cca866e..dc84c18e 100644 --- a/lambda/fulfillment/package-lock.json +++ b/lambda/fulfillment/package-lock.json @@ -1,12 +1,12 @@ { "name": "fulfillment", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "fulfillment", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-comprehend": "^3.418.0", diff --git a/lambda/fulfillment/package.json b/lambda/fulfillment/package.json index b2ba089f..cc454368 100644 --- a/lambda/fulfillment/package.json +++ b/lambda/fulfillment/package.json @@ -1,6 +1,6 @@ { "name": "fulfillment", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda handling fulfillment of user requests", "main": "handler.js", "scripts": { diff --git a/lambda/genesys/package-lock.json b/lambda/genesys/package-lock.json index fe7faf37..753582c5 100644 --- a/lambda/genesys/package-lock.json +++ b/lambda/genesys/package-lock.json @@ -1,12 +1,12 @@ { "name": "genesys", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "genesys", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "devDependencies": { "jest": "^29.7.0" diff --git a/lambda/genesys/package.json b/lambda/genesys/package.json index 9a63f80f..e6a623da 100644 --- a/lambda/genesys/package.json +++ b/lambda/genesys/package.json @@ -1,6 +1,6 @@ { "name": "genesys", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda function used to support the Genesys setup wizard", "repository": { "type": "git", diff --git a/lambda/import/package-lock.json b/lambda/import/package-lock.json index 1e42293e..ee3005c1 100644 --- a/lambda/import/package-lock.json +++ b/lambda/import/package-lock.json @@ -1,12 +1,12 @@ { "name": "import", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "import", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-lambda": "^3.474.0", diff --git a/lambda/import/package.json b/lambda/import/package.json index 9fcde76d..7bb81d41 100644 --- a/lambda/import/package.json +++ b/lambda/import/package.json @@ -1,6 +1,6 @@ { "name": "import", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda handling import of QIDs", "main": "index.js", "scripts": { diff --git a/lambda/js_lambda_hook_sdk/package-lock.json b/lambda/js_lambda_hook_sdk/package-lock.json index c9e5c882..129af322 100644 --- a/lambda/js_lambda_hook_sdk/package-lock.json +++ b/lambda/js_lambda_hook_sdk/package-lock.json @@ -1,12 +1,12 @@ { "name": "js_lambda_hook_sdk", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "js_lambda_hook_sdk", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21" diff --git a/lambda/js_lambda_hook_sdk/package.json b/lambda/js_lambda_hook_sdk/package.json index 7fb86cbd..3ab131dc 100644 --- a/lambda/js_lambda_hook_sdk/package.json +++ b/lambda/js_lambda_hook_sdk/package.json @@ -1,6 +1,6 @@ { "name": "js_lambda_hook_sdk", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot convenience layer, allowing users to create custom lambda hooks", "directories": { "lambda_hook_sdk": "lambda_hook_sdk", diff --git a/lambda/lex-build/package-lock.json b/lambda/lex-build/package-lock.json index 17b91932..2887cc30 100644 --- a/lambda/lex-build/package-lock.json +++ b/lambda/lex-build/package-lock.json @@ -1,12 +1,12 @@ { "name": "lex-build", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "lex-build", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-lambda": "^3.414.0", diff --git a/lambda/lex-build/package.json b/lambda/lex-build/package.json index 6c3faf39..f6dff1af 100644 --- a/lambda/lex-build/package.json +++ b/lambda/lex-build/package.json @@ -1,6 +1,6 @@ { "name": "lex-build", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot lambda for rebuilding Amazon Lex bots", "main": "handler.js", "scripts": { diff --git a/lambda/proxy-es/package-lock.json b/lambda/proxy-es/package-lock.json index 9e5da22e..8914bf32 100644 --- a/lambda/proxy-es/package-lock.json +++ b/lambda/proxy-es/package-lock.json @@ -1,12 +1,12 @@ { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0" } } diff --git a/lambda/proxy-es/package.json b/lambda/proxy-es/package.json index 6b7920c5..dae635da 100644 --- a/lambda/proxy-es/package.json +++ b/lambda/proxy-es/package.json @@ -1,6 +1,6 @@ { "name": "proxy-es", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot Lambda function is used to proxy request from apigateway to elasticsearch", "main": "index.js", "author": { diff --git a/lambda/qnabot-common-layer/package-lock.json b/lambda/qnabot-common-layer/package-lock.json index 2a0786ae..ee62b83a 100644 --- a/lambda/qnabot-common-layer/package-lock.json +++ b/lambda/qnabot-common-layer/package-lock.json @@ -1,12 +1,12 @@ { "name": "qnabot-common-layer", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "qnabot-common-layer", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-comprehend": "^3.409.0", diff --git a/lambda/qnabot-common-layer/package.json b/lambda/qnabot-common-layer/package.json index 65eadb34..09d17923 100644 --- a/lambda/qnabot-common-layer/package.json +++ b/lambda/qnabot-common-layer/package.json @@ -1,6 +1,6 @@ { "name": "qnabot-common-layer", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda layers used to provide common logging and utility functions", "repository": { "type": "git", diff --git a/lambda/schema/package-lock.json b/lambda/schema/package-lock.json index 00f1510d..cc7d10b9 100644 --- a/lambda/schema/package-lock.json +++ b/lambda/schema/package-lock.json @@ -1,12 +1,12 @@ { "name": "schema", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "schema", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "devDependencies": { "jest": "^29.7.0" diff --git a/lambda/schema/package.json b/lambda/schema/package.json index 31d3e112..bfcbd14c 100644 --- a/lambda/schema/package.json +++ b/lambda/schema/package.json @@ -1,6 +1,6 @@ { "name": "schema", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda function used to provide the schemas for the various qid types", "repository": { "type": "git", diff --git a/lambda/testall/package-lock.json b/lambda/testall/package-lock.json index 14dab2af..d8f03400 100644 --- a/lambda/testall/package-lock.json +++ b/lambda/testall/package-lock.json @@ -1,12 +1,12 @@ { "name": "testall", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "testall", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-lambda": "^3.414.0", diff --git a/lambda/testall/package.json b/lambda/testall/package.json index ab333ac7..acfe8f5c 100644 --- a/lambda/testall/package.json +++ b/lambda/testall/package.json @@ -1,6 +1,6 @@ { "name": "testall", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda function that reads QnAs from opensearch and performs test validation against each question defined in qna against current Lex bot", "main": "index.js", "scripts": { diff --git a/lambda/translate/package-lock.json b/lambda/translate/package-lock.json index 34eb7c6e..d2b77989 100644 --- a/lambda/translate/package-lock.json +++ b/lambda/translate/package-lock.json @@ -1,12 +1,12 @@ { "name": "translate", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "translate", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "@aws-sdk/client-translate": "^3.414.0" diff --git a/lambda/translate/package.json b/lambda/translate/package.json index 148c38cf..16bdda8e 100644 --- a/lambda/translate/package.json +++ b/lambda/translate/package.json @@ -1,6 +1,6 @@ { "name": "translate", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda function used to import custom terminologies into AWS Translate", "repository": { "type": "git", diff --git a/package-lock.json b/package-lock.json index 4538cee5..210e81fd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "qnabot-on-aws", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "qnabot-on-aws", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "os": [ "darwin", @@ -52,7 +52,7 @@ "aws-lex-web-ui": "git+https://github.com/aws-samples/aws-lex-web-ui.git#feature/vue3", "aws-sdk": "^2.1354.0", "aws4": "^1.7.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "body-parser": "^1.18.3", "bowser": "^1.9.3", "cfn-response": "^1.0.1", @@ -159,7 +159,7 @@ "webpack": "^5.88.2", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^4.15.2", "webpack-merge": "^5.10.0", "webpack-s3-plugin": "^1.2.0-rc.0", "zip-webpack-plugin": "^4.0.1" @@ -10408,11 +10408,11 @@ } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", + "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -11765,6 +11765,12 @@ "dev": true, "peer": true }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, "node_modules/colorful": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/colorful/-/colorful-2.1.0.tgz", @@ -14978,9 +14984,9 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==" }, "node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", + "version": "1.15.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", + "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", "funding": [ { "type": "individual", @@ -15107,9 +15113,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -19814,12 +19820,12 @@ } }, "node_modules/memfs": { - "version": "3.4.4", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz", - "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -25909,12 +25915,6 @@ } } }, - "node_modules/webpack-cli/node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, "node_modules/webpack-cli/node_modules/commander": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", @@ -25925,9 +25925,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -25948,9 +25948,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -25975,12 +25975,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-middleware/node_modules/colorette": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz", - "integrity": "sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g==", - "dev": true - }, "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -25988,15 +25982,15 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -26007,9 +26001,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -26040,7 +26034,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -26093,12 +26087,6 @@ "ajv": "^8.8.2" } }, - "node_modules/webpack-dev-server/node_modules/colorette": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz", - "integrity": "sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g==", - "dev": true - }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", diff --git a/package.json b/package.json index db455fb3..8c4a7ada 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "qnabot-on-aws", - "version": "5.5.0", + "version": "5.5.1", "engines": { "node": ">=18.0.0", "npm": ">=7.8.0" @@ -97,7 +97,7 @@ "aws-lex-web-ui": "git+https://github.com/aws-samples/aws-lex-web-ui.git#feature/vue3", "aws-sdk": "^2.1354.0", "aws4": "^1.7.0", - "axios": "^1.6.2", + "axios": "^1.6.5", "body-parser": "^1.18.3", "bowser": "^1.9.3", "cfn-response": "^1.0.1", @@ -204,7 +204,7 @@ "webpack": "^5.88.2", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", - "webpack-dev-server": "^4.15.1", + "webpack-dev-server": "^4.15.2", "webpack-merge": "^5.10.0", "webpack-s3-plugin": "^1.2.0-rc.0", "zip-webpack-plugin": "^4.0.1" diff --git a/solution-manifest.yaml b/solution-manifest.yaml index 1cc5b53f..eccf3514 100644 --- a/solution-manifest.yaml +++ b/solution-manifest.yaml @@ -1,6 +1,6 @@ id: SO0189 name: qnabot-on-aws -version: v5.5.0 +version: v5.5.1 cloudformation_templates: - template: qnabot-on-aws-main.template main_template: true diff --git a/source/aws_solutions/qnabot/cli/qnabot_cli.py b/source/aws_solutions/qnabot/cli/qnabot_cli.py index c1b50f86..207ae134 100644 --- a/source/aws_solutions/qnabot/cli/qnabot_cli.py +++ b/source/aws_solutions/qnabot/cli/qnabot_cli.py @@ -23,7 +23,7 @@ @click.pass_context def cli(ctx) -> None: os.environ["SOLUTION_ID"] = "SO0189" - os.environ["SOLUTION_VERSION"] = "v5.5.0" + os.environ["SOLUTION_VERSION"] = "v5.5.1" @cli.command("import") diff --git a/templates/examples/examples/package-lock.json b/templates/examples/examples/package-lock.json index 6bcd3e8f..2b9b49f0 100644 --- a/templates/examples/examples/package-lock.json +++ b/templates/examples/examples/package-lock.json @@ -1,12 +1,12 @@ { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "cfn-response": "^1.0.1", diff --git a/templates/examples/examples/package.json b/templates/examples/examples/package.json index 7086040f..03d41896 100644 --- a/templates/examples/examples/package.json +++ b/templates/examples/examples/package.json @@ -1,6 +1,6 @@ { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda contains a collection of lambda hooks for QnABot and a custom resource to create the example documents", "main": "index.js", "scripts": { diff --git a/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package-lock.json b/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package-lock.json index 2b96492c..a17bbce9 100644 --- a/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package-lock.json +++ b/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package-lock.json @@ -1,12 +1,12 @@ { "name": "createrecenttopicsresponse", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "createrecenttopicsresponse", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "lodash": "^4.17.21" diff --git a/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package.json b/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package.json index d32b4399..b9f64e8b 100644 --- a/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package.json +++ b/templates/examples/extensions/js_lambda_hooks/CreateRecentTopicsResponse/package.json @@ -1,6 +1,6 @@ { "name": "createrecenttopicsresponse", - "version": "5.5.0", + "version": "5.5.1", "description": "Lambda hook that creates recent topic response", "main": "CreateRecentTopicResponse.js", "scripts": { diff --git a/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package-lock.json b/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package-lock.json index 6bcd3e8f..2b9b49f0 100644 --- a/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package-lock.json +++ b/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package-lock.json @@ -1,12 +1,12 @@ { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "cfn-response": "^1.0.1", diff --git a/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package.json b/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package.json index f9d2f6ca..949eb867 100644 --- a/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package.json +++ b/templates/examples/extensions/js_lambda_hooks/CustomJSHook/package.json @@ -1,6 +1,6 @@ { "name": "examples", - "version": "5.5.0", + "version": "5.5.1", "description": "Creates custom JS Lambda Hooks", "main": "index.js", "scripts": { diff --git a/templates/examples/extensions/ui_imports/package-lock.json b/templates/examples/extensions/ui_imports/package-lock.json index a9d95512..eb3ca873 100644 --- a/templates/examples/extensions/ui_imports/package-lock.json +++ b/templates/examples/extensions/ui_imports/package-lock.json @@ -1,12 +1,12 @@ { "name": "ui_import", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "ui_import", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "dependencies": { "cfn-response": "^1.0.1", diff --git a/templates/examples/extensions/ui_imports/package.json b/templates/examples/extensions/ui_imports/package.json index 37c8a519..2bbcd928 100644 --- a/templates/examples/extensions/ui_imports/package.json +++ b/templates/examples/extensions/ui_imports/package.json @@ -1,6 +1,6 @@ { "name": "ui_import", - "version": "5.5.0", + "version": "5.5.1", "description": "Add new content packages for Content Designer Import Examples/Extensions listing", "main": "ui_import.js", "scripts": { diff --git a/templates/master/__snapshots__/index.test.js.snap b/templates/master/__snapshots__/index.test.js.snap index 84448898..d677cc98 100644 --- a/templates/master/__snapshots__/index.test.js.snap +++ b/templates/master/__snapshots__/index.test.js.snap @@ -741,8 +741,8 @@ exports[`renders master template correctly 1`] = ` }, "SagemakerInitialInstanceCount": { "Default": 1, - "Description": "Optional: If EmbeddingsApi is SAGEMAKER, provide initial instance count. Set to '0' to enable Serverless Inference (for cold-start delay tolerant deployments only).", - "MinValue": 0, + "Description": "Optional: If EmbeddingsApi is SAGEMAKER, provide initial instance count. Serverless Inference is not currently available for the built-in embedding model.", + "MinValue": 1, "Type": "Number", }, "Username": { @@ -2462,7 +2462,7 @@ exports[`renders master template correctly 1`] = ` "Arn", ], }, - "response_type": "token", + "response_type": "code", }, "Type": "Custom::CognitoUrl", }, diff --git a/templates/master/cognito/index.js b/templates/master/cognito/index.js index 7781fc73..04ec94a9 100644 --- a/templates/master/cognito/index.js +++ b/templates/master/cognito/index.js @@ -64,7 +64,7 @@ module.exports = { ClientId: { Ref: 'ClientClient' }, Domain: { Ref: 'CognitoDomain' }, LoginRedirectUrl: { 'Fn::GetAtt': ['Urls', 'Client'] }, - response_type: 'token', + response_type: 'code', }, }, User: { diff --git a/templates/master/index.js b/templates/master/index.js index cd6d6906..aaae88d5 100644 --- a/templates/master/index.js +++ b/templates/master/index.js @@ -350,9 +350,9 @@ module.exports = { }, SagemakerInitialInstanceCount: { Type: 'Number', - MinValue: 0, + MinValue: 1, Description: - 'Optional: If EmbeddingsApi is SAGEMAKER, provide initial instance count. Set to \'0\' to enable Serverless Inference (for cold-start delay tolerant deployments only).', + 'Optional: If EmbeddingsApi is SAGEMAKER, provide initial instance count. Serverless Inference is not currently available for the built-in embedding model.', Default: 1, }, EmbeddingsLambdaArn: { diff --git a/templates/package-lock.json b/templates/package-lock.json index 41c6208b..d4086d84 100644 --- a/templates/package-lock.json +++ b/templates/package-lock.json @@ -1,12 +1,12 @@ { "name": "qnabot-on-aws-infrastructure", - "version": "5.5.0", + "version": "5.5.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "qnabot-on-aws-infrastructure", - "version": "5.5.0", + "version": "5.5.1", "license": "Apache-2.0", "devDependencies": { "@aws-sdk/client-s3": "^3.441.0", diff --git a/templates/package.json b/templates/package.json index abbb054b..6ffbd1f9 100644 --- a/templates/package.json +++ b/templates/package.json @@ -1,6 +1,6 @@ { "name": "qnabot-on-aws-infrastructure", - "version": "5.5.0", + "version": "5.5.1", "description": "QnABot infrastructure", "scripts": { "clean": "rm -rf node_modules", diff --git a/templates/sagemaker-embeddings/index.js b/templates/sagemaker-embeddings/index.js index 40dcdbab..ddd183cf 100644 --- a/templates/sagemaker-embeddings/index.js +++ b/templates/sagemaker-embeddings/index.js @@ -13,6 +13,10 @@ const util = require('../util'); +// Sagemaker Serverless Inference doesn't currently support the current embedding model +// so although this nested template supports serverless provisioning, the main template enforces +// only provisioned endpoints by disallowing a value of '0' for SagemakerInitialInstanceCount + module.exports = { AWSTemplateFormatVersion: '2010-09-09', Description: `(SO0189n-sagemaker) QnABot nested sagemaker embeddings resources - Version v${process.env.npm_package_version}`, diff --git a/website/__tests__/lib/client-auth.test.js b/website/__tests__/lib/client-auth.test.js index d8693ebc..3f7711a2 100644 --- a/website/__tests__/lib/client-auth.test.js +++ b/website/__tests__/lib/client-auth.test.js @@ -10,54 +10,199 @@ * OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions * * and limitations under the License. * ******************************************************************************************************************** */ -import clientAuthModule from '../../js/lib/client-auth'; - +const axios = require('axios'); +const aws = require('aws-sdk'); const jwt = require('jsonwebtoken'); +const queryString = require('query-string'); +const clientAuth = require('../../js/lib/client-auth'); -jest.mock('aws-sdk', () => ({ - config: { - region: '', - }, - CognitoIdentityCredentials: class {}, -})); - -jest.mock('axios', () => ({ - head: jest.fn().mockReturnValue(Promise.resolve({ - headers: { - 'api-stage': 'dev', - }, - })), - get: jest.fn().mockReturnValue(Promise.resolve({ - data: { - region: 'us-weast-1', - UserPool: 'test-user-pool', - PoolId: 'test-pool-id', +jest.mock('axios'); +jest.mock('aws-sdk'); +jest.mock('jsonwebtoken'); +jest.mock('query-string'); + +describe('clientAuth', () => { + let windowMock; + + beforeEach(() => { + jest.clearAllMocks(); + windowMock = { + alert: jest.fn(), + confirm: jest.fn(), + sessionStorage: { + getItem: jest.fn(), + setItem: jest.fn(), + clear: jest.fn(), + }, + location: { + href: 'http://localhost/', + origin: 'http://localhost', + pathname: '/', + search: '?code=123456', + }, + }; + global.window = windowMock; + queryString.parse.mockReturnValue({ code: '123456' }); + queryString.stringify.mockImplementation((obj) => { + const params = new URLSearchParams(); + for (const [key, value] of Object.entries(obj)) { + params.append(key, value); + } + return params.toString(); + }); + }); + + afterEach(() => { + global.window = global.window; + }); + + it('should fetch tokens and credentials when code is present', async () => { + const mockHeadResponse = { headers: { 'api-stage': 'test' } }; + const mockGetResponse = { + data: { + region: 'us-east-1', + UserPool: 'pool-id', + PoolId: 'pool-id', + ClientIdClient: 'client-id', + _links: { + CognitoEndpoint: { href: 'https://cognito-endpoint.com' }, + ClientLogin: { href: 'https://login.com' }, }, - })), -})); - -jest.mock('jsonwebtoken', () => ({ - decode: jest.fn().mockReturnValue({ - 'cognito:username': 'test-username', - }), -})); - -jest.mock('query-string', () => ({ - parse: jest.fn().mockReturnValue({ id_token: 'test-token' }), -})); - -describe('js lib client-auth module', () => { - const windowSpy = jest.spyOn(window, 'window', 'get'); - windowSpy.mockReturnValue({ - location: { - href: '', - hash: 'test-hash', + }, + }; + const mockTokenResponse = { + data: { + id_token: 'id-token', + refresh_token: 'refresh-token', + }, + }; + + const testToken = { + 'cognito:username': 'test-user', + 'cognito:groups': 'testgroup', + }; + + axios.head.mockResolvedValue(mockHeadResponse); + axios.get.mockResolvedValue(mockGetResponse); + axios.mockResolvedValue(mockTokenResponse); + + jwt.decode.mockReturnValue(testToken); + + + const result = await clientAuth().catch(() => {}); + + result.username = testToken['cognito:username']; + expect(axios.head).toHaveBeenCalledWith('http://localhost/'); + expect(axios.get).toHaveBeenCalledWith('/test'); + expect(axios).toHaveBeenCalledWith( + {"data": "grant_type=authorization_code&client_id=client-id&code=123456&redirect_uri=http%3A%2F%2Flocalhost%2F", "headers": {"Content-Type": "application/x-www-form-urlencoded"}, "method": "POST", "url": "https://cognito-endpoint.com/oauth2/token"} + ); + + expect(jwt.decode).toHaveBeenCalledWith('id-token'); + expect(result).toEqual({ + config: { + region: 'us-east-1', + credentials: expect.any(Object), + }, + lex: expect.any(Object), + polly: expect.any(Object), + username: 'test-user', + Login: 'https://login.com', + idtoken: 'id-token', + }); + }); + + it('should refresh tokens when refresh token is present', async () => { + const mockHeadResponse = { headers: { 'api-stage': 'test' } }; + const mockGetResponse = { + data: { + region: 'us-east-1', + UserPool: 'pool-id', + PoolId: 'pool-id', + ClientIdClient: 'client-id', + _links: { + CognitoEndpoint: { href: 'https://cognito-endpoint.com' }, + ClientLogin: { href: 'https://login.com' }, }, + }, + }; + const mockTokenResponse = { + data: { + id_token: 'new-id-token', + }, + }; + + windowMock.sessionStorage.getItem.mockReturnValue('refresh-token'); + queryString.parse.mockReturnValue({ code: '123456' }); + + + axios.head.mockResolvedValue(mockHeadResponse); + axios.get.mockResolvedValue(mockGetResponse); + axios.mockResolvedValue(mockTokenResponse); + const result = await clientAuth().catch(() => {}); + + expect(axios.head).toHaveBeenCalledWith('http://localhost/'); + expect(axios.get).toHaveBeenCalledWith('/test'); + expect(axios).toHaveBeenCalledWith( + {"data": "grant_type=refresh_token&client_id=client-id&refresh_token=refresh-token", "headers": {"Content-Type": "application/x-www-form-urlencoded"}, "method": "POST", "url": "https://cognito-endpoint.com/oauth2/token"} + ); + const testToken = { + 'cognito:username': 'test-user', + 'cognito:groups': 'testgroup', + }; + + result.username = testToken['cognito:username']; + expect(result).toEqual({ + config: { + region: 'us-east-1', + credentials: expect.any(Object), + }, + lex: expect.any(Object), + polly: expect.any(Object), + username: 'test-user', + Login: 'https://login.com', + idtoken: 'new-id-token', }); + }); + + it('should use Cognito identity credentials when no code is present', async () => { + windowMock.location.href = 'http://localhost/'; + windowMock.location.search = ''; + queryString.parse.mockReturnValue({}); + + const mockHeadResponse = { headers: { 'api-stage': 'test' } }; + const mockGetResponse = { + data: { + region: 'us-east-1', + UserPool: 'pool-id', + PoolId: 'pool-id', + ClientIdClient: 'client-id', + _links: { + CognitoEndpoint: { href: 'https://cognito-endpoint.com' }, + ClientLogin: { href: 'https://login.com' }, + }, + }, + }; + + axios.head.mockResolvedValue(mockHeadResponse); + axios.get.mockResolvedValue(mockGetResponse); + + const result = await clientAuth().catch(() => {}); - test('client auths', async () => { - await clientAuthModule().catch(() => {}); - expect(jwt.decode).toHaveBeenCalledTimes(1); - expect(jwt.decode).toHaveBeenCalledWith('test-token'); + expect(axios.head).toHaveBeenCalledWith('http://localhost/'); + expect(axios.get).toHaveBeenCalledWith('/test'); + expect(axios.post).not.toHaveBeenCalled(); + expect(windowMock.sessionStorage.getItem).not.toHaveBeenCalled(); + expect(result).toEqual({ + config: { + region: 'us-east-1', + credentials: expect.any(Object), + }, + lex: expect.any(Object), + polly: expect.any(Object), + username: undefined, + Login: 'https://login.com', + idtoken: undefined, }); -}); + }); +}); \ No newline at end of file diff --git a/website/js/lib/client-auth.js b/website/js/lib/client-auth.js index f2bc6f9a..e12f5f03 100644 --- a/website/js/lib/client-auth.js +++ b/website/js/lib/client-auth.js @@ -19,35 +19,39 @@ const jwt = require('jsonwebtoken'); const { LexRuntimeService } = require('@aws-sdk/client-lex-runtime-service'); const { Polly } = require('@aws-sdk/client-polly'); -module.exports = async function () { +module.exports = async function() { const result = await axios.head(window.location.href); const stage = result.headers['api-stage']; const response = await axios.get(`/${stage}`); const info = response.data; - const hash = window.location.hash.slice(1); - const params = query.parse(hash); const region = info.region; const lex = new LexRuntimeService({ region }) const polly = new Polly({ region }); aws.config.region = region; - let credentials, username; - if (params.id_token) { - const token = jwt.decode(params.id_token); - console.log(token); + let credentials, username, token; + const { code } = query.parse(window.location.search); + if (code) { + if (window.sessionStorage.getItem('refresh_token')) { + token = await refreshTokens(response); + } + if (!token) { + token = await getTokens(response, code); + } + const decodedToken = jwt.decode(token); const Logins = {}; Logins[[ 'cognito-idp.', info.region, '.amazonaws.com/', info.UserPool, - ].join('')] = params.id_token; + ].join('')] = token; credentials = new aws.CognitoIdentityCredentials({ IdentityPoolId: info.PoolId, - RoleSessionName: token['cognito:username'], + RoleSessionName: decodedToken['cognito:username'], Logins, }); - username = token['cognito:username']; + username = decodedToken['cognito:username']; } else { credentials = new aws.CognitoIdentityCredentials({ IdentityPoolId: info.PoolId, @@ -56,11 +60,68 @@ module.exports = async function () { credentials.clearCachedId(); await credentials.getPromise(); return { - config: { region, credentials}, + config: { + region, + credentials + }, lex, polly, username, Login: _.get(info, '_links.ClientLogin.href'), - idtoken: params.id_token, + idtoken: token, }; }; + +async function getTokens(response, code) { + const endpoint = response.data._links.CognitoEndpoint.href; + const clientId = response.data.ClientIdClient; + try { + const axiosData = query.stringify({ + grant_type: 'authorization_code', + client_id: clientId, + code, + redirect_uri: window.location.origin + window.location.pathname, + }); + const tokens = await axiosPost('POST', endpoint, axiosData); + + window.sessionStorage.setItem('refresh_token', tokens.data.refresh_token); + return tokens.data.id_token; + } catch (e) { + console.log(e); + const result = window.confirm('Unable to fetch credentials, please log back in. Click Ok to be redirected to the login page.'); + if (result) { + window.location.href = response.data._links.ClientLogin.href; + } + } +} + + +async function refreshTokens(response) { + const refresh_token = window.sessionStorage.getItem('refresh_token'); + const endpoint = response.data._links.CognitoEndpoint.href; + const clientId = response.data.ClientIdClient; + try { + const axiosData = query.stringify({ + grant_type: 'refresh_token', + client_id: clientId, + refresh_token, + }); + const tokens = await axiosPost( 'POST', endpoint, axiosData); + + return tokens.data.id_token; + } catch (e) { + console.log(e); + } +} + +async function axiosPost(axiosMethod, axiosClient, axiosData) { + const tokens = await axios({ + method: axiosMethod, + url: `${axiosClient}/oauth2/token`, + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + data: axiosData, + }); + return tokens; +}