diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 987ff6a2..aa3e0eb4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -27,6 +27,10 @@ updates: interval: 'daily' # Lambda functions + - package-ecosystem: 'npm' + directory: 'lib/lambda/c3-utils-layer/lib/nodejs' + schedule: + interval: 'daily' - package-ecosystem: 'npm' directory: 'lib/lambda/c3-create-payment-request' schedule: @@ -40,7 +44,7 @@ updates: schedule: interval: 'daily' - package-ecosystem: 'npm' - directory: 'lib/lambda/c3-email-receipt' + directory: 'lib/lambda/c3-send-receipt' schedule: interval: 'daily' - package-ecosystem: 'npm' @@ -51,3 +55,7 @@ updates: directory: 'lib/lambda/c3-send-agent-message' schedule: interval: 'daily' + - package-ecosystem: 'npm' + directory: 'lib/lambda/c3-validate-entry' + schedule: + interval: 'daily' diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index ae9c4262..a364802e 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -36,7 +36,8 @@ jobs: "instanceArn": "placeholder", "securityKeyId": "placeholder", "securityKeyCertificateContent": "-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n", - "workspaceApp": true + "workspaceApp": true, + "receiptQueueArn": "placeholder" }, "c3": { "env": "dev", diff --git a/.vscode/settings.json b/.vscode/settings.json index 1de5798b..69463db5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,8 +4,10 @@ "conventionalcommits", "Inclusivity", "IVR", + "luhn", "Nexio", "Popout", + "Runtimes", "Softphone", "Tokenizes", "Visualforce", diff --git a/bin/c3-amazon-connect.ts b/bin/c3-amazon-connect.ts index 50161a9a..76ee2514 100644 --- a/bin/c3-amazon-connect.ts +++ b/bin/c3-amazon-connect.ts @@ -32,7 +32,7 @@ async function getMostRecentGitTag(): Promise { return stdout.trim(); } catch (error) { console.error('Error fetching the most recent git tag:', error); - return 'v1.4.0'; + return 'v2.0.0'; } } diff --git a/cdk.context.json b/cdk.context.json index 17932a10..d57eb65d 100644 --- a/cdk.context.json +++ b/cdk.context.json @@ -4,7 +4,8 @@ "instanceArn": "", "securityKeyId": "", "securityKeyCertificateContent": "", - "workspaceApp": true + "workspaceApp": true, + "receiptQueueArn": "" }, "c3": { "env": "prod", diff --git a/docs/GETTING-STARTED.md b/docs/GETTING-STARTED.md index 774382aa..d1398b6d 100644 --- a/docs/GETTING-STARTED.md +++ b/docs/GETTING-STARTED.md @@ -48,12 +48,13 @@ In order to facilitate this process, you will need to provide some values to the ##### Amazon Connect -| Value | Description | -| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `instanceArn` | The full ARN of your Amazon Connect Instance. You can find this in the AWS console and it should look something like `"arn:aws:connect:us-west-2:815407490078:instance/5c1f1fba-d5f1-4155-9e09-496456e58912"`. | -| `securityKeyId` | The ID of the security key that you configured for your Amazon Connect instance. You can find this in the AWS console. | -| `securityKeyCertificateContent` | The full content of the certificate associated with your Amazon Connect security key. Begins with `-----BEGIN CERTIFICATE-----` and ends with`-----END CERTIFICATE-----`. **Note**: This must be contained within a single string with newlines denoted with `\\n`. | -| `workspaceApp` | Whether to create the C3 Payment Request app for the Amazon Connect agent workspace. Defaults to `true`. You may want to set this to `false` if you plan to use the workspace through another interface, like Salesforce. **Note**: This option does nothing if no agent-assisted features are enabled. | +| Value | Description | +| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `instanceArn` | The full ARN of your Amazon Connect Instance. You can find this in the AWS console and it should look something like `"arn:aws:connect:us-west-2:815407490078:instance/5c1f1fba-d5f1-4155-9e09-496456e58912"`. | +| `securityKeyId` | The ID of the security key that you configured for your Amazon Connect instance. You can find this in the AWS console. | +| `securityKeyCertificateContent` | The full content of the certificate associated with your Amazon Connect security key. Begins with `-----BEGIN CERTIFICATE-----` and ends with`-----END CERTIFICATE-----`. **Note**: This must be contained within a single string with newlines denoted with `\\n`. | +| `workspaceApp` | Whether to create the C3 Payment Request app for the Amazon Connect agent workspace. Defaults to `true`. You may want to set this to `false` if you plan to use the workspace through another interface, like Salesforce. **Note**: This option does nothing if no agent-assisted features are enabled. | +| `receiptQueueArn` | **Optional**. The full ARN of the Amazon Connect queue to transfer to when there is no email present for the customer and they would like a receipt. This is only valid for self-service payments. If not provided, the customer will not be asked to transfer to an agent and will simply not receive a receipt. | ##### C3 diff --git a/lib/c3-amazon-connect-stack.ts b/lib/c3-amazon-connect-stack.ts index 890fccb7..c30972c8 100644 --- a/lib/c3-amazon-connect-stack.ts +++ b/lib/c3-amazon-connect-stack.ts @@ -1,7 +1,12 @@ import { join } from 'path'; import { SecretValue, Stack, StackProps } from 'aws-cdk-lib'; import { CfnIntegrationAssociation } from 'aws-cdk-lib/aws-connect'; -import { Code, CodeSigningConfig, Function } from 'aws-cdk-lib/aws-lambda'; +import { + Code, + CodeSigningConfig, + Function, + LayerVersion, +} from 'aws-cdk-lib/aws-lambda'; import { PolicyStatement } from 'aws-cdk-lib/aws-iam'; import { SigningProfile, Platform } from 'aws-cdk-lib/aws-signer'; import { Secret } from 'aws-cdk-lib/aws-secretsmanager'; @@ -12,6 +17,7 @@ import { Zift } from './payment-gateways/zift'; import { AgentAssistedPaymentIVR, SelfServicePaymentIVR } from './features'; import { associateLambdaFunctionsWithConnect, + commonLambdaLayerProps, commonLambdaProps, } from './helpers/lambda'; import { SubjectLookup } from './features/subject-lookup'; @@ -46,10 +52,12 @@ export class C3AmazonConnectStack extends Stack { private codeSigningConfig: CodeSigningConfig; private c3ApiKeySecret: Secret; private privateKeySecret: Secret; + private utilsLayer: LayerVersion; private createPaymentRequestFunction: Function; + private validateEntryFunction: Function; private tokenizeTransactionFunction: Function; private submitPaymentFunction: Function; - private emailReceiptFunction: Function; + private sendReceiptFunction: Function; private agentAssistedIVRResources: AgentAssistedPaymentIVR; @@ -70,15 +78,18 @@ export class C3AmazonConnectStack extends Stack { this.featuresContext.agentAssistedIVR ) { this.createPrivateKeySecret(); + this.createUtilsLayer(); this.createCreatePaymentRequestFunction(); + this.createValidateEntryFunction(); this.createTokenizeTransactionFunction(); this.createSubmitPaymentFunction(); - this.createEmailReceiptFunction(); + this.createSendReceiptFunction(); associateLambdaFunctionsWithConnect(this, [ this.createPaymentRequestFunction, + this.validateEntryFunction, this.tokenizeTransactionFunction, this.submitPaymentFunction, - this.emailReceiptFunction, + this.sendReceiptFunction, ]); } @@ -91,7 +102,7 @@ export class C3AmazonConnectStack extends Stack { this.createPaymentRequestFunction, this.tokenizeTransactionFunction, this.submitPaymentFunction, - this.emailReceiptFunction, + this.sendReceiptFunction, ); } if (this.featuresContext.agentAssistedIVR) { @@ -102,10 +113,11 @@ export class C3AmazonConnectStack extends Stack { this.codeSigningConfig, this.c3BaseUrl, this.c3ApiKeySecret, + this.utilsLayer, this.createPaymentRequestFunction, this.tokenizeTransactionFunction, this.submitPaymentFunction, - this.emailReceiptFunction, + this.sendReceiptFunction, ); } if (this.featuresContext.subjectLookup) { @@ -247,6 +259,20 @@ export class C3AmazonConnectStack extends Stack { }); } + /** + * Creates a Lambda layer for utility functions. + * + * This layer is necessary for the Lambda functions to access utility functions that are shared across multiple functions. + */ + private createUtilsLayer(): void { + console.log('Creating layer for utility functions...'); + this.utilsLayer = new LayerVersion(this, 'C3UtilsLayer', { + ...commonLambdaLayerProps, + description: 'Utility functions for C3 payment processing.', + code: Code.fromAsset(join(__dirname, 'lambda/c3-utils-layer/lib')), + }); + } + /** * Creates a Lambda function for creating a payment request. * @@ -274,6 +300,7 @@ export class C3AmazonConnectStack extends Stack { codeSigningConfig: this.optionsContext.codeSigning ? this.codeSigningConfig : undefined, + layers: [this.utilsLayer], }, ); @@ -285,6 +312,41 @@ export class C3AmazonConnectStack extends Stack { this.createPaymentRequestFunction.addToRolePolicy(getSecretValuePolicy); } + /** + * Creates a Lambda function for validating the customer's entry in the IVR. + * + * This function is necessary to validate credit card and bank account information entered by the customer. + */ + private createValidateEntryFunction(): void { + console.log('Creating function C3ValidateEntry...'); + this.validateEntryFunction = new Function(this, 'C3ValidateEntry', { + ...commonLambdaProps, + description: "Validates a customer's entry in the C3 payment IVR(s).", + code: Code.fromAsset(join(__dirname, 'lambda/c3-validate-entry')), + environment: { + C3_PRIVATE_KEY_SECRET_ID: this.privateKeySecret.secretName, + CONNECT_SECURITY_KEY_ID: this.amazonConnectContext.securityKeyId, + }, + codeSigningConfig: this.optionsContext.codeSigning + ? this.codeSigningConfig + : undefined, + layers: [this.utilsLayer], + }); + + // Create policies for decrypting payment information. + const decryptPolicy = new PolicyStatement({ + actions: ['kms:Decrypt'], + resources: ['*'], + }); + this.validateEntryFunction.addToRolePolicy(decryptPolicy); + + const getSecretValuePolicy = new PolicyStatement({ + actions: ['secretsmanager:GetSecretValue'], + resources: [this.privateKeySecret.secretArn], + }); + this.validateEntryFunction.addToRolePolicy(getSecretValuePolicy); + } + /** * Creates a Lambda function for tokenizing payment details. * @@ -308,6 +370,7 @@ export class C3AmazonConnectStack extends Stack { codeSigningConfig: this.optionsContext.codeSigning ? this.codeSigningConfig : undefined, + layers: [this.utilsLayer], }, ); @@ -359,6 +422,7 @@ export class C3AmazonConnectStack extends Stack { codeSigningConfig: this.optionsContext.codeSigning ? this.codeSigningConfig : undefined, + layers: [this.utilsLayer], }); // Create the policy for getting secret values. @@ -370,16 +434,16 @@ export class C3AmazonConnectStack extends Stack { } /** - * Creates a Lambda function for sending an email receipt. + * Creates a Lambda function for sending a receipt. * - * This function is necessary for your payment flow to send an email receipt to the customer using C3 after the payment has been processed. + * This function is necessary for your payment flow to send a receipt to the customer using C3 after the payment has been processed. */ - private createEmailReceiptFunction(): void { - console.log('Creating function C3EmailReceipt...'); - this.emailReceiptFunction = new Function(this, 'C3EmailReceipt', { + private createSendReceiptFunction(): void { + console.log('Creating function C3SendReceipt...'); + this.sendReceiptFunction = new Function(this, 'C3SendReceipt', { ...commonLambdaProps, - description: 'Creates a payment request through the C3 API.', - code: Code.fromAsset(join(__dirname, 'lambda/c3-email-receipt')), + description: 'Sends a payment receipt using the C3 API.', + code: Code.fromAsset(join(__dirname, 'lambda/c3-send-receipt')), environment: { C3_BASE_URL: this.c3BaseUrl, C3_API_KEY_SECRET_ID: this.c3ApiKeySecret.secretName, @@ -387,6 +451,7 @@ export class C3AmazonConnectStack extends Stack { codeSigningConfig: this.optionsContext.codeSigning ? this.codeSigningConfig : undefined, + layers: [this.utilsLayer], }); // Create the policy for getting secret values. @@ -394,7 +459,7 @@ export class C3AmazonConnectStack extends Stack { actions: ['secretsmanager:GetSecretValue'], resources: [this.c3ApiKeySecret.secretArn], }); - this.emailReceiptFunction.addToRolePolicy(getSecretValuePolicy); + this.sendReceiptFunction.addToRolePolicy(getSecretValuePolicy); } /** diff --git a/lib/connect/content-transformations.ts b/lib/connect/content-transformations.ts index a1efccb9..365bdc19 100644 --- a/lib/connect/content-transformations.ts +++ b/lib/connect/content-transformations.ts @@ -9,23 +9,23 @@ import * as subjectLookupFlow from './flows/c3-subject-lookup-flow.json'; * @param createPaymentRequestLambdaArn The Lambda function that creates a payment request. * @param tokenizeTransactionLambdaArn The Lambda function that tokenizes a transaction. * @param submitPaymentLambdaArn The Lambda function that submits a payment. + * @param sendReceiptLambdaArn The Lambda function that sends a receipt. * @param amazonConnectSecurityKeyId The security key ID for Amazon Connect. * @param amazonConnectSecurityKeyCertificateContent The security key certificate content for Amazon Connect. + * @param amazonConnectReceiptQueueArn The ARN for the Amazon Connect receipt queue. * @returns A string representing the content for the base IVR payment flow module. */ export function getPaymentIVRFlowModuleContent( createPaymentRequestLambdaFunction: Function, tokenizeTransactionLambdaFunction: Function, submitPaymentLambdaFunction: Function, - emailReceiptLambdaFunction: Function, + sendReceiptLambdaFunction: Function, amazonConnectSecurityKeyId: string, amazonConnectSecurityKeyCertificateContent: string, + amazonConnectReceiptQueueArn: string, ) { let transformedContent = JSON.stringify(flowModuleJson); - // Don't escape quotes. - transformedContent = transformedContent.replace(/\\/g, ''); - // Replace Lambda placeholders with actual ARNs. transformedContent = transformedContent.replace( /<>/g, @@ -40,8 +40,8 @@ export function getPaymentIVRFlowModuleContent( submitPaymentLambdaFunction.functionArn, ); transformedContent = transformedContent.replace( - /<>/g, - emailReceiptLambdaFunction.functionArn, + /<>/g, + sendReceiptLambdaFunction.functionArn, ); // Replace Amazon Connect security key placeholders with actual values. @@ -53,6 +53,17 @@ export function getPaymentIVRFlowModuleContent( /<>/g, amazonConnectSecurityKeyCertificateContent, ); + + // Replace the receipt queue ID placeholder with the actual value. + const queueId = amazonConnectReceiptQueueArn.split('/queue/').pop(); + if (!queueId) { + throw new Error('Invalid ARN for the receipt queue.'); + } + transformedContent = transformedContent.replace( + /<>/g, + queueId, + ); + return transformedContent; } @@ -63,6 +74,7 @@ export function getPaymentIVRFlowModuleContent( * @param createPaymentRequestFunction The Lambda function that creates a payment request. * @param tokenizeTransactionFunction The Lambda function that tokenizes a transaction. * @param submitPaymentLambdaFunction The Lambda function that submits a payment. + * @param sendReceiptLambdaFunction The Lambda function that sends a receipt. * @param amazonConnectSecurityKeyId The security key ID for Amazon Connect. * @param amazonConnectSecurityKeyCertificateContent The security key certificate content for Amazon Connect. * @returns A string representing the content for the base IVR payment flow. @@ -72,15 +84,12 @@ export function getSelfServicePaymentIVRFlowContent( createPaymentRequestFunction: Function, tokenizeTransactionFunction: Function, submitPaymentLambdaFunction: Function, - emailReceiptLambdaFunction: Function, + sendReceiptLambdaFunction: Function, amazonConnectSecurityKeyId: string, amazonConnectSecurityKeyCertificateContent: string, ) { let transformedContent = JSON.stringify(agentAssistedPaymentIVRFlowJson); - // Don't escape quotes. - transformedContent = transformedContent.replace(/\\/g, ''); - // Replace Lambda placeholders with actual ARNs. transformedContent = transformedContent.replace( /<>/g, @@ -99,8 +108,8 @@ export function getSelfServicePaymentIVRFlowContent( submitPaymentLambdaFunction.functionArn, ); transformedContent = transformedContent.replace( - /<>/g, - emailReceiptLambdaFunction.functionArn, + /<>/g, + sendReceiptLambdaFunction.functionArn, ); // Replace Amazon Connect security key placeholders with actual values. @@ -128,9 +137,6 @@ export function getSubjectLookupFlowContent( ): string { let transformedContent = JSON.stringify(subjectLookupFlow); - // Don't escape quotes. - transformedContent = transformedContent.replace(/\\/g, ''); - // Replace the placeholders with the actual values. transformedContent = transformedContent.replace( /<>/g, diff --git a/lib/connect/flows/c3-agent-assisted-payment-ivr-flow.json b/lib/connect/flows/c3-agent-assisted-payment-ivr-flow.json index 8a8acc45..0ccc0fef 100644 --- a/lib/connect/flows/c3-agent-assisted-payment-ivr-flow.json +++ b/lib/connect/flows/c3-agent-assisted-payment-ivr-flow.json @@ -7,214 +7,6 @@ "y": 677.6 }, "ActionMetadata": { - "5a505241-be5a-4437-8d66-785eb1b0beca": { - "position": { - "x": 6692, - "y": 696 - } - }, - "Card Number Timeout": { - "position": { - "x": 1551.2, - "y": -599.2 - }, - "isFriendlyName": true - }, - "Account Number Timeout": { - "position": { - "x": 1603.2, - "y": 422.4 - }, - "isFriendlyName": true - }, - "Account Number Timeout Check": { - "position": { - "x": 1848, - "y": 442.4 - }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "822d4f1e-ced0-4336-b603-ae6b7709ee7e", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Timeout" - } - ] - }, - "Card Number Timeout Check": { - "position": { - "x": 1680, - "y": -376.8 - }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "b7eda77f-7301-4682-a299-564b836e874d", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Timeout" - } - ] - }, - "Routing Number Timeout": { - "position": { - "x": 2411.2, - "y": 423.2 - }, - "isFriendlyName": true - }, - "Routing Number Timeout Check": { - "position": { - "x": 2656.8, - "y": 369.6 - }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "91e62c7e-a5d1-42bc-8030-a5c6a44398d4", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Timeout" - } - ] - }, - "Report Account Number Entered": { - "position": { - "x": 2090.4, - "y": 639.2 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Store Encrypted Card Number": { - "position": { - "x": 1807.2, - "y": -172 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "EncryptedCardNumber": { - "useDynamic": true - } - } - }, - "dynamicParams": ["EncryptedCardNumber"] - }, - "Store Encrypted Account Number": { - "position": { - "x": 1872, - "y": 646.4 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "EncryptedAccountNumber": { - "useDynamic": true - } - } - }, - "dynamicParams": ["EncryptedAccountNumber"] - }, - "Store Expiration Date": { - "position": { - "x": 2786.4, - "y": -180 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "ExpirationDate": { - "useDynamic": true - } - } - }, - "dynamicParams": ["ExpirationDate"] - }, - "Store Routing Number": { - "position": { - "x": 2779.2, - "y": 627.2 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "RoutingNumber": { - "useDynamic": true - } - } - }, - "dynamicParams": ["RoutingNumber"] - }, - "Payment Success": { - "position": { - "x": 4898.4, - "y": 470.4 - }, - "isFriendlyName": true - }, - "Record Transaction ID": { - "position": { - "x": 4443.2, - "y": 366.4 - }, - "isFriendlyName": true, - "dynamicParams": [] - }, - "Report Payment Processed": { - "position": { - "x": 4673.6, - "y": 367.2 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Check for Customer Email": { - "position": { - "x": 5120, - "y": 472 - }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "0b87f91f-cb5a-4fde-aece-f78760d44a79", - "operator": { - "name": "Contains", - "value": "Contains", - "shortDisplay": "contains" - }, - "value": "@" - } - ] - }, "Check for Entered Info": { "position": { "x": -2976.8, @@ -224,7 +16,7 @@ "conditions": [], "conditionMetadata": [ { - "id": "03c47790-50f3-4972-a50f-ff7833d3a227", + "id": "8c7a3dc5-99b9-4329-9dc4-6e59aff0ef2e", "operator": { "name": "Is greater than", "value": "GreaterThan", @@ -270,21 +62,6 @@ "EventText": false } }, - "Report Bank Account Selected Again": { - "position": { - "x": 285.6, - "y": -236.8 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, "Agent Hold Error": { "position": { "x": -1571.2, @@ -292,63 +69,6 @@ }, "isFriendlyName": true }, - "Receipt Success": { - "position": { - "x": 5581.6, - "y": 387.2 - }, - "isFriendlyName": true - }, - "Email Receipt": { - "position": { - "x": 5361.6, - "y": 472 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": {} - }, - "Report Receipt Email Error": { - "position": { - "x": 5592, - "y": 569.6 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Receipt Error": { - "position": { - "x": 5804, - "y": 572 - }, - "isFriendlyName": true - }, - "Report Credit Card Selected Again": { - "position": { - "x": 218.4, - "y": -461.6 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, "Payment Method Timeout": { "position": { "x": 424.8, @@ -364,12 +84,6 @@ "isFriendlyName": true, "dynamicParams": [] }, - "90dc6a63-2ae9-4c5f-b65f-75348779d0c6": { - "position": { - "x": 6472.8, - "y": 689.6 - } - }, "Payment Request Error": { "position": { "x": -2152.8, @@ -405,175 +119,10 @@ }, "isFriendlyName": true }, - "Report Card Number Encryption Error": { + "Input Not Recognized": { "position": { - "x": 1846.4, - "y": 50.4 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Report Account Number Encryption Error": { - "position": { - "x": 1996.8, - "y": 875.2 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Report Expiration Date Error": { - "position": { - "x": 2881.6, - "y": 34.4 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Report Routing Number Error": { - "position": { - "x": 2796, - "y": 848 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Get & Encrypt Card Number": { - "position": { - "x": 1558.4, - "y": -177.6 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, - "Get & Encrypt Account Number": { - "position": { - "x": 1635.2, - "y": 629.6 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, - "Returning To Agent": { - "position": { - "x": 6256.8, - "y": 695.2 - }, - "isFriendlyName": true - }, - "Internal Error": { - "position": { - "x": 1320, - "y": 1038.4 - }, - "isFriendlyName": true - }, - "Expiration Date Timeout": { - "position": { - "x": 2492.8, - "y": -591.2 - }, - "isFriendlyName": true - }, - "Expiration Date Timeout Check": { - "position": { - "x": 2625.6, - "y": -388 - }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "3299690a-97dd-48c2-84aa-123574189646", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Timeout" - } - ] - }, - "Report Card Number Entered": { - "position": { - "x": 2044.8, - "y": -172 - }, - "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } - }, - "dynamicMetadata": { - "EventText": false - } - }, - "Get Routing Number": { - "position": { - "x": 2500.8, - "y": 646.4 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, - "Try Routing Number Again": { - "position": { - "x": 2540, - "y": 870.4 - }, - "isFriendlyName": true - }, - "Input Not Recognized": { - "position": { - "x": 666.4, - "y": 87.2 - }, - "isFriendlyName": true - }, - "Get Expiration Date": { - "position": { - "x": 2525.6, - "y": -188.8 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, - "Try Expiration Date Again": { - "position": { - "x": 2589.6, - "y": 28 + "x": 666.4, + "y": 87.2 }, "isFriendlyName": true }, @@ -642,6 +191,20 @@ "isFriendlyName": true, "dynamicParams": [] }, + "Agent Placed On Hold": { + "position": { + "x": -1126.4, + "y": 561.6 + }, + "isFriendlyName": true + }, + "Speak Amount": { + "position": { + "x": -812.8, + "y": 557.6 + }, + "isFriendlyName": true + }, "Use Card Again?": { "position": { "x": -129.6, @@ -650,66 +213,52 @@ "isFriendlyName": true, "conditionMetadata": [ { - "id": "0e49b6dc-6616-419c-bccf-c0303130e51e", + "id": "4872ca41-5d2c-4db7-9c45-e9adafa62466", "value": "1" }, { - "id": "5b6aaba4-775c-4da9-a03a-fccfe2fbb13f", + "id": "a28d452f-11fc-43ff-965c-aeb9d4b9d7f8", "value": "2" } ] }, - "Use Bank Account Again?": { + "Use Payment Method Again Timeout": { + "position": { + "x": -345.6, + "y": -348.8 + }, + "isFriendlyName": true + }, + "Ask for Payment Method": { "position": { - "x": -75.2, - "y": 223.2 + "x": 382.4, + "y": 500 }, "isFriendlyName": true, "conditionMetadata": [ { - "id": "fd0a0c6b-7489-4ba8-a2fd-d6ee418813e2", + "id": "5080da17-d5dd-40f0-b533-0e3438b47a3b", "value": "1" }, { - "id": "c6a4ff59-e138-4308-bd37-43ebecd3cbc4", + "id": "370324ea-6acf-498c-aa5c-13c4cbdd54e6", "value": "2" } ] }, - "Use Payment Method Again Timeout": { - "position": { - "x": -345.6, - "y": -348.8 - }, - "isFriendlyName": true - }, - "Agent Placed On Hold": { - "position": { - "x": -1126.4, - "y": 561.6 - }, - "isFriendlyName": true - }, - "Speak Amount": { - "position": { - "x": -812.8, - "y": 557.6 - }, - "isFriendlyName": true - }, - "Ask for Payment Method": { + "Use Bank Account Again?": { "position": { - "x": 382.4, - "y": 500 + "x": -76.8, + "y": 221.6 }, "isFriendlyName": true, "conditionMetadata": [ { - "id": "ef5a3c37-6f52-43ee-b4ce-579a2103d23a", + "id": "2f7c367d-0463-4994-bded-6803052623f9", "value": "1" }, { - "id": "121f223b-b879-4f3e-8a41-fac3e35208bb", + "id": "d30e9f60-dfda-49f0-b84f-4096a0a51e17", "value": "2" } ] @@ -723,7 +272,7 @@ "conditions": [], "conditionMetadata": [ { - "id": "a0d9f6d1-b41d-4ec0-9d64-ddcc3d2568be", + "id": "da277406-1261-4e60-9f5a-9a72fa5897c3", "operator": { "name": "Equals", "value": "Equals", @@ -732,7 +281,7 @@ "value": "Card" }, { - "id": "b992a024-856f-4b3d-895f-8d8bcb26950d", + "id": "37b3aaf0-71d7-42a7-8dc3-d430814885c2", "operator": { "name": "Equals", "value": "Equals", @@ -742,60 +291,108 @@ } ] }, + "5a505241-be5a-4437-8d66-785eb1b0beca": { + "position": { + "x": 8133.6, + "y": 702.4 + } + }, + "90dc6a63-2ae9-4c5f-b65f-75348779d0c6": { + "position": { + "x": 7914.4, + "y": 696 + } + }, + "Receipt Error": { + "position": { + "x": 7245.6, + "y": 578.4 + }, + "isFriendlyName": true + }, + "Returning To Agent": { + "position": { + "x": 7698.4, + "y": 701.6 + }, + "isFriendlyName": true + }, "Redact Sensitive Contact Attributes": { "position": { - "x": 6037.6, - "y": 699.2 + "x": 7479.2, + "y": 705.6 }, "isFriendlyName": true, "dynamicParams": [] }, - "Submit Payment": { + "Payment Validation Error": { "position": { - "x": 4213.6, - "y": 384.8 + "x": 6126.4, + "y": 888 + }, + "isFriendlyName": true + }, + "Remove Failed Payment Token and Method": { + "position": { + "x": 6423.2, + "y": 841.6 }, "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" - } + "dynamicParams": [] + }, + "Speak Validation Error": { + "position": { + "x": 5225.6, + "y": 702.4 }, - "dynamicMetadata": {} + "isFriendlyName": true }, - "Report Payment Submission Error": { + "Report Validation Error": { "position": { - "x": 4446.4, - "y": 623.2 + "x": 5470.4, + "y": 707.2 }, "isFriendlyName": true, "parameters": { "LambdaFunctionARN": { "displayName": "<>" + }, + "LambdaInvocationAttributes": { + "EventText": { + "useDynamic": true + } } }, "dynamicMetadata": { - "EventText": false + "EventText": true } }, "Payment Submission Error": { "position": { - "x": 4686.4, - "y": 619.2 + "x": 6128, + "y": 625.6 }, "isFriendlyName": true }, - "Payment Validation Error": { + "Record Token": { + "position": { + "x": 5218.4, + "y": 393.6 + }, + "isFriendlyName": true, + "dynamicParams": [] + }, + "Payment Success": { "position": { - "x": 4684.8, - "y": 881.6 + "x": 6340, + "y": 476.8 }, "isFriendlyName": true }, - "Report Payment Tokenized": { + "Report Credit Card Selected Again": { "position": { - "x": 3997.6, - "y": 384 + "x": 218.4, + "y": -461.6 }, "isFriendlyName": true, "parameters": { @@ -807,10 +404,10 @@ "EventText": false } }, - "Report Expiration Entered": { + "Report Bank Account Selected Again": { "position": { - "x": 3006.4, - "y": -184.8 + "x": 285.6, + "y": -236.8 }, "isFriendlyName": true, "parameters": { @@ -822,10 +419,10 @@ "EventText": false } }, - "Report Routing Number Entered": { + "Report Payment Submission Error": { "position": { - "x": 3012.8, - "y": 614.4 + "x": 5888, + "y": 629.6 }, "isFriendlyName": true, "parameters": { @@ -837,10 +434,10 @@ "EventText": false } }, - "Report Tokenization Error": { + "Report Payment Tokenized": { "position": { - "x": 4440.8, - "y": 872.8 + "x": 5439.2, + "y": 390.4 }, "isFriendlyName": true, "parameters": { @@ -852,36 +449,136 @@ "EventText": false } }, - "Record Token": { + "Report Payment Processed": { "position": { - "x": 3776.8, - "y": 387.2 + "x": 6115.2, + "y": 373.6 }, "isFriendlyName": true, - "dynamicParams": [] + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } }, - "Tokenize Transaction": { + "Submit Payment": { "position": { - "x": 3304.8, - "y": 383.2 + "x": 5655.2, + "y": 391.2 }, "isFriendlyName": true, "parameters": { "LambdaFunctionARN": { - "displayName": "<>" + "displayName": "<>" } }, "dynamicMetadata": {} }, + "Record Transaction Attributes": { + "position": { + "x": 5896.8, + "y": 374.4 + }, + "isFriendlyName": true, + "dynamicParams": [] + }, + "Report Card Number Encryption Error": { + "position": { + "x": 2282.4, + "y": 42.4 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Card Number Timeout": { + "position": { + "x": 1551.2, + "y": -599.2 + }, + "isFriendlyName": true + }, + "Account Number Timeout": { + "position": { + "x": 1603.2, + "y": 422.4 + }, + "isFriendlyName": true + }, + "Account Number Timeout Check": { + "position": { + "x": 1828.8, + "y": 430.4 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "a6fb12ce-54a8-4bd5-b49a-c93f27e00197", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Timeout" + } + ] + }, + "Validate Account Number": { + "position": { + "x": 1860.8, + "y": 631.2 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { + "useDynamic": true + } + } + }, + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } + }, + "Report Tokenization Error": { + "position": { + "x": 5882.4, + "y": 879.2 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, "Check for Tokenize Error": { "position": { - "x": 3547.2, - "y": 372.8 + "x": 4988.8, + "y": 379.2 }, "isFriendlyName": true, + "conditions": [], "conditionMetadata": [ { - "id": "7e6ab979-2475-41c0-abcb-8e525308021a", + "id": "e71353a1-8fd9-497e-bed6-398e4fc99cc9", "operator": { "name": "Equals", "value": "Equals", @@ -891,67 +588,1001 @@ } ] }, - "Remove Failed Payment Token and Method": { + "Report Card Number Entered": { "position": { - "x": 4981.6, - "y": 835.2 + "x": 2480.8, + "y": -180 }, "isFriendlyName": true, - "dynamicParams": [] + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } }, - "Speak Validation Error": { + "Try Expiration Date Again": { "position": { - "x": 3784, - "y": 696 + "x": 3320.8, + "y": 62.4 }, "isFriendlyName": true }, - "Report Validation Error": { + "Report Account Number Entered": { + "position": { + "x": 2500.8, + "y": 634.4 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Try Routing Number Again": { + "position": { + "x": 3271.2, + "y": 904.8 + }, + "isFriendlyName": true + }, + "Tokenize Transaction": { + "position": { + "x": 4746.4, + "y": 389.6 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": {} + }, + "Report Routing Number Error": { + "position": { + "x": 4064, + "y": 852.8 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Report Routing Number Entered": { "position": { - "x": 4028.8, - "y": 700.8 + "x": 4280.8, + "y": 619.2 }, "isFriendlyName": true, "parameters": { "LambdaFunctionARN": { "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Card Number Timeout Check": { + "position": { + "x": 1680, + "y": -376.8 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "40d1f480-9958-488b-ba8b-a45b97a76d72", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Timeout" + } + ] + }, + "Get & Encrypt Card Number": { + "position": { + "x": 1558.4, + "y": -177.6 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Expiration Date Timeout": { + "position": { + "x": 3224, + "y": -556.8 + }, + "isFriendlyName": true + }, + "Expiration Date Timeout Check": { + "position": { + "x": 3356.8, + "y": -353.6 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "f7f9cfee-3077-4eda-82a8-208c97149684", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Timeout" + } + ] + }, + "Get Expiration Date": { + "position": { + "x": 3256.8, + "y": -154.4 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Store Encrypted Card Number": { + "position": { + "x": 2243.2, + "y": -180 + }, + "isFriendlyName": true, + "parameters": { + "Attributes": { + "EncryptedCardNumber": { + "useDynamic": true + } + } + }, + "dynamicParams": ["EncryptedCardNumber"] + }, + "Validate Card Number": { + "position": { + "x": 1776.8, + "y": -175.2 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" }, "LambdaInvocationAttributes": { - "EventText": { + "CustomerEntry": { "useDynamic": true } } }, "dynamicMetadata": { - "EventText": true + "ValidationType": false, + "CustomerEntry": true } - } - }, - "Annotations": [], - "name": "C3 Agent-Assisted Payment IVR", - "description": "Flow for collecting payments with C3 through a quick connect IVR.", - "type": "queueTransfer", - "status": "published", - "hash": {} - }, - "Actions": [ - { - "Parameters": {}, - "Identifier": "5a505241-be5a-4437-8d66-785eb1b0beca", - "Type": "DisconnectParticipant", - "Transitions": {} - }, - { - "Parameters": { - "Text": "Are you still there?" }, - "Identifier": "Card Number Timeout", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Get & Encrypt Card Number", + "Card Number Validation Error": { + "position": { + "x": 1890.4, + "y": 44 + }, + "isFriendlyName": true + }, + "Check for Card Number Validation Error": { + "position": { + "x": 1993.6, + "y": -173.6 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "33c8ecae-eebe-4ee8-bda9-eac9fc07c9ee", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Report Expiration Date Error": { + "position": { + "x": 4149.6, + "y": 39.2 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Report Expiration Entered": { + "position": { + "x": 4274.4, + "y": -180 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Validate Expiration Date": { + "position": { + "x": 3512.8, + "y": -155.2 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { + "useDynamic": true + } + } + }, + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } + }, + "Expiration Date Validation Error": { + "position": { + "x": 3649.6, + "y": 50.4 + }, + "isFriendlyName": true + }, + "Store Expiration Date": { + "position": { + "x": 4054.4, + "y": -175.2 + }, + "isFriendlyName": true, + "parameters": { + "Attributes": { + "ExpirationDate": { + "useDynamic": true + } + } + }, + "dynamicParams": ["ExpirationDate"] + }, + "Check for Expiration Date Validation Error": { + "position": { + "x": 3752.8, + "y": -156 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "587f01c4-2308-482e-adc2-09e3638c49f8", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Routing Number Timeout": { + "position": { + "x": 3142.4, + "y": 457.6 + }, + "isFriendlyName": true + }, + "Store Routing Number": { + "position": { + "x": 4047.2, + "y": 632 + }, + "isFriendlyName": true, + "parameters": { + "Attributes": { + "RoutingNumber": { + "useDynamic": true + } + } + }, + "dynamicParams": ["RoutingNumber"] + }, + "Store Encrypted Account Number": { + "position": { + "x": 2291.2, + "y": 635.2 + }, + "isFriendlyName": true, + "parameters": { + "Attributes": { + "EncryptedAccountNumber": { + "useDynamic": true + } + } + }, + "dynamicParams": ["EncryptedAccountNumber"] + }, + "Internal Error": { + "position": { + "x": 1320, + "y": 1038.4 + }, + "isFriendlyName": true + }, + "Report Account Number Encryption Error": { + "position": { + "x": 2399.2, + "y": 908.8 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Get & Encrypt Account Number": { + "position": { + "x": 1635.2, + "y": 629.6 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Check for Account Number Validation Error": { + "position": { + "x": 2075.2, + "y": 626.4 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "128340e0-8818-4ae3-9308-80a7e9833cb0", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Account Number Validation Error": { + "position": { + "x": 1960.8, + "y": 840 + }, + "isFriendlyName": true + }, + "Get Routing Number": { + "position": { + "x": 3232, + "y": 680.8 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Routing Number Validation Error": { + "position": { + "x": 3604, + "y": 886.4 + }, + "isFriendlyName": true + }, + "Routing Number Timeout Check": { + "position": { + "x": 3396, + "y": 447.2 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "4d2234ac-5c22-4a02-94a0-47f45fd8ccac", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Timeout" + } + ] + }, + "Check for Routing Number Validation Error": { + "position": { + "x": 3718.4, + "y": 644.8 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "1e3d11c2-52c3-4b77-879d-686bf94da342", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Validate Routing Number": { + "position": { + "x": 3471.2, + "y": 652.8 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { + "useDynamic": true + } + } + }, + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } + }, + "Report Receipt Email Error": { + "position": { + "x": 7033.6, + "y": 576 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": { + "EventText": false + } + }, + "Check for Customer Email": { + "position": { + "x": 6561.6, + "y": 478.4 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "27fa21ea-eb78-4743-b736-ddfd667b4035", + "operator": { + "name": "Contains", + "value": "Contains", + "shortDisplay": "contains" + }, + "value": "@" + } + ] + }, + "Receipt Success": { + "position": { + "x": 7023.2, + "y": 393.6 + }, + "isFriendlyName": true + }, + "Send Receipt": { + "position": { + "x": 6803.2, + "y": 478.4 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": {} + } + }, + "Annotations": [ + { + "type": "default", + "id": "eefb4abe-f8a7-4af7-84d6-e4caff061263", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Card Number", + "isFolded": true, + "position": { + "x": 2240.1666666666665, + "y": -12.333333333333343 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "fcee4b48-e60c-40f3-91f0-5581c1fa9eeb", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Account Number", + "isFolded": true, + "position": { + "x": 2345.1666666666665, + "y": 995.6666666666666 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "d130cc8d-3970-41bb-84f0-7b9e91a2b85e", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Expiration Date", + "isFolded": true, + "position": { + "x": 4410.166666666666, + "y": 12.666666666666657 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "4ce2e18d-0aa6-4b40-94eb-64ff64b89596", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Routing Number", + "isFolded": true, + "position": { + "x": 4358.166666666667, + "y": 1022.6666666666666 + }, + "size": { + "height": 295, + "width": 300 + } + } + ], + "name": "C3 Agent-Assisted Payment IVR", + "description": "Flow for collecting payments with C3 through a quick connect IVR.", + "type": "queueTransfer", + "status": "PUBLISHED", + "hash": {} + }, + "Actions": [ + { + "Parameters": { + "ComparisonValue": "$.Attributes.PaymentAmount" + }, + "Identifier": "Check for Entered Info", + "Type": "Compare", + "Transitions": { + "NextAction": "Report No Payment Info Error", + "Conditions": [ + { + "NextAction": "Create Payment Request", + "Condition": { + "Operator": "NumberGreaterThan", + "Operands": ["0"] + } + } + ], + "Errors": [ + { + "NextAction": "Report No Payment Info Error", + "ErrorType": "NoMatchingCondition" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "IVRStarted" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report Customer Transferred", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Agent Placed On Hold", + "Errors": [ + { + "NextAction": "Agent Placed On Hold", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "FlowLoggingBehavior": "Disabled" + }, + "Identifier": "773c7dfc-3423-47e4-bf80-be55b0cd1947", + "Type": "UpdateFlowLoggingBehavior", + "Transitions": { + "NextAction": "Check for Entered Info" + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "BankAccountSelected" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report Bank Account Selected", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Get & Encrypt Account Number", + "Errors": [ + { + "NextAction": "Get & Encrypt Account Number", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "There was an error placing the agent on hold. Unable to request payment." + }, + "Identifier": "Agent Hold Error", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "Errors": [ + { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" + }, + "Identifier": "Payment Method Timeout", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Errors": [ + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentMethod": "Bank" + }, + "TargetContact": "Current" + }, + "Identifier": "Set Payment Method to Bank", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Report Bank Account Selected", + "Errors": [ + { + "NextAction": "Report Bank Account Selected", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "There was an error creating the payment request." + }, + "Identifier": "Payment Request Error", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "Errors": [ + { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "NoPaymentInfoError" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report No Payment Info Error", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "No Payment Information", + "Errors": [ + { + "NextAction": "No Payment Information", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": {}, + "Identifier": "33d2c563-289f-4358-9500-fc1552cc9523", + "Type": "DisconnectParticipant", + "Transitions": {} + }, + { + "Parameters": { + "Text": "There's no payment information for this customer. Please fill out the information in the C3 Payment Request app and try again." + }, + "Identifier": "No Payment Information", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "Errors": [ + { + "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Your entry was not recognized. Please try again." + }, + "Identifier": "Input Not Recognized", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Errors": [ + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "CreditCardSelected" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report Credit Card Selected", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Get & Encrypt Card Number", + "Errors": [ + { + "NextAction": "Get & Encrypt Card Number", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentMethod": "Card" + }, + "TargetContact": "Current" + }, + "Identifier": "Set Payment Method to Card", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Report Credit Card Selected", + "Errors": [ + { + "NextAction": "Report Credit Card Selected", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Create Payment Request", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Record Payment Request ID", + "Errors": [ + { + "NextAction": "Report Payment Request Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "PreviousContactParticipantState": "AgentOnHold" + }, + "Identifier": "c584fdb0-1a54-4203-a33d-ae533419b8dc", + "Type": "UpdatePreviousContactParticipantState", + "Transitions": { + "NextAction": "Report Customer Transferred", + "Errors": [ + { + "NextAction": "Agent Hold Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "PaymentRequestError" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report Payment Request Error", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Payment Request Error", + "Errors": [ + { + "NextAction": "Payment Request Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentRequestId": "$.External.PaymentRequestId" + }, + "TargetContact": "Current" + }, + "Identifier": "Record Payment Request ID", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "c584fdb0-1a54-4203-a33d-ae533419b8dc", + "Errors": [ + { + "NextAction": "Report Payment Request Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "To ensure the security of your information, the agent has been temporarily placed on hold." + }, + "Identifier": "Agent Placed On Hold", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Speak Amount", + "Errors": [ + { + "NextAction": "Speak Amount", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "A payment has been requested for the amount of $$.Attributes.PaymentAmount." + }, + "Identifier": "Speak Amount", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Check Last Payment Method", + "Errors": [ + { + "NextAction": "Check Last Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "You previously paid with a credit or debit card ending in $.Attributes.PaymentMethodEndingDigits.\n\nIf you would like to use this card again for this payment, press 1.\nTo use a different payment method, press 2." + }, + "Identifier": "Use Card Again?", + "Type": "GetParticipantInput", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Conditions": [ + { + "NextAction": "Report Credit Card Selected Again", + "Condition": { + "Operator": "Equals", + "Operands": ["1"] + } + }, + { + "NextAction": "Ask for Payment Method", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] + } + } + ], "Errors": [ { - "NextAction": "Get & Encrypt Card Number", + "NextAction": "Use Payment Method Again Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingError" } ] @@ -961,13 +1592,13 @@ "Parameters": { "Text": "Are you still there?" }, - "Identifier": "Account Number Timeout", + "Identifier": "Use Payment Method Again Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Check Last Payment Method", "Errors": [ { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Check Last Payment Method", "ErrorType": "NoMatchingError" } ] @@ -975,65 +1606,83 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "To pay with a credit or debit card, press 1.\nTo pay directly with your bank account, press 2." }, - "Identifier": "Account Number Timeout Check", - "Type": "Compare", + "Identifier": "Ask for Payment Method", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Store Encrypted Account Number", + "NextAction": "Input Not Recognized", "Conditions": [ { - "NextAction": "Account Number Timeout", + "NextAction": "Set Payment Method to Card", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] + "Operands": ["1"] + } + }, + { + "NextAction": "Set Payment Method to Bank", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] } } ], "Errors": [ { - "NextAction": "Store Encrypted Account Number", + "NextAction": "Payment Method Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Input Not Recognized", "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Input Not Recognized", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "You previously paid with a bank account ending in $.Attributes.PaymentMethodEndingDigits.\n\nIf you would like to use this account again for this payment, press 1.\nTo use a different payment method, press 2." }, - "Identifier": "Card Number Timeout Check", - "Type": "Compare", + "Identifier": "Use Bank Account Again?", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Store Encrypted Card Number", + "NextAction": "Ask for Payment Method", "Conditions": [ { - "NextAction": "Card Number Timeout", + "NextAction": "Report Bank Account Selected Again", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] + "Operands": ["1"] + } + }, + { + "NextAction": "Ask for Payment Method", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] } } ], "Errors": [ { - "NextAction": "Store Encrypted Card Number", + "NextAction": "Use Payment Method Again Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingCondition" - } - ] - } - }, - { - "Parameters": { - "Text": "Are you still there?" - }, - "Identifier": "Routing Number Timeout", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Get Routing Number", - "Errors": [ + }, { - "NextAction": "Get Routing Number", + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingError" } ] @@ -1041,104 +1690,53 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "ComparisonValue": "$.Attributes.PaymentMethod" }, - "Identifier": "Routing Number Timeout Check", + "Identifier": "Check Last Payment Method", "Type": "Compare", "Transitions": { - "NextAction": "Store Routing Number", + "NextAction": "Ask for Payment Method", "Conditions": [ { - "NextAction": "Routing Number Timeout", + "NextAction": "Use Card Again?", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] + "Operands": ["Card"] + } + }, + { + "NextAction": "Use Bank Account Again?", + "Condition": { + "Operator": "Equals", + "Operands": ["Bank"] } } ], "Errors": [ { - "NextAction": "Store Routing Number", + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingCondition" } ] } }, { - "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "AccountNumberEntered" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } - }, - "Identifier": "Report Account Number Entered", - "Type": "InvokeLambdaFunction", - "Transitions": { - "NextAction": "Get Routing Number", - "Errors": [ - { - "NextAction": "Get Routing Number", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "Attributes": { - "EncryptedCardNumber": "$.StoredCustomerInput" - }, - "TargetContact": "Current" - }, - "Identifier": "Store Encrypted Card Number", - "Type": "UpdateContactAttributes", - "Transitions": { - "NextAction": "Report Card Number Entered", - "Errors": [ - { - "NextAction": "Report Card Number Encryption Error", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "Attributes": { - "EncryptedAccountNumber": "$.StoredCustomerInput" - }, - "TargetContact": "Current" - }, - "Identifier": "Store Encrypted Account Number", - "Type": "UpdateContactAttributes", - "Transitions": { - "NextAction": "Report Account Number Entered", - "Errors": [ - { - "NextAction": "Report Account Number Encryption Error", - "ErrorType": "NoMatchingError" - } - ] - } + "Parameters": {}, + "Identifier": "5a505241-be5a-4437-8d66-785eb1b0beca", + "Type": "DisconnectParticipant", + "Transitions": {} }, { "Parameters": { - "Attributes": { - "ExpirationDate": "$.StoredCustomerInput" - }, - "TargetContact": "Current" + "PreviousContactParticipantState": "OffHold" }, - "Identifier": "Store Expiration Date", - "Type": "UpdateContactAttributes", + "Identifier": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", + "Type": "UpdatePreviousContactParticipantState", "Transitions": { - "NextAction": "Report Expiration Entered", + "NextAction": "5a505241-be5a-4437-8d66-785eb1b0beca", "Errors": [ { - "NextAction": "Report Expiration Date Error", + "NextAction": "5a505241-be5a-4437-8d66-785eb1b0beca", "ErrorType": "NoMatchingError" } ] @@ -1146,18 +1744,15 @@ }, { "Parameters": { - "Attributes": { - "RoutingNumber": "$.StoredCustomerInput" - }, - "TargetContact": "Current" + "Text": "There was an error sending the receipt to your email address, $.Attributes.['Email']. Please contact customer support to receive a receipt for this transaction." }, - "Identifier": "Store Routing Number", - "Type": "UpdateContactAttributes", + "Identifier": "Receipt Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Report Routing Number Entered", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "Report Routing Number Error", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] @@ -1165,15 +1760,15 @@ }, { "Parameters": { - "Text": "Your payment was processed successfully." + "Text": "Returning you to the agent..." }, - "Identifier": "Payment Success", + "Identifier": "Returning To Agent", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check for Customer Email", + "NextAction": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", "Errors": [ { - "NextAction": "Check for Customer Email", + "NextAction": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", "ErrorType": "NoMatchingError" } ] @@ -1182,113 +1777,55 @@ { "Parameters": { "Attributes": { - "TransactionId": "$.External.TransactionId" + "EncryptedCardNumber": "REDACTED", + "ExpirationDate": "REDACTED", + "EncryptedAccountNumber": "REDACTED" }, "TargetContact": "Current" - }, - "Identifier": "Record Transaction ID", - "Type": "UpdateContactAttributes", - "Transitions": { - "NextAction": "Report Payment Processed", - "Errors": [ - { - "NextAction": "Report Payment Processed", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "PaymentProcessed" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } - }, - "Identifier": "Report Payment Processed", - "Type": "InvokeLambdaFunction", - "Transitions": { - "NextAction": "Payment Success", - "Errors": [ - { - "NextAction": "Payment Success", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "ComparisonValue": "$.Attributes.Email" - }, - "Identifier": "Check for Customer Email", - "Type": "Compare", - "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", - "Conditions": [ - { - "NextAction": "Email Receipt", - "Condition": { - "Operator": "TextContains", - "Operands": ["@"] - } - } - ], + }, + "Identifier": "Redact Sensitive Contact Attributes", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Returning To Agent", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", - "ErrorType": "NoMatchingCondition" + "NextAction": "Returning To Agent", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "ComparisonValue": "$.Attributes.PaymentAmount" + "Text": "There was a problem validating your $.Attributes.PaymentMethod information." }, - "Identifier": "Check for Entered Info", - "Type": "Compare", + "Identifier": "Payment Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Report No Payment Info Error", - "Conditions": [ - { - "NextAction": "Create Payment Request", - "Condition": { - "Operator": "NumberGreaterThan", - "Operands": ["0"] - } - } - ], + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Report No Payment Info Error", - "ErrorType": "NoMatchingCondition" + "NextAction": "Remove Failed Payment Token and Method", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "IVRStarted" + "Attributes": { + "PaymentToken": "NULL", + "PaymentMethod": "NULL" }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "TargetContact": "Current" }, - "Identifier": "Report Customer Transferred", - "Type": "InvokeLambdaFunction", + "Identifier": "Remove Failed Payment Token and Method", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Agent Placed On Hold", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "Agent Placed On Hold", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] @@ -1296,12 +1833,18 @@ }, { "Parameters": { - "FlowLoggingBehavior": "Disabled" + "Text": "The payment failed because of the following error:\n\n$.External.Error" }, - "Identifier": "773c7dfc-3423-47e4-bf80-be55b0cd1947", - "Type": "UpdateFlowLoggingBehavior", + "Identifier": "Speak Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check for Entered Info" + "NextAction": "Report Validation Error", + "Errors": [ + { + "NextAction": "Report Validation Error", + "ErrorType": "NoMatchingError" + } + ] } }, { @@ -1309,19 +1852,19 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "BankAccountSelected" + "EventText": "$.External.Error" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Bank Account Selected", + "Identifier": "Report Validation Error", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Remove Failed Payment Token and Method", "ErrorType": "NoMatchingError" } ] @@ -1329,22 +1872,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "BankAccountSelected" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "We're sorry, an error has occured preventing us from submitting your payment. You have not been charged." }, - "Identifier": "Report Bank Account Selected Again", - "Type": "InvokeLambdaFunction", + "Identifier": "Payment Submission Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Submit Payment", + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Submit Payment", + "NextAction": "Remove Failed Payment Token and Method", "ErrorType": "NoMatchingError" } ] @@ -1352,15 +1888,18 @@ }, { "Parameters": { - "Text": "There was an error placing the agent on hold. Unable to request payment." + "Attributes": { + "PaymentToken": "$.External.PaymentToken" + }, + "TargetContact": "Current" }, - "Identifier": "Agent Hold Error", - "Type": "MessageParticipant", + "Identifier": "Record Token", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Report Payment Tokenized", "Errors": [ { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Report Payment Tokenized", "ErrorType": "NoMatchingError" } ] @@ -1368,15 +1907,15 @@ }, { "Parameters": { - "Text": "A receipt has been sent to your email address, $.Attributes.['Email']." + "Text": "Your payment was processed successfully." }, - "Identifier": "Receipt Success", + "Identifier": "Payment Success", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Check for Customer Email", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Check for Customer Email", "ErrorType": "NoMatchingError" } ] @@ -1384,19 +1923,22 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", + "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "CreditCardSelected" + }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Email Receipt", + "Identifier": "Report Credit Card Selected Again", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Receipt Success", + "NextAction": "Submit Payment", "Errors": [ { - "NextAction": "Report Receipt Email Error", + "NextAction": "Submit Payment", "ErrorType": "NoMatchingError" } ] @@ -1407,19 +1949,19 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "ReceiptEmailError" + "EventText": "BankAccountSelected" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Receipt Email Error", + "Identifier": "Report Bank Account Selected Again", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Receipt Error", + "NextAction": "Submit Payment", "Errors": [ { - "NextAction": "Receipt Error", + "NextAction": "Submit Payment", "ErrorType": "NoMatchingError" } ] @@ -1427,15 +1969,22 @@ }, { "Parameters": { - "Text": "There was an error sending the receipt to your email address, $.Attributes.['Email']. Please contact customer support to receive a receipt for this transaction." + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "PaymentSubmissionError" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Receipt Error", - "Type": "MessageParticipant", + "Identifier": "Report Payment Submission Error", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Payment Submission Error", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Payment Submission Error", "ErrorType": "NoMatchingError" } ] @@ -1446,13 +1995,13 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "CreditCardSelected" + "EventText": "PaymentTokenized" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Credit Card Selected Again", + "Identifier": "Report Payment Tokenized", "Type": "InvokeLambdaFunction", "Transitions": { "NextAction": "Submit Payment", @@ -1466,34 +2015,22 @@ }, { "Parameters": { - "Text": "Are you still there?" - }, - "Identifier": "Payment Method Timeout", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Ask for Payment Method", - "Errors": [ - { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "Attributes": { - "PaymentMethod": "Bank" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "PaymentProcessed" }, - "TargetContact": "Current" + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Set Payment Method to Bank", - "Type": "UpdateContactAttributes", + "Identifier": "Report Payment Processed", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Report Bank Account Selected", + "NextAction": "Payment Success", "Errors": [ { - "NextAction": "Report Bank Account Selected", + "NextAction": "Payment Success", "ErrorType": "NoMatchingError" } ] @@ -1501,15 +2038,19 @@ }, { "Parameters": { - "PreviousContactParticipantState": "OffHold" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", - "Type": "UpdatePreviousContactParticipantState", + "Identifier": "Submit Payment", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "5a505241-be5a-4437-8d66-785eb1b0beca", + "NextAction": "Record Transaction Attributes", "Errors": [ { - "NextAction": "5a505241-be5a-4437-8d66-785eb1b0beca", + "NextAction": "Report Payment Submission Error", "ErrorType": "NoMatchingError" } ] @@ -1517,15 +2058,19 @@ }, { "Parameters": { - "Text": "There was an error creating the payment request." + "Attributes": { + "TransactionId": "$.External.TransactionId", + "PaymentMethodEndingDigits": "$.External.PaymentMethodEndingDigits" + }, + "TargetContact": "Current" }, - "Identifier": "Payment Request Error", - "Type": "MessageParticipant", + "Identifier": "Record Transaction Attributes", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Report Payment Processed", "Errors": [ { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Report Payment Processed", "ErrorType": "NoMatchingError" } ] @@ -1536,41 +2081,35 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "NoPaymentInfoError" + "EventText": "CardNumberEncryptionError" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report No Payment Info Error", + "Identifier": "Report Card Number Encryption Error", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "No Payment Information", + "NextAction": "Internal Error", "Errors": [ { - "NextAction": "No Payment Information", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] } }, - { - "Parameters": {}, - "Identifier": "33d2c563-289f-4358-9500-fc1552cc9523", - "Type": "DisconnectParticipant", - "Transitions": {} - }, { "Parameters": { - "Text": "There's no payment information for this customer. Please fill out the information in the C3 Payment Request app and try again." + "Text": "Are you still there?" }, - "Identifier": "No Payment Information", + "Identifier": "Card Number Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Get & Encrypt Card Number", "Errors": [ { - "NextAction": "33d2c563-289f-4358-9500-fc1552cc9523", + "NextAction": "Get & Encrypt Card Number", "ErrorType": "NoMatchingError" } ] @@ -1578,22 +2117,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "CardNumberEncryptionError" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "Are you still there?" }, - "Identifier": "Report Card Number Encryption Error", - "Type": "InvokeLambdaFunction", + "Identifier": "Account Number Timeout", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Internal Error", + "NextAction": "Get & Encrypt Account Number", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Get & Encrypt Account Number", "ErrorType": "NoMatchingError" } ] @@ -1601,45 +2133,48 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "AccountNumberEncryptionError" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } - }, - "Identifier": "Report Account Number Encryption Error", - "Type": "InvokeLambdaFunction", + "ComparisonValue": "$.StoredCustomerInput" + }, + "Identifier": "Account Number Timeout Check", + "Type": "Compare", "Transitions": { - "NextAction": "Internal Error", + "NextAction": "Validate Account Number", + "Conditions": [ + { + "NextAction": "Account Number Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + } + ], "Errors": [ { - "NextAction": "Internal Error", - "ErrorType": "NoMatchingError" + "NextAction": "Validate Account Number", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "ExpirationDateError" + "ValidationType": "AccountNumber", + "CustomerEntry": "$.StoredCustomerInput" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Expiration Date Error", + "Identifier": "Validate Account Number", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Internal Error", + "NextAction": "Check for Account Number Validation Error", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Check for Account Number Validation Error", "ErrorType": "NoMatchingError" } ] @@ -1650,19 +2185,19 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "RoutingNumberError" + "EventText": "TokenizationError" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Routing Number Error", + "Identifier": "Report Tokenization Error", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Internal Error", + "NextAction": "Payment Validation Error", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Payment Validation Error", "ErrorType": "NoMatchingError" } ] @@ -1670,61 +2205,47 @@ }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your card number followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" - }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "20" - } - }, - "InputEncryption": { - "EncryptionKeyId": "<>", - "Key": "<>" - } + "ComparisonValue": "$.External.Error" }, - "Identifier": "Get & Encrypt Card Number", - "Type": "GetParticipantInput", + "Identifier": "Check for Tokenize Error", + "Type": "Compare", "Transitions": { - "NextAction": "Card Number Timeout Check", + "NextAction": "Speak Validation Error", + "Conditions": [ + { + "NextAction": "Record Token", + "Condition": { + "Operator": "Equals", + "Operands": ["NULL"] + } + } + ], "Errors": [ { - "NextAction": "Internal Error", - "ErrorType": "NoMatchingError" + "NextAction": "Speak Validation Error", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your bank account number followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" - }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "20" - } + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "CardNumberEntered" }, - "InputEncryption": { - "EncryptionKeyId": "<>", - "Key": "<>" + "ResponseValidation": { + "ResponseType": "JSON" } }, - "Identifier": "Get & Encrypt Account Number", - "Type": "GetParticipantInput", + "Identifier": "Report Card Number Entered", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Account Number Timeout Check", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -1732,15 +2253,15 @@ }, { "Parameters": { - "Text": "Returning you to the agent..." + "Text": "There was a problem with your expiration date. Please check your entry and try again." }, - "Identifier": "Returning To Agent", + "Identifier": "Try Expiration Date Again", "Type": "MessageParticipant", "Transitions": { - "NextAction": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "90dc6a63-2ae9-4c5f-b65f-75348779d0c6", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -1748,15 +2269,22 @@ }, { "Parameters": { - "Text": "We're sorry, an error has occurred that prevents us from collecting the payment." + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "AccountNumberEntered" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Internal Error", - "Type": "MessageParticipant", + "Identifier": "Report Account Number Entered", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Returning To Agent", + "NextAction": "Get Routing Number", "Errors": [ { - "NextAction": "Returning To Agent", + "NextAction": "Get Routing Number", "ErrorType": "NoMatchingError" } ] @@ -1764,15 +2292,15 @@ }, { "Parameters": { - "Text": "Are you still there?" + "Text": "There was a problem with your routing number. Please check your entry and try again." }, - "Identifier": "Expiration Date Timeout", + "Identifier": "Try Routing Number Again", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Get Expiration Date", + "NextAction": "Get Routing Number", "Errors": [ { - "NextAction": "Get Expiration Date", + "NextAction": "Get Routing Number", "ErrorType": "NoMatchingError" } ] @@ -1780,25 +2308,20 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Expiration Date Timeout Check", - "Type": "Compare", + "Identifier": "Tokenize Transaction", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Store Expiration Date", - "Conditions": [ - { - "NextAction": "Expiration Date Timeout", - "Condition": { - "Operator": "Equals", - "Operands": ["Timeout"] - } - } - ], + "NextAction": "Check for Tokenize Error", "Errors": [ { - "NextAction": "Store Expiration Date", - "ErrorType": "NoMatchingCondition" + "NextAction": "Report Tokenization Error", + "ErrorType": "NoMatchingError" } ] } @@ -1808,19 +2331,19 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "CardNumberEntered" + "EventText": "RoutingNumberError" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Card Number Entered", + "Identifier": "Report Routing Number Error", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Get Expiration Date", + "NextAction": "Internal Error", "Errors": [ { - "NextAction": "Get Expiration Date", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -1828,26 +2351,22 @@ }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your bank's routing number, followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "RoutingNumberEntered" }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "9" - } + "ResponseValidation": { + "ResponseType": "JSON" } }, - "Identifier": "Get Routing Number", - "Type": "GetParticipantInput", + "Identifier": "Report Routing Number Entered", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Routing Number Timeout Check", + "NextAction": "Tokenize Transaction", "Errors": [ { - "NextAction": "Try Routing Number Again", + "NextAction": "Tokenize Transaction", "ErrorType": "NoMatchingError" } ] @@ -1855,32 +2374,25 @@ }, { "Parameters": { - "Text": "There was a problem with your routing number. Please check your entry and try again." + "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Try Routing Number Again", - "Type": "MessageParticipant", + "Identifier": "Card Number Timeout Check", + "Type": "Compare", "Transitions": { - "NextAction": "Get Routing Number", - "Errors": [ + "NextAction": "Validate Card Number", + "Conditions": [ { - "NextAction": "Get Routing Number", - "ErrorType": "NoMatchingError" + "NextAction": "Card Number Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } } - ] - } - }, - { - "Parameters": { - "Text": "Your entry was not recognized. Please try again." - }, - "Identifier": "Input Not Recognized", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Ask for Payment Method", + ], "Errors": [ { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingError" + "NextAction": "Validate Card Number", + "ErrorType": "NoMatchingCondition" } ] } @@ -1888,41 +2400,29 @@ { "Parameters": { "StoreInput": "True", - "InputTimeLimitSeconds": "5", - "Text": "Please enter your card's expiration date in the format month-month-year-year, followed by the pound key when complete.", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your card number followed by the pound key when complete.", "DTMFConfiguration": { "DisableCancelKey": "False", "InputTerminationSequence": "#" }, "InputValidation": { "CustomValidation": { - "MaximumLength": "4" + "MaximumLength": "20" } + }, + "InputEncryption": { + "EncryptionKeyId": "<>", + "Key": "<>" } }, - "Identifier": "Get Expiration Date", + "Identifier": "Get & Encrypt Card Number", "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Expiration Date Timeout Check", - "Errors": [ - { - "NextAction": "Try Expiration Date Again", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "Text": "There was a problem with your expiration date. Please check your entry and try again." - }, - "Identifier": "Try Expiration Date Again", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Get Expiration Date", + "NextAction": "Card Number Timeout Check", "Errors": [ { - "NextAction": "Get Expiration Date", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -1930,22 +2430,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "CreditCardSelected" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "Are you still there?" }, - "Identifier": "Report Credit Card Selected", - "Type": "InvokeLambdaFunction", + "Identifier": "Expiration Date Timeout", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Get & Encrypt Card Number", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Get & Encrypt Card Number", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -1953,38 +2446,51 @@ }, { "Parameters": { - "Attributes": { - "PaymentMethod": "Card" - }, - "TargetContact": "Current" + "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Set Payment Method to Card", - "Type": "UpdateContactAttributes", + "Identifier": "Expiration Date Timeout Check", + "Type": "Compare", "Transitions": { - "NextAction": "Report Credit Card Selected", + "NextAction": "Validate Expiration Date", + "Conditions": [ + { + "NextAction": "Expiration Date Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + } + ], "Errors": [ { - "NextAction": "Report Credit Card Selected", - "ErrorType": "NoMatchingError" + "NextAction": "Validate Expiration Date", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" + "StoreInput": "True", + "InputTimeLimitSeconds": "5", + "Text": "Please enter your card's expiration date in the format month-month-year-year, followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "4" + } } }, - "Identifier": "Create Payment Request", - "Type": "InvokeLambdaFunction", + "Identifier": "Get Expiration Date", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Record Payment Request ID", + "NextAction": "Expiration Date Timeout Check", "Errors": [ { - "NextAction": "Report Payment Request Error", + "NextAction": "Try Expiration Date Again", "ErrorType": "NoMatchingError" } ] @@ -1992,15 +2498,18 @@ }, { "Parameters": { - "PreviousContactParticipantState": "AgentOnHold" + "Attributes": { + "EncryptedCardNumber": "$.StoredCustomerInput" + }, + "TargetContact": "Current" }, - "Identifier": "c584fdb0-1a54-4203-a33d-ae533419b8dc", - "Type": "UpdatePreviousContactParticipantState", + "Identifier": "Store Encrypted Card Number", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Report Customer Transferred", + "NextAction": "Report Card Number Entered", "Errors": [ { - "NextAction": "Agent Hold Error", + "NextAction": "Report Card Number Encryption Error", "ErrorType": "NoMatchingError" } ] @@ -2008,22 +2517,23 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "PaymentRequestError" + "ValidationType": "CardNumber", + "CustomerEntry": "$.StoredCustomerInput" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Payment Request Error", + "Identifier": "Validate Card Number", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Payment Request Error", + "NextAction": "Check for Card Number Validation Error", "Errors": [ { - "NextAction": "Payment Request Error", + "NextAction": "Check for Card Number Validation Error", "ErrorType": "NoMatchingError" } ] @@ -2031,18 +2541,15 @@ }, { "Parameters": { - "Attributes": { - "PaymentRequestId": "$.External.PaymentRequestId" - }, - "TargetContact": "Current" + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Record Payment Request ID", - "Type": "UpdateContactAttributes", + "Identifier": "Card Number Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "c584fdb0-1a54-4203-a33d-ae533419b8dc", + "NextAction": "Get & Encrypt Card Number", "Errors": [ { - "NextAction": "Report Payment Request Error", + "NextAction": "Get & Encrypt Card Number", "ErrorType": "NoMatchingError" } ] @@ -2050,83 +2557,70 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "You previously paid with a credit or debit card.\n\nIf you would like to use this card again for this payment, press 1.\nTo use a different payment method, press 2." + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Use Card Again?", - "Type": "GetParticipantInput", + "Identifier": "Check for Card Number Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Ask for Payment Method", + "NextAction": "Card Number Validation Error", "Conditions": [ { - "NextAction": "Report Credit Card Selected Again", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Store Encrypted Card Number", "Condition": { "Operator": "Equals", - "Operands": ["2"] + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Use Payment Method Again Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Card Number Validation Error", "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "You previously paid with a bank account.\n\nIf you would like to use this account again for this payment, press 1.\nTo use a different payment method, press 2." + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "ExpirationDateError" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Use Bank Account Again?", - "Type": "GetParticipantInput", + "Identifier": "Report Expiration Date Error", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Ask for Payment Method", - "Conditions": [ - { - "NextAction": "Report Bank Account Selected Again", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, + "NextAction": "Internal Error", + "Errors": [ { - "NextAction": "Ask for Payment Method", - "Condition": { - "Operator": "Equals", - "Operands": ["2"] - } + "NextAction": "Internal Error", + "ErrorType": "NoMatchingError" } - ], + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "ExpirationDateEntered" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Report Expiration Entered", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Tokenize Transaction", "Errors": [ { - "NextAction": "Use Payment Method Again Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Tokenize Transaction", "ErrorType": "NoMatchingError" } ] @@ -2134,15 +2628,23 @@ }, { "Parameters": { - "Text": "Are you still there?" + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "ExpirationDate", + "CustomerEntry": "$.StoredCustomerInput" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Use Payment Method Again Timeout", - "Type": "MessageParticipant", + "Identifier": "Validate Expiration Date", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Check Last Payment Method", + "NextAction": "Check for Expiration Date Validation Error", "Errors": [ { - "NextAction": "Check Last Payment Method", + "NextAction": "Check for Expiration Date Validation Error", "ErrorType": "NoMatchingError" } ] @@ -2150,15 +2652,15 @@ }, { "Parameters": { - "Text": "To ensure the security of your information, the agent has been temporarily placed on hold." + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Agent Placed On Hold", + "Identifier": "Expiration Date Validation Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Speak Amount", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Speak Amount", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -2166,15 +2668,18 @@ }, { "Parameters": { - "Text": "A payment has been requested for the amount of $$.Attributes.PaymentAmount." + "Attributes": { + "ExpirationDate": "$.StoredCustomerInput" + }, + "TargetContact": "Current" }, - "Identifier": "Speak Amount", - "Type": "MessageParticipant", + "Identifier": "Store Expiration Date", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Check Last Payment Method", + "NextAction": "Report Expiration Entered", "Errors": [ { - "NextAction": "Check Last Payment Method", + "NextAction": "Report Expiration Date Error", "ErrorType": "NoMatchingError" } ] @@ -2182,74 +2687,60 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "To pay with a credit or debit card, press 1.\nTo pay directly with your bank account, press 2." + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Ask for Payment Method", - "Type": "GetParticipantInput", + "Identifier": "Check for Expiration Date Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Input Not Recognized", + "NextAction": "Expiration Date Validation Error", "Conditions": [ { - "NextAction": "Set Payment Method to Card", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, - { - "NextAction": "Set Payment Method to Bank", + "NextAction": "Store Expiration Date", "Condition": { "Operator": "Equals", - "Operands": ["2"] + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Payment Method Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Input Not Recognized", + "NextAction": "Expiration Date Validation Error", "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Input Not Recognized", - "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "ComparisonValue": "$.Attributes.PaymentMethod" + "Text": "Are you still there?" }, - "Identifier": "Check Last Payment Method", - "Type": "Compare", + "Identifier": "Routing Number Timeout", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Ask for Payment Method", - "Conditions": [ - { - "NextAction": "Use Card Again?", - "Condition": { - "Operator": "Equals", - "Operands": ["Card"] - } - }, + "NextAction": "Get Routing Number", + "Errors": [ { - "NextAction": "Use Bank Account Again?", - "Condition": { - "Operator": "Equals", - "Operands": ["Bank"] - } + "NextAction": "Get Routing Number", + "ErrorType": "NoMatchingError" } - ], + ] + } + }, + { + "Parameters": { + "Attributes": { + "RoutingNumber": "$.StoredCustomerInput" + }, + "TargetContact": "Current" + }, + "Identifier": "Store Routing Number", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Report Routing Number Entered", "Errors": [ { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingCondition" + "NextAction": "Report Routing Number Error", + "ErrorType": "NoMatchingError" } ] } @@ -2257,19 +2748,17 @@ { "Parameters": { "Attributes": { - "EncryptedCardNumber": "REDACTED", - "ExpirationDate": "REDACTED", - "EncryptedAccountNumber": "REDACTED" + "EncryptedAccountNumber": "$.StoredCustomerInput" }, "TargetContact": "Current" }, - "Identifier": "Redact Sensitive Contact Attributes", + "Identifier": "Store Encrypted Account Number", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Returning To Agent", + "NextAction": "Report Account Number Entered", "Errors": [ { - "NextAction": "Returning To Agent", + "NextAction": "Report Account Number Encryption Error", "ErrorType": "NoMatchingError" } ] @@ -2277,19 +2766,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "We're sorry, an error has occurred that prevents us from collecting the payment." }, - "Identifier": "Submit Payment", - "Type": "InvokeLambdaFunction", + "Identifier": "Internal Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Record Transaction ID", + "NextAction": "Returning To Agent", "Errors": [ { - "NextAction": "Report Payment Submission Error", + "NextAction": "Returning To Agent", "ErrorType": "NoMatchingError" } ] @@ -2300,19 +2785,19 @@ "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", "LambdaInvocationAttributes": { - "EventText": "PaymentSubmissionError" + "EventText": "AccountNumberEncryptionError" }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Payment Submission Error", + "Identifier": "Report Account Number Encryption Error", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Payment Submission Error", + "NextAction": "Internal Error", "Errors": [ { - "NextAction": "Payment Submission Error", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -2320,15 +2805,30 @@ }, { "Parameters": { - "Text": "We're sorry, an error has occured preventing us from submitting your payment. You have not been charged." + "StoreInput": "True", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your bank account number followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "20" + } + }, + "InputEncryption": { + "EncryptionKeyId": "<>", + "Key": "<>" + } }, - "Identifier": "Payment Submission Error", - "Type": "MessageParticipant", + "Identifier": "Get & Encrypt Account Number", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Account Number Timeout Check", "Errors": [ { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -2336,38 +2836,40 @@ }, { "Parameters": { - "Text": "There was a problem validating your $.Attributes.PaymentMethod information." + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Payment Validation Error", - "Type": "MessageParticipant", + "Identifier": "Check for Account Number Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Account Number Validation Error", + "Conditions": [ + { + "NextAction": "Store Encrypted Account Number", + "Condition": { + "Operator": "Equals", + "Operands": ["NULL"] + } + } + ], "Errors": [ { - "NextAction": "Remove Failed Payment Token and Method", - "ErrorType": "NoMatchingError" + "NextAction": "Account Number Validation Error", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "PaymentTokenized" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Report Payment Tokenized", - "Type": "InvokeLambdaFunction", + "Identifier": "Account Number Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Submit Payment", + "NextAction": "Get & Encrypt Account Number", "Errors": [ { - "NextAction": "Submit Payment", + "NextAction": "Get & Encrypt Account Number", "ErrorType": "NoMatchingError" } ] @@ -2375,22 +2877,26 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "ExpirationDateEntered" + "StoreInput": "True", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your bank's routing number, followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" }, - "ResponseValidation": { - "ResponseType": "JSON" + "InputValidation": { + "CustomValidation": { + "MaximumLength": "9" + } } }, - "Identifier": "Report Expiration Entered", - "Type": "InvokeLambdaFunction", + "Identifier": "Get Routing Number", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Tokenize Transaction", + "NextAction": "Routing Number Timeout Check", "Errors": [ { - "NextAction": "Tokenize Transaction", + "NextAction": "Try Routing Number Again", "ErrorType": "NoMatchingError" } ] @@ -2398,22 +2904,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "RoutingNumberEntered" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Report Routing Number Entered", - "Type": "InvokeLambdaFunction", + "Identifier": "Routing Number Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Tokenize Transaction", + "NextAction": "Get Routing Number", "Errors": [ { - "NextAction": "Tokenize Transaction", + "NextAction": "Get Routing Number", "ErrorType": "NoMatchingError" } ] @@ -2421,61 +2920,73 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "TokenizationError" - }, - "ResponseValidation": { - "ResponseType": "JSON" - } + "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Report Tokenization Error", - "Type": "InvokeLambdaFunction", + "Identifier": "Routing Number Timeout Check", + "Type": "Compare", "Transitions": { - "NextAction": "Payment Validation Error", + "NextAction": "Validate Routing Number", + "Conditions": [ + { + "NextAction": "Routing Number Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + } + ], "Errors": [ { - "NextAction": "Payment Validation Error", - "ErrorType": "NoMatchingError" + "NextAction": "Validate Routing Number", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "Attributes": { - "PaymentToken": "$.External.PaymentToken" - }, - "TargetContact": "Current" + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Record Token", - "Type": "UpdateContactAttributes", + "Identifier": "Check for Routing Number Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Report Payment Tokenized", + "NextAction": "Routing Number Validation Error", + "Conditions": [ + { + "NextAction": "Store Routing Number", + "Condition": { + "Operator": "Equals", + "Operands": ["NULL"] + } + } + ], "Errors": [ { - "NextAction": "Report Payment Tokenized", - "ErrorType": "NoMatchingError" + "NextAction": "Routing Number Validation Error", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "RoutingNumber", + "CustomerEntry": "$.StoredCustomerInput" + }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Tokenize Transaction", + "Identifier": "Validate Routing Number", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Check for Tokenize Error", + "NextAction": "Check for Routing Number Validation Error", "Errors": [ { - "NextAction": "Report Tokenization Error", + "NextAction": "Check for Routing Number Validation Error", "ErrorType": "NoMatchingError" } ] @@ -2483,60 +2994,63 @@ }, { "Parameters": { - "ComparisonValue": "$.External.Error" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "EventText": "ReceiptEmailError" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Check for Tokenize Error", - "Type": "Compare", + "Identifier": "Report Receipt Email Error", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Speak Validation Error", - "Conditions": [ - { - "NextAction": "Record Token", - "Condition": { - "Operator": "Equals", - "Operands": ["NULL"] - } - } - ], + "NextAction": "Receipt Error", "Errors": [ { - "NextAction": "Speak Validation Error", - "ErrorType": "NoMatchingCondition" + "NextAction": "Receipt Error", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "Attributes": { - "PaymentToken": "NULL", - "PaymentMethod": "NULL" - }, - "TargetContact": "Current" + "ComparisonValue": "$.Attributes.Email" }, - "Identifier": "Remove Failed Payment Token and Method", - "Type": "UpdateContactAttributes", + "Identifier": "Check for Customer Email", + "Type": "Compare", "Transitions": { "NextAction": "Redact Sensitive Contact Attributes", + "Conditions": [ + { + "NextAction": "Send Receipt", + "Condition": { + "Operator": "TextContains", + "Operands": ["@"] + } + } + ], "Errors": [ { "NextAction": "Redact Sensitive Contact Attributes", - "ErrorType": "NoMatchingError" + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "Text": "The payment failed because of the following error:\n\n$.External.Error" + "Text": "A receipt has been sent to your email address, $.Attributes.['Email']." }, - "Identifier": "Speak Validation Error", + "Identifier": "Receipt Success", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Report Validation Error", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "Report Validation Error", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] @@ -2544,22 +3058,19 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", + "LambdaFunctionARN": "<>", "InvocationTimeLimitSeconds": "8", - "LambdaInvocationAttributes": { - "EventText": "$.External.Error" - }, "ResponseValidation": { "ResponseType": "JSON" } }, - "Identifier": "Report Validation Error", + "Identifier": "Send Receipt", "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Receipt Success", "Errors": [ { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Report Receipt Email Error", "ErrorType": "NoMatchingError" } ] diff --git a/lib/connect/flows/modules/c3-payment-ivr-flow-module.json b/lib/connect/flows/modules/c3-payment-ivr-flow-module.json index 4f0e4716..de6c0b15 100644 --- a/lib/connect/flows/modules/c3-payment-ivr-flow-module.json +++ b/lib/connect/flows/modules/c3-payment-ivr-flow-module.json @@ -3,25 +3,10 @@ "StartAction": "87859db2-400d-410b-8818-05c8ae4869aa", "Metadata": { "entryPointPosition": { - "x": -1670.4, - "y": 229.6 + "x": -1896, + "y": 231.2 }, "ActionMetadata": { - "Payment Success": { - "position": { - "x": 6239.2, - "y": -44.8 - }, - "isFriendlyName": true - }, - "Record Transaction ID": { - "position": { - "x": 5782.4, - "y": -149.6 - }, - "isFriendlyName": true, - "dynamicParams": [] - }, "Amount Choice Timeout": { "position": { "x": -682.4, @@ -63,15 +48,6 @@ "y": 534.4 } }, - "Get Payment Amount": { - "position": { - "x": 60.8, - "y": -46.4 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, "Amount Choice Input Not Recognized": { "position": { "x": -416, @@ -79,126 +55,249 @@ }, "isFriendlyName": true }, - "Email Receipt": { + "Payment Method Timeout": { + "position": { + "x": 2208, + "y": -267.2 + }, + "isFriendlyName": true + }, + "Check for Minimum Payment": { "position": { - "x": 6702.4, - "y": -43.2 + "x": -723.2, + "y": 153.6 }, "isFriendlyName": true, - "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" + "conditions": [], + "conditionMetadata": [ + { + "id": "a2975460-a966-464d-96c9-87471c4e6550", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "PaymentAmountDue" + }, + { + "id": "a9c908ff-9dac-4671-9ccd-b86b71b8ba36", + "operator": { + "name": "Is greater than", + "value": "GreaterThan", + "shortDisplay": ">" + }, + "value": "0" } - }, - "dynamicMetadata": {} + ] }, - "Routing Number Timeout": { + "Speak Amount": { "position": { - "x": 3752, - "y": -92 + "x": -960.8, + "y": 145.6 }, "isFriendlyName": true }, - "Routing Number Timeout Check": { + "Record Payment Request ID": { + "position": { + "x": -1256.8, + "y": 152.8 + }, + "isFriendlyName": true, + "dynamicParams": [] + }, + "Prompt for Payment Amount Choice": { + "position": { + "x": -479.2, + "y": -38.4 + }, + "isFriendlyName": true, + "conditionMetadata": [ + { + "id": "6f93a5d7-4110-45c7-b2a2-67f8157b6078", + "value": "1" + }, + { + "id": "34304207-c78e-48e0-9083-60c79177ed0c", + "value": "2" + } + ] + }, + "Check Payment Amount": { "position": { - "x": 3996, - "y": -147.2 + "x": 9.6, + "y": -431.2 }, "isFriendlyName": true, "conditions": [], "conditionMetadata": [ { - "id": "6a0dd1cb-fe30-4f5d-ac76-28dfdcaabeb2", + "id": "89c8a438-ac90-4b66-a8a7-edcdd9cecd97", "operator": { "name": "Equals", "value": "Equals", "shortDisplay": "=" }, "value": "Timeout" + }, + { + "id": "c41b0d41-92d1-4b94-9765-28189982be15", + "operator": { + "name": "Is greater than", + "value": "GreaterThan", + "shortDisplay": ">" + }, + "value": "$.Attributes.PaymentAmountDue" + }, + { + "id": "1796c148-5a97-4a7f-b562-0dc6d04c1f62", + "operator": { + "name": "Is less than", + "value": "LessThan", + "shortDisplay": "<" + }, + "value": "$.Attributes.PaymentMinimumPayment" } ] }, - "Store Encrypted Account Number": { + "Method Input Not Recognized": { + "position": { + "x": 2427.2, + "y": -340 + }, + "isFriendlyName": true + }, + "Get Payment Amount": { + "position": { + "x": 60.8, + "y": -46.4 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Set Payment Amount to Full Amount": { "position": { - "x": 3212.8, - "y": 131.2 + "x": 468, + "y": 447.2 }, "isFriendlyName": true, "parameters": { "Attributes": { - "EncryptedAccountNumber": { + "PaymentAmount": { "useDynamic": true } } }, - "dynamicParams": ["EncryptedAccountNumber"] + "dynamicParams": ["PaymentAmount"] }, - "Try Routing Number Again": { + "Set Payment Amount to Entered Amount": { + "position": { + "x": 452, + "y": -34.4 + }, + "isFriendlyName": true, + "parameters": { + "Attributes": { + "PaymentAmount": { + "useDynamic": true + } + } + }, + "dynamicParams": ["PaymentAmount"] + }, + "Payment Request Error": { "position": { - "x": 3879.2, - "y": 354.4 + "x": -992, + "y": 535.2 }, "isFriendlyName": true }, - "Get Routing Number": { + "Create Payment Request": { "position": { - "x": 3841.6, - "y": 131.2 + "x": -1484, + "y": 224 }, "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": {} }, - "Account Number Timeout": { + "87859db2-400d-410b-8818-05c8ae4869aa": { + "position": { + "x": -1924, + "y": 356 + } + }, + "Set Receipt Queue ID": { "position": { - "x": 2944, - "y": -92.8 + "x": -1711.2, + "y": 214.4 }, "isFriendlyName": true }, - "Account Number Timeout Check": { + "Use Payment Method Again Timeout": { "position": { - "x": 3188.8, - "y": -72.8 + "x": 1083.2, + "y": -928.8 + }, + "isFriendlyName": true + }, + "Check Last Payment Method": { + "position": { + "x": 1000, + "y": -67.2 }, "isFriendlyName": true, "conditions": [], "conditionMetadata": [ { - "id": "c1bcbe2e-103f-4b65-b385-d081eb30b07b", + "id": "c6f86d5b-7f91-40fa-b654-d0b68158e4ef", "operator": { "name": "Equals", "value": "Equals", "shortDisplay": "=" }, - "value": "Timeout" + "value": "Card" + }, + { + "id": "9676cf94-b80c-4c05-a5c6-21f06d13e18e", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Bank" } ] }, - "Card Number Timeout": { + "Set Payment Method to Card": { "position": { - "x": 2892, - "y": -1114.4 + "x": 2685.6, + "y": -802.4 }, - "isFriendlyName": true + "isFriendlyName": true, + "dynamicParams": [] }, - "Expiration Date Timeout": { + "Card Number Timeout": { "position": { - "x": 3833.6, - "y": -1106.4 + "x": 2823.2, + "y": -1230.4 }, "isFriendlyName": true }, - "Expiration Date Timeout Check": { + "Card Number Timeout Check": { "position": { - "x": 3968.8, - "y": -901.6 + "x": 3020, + "y": -1027.2 }, "isFriendlyName": true, "conditions": [], "conditionMetadata": [ { - "id": "1ab0ec91-a01c-422f-b8dd-3b1924b9d7af", + "id": "ad825037-0bc9-4362-afc5-d132a3d222f8", "operator": { "name": "Equals", "value": "Equals", @@ -208,45 +307,63 @@ } ] }, - "Try Expiration Date Again": { + "Validate Card Number": { "position": { - "x": 3928, - "y": -489.6 + "x": 3139.2, + "y": -808 }, - "isFriendlyName": true + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { + "useDynamic": true + } + } + }, + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } }, - "Card Number Timeout Check": { + "Ask for Payment Method": { "position": { - "x": 3020.8, - "y": -892 + "x": 2230.4, + "y": -29.6 }, "isFriendlyName": true, - "conditions": [], "conditionMetadata": [ { - "id": "20511aec-fef6-47b4-bab3-d5a7643c76cd", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Timeout" + "id": "3964128f-4b86-4f93-8534-69549fbb54d6", + "value": "1" + }, + { + "id": "521ac263-40e6-4d43-b71b-9c25b733cd11", + "value": "2" } ] }, - "Get Expiration Date": { + "Account Number Timeout": { "position": { - "x": 3865.6, - "y": -704.8 + "x": 2841.6, + "y": -343.2 + }, + "isFriendlyName": true + }, + "Set Payment Method to Bank": { + "position": { + "x": 2692, + "y": 112 }, "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" + "dynamicParams": [] }, "Store Encrypted Card Number": { "position": { - "x": 3148, - "y": -687.2 + "x": 3570.4, + "y": -817.6 }, "isFriendlyName": true, "parameters": { @@ -258,187 +375,168 @@ }, "dynamicParams": ["EncryptedCardNumber"] }, - "Payment Method Timeout": { + "Try Expiration Date Again": { "position": { - "x": 2208, - "y": -267.2 + "x": 4209.6, + "y": -517.6 }, "isFriendlyName": true }, - "Check for Minimum Payment": { + "Try Routing Number Again": { "position": { - "x": -723.2, - "y": 153.6 + "x": 4160.8, + "y": 326.4 + }, + "isFriendlyName": true + }, + "Account Number Timeout Check": { + "position": { + "x": 3056, + "y": -96 }, "isFriendlyName": true, "conditions": [], "conditionMetadata": [ { - "id": "2a2693bb-f679-4c53-8506-e813c5626a56", + "id": "95219976-9d9e-4432-b35b-9e5bd3e86343", "operator": { "name": "Equals", "value": "Equals", "shortDisplay": "=" }, - "value": "PaymentAmountDue" - }, - { - "id": "0e2a16de-1d13-4cf0-8479-e484ae7eb4e9", - "operator": { - "name": "Is greater than", - "value": "GreaterThan", - "shortDisplay": ">" - }, - "value": "0" + "value": "Timeout" } ] }, - "Method Input Not Recognized": { + "Store Encrypted Account Number": { "position": { - "x": 2427.2, - "y": -340 - }, - "isFriendlyName": true - }, - "Get & Encrypt Card Number": { - "position": { - "x": 2899.2, - "y": -692.8 - }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" - }, - "Set Payment Method to Card": { - "position": { - "x": 2674.4, - "y": -698.4 + "x": 3567.2, + "y": 101.6 }, "isFriendlyName": true, - "dynamicParams": [] - }, - "Get & Encrypt Account Number": { - "position": { - "x": 2976, - "y": 114.4 + "parameters": { + "Attributes": { + "EncryptedAccountNumber": { + "useDynamic": true + } + } }, - "isFriendlyName": true, - "conditionMetadata": [], - "countryCodePrefix": "+1" + "dynamicParams": ["EncryptedAccountNumber"] }, - "Set Payment Method to Bank": { + "Validate Account Number": { "position": { - "x": 2748.8, - "y": 111.2 + "x": 3138.4, + "y": 99.2 }, "isFriendlyName": true, - "dynamicParams": [] - }, - "Speak Amount": { - "position": { - "x": -960.8, - "y": 145.6 + "parameters": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { + "useDynamic": true + } + } }, - "isFriendlyName": true + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } }, - "Payment Request Error": { + "Routing Number Timeout": { "position": { - "x": -992, - "y": 535.2 + "x": 4033.6, + "y": -120 }, "isFriendlyName": true }, - "Record Payment Request ID": { - "position": { - "x": -1256.8, - "y": 152.8 - }, - "isFriendlyName": true, - "dynamicParams": [] - }, - "Prompt for Payment Amount Choice": { + "Routing Number Timeout Check": { "position": { - "x": -479.2, - "y": -38.4 + "x": 4277.6, + "y": -175.2 }, "isFriendlyName": true, + "conditions": [], "conditionMetadata": [ { - "id": "863244c7-a47d-4f61-b26f-324efd0c7bfc", - "value": "1" - }, - { - "id": "5d8ac1b7-60e4-48c6-8740-d8bf0984db89", - "value": "2" + "id": "9914e0ee-21c6-4dca-84e2-93c0a6c97c19", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "Timeout" } ] }, - "Set Payment Amount to Full Amount": { + "Validate Routing Number": { "position": { - "x": 468, - "y": 447.2 + "x": 4356, + "y": 87.2 }, "isFriendlyName": true, "parameters": { - "Attributes": { - "PaymentAmount": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { "useDynamic": true } } }, - "dynamicParams": ["PaymentAmount"] + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } }, - "Check Payment Amount": { + "Expiration Date Timeout": { "position": { - "x": 9.6, - "y": -431.2 + "x": 4113.6, + "y": -1135.2 + }, + "isFriendlyName": true + }, + "Expiration Date Timeout Check": { + "position": { + "x": 4193.6, + "y": -932.8 }, "isFriendlyName": true, "conditions": [], "conditionMetadata": [ { - "id": "11694515-2320-4234-a556-fc095b6d5bf0", + "id": "2e5d24f5-9548-4d61-923a-412861d23716", "operator": { "name": "Equals", "value": "Equals", "shortDisplay": "=" }, "value": "Timeout" - }, - { - "id": "f0f41496-7306-4d29-9372-c79b0987234e", - "operator": { - "name": "Is greater than", - "value": "GreaterThan", - "shortDisplay": ">" - }, - "value": "$.Attributes.PaymentAmountDue" - }, - { - "id": "3384a423-17cf-47c6-b51d-f720522439ec", - "operator": { - "name": "Is less than", - "value": "LessThan", - "shortDisplay": "<" - }, - "value": "$.Attributes.PaymentMinimumPayment" } ] }, - "Set Payment Amount to Entered Amount": { + "Validate Expiration Date": { "position": { - "x": 452, - "y": -34.4 + "x": 4398.4, + "y": -740 }, "isFriendlyName": true, "parameters": { - "Attributes": { - "PaymentAmount": { + "LambdaFunctionARN": { + "displayName": "C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI" + }, + "LambdaInvocationAttributes": { + "CustomerEntry": { "useDynamic": true } } }, - "dynamicParams": ["PaymentAmount"] + "dynamicMetadata": { + "ValidationType": false, + "CustomerEntry": true + } }, "Use Card Again?": { "position": { @@ -448,252 +546,202 @@ "isFriendlyName": true, "conditionMetadata": [ { - "id": "9d2af156-eb08-43cd-a43d-7ae0699f73ad", + "id": "d23c7d16-7092-4c09-a56a-fe53832271a2", "value": "1" }, { - "id": "89fd0350-6ef9-470d-bb0e-a7ede4ef19bd", + "id": "dc85eb69-7590-474c-a1c4-957e9988449f", "value": "2" } ] }, "Use Bank Account Again?": { "position": { - "x": 1412, - "y": -396 + "x": 1410.4, + "y": -397.6 }, "isFriendlyName": true, "conditionMetadata": [ { - "id": "0bae15f9-b680-4798-876e-53e01cb1b31f", + "id": "b91b2580-8ea5-439a-ad65-8ce9e2ecc7da", "value": "1" }, { - "id": "007a707c-6494-41aa-977c-60e5cafbb61b", + "id": "ef389489-9658-47b4-9075-04acb51f12b9", "value": "2" } ] }, - "Use Payment Method Again Timeout": { - "position": { - "x": 1083.2, - "y": -928.8 - }, - "isFriendlyName": true - }, - "Ask for Payment Method": { + "Store Routing Number": { "position": { - "x": 2230.4, - "y": -29.6 + "x": 4786.4, + "y": 88 }, "isFriendlyName": true, - "conditionMetadata": [ - { - "id": "0a4bf1c2-4954-4b02-939c-293ae7766b75", - "value": "1" - }, - { - "id": "74c3b239-b13c-4701-b465-f5e80443a7e1", - "value": "2" + "parameters": { + "Attributes": { + "RoutingNumber": { + "useDynamic": true + } } - ] - }, - "Check Last Payment Method": { - "position": { - "x": 1000, - "y": -67.2 }, - "isFriendlyName": true, - "conditions": [], - "conditionMetadata": [ - { - "id": "f2a6d094-e104-4aa2-b62d-12ec76411785", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Card" - }, - { - "id": "1d01efbd-19e6-466f-95a7-367df5ac6ee1", - "operator": { - "name": "Equals", - "value": "Equals", - "shortDisplay": "=" - }, - "value": "Bank" - } - ] + "dynamicParams": ["RoutingNumber"] }, - "Create Payment Request": { + "Store Expiration Date": { "position": { - "x": -1484, - "y": 224 + "x": 4842.4, + "y": -732.8 }, "isFriendlyName": true, "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" + "Attributes": { + "ExpirationDate": { + "useDynamic": true + } } }, - "dynamicMetadata": {} + "dynamicParams": ["ExpirationDate"] }, - "87859db2-400d-410b-8818-05c8ae4869aa": { + "Internal Error": { + "position": { + "x": 2711.2, + "y": 773.6 + }, + "isFriendlyName": true + }, + "a3ea896e-4f43-4677-8edd-159f677dc41e": { "position": { - "x": -1630.4, - "y": 477.6 + "x": 9224, + "y": 204.8 } }, - "Payment Submission Error": { + "Transfer to Representative": { "position": { - "x": 6013.6, - "y": 99.2 + "x": 8680.8, + "y": -400.8 }, "isFriendlyName": true }, - "Submit Payment": { + "Set Queue": { "position": { - "x": 5556, - "y": -128.8 + "x": 8464.8, + "y": -229.6 }, "isFriendlyName": true, "parameters": { - "LambdaFunctionARN": { - "displayName": "<>" + "QueueId": { + "useDynamic": true } }, - "dynamicMetadata": {} + "useDynamic": true }, - "Store Routing Number": { + "Speak Validation Error": { "position": { - "x": 4120, - "y": 112 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "RoutingNumber": { - "useDynamic": true - } - } + "x": 5847.2, + "y": 235.2 }, - "dynamicParams": ["RoutingNumber"] + "isFriendlyName": true }, - "Store Expiration Date": { + "Receipt Entry Not Recognized": { "position": { - "x": 4127.2, - "y": -695.2 - }, - "isFriendlyName": true, - "parameters": { - "Attributes": { - "ExpirationDate": { - "useDynamic": true - } - } + "x": 7696.8, + "y": 27.2 }, - "dynamicParams": ["ExpirationDate"] + "isFriendlyName": true }, - "Payment Validation Error": { + "Receipt Timeout": { "position": { - "x": 6022.4, - "y": 340.8 + "x": 7784, + "y": 239.2 }, "isFriendlyName": true }, - "a3ea896e-4f43-4677-8edd-159f677dc41e": { + "Redact Sensitive Contact Attributes Copy": { "position": { - "x": 7818.4, - "y": 192.8 - } + "x": 8241.6, + "y": -227.2 + }, + "isFriendlyName": true, + "dynamicParams": [] }, - "Check for Customer Email": { + "Ask to Transfer for Receipt": { "position": { - "x": 6460.8, - "y": -43.2 + "x": 7899.2, + "y": -73.6 }, "isFriendlyName": true, - "conditions": [], "conditionMetadata": [ { - "id": "931df5f9-5b2b-4e34-a744-36fe5e9d0bc6", - "operator": { - "name": "Contains", - "value": "Contains", - "shortDisplay": "contains" - }, - "value": "@" + "id": "0b555be3-03d7-4620-9dc3-93ef6960c4f7", + "value": "1" + }, + { + "id": "6db3e65d-98d3-44e6-ad3d-7517f9fb8bd2", + "value": "2" } ] }, - "Receipt Success": { - "position": { - "x": 6921.6, - "y": -129.6 - }, - "isFriendlyName": true - }, - "Receipt Error": { + "Remove Failed Payment Token and Method": { "position": { - "x": 7143.2, - "y": 55.2 + "x": 6968.8, + "y": 382.4 }, - "isFriendlyName": true + "isFriendlyName": true, + "dynamicParams": [] }, - "Internal Error": { + "Payment Submission Error": { "position": { - "x": 2659.2, - "y": 524 + "x": 6684, + "y": 230.4 }, "isFriendlyName": true }, - "Redact Sensitive Contact Attributes": { + "Record Token": { "position": { - "x": 7378.4, - "y": 184 + "x": 5877.6, + "y": -299.2 }, "isFriendlyName": true, "dynamicParams": [] }, - "Record Token": { + "Record Transaction Attributes": { "position": { - "x": 5190.4, - "y": -132 + "x": 6600.8, + "y": -296.8 }, "isFriendlyName": true, "dynamicParams": [] }, - "Tokenize Transaction": { + "Submit Payment": { "position": { - "x": 4592.8, - "y": -138.4 + "x": 6360.8, + "y": -295.2 }, "isFriendlyName": true, "parameters": { "LambdaFunctionARN": { - "displayName": "<>" + "displayName": "<>" } }, "dynamicMetadata": {} }, - "Remove Failed Payment Token and Method": { + "Payment Validation Error": { "position": { - "x": 6333.6, - "y": 252.8 + "x": 6692.8, + "y": 472 }, - "isFriendlyName": true, - "dynamicParams": [] + "isFriendlyName": true }, "Check for Tokenize Error": { "position": { - "x": 4880.8, - "y": -136.8 + "x": 5646.4, + "y": -300 }, "isFriendlyName": true, + "conditions": [], "conditionMetadata": [ { - "id": "0ebb618b-eab1-4919-9313-9ec860f63162", + "id": "eb0b8440-12c3-42a1-9690-040061170987", "operator": { "name": "Equals", "value": "Equals", @@ -703,33 +751,787 @@ } ] }, - "Speak Validation Error": { + "Tokenize Transaction": { "position": { - "x": 5128.8, - "y": 178.4 + "x": 5397.6, + "y": -304.8 }, - "isFriendlyName": true - } - }, - "Annotations": [], - "name": "C3 Payment IVR Flow Module", - "description": "Flow module to collect payments through a self-service IVR using C3.", + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": {} + }, + "Transfer Error": { + "position": { + "x": 8868.8, + "y": -158.4 + }, + "isFriendlyName": true + }, + "Get & Encrypt Card Number": { + "position": { + "x": 2907.2, + "y": -807.2 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Check for Card Number Validation Error": { + "position": { + "x": 3353.6, + "y": -812.8 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "4fea3106-7b44-4e14-b6fc-e2a2750e6b10", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Card Number Validation Error": { + "position": { + "x": 3257.6, + "y": -574.4 + }, + "isFriendlyName": true + }, + "Get & Encrypt Account Number": { + "position": { + "x": 2915.2, + "y": 106.4 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Check for Account Number Validation Error": { + "position": { + "x": 3356.8, + "y": 98.4 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "18416f6d-103a-4c7b-bf4c-3d4d4ad46f93", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Account Number Validation Error": { + "position": { + "x": 3209.6, + "y": 318.4 + }, + "isFriendlyName": true + }, + "Get Routing Number": { + "position": { + "x": 4123.2, + "y": 103.2 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Check for Routing Number Validation Error": { + "position": { + "x": 4572.8, + "y": 84 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "50f1c61d-d0ee-40fe-bb12-f0271e7ed7f3", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Routing Number Validation Error": { + "position": { + "x": 4427.2, + "y": 306.4 + }, + "isFriendlyName": true + }, + "Get Expiration Date": { + "position": { + "x": 4147.2, + "y": -732.8 + }, + "isFriendlyName": true, + "conditionMetadata": [], + "countryCodePrefix": "+1" + }, + "Check for Expiration Date Validation Error": { + "position": { + "x": 4616.8, + "y": -740.8 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "36a57083-e37c-4a97-8149-1069da8544e0", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Expiration Date Validation Error": { + "position": { + "x": 4470.4, + "y": -520 + }, + "isFriendlyName": true + }, + "Redact Sensitive Contact Attributes": { + "position": { + "x": 8200, + "y": 86.4 + }, + "isFriendlyName": true, + "dynamicParams": [] + }, + "Receipt Success": { + "position": { + "x": 7772.8, + "y": -560.8 + }, + "isFriendlyName": true + }, + "Receipt Error": { + "position": { + "x": 7777.6, + "y": -360 + }, + "isFriendlyName": true + }, + "Has Specified Receipt Queue": { + "position": { + "x": 7524, + "y": -194.4 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "800f8ce8-f008-4971-bf86-4196578d9096", + "operator": { + "name": "Equals", + "value": "Equals", + "shortDisplay": "=" + }, + "value": "NULL" + } + ] + }, + "Payment Success": { + "position": { + "x": 7044, + "y": -211.2 + }, + "isFriendlyName": true + }, + "Send Receipt": { + "position": { + "x": 7528.8, + "y": -473.6 + }, + "isFriendlyName": true, + "parameters": { + "LambdaFunctionARN": { + "displayName": "<>" + } + }, + "dynamicMetadata": {} + }, + "Check for Customer Email": { + "position": { + "x": 7265.6, + "y": -209.6 + }, + "isFriendlyName": true, + "conditions": [], + "conditionMetadata": [ + { + "id": "b9bd782d-dc71-4dce-99aa-b7b677db1ec7", + "operator": { + "name": "Contains", + "value": "Contains", + "shortDisplay": "contains" + }, + "value": "@" + } + ] + } + }, + "Annotations": [ + { + "type": "default", + "id": "3488450f-b48c-41aa-a37e-e3b430d5f199", + "content": "This needs to be done because a user-defined value for the Set Working Queue block type doesn't seem to work?", + "actionId": "Set Receipt Queue ID", + "isFolded": true, + "position": { + "x": -2119.8333333333335, + "y": 474.66666666666663 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "30896f26-80a4-4a84-83e8-6712da1ad3c4", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Card Number", + "isFolded": true, + "position": { + "x": 3943.1666666666665, + "y": -803.3333333333334 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "01393aca-125f-4461-90b2-13317765d772", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Account Number", + "isFolded": true, + "position": { + "x": 3942.1666666666665, + "y": 330.66666666666663 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "cf95cc49-f2ab-494d-8bae-d3adc7364cf1", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Routing Number", + "isFolded": true, + "position": { + "x": 5464.166666666667, + "y": 315.66666666666663 + }, + "size": { + "height": 295, + "width": 300 + } + }, + { + "type": "default", + "id": "16690976-613d-48f1-9262-4d98cd97a333", + "content": "Validation here is \"nice to have\", so we'll still continue with the payment if something fails.", + "actionId": "Validate Expiration Date", + "isFolded": true, + "position": { + "x": 5517.166666666667, + "y": -718.3333333333334 + }, + "size": { + "height": 295, + "width": 300 + } + } + ], + "name": "C3 Payment IVR Flow Module", + "description": "Flow module to collect payments through a self-service IVR using C3.", "status": "published", "hash": {} }, "Actions": [ { "Parameters": { - "Text": "Your payment was processed successfully." + "Text": "Are you still there?" }, - "Identifier": "Payment Success", + "Identifier": "Amount Choice Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check for Customer Email", + "NextAction": "Prompt for Payment Amount Choice", + "Errors": [ + { + "NextAction": "Prompt for Payment Amount Choice", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "You are permitted to make a partial payment of at least $$.Attributes.PaymentMinimumPayment." + }, + "Identifier": "Speak Minimum Payment", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Get Payment Amount", + "Errors": [ + { + "NextAction": "Get Payment Amount", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" + }, + "Identifier": "Payment Amount Timeout", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Speak Minimum Payment", + "Errors": [ + { + "NextAction": "Speak Minimum Payment", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "The entered amount of $$.StoredCustomerInput exceeds the total amount due of $$.Attributes.PaymentAmountDue. Please try again with a smaller amount." + }, + "Identifier": "Payment Too Large", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Speak Minimum Payment", + "Errors": [ + { + "NextAction": "Speak Minimum Payment", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "The entered amount of $$.StoredCustomerInput is less than the minimum payment of $$.Attributes.PaymentMinimumPayment. Please try again with a larger amount." + }, + "Identifier": "Payment Too Small", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Speak Minimum Payment", + "Errors": [ + { + "NextAction": "Speak Minimum Payment", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": {}, + "Identifier": "b2786200-e897-45bd-b888-0f53246f72ed", + "Type": "EndFlowModuleExecution", + "Transitions": {} + }, + { + "Parameters": { + "Text": "Your entry was not recognized. Please try again." + }, + "Identifier": "Amount Choice Input Not Recognized", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Prompt for Payment Amount Choice", + "Errors": [ + { + "NextAction": "Prompt for Payment Amount Choice", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" + }, + "Identifier": "Payment Method Timeout", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Errors": [ + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "ComparisonValue": "$.Attributes.PaymentMinimumPayment" + }, + "Identifier": "Check for Minimum Payment", + "Type": "Compare", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Conditions": [ + { + "NextAction": "Ask for Payment Method", + "Condition": { + "Operator": "Equals", + "Operands": ["PaymentAmountDue"] + } + }, + { + "NextAction": "Prompt for Payment Amount Choice", + "Condition": { + "Operator": "NumberGreaterThan", + "Operands": ["0"] + } + } + ], + "Errors": [ + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingCondition" + } + ] + } + }, + { + "Parameters": { + "Text": "A payment has been requested for the amount of $$.Attributes.PaymentAmountDue." + }, + "Identifier": "Speak Amount", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Check for Minimum Payment", + "Errors": [ + { + "NextAction": "Check for Minimum Payment", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentRequestId": "$.External.PaymentRequestId" + }, + "TargetContact": "Current" + }, + "Identifier": "Record Payment Request ID", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Speak Amount", + "Errors": [ + { + "NextAction": "Payment Request Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "To pay the amount in full, press 1.\nTo pay a partial amount, press 2." + }, + "Identifier": "Prompt for Payment Amount Choice", + "Type": "GetParticipantInput", + "Transitions": { + "NextAction": "Amount Choice Input Not Recognized", + "Conditions": [ + { + "NextAction": "Set Payment Amount to Full Amount", + "Condition": { + "Operator": "Equals", + "Operands": ["1"] + } + }, + { + "NextAction": "Speak Minimum Payment", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] + } + } + ], + "Errors": [ + { + "NextAction": "Amount Choice Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Amount Choice Input Not Recognized", + "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Amount Choice Input Not Recognized", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "ComparisonValue": "$.StoredCustomerInput" + }, + "Identifier": "Check Payment Amount", + "Type": "Compare", + "Transitions": { + "NextAction": "Set Payment Amount to Entered Amount", + "Conditions": [ + { + "NextAction": "Payment Amount Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + }, + { + "NextAction": "Payment Too Large", + "Condition": { + "Operator": "NumberGreaterThan", + "Operands": ["$.Attributes.PaymentAmountDue"] + } + }, + { + "NextAction": "Payment Too Small", + "Condition": { + "Operator": "NumberLessThan", + "Operands": ["$.Attributes.PaymentMinimumPayment"] + } + } + ], + "Errors": [ + { + "NextAction": "Set Payment Amount to Entered Amount", + "ErrorType": "NoMatchingCondition" + } + ] + } + }, + { + "Parameters": { + "Text": "Your entry was not recognized. Please try again." + }, + "Identifier": "Method Input Not Recognized", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Errors": [ + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "StoreInput": "True", + "InputTimeLimitSeconds": "5", + "Text": "Please enter the amount you would like to pay in whole dollars, followed by the pound key.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "20" + } + } + }, + "Identifier": "Get Payment Amount", + "Type": "GetParticipantInput", + "Transitions": { + "NextAction": "Check Payment Amount", + "Errors": [ + { + "NextAction": "Internal Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentAmount": "$.Customer.Attributes.PaymentAmountDue" + }, + "TargetContact": "Current" + }, + "Identifier": "Set Payment Amount to Full Amount", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Check Last Payment Method", + "Errors": [ + { + "NextAction": "Internal Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Attributes": { + "PaymentAmount": "$.StoredCustomerInput" + }, + "TargetContact": "Current" + }, + "Identifier": "Set Payment Amount to Entered Amount", + "Type": "UpdateContactAttributes", + "Transitions": { + "NextAction": "Check Last Payment Method", + "Errors": [ + { + "NextAction": "Internal Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "There was an error creating the payment request." + }, + "Identifier": "Payment Request Error", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "b2786200-e897-45bd-b888-0f53246f72ed", + "Errors": [ + { + "NextAction": "b2786200-e897-45bd-b888-0f53246f72ed", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } + }, + "Identifier": "Create Payment Request", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Record Payment Request ID", + "Errors": [ + { + "NextAction": "Payment Request Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "FlowLoggingBehavior": "Disabled" + }, + "Identifier": "87859db2-400d-410b-8818-05c8ae4869aa", + "Type": "UpdateFlowLoggingBehavior", + "Transitions": { + "NextAction": "Set Receipt Queue ID" + } + }, + { + "Parameters": { + "FlowAttributes": { + "ReceiptQueueId": { + "Value": "<>" + } + } + }, + "Identifier": "Set Receipt Queue ID", + "Type": "UpdateFlowAttributes", + "Transitions": { + "NextAction": "Create Payment Request", + "Errors": [ + { + "NextAction": "Create Payment Request", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" + }, + "Identifier": "Use Payment Method Again Timeout", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Check Last Payment Method", + "Errors": [ + { + "NextAction": "Check Last Payment Method", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "ComparisonValue": "$.Attributes.PaymentMethod" + }, + "Identifier": "Check Last Payment Method", + "Type": "Compare", + "Transitions": { + "NextAction": "Ask for Payment Method", + "Conditions": [ + { + "NextAction": "Use Card Again?", + "Condition": { + "Operator": "Equals", + "Operands": ["Card"] + } + }, + { + "NextAction": "Use Bank Account Again?", + "Condition": { + "Operator": "Equals", + "Operands": ["Bank"] + } + } + ], "Errors": [ { - "NextAction": "Check for Customer Email", - "ErrorType": "NoMatchingError" + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingCondition" } ] } @@ -737,17 +1539,17 @@ { "Parameters": { "Attributes": { - "TransactionId": "$.External.TransactionId" + "PaymentMethod": "Card" }, "TargetContact": "Current" }, - "Identifier": "Record Transaction ID", + "Identifier": "Set Payment Method to Card", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Payment Success", + "NextAction": "Get & Encrypt Card Number", "Errors": [ { - "NextAction": "Payment Success", + "NextAction": "Get & Encrypt Card Number", "ErrorType": "NoMatchingError" } ] @@ -757,13 +1559,13 @@ "Parameters": { "Text": "Are you still there?" }, - "Identifier": "Amount Choice Timeout", + "Identifier": "Card Number Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Prompt for Payment Amount Choice", + "NextAction": "Get & Encrypt Card Number", "Errors": [ { - "NextAction": "Prompt for Payment Amount Choice", + "NextAction": "Get & Encrypt Card Number", "ErrorType": "NoMatchingError" } ] @@ -771,31 +1573,48 @@ }, { "Parameters": { - "Text": "You are permitted to make a partial payment of at least $$.Attributes.PaymentMinimumPayment." + "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Speak Minimum Payment", - "Type": "MessageParticipant", + "Identifier": "Card Number Timeout Check", + "Type": "Compare", "Transitions": { - "NextAction": "Get Payment Amount", + "NextAction": "Validate Card Number", + "Conditions": [ + { + "NextAction": "Card Number Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + } + ], "Errors": [ { - "NextAction": "Get Payment Amount", - "ErrorType": "NoMatchingError" + "NextAction": "Validate Card Number", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "Text": "Are you still there?" + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "CardNumber", + "CustomerEntry": "$.StoredCustomerInput" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Payment Amount Timeout", - "Type": "MessageParticipant", + "Identifier": "Validate Card Number", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Speak Minimum Payment", + "NextAction": "Check for Card Number Validation Error", "Errors": [ { - "NextAction": "Speak Minimum Payment", + "NextAction": "Check for Card Number Validation Error", "ErrorType": "NoMatchingError" } ] @@ -803,15 +1622,41 @@ }, { "Parameters": { - "Text": "The entered amount of $$.StoredCustomerInput exceeds the total amount due of $$.Attributes.PaymentAmountDue. Please try again with a smaller amount." + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "To pay with a credit or debit card, press 1.\nTo pay directly with your bank account, press 2." }, - "Identifier": "Payment Too Large", - "Type": "MessageParticipant", + "Identifier": "Ask for Payment Method", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Speak Minimum Payment", + "NextAction": "Method Input Not Recognized", + "Conditions": [ + { + "NextAction": "Set Payment Method to Card", + "Condition": { + "Operator": "Equals", + "Operands": ["1"] + } + }, + { + "NextAction": "Set Payment Method to Bank", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] + } + } + ], "Errors": [ { - "NextAction": "Speak Minimum Payment", + "NextAction": "Payment Method Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Method Input Not Recognized", + "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Method Input Not Recognized", "ErrorType": "NoMatchingError" } ] @@ -819,48 +1664,34 @@ }, { "Parameters": { - "Text": "The entered amount of $$.StoredCustomerInput is less than the minimum payment of $$.Attributes.PaymentMinimumPayment. Please try again with a larger amount." + "Text": "Are you still there?" }, - "Identifier": "Payment Too Small", + "Identifier": "Account Number Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Speak Minimum Payment", + "NextAction": "Get & Encrypt Account Number", "Errors": [ { - "NextAction": "Speak Minimum Payment", + "NextAction": "Get & Encrypt Account Number", "ErrorType": "NoMatchingError" } ] } }, - { - "Parameters": {}, - "Identifier": "b2786200-e897-45bd-b888-0f53246f72ed", - "Type": "EndFlowModuleExecution", - "Transitions": {} - }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "5", - "Text": "Please enter the amount you would like to pay in whole dollars, followed by the pound key.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" + "Attributes": { + "PaymentMethod": "Bank" }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "20" - } - } + "TargetContact": "Current" }, - "Identifier": "Get Payment Amount", - "Type": "GetParticipantInput", + "Identifier": "Set Payment Method to Bank", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Check Payment Amount", + "NextAction": "Get & Encrypt Account Number", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Get & Encrypt Account Number", "ErrorType": "NoMatchingError" } ] @@ -868,15 +1699,18 @@ }, { "Parameters": { - "Text": "Your entry was not recognized. Please try again." + "Attributes": { + "EncryptedCardNumber": "$.StoredCustomerInput" + }, + "TargetContact": "Current" }, - "Identifier": "Amount Choice Input Not Recognized", - "Type": "MessageParticipant", + "Identifier": "Store Encrypted Card Number", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Prompt for Payment Amount Choice", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Prompt for Payment Amount Choice", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -884,19 +1718,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "There was a problem with your expiration date. Please check your entry and try again." }, - "Identifier": "Email Receipt", - "Type": "InvokeLambdaFunction", + "Identifier": "Try Expiration Date Again", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Receipt Success", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Receipt Error", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -904,9 +1734,9 @@ }, { "Parameters": { - "Text": "Are you still there?" + "Text": "There was a problem with your bank routing number. Please check your entry and try again." }, - "Identifier": "Routing Number Timeout", + "Identifier": "Try Routing Number Again", "Type": "MessageParticipant", "Transitions": { "NextAction": "Get Routing Number", @@ -922,13 +1752,13 @@ "Parameters": { "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Routing Number Timeout Check", + "Identifier": "Account Number Timeout Check", "Type": "Compare", "Transitions": { - "NextAction": "Store Routing Number", + "NextAction": "Validate Account Number", "Conditions": [ { - "NextAction": "Routing Number Timeout", + "NextAction": "Account Number Timeout", "Condition": { "Operator": "Equals", "Operands": ["Timeout"] @@ -937,7 +1767,7 @@ ], "Errors": [ { - "NextAction": "Store Routing Number", + "NextAction": "Validate Account Number", "ErrorType": "NoMatchingCondition" } ] @@ -964,9 +1794,33 @@ }, { "Parameters": { - "Text": "There was a problem with your bank routing number. Please check your entry and try again." + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "AccountNumber", + "CustomerEntry": "$.StoredCustomerInput" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Try Routing Number Again", + "Identifier": "Validate Account Number", + "Type": "InvokeLambdaFunction", + "Transitions": { + "NextAction": "Check for Account Number Validation Error", + "Errors": [ + { + "NextAction": "Check for Account Number Validation Error", + "ErrorType": "NoMatchingError" + } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" + }, + "Identifier": "Routing Number Timeout", "Type": "MessageParticipant", "Transitions": { "NextAction": "Get Routing Number", @@ -980,26 +1834,48 @@ }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your bank's routing number, followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" - }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "25" + "ComparisonValue": "$.StoredCustomerInput" + }, + "Identifier": "Routing Number Timeout Check", + "Type": "Compare", + "Transitions": { + "NextAction": "Validate Routing Number", + "Conditions": [ + { + "NextAction": "Routing Number Timeout", + "Condition": { + "Operator": "Equals", + "Operands": ["Timeout"] + } + } + ], + "Errors": [ + { + "NextAction": "Validate Routing Number", + "ErrorType": "NoMatchingCondition" } + ] + } + }, + { + "Parameters": { + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "RoutingNumber", + "CustomerEntry": "$.StoredCustomerInput" + }, + "ResponseValidation": { + "ResponseType": "JSON" } }, - "Identifier": "Get Routing Number", - "Type": "GetParticipantInput", + "Identifier": "Validate Routing Number", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Routing Number Timeout Check", + "NextAction": "Check for Routing Number Validation Error", "Errors": [ { - "NextAction": "Try Routing Number Again", + "NextAction": "Check for Routing Number Validation Error", "ErrorType": "NoMatchingError" } ] @@ -1009,13 +1885,13 @@ "Parameters": { "Text": "Are you still there?" }, - "Identifier": "Account Number Timeout", + "Identifier": "Expiration Date Timeout", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -1025,13 +1901,13 @@ "Parameters": { "ComparisonValue": "$.StoredCustomerInput" }, - "Identifier": "Account Number Timeout Check", + "Identifier": "Expiration Date Timeout Check", "Type": "Compare", "Transitions": { - "NextAction": "Store Encrypted Account Number", + "NextAction": "Validate Expiration Date", "Conditions": [ { - "NextAction": "Account Number Timeout", + "NextAction": "Expiration Date Timeout", "Condition": { "Operator": "Equals", "Operands": ["Timeout"] @@ -1040,7 +1916,7 @@ ], "Errors": [ { - "NextAction": "Store Encrypted Account Number", + "NextAction": "Validate Expiration Date", "ErrorType": "NoMatchingCondition" } ] @@ -1048,31 +1924,23 @@ }, { "Parameters": { - "Text": "Are you still there?" - }, - "Identifier": "Card Number Timeout", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Get & Encrypt Card Number", - "Errors": [ - { - "NextAction": "Get & Encrypt Card Number", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "Text": "Are you still there?" + "LambdaFunctionARN": "arn:aws:lambda:us-west-2:815407490078:function:C3AmazonConnectStack-C3ValidateEntry0579D515-hLF7slsKAxyI", + "InvocationTimeLimitSeconds": "8", + "LambdaInvocationAttributes": { + "ValidationType": "ExpirationDate", + "CustomerEntry": "$.StoredCustomerInput" + }, + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Expiration Date Timeout", - "Type": "MessageParticipant", + "Identifier": "Validate Expiration Date", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Get Expiration Date", + "NextAction": "Check for Expiration Date Validation Error", "Errors": [ { - "NextAction": "Get Expiration Date", + "NextAction": "Check for Expiration Date Validation Error", "ErrorType": "NoMatchingError" } ] @@ -1080,40 +1948,41 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "You previously paid with a credit or debit card ending in $.Attributes.PaymentMethodEndingDigits.\n\nIf you would like to use this card again for this payment, press 1.\nTo use a different payment method, press 2." }, - "Identifier": "Expiration Date Timeout Check", - "Type": "Compare", + "Identifier": "Use Card Again?", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Store Expiration Date", + "NextAction": "Ask for Payment Method", "Conditions": [ { - "NextAction": "Expiration Date Timeout", + "NextAction": "Submit Payment", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] + "Operands": ["1"] + } + }, + { + "NextAction": "Ask for Payment Method", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] } } ], "Errors": [ { - "NextAction": "Store Expiration Date", + "NextAction": "Use Payment Method Again Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingCondition" - } - ] - } - }, - { - "Parameters": { - "Text": "There was a problem with your expiration date. Please check your entry and try again." - }, - "Identifier": "Try Expiration Date Again", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Get Expiration Date", - "Errors": [ + }, { - "NextAction": "Get Expiration Date", + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingError" } ] @@ -1121,51 +1990,60 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "You previously paid with a bank account ending in $.Attributes.PaymentMethodEndingDigits.\n\nIf you would like to use this account again for this payment, press 1.\nTo use a different payment method, press 2." }, - "Identifier": "Card Number Timeout Check", - "Type": "Compare", + "Identifier": "Use Bank Account Again?", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Store Encrypted Card Number", + "NextAction": "Ask for Payment Method", "Conditions": [ { - "NextAction": "Card Number Timeout", + "NextAction": "Submit Payment", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] + "Operands": ["1"] + } + }, + { + "NextAction": "Ask for Payment Method", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] } } ], "Errors": [ { - "NextAction": "Store Encrypted Card Number", + "NextAction": "Use Payment Method Again Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Ask for Payment Method", "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Ask for Payment Method", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "5", - "Text": "Please enter your card's expiration date in the format month-month-year-year, followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" + "Attributes": { + "RoutingNumber": "$.StoredCustomerInput" }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "25" - } - } + "TargetContact": "Current" }, - "Identifier": "Get Expiration Date", - "Type": "GetParticipantInput", + "Identifier": "Store Routing Number", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Expiration Date Timeout Check", + "NextAction": "Tokenize Transaction", "Errors": [ { - "NextAction": "Try Expiration Date Again", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -1174,14 +2052,14 @@ { "Parameters": { "Attributes": { - "EncryptedCardNumber": "$.StoredCustomerInput" + "ExpirationDate": "$.StoredCustomerInput" }, "TargetContact": "Current" }, - "Identifier": "Store Encrypted Card Number", + "Identifier": "Store Expiration Date", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Get Expiration Date", + "NextAction": "Tokenize Transaction", "Errors": [ { "NextAction": "Internal Error", @@ -1192,63 +2070,71 @@ }, { "Parameters": { - "Text": "Are you still there?" + "Text": "We're sorry, an error has occurred that prevents us from collecting the payment." }, - "Identifier": "Payment Method Timeout", + "Identifier": "Internal Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Ask for Payment Method", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "Ask for Payment Method", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] } }, { - "Parameters": { - "ComparisonValue": "$.Attributes.PaymentMinimumPayment" - }, - "Identifier": "Check for Minimum Payment", - "Type": "Compare", + "Parameters": {}, + "Identifier": "a3ea896e-4f43-4677-8edd-159f677dc41e", + "Type": "EndFlowModuleExecution", + "Transitions": {} + }, + { + "Parameters": {}, + "Identifier": "Transfer to Representative", + "Type": "TransferContactToQueue", "Transitions": { - "NextAction": "Ask for Payment Method", - "Conditions": [ + "NextAction": "Transfer Error", + "Errors": [ { - "NextAction": "Ask for Payment Method", - "Condition": { - "Operator": "Equals", - "Operands": ["PaymentAmountDue"] - } + "NextAction": "Transfer Error", + "ErrorType": "QueueAtCapacity" }, { - "NextAction": "Prompt for Payment Amount Choice", - "Condition": { - "Operator": "NumberGreaterThan", - "Operands": ["0"] - } + "NextAction": "Transfer Error", + "ErrorType": "NoMatchingError" } - ], + ] + } + }, + { + "Parameters": { + "QueueId": "$.FlowAttributes.ReceiptQueueId" + }, + "Identifier": "Set Queue", + "Type": "UpdateContactTargetQueue", + "Transitions": { + "NextAction": "Transfer to Representative", "Errors": [ { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingCondition" + "NextAction": "Transfer Error", + "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "Text": "Your entry was not recognized. Please try again." + "Text": "The payment failed because of the following error:\n\n$.External.Error" }, - "Identifier": "Method Input Not Recognized", + "Identifier": "Speak Validation Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Ask for Payment Method", + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Ask for Payment Method", + "NextAction": "Remove Failed Payment Token and Method", "ErrorType": "NoMatchingError" } ] @@ -1256,30 +2142,31 @@ }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your card number followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" - }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "25" + "Text": "Your entry was not recognized. Please try again." + }, + "Identifier": "Receipt Entry Not Recognized", + "Type": "MessageParticipant", + "Transitions": { + "NextAction": "Ask to Transfer for Receipt", + "Errors": [ + { + "NextAction": "Ask to Transfer for Receipt", + "ErrorType": "NoMatchingError" } - }, - "InputEncryption": { - "EncryptionKeyId": "<>", - "Key": "<>" - } + ] + } + }, + { + "Parameters": { + "Text": "Are you still there?" }, - "Identifier": "Get & Encrypt Card Number", - "Type": "GetParticipantInput", + "Identifier": "Receipt Timeout", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Card Number Timeout Check", + "NextAction": "Ask to Transfer for Receipt", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Ask to Transfer for Receipt", "ErrorType": "NoMatchingError" } ] @@ -1288,17 +2175,19 @@ { "Parameters": { "Attributes": { - "PaymentMethod": "Card" + "EncryptedCardNumber": "REDACTED", + "EncryptedAccountNumber": "REDACTED", + "ExpirationDate": "REDACTED" }, "TargetContact": "Current" }, - "Identifier": "Set Payment Method to Card", + "Identifier": "Redact Sensitive Contact Attributes Copy", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Get & Encrypt Card Number", + "NextAction": "Set Queue", "Errors": [ { - "NextAction": "Get & Encrypt Card Number", + "NextAction": "Set Queue", "ErrorType": "NoMatchingError" } ] @@ -1306,30 +2195,41 @@ }, { "Parameters": { - "StoreInput": "True", - "InputTimeLimitSeconds": "10", - "Text": "Please enter your bank account number followed by the pound key when complete.", - "DTMFConfiguration": { - "DisableCancelKey": "False", - "InputTerminationSequence": "#" - }, - "InputValidation": { - "CustomValidation": { - "MaximumLength": "25" - } - }, - "InputEncryption": { - "EncryptionKeyId": "<>", - "Key": "<>" - } + "StoreInput": "False", + "InputTimeLimitSeconds": "5", + "Text": "To transfer to a representative and receive a receipt for your payment, press 1.\nTo continue without a receipt, press 2." }, - "Identifier": "Get & Encrypt Account Number", + "Identifier": "Ask to Transfer for Receipt", "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Account Number Timeout Check", + "NextAction": "Receipt Entry Not Recognized", + "Conditions": [ + { + "NextAction": "Redact Sensitive Contact Attributes Copy", + "Condition": { + "Operator": "Equals", + "Operands": ["1"] + } + }, + { + "NextAction": "Redact Sensitive Contact Attributes", + "Condition": { + "Operator": "Equals", + "Operands": ["2"] + } + } + ], "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Receipt Timeout", + "ErrorType": "InputTimeLimitExceeded" + }, + { + "NextAction": "Receipt Entry Not Recognized", + "ErrorType": "NoMatchingCondition" + }, + { + "NextAction": "Receipt Entry Not Recognized", "ErrorType": "NoMatchingError" } ] @@ -1338,17 +2238,18 @@ { "Parameters": { "Attributes": { - "PaymentMethod": "Bank" + "PaymentToken": "NULL", + "PaymentMethod": "NULL" }, "TargetContact": "Current" }, - "Identifier": "Set Payment Method to Bank", + "Identifier": "Remove Failed Payment Token and Method", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "Get & Encrypt Account Number", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] @@ -1356,15 +2257,15 @@ }, { "Parameters": { - "Text": "A payment has been requested for the amount of $$.Attributes.PaymentAmountDue." + "Text": "We're sorry, an error has occured preventing us from submitting your payment. You have not been charged." }, - "Identifier": "Speak Amount", + "Identifier": "Payment Submission Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check for Minimum Payment", + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Check for Minimum Payment", + "NextAction": "Remove Failed Payment Token and Method", "ErrorType": "NoMatchingError" } ] @@ -1372,15 +2273,18 @@ }, { "Parameters": { - "Text": "There was an error creating the payment request." + "Attributes": { + "PaymentToken": "$.External.PaymentToken" + }, + "TargetContact": "Current" }, - "Identifier": "Payment Request Error", - "Type": "MessageParticipant", + "Identifier": "Record Token", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "b2786200-e897-45bd-b888-0f53246f72ed", + "NextAction": "Submit Payment", "Errors": [ { - "NextAction": "b2786200-e897-45bd-b888-0f53246f72ed", + "NextAction": "Submit Payment", "ErrorType": "NoMatchingError" } ] @@ -1389,17 +2293,18 @@ { "Parameters": { "Attributes": { - "PaymentRequestId": "$.External.PaymentRequestId" + "TransactionId": "$.External.TransactionId", + "PaymentMethodEndingDigits": "$.External.PaymentMethodEndingDigits" }, "TargetContact": "Current" }, - "Identifier": "Record Payment Request ID", + "Identifier": "Record Transaction Attributes", "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Speak Amount", + "NextAction": "Payment Success", "Errors": [ { - "NextAction": "Payment Request Error", + "NextAction": "Payment Success", "ErrorType": "NoMatchingError" } ] @@ -1407,41 +2312,19 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "To pay the amount in full, press 1.\nTo pay a partial amount, press 2." + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Prompt for Payment Amount Choice", - "Type": "GetParticipantInput", + "Identifier": "Submit Payment", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Amount Choice Input Not Recognized", - "Conditions": [ - { - "NextAction": "Set Payment Amount to Full Amount", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, - { - "NextAction": "Speak Minimum Payment", - "Condition": { - "Operator": "Equals", - "Operands": ["2"] - } - } - ], + "NextAction": "Record Transaction Attributes", "Errors": [ { - "NextAction": "Amount Choice Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Amount Choice Input Not Recognized", - "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Amount Choice Input Not Recognized", + "NextAction": "Payment Submission Error", "ErrorType": "NoMatchingError" } ] @@ -1449,18 +2332,15 @@ }, { "Parameters": { - "Attributes": { - "PaymentAmount": "$.Customer.Attributes.PaymentAmountDue" - }, - "TargetContact": "Current" + "Text": "There was a problem validating your $.Attributes.PaymentMethod information." }, - "Identifier": "Set Payment Amount to Full Amount", - "Type": "UpdateContactAttributes", + "Identifier": "Payment Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check Last Payment Method", + "NextAction": "Remove Failed Payment Token and Method", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Remove Failed Payment Token and Method", "ErrorType": "NoMatchingError" } ] @@ -1468,38 +2348,24 @@ }, { "Parameters": { - "ComparisonValue": "$.StoredCustomerInput" + "ComparisonValue": "$.External.Error" }, - "Identifier": "Check Payment Amount", + "Identifier": "Check for Tokenize Error", "Type": "Compare", "Transitions": { - "NextAction": "Set Payment Amount to Entered Amount", + "NextAction": "Speak Validation Error", "Conditions": [ { - "NextAction": "Payment Amount Timeout", + "NextAction": "Record Token", "Condition": { "Operator": "Equals", - "Operands": ["Timeout"] - } - }, - { - "NextAction": "Payment Too Large", - "Condition": { - "Operator": "NumberGreaterThan", - "Operands": ["$.Attributes.PaymentAmountDue"] - } - }, - { - "NextAction": "Payment Too Small", - "Condition": { - "Operator": "NumberLessThan", - "Operands": ["$.Attributes.PaymentMinimumPayment"] + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Set Payment Amount to Entered Amount", + "NextAction": "Speak Validation Error", "ErrorType": "NoMatchingCondition" } ] @@ -1507,18 +2373,19 @@ }, { "Parameters": { - "Attributes": { - "PaymentAmount": "$.StoredCustomerInput" - }, - "TargetContact": "Current" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Set Payment Amount to Entered Amount", - "Type": "UpdateContactAttributes", + "Identifier": "Tokenize Transaction", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Check Last Payment Method", + "NextAction": "Check for Tokenize Error", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Payment Validation Error", "ErrorType": "NoMatchingError" } ] @@ -1526,41 +2393,46 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "You previously paid with a credit or debit card.\n\nIf you would like to use this card again for this payment, press 1.\nTo use a different payment method, press 2." + "Text": "An error prevented us from connecting you to a representative. Please try calling the customer service number directly in order to receive a receipt." }, - "Identifier": "Use Card Again?", - "Type": "GetParticipantInput", + "Identifier": "Transfer Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Ask for Payment Method", - "Conditions": [ - { - "NextAction": "Submit Payment", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, + "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", + "Errors": [ { - "NextAction": "Ask for Payment Method", - "Condition": { - "Operator": "Equals", - "Operands": ["2"] - } + "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", + "ErrorType": "NoMatchingError" } - ], + ] + } + }, + { + "Parameters": { + "StoreInput": "True", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your card number followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "25" + } + }, + "InputEncryption": { + "EncryptionKeyId": "<>", + "Key": "<>" + } + }, + "Identifier": "Get & Encrypt Card Number", + "Type": "GetParticipantInput", + "Transitions": { + "NextAction": "Card Number Timeout Check", "Errors": [ { - "NextAction": "Use Payment Method Again Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -1568,57 +2440,40 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "You previously paid with a bank account.\n\nIf you would like to use this account again for this payment, press 1.\nTo use a different payment method, press 2." + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Use Bank Account Again?", - "Type": "GetParticipantInput", + "Identifier": "Check for Card Number Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Ask for Payment Method", + "NextAction": "Card Number Validation Error", "Conditions": [ { - "NextAction": "Submit Payment", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Store Encrypted Card Number", "Condition": { "Operator": "Equals", - "Operands": ["2"] + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Use Payment Method Again Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Ask for Payment Method", + "NextAction": "Card Number Validation Error", "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Ask for Payment Method", - "ErrorType": "NoMatchingError" } ] } }, { "Parameters": { - "Text": "Are you still there?" + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Use Payment Method Again Timeout", + "Identifier": "Card Number Validation Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check Last Payment Method", + "NextAction": "Get & Encrypt Card Number", "Errors": [ { - "NextAction": "Check Last Payment Method", + "NextAction": "Get & Encrypt Card Number", "ErrorType": "NoMatchingError" } ] @@ -1626,41 +2481,30 @@ }, { "Parameters": { - "StoreInput": "False", - "InputTimeLimitSeconds": "5", - "Text": "To pay with a credit or debit card, press 1.\nTo pay directly with your bank account, press 2." + "StoreInput": "True", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your bank account number followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "25" + } + }, + "InputEncryption": { + "EncryptionKeyId": "<>", + "Key": "<>" + } }, - "Identifier": "Ask for Payment Method", + "Identifier": "Get & Encrypt Account Number", "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Method Input Not Recognized", - "Conditions": [ - { - "NextAction": "Set Payment Method to Card", - "Condition": { - "Operator": "Equals", - "Operands": ["1"] - } - }, - { - "NextAction": "Set Payment Method to Bank", - "Condition": { - "Operator": "Equals", - "Operands": ["2"] - } - } - ], + "NextAction": "Account Number Timeout Check", "Errors": [ { - "NextAction": "Payment Method Timeout", - "ErrorType": "InputTimeLimitExceeded" - }, - { - "NextAction": "Method Input Not Recognized", - "ErrorType": "NoMatchingCondition" - }, - { - "NextAction": "Method Input Not Recognized", + "NextAction": "Internal Error", "ErrorType": "NoMatchingError" } ] @@ -1668,31 +2512,24 @@ }, { "Parameters": { - "ComparisonValue": "$.Attributes.PaymentMethod" + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Check Last Payment Method", + "Identifier": "Check for Account Number Validation Error", "Type": "Compare", "Transitions": { - "NextAction": "Ask for Payment Method", + "NextAction": "Account Number Validation Error", "Conditions": [ { - "NextAction": "Use Card Again?", - "Condition": { - "Operator": "Equals", - "Operands": ["Card"] - } - }, - { - "NextAction": "Use Bank Account Again?", + "NextAction": "Store Encrypted Account Number", "Condition": { "Operator": "Equals", - "Operands": ["Bank"] + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Ask for Payment Method", + "NextAction": "Account Number Validation Error", "ErrorType": "NoMatchingCondition" } ] @@ -1700,45 +2537,15 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" - } - }, - "Identifier": "Create Payment Request", - "Type": "InvokeLambdaFunction", - "Transitions": { - "NextAction": "Record Payment Request ID", - "Errors": [ - { - "NextAction": "Payment Request Error", - "ErrorType": "NoMatchingError" - } - ] - } - }, - { - "Parameters": { - "FlowLoggingBehavior": "Disabled" - }, - "Identifier": "87859db2-400d-410b-8818-05c8ae4869aa", - "Type": "UpdateFlowLoggingBehavior", - "Transitions": { - "NextAction": "Create Payment Request" - } - }, - { - "Parameters": { - "Text": "We're sorry, an error has occured preventing us from submitting your payment. You have not been charged." + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Payment Submission Error", + "Identifier": "Account Number Validation Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Get & Encrypt Account Number", "Errors": [ { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Get & Encrypt Account Number", "ErrorType": "NoMatchingError" } ] @@ -1746,19 +2553,26 @@ }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" + "StoreInput": "True", + "InputTimeLimitSeconds": "10", + "Text": "Please enter your bank's routing number, followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "25" + } } }, - "Identifier": "Submit Payment", - "Type": "InvokeLambdaFunction", + "Identifier": "Get Routing Number", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Record Transaction ID", + "NextAction": "Routing Number Timeout Check", "Errors": [ { - "NextAction": "Payment Submission Error", + "NextAction": "Try Routing Number Again", "ErrorType": "NoMatchingError" } ] @@ -1766,37 +2580,40 @@ }, { "Parameters": { - "Attributes": { - "RoutingNumber": "$.StoredCustomerInput" - }, - "TargetContact": "Current" + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Store Routing Number", - "Type": "UpdateContactAttributes", + "Identifier": "Check for Routing Number Validation Error", + "Type": "Compare", "Transitions": { - "NextAction": "Tokenize Transaction", + "NextAction": "Routing Number Validation Error", + "Conditions": [ + { + "NextAction": "Store Routing Number", + "Condition": { + "Operator": "Equals", + "Operands": ["NULL"] + } + } + ], "Errors": [ { - "NextAction": "Internal Error", - "ErrorType": "NoMatchingError" + "NextAction": "Routing Number Validation Error", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "Attributes": { - "ExpirationDate": "$.StoredCustomerInput" - }, - "TargetContact": "Current" + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Store Expiration Date", - "Type": "UpdateContactAttributes", + "Identifier": "Routing Number Validation Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Tokenize Transaction", + "NextAction": "Get Routing Number", "Errors": [ { - "NextAction": "Internal Error", + "NextAction": "Get Routing Number", "ErrorType": "NoMatchingError" } ] @@ -1804,46 +2621,51 @@ }, { "Parameters": { - "Text": "There was a problem validating your $.Attributes.PaymentMethod information." + "StoreInput": "True", + "InputTimeLimitSeconds": "5", + "Text": "Please enter your card's expiration date in the format month-month-year-year, followed by the pound key when complete.", + "DTMFConfiguration": { + "DisableCancelKey": "False", + "InputTerminationSequence": "#" + }, + "InputValidation": { + "CustomValidation": { + "MaximumLength": "25" + } + } }, - "Identifier": "Payment Validation Error", - "Type": "MessageParticipant", + "Identifier": "Get Expiration Date", + "Type": "GetParticipantInput", "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Expiration Date Timeout Check", "Errors": [ { - "NextAction": "Remove Failed Payment Token and Method", + "NextAction": "Try Expiration Date Again", "ErrorType": "NoMatchingError" } ] } }, - { - "Parameters": {}, - "Identifier": "a3ea896e-4f43-4677-8edd-159f677dc41e", - "Type": "EndFlowModuleExecution", - "Transitions": {} - }, { "Parameters": { - "ComparisonValue": "$.Attributes.Email" + "ComparisonValue": "$.External.ValidationError" }, - "Identifier": "Check for Customer Email", + "Identifier": "Check for Expiration Date Validation Error", "Type": "Compare", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Expiration Date Validation Error", "Conditions": [ { - "NextAction": "Email Receipt", + "NextAction": "Store Expiration Date", "Condition": { - "Operator": "TextContains", - "Operands": ["@"] + "Operator": "Equals", + "Operands": ["NULL"] } } ], "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Expiration Date Validation Error", "ErrorType": "NoMatchingCondition" } ] @@ -1851,15 +2673,15 @@ }, { "Parameters": { - "Text": "A receipt has been sent to your email address, $.Attributes.['Email']." + "Text": "$.External.ValidationError\n\nPlease check your entry and try again." }, - "Identifier": "Receipt Success", + "Identifier": "Expiration Date Validation Error", "Type": "MessageParticipant", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Get Expiration Date", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Get Expiration Date", "ErrorType": "NoMatchingError" } ] @@ -1867,15 +2689,20 @@ }, { "Parameters": { - "Text": "There was an error sending the receipt to your email address, $.Attributes.['Email']. Please contact customer support to receive a receipt for this transaction." + "Attributes": { + "EncryptedCardNumber": "REDACTED", + "EncryptedAccountNumber": "REDACTED", + "ExpirationDate": "REDACTED" + }, + "TargetContact": "Current" }, - "Identifier": "Receipt Error", - "Type": "MessageParticipant", + "Identifier": "Redact Sensitive Contact Attributes", + "Type": "UpdateContactAttributes", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", "ErrorType": "NoMatchingError" } ] @@ -1883,9 +2710,9 @@ }, { "Parameters": { - "Text": "We're sorry, an error has occurred that prevents us from collecting the payment." + "Text": "A receipt has been sent to your email address, $.Attributes.['Email']." }, - "Identifier": "Internal Error", + "Identifier": "Receipt Success", "Type": "MessageParticipant", "Transitions": { "NextAction": "Redact Sensitive Contact Attributes", @@ -1899,20 +2726,15 @@ }, { "Parameters": { - "Attributes": { - "EncryptedCardNumber": "REDACTED", - "EncryptedAccountNumber": "REDACTED", - "ExpirationDate": "REDACTED" - }, - "TargetContact": "Current" + "Text": "There was an error sending the receipt to your email address, $.Attributes.['Email']. Please contact customer support to receive a receipt for this transaction." }, - "Identifier": "Redact Sensitive Contact Attributes", - "Type": "UpdateContactAttributes", + "Identifier": "Receipt Error", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", + "NextAction": "Redact Sensitive Contact Attributes", "Errors": [ { - "NextAction": "a3ea896e-4f43-4677-8edd-159f677dc41e", + "NextAction": "Redact Sensitive Contact Attributes", "ErrorType": "NoMatchingError" } ] @@ -1920,38 +2742,40 @@ }, { "Parameters": { - "Attributes": { - "PaymentToken": "$.External.PaymentToken" - }, - "TargetContact": "Current" + "ComparisonValue": "$.FlowAttributes.ReceiptQueueId" }, - "Identifier": "Record Token", - "Type": "UpdateContactAttributes", + "Identifier": "Has Specified Receipt Queue", + "Type": "Compare", "Transitions": { - "NextAction": "Submit Payment", + "NextAction": "Ask to Transfer for Receipt", + "Conditions": [ + { + "NextAction": "Redact Sensitive Contact Attributes", + "Condition": { + "Operator": "Equals", + "Operands": ["NULL"] + } + } + ], "Errors": [ { - "NextAction": "Submit Payment", - "ErrorType": "NoMatchingError" + "NextAction": "Ask to Transfer for Receipt", + "ErrorType": "NoMatchingCondition" } ] } }, { "Parameters": { - "LambdaFunctionARN": "<>", - "InvocationTimeLimitSeconds": "8", - "ResponseValidation": { - "ResponseType": "JSON" - } + "Text": "Your payment was processed successfully." }, - "Identifier": "Tokenize Transaction", - "Type": "InvokeLambdaFunction", + "Identifier": "Payment Success", + "Type": "MessageParticipant", "Transitions": { - "NextAction": "Check for Tokenize Error", + "NextAction": "Check for Customer Email", "Errors": [ { - "NextAction": "Payment Validation Error", + "NextAction": "Check for Customer Email", "ErrorType": "NoMatchingError" } ] @@ -1959,19 +2783,19 @@ }, { "Parameters": { - "Attributes": { - "PaymentToken": "NULL", - "PaymentMethod": "NULL" - }, - "TargetContact": "Current" + "LambdaFunctionARN": "<>", + "InvocationTimeLimitSeconds": "8", + "ResponseValidation": { + "ResponseType": "JSON" + } }, - "Identifier": "Remove Failed Payment Token and Method", - "Type": "UpdateContactAttributes", + "Identifier": "Send Receipt", + "Type": "InvokeLambdaFunction", "Transitions": { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Receipt Success", "Errors": [ { - "NextAction": "Redact Sensitive Contact Attributes", + "NextAction": "Receipt Error", "ErrorType": "NoMatchingError" } ] @@ -1979,44 +2803,28 @@ }, { "Parameters": { - "ComparisonValue": "$.External.Error" + "ComparisonValue": "$.Attributes.Email" }, - "Identifier": "Check for Tokenize Error", + "Identifier": "Check for Customer Email", "Type": "Compare", "Transitions": { - "NextAction": "Speak Validation Error", + "NextAction": "Has Specified Receipt Queue", "Conditions": [ { - "NextAction": "Record Token", + "NextAction": "Send Receipt", "Condition": { - "Operator": "Equals", - "Operands": ["NULL"] + "Operator": "TextContains", + "Operands": ["@"] } } ], "Errors": [ { - "NextAction": "Speak Validation Error", + "NextAction": "Has Specified Receipt Queue", "ErrorType": "NoMatchingCondition" } ] } - }, - { - "Parameters": { - "Text": "The payment failed because of the following error:\n\n$.External.Error" - }, - "Identifier": "Speak Validation Error", - "Type": "MessageParticipant", - "Transitions": { - "NextAction": "Remove Failed Payment Token and Method", - "Errors": [ - { - "NextAction": "Remove Failed Payment Token and Method", - "ErrorType": "NoMatchingError" - } - ] - } } ], "Settings": { diff --git a/lib/features/agent-assisted-payment-ivr.ts b/lib/features/agent-assisted-payment-ivr.ts index 4c5ac0d0..a977509f 100644 --- a/lib/features/agent-assisted-payment-ivr.ts +++ b/lib/features/agent-assisted-payment-ivr.ts @@ -12,7 +12,12 @@ import { PolicyStatement, Role, } from 'aws-cdk-lib/aws-iam'; -import { Code, CodeSigningConfig, Function } from 'aws-cdk-lib/aws-lambda'; +import { + Code, + CodeSigningConfig, + Function, + LayerVersion, +} from 'aws-cdk-lib/aws-lambda'; import { join } from 'path'; import { @@ -44,10 +49,11 @@ export class AgentAssistedPaymentIVR { private codeSigningConfig: CodeSigningConfig, private c3BaseUrl: string, private c3ApiKeySecret: Secret, + private utilsLayer: LayerVersion, private createPaymentRequestFunction: Function, private tokenizeTransactionFunction: Function, private submitPaymentFunction: Function, - private emailReceiptFunction: Function, + private sendReceiptFunction: Function, ) { console.log('Creating resources for agent-assisted IVR payments...'); this.createSendAgentMessageFunction(); @@ -93,6 +99,7 @@ export class AgentAssistedPaymentIVR { codeSigningConfig: optionsContext.codeSigning ? this.codeSigningConfig : undefined, + layers: [this.utilsLayer], }, ); @@ -116,7 +123,7 @@ export class AgentAssistedPaymentIVR { this.createPaymentRequestFunction, this.tokenizeTransactionFunction, this.submitPaymentFunction, - this.emailReceiptFunction, + this.sendReceiptFunction, this.amazonConnectContext.securityKeyId, this.amazonConnectContext.securityKeyCertificateContent, ); diff --git a/lib/features/self-service-payment-ivr.ts b/lib/features/self-service-payment-ivr.ts index b4951b6a..29e8f480 100644 --- a/lib/features/self-service-payment-ivr.ts +++ b/lib/features/self-service-payment-ivr.ts @@ -19,7 +19,7 @@ export class SelfServicePaymentIVR { private createPaymentRequestFunction: Function, private tokenizeTransactionFunction: Function, private submitPaymentFunction: Function, - private emailReceiptFunction: Function, + private sendReceiptFunction: Function, ) { console.log('Creating resources for self-service IVR payments...'); this.createFlowModule(); @@ -37,9 +37,10 @@ export class SelfServicePaymentIVR { this.createPaymentRequestFunction, this.tokenizeTransactionFunction, this.submitPaymentFunction, - this.emailReceiptFunction, + this.sendReceiptFunction, this.amazonConnectContext.securityKeyId, this.amazonConnectContext.securityKeyCertificateContent, + this.amazonConnectContext.receiptQueueArn, ); writeFileToExports( 'C3PaymentIVRFlowModule.json', diff --git a/lib/helpers/lambda.ts b/lib/helpers/lambda.ts index 1f1fdacc..b676280e 100644 --- a/lib/helpers/lambda.ts +++ b/lib/helpers/lambda.ts @@ -1,13 +1,28 @@ import { Duration, Stack } from 'aws-cdk-lib'; import { CfnIntegrationAssociation } from 'aws-cdk-lib/aws-connect'; import { ServicePrincipal } from 'aws-cdk-lib/aws-iam'; -import { Architecture, Function, Runtime } from 'aws-cdk-lib/aws-lambda'; +import { + Architecture, + Code, + Function, + FunctionProps, + LayerVersionProps, + Runtime, +} from 'aws-cdk-lib/aws-lambda'; -let integrationNumber = 1; +const TARGET_ARCHITECTURE = Architecture.ARM_64; +const TARGET_RUNTIME = Runtime.NODEJS_20_X; -export const commonLambdaProps = { - architecture: Architecture.ARM_64, - runtime: Runtime.NODEJS_20_X, +export const commonLambdaLayerProps: LayerVersionProps = { + code: Code.fromInline('// Not empty'), // Placeholder code. The actual code will be set elsewhere. + compatibleArchitectures: [TARGET_ARCHITECTURE], + compatibleRuntimes: [TARGET_RUNTIME], +}; + +export const commonLambdaProps: FunctionProps = { + code: Code.fromInline('// Not empty'), // Placeholder code. The actual code will be set elsewhere. + architecture: TARGET_ARCHITECTURE, + runtime: TARGET_RUNTIME, timeout: Duration.seconds(8), handler: 'index.handler', memorySize: 256, @@ -25,6 +40,12 @@ export function associateLambdaFunctionsWithConnect( stack: Stack, lambdaFunctions: Function[], ): void { + // Workaround to delete the existing associations. Necessary when the naming format changes. + const skipAssociations = stack.node.tryGetContext('options').skipAssociations; + if (skipAssociations) { + return; + } + const instanceArn = stack.node.tryGetContext('amazonConnect').instanceArn; for (const lambdaFunction of lambdaFunctions) { // Allow Amazon Connect to invoke the Lambda functions. @@ -42,13 +63,12 @@ export function associateLambdaFunctionsWithConnect( ); new CfnIntegrationAssociation( stack, - `C3ConnectIntegrationFunction${integrationNumber}`, + `C3ConnectIntegration-${lambdaFunction.node.id}`, { instanceId: instanceArn, integrationType: 'LAMBDA_FUNCTION', integrationArn: lambdaFunction.functionArn, }, ); - integrationNumber++; } } diff --git a/lib/lambda/c3-create-payment-request/index.js b/lib/lambda/c3-create-payment-request/index.js index 4f3c882c..97a89412 100644 --- a/lib/lambda/c3-create-payment-request/index.js +++ b/lib/lambda/c3-create-payment-request/index.js @@ -1,9 +1,4 @@ -import { - SecretsManagerClient, - GetSecretValueCommand, -} from '@aws-sdk/client-secrets-manager'; - -let c3ApiKey = ''; +import { getAPIKey } from '/opt/nodejs/c3.js'; /** * @type {import ('aws-lambda').Handler} @@ -16,28 +11,9 @@ export async function handler(event) { contactAttributes = event.Details.ContactData.Attributes; // Get the API key. - if (!c3ApiKey) { - const secretsManagerClient = new SecretsManagerClient(); - const getSecretValueCommand = new GetSecretValueCommand({ - SecretId: process.env.C3_API_KEY_SECRET_ID, - }); - c3ApiKey = (await secretsManagerClient.send(getSecretValueCommand)) - .SecretString; - if (!c3ApiKey) { - throw new Error( - `No value found for ${process.env.C3_API_KEY_SECRET_ID} secret.`, - ); - } - if (c3ApiKey === '') { - throw new Error( - `Value for ${process.env.C3_API_KEY_SECRET_ID} secret is not set.`, - ); - } - } else { - console.log('Using API key in memory.'); - } + const c3ApiKey = await getAPIKey(); - // Create the payment request. + // Create metadata for updating the balance in Safe Select (optional). const metadata = { safeSelect: { id: contactAttributes.SubjectId, @@ -45,6 +21,7 @@ export async function handler(event) { customField: 'balance', }, }; + const paymentRequestBody = { // Environment vendorId: process.env.C3_VENDOR_ID, @@ -66,7 +43,10 @@ export async function handler(event) { }, metaData: JSON.stringify(metadata), }; + console.debug('Payment request body:', paymentRequestBody); + // Create the payment request. + console.log('Creating the payment request...'); const paymentRequestResponse = await fetch( `${process.env.C3_BASE_URL}/payment-request`, { @@ -87,6 +67,9 @@ export async function handler(event) { ); } + console.log( + `Payment request ${paymentRequestResponseJson.id} created successfully.`, + ); return { PaymentRequestId: paymentRequestResponseJson.id, }; diff --git a/lib/lambda/c3-create-payment-request/jsconfig.json b/lib/lambda/c3-create-payment-request/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-create-payment-request/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-create-payment-request/package-lock.json b/lib/lambda/c3-create-payment-request/package-lock.json index 5ff0c8b7..3cb1373e 100644 --- a/lib/lambda/c3-create-payment-request/package-lock.json +++ b/lib/lambda/c3-create-payment-request/package-lock.json @@ -5,1195 +5,7 @@ "packages": { "": { "name": "c3-create-payment-request", - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, "devDependencies": {} - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", - "integrity": "sha512-WsQhPHHK1yPfALcP1B7nBSGDzky6vFTUEXnUdfzb5Xy2cT+JTBTS6ChtQGqqOuGHDP/3t/9soqZ+L6rUCYBb/Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/client-sts": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.632.0.tgz", - "integrity": "sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.632.0.tgz", - "integrity": "sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.632.0.tgz", - "integrity": "sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", - "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.632.0.tgz", - "integrity": "sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.632.0.tgz", - "integrity": "sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.632.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.632.0.tgz", - "integrity": "sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==", - "dependencies": { - "@aws-sdk/client-sso": "3.632.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", - "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", - "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } } } } diff --git a/lib/lambda/c3-create-payment-request/package.json b/lib/lambda/c3-create-payment-request/package.json index 5cde1790..267d481a 100644 --- a/lib/lambda/c3-create-payment-request/package.json +++ b/lib/lambda/c3-create-payment-request/package.json @@ -7,8 +7,6 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, + "dependencies": {}, "devDependencies": {} } diff --git a/lib/lambda/c3-send-agent-message/index.js b/lib/lambda/c3-send-agent-message/index.js index 6eb29512..69f62072 100644 --- a/lib/lambda/c3-send-agent-message/index.js +++ b/lib/lambda/c3-send-agent-message/index.js @@ -1,9 +1,4 @@ -import { - GetSecretValueCommand, - SecretsManagerClient, -} from '@aws-sdk/client-secrets-manager'; - -let c3ApiKey = ''; +import { getAPIKey } from '/opt/nodejs/c3.js'; /** * @type {import ('aws-lambda').Handler} @@ -22,26 +17,7 @@ export async function handler(event) { } // Get the API key. - if (!c3ApiKey) { - const secretsManagerClient = new SecretsManagerClient(); - const getSecretValueCommand = new GetSecretValueCommand({ - SecretId: process.env.C3_API_KEY_SECRET_ID, - }); - c3ApiKey = (await secretsManagerClient.send(getSecretValueCommand)) - .SecretString; - if (!c3ApiKey) { - throw new Error( - `No value found for ${process.env.C3_API_KEY_SECRET_ID} secret.`, - ); - } - if (c3ApiKey === '') { - throw new Error( - `Value for ${process.env.C3_API_KEY_SECRET_ID} secret is not set.`, - ); - } - } else { - console.log('Using API key in memory.'); - } + const c3ApiKey = await getAPIKey(); const data = structuredClone(parameters); delete data.EventText; // We don't need this in the data. diff --git a/lib/lambda/c3-send-agent-message/jsconfig.json b/lib/lambda/c3-send-agent-message/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-send-agent-message/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-send-agent-message/package-lock.json b/lib/lambda/c3-send-agent-message/package-lock.json index c48279f1..99a7ab64 100644 --- a/lib/lambda/c3-send-agent-message/package-lock.json +++ b/lib/lambda/c3-send-agent-message/package-lock.json @@ -4,1195 +4,7 @@ "requires": true, "packages": { "": { - "name": "c3-send-agent-message", - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", - "integrity": "sha512-WsQhPHHK1yPfALcP1B7nBSGDzky6vFTUEXnUdfzb5Xy2cT+JTBTS6ChtQGqqOuGHDP/3t/9soqZ+L6rUCYBb/Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/client-sts": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.632.0.tgz", - "integrity": "sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.632.0.tgz", - "integrity": "sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.632.0.tgz", - "integrity": "sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", - "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.632.0.tgz", - "integrity": "sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.632.0.tgz", - "integrity": "sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.632.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.632.0.tgz", - "integrity": "sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==", - "dependencies": { - "@aws-sdk/client-sso": "3.632.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", - "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", - "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } + "name": "c3-send-agent-message" } } } diff --git a/lib/lambda/c3-send-agent-message/package.json b/lib/lambda/c3-send-agent-message/package.json index 9604b821..91f4bd0c 100644 --- a/lib/lambda/c3-send-agent-message/package.json +++ b/lib/lambda/c3-send-agent-message/package.json @@ -7,7 +7,5 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - } + "dependencies": {} } diff --git a/lib/lambda/c3-email-receipt/index.js b/lib/lambda/c3-send-receipt/index.js similarity index 53% rename from lib/lambda/c3-email-receipt/index.js rename to lib/lambda/c3-send-receipt/index.js index e812b2a4..9a00ffdd 100644 --- a/lib/lambda/c3-email-receipt/index.js +++ b/lib/lambda/c3-send-receipt/index.js @@ -1,9 +1,4 @@ -import { - SecretsManagerClient, - GetSecretValueCommand, -} from '@aws-sdk/client-secrets-manager'; - -let c3ApiKey = ''; +import { getAPIKey } from '/opt/nodejs/c3.js'; /** * @type {import ('aws-lambda').Handler} @@ -15,32 +10,10 @@ export async function handler(event) { let contactAttributes = {}; contactAttributes = event.Details.ContactData.Attributes; - // Get the API key. - if (!c3ApiKey) { - const secretsManagerClient = new SecretsManagerClient(); - const getSecretValueCommand = new GetSecretValueCommand({ - SecretId: process.env.C3_API_KEY_SECRET_ID, - }); - c3ApiKey = (await secretsManagerClient.send(getSecretValueCommand)) - .SecretString; - if (!c3ApiKey) { - throw new Error( - `No value found for ${process.env.C3_API_KEY_SECRET_ID} secret.`, - ); - } - if (c3ApiKey === '') { - throw new Error( - `Value for ${process.env.C3_API_KEY_SECRET_ID} secret is not set.`, - ); - } - } else { - console.log('Using API key in memory.'); - } - // Email the receipt. const transactionId = contactAttributes.TransactionId; const emailAddress = contactAttributes.Email; - await emailReceipt(transactionId, emailAddress); + await sendReceiptEmail(transactionId, emailAddress); } /** @@ -49,7 +22,11 @@ export async function handler(event) { * @param {string} transactionId The ID of the transaction. * @param {string} emailAddress The email address to send the receipt to. */ -async function emailReceipt(transactionId, emailAddress) { +async function sendReceiptEmail(transactionId, emailAddress) { + // Get the API key. + const c3ApiKey = await getAPIKey(); + + // Email the receipt. const response = await fetch(`${process.env.C3_BASE_URL}/email-receipt`, { method: 'POST', headers: { @@ -65,3 +42,13 @@ async function emailReceipt(transactionId, emailAddress) { throw new Error(`Failed to email receipt: ${response.statusText}`); } } + +/** + * Sends a receipt SMS for a transaction. + * + * @param {string} transactionId The ID of the transaction. + * @param {string} phoneNumber The phone number to send the receipt to. + */ +async function sendReceiptSms(transactionId, phoneNumber) { + // TODO: Implement this function. +} diff --git a/lib/lambda/c3-send-receipt/jsconfig.json b/lib/lambda/c3-send-receipt/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-send-receipt/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-send-receipt/package-lock.json b/lib/lambda/c3-send-receipt/package-lock.json new file mode 100644 index 00000000..1149c178 --- /dev/null +++ b/lib/lambda/c3-send-receipt/package-lock.json @@ -0,0 +1,11 @@ +{ + "name": "c3-send-receipt", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "c3-send-receipt", + "devDependencies": {} + } + } +} diff --git a/lib/lambda/c3-email-receipt/package.json b/lib/lambda/c3-send-receipt/package.json similarity index 65% rename from lib/lambda/c3-email-receipt/package.json rename to lib/lambda/c3-send-receipt/package.json index 7712338d..820e6c90 100644 --- a/lib/lambda/c3-email-receipt/package.json +++ b/lib/lambda/c3-send-receipt/package.json @@ -1,5 +1,5 @@ { - "name": "c3-email-receipt", + "name": "c3-send-receipt", "author": "Customer Dynamics", "main": "index.js", "private": true, @@ -7,8 +7,6 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, + "dependencies": {}, "devDependencies": {} } diff --git a/lib/lambda/c3-submit-payment/index.js b/lib/lambda/c3-submit-payment/index.js index 884f85e2..0c169b64 100644 --- a/lib/lambda/c3-submit-payment/index.js +++ b/lib/lambda/c3-submit-payment/index.js @@ -1,9 +1,4 @@ -import { - SecretsManagerClient, - GetSecretValueCommand, -} from '@aws-sdk/client-secrets-manager'; - -let c3ApiKey = ''; +import { getAPIKey } from '/opt/nodejs/c3.js'; /** * @type {import ('aws-lambda').Handler} @@ -25,28 +20,6 @@ export async function handler(event) { } const paymentMethod = contactAttributes.PaymentMethod; - // Get the API key. - if (!c3ApiKey) { - const secretsManagerClient = new SecretsManagerClient(); - const getSecretValueCommand = new GetSecretValueCommand({ - SecretId: process.env.C3_API_KEY_SECRET_ID, - }); - c3ApiKey = (await secretsManagerClient.send(getSecretValueCommand)) - .SecretString; - if (!c3ApiKey) { - throw new Error( - `No value found for ${process.env.C3_API_KEY_SECRET_ID} secret.`, - ); - } - if (c3ApiKey === '') { - throw new Error( - `Value for ${process.env.C3_API_KEY_SECRET_ID} secret is not set.`, - ); - } - } else { - console.log('Using API key in memory.'); - } - // Post the transaction. let paymentInfo = { name: contactAttributes.ContactName, @@ -78,10 +51,18 @@ export async function handler(event) { ); console.log('Post transaction response:', response); + // Get the last 4 digits of the card number or the bank account number. + const maskedNumber = + paymentMethod === 'Card' + ? response.transaction.cardNumber + : response.transaction.bankAccountNumber; + const endingDigits = maskedNumber.slice(-4); + return { TransactionApproved: response.transactionApproved, TransactionId: response.transaction.id, TransactionMeta: response.transactionMeta, + PaymentMethodEndingDigits: endingDigits, }; } @@ -93,6 +74,10 @@ export async function handler(event) { * @returns {*} Information about the transaction. */ async function postTransaction(paymentRequestId, paymentInfo) { + // Get the API key. + const c3ApiKey = await getAPIKey(); + + // Post the transaction. const postTransactionResponse = await fetch( `${process.env.C3_BASE_URL}/post-credit-transaction`, { diff --git a/lib/lambda/c3-submit-payment/jsconfig.json b/lib/lambda/c3-submit-payment/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-submit-payment/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-submit-payment/package-lock.json b/lib/lambda/c3-submit-payment/package-lock.json index 2b0c8d63..510e8f44 100644 --- a/lib/lambda/c3-submit-payment/package-lock.json +++ b/lib/lambda/c3-submit-payment/package-lock.json @@ -5,1195 +5,7 @@ "packages": { "": { "name": "c3-submit-payment", - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, "devDependencies": {} - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", - "integrity": "sha512-WsQhPHHK1yPfALcP1B7nBSGDzky6vFTUEXnUdfzb5Xy2cT+JTBTS6ChtQGqqOuGHDP/3t/9soqZ+L6rUCYBb/Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/client-sts": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.632.0.tgz", - "integrity": "sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.632.0.tgz", - "integrity": "sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/client-sts": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.632.0.tgz", - "integrity": "sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.629.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", - "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", - "dependencies": { - "@smithy/core": "^2.3.2", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", - "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.632.0.tgz", - "integrity": "sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.632.0.tgz", - "integrity": "sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.632.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.620.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", - "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.632.0.tgz", - "integrity": "sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==", - "dependencies": { - "@aws-sdk/client-sso": "3.632.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", - "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.621.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", - "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", - "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", - "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", - "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", - "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", - "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sso-oidc": "^3.614.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", - "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", - "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.568.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", - "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.609.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", - "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", - "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@smithy/abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", - "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", - "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-config-provider": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", - "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", - "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", - "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/hash-node": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", - "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", - "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", - "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", - "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", - "dependencies": { - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", - "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", - "dependencies": { - "@smithy/middleware-serde": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-middleware": "^3.0.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", - "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/service-error-classification": "^3.0.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", - "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", - "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", - "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", - "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", - "dependencies": { - "@smithy/abort-controller": "^3.1.1", - "@smithy/protocol-http": "^4.1.0", - "@smithy/querystring-builder": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", - "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", - "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", - "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "@smithy/util-uri-escape": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", - "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", - "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", - "dependencies": { - "@smithy/types": "^3.3.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", - "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", - "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-uri-escape": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "3.1.12", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", - "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", - "dependencies": { - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", - "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", - "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", - "dependencies": { - "@smithy/querystring-parser": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-base64": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", - "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", - "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", - "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", - "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", - "dependencies": { - "@smithy/is-array-buffer": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", - "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", - "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", - "dependencies": { - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", - "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", - "dependencies": { - "@smithy/config-resolver": "^3.0.5", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", - "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", - "dependencies": { - "@smithy/node-config-provider": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", - "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", - "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", - "dependencies": { - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", - "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", - "dependencies": { - "@smithy/service-error-classification": "^3.0.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", - "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", - "dependencies": { - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/types": "^3.3.0", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-buffer-from": "^3.0.0", - "@smithy/util-hex-encoding": "^3.0.0", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", - "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/bowser": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" - }, - "node_modules/fast-xml-parser": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", - "integrity": "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - }, - { - "type": "paypal", - "url": "https://paypal.me/naturalintelligence" - } - ], - "dependencies": { - "strnum": "^1.0.5" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } } } } diff --git a/lib/lambda/c3-submit-payment/package.json b/lib/lambda/c3-submit-payment/package.json index b766e05c..cc6297c5 100644 --- a/lib/lambda/c3-submit-payment/package.json +++ b/lib/lambda/c3-submit-payment/package.json @@ -7,8 +7,6 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, - "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, + "dependencies": {}, "devDependencies": {} } diff --git a/lib/lambda/c3-tokenize-transaction/index.js b/lib/lambda/c3-tokenize-transaction/index.js index dd16226d..80f763dd 100644 --- a/lib/lambda/c3-tokenize-transaction/index.js +++ b/lib/lambda/c3-tokenize-transaction/index.js @@ -1,20 +1,8 @@ -import { - buildClient, - CommitmentPolicy, - RawRsaKeyringNode, -} from '@aws-crypto/client-node'; - +import { decryptData } from '/opt/nodejs/decryption.js'; import { PaymentGateway } from './gateways/payment-gateway.js'; -import { - GetSecretValueCommand, - SecretsManagerClient, -} from '@aws-sdk/client-secrets-manager'; const REDACTED = 'REDACTED'; -const { decrypt } = buildClient(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT); -let c3PrivateKey; - /** * @type {import ('aws-lambda').Handler} */ @@ -36,7 +24,6 @@ export async function handler(event) { (expirationDate && expirationDate !== REDACTED) ) { paymentMethod = 'Card'; - expirationDate = expirationDate.padStart(4, '0'); // Add any missing leading zeroes to expiration date. } else if ( (encryptedAccountNumber && encryptedAccountNumber !== REDACTED) || (routingNumber && routingNumber !== REDACTED) @@ -52,55 +39,10 @@ export async function handler(event) { } console.debug('Payment method:', paymentMethod); - // Get the security key ID. - console.log('Getting security key ID...'); - const keyId = process.env.CONNECT_SECURITY_KEY_ID; - if (!keyId) { - console.error('CONNECT_SECURITY_KEY_ID is not set.'); - throw new Error( - 'CONNECT_SECURITY_KEY_ID is not set. This is the key ID From Amazon Connect.', - ); - } - - // Get the private key. - if (!c3PrivateKey) { - const secretsManagerClient = new SecretsManagerClient(); - const getSecretValueCommand = new GetSecretValueCommand({ - SecretId: process.env.C3_PRIVATE_KEY_SECRET_ID, - }); - c3PrivateKey = (await secretsManagerClient.send(getSecretValueCommand)) - .SecretString; - if (!c3PrivateKey) { - throw new Error( - `No value found for ${process.env.C3_PRIVATE_KEY_SECRET_ID} secret.`, - ); - } - if (c3PrivateKey === '') { - throw new Error( - `Value for ${process.env.C3_PRIVATE_KEY_SECRET_ID} secret is not set.`, - ); - } - } else { - console.log('Using private key in memory.'); - } - - // Create the keyring. - console.log('Creating keyring...'); - const keyring = new RawRsaKeyringNode({ - keyName: keyId, - keyNamespace: 'AmazonConnect', - rsaKey: { - privateKey: c3PrivateKey, - }, - oaepHash: 'sha512', - }); - // Decrypt the card or account number. const encryptedData = paymentMethod === 'Card' ? encryptedCardNumber : encryptedAccountNumber; - console.log('Decrypting data...'); - const decryptedData = await decryptData(encryptedData, keyring); - console.log('Successfully decrypted data.'); + const decryptedData = await decryptData(encryptedData); try { // Tokenize the payment information. @@ -130,22 +72,3 @@ export async function handler(event) { }; } } - -/** - * Decrypts data. - * - * @param {string} encryptedData The encrypted data to decrypt. - * @param {RawRsaKeyringNode} keyring The keyring to use for decryption. - * @returns {Promise} The decrypted data. Sensitive! - */ -async function decryptData(encryptedData, keyring) { - const decryptedDataBytes = await decrypt( - keyring, - Buffer.from(encryptedData, 'base64'), - ); - const decryptedData = decryptedDataBytes.plaintext.toString(); - if (!decryptedData || decryptedData.length < 1) { - throw new Error('No data found in the encrypted data.'); - } - return decryptedData; -} diff --git a/lib/lambda/c3-tokenize-transaction/jsconfig.json b/lib/lambda/c3-tokenize-transaction/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-tokenize-transaction/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-tokenize-transaction/package-lock.json b/lib/lambda/c3-tokenize-transaction/package-lock.json index b51efe6f..268454a9 100644 --- a/lib/lambda/c3-tokenize-transaction/package-lock.json +++ b/lib/lambda/c3-tokenize-transaction/package-lock.json @@ -6,162 +6,7 @@ "": { "name": "c3-tokenize-transaction", "dependencies": { - "@aws-crypto/client-node": "^4.0.0", - "@aws-sdk/client-secrets-manager": "^3.632.0" - } - }, - "node_modules/@aws-crypto/cache-material": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/cache-material/-/cache-material-4.0.0.tgz", - "integrity": "sha512-14m9QPzgMJZ2QdbiM7LCMKgqmONx+/9+Zm5YlXJmhP6Ue+qgniCs5MBOT99WKF50sihcjlA8cVbOUBBJh9t1mg==", - "dependencies": { - "@aws-crypto/material-management": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "@types/lru-cache": "^5.1.0", - "lru-cache": "^6.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/caching-materials-manager-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/caching-materials-manager-node/-/caching-materials-manager-node-4.0.0.tgz", - "integrity": "sha512-uPhbFMyiHImEsYIZRuzwMO/VS/tzdUMKCN+p9/Hg5I2r97riqPU5ukfjA8whAsVygGNWRuhlnrwBdjwRE+MZuw==", - "dependencies": { - "@aws-crypto/cache-material": "^4.0.0", - "@aws-crypto/material-management-node": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/client-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/client-node/-/client-node-4.0.0.tgz", - "integrity": "sha512-hsYDRSY2MSaAS5AcToR4oSS3sZINVXlOIutJzNkLSLEJuiYwiycJJrILRDCQJk+G6XhT7oJeqbmxFjRA7X83KA==", - "dependencies": { - "@aws-crypto/caching-materials-manager-node": "^4.0.0", - "@aws-crypto/decrypt-node": "^4.0.0", - "@aws-crypto/encrypt-node": "^4.0.0", - "@aws-crypto/kms-keyring-node": "^4.0.0", - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-crypto/raw-aes-keyring-node": "^4.0.0", - "@aws-crypto/raw-rsa-keyring-node": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/decrypt-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/decrypt-node/-/decrypt-node-4.0.0.tgz", - "integrity": "sha512-8xJ0Bjr0l4sBKpNM+zxAqfgUlcZxb/Jqj8IOTzL5IXEO301KH/qNJ1saI37Epmb0v9iKfmCou1D8pu9Y9GnuMw==", - "dependencies": { - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "@types/duplexify": "^3.6.0", - "duplexify": "^4.1.1", - "readable-stream": "^3.6.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/encrypt-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/encrypt-node/-/encrypt-node-4.0.0.tgz", - "integrity": "sha512-p/iSjYh3u4KFet9vmlnGn2YYf+j3aTQxh5SoxpkxnzSVvH3Sc/Ul5mPu13hIatIjrpnJGH5JNdT98igtsatWxA==", - "dependencies": { - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "@types/duplexify": "^3.6.0", - "duplexify": "^4.1.1", - "readable-stream": "^3.6.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/hkdf-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/hkdf-node/-/hkdf-node-4.0.0.tgz", - "integrity": "sha512-FytH3TF9c0OP+vnicc4YJoxoFoLajdRzzuRchDHmh4yXk32lj/HzgXGPfj+kSyy0chkh4XVONh2/zMRmqsA/hQ==", - "dependencies": { - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/kms-keyring": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/kms-keyring/-/kms-keyring-4.0.0.tgz", - "integrity": "sha512-05jqVPbgzZA3R5ZBZznUtc3T9SNAdaLptRU4bnwHeB5kxrhTU8vT+Mabp9vvqhdRauPkZMZvWpvTSWIyDXiYdA==", - "dependencies": { - "@aws-crypto/material-management": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/kms-keyring-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/kms-keyring-node/-/kms-keyring-node-4.0.0.tgz", - "integrity": "sha512-O3zjC4njVEUrgRUOpFlr4vkbGX1D2XBS9tBMJeBh5VR2Rr/j0ogiEMed6iG1VaFx3ulZ/9Ozq7VxlZxyNCx0fg==", - "dependencies": { - "@aws-crypto/kms-keyring": "^4.0.0", - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-sdk/client-kms": "^3.362.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/material-management": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/material-management/-/material-management-4.0.0.tgz", - "integrity": "sha512-1hVZVxIZBc47h599h6jiBkNJnPvckvk1CSDZ9Bi/aCsqVYDFza9frki7+dOsMJu5zYB0cL/H3u1MtuUZEDlsXw==", - "dependencies": { - "asn1.js": "^5.3.0", - "bn.js": "^5.1.1", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/material-management-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/material-management-node/-/material-management-node-4.0.0.tgz", - "integrity": "sha512-urGhjEibLj3atMeUl8RjqmADN8cvTFFhQixvjvoQItU90t4LTPCaHBm+f52QHNhAmGEzBcKFcNBeItNTsed/Cg==", - "dependencies": { - "@aws-crypto/hkdf-node": "^4.0.0", - "@aws-crypto/material-management": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/raw-aes-keyring-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/raw-aes-keyring-node/-/raw-aes-keyring-node-4.0.0.tgz", - "integrity": "sha512-ioXTDkEkVldm8Hmq8o1oWWdAlNz9OHiz7lMaWcAtDBJ+FDuf4pwmgX4sZyYyfs2JHhNDy9gq+L4xPp/oVIoNBw==", - "dependencies": { - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-crypto/raw-keyring": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/raw-keyring": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/raw-keyring/-/raw-keyring-4.0.0.tgz", - "integrity": "sha512-Iw+WxKWM4YWAfL5xAB8wNXoCIRJr3ohH1OaGUNP5bKTR2IxDB9ALsRxdI9f61DIwWFsHAgsjIH2qecbW4RDC3Q==", - "dependencies": { - "@aws-crypto/material-management": "^4.0.0", - "@aws-crypto/serialize": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/raw-rsa-keyring-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/raw-rsa-keyring-node/-/raw-rsa-keyring-node-4.0.0.tgz", - "integrity": "sha512-o1wCF8gRStr3tIMYeu46u+gYPexvNQ+JDaLzGqe9nH0dRXADDG9w5NSdx0kVmFAMvLUgJJyULcwKU2e7o4Ucpg==", - "dependencies": { - "@aws-crypto/material-management-node": "^4.0.0", - "@aws-crypto/raw-keyring": "^4.0.0", - "tslib": "^2.2.0" - } - }, - "node_modules/@aws-crypto/serialize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/serialize/-/serialize-4.0.0.tgz", - "integrity": "sha512-bi3h2KA+vktnWDG2q/J7Pjgg0MsSgsytH4ZfDztj9KgKRIp9Jq0z8KcIpNK47osNG4MxOjjgqXCZsxp1bnIwjQ==", - "dependencies": { - "@aws-crypto/material-management": "^4.0.0", - "asn1.js": "^5.3.0", - "bn.js": "^5.1.1", - "tslib": "^2.2.0" + "@aws-sdk/client-secrets-manager": "^3.624.0" } }, "node_modules/@aws-crypto/sha256-browser": { @@ -279,57 +124,6 @@ "node": ">=14.0.0" } }, - "node_modules/@aws-sdk/client-kms": { - "version": "3.621.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.621.0.tgz", - "integrity": "sha512-JFCivEF+Yvi+gAz+qIp8FLnpyDWpoZ5rYNO5lScapwJKX+EQMOxbqAWCL957fosn22xR7GoWvm78D49QKJQGpg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.621.0", - "@aws-sdk/client-sts": "3.621.0", - "@aws-sdk/core": "3.621.0", - "@aws-sdk/credential-provider-node": "3.621.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.1", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.13", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.11", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.13", - "@smithy/util-defaults-mode-node": "^3.0.13", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/client-secrets-manager": { "version": "3.632.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", @@ -667,6 +461,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.621.0.tgz", "integrity": "sha512-xpKfikN4u0BaUYZA9FGUMkkDmfoIP0Q03+A86WjqDWhcOoqNA1DkHsE4kZ+r064ifkPUfcNuUvlkVTEoBZoFjA==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -715,6 +510,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.621.0.tgz", "integrity": "sha512-mMjk3mFUwV2Y68POf1BQMTF+F6qxt5tPu6daEUCNGC9Cenk3h2YXQQoS4/eSyYzuBiYk3vx49VgleRvdvkg8rg==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -767,6 +563,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.621.0.tgz", "integrity": "sha512-707uiuReSt+nAx6d0c21xLjLm2lxeKc7padxjv92CIrIocnQSlJPxSCM7r5zBhwiahJA6MNQwmTl2xznU67KgA==", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -817,6 +614,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.621.0.tgz", "integrity": "sha512-CtOwWmDdEiINkGXD93iGfXjN0WmCp9l45cDWHHGa8lRgEDyhuL7bwd/pH5aSzj0j8SiQBG2k0S7DHbd5RaqvbQ==", + "peer": true, "dependencies": { "@smithy/core": "^2.3.1", "@smithy/node-config-provider": "^3.1.4", @@ -850,6 +648,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.621.0.tgz", "integrity": "sha512-/jc2tEsdkT1QQAI5Dvoci50DbSxtJrevemwFsm0B73pwCcOQZ5ZwwSdVqGsPutzYzUVx3bcXg3LRL7jLACqRIg==", + "peer": true, "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/fetch-http-handler": "^3.2.4", @@ -869,6 +668,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.621.0.tgz", "integrity": "sha512-0EWVnSc+JQn5HLnF5Xv405M8n4zfdx9gyGdpnCmAmFqEDHA8LmBdxJdpUk1Ovp/I5oPANhjojxabIW5f1uU0RA==", + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.621.0", @@ -893,6 +693,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.621.0.tgz", "integrity": "sha512-4JqpccUgz5Snanpt2+53hbOBbJQrSFq7E1sAAbgY6BKVQUsW5qyXqnjvSF32kDeKa5JpBl3bBWLZl04IadcPHw==", + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.621.0", @@ -930,6 +731,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.621.0.tgz", "integrity": "sha512-Kza0jcFeA/GEL6xJlzR2KFf1PfZKMFnxfGzJzl5yN7EjoGdMijl34KaRyVnfRjnCWcsUpBWKNIDk9WZVMY9yiw==", + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.621.0", "@aws-sdk/token-providers": "3.614.0", @@ -1632,72 +1434,11 @@ "node": ">=16.0.0" } }, - "node_modules/@types/duplexify": { - "version": "3.6.4", - "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.4.tgz", - "integrity": "sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - }, - "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/fast-xml-parser": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", @@ -1719,85 +1460,6 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -1808,16 +1470,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", @@ -1829,16 +1481,6 @@ "bin": { "uuid": "dist/bin/uuid" } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } } diff --git a/lib/lambda/c3-tokenize-transaction/package.json b/lib/lambda/c3-tokenize-transaction/package.json index 422f0917..fea6a54f 100644 --- a/lib/lambda/c3-tokenize-transaction/package.json +++ b/lib/lambda/c3-tokenize-transaction/package.json @@ -8,7 +8,6 @@ "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "@aws-crypto/client-node": "^4.0.0", - "@aws-sdk/client-secrets-manager": "^3.632.0" + "@aws-sdk/client-secrets-manager": "^3.624.0" } } diff --git a/lib/lambda/c3-utils-layer/lib/nodejs/c3.js b/lib/lambda/c3-utils-layer/lib/nodejs/c3.js new file mode 100644 index 00000000..a8c84d46 --- /dev/null +++ b/lib/lambda/c3-utils-layer/lib/nodejs/c3.js @@ -0,0 +1,40 @@ +import { + GetSecretValueCommand, + SecretsManagerClient, +} from '@aws-sdk/client-secrets-manager'; + +let c3ApiKey = ''; + +/** + * Gets the C3 API key. + * + * @returns {Promise} The C3 API key. + */ +export async function getAPIKey() { + console.log('Getting C3 API key...'); + + // If the API key is already in memory, return it. + if (c3ApiKey) { + console.log('Found API key in memory.'); + return c3ApiKey; + } + + const secretsManagerClient = new SecretsManagerClient(); + const getSecretValueCommand = new GetSecretValueCommand({ + SecretId: process.env.C3_API_KEY_SECRET_ID, + }); + c3ApiKey = (await secretsManagerClient.send(getSecretValueCommand)) + .SecretString; + if (!c3ApiKey) { + throw new Error( + `No value found for ${process.env.C3_API_KEY_SECRET_ID} secret.`, + ); + } + if (c3ApiKey === '') { + throw new Error( + `Value for ${process.env.C3_API_KEY_SECRET_ID} secret is not set.`, + ); + } + console.log('Retrieved C3 API key from Secrets Manager.'); + return c3ApiKey; +} diff --git a/lib/lambda/c3-utils-layer/lib/nodejs/decryption.js b/lib/lambda/c3-utils-layer/lib/nodejs/decryption.js new file mode 100644 index 00000000..b9c52d73 --- /dev/null +++ b/lib/lambda/c3-utils-layer/lib/nodejs/decryption.js @@ -0,0 +1,85 @@ +import { + buildClient, + CommitmentPolicy, + RawRsaKeyringNode, +} from '@aws-crypto/client-node'; +import { + GetSecretValueCommand, + SecretsManagerClient, +} from '@aws-sdk/client-secrets-manager'; + +const { decrypt } = buildClient(CommitmentPolicy.FORBID_ENCRYPT_ALLOW_DECRYPT); +let c3PrivateKey; + +/** + * Decrypts data. + * + * @param {string} encryptedData The encrypted data to decrypt. + * @returns {Promise} The decrypted data. Sensitive! + */ +export async function decryptData(encryptedData) { + // If there is no encrypted data, just return an empty string. + if (!encryptedData) { + return ''; + } + + // Get the security key ID. + console.log('Getting security key ID...'); + const keyId = process.env.CONNECT_SECURITY_KEY_ID; + if (!keyId) { + console.error('CONNECT_SECURITY_KEY_ID is not set.'); + throw new Error( + 'CONNECT_SECURITY_KEY_ID is not set. This is the key ID From Amazon Connect.', + ); + } + console.log('Retrieved security key ID.'); + + // Get the private key. + if (!c3PrivateKey) { + console.log('Getting private key from Secrets Manager...'); + const secretsManagerClient = new SecretsManagerClient(); + const getSecretValueCommand = new GetSecretValueCommand({ + SecretId: process.env.C3_PRIVATE_KEY_SECRET_ID, + }); + c3PrivateKey = (await secretsManagerClient.send(getSecretValueCommand)) + .SecretString; + if (!c3PrivateKey) { + throw new Error( + `No value found for ${process.env.C3_PRIVATE_KEY_SECRET_ID} secret.`, + ); + } + if (c3PrivateKey === '') { + throw new Error( + `Value for ${process.env.C3_PRIVATE_KEY_SECRET_ID} secret is not set.`, + ); + } + console.log('Retrieved private key from Secrets Manager.'); + } else { + console.log('Using private key in memory.'); + } + + // Create the keyring. + console.log('Creating keyring...'); + const keyring = new RawRsaKeyringNode({ + keyName: keyId, + keyNamespace: 'AmazonConnect', + rsaKey: { + privateKey: c3PrivateKey, + }, + oaepHash: 'sha512', + }); + console.log('Created keyring.'); + + // Decrypt the data. + console.log('Decrypting data...'); + const decryptedDataBytes = await decrypt( + keyring, + Buffer.from(encryptedData, 'base64'), + ); + const decryptedData = decryptedDataBytes.plaintext.toString(); + if (!decryptedData || decryptedData.length < 1) { + throw new Error('No data found in the encrypted data.'); + } + console.log('Successfully decrypted data.'); + return decryptedData; +} diff --git a/lib/lambda/c3-email-receipt/package-lock.json b/lib/lambda/c3-utils-layer/lib/nodejs/package-lock.json similarity index 66% rename from lib/lambda/c3-email-receipt/package-lock.json rename to lib/lambda/c3-utils-layer/lib/nodejs/package-lock.json index 42f97f50..d703854e 100644 --- a/lib/lambda/c3-email-receipt/package-lock.json +++ b/lib/lambda/c3-utils-layer/lib/nodejs/package-lock.json @@ -1,19 +1,188 @@ { - "name": "c3-email-receipt", + "name": "c3-utils-layer", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "c3-email-receipt", + "name": "c3-utils-layer", "dependencies": { - "@aws-sdk/client-secrets-manager": "^3.632.0" - }, - "devDependencies": {} + "@aws-crypto/client-node": "^4.0.1", + "@aws-sdk/client-secrets-manager": "^3.624.0" + } + }, + "node_modules/@aws-crypto/cache-material": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/cache-material/-/cache-material-4.0.1.tgz", + "integrity": "sha512-3o5EFv1H2JOKdIYbgQuegSyOgqZaIqx75/FKjlQMfoCp1FwivbKyUWje/KRobl7cJuHiIgVix0/UrMG6PAm1zA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "@types/lru-cache": "^5.1.0", + "lru-cache": "^6.0.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/caching-materials-manager-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/caching-materials-manager-node/-/caching-materials-manager-node-4.0.1.tgz", + "integrity": "sha512-NFdKIWyQa0r+z2jjuwow8UkGA+iiZj0WX76EspOBiLiY9PcLsczsPUwSD3QR4hipldptaC18t9h2HQrWGtiwMA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/cache-material": "^4.0.1", + "@aws-crypto/material-management-node": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/client-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/client-node/-/client-node-4.0.1.tgz", + "integrity": "sha512-tKd63z1m761HVFzIV6RMR+GsMWEaY5ETUhl5B+tIxSbRmfipwZ/VS65camZOpTjg9lZQupAzWftTgeDzBCbhnw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/caching-materials-manager-node": "^4.0.1", + "@aws-crypto/decrypt-node": "^4.0.1", + "@aws-crypto/encrypt-node": "^4.0.1", + "@aws-crypto/kms-keyring-node": "^4.0.1", + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-crypto/raw-aes-keyring-node": "^4.0.1", + "@aws-crypto/raw-rsa-keyring-node": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/decrypt-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/decrypt-node/-/decrypt-node-4.0.1.tgz", + "integrity": "sha512-y4k8lht/d1twedcncdtXeVTBuLFLDPRWffnDabNQfQBh1ZkYa7G++bO006t0RPlMS1Qi3yb8NcgpNoQHmrk0Aw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "@types/duplexify": "^3.6.0", + "duplexify": "^4.1.1", + "readable-stream": "^3.6.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/encrypt-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/encrypt-node/-/encrypt-node-4.0.1.tgz", + "integrity": "sha512-NZ9X9g/A7BV4UNrysRbOCQ4oHB3EkYVmsCt7tgCh+Dd28fknxJIHfJ6nZiI+9ey0lbkl5Tin/fn9eVR/vjYN2Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "@types/duplexify": "^3.6.0", + "duplexify": "^4.1.3", + "readable-stream": "^3.6.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/hkdf-node": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@aws-crypto/hkdf-node/-/hkdf-node-4.0.0.tgz", + "integrity": "sha512-FytH3TF9c0OP+vnicc4YJoxoFoLajdRzzuRchDHmh4yXk32lj/HzgXGPfj+kSyy0chkh4XVONh2/zMRmqsA/hQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/kms-keyring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/kms-keyring/-/kms-keyring-4.0.1.tgz", + "integrity": "sha512-v3xB6Bpqo4nw9E5e/ShepFQmDvox2KhIBQK9hSspT1pnwEJtYHkdE1z+gvJJPqCRT2ujQ6R6CUXuSZ2Qk2reXg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/kms-keyring-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/kms-keyring-node/-/kms-keyring-node-4.0.1.tgz", + "integrity": "sha512-actQVBnhUa13m3EcZUNIZhIxls40C2GviW2k+cWpyH0/Zunv7XKVSzhWPmGndhqe1ZB7aZWaoeWdgIFxdXiiUw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/kms-keyring": "^4.0.1", + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-sdk/client-kms": "^3.362.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/material-management": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/material-management/-/material-management-4.0.1.tgz", + "integrity": "sha512-0joCJ3QlU3cIucsX4C14jBA7aXE3UuePLZaHYrpAeCY2cWv9BqyFNwZd1YhsGu9MksHFHZxDukdTndDIFvnK9g==", + "license": "Apache-2.0", + "dependencies": { + "asn1.js": "^5.3.0", + "bn.js": "^5.1.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/material-management-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/material-management-node/-/material-management-node-4.0.1.tgz", + "integrity": "sha512-kH/l6XS0uS1xoYt1WmmtEI6b5suiUOb2ibs1YmzsOJh28bd0SEGofuUWkO8LV2qwwrlsFce12gXf6/8G1HcqkQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/hkdf-node": "^4.0.0", + "@aws-crypto/material-management": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/raw-aes-keyring-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/raw-aes-keyring-node/-/raw-aes-keyring-node-4.0.1.tgz", + "integrity": "sha512-qVkhocO0fN9dWv8+hBuEQn6XO7Rp79jPpN8Tw9hLEFpGonkZdNbBp4O7s2c5Nn1G4VMCHvTNHmkjZm7/lcAPzw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-crypto/raw-keyring": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/raw-keyring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/raw-keyring/-/raw-keyring-4.0.1.tgz", + "integrity": "sha512-scOSi1BP+uiwsKTvlAoNKXfv4eI9b7bcy+Fkyc3Ci7S5jzqua2OwnmNXanBHPcF4W/ziHhZJ5K2Vm84iz8gz/Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management": "^4.0.1", + "@aws-crypto/serialize": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/raw-rsa-keyring-node": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/raw-rsa-keyring-node/-/raw-rsa-keyring-node-4.0.1.tgz", + "integrity": "sha512-UZUKTH14dnfGpjD7/+tMHEIJpi6w3vcPJ90+Ipa8daNEE1PdVb33nXpzfcqmi9Oyhmhpwmfd1xzZ/drobCTVMA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management-node": "^4.0.1", + "@aws-crypto/raw-keyring": "^4.0.1", + "tslib": "^2.2.0" + } + }, + "node_modules/@aws-crypto/serialize": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@aws-crypto/serialize/-/serialize-4.0.1.tgz", + "integrity": "sha512-Axd/lRGxbUgsAAO7TH/3QrzpozkfthpR9e4cY1HZzmvsZRNBpgj9CkwrGsDmuRNFMMvS7XQNXJ3cfFkn3S+toQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/material-management": "^4.0.1", + "asn1.js": "^5.3.0", + "bn.js": "^5.1.1", + "tslib": "^2.2.0" + } }, "node_modules/@aws-crypto/sha256-browser": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", @@ -28,6 +197,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -39,6 +209,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -51,6 +222,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -63,6 +235,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", @@ -76,6 +249,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } @@ -84,6 +258,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", @@ -94,6 +269,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -105,6 +281,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" @@ -117,6 +294,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" @@ -125,24 +303,77 @@ "node": ">=14.0.0" } }, + "node_modules/@aws-sdk/client-kms": { + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-kms/-/client-kms-3.631.0.tgz", + "integrity": "sha512-lLTt8qsMrgaIrAU95FilmRiaAzGtrpXkI0PKsK3KjDgvmMXgq9RIGrxae/EaPardIgi76NHydUWb3zqeinTIjw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.631.0", + "@aws-sdk/client-sts": "3.631.0", + "@aws-sdk/core": "3.629.0", + "@aws-sdk/credential-provider-node": "3.631.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.631.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.631.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.3.2", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", + "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.1.12", + "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.14", + "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.632.0.tgz", - "integrity": "sha512-WsQhPHHK1yPfALcP1B7nBSGDzky6vFTUEXnUdfzb5Xy2cT+JTBTS6ChtQGqqOuGHDP/3t/9soqZ+L6rUCYBb/Q==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.631.0.tgz", + "integrity": "sha512-wNLWR3nohNeEkF3IPAAstvJT0rGTJ8RCpB3naPbdhbRoFwMRgzlvjtpPvLN19jJlvrHtpujISZAKrm7j01i8Yg==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", - "@aws-sdk/client-sts": "3.632.0", + "@aws-sdk/client-sso-oidc": "3.631.0", + "@aws-sdk/client-sts": "3.631.0", "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", + "@aws-sdk/credential-provider-node": "3.631.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", + "@aws-sdk/middleware-user-agent": "3.631.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", + "@aws-sdk/util-endpoints": "3.631.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -178,9 +409,10 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.632.0.tgz", - "integrity": "sha512-iYWHiKBz44m3chCFvtvHnvCpL2rALzyr1e6tOZV3dLlOKtQtDUlPy6OtnXDu4y+wyJCniy8ivG3+LAe4klzn1Q==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.631.0.tgz", + "integrity": "sha512-tpXRQMbbTsKED6GGF0rZbg9Nr0DRCWImopX2lVh4deIeHQfNxeOtq2brqDWiPD593I190xeL/HMChSOmvDXNAw==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -188,10 +420,10 @@ "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", + "@aws-sdk/middleware-user-agent": "3.631.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", + "@aws-sdk/util-endpoints": "3.631.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -226,21 +458,22 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.632.0.tgz", - "integrity": "sha512-Oh1fIWaoZluihOCb/zDEpRTi+6an82fgJz7fyRBugyLhEtDjmvpCQ3oKjzaOhoN+4EvXAm1ZS/ZgpvXBlIRTgw==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.631.0.tgz", + "integrity": "sha512-afJAssIvsHibVq65qO3Q31NCfSTsPEnyr+PT80uGVAkKev1PJI1AjsxBGUTLtPMV8lrzDzDx5CG9ax1AZ3LG6w==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", + "@aws-sdk/credential-provider-node": "3.631.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", + "@aws-sdk/middleware-user-agent": "3.631.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", + "@aws-sdk/util-endpoints": "3.631.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -274,26 +507,27 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" + "@aws-sdk/client-sts": "^3.631.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.632.0.tgz", - "integrity": "sha512-Ss5cBH09icpTvT+jtGGuQlRdwtO7RyE9BF4ZV/CEPATdd9whtJt4Qxdya8BUnkWR7h5HHTrQHqai3YVYjku41A==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.631.0.tgz", + "integrity": "sha512-Zo/2XDrmNpnSRlQLL8XOCJxuN7UIrGKf4itdjHqtEmD2PqstnYe6IMeEVOELpZ8iktjvsIrVr+qxlIX1QlmgCQ==", + "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.632.0", + "@aws-sdk/client-sso-oidc": "3.631.0", "@aws-sdk/core": "3.629.0", - "@aws-sdk/credential-provider-node": "3.632.0", + "@aws-sdk/credential-provider-node": "3.631.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.632.0", + "@aws-sdk/middleware-user-agent": "3.631.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", + "@aws-sdk/util-endpoints": "3.631.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", @@ -331,6 +565,7 @@ "version": "3.629.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.629.0.tgz", "integrity": "sha512-+/ShPU/tyIBM3oY1cnjgNA/tFyHtlWq+wXF9xEKRv19NOpYbWQ+xzNwVjGq8vR07cCRqy/sDQLWPhxjtuV/FiQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/core": "^2.3.2", "@smithy/node-config-provider": "^3.1.4", @@ -351,6 +586,7 @@ "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.620.1.tgz", "integrity": "sha512-ExuILJ2qLW5ZO+rgkNRj0xiAipKT16Rk77buvPP8csR7kkCflT/gXTyzRe/uzIiETTxM7tr8xuO9MP/DQXqkfg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -365,6 +601,7 @@ "version": "3.622.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/fetch-http-handler": "^3.2.4", @@ -381,14 +618,15 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.632.0.tgz", - "integrity": "sha512-m6epoW41xa1ajU5OiHcmQHoGVtrbXBaRBOUhlCLZmcaqMLYsboM4iD/WZP8aatKEON5tTnVXh/4StV8D/+wemw==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.631.0.tgz", + "integrity": "sha512-34NmRl6GYlyKTHwiA3C3MjCtmXfoaOXI8b2h7P9eAC8leuIb/51v482g0K6X5P5FqaGY8ZreUq5BMsGjBRr1uQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.622.0", "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", + "@aws-sdk/credential-provider-sso": "3.631.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/credential-provider-imds": "^3.2.0", @@ -401,19 +639,20 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.632.0" + "@aws-sdk/client-sts": "^3.631.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.632.0.tgz", - "integrity": "sha512-cL8fuJWm/xQBO4XJPkeuZzl3XinIn9EExWgzpG48NRMKR5us1RI/ucv7xFbBBaG+r/sDR2HpYBIA3lVIpm1H3Q==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.631.0.tgz", + "integrity": "sha512-MlYcFknrMQ8RUVe0DMPE09mX8+97s7MLwnVV8l+LFi7m+ZfBz+h6LrohhOXC5elJHf4G3T0r/9Rwct63+zHK/w==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.632.0", + "@aws-sdk/credential-provider-ini": "3.631.0", "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.632.0", + "@aws-sdk/credential-provider-sso": "3.631.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/credential-provider-imds": "^3.2.0", @@ -430,6 +669,7 @@ "version": "3.620.1", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.620.1.tgz", "integrity": "sha512-hWqFMidqLAkaV9G460+1at6qa9vySbjQKKc04p59OT7lZ5cO5VH5S4aI05e+m4j364MBROjjk2ugNvfNf/8ILg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -442,11 +682,12 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.632.0.tgz", - "integrity": "sha512-P/4wB6j7ym5QCPTL2xlMfvf2NcXSh+z0jmsZP4WW/tVwab4hvgabPPbLeEZDSWZ0BpgtxKGvRq0GSHuGeirQbA==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.631.0.tgz", + "integrity": "sha512-k3Mj1Fc7faVOGR+qrwROir/8No35G7gbVL5FuY467x3y0ELa/6w0j/0HM+5eqzGABW7pSL/OHONhWKlYwg7Gkw==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.632.0", + "@aws-sdk/client-sso": "3.631.0", "@aws-sdk/token-providers": "3.614.0", "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -462,6 +703,7 @@ "version": "3.621.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.621.0.tgz", "integrity": "sha512-w7ASSyfNvcx7+bYGep3VBgC3K6vEdLmlpjT7nSIHxxQf+WSdvy+HynwJosrpZax0sK5q0D1Jpn/5q+r5lwwW6w==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -479,6 +721,7 @@ "version": "3.620.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.620.0.tgz", "integrity": "sha512-VMtPEZwqYrII/oUkffYsNWY9PZ9xpNJpMgmyU0rlDQ25O1c0Hk3fJmZRe6pEkAJ0omD7kLrqGl1DUjQVxpd/Rg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", @@ -493,6 +736,7 @@ "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.609.0.tgz", "integrity": "sha512-S62U2dy4jMDhDFDK5gZ4VxFdWzCtLzwbYyFZx2uvPYTECkepLUfzLic2BHg2Qvtu4QjX+oGE3P/7fwaGIsGNuQ==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -506,6 +750,7 @@ "version": "3.620.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.620.0.tgz", "integrity": "sha512-nh91S7aGK3e/o1ck64sA/CyoFw+gAYj2BDOnoNa6ouyCrVJED96ZXWbhye/fz9SgmNUZR2g7GdVpiLpMKZoI5w==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/protocol-http": "^4.1.0", @@ -517,12 +762,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.632.0.tgz", - "integrity": "sha512-yY/sFsHKwG9yzSf/DTclqWJaGPI2gPBJDCGBujSqTG1zlS7Ot4fqi91DZ6088BFWzbOorDzJFcAhAEFzc6LuQg==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.631.0.tgz", + "integrity": "sha512-mpFRFaP9fjXhw8NiRTP+lBPKRKMSKzfCyTXQXrQCSo4fAUaz8LPCc8VdqyoNmx4CLBTRflbEHLx5PfInA0DsrA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.632.0", + "@aws-sdk/util-endpoints": "3.631.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -535,6 +781,7 @@ "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.614.0.tgz", "integrity": "sha512-vDCeMXvic/LU0KFIUjpC3RiSTIkkvESsEfbVHiHH0YINfl8HnEqR5rj+L8+phsCeVg2+LmYwYxd5NRz4PHxt5g==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", @@ -551,6 +798,7 @@ "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.614.0.tgz", "integrity": "sha512-okItqyY6L9IHdxqs+Z116y5/nda7rHxLvROxtAJdLavWTYDydxrZstImNgGWTeVdmc0xX2gJCI77UYUTQWnhRw==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -569,6 +817,7 @@ "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.609.0.tgz", "integrity": "sha512-+Tqnh9w0h2LcrUsdXyT1F8mNhXz+tVYBtP19LpeEGntmvHwa2XzvLUCWpoIAIVsHp5+HdB2X9Sn0KAtmbFXc2Q==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -578,9 +827,10 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.632.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.632.0.tgz", - "integrity": "sha512-LlYMU8pAbcEQphOpE6xaNLJ8kPGhklZZTVzZVpVW477NaaGgoGTMYNXTABYHcxeF5E2lLrxql9OmVpvr8GWN8Q==", + "version": "3.631.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.631.0.tgz", + "integrity": "sha512-aavsyk17lK/r6rfVFYLh6/Y0eWvtbclWteJyW9PQLo5mpHPcTj6IbqMN4LHV27Y9IF7oOlbEAQ1CGTfpUlOvTg==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -595,6 +845,7 @@ "version": "3.568.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.568.0.tgz", "integrity": "sha512-3nh4TINkXYr+H41QaPelCceEB2FXP3fxp93YZXB/kqJvX0U9j0N0Uk45gvsjmEPzG8XxkPEeLIfT2I1M7A6Lig==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -606,6 +857,7 @@ "version": "3.609.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.609.0.tgz", "integrity": "sha512-fojPU+mNahzQ0YHYBsx0ZIhmMA96H+ZIZ665ObU9tl+SGdbLneVZVikGve+NmHTQwHzwkFsZYYnVKAkreJLAtA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -617,6 +869,7 @@ "version": "3.614.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.614.0.tgz", "integrity": "sha512-15ElZT88peoHnq5TEoEtZwoXTXRxNrk60TZNdpl/TUBJ5oNJ9Dqb5Z4ryb8ofN6nm9aFf59GVAerFDz8iUoHBA==", + "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/node-config-provider": "^3.1.4", @@ -639,6 +892,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.1.tgz", "integrity": "sha512-MBJBiidoe+0cTFhyxT8g+9g7CeVccLM0IOKKUMCNQ1CNMJ/eIfoo0RTfVrXOONEI1UCN1W+zkiHSbzUNE9dZtQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -651,6 +905,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.5.tgz", "integrity": "sha512-SkW5LxfkSI1bUC74OtfBbdz+grQXYiPYolyu8VfpLIjEoN/sHVBlLeGXMQ1vX4ejkgfv6sxVbQJ32yF2cl1veA==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", @@ -666,6 +921,7 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/@smithy/core/-/core-2.3.2.tgz", "integrity": "sha512-in5wwt6chDBcUv1Lw1+QzZxN9fBffi+qOixfb65yK4sDuKG7zAUO9HAFqmVzsZM3N+3tTyvZjtnDXePpvp007Q==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.14", @@ -684,6 +940,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.0.tgz", "integrity": "sha512-0SCIzgd8LYZ9EJxUjLXBmEKSZR/P/w6l7Rz/pab9culE/RWuqelAKGJvn5qUOl8BgX8Yj5HWM50A5hiB/RzsgA==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/property-provider": "^3.1.3", @@ -699,6 +956,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.4.tgz", "integrity": "sha512-kBprh5Gs5h7ug4nBWZi1FZthdqSM+T7zMmsZxx0IBvWUn7dK3diz2SHn7Bs4dQGFDk8plDv375gzenDoNwrXjg==", + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^4.1.0", "@smithy/querystring-builder": "^3.0.3", @@ -711,6 +969,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.3.tgz", "integrity": "sha512-2ctBXpPMG+B3BtWSGNnKELJ7SH9e4TNefJS0cd2eSkOOROeBnnVBnAy9LtJ8tY4vUEoe55N4CNPxzbWvR39iBw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-buffer-from": "^3.0.0", @@ -725,6 +984,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.3.tgz", "integrity": "sha512-ID1eL/zpDULmHJbflb864k72/SNOZCADRc9i7Exq3RUNJw6raWUSlFEQ+3PX3EYs++bTxZB2dE9mEHTQLv61tw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -734,6 +994,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz", "integrity": "sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -745,6 +1006,7 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.5.tgz", "integrity": "sha512-ILEzC2eyxx6ncej3zZSwMpB5RJ0zuqH7eMptxC4KN3f+v9bqT8ohssKbhNR78k/2tWW+KS5Spw+tbPF4Ejyqvw==", + "license": "Apache-2.0", "dependencies": { "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", @@ -758,6 +1020,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.1.0.tgz", "integrity": "sha512-5y5aiKCEwg9TDPB4yFE7H6tYvGFf1OJHNczeY10/EFF8Ir8jZbNntQJxMWNfeQjC1mxPsaQ6mR9cvQbf+0YeMw==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", @@ -775,6 +1038,7 @@ "version": "3.0.14", "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.14.tgz", "integrity": "sha512-7ZaWZJOjUxa5hgmuMspyt8v/zVsh0GXYuF7OvCmdcbVa/xbnKQoYC+uYKunAqRGTkxjOyuOCw9rmFUFOqqC0eQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/protocol-http": "^4.1.0", @@ -794,6 +1058,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.3.tgz", "integrity": "sha512-puUbyJQBcg9eSErFXjKNiGILJGtiqmuuNKEYNYfUD57fUl4i9+mfmThtQhvFXU0hCVG0iEJhvQUipUf+/SsFdA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -806,6 +1071,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.3.tgz", "integrity": "sha512-r4klY9nFudB0r9UdSMaGSyjyQK5adUyPnQN/ZM6M75phTxOdnc/AhpvGD1fQUvgmqjQEBGCwpnPbDm8pH5PapA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -818,6 +1084,7 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.4.tgz", "integrity": "sha512-YvnElQy8HR4vDcAjoy7Xkx9YT8xZP4cBXcbJSgm/kxmiQu08DwUwj8rkGnyoJTpfl/3xYHH+d8zE+eHqoDCSdQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^3.1.3", "@smithy/shared-ini-file-loader": "^3.1.4", @@ -832,6 +1099,7 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.1.4.tgz", "integrity": "sha512-+UmxgixgOr/yLsUxcEKGH0fMNVteJFGkmRltYFHnBMlogyFdpzn2CwqWmxOrfJELhV34v0WSlaqG1UtE1uXlJg==", + "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^3.1.1", "@smithy/protocol-http": "^4.1.0", @@ -847,6 +1115,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.3.tgz", "integrity": "sha512-zahyOVR9Q4PEoguJ/NrFP4O7SMAfYO1HLhB18M+q+Z4KFd4V2obiMnlVoUFzFLSPeVt1POyNWneHHrZaTMoc/g==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -859,6 +1128,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.0.tgz", "integrity": "sha512-dPVoHYQ2wcHooGXg3LQisa1hH0e4y0pAddPMeeUPipI1tEOqL6A4N0/G7abeq+K8wrwSgjk4C0wnD1XZpJm5aA==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -871,6 +1141,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.3.tgz", "integrity": "sha512-vyWckeUeesFKzCDaRwWLUA1Xym9McaA6XpFfAK5qI9DKJ4M33ooQGqvM4J+LalH4u/Dq9nFiC8U6Qn1qi0+9zw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "@smithy/util-uri-escape": "^3.0.0", @@ -884,6 +1155,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.3.tgz", "integrity": "sha512-zahM1lQv2YjmznnfQsWbYojFe55l0SLG/988brlLv1i8z3dubloLF+75ATRsqPBboUXsW6I9CPGE5rQgLfY0vQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -896,6 +1168,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.3.tgz", "integrity": "sha512-Jn39sSl8cim/VlkLsUhRFq/dKDnRUFlfRkvhOJaUbLBXUsLRLNf9WaxDv/z9BjuQ3A6k/qE8af1lsqcwm7+DaQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0" }, @@ -907,6 +1180,7 @@ "version": "3.1.4", "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.4.tgz", "integrity": "sha512-qMxS4hBGB8FY2GQqshcRUy1K6k8aBWP5vwm8qKkCT3A9K2dawUwOIJfqh9Yste/Bl0J2lzosVyrXDj68kLcHXQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -919,6 +1193,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.1.0.tgz", "integrity": "sha512-aRryp2XNZeRcOtuJoxjydO6QTaVhxx/vjaR+gx7ZjaFgrgPRyZ3HCTbfwqYj6ZWEBHkCSUfcaymKPURaByukag==", + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "@smithy/protocol-http": "^4.1.0", @@ -937,6 +1212,7 @@ "version": "3.1.12", "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.1.12.tgz", "integrity": "sha512-wtm8JtsycthkHy1YA4zjIh2thJgIQ9vGkoR639DBx5lLlLNU0v4GARpQZkr2WjXue74nZ7MiTSWfVrLkyD8RkA==", + "license": "Apache-2.0", "dependencies": { "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-stack": "^3.0.3", @@ -953,6 +1229,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/@smithy/types/-/types-3.3.0.tgz", "integrity": "sha512-IxvBBCTFDHbVoK7zIxqA1ZOdc4QfM5HM7rGleCuHi7L1wnKv5Pn69xXJQ9hgxH60ZVygH9/JG0jRgtUncE3QUA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -964,6 +1241,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.3.tgz", "integrity": "sha512-pw3VtZtX2rg+s6HMs6/+u9+hu6oY6U7IohGhVNnjbgKy86wcIsSZwgHrFR+t67Uyxvp4Xz3p3kGXXIpTNisq8A==", + "license": "Apache-2.0", "dependencies": { "@smithy/querystring-parser": "^3.0.3", "@smithy/types": "^3.3.0", @@ -974,6 +1252,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz", "integrity": "sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "@smithy/util-utf8": "^3.0.0", @@ -987,6 +1266,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz", "integrity": "sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" } @@ -995,6 +1275,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz", "integrity": "sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -1006,6 +1287,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz", "integrity": "sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA==", + "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^3.0.0", "tslib": "^2.6.2" @@ -1018,6 +1300,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz", "integrity": "sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -1029,6 +1312,7 @@ "version": "3.0.14", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.14.tgz", "integrity": "sha512-0iwTgKKmAIf+vFLV8fji21Jb2px11ktKVxbX6LIDPAUJyWQqGqBVfwba7xwa1f2FZUoolYQgLvxQEpJycXuQ5w==", + "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^3.1.3", "@smithy/smithy-client": "^3.1.12", @@ -1044,6 +1328,7 @@ "version": "3.0.14", "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.14.tgz", "integrity": "sha512-e9uQarJKfXApkTMMruIdxHprhcXivH1flYCe8JRDTzkkLx8dA3V5J8GZlST9yfDiRWkJpZJlUXGN9Rc9Ade3OQ==", + "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^3.0.5", "@smithy/credential-provider-imds": "^3.2.0", @@ -1061,6 +1346,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.0.5.tgz", "integrity": "sha512-ReQP0BWihIE68OAblC/WQmDD40Gx+QY1Ez8mTdFMXpmjfxSyz2fVQu3A4zXRfQU9sZXtewk3GmhfOHswvX+eNg==", + "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^3.1.4", "@smithy/types": "^3.3.0", @@ -1074,6 +1360,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz", "integrity": "sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -1085,6 +1372,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.3.tgz", "integrity": "sha512-l+StyYYK/eO3DlVPbU+4Bi06Jjal+PFLSMmlWM1BEwyLxZ3aKkf1ROnoIakfaA7mC6uw3ny7JBkau4Yc+5zfWw==", + "license": "Apache-2.0", "dependencies": { "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -1097,6 +1385,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.3.tgz", "integrity": "sha512-AFw+hjpbtVApzpNDhbjNG5NA3kyoMs7vx0gsgmlJF4s+yz1Zlepde7J58zpIRIsdjc+emhpAITxA88qLkPF26w==", + "license": "Apache-2.0", "dependencies": { "@smithy/service-error-classification": "^3.0.3", "@smithy/types": "^3.3.0", @@ -1110,6 +1399,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.1.3.tgz", "integrity": "sha512-FIv/bRhIlAxC0U7xM1BCnF2aDRPq0UaelqBHkM2lsCp26mcBbgI0tCVTv+jGdsQLUmAMybua/bjDsSu8RQHbmw==", + "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^3.2.4", "@smithy/node-http-handler": "^3.1.4", @@ -1128,6 +1418,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz", "integrity": "sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg==", + "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" }, @@ -1139,6 +1430,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "license": "Apache-2.0", "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" @@ -1147,10 +1439,80 @@ "node": ">=16.0.0" } }, + "node_modules/@types/duplexify": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.4.tgz", + "integrity": "sha512-2eahVPsd+dy3CL6FugAzJcxoraWhUghZGEQJns1kTKfCXWKJ5iG/VkaB05wRVrDKHfOFKqb0X0kXh91eE99RZg==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.3.0.tgz", + "integrity": "sha512-nrWpWVaDZuaVc5X84xJ0vNrLvomM205oQyLsRt7OHNZbSHslcWsvgFR7O7hire2ZonjLrWBbedmotmIlJDVd6g==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.18.2" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "license": "MIT" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", + "license": "MIT" + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", - "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==", + "license": "MIT" + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } }, "node_modules/fast-xml-parser": { "version": "4.4.1", @@ -1166,6 +1528,7 @@ "url": "https://paypal.me/naturalintelligence" } ], + "license": "MIT", "dependencies": { "strnum": "^1.0.5" }, @@ -1173,15 +1536,117 @@ "fxparser": "src/cli/cli.js" } }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", + "license": "MIT" }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/undici-types": { + "version": "6.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.18.2.tgz", + "integrity": "sha512-5ruQbENj95yDYJNS3TvcaxPMshV7aizdv/hWYjGIKoANWKjhWNBsr2YEuYZKodQulB1b8l7ILOuDQep3afowQQ==", + "license": "MIT" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" }, "node_modules/uuid": { "version": "9.0.1", @@ -1191,9 +1656,22 @@ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" } } } diff --git a/lib/lambda/c3-utils-layer/lib/nodejs/package.json b/lib/lambda/c3-utils-layer/lib/nodejs/package.json new file mode 100644 index 00000000..ddf2f13d --- /dev/null +++ b/lib/lambda/c3-utils-layer/lib/nodejs/package.json @@ -0,0 +1,14 @@ +{ + "name": "c3-utils-layer", + "author": "Customer Dynamics", + "main": "index.js", + "private": true, + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "@aws-crypto/client-node": "^4.0.1", + "@aws-sdk/client-secrets-manager": "^3.624.0" + } +} diff --git a/lib/lambda/c3-validate-entry/bank/routing-number/formats/aba-routing-number.js b/lib/lambda/c3-validate-entry/bank/routing-number/formats/aba-routing-number.js new file mode 100644 index 00000000..4169d18e --- /dev/null +++ b/lib/lambda/c3-validate-entry/bank/routing-number/formats/aba-routing-number.js @@ -0,0 +1,66 @@ +const VALID_LENGTH = 9; + +/** + * Represents an ABA (American Banker's Association) routing number. + */ +export class ABARoutingNumber { + /** The routing number. */ + routingNumber = ''; + + /** The federal reserve routing symbol. */ + federalReserveRoutingSymbol = ''; + + /** The institution identifier. */ + institutionIdentifier = ''; + + /** The check digit. */ + checkDigit = ''; + + /** + * Creates a new ABARoutingNumber. + * + * @param {string} routingNumber The routing number to parse. + */ + constructor(routingNumber) { + this.routingNumber = routingNumber; + this.federalReserveRoutingSymbol = routingNumber.substring(0, 4); + this.institutionIdentifier = routingNumber.substring(4, 8); + this.checkDigit = routingNumber.substring(8); + } + + /** + * Validates a Visa card number. + * + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it is valid. + */ + validate() { + if (!this.routingNumber) { + return 'A routing number is required.'; + } else if (this.routingNumber.length !== VALID_LENGTH) { + return 'The routing number must be nine digits long.'; + } + return null; + } + + /** + * Performs an ABA (American Banker's Association) checksum on a bank routing number. + * + * @returns {boolean} True if the routing number satisfies the checksum, false otherwise. + */ + #satisfiesChecksum() { + // Get the checksum digit. + const checksumDigit = this.routingNumber[8]; + + // Get the checksum. + const weights = [3, 7, 1]; + let sum = 0; + + for (let i = 0; i < this.routingNumber.length; i++) { + sum += parseInt(this.routingNumber[i]) * weights[i % weights.length]; + } + + const checkSum = (10 - (sum % 10)) % 10; + console.debug('Checksum:', checkSum); + return checksumDigit === checkSum; + } +} diff --git a/lib/lambda/c3-validate-entry/bank/validation.js b/lib/lambda/c3-validate-entry/bank/validation.js new file mode 100644 index 00000000..cf845b94 --- /dev/null +++ b/lib/lambda/c3-validate-entry/bank/validation.js @@ -0,0 +1,27 @@ +import { ABARoutingNumber } from './routing-number/formats/aba-routing-number.js'; + +/** + * Validates a bank account number. + * + * There is currently no standard format for US bank account numbers, so this function only checks if the account number is present. + * + * @param {string} accountNumber The bank account number to validate. + * @returns {string | null} An IVR-speakable error message if the bank account number is invalid, or null if it's valid. + */ +export function validateAccountNumber(accountNumber) { + if (!accountNumber) { + return 'Account number is required.'; + } + return null; +} + +/** + * Validates a bank routing number. + * + * @param {string} routingNumber The bank routing number to validate. + * @returns {string | null} An IVR-speakable error message if the bank routing number is invalid, or null if it's valid. + */ +export function validateRoutingNumber(routingNumber) { + const abaRoutingNumber = new ABARoutingNumber(routingNumber); + return abaRoutingNumber.validate(); +} diff --git a/lib/lambda/c3-validate-entry/card/card-network.js b/lib/lambda/c3-validate-entry/card/card-network.js new file mode 100644 index 00000000..e0088f39 --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/card-network.js @@ -0,0 +1,25 @@ +/** + * The list of recognized card networks. + */ +export const CardNetwork = { + /** Cards issued by American Express. */ + AMERICAN_EXPRESS: 'American Express', + + /** Cards issued by Discover. */ + DISCOVER: 'Discover', + + /** Cards issued by Mastercard. */ + MASTERCARD: 'Mastercard', + + /** Cards issued by Visa. */ + VISA: 'Visa', + + /** An unknown card network. */ + UNKNOWN: 'Unknown', +}; + +/** + * @typedef {'American Express'|'Discover'|'Mastercard'|'Visa'|'Unknown'} CardNetwork + * + * The recognized card networks. + */ diff --git a/lib/lambda/c3-validate-entry/card/networks/american-express.js b/lib/lambda/c3-validate-entry/card/networks/american-express.js new file mode 100644 index 00000000..03fd2677 --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/networks/american-express.js @@ -0,0 +1,50 @@ +import luhn from 'fast-luhn'; + +/** + * The digit length for American Express card numbers. + */ +export const AMEX_PAN_LENGTH = 15; + +/** + * The IIN numbers for American Express card numbers. + */ +export const AMEX_IIN_NUMBERS = ['34', '37']; + +/** + * A class representing an American Express card. + */ +export class AmericanExpress { + /** The card number. */ + cardNumber = ''; + + constructor(cardNumber) { + this.cardNumber = cardNumber; + } + + /** + * Validates an American Express card number. + * + * @param {string} cardNumber The card number to validate. + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it is valid. + */ + validate() { + if (this.cardNumber.length !== AMEX_PAN_LENGTH) { + return 'The card number must be 15 digits long for American Express.'; + } else if (!luhn(this.cardNumber)) { + return 'The card number is invalid.'; + } + return null; + } + + /** + * Determines if a card is issued by American Express. + * + * @param {string} cardNumber The number of the card. + * @returns {boolean} True if the card is American Express, false otherwise. + */ + static isAmericanExpress(cardNumber) { + return AMEX_IIN_NUMBERS.some((iin) => { + return cardNumber.startsWith(iin); + }); + } +} diff --git a/lib/lambda/c3-validate-entry/card/networks/discover.js b/lib/lambda/c3-validate-entry/card/networks/discover.js new file mode 100644 index 00000000..337ceac9 --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/networks/discover.js @@ -0,0 +1,61 @@ +import luhn from 'fast-luhn'; + +/** + * The range of digit lengths for Discover card numbers. + */ +export const DISCOVER_PAN_LENGTH_RANGE = [{ start: 16, end: 19 }]; + +export const DISCOVER_IIN_RANGES = [ + { start: '6011', end: '6011' }, + { start: '622126', end: '622925' }, + { start: '644', end: '649' }, + { start: '65', end: '65' }, +]; + +/** + * A class representing a Discover card. + */ +export class Discover { + /** The card number. */ + cardNumber = ''; + + constructor(cardNumber) { + this.cardNumber = cardNumber; + } + + /** + * Validates a Discover card number. + * + * @param {string} cardNumber The card number to validate. + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it is valid. + */ + validate() { + if ( + !DISCOVER_PAN_LENGTH_RANGE.some( + (range) => + this.cardNumber.length >= range.start && + this.cardNumber.length <= range.end, + ) + ) { + return 'The card number must be 16 to 19 digits long for Discover.'; + } else if (!luhn(this.cardNumber)) { + return 'The card number is invalid.'; + } + return null; + } + + /** + * Determines if a card is issued by Discover. + * + * @param {string} cardNumber The number of the card. + * @returns {boolean} True if the card is Discover, false otherwise. + */ + static isDiscover(cardNumber) { + return DISCOVER_IIN_RANGES.some((range) => { + const cardNumberPrefix = parseInt( + cardNumber.substring(0, range.start.toString().length), + ); + return cardNumberPrefix >= range.start && cardNumberPrefix <= range.end; + }); + } +} diff --git a/lib/lambda/c3-validate-entry/card/networks/mastercard.js b/lib/lambda/c3-validate-entry/card/networks/mastercard.js new file mode 100644 index 00000000..50b275a1 --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/networks/mastercard.js @@ -0,0 +1,56 @@ +import luhn from 'fast-luhn'; + +/** + * The digit lengths for Mastercard card numbers. + */ +export const MASTERCARD_PAN_LENGTHS = [16]; + +/** + * The IIN ranges for Mastercard card numbers. + */ +export const MASTERCARD_IIN_RANGES = [ + { start: '51', end: '55' }, + { start: '222100', end: '272099' }, +]; + +/** + * A class representing a Mastercard card. + */ +export class Mastercard { + /** The card number. */ + cardNumber = ''; + + constructor(cardNumber) { + this.cardNumber = cardNumber; + } + + /** + * Validates a Mastercard card number. + * + * @param {string} cardNumber The card number to validate. + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it is valid. + */ + validate() { + if (!MASTERCARD_PAN_LENGTHS.includes(this.cardNumber.length)) { + return 'The card number must be 16 digits long for Mastercard.'; + } else if (!luhn(this.cardNumber)) { + return 'The card number is invalid.'; + } + return null; + } + + /** + * Determines if a card is issued by Mastercard. + * + * @param {string} cardNumber The number of the card. + * @returns {boolean} True if the card is Mastercard, false otherwise. + */ + static isMastercard(cardNumber) { + return MASTERCARD_IIN_RANGES.some((range) => { + const cardNumberPrefix = parseInt( + cardNumber.substring(0, range.start.toString().length), + ); + return cardNumberPrefix >= range.start && cardNumberPrefix <= range.end; + }); + } +} diff --git a/lib/lambda/c3-validate-entry/card/networks/visa.js b/lib/lambda/c3-validate-entry/card/networks/visa.js new file mode 100644 index 00000000..3a71f2bc --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/networks/visa.js @@ -0,0 +1,48 @@ +import luhn from 'fast-luhn'; + +/** + * The digit lengths for Visa card numbers. + */ +export const VISA_PAN_LENGTHS = [13, 16, 19]; + +/** + * The IIN number for Visa card numbers. + */ +const VISA_IIN_NUMBER = '4'; + +/** + * A class representing a Visa card. + */ +export class Visa { + /** The card number. */ + cardNumber = ''; + + constructor(cardNumber) { + this.cardNumber = cardNumber; + } + + /** + * Validates a Visa card number. + * + * @param {string} cardNumber The card number to validate. + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it is valid. + */ + validate() { + if (!VISA_PAN_LENGTHS.includes(this.cardNumber.length)) { + return 'The card number must be 13, 16, or 19 digits long for Visa.'; + } else if (!luhn(this.cardNumber)) { + return 'The card number is invalid.'; + } + return null; + } + + /** + * Determines if a card is issued by Visa. + * + * @param {string} cardNumber The number of the card. + * @returns {boolean} True if the card is Visa, false otherwise. + */ + static isVisa(cardNumber) { + return cardNumber.startsWith(VISA_IIN_NUMBER); + } +} diff --git a/lib/lambda/c3-validate-entry/card/validation.js b/lib/lambda/c3-validate-entry/card/validation.js new file mode 100644 index 00000000..63acb4dd --- /dev/null +++ b/lib/lambda/c3-validate-entry/card/validation.js @@ -0,0 +1,84 @@ +import { CardNetwork } from './card-network.js'; +import { AmericanExpress } from './networks/american-express.js'; +import { Discover } from './networks/discover.js'; +import { Mastercard } from './networks/mastercard.js'; +import { Visa } from './networks/visa.js'; + +/** + * Validates a card number. + * + * @param {string} cardNumber The card number to validate. + * @returns {string | null} An IVR-speakable error message if the card number is invalid, or null if it's valid. + */ +export function validateCardNumber(cardNumber) { + if (!cardNumber) { + return 'A card number is required.'; + } + + const cardNetwork = getCardNetwork(cardNumber); + console.log('Card network:', cardNetwork); + + switch (cardNetwork) { + case CardNetwork.VISA: + const visa = new Visa(cardNumber); + return visa.validate(); + case CardNetwork.MASTERCARD: + const mastercard = new Mastercard(cardNumber); + return mastercard.validate(); + case CardNetwork.AMERICAN_EXPRESS: + const americanExpress = new AmericanExpress(cardNumber); + return americanExpress.validate(); + case CardNetwork.DISCOVER: + const discover = new Discover(cardNumber); + return discover.validate(); + default: + return null; // Unknown card network; assume it's valid. + } +} + +/** + * Gets the card network for a card number. + * + * @param {string} cardNumber The card number. + * @returns {CardNetwork} The card network. + */ +export function getCardNetwork(cardNumber) { + if (Visa.isVisa(cardNumber)) { + return CardNetwork.VISA; + } else if (Mastercard.isMastercard(cardNumber)) { + return CardNetwork.MASTERCARD; + } else if (AmericanExpress.isAmericanExpress(cardNumber)) { + return CardNetwork.AMERICAN_EXPRESS; + } else if (Discover.isDiscover(cardNumber)) { + return CardNetwork.DISCOVER; + } + return CardNetwork.UNKNOWN; +} + +/** + * Validates a credit or debit card expiration date. + * + * @param {string} expirationDate The expiration date to validate. + * @returns {string | null} An error message if the expiration date is invalid, or null if it is valid. + */ +export function validateExpirationDate(expirationDate) { + if (!expirationDate) { + return 'Expiration date is required.'; + } else if (!/^\d{4}$/.test(expirationDate)) { + return 'The expiration date must be four digits long.'; + } + + const month = parseInt(expirationDate.substring(0, 2), 10); + const year = parseInt(expirationDate.substring(2), 10); + + if (month < 1 || month > 12) { + return 'The expiration month must be between 1 and 12.'; + } else if ( + year + 2000 < new Date().getFullYear() || + (year + 2000 === new Date().getFullYear() && + month < new Date().getMonth() + 1) + ) { + return 'The card has expired.'; + } + return null; +} diff --git a/lib/lambda/c3-validate-entry/index.js b/lib/lambda/c3-validate-entry/index.js new file mode 100644 index 00000000..b291aadf --- /dev/null +++ b/lib/lambda/c3-validate-entry/index.js @@ -0,0 +1,66 @@ +import { + validateCardNumber, + validateExpirationDate, +} from './card/validation.js'; +import { decryptData } from '/opt/nodejs/decryption.js'; +import { + validateAccountNumber, + validateRoutingNumber, +} from './bank/validation.js'; + +const validationTypes = { + /** Validation for a credit or debit card number. */ + CARD_NUMBER: 'CardNumber', + + /** Validation for a credit or debit card expiration date. */ + EXPIRATION_DATE: 'ExpirationDate', + + /** Validation for a bank account number. */ + ACCOUNT_NUMBER: 'AccountNumber', + + /** Validation for a bank routing number. */ + ROUTING_NUMBER: 'RoutingNumber', +}; + +/** + * @type {import ('aws-lambda').Handler} + */ +export async function handler(event) { + console.log(`EVENT: ${JSON.stringify(event)}`); + + const parameters = event.Details.Parameters; + const validationType = parameters.ValidationType; + const customerEntry = + parameters.CustomerEntry === '#' ? '' : `${parameters.CustomerEntry}`; + + let validationError = null; + switch (validationType) { + case validationTypes.CARD_NUMBER: + const decryptedCardNumber = await decryptData(customerEntry); + console.log('Validating card number...'); + validationError = validateCardNumber(decryptedCardNumber); + console.log('Validation error:', validationError); + break; + case validationTypes.EXPIRATION_DATE: + console.log('Validating expiration date...'); + validationError = validateExpirationDate(customerEntry); + console.log('Validation error:', validationError); + break; + case validationTypes.ACCOUNT_NUMBER: + const decryptedAccountNumber = await decryptData(customerEntry); + console.log('Validating account number...'); + validationError = validateAccountNumber(decryptedAccountNumber); + console.log('Validation error:', validationError); + break; + case validationTypes.ROUTING_NUMBER: + console.log('Validating routing number...'); + validationError = validateRoutingNumber(customerEntry); + console.log('Validation error:', validationError); + break; + default: + throw new Error(`Unknown validation type: ${validationType}`); + } + return { + ValidationError: validationError !== null ? validationError : 'NULL', + }; +} diff --git a/lib/lambda/c3-validate-entry/jsconfig.json b/lib/lambda/c3-validate-entry/jsconfig.json new file mode 100644 index 00000000..1fa940bd --- /dev/null +++ b/lib/lambda/c3-validate-entry/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "paths": { + "/opt/nodejs/*": ["../c3-utils-layer/lib/nodejs/*"] + } + } +} diff --git a/lib/lambda/c3-validate-entry/package-lock.json b/lib/lambda/c3-validate-entry/package-lock.json new file mode 100644 index 00000000..7daec948 --- /dev/null +++ b/lib/lambda/c3-validate-entry/package-lock.json @@ -0,0 +1,22 @@ +{ + "name": "c3-validate-entry", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "c3-validate-entry", + "dependencies": { + "fast-luhn": "^2.0.2" + } + }, + "node_modules/fast-luhn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fast-luhn/-/fast-luhn-2.0.2.tgz", + "integrity": "sha512-aaIb41cPmEJd2kltUEskBGx4YfASSdTdvuvjfdb70OvUtn+mUAjDzz6o7SnV0h5p2JC63cIYyY+bQ+WnY1/9HA==", + "license": "MIT", + "engines": { + "node": ">=8" + } + } + } +} diff --git a/lib/lambda/c3-validate-entry/package.json b/lib/lambda/c3-validate-entry/package.json new file mode 100644 index 00000000..a00fe612 --- /dev/null +++ b/lib/lambda/c3-validate-entry/package.json @@ -0,0 +1,13 @@ +{ + "name": "c3-validate-entry", + "author": "Customer Dynamics", + "main": "index.js", + "private": true, + "type": "module", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "fast-luhn": "^2.0.2" + } +} diff --git a/lib/models/amazon-connect-context.ts b/lib/models/amazon-connect-context.ts index ed8fe440..de92d0af 100644 --- a/lib/models/amazon-connect-context.ts +++ b/lib/models/amazon-connect-context.ts @@ -3,6 +3,7 @@ export interface AmazonConnectContext { securityKeyId: string; securityKeyCertificateContent: string; workspaceApp: boolean; + receiptQueueArn: string; } /** diff --git a/package.json b/package.json index f0aa6657..b4959417 100644 --- a/package.json +++ b/package.json @@ -16,9 +16,9 @@ "synth": "npm ci && npm run build && cdk synth && npm run display-url", "deploy": "npm ci && npm run build && cdk deploy && npm run display-url", "display-url": "echo \"$(<./exports/C3WorkspaceAppUrl.txt )\"", - "insert-placeholders": "npm run style:fix && ./scripts/insert-placeholders.sh", - "compress-files": "./scripts/compress-files.sh", - "postinstall": "npm --prefix ./lib/lambda/c3-create-payment-request ci && npm --prefix ./lib/lambda/c3-email-receipt ci && npm --prefix ./lib/lambda/c3-submit-payment ci && npm --prefix ./lib/lambda/c3-tokenize-transaction ci && npm --prefix ./lib/lambda/c3-subject-lookup ci && npm --prefix ./lib/lambda/c3-send-agent-message ci", + "insert-placeholders": "npm run style:fix && bash ./scripts/insert-placeholders.sh", + "compress-files": "bash ./scripts/compress-files.sh", + "postinstall": "npm --prefix ./lib/lambda/c3-utils-layer/lib/nodejs ci && npm --prefix ./lib/lambda/c3-create-payment-request ci && npm --prefix ./lib/lambda/c3-validate-entry ci && npm --prefix ./lib/lambda/c3-send-receipt ci && npm --prefix ./lib/lambda/c3-submit-payment ci && npm --prefix ./lib/lambda/c3-tokenize-transaction ci && npm --prefix ./lib/lambda/c3-subject-lookup ci && npm --prefix ./lib/lambda/c3-send-agent-message ci", "prepare": "husky" }, "devDependencies": { diff --git a/scripts/insert-placeholders.sh b/scripts/insert-placeholders.sh index 4744223a..5e8de565 100755 --- a/scripts/insert-placeholders.sh +++ b/scripts/insert-placeholders.sh @@ -1,5 +1,8 @@ #!/bin/bash +# Replaces all referenced Lambda function ARNs, security key IDs, and certificate content values with placeholder values so +# they can be used in different environments. + AGENT_ASSISTED_PAYMENT_IVR_FLOW_FILE="lib/connect/flows/c3-agent-assisted-payment-ivr-flow.json" SUBJECT_LOOKUP_FLOW_FILE="lib/connect/flows/c3-subject-lookup-flow.json" PAYMENT_IVR_FLOW_MODULE_FILE="lib/connect/flows/modules/c3-payment-ivr-flow-module.json" @@ -24,9 +27,9 @@ PLACEHOLDER="<>" sed -i '' "s|\(\"[^\"]*\": \)\".*${FUNCTION_NAME}.*\"|\1\"$PLACEHOLDER\"|g" "$AGENT_ASSISTED_PAYMENT_IVR_FLOW_FILE" sed -i '' "s|\(\"[^\"]*\": \)\".*${FUNCTION_NAME}.*\"|\1\"$PLACEHOLDER\"|g" "$PAYMENT_IVR_FLOW_MODULE_FILE" -# Replace the ARN of the C3EmailReceipt Lambda function -FUNCTION_NAME="C3EmailReceipt" -PLACEHOLDER="<>" +# Replace the ARN of the C3SendReceipt Lambda function +FUNCTION_NAME="C3SendReceipt" +PLACEHOLDER="<>" sed -i '' "s|\(\"[^\"]*\": \)\".*${FUNCTION_NAME}.*\"|\1\"$PLACEHOLDER\"|g" "$AGENT_ASSISTED_PAYMENT_IVR_FLOW_FILE" sed -i '' "s|\(\"[^\"]*\": \)\".*${FUNCTION_NAME}.*\"|\1\"$PLACEHOLDER\"|g" "$PAYMENT_IVR_FLOW_MODULE_FILE" @@ -56,6 +59,14 @@ PLACEHOLDER="<>" sed -i '' "s|\(\"[^\"]*\": \)\".*${CERTIFICATE_PREFIX}.*\"|\1\"$PLACEHOLDER\"|g" "$AGENT_ASSISTED_PAYMENT_IVR_FLOW_FILE" sed -i '' "s|\(\"[^\"]*\": \)\".*${CERTIFICATE_PREFIX}.*\"|\1\"$PLACEHOLDER\"|g" "$PAYMENT_IVR_FLOW_MODULE_FILE" + +# ---- RECEIPT QUEUE ID ---- + +# Replace the receipt queue ID +QUEUE_ID_PREFIX="34f98ae7-73a8-496b-a1c0-392ae6de130d" +PLACEHOLDER="<>" +sed -i '' "s|$QUEUE_ID_PREFIX|$PLACEHOLDER|g" "$PAYMENT_IVR_FLOW_MODULE_FILE" + # Remove any instances of (Working Copy) sed -i '' "s| (Working Copy)||g" "$AGENT_ASSISTED_PAYMENT_IVR_FLOW_FILE" sed -i '' "s| (Working Copy)||g" "$PAYMENT_IVR_FLOW_MODULE_FILE" diff --git a/test/c3-amazon-connect.test.ts b/test/c3-amazon-connect.test.ts index fb0cb457..49eae092 100644 --- a/test/c3-amazon-connect.test.ts +++ b/test/c3-amazon-connect.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, diff --git a/test/features/agent-assisted-ivr.test.ts b/test/features/agent-assisted-ivr.test.ts index a08208d0..ddd71f53 100644 --- a/test/features/agent-assisted-ivr.test.ts +++ b/test/features/agent-assisted-ivr.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, @@ -36,7 +37,7 @@ const mockContext: Context = { supportEmail: 'placeholder', }; -const NUMBER_OF_LAMBDAS = 5; +const NUMBER_OF_LAMBDAS = 6; // Verify created resources for agent-assisted IVR. describe('Agent Assisted IVR', () => { @@ -99,9 +100,9 @@ describe('Agent Assisted IVR', () => { it('Has a created role', () => { template.resourceCountIs('AWS::IAM::Role', NUMBER_OF_LAMBDAS + 1); }); - it('Has 5 created policies', () => { + it('Has 6 created policies', () => { // Cross org policy, 3 secrets policies, and kms policy - template.resourceCountIs('AWS::IAM::Policy', 5); + template.resourceCountIs('AWS::IAM::Policy', NUMBER_OF_LAMBDAS); }); }); }); diff --git a/test/features/agent-assisted-link.test.ts b/test/features/agent-assisted-link.test.ts index e713b87e..a9609923 100644 --- a/test/features/agent-assisted-link.test.ts +++ b/test/features/agent-assisted-link.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, diff --git a/test/features/self-service-ivr.test.ts b/test/features/self-service-ivr.test.ts index 7412aef6..6eb91725 100644 --- a/test/features/self-service-ivr.test.ts +++ b/test/features/self-service-ivr.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, @@ -36,7 +37,7 @@ const mockContext: Context = { supportEmail: 'placeholder', }; -const NUMBER_OF_LAMBDAS = 4; +const NUMBER_OF_LAMBDAS = 5; // Verify created resources for agent-assisted IVR. describe('Self-Service IVR', () => { diff --git a/test/features/subject-lookup.test.ts b/test/features/subject-lookup.test.ts index a2906565..46aa1bf8 100644 --- a/test/features/subject-lookup.test.ts +++ b/test/features/subject-lookup.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, @@ -36,7 +37,7 @@ const mockContext: Context = { supportEmail: 'placeholder', }; -const NUMBER_OF_LAMBDAS = 6; +const NUMBER_OF_LAMBDAS = 7; // Verify created resources for subject lookup. describe('Subject Lookup', () => { @@ -89,7 +90,7 @@ describe('Subject Lookup', () => { // Lambda functions describe('Lambda functions', () => { - it('Has 6 created functions', () => { + it('Has 7 created functions', () => { template.resourceCountIs('AWS::Lambda::Function', NUMBER_OF_LAMBDAS); }); }); @@ -99,9 +100,9 @@ describe('Subject Lookup', () => { it('Has 1 created role', () => { template.resourceCountIs('AWS::IAM::Role', NUMBER_OF_LAMBDAS + 1); }); - it('Has 5 created policies', () => { + it('Has 6 created policies', () => { // Cross org policy, 3 secrets policies, and kms policy - template.resourceCountIs('AWS::IAM::Policy', 5); + template.resourceCountIs('AWS::IAM::Policy', NUMBER_OF_LAMBDAS - 1); // No policy for subject lookup }); }); }); diff --git a/test/options/code-signing.test.ts b/test/options/code-signing.test.ts index a8f85790..184ddb72 100644 --- a/test/options/code-signing.test.ts +++ b/test/options/code-signing.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, diff --git a/test/options/workspace-app.test.ts b/test/options/workspace-app.test.ts index 7459a063..74c96aff 100644 --- a/test/options/workspace-app.test.ts +++ b/test/options/workspace-app.test.ts @@ -16,6 +16,7 @@ const mockContext: Context = { securityKeyCertificateContent: '-----BEGIN CERTIFICATE-----\\n-----END CERTIFICATE-----\\n', workspaceApp: true, + receiptQueueArn: 'placeholder', }, c3: { env: C3Environment.Prod, @@ -36,7 +37,7 @@ const mockContext: Context = { supportEmail: 'placeholder', }; -const NUMBER_OF_LAMBDAS = 5; +const NUMBER_OF_LAMBDAS = 6; // Verify created resources for agent-assisted IVR. describe('Workspace app', () => {