From e4bf3123409ab813d118e87c95777cd5bcaff313 Mon Sep 17 00:00:00 2001 From: thaddmt <68032955+thaddmt@users.noreply.github.com> Date: Wed, 19 Jul 2023 11:58:20 -0700 Subject: [PATCH] feat(liveness): Liveness cred provider (#4260) * feat(liveness): add credentialProvider prop (#3790) * feat(liveness): add credentialProvier prop * chore: update sdk types * chore: remove extra api definition * update yarn.lock * chore: update credential provider API based on internal review * chore: add unit tests to fix coverage * chore: address feedback * chore: add comment on why credentials are copied, fix unit tests * chore: add size limit check for react-liveness * fix: reusable unit test size check * chore: update types to better match AWS SDK types, export them as well * Update packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts Co-authored-by: Caleb Pollman * Update packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts Co-authored-by: Caleb Pollman * chore: switch to using credential-provider@3.310.0 * address feedback * Update packages/e2e/features/ui/components/liveness/with-credential-provider.feature * update to use more recent aws-sdk deps * try fixing deps * update aws-sdk dep to 3.350.0 * maybe this fixes it * another try * fix yarn.lock * fix e2e test --------- Co-authored-by: Caleb Pollman Co-authored-by: William Lee <43682783+wlee221@users.noreply.github.com> * update yarn.lock * Create pretty-laws-obey.md * update ignored links * fix yarn.lock --------- Co-authored-by: Caleb Pollman Co-authored-by: William Lee <43682783+wlee221@users.noreply.github.com> --- .changeset/pretty-laws-obey.md | 5 + .github/workflows/reusable-unit.yml | 4 + docs/src/data/ignoredLinks.ts | 1 + examples/next/package.json | 1 + .../liveness/components/LivenessDefault.tsx | 55 +- .../components/liveness/components/NavBar.tsx | 4 + .../with-credential-provider/aws-exports.js | 2 + .../with-credential-provider/index.page.tsx | 33 + .../liveness/with-credential-provider.feature | 22 + .../__snapshots__/index.spec.ts.snap | 1 + .../FaceLivenessDetector.tsx | 96 +-- .../FaceLivenessDetectorCore.tsx | 98 +++ .../__tests__/LivenessCheck.test.tsx | 27 + .../components/FaceLivenessDetector/index.ts | 9 + .../service/machine/index.ts | 15 +- .../service/types/credentials.ts | 20 + .../service/types/index.ts | 1 + .../service/types/liveness.ts | 33 +- .../service/types/machine.ts | 4 +- .../utils/__tests__/streamProvider.test.ts | 139 ++-- .../service/utils/streamProvider.ts | 29 +- packages/react-liveness/src/index.ts | 10 +- yarn.lock | 723 ++++++++++++++++++ 23 files changed, 1155 insertions(+), 177 deletions(-) create mode 100644 .changeset/pretty-laws-obey.md create mode 100644 examples/next/pages/ui/components/liveness/with-credential-provider/aws-exports.js create mode 100644 examples/next/pages/ui/components/liveness/with-credential-provider/index.page.tsx create mode 100644 packages/e2e/features/ui/components/liveness/with-credential-provider.feature create mode 100644 packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetectorCore.tsx create mode 100644 packages/react-liveness/src/components/FaceLivenessDetector/service/types/credentials.ts diff --git a/.changeset/pretty-laws-obey.md b/.changeset/pretty-laws-obey.md new file mode 100644 index 00000000000..42df07992c2 --- /dev/null +++ b/.changeset/pretty-laws-obey.md @@ -0,0 +1,5 @@ +--- +"@aws-amplify/ui-react-liveness": minor +--- + +feat(liveness): Liveness cred provider diff --git a/.github/workflows/reusable-unit.yml b/.github/workflows/reusable-unit.yml index 8ab49b40795..19a5bb9dfba 100644 --- a/.github/workflows/reusable-unit.yml +++ b/.github/workflows/reusable-unit.yml @@ -110,6 +110,10 @@ jobs: if: ${{ matrix.package == 'react' }} run: yarn react size + - name: Check ${{ matrix.package }} bundle size + if: ${{ matrix.package == 'react-liveness' }} + run: yarn react-liveness size + - name: Cache ${{ matrix.package }}/dist uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3.3.1 https://github.com/actions/cache/commit/88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 with: diff --git a/docs/src/data/ignoredLinks.ts b/docs/src/data/ignoredLinks.ts index f9e6f126d8d..8d99d75b3bd 100644 --- a/docs/src/data/ignoredLinks.ts +++ b/docs/src/data/ignoredLinks.ts @@ -20,6 +20,7 @@ export const IGNORED_LINKS = [ 'https://github.com/aws-amplify/amplify-ui-swift/issues/new/choose', // 302 amplify-ui-wift redirects to amplify-ui-swift-liveness 'https://github.com/aws-amplify/amplify-ui-swift-liveness/issues/new/choose', // 302 amplify-ui-swift-liveness does not have issue templates yet 'https://developer.apple.com/design/human-interface-guidelines/patterns/accessing-private-data/', // 401 Apple doesn't like bots maybe + 'https://developer.apple.com/documentation/xcode/localization', // 403 'https://twitter.com/AWSAmplify', 'https://tfhub.dev/tensorflow/tfjs-model/blazeface/1/default/1/model.json?tfjs-format=file', // 302 to a google cdn 'https://cdn.liveness.rekognition.amazonaws.com/face-detection/tensorflow/tfjs-backend-wasm/3.11.0/', // 404 this is the intentional path as the tfjs library will append the correct file name diff --git a/examples/next/package.json b/examples/next/package.json index 9b045d870a0..63cb4f535b4 100644 --- a/examples/next/package.json +++ b/examples/next/package.json @@ -15,6 +15,7 @@ "@aws-amplify/ui-react-storage": "^2.0.4", "@aws-amplify/ui-react-notifications": "^1.0.5", "@aws-amplify/ui-react-geo": "^1.0.1", + "@aws-sdk/credential-providers": "^3.370.0", "aws-amplify": "latest", "next": "^11.1.3", "next-global-css": "^1.1.1", diff --git a/examples/next/pages/ui/components/liveness/components/LivenessDefault.tsx b/examples/next/pages/ui/components/liveness/components/LivenessDefault.tsx index 9f12a1f97d5..6555e0bc99b 100644 --- a/examples/next/pages/ui/components/liveness/components/LivenessDefault.tsx +++ b/examples/next/pages/ui/components/liveness/components/LivenessDefault.tsx @@ -1,5 +1,8 @@ import { View, Flex, Loader, Text } from '@aws-amplify/ui-react'; -import { FaceLivenessDetector } from '@aws-amplify/ui-react-liveness'; +import { + FaceLivenessDetector, + FaceLivenessDetectorCore, +} from '@aws-amplify/ui-react-liveness'; import { useLiveness } from './useLiveness'; import { SessionIdAlert } from './SessionIdAlert'; import LivenessInlineResults from './LivenessInlineResults'; @@ -7,6 +10,7 @@ import LivenessInlineResults from './LivenessInlineResults'; export default function LivenessDefault({ disableInstructionScreen = false, components = undefined, + credentialProvider = undefined, }) { const { getLivenessResponse, @@ -49,21 +53,40 @@ export default function LivenessDefault({ {!getLivenessResponse ? ( - { - await handleGetLivenessDetection( - createLivenessSessionApiData.sessionId - ); - }} - onError={(error) => { - console.error(error); - }} - disableInstructionScreen={disableInstructionScreen} - components={components} - /> + credentialProvider ? ( + { + await handleGetLivenessDetection( + createLivenessSessionApiData.sessionId + ); + }} + onError={(error) => { + console.error(error); + }} + disableInstructionScreen={disableInstructionScreen} + components={components} + config={{ credentialProvider }} + /> + ) : ( + { + await handleGetLivenessDetection( + createLivenessSessionApiData.sessionId + ); + }} + onError={(error) => { + console.error(error); + }} + disableInstructionScreen={disableInstructionScreen} + components={components} + /> + ) ) : null} diff --git a/examples/next/pages/ui/components/liveness/components/NavBar.tsx b/examples/next/pages/ui/components/liveness/components/NavBar.tsx index c33f5ccbc95..796ab2f39d2 100644 --- a/examples/next/pages/ui/components/liveness/components/NavBar.tsx +++ b/examples/next/pages/ui/components/liveness/components/NavBar.tsx @@ -80,6 +80,10 @@ export default function NavBar({ With Custom Components + + + With Credential Provider + diff --git a/examples/next/pages/ui/components/liveness/with-credential-provider/aws-exports.js b/examples/next/pages/ui/components/liveness/with-credential-provider/aws-exports.js new file mode 100644 index 00000000000..a1d2b15c954 --- /dev/null +++ b/examples/next/pages/ui/components/liveness/with-credential-provider/aws-exports.js @@ -0,0 +1,2 @@ +import awsExports from '@environments/liveness/liveness-environment/src/aws-exports'; +export default awsExports; diff --git a/examples/next/pages/ui/components/liveness/with-credential-provider/index.page.tsx b/examples/next/pages/ui/components/liveness/with-credential-provider/index.page.tsx new file mode 100644 index 00000000000..c2a91384bcc --- /dev/null +++ b/examples/next/pages/ui/components/liveness/with-credential-provider/index.page.tsx @@ -0,0 +1,33 @@ +import dynamic from 'next/dynamic'; +import React from 'react'; +import { Amplify } from 'aws-amplify'; +import { fromCognitoIdentityPool } from '@aws-sdk/credential-providers'; +import { AwsCredentialProvider } from '@aws-amplify/ui-react-liveness'; + +import LivenessDefault from '../components/LivenessDefault'; +import Layout from '../components/Layout'; +import awsExports from './aws-exports'; + +Amplify.configure({ + ...awsExports, + Analytics: { + autoSessionRecord: false, + }, +}); + +const App = () => { + const credentialProvider: AwsCredentialProvider = fromCognitoIdentityPool({ + clientConfig: { region: 'us-east-2' }, + identityPoolId: 'us-east-2:89d27d83-5313-46b2-a7cb-328604399400', + }); + + return ( + + + + ); +}; + +export default dynamic(() => Promise.resolve(App), { + ssr: false, +}); diff --git a/packages/e2e/features/ui/components/liveness/with-credential-provider.feature b/packages/e2e/features/ui/components/liveness/with-credential-provider.feature new file mode 100644 index 00000000000..ddf58d31a6a --- /dev/null +++ b/packages/e2e/features/ui/components/liveness/with-credential-provider.feature @@ -0,0 +1,22 @@ +Feature: Liveness with Custom Components + +Liveness component supports using a custom credential provider. + + Background: + Given I'm running the example "ui/components/liveness/with-credential-provider/" + + @react + Scenario: See camera module and close with the close icon + Then I click the "Begin check" button + And I click the "close-icon" + Then I see the "Begin check" button + + @react + Scenario: See camera module and instructions + Then I click the "Begin check" button + And I see "liveness-detector" element + And I see "connecting" + And I see "Move closer" + And I see "Face didn't fill oval within time limit." + And I click the "Try again" button + Then I see the "Begin check" button diff --git a/packages/react-liveness/src/__tests__/__snapshots__/index.spec.ts.snap b/packages/react-liveness/src/__tests__/__snapshots__/index.spec.ts.snap index 18cb6e06670..3ad6538d706 100644 --- a/packages/react-liveness/src/__tests__/__snapshots__/index.spec.ts.snap +++ b/packages/react-liveness/src/__tests__/__snapshots__/index.spec.ts.snap @@ -3,5 +3,6 @@ exports[`exports should match the expected snapshot 1`] = ` Array [ "FaceLivenessDetector", + "FaceLivenessDetectorCore", ] `; diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetector.tsx b/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetector.tsx index 99cffc11812..de713b0a1bf 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetector.tsx +++ b/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetector.tsx @@ -1,24 +1,13 @@ import * as React from 'react'; -import { useActor, useInterpret } from '@xstate/react'; +import { Credentials as AmplifyCredentials } from '@aws-amplify/core'; import { - livenessMachine, + AwsTemporaryCredentials, FaceLivenessDetectorProps as FaceLivenessDetectorPropsFromUi, } from './service'; -import { View, Flex } from '@aws-amplify/ui-react'; - -import { FaceLivenessDetectorProvider } from './providers'; -import { StartLiveness } from './StartLiveness'; -import { LivenessCheck } from './LivenessCheck'; -import { getVideoConstraints } from './StartLiveness/helpers'; -import { StartScreenComponents } from './shared/DefaultStartScreenComponents'; +import FaceLivenessDetectorCore, { + FaceLivenessDetectorComponents, +} from './FaceLivenessDetectorCore'; import { LivenessDisplayText } from './displayText'; -import { getDisplayText } from './utils/getDisplayText'; -import { CheckScreenComponents } from './shared/FaceLivenessErrorModal'; - -const DETECTOR_CLASS_NAME = 'liveness-detector'; - -type FaceLivenessDetectorComponents = StartScreenComponents & - CheckScreenComponents; export interface FaceLivenessDetectorProps extends FaceLivenessDetectorPropsFromUi { @@ -26,73 +15,20 @@ export interface FaceLivenessDetectorProps displayText?: LivenessDisplayText; } +const credentialProvider = async () => { + const credentials = + (await AmplifyCredentials.get()) as AwsTemporaryCredentials; + return credentials; +}; + export default function FaceLivenessDetector( props: FaceLivenessDetectorProps ): JSX.Element { - const { - disableInstructionScreen = false, - components, - config, - displayText, - } = props; - const currElementRef = React.useRef(null); - const { - hintDisplayText, - cameraDisplayText, - instructionDisplayText, - streamDisplayText, - errorDisplayText, - } = getDisplayText(displayText); - - const service = useInterpret(livenessMachine, { - devTools: process.env.NODE_ENV === 'development', - context: { - componentProps: { - ...props, - config: config ?? {}, - }, - }, - }); - - const [state, send] = useActor(service); - const isStartView = state.matches('start') || state.matches('userCancel'); - - const beginLivenessCheck = React.useCallback(() => { - const videoConstraints = getVideoConstraints(); - - send({ - type: 'BEGIN', - data: { videoConstraints }, - }); - }, [send]); - - React.useLayoutEffect(() => { - if (disableInstructionScreen && isStartView) { - beginLivenessCheck(); - } - }, [beginLivenessCheck, disableInstructionScreen, isStartView]); - + const { config, ...rest } = props; return ( - - - - {isStartView ? ( - - ) : ( - - )} - - - + ); } diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetectorCore.tsx b/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetectorCore.tsx new file mode 100644 index 00000000000..500363314f8 --- /dev/null +++ b/packages/react-liveness/src/components/FaceLivenessDetector/FaceLivenessDetectorCore.tsx @@ -0,0 +1,98 @@ +import * as React from 'react'; +import { useActor, useInterpret } from '@xstate/react'; +import { + livenessMachine, + FaceLivenessDetectorCoreProps as FaceLivenessDetectorPropsFromUi, +} from './service'; +import { View, Flex } from '@aws-amplify/ui-react'; + +import { FaceLivenessDetectorProvider } from './providers'; +import { StartLiveness } from './StartLiveness'; +import { LivenessCheck } from './LivenessCheck'; +import { getVideoConstraints } from './StartLiveness/helpers'; +import { StartScreenComponents } from './shared/DefaultStartScreenComponents'; +import { LivenessDisplayText } from './displayText'; +import { getDisplayText } from './utils/getDisplayText'; +import { CheckScreenComponents } from './shared/FaceLivenessErrorModal'; + +const DETECTOR_CLASS_NAME = 'liveness-detector'; + +export type FaceLivenessDetectorComponents = StartScreenComponents & + CheckScreenComponents; + +export interface FaceLivenessDetectorCoreProps + extends FaceLivenessDetectorPropsFromUi { + components?: FaceLivenessDetectorComponents; + displayText?: LivenessDisplayText; +} + +export default function FaceLivenessDetectorCore( + props: FaceLivenessDetectorCoreProps +): JSX.Element { + const { + disableInstructionScreen = false, + components, + config, + displayText, + } = props; + const currElementRef = React.useRef(null); + const { + hintDisplayText, + cameraDisplayText, + instructionDisplayText, + streamDisplayText, + errorDisplayText, + } = getDisplayText(displayText); + + const service = useInterpret(livenessMachine, { + devTools: process.env.NODE_ENV === 'development', + context: { + componentProps: { + ...props, + config: config ?? {}, + }, + }, + }); + + const [state, send] = useActor(service); + const isStartView = state.matches('start') || state.matches('userCancel'); + + const beginLivenessCheck = React.useCallback(() => { + const videoConstraints = getVideoConstraints(); + + send({ + type: 'BEGIN', + data: { videoConstraints }, + }); + }, [send]); + + React.useLayoutEffect(() => { + if (disableInstructionScreen && isStartView) { + beginLivenessCheck(); + } + }, [beginLivenessCheck, disableInstructionScreen, isStartView]); + + return ( + + + + {isStartView ? ( + + ) : ( + + )} + + + + ); +} diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/LivenessCheck/__tests__/LivenessCheck.test.tsx b/packages/react-liveness/src/components/FaceLivenessDetector/LivenessCheck/__tests__/LivenessCheck.test.tsx index 042f8da78f7..09126d13c46 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/LivenessCheck/__tests__/LivenessCheck.test.tsx +++ b/packages/react-liveness/src/components/FaceLivenessDetector/LivenessCheck/__tests__/LivenessCheck.test.tsx @@ -44,6 +44,30 @@ describe('LivenessCheck', () => { }; const mockActorSend = jest.fn(); + const { userAgent: originalUserAgent } = window.navigator; + + beforeAll(() => { + Object.defineProperty( + window.navigator, + 'userAgent', + ((value) => ({ + get() { + return value; + }, + set(v) { + value = v; + }, + }))(window.navigator['userAgent']) + ); + }); + + afterAll(() => { + Object.defineProperty(window, 'navigator', { + configurable: true, + value: originalUserAgent, + }); + }); + beforeEach(() => { mockUseLivenessActor.mockReturnValue([mockActorState, mockActorSend]); mockUseThemeBreakpoint.mockReturnValue('small'); @@ -125,6 +149,9 @@ describe('LivenessCheck', () => { }); it('should render the component content for mobile landscape errors', () => { + mockActorState.matches.mockReturnValue(true); + (global.navigator as any).userAgent = + 'Mozilla/5.0 (Linux; Android 12; Pixel 6 Build/SD1A.210817.023; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Firefox/94.0.4606.71 Mobile Safari/537.36'; mockMatchMedia('(orientation: landscape)', true); mockActorState.matches.mockReturnValue(true); mockUseLivenessSelector.mockReturnValue( diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/index.ts b/packages/react-liveness/src/components/FaceLivenessDetector/index.ts index 853d301d1b1..dc80d2c5909 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/index.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/index.ts @@ -2,3 +2,12 @@ export { default as FaceLivenessDetector, FaceLivenessDetectorProps, } from './FaceLivenessDetector'; +export { + default as FaceLivenessDetectorCore, + FaceLivenessDetectorCoreProps, +} from './FaceLivenessDetectorCore'; +export { + AwsCredentialProvider, + AwsTemporaryCredentials, + AwsCredentials, +} from './service'; diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/machine/index.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/machine/index.ts index 6d1aeaa7489..584acdcf579 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/machine/index.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/machine/index.ts @@ -920,12 +920,15 @@ export const livenessMachine = createMachine( return { stream: realVideoDeviceStream }; }, async openLivenessStreamConnection(context) { - const livenessStreamProvider = new LivenessStreamProvider( - context.componentProps!.sessionId, - context.componentProps!.region, - context.videoAssociatedParams!.videoMediaStream!, - context.videoAssociatedParams!.videoEl! - ); + const { config } = context.componentProps!; + const { credentialProvider } = config!; + const livenessStreamProvider = new LivenessStreamProvider({ + sessionId: context.componentProps!.sessionId, + region: context.componentProps!.region, + stream: context.videoAssociatedParams!.videoMediaStream!, + videoEl: context.videoAssociatedParams!.videoEl!, + credentialProvider: credentialProvider, + }); streamConnectionOpenTimestamp = Date.now(); diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/credentials.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/credentials.ts new file mode 100644 index 00000000000..f0dc3b01354 --- /dev/null +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/credentials.ts @@ -0,0 +1,20 @@ +/** + * These types are copied over / adapted from the aws-sdk/types package as they do not semantic versioning and we do not want these changing unexpectedly. + * When Amplify Auth exports these types this file should be removed and the type definitions should come from the Amplify auth package + */ + +export interface AwsCredentials { + readonly accessKeyId: string; + readonly secretAccessKey: string; +} + +export interface AwsTemporaryCredentials extends AwsCredentials { + readonly sessionToken?: string; + readonly expiration?: Date; +} + +export interface IdentityProvider { + (identityProperties?: Record): Promise; +} + +export type AwsCredentialProvider = IdentityProvider; diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/index.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/index.ts index dccba871cc1..9d04f1b9479 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/index.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/index.ts @@ -2,3 +2,4 @@ export * from './faceDetection'; export * from './liveness'; export * from './machine'; export * from './error'; +export * from './credentials'; diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts index 11c00efa304..e04e85f5362 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/liveness.ts @@ -1,9 +1,10 @@ +import { AwsCredentialProvider } from './credentials'; import { LivenessErrorState } from './error'; /** - * The props for the FaceLivenessDetector + * The props for the FaceLivenessDetectorCore which allows for full configuration of auth */ -export interface FaceLivenessDetectorProps { +export interface FaceLivenessDetectorCoreProps { /** * The sessionId as returned by CreateStreamingLivenessSession API */ @@ -38,10 +39,24 @@ export interface FaceLivenessDetectorProps { /** * Optional parameter for advanced options for the component */ - config?: FaceLivenessDetectorConfig; + config?: FaceLivenessDetectorCoreConfig; } -export interface FaceLivenessDetectorConfig { +/** + * The props for the FaceLivenessDetector extends FaceLivenessDetectorCore with defaults for Amplify Auth configuration + */ + +export type FaceLivenessDetectorProps = Omit< + FaceLivenessDetectorCoreProps, + 'config' +> & { + /** + * Optional parameter for advanced options for the component + */ + config?: FaceLivenessDetectorConfig; +}; + +export interface FaceLivenessDetectorCoreConfig { /** * overrides the Wasm backend binary CDN path * default is https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@3.11.0/dist/. @@ -54,8 +69,18 @@ export interface FaceLivenessDetectorConfig { * default is https://tfhub.dev/tensorflow/tfjs-model/blazeface/1/default/1/model.json?tfjs-format=file */ faceModelUrl?: string; + + /** + * Optional parameter allowing usage of custom credential providers when calling the Rekognition stream endpoint + */ + credentialProvider?: AwsCredentialProvider; } +export type FaceLivenessDetectorConfig = Omit< + FaceLivenessDetectorCoreConfig, + 'credentialProvider' +>; + /** * The coordiates of any bounding box */ diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/machine.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/machine.ts index b84e62107b4..23fe128ecb4 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/types/machine.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/types/machine.ts @@ -8,7 +8,7 @@ import { } from '@aws-sdk/client-rekognitionstreaming'; import { - FaceLivenessDetectorProps, + FaceLivenessDetectorCoreProps, FaceMatchState, LivenessOvalDetails, IlluminationState, @@ -60,7 +60,7 @@ export type LivenessContext = Partial; export interface HydratedLivenessContext { maxFailedAttempts: number; failedAttempts: number; - componentProps: FaceLivenessDetectorProps; + componentProps: FaceLivenessDetectorCoreProps; serverSessionInformation: SessionInformation; challengeId: string; videoAssociatedParams: VideoAssociatedParams; diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/__tests__/streamProvider.test.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/__tests__/streamProvider.test.ts index 0cf1990818b..08c16e9696a 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/__tests__/streamProvider.test.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/__tests__/streamProvider.test.ts @@ -7,6 +7,7 @@ import { RekognitionStreamingClient } from '@aws-sdk/client-rekognitionstreaming import { LivenessStreamProvider } from '../streamProvider'; import { VideoRecorder } from '../videoRecorder'; import { mockClientSessionInformationEvent } from '../__mocks__/testUtils'; +import { AwsCredentialProvider } from '../../types'; jest.mock('../videoRecorder'); jest.mock('@aws-sdk/client-rekognitionstreaming'); @@ -111,35 +112,53 @@ describe('LivenessStreamProvider', () => { describe('constructor', () => { test('happy case', () => { - new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); + }); + + test('with credential provider', () => { + const credentialProvider: AwsCredentialProvider = async () => { + return { + accessKeyId: 'test', + secretAccessKey: 'test', + sessionToken: 'test', + expiration: new Date(), + }; + }; + new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + credentialProvider, + }); }); }); describe('getResponseStream', () => { test('happy case', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); expect(await provider.getResponseStream()).toBeDefined(); }); }); describe('startLivenessVideoConnection', () => { test('happy case', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); await provider.startRecordingLivenessVideo(); expect(mockVideoRecorder.start).toHaveBeenCalledTimes(1); }); @@ -147,12 +166,12 @@ describe('LivenessStreamProvider', () => { describe('getAsyncGeneratorFromReadableStream', () => { test('yield video chunk events', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); const requestStream = ( provider as any ).getAsyncGeneratorFromReadableStream(mockReadableStream)(); @@ -164,12 +183,12 @@ describe('LivenessStreamProvider', () => { }); test('does not yield empty video chunks', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); const requestStream = ( provider as any ).getAsyncGeneratorFromReadableStream( @@ -185,12 +204,12 @@ describe('LivenessStreamProvider', () => { describe('sendClientInfo', () => { test('happy case', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); await provider.sendClientInfo(mockClientSessionInformationEvent); expect(mockVideoRecorder.dispatch).toHaveBeenCalledTimes(1); @@ -199,12 +218,12 @@ describe('LivenessStreamProvider', () => { describe('stopVideo', () => { test('should stop sending video events', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); const response = await provider.stopVideo(); expect(mockVideoRecorder.stop).toHaveBeenCalled(); expect(response).toBeUndefined(); @@ -213,12 +232,12 @@ describe('LivenessStreamProvider', () => { describe('dispatchStopVideoEvent', () => { test('should dispatch an empty video chunk', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); const response = await provider.dispatchStopVideoEvent(); expect(mockVideoRecorder.dispatch).toHaveBeenCalledTimes(2); expect(response).toBeUndefined(); @@ -227,12 +246,12 @@ describe('LivenessStreamProvider', () => { describe('endStream', () => { test('should stop video and end the stream and return a promise if cancelled successfully', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); const response = await provider.endStream(); expect(mockVideoRecorder.stop).toHaveBeenCalled(); @@ -240,12 +259,12 @@ describe('LivenessStreamProvider', () => { }); test('should stop video even if the stream is not available', async () => { - const provider = new LivenessStreamProvider( - 'sessionId', - 'us-east-1', - mockVideoMediaStream, - mockVideoEl - ); + const provider = new LivenessStreamProvider({ + sessionId: 'sessionId', + region: 'us-east-1', + stream: mockVideoMediaStream, + videoEl: mockVideoEl, + }); (provider as any)._reader = undefined; const response = await provider.endStream(); diff --git a/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/streamProvider.ts b/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/streamProvider.ts index 039ca7895b7..80e6435e249 100644 --- a/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/streamProvider.ts +++ b/packages/react-liveness/src/components/FaceLivenessDetector/service/utils/streamProvider.ts @@ -13,6 +13,7 @@ import { import { WebSocketFetchHandler } from '@aws-sdk/middleware-websocket'; import { VideoRecorder } from './videoRecorder'; import { getLivenessUserAgent } from '../../utils/platform'; +import { AwsCredentialProvider } from '../types'; export interface StartLivenessStreamInput { sessionId: string; @@ -28,6 +29,14 @@ export interface Credentials { sessionToken: string; } +export interface StreamProviderArgs { + sessionId: string; + region: string; + stream: MediaStream; + videoEl: HTMLVideoElement; + credentialProvider?: AwsCredentialProvider; +} + const ENDPOINT = process.env.NEXT_PUBLIC_STREAMING_API_URL; export const TIME_SLICE = 1000; @@ -46,6 +55,7 @@ export class LivenessStreamProvider extends AmazonAIInterpretPredictionsProvider public region: string; public videoRecorder: VideoRecorder; public responseStream!: AsyncIterable; + public credentialProvider?: AwsCredentialProvider; private _reader!: ReadableStreamDefaultReader; private videoEl: HTMLVideoElement; @@ -53,19 +63,20 @@ export class LivenessStreamProvider extends AmazonAIInterpretPredictionsProvider private _stream: MediaStream; private initPromise: Promise; - // eslint-disable-next-line max-params - constructor( - sessionId: string, - region: string, - stream: MediaStream, - videoEl: HTMLVideoElement - ) { + constructor({ + sessionId, + region, + stream, + videoEl, + credentialProvider, + }: StreamProviderArgs) { super(); this.sessionId = sessionId; this.region = region; this._stream = stream; this.videoEl = videoEl; this.videoRecorder = new VideoRecorder(stream); + this.credentialProvider = credentialProvider; this.initPromise = this.init(); } @@ -109,7 +120,9 @@ export class LivenessStreamProvider extends AmazonAIInterpretPredictionsProvider } private async init() { - const credentials = (await AmplifyCredentials.get()) as Credentials; + const credentials = + this.credentialProvider ?? + ((await AmplifyCredentials.get()) as Credentials); if (!credentials) { throw new Error('No credentials'); diff --git a/packages/react-liveness/src/index.ts b/packages/react-liveness/src/index.ts index 82865600b11..8b2997eb5fa 100644 --- a/packages/react-liveness/src/index.ts +++ b/packages/react-liveness/src/index.ts @@ -1 +1,9 @@ -export { FaceLivenessDetector, FaceLivenessDetectorProps } from './components'; +export { + FaceLivenessDetector, + FaceLivenessDetectorProps, + FaceLivenessDetectorCore, + FaceLivenessDetectorCoreProps, + AwsCredentialProvider, + AwsCredentials, + AwsTemporaryCredentials, +} from './components'; diff --git a/yarn.lock b/yarn.lock index f98c481f9c8..c892b113c1c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -868,6 +868,48 @@ "@aws-sdk/util-utf8-node" "3.6.1" tslib "^2.0.0" +"@aws-sdk/client-cognito-identity@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.370.0.tgz#cfa6bc1a1b4b3631d0a62cd9861e56a397faba43" + integrity sha512-/dQFXT8y0WUD/731cdLjCrxNxH7Wtg2uZx7PggevTZs9Yr2fdGPSHehIYfvpCvi59yeG9T2Cl8sFnxXL1OEx4A== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/client-sts" "3.370.0" + "@aws-sdk/credential-provider-node" "3.370.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + tslib "^2.5.0" + "@aws-sdk/client-comprehend@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/client-comprehend/-/client-comprehend-3.6.1.tgz#d640d510b49feafa94ac252cdd7942cbe5537249" @@ -1360,6 +1402,45 @@ "@smithy/types" "^1.0.0" tslib "^2.5.0" +"@aws-sdk/client-sso-oidc@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.370.0.tgz#db03c04cb6a23888dc60016eb67505a41ede410b" + integrity sha512-jAYOO74lmVXylQylqkPrjLzxvUnMKw476JCUTvCO6Q8nv3LzCWd76Ihgv/m9Q4M2Tbqi1iP2roVK5bstsXzEjA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + tslib "^2.5.0" + "@aws-sdk/client-sso@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.186.0.tgz#233bdd1312dbf88ef9452f8a62c3c3f1ac580330" @@ -1436,6 +1517,45 @@ "@smithy/types" "^1.0.0" tslib "^2.5.0" +"@aws-sdk/client-sso@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.370.0.tgz#68aea97ecb2e5e6c817dfd3a1dd9fa4e09ff6e1c" + integrity sha512-0Ty1iHuzNxMQtN7nahgkZr4Wcu1XvqGfrQniiGdKKif9jG/4elxsQPiydRuQpFqN6b+bg7wPP7crFP1uTxx2KQ== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + tslib "^2.5.0" + "@aws-sdk/client-sts@3.186.3": version "3.186.3" resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.186.3.tgz#1c12355cb9d3cadc64ab74c91c3d57515680dfbd" @@ -1521,6 +1641,49 @@ fast-xml-parser "4.2.5" tslib "^2.5.0" +"@aws-sdk/client-sts@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.370.0.tgz#65879fa35b396035dcab446c782056ef768f48af" + integrity sha512-utFxOPWIzbN+3kc415Je2o4J72hOLNhgR2Gt5EnRSggC3yOnkC4GzauxG8n7n5gZGBX45eyubHyPOXLOIyoqQA== + dependencies: + "@aws-crypto/sha256-browser" "3.0.0" + "@aws-crypto/sha256-js" "3.0.0" + "@aws-sdk/credential-provider-node" "3.370.0" + "@aws-sdk/middleware-host-header" "3.370.0" + "@aws-sdk/middleware-logger" "3.370.0" + "@aws-sdk/middleware-recursion-detection" "3.370.0" + "@aws-sdk/middleware-sdk-sts" "3.370.0" + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/middleware-user-agent" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@aws-sdk/util-user-agent-browser" "3.370.0" + "@aws-sdk/util-user-agent-node" "3.370.0" + "@smithy/config-resolver" "^1.0.1" + "@smithy/fetch-http-handler" "^1.0.1" + "@smithy/hash-node" "^1.0.1" + "@smithy/invalid-dependency" "^1.0.1" + "@smithy/middleware-content-length" "^1.0.1" + "@smithy/middleware-endpoint" "^1.0.2" + "@smithy/middleware-retry" "^1.0.3" + "@smithy/middleware-serde" "^1.0.1" + "@smithy/middleware-stack" "^1.0.1" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/node-http-handler" "^1.0.2" + "@smithy/protocol-http" "^1.1.0" + "@smithy/smithy-client" "^1.0.3" + "@smithy/types" "^1.1.0" + "@smithy/url-parser" "^1.0.1" + "@smithy/util-base64" "^1.0.1" + "@smithy/util-body-length-browser" "^1.0.1" + "@smithy/util-body-length-node" "^1.0.1" + "@smithy/util-defaults-mode-browser" "^1.0.1" + "@smithy/util-defaults-mode-node" "^1.0.1" + "@smithy/util-retry" "^1.0.3" + "@smithy/util-utf8" "^1.0.1" + fast-xml-parser "4.2.5" + tslib "^2.5.0" + "@aws-sdk/client-textract@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/client-textract/-/client-textract-3.6.1.tgz#b8972f53f0353222b4c052adc784291e602be6aa" @@ -1626,6 +1789,17 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" +"@aws-sdk/credential-provider-cognito-identity@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.370.0.tgz#ba251131db44368473b151178a7c2329058dad39" + integrity sha512-OjNAN72+QoyJAmOayi47AlFzpQc4E59LWRE2GKgH0F1pEgr3t34T0/EHusCoxUjOz5mRRXrKjNlHVC7ezOFEcg== + dependencies: + "@aws-sdk/client-cognito-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-env@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.186.0.tgz#55dec9c4c29ebbdff4f3bce72de9e98f7a1f92e1" @@ -1644,6 +1818,16 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-env@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.370.0.tgz#edd507a88b36b967da048255f4a478ad92d1c5aa" + integrity sha512-raR3yP/4GGbKFRPP5hUBNkEmTnzxI9mEc2vJAJrcv4G4J4i/UP6ELiLInQ5eO2/VcV/CeKGZA3t7d1tsJ+jhCg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-env@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.6.1.tgz#d8b2dd36836432a9b8ec05a5cf9fe428b04c9964" @@ -1713,6 +1897,22 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-ini@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.370.0.tgz#4e569b8054b4fba2f0a0a7fa88af84b1f8d78c0b" + integrity sha512-eJyapFKa4NrC9RfTgxlXnXfS9InG/QMEUPPVL+VhG7YS6nKqetC1digOYgivnEeu+XSKE0DJ7uZuXujN2Y7VAQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.370.0" + "@aws-sdk/credential-provider-process" "3.370.0" + "@aws-sdk/credential-provider-sso" "3.370.0" + "@aws-sdk/credential-provider-web-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/credential-provider-imds" "^1.0.1" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-ini@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.6.1.tgz#0da6d9341e621f8e0815814ed017b88e268fbc3d" @@ -1755,6 +1955,23 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-node@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.370.0.tgz#74605644ccbd9e8237223318a7955f4ab2ff0d86" + integrity sha512-gkFiotBFKE4Fcn8CzQnMeab9TAR06FEAD02T4ZRYW1xGrBJOowmje9dKqdwQFHSPgnWAP+8HoTA8iwbhTLvjNA== + dependencies: + "@aws-sdk/credential-provider-env" "3.370.0" + "@aws-sdk/credential-provider-ini" "3.370.0" + "@aws-sdk/credential-provider-process" "3.370.0" + "@aws-sdk/credential-provider-sso" "3.370.0" + "@aws-sdk/credential-provider-web-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/credential-provider-imds" "^1.0.1" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-node@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.6.1.tgz#0055292a4f0f49d053e8dfcc9174d8d2cf6862bb" @@ -1789,6 +2006,17 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-process@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.370.0.tgz#f7b94d2ccfda3b067cb23ea832b10c692c831855" + integrity sha512-0BKFFZmUO779Xdw3u7wWnoWhYA4zygxJbgGVSyjkOGBvdkbPSTTcdwT1KFkaQy2kOXYeZPl+usVVRXs+ph4ejg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-process@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.6.1.tgz#5bf851f3ee232c565b8c82608926df0ad28c1958" @@ -1823,6 +2051,19 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-sso@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.370.0.tgz#4c57f93d73f198d7e1e53fbfcdf72c053bc9c682" + integrity sha512-PFroYm5hcPSfC/jkZnCI34QFL3I7WVKveVk6/F3fud/cnP8hp6YjA9NiTNbqdFSzsyoiN/+e5fZgNKih8vVPTA== + dependencies: + "@aws-sdk/client-sso" "3.370.0" + "@aws-sdk/token-providers" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/credential-provider-web-identity@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.186.0.tgz#db43f37f7827b553490dd865dbaa9a2c45f95494" @@ -1841,6 +2082,37 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/credential-provider-web-identity@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.370.0.tgz#c5831bb656bea1fe3b300e495e19a33bc90f4d84" + integrity sha512-CFaBMLRudwhjv1sDzybNV93IaT85IwS+L8Wq6VRMa0mro1q9rrWsIZO811eF+k0NEPfgU1dLH+8Vc2qhw4SARQ== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + +"@aws-sdk/credential-providers@^3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.370.0.tgz#280878e08298e959e1877a733ed6ead1cb3486d8" + integrity sha512-K5yUHJPB2QJKWzKoz1YCE2xJDvYL6bvCRyoT0mRPWbITrDjFuWxbe1QXWcMymwQIyzOITAnZq5fvj456KhPATg== + dependencies: + "@aws-sdk/client-cognito-identity" "3.370.0" + "@aws-sdk/client-sso" "3.370.0" + "@aws-sdk/client-sts" "3.370.0" + "@aws-sdk/credential-provider-cognito-identity" "3.370.0" + "@aws-sdk/credential-provider-env" "3.370.0" + "@aws-sdk/credential-provider-ini" "3.370.0" + "@aws-sdk/credential-provider-node" "3.370.0" + "@aws-sdk/credential-provider-process" "3.370.0" + "@aws-sdk/credential-provider-sso" "3.370.0" + "@aws-sdk/credential-provider-web-identity" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/credential-provider-imds" "^1.0.1" + "@smithy/property-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/eventstream-codec@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.186.0.tgz#9da9608866b38179edf72987f2bc3b865d11db13" @@ -2242,6 +2514,16 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-host-header@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.370.0.tgz#645472416efd16b22a66b0aa1d52f48cf5699feb" + integrity sha512-CPXOm/TnOFC7KyXcJglICC7OiA7Kj6mT3ChvEijr56TFOueNHvJdV4aNIFEQy0vGHOWtY12qOWLNto/wYR1BAQ== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/middleware-host-header@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.6.1.tgz#6e1b4b95c5bfea5a4416fa32f11d8fa2e6edaeff" @@ -2275,6 +2557,15 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-logger@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.370.0.tgz#c9f694d7e1dd47b5e6e8eab94793fc1e272b1e26" + integrity sha512-cQMq9SaZ/ORmTJPCT6VzMML7OxFdQzNkhMAgKpTDl+tdPWynlHF29E5xGoSzROnThHlQPCjogU0NZ8AxI0SWPA== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/middleware-logger@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.6.1.tgz#78b3732cf188d5e4df13488db6418f7f98a77d6d" @@ -2301,6 +2592,16 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-recursion-detection@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.370.0.tgz#e5e8fd1d2ff1ade91135295dabcaa81c311ce00b" + integrity sha512-L7ZF/w0lAAY/GK1khT8VdoU0XB7nWHk51rl/ecAg64J70dHnMOAg8n+5FZ9fBu/xH1FwUlHOkwlodJOgzLJjtg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/middleware-retry@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.186.0.tgz#0ff9af58d73855863683991a809b40b93c753ad1" @@ -2369,6 +2670,16 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-sdk-sts@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.370.0.tgz#0599a624fe5cabe75cd7d9e7420927b102356fa2" + integrity sha512-ykbsoVy0AJtVbuhAlTAMcaz/tCE3pT8nAp0L7CQQxSoanRCvOux7au0KwMIQVhxgnYid4dWVF6d00SkqU5MXRA== + dependencies: + "@aws-sdk/middleware-signing" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/middleware-serde@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.186.0.tgz#f7944241ad5fb31cb15cd250c9e92147942b9ec6" @@ -2417,6 +2728,19 @@ "@aws-sdk/util-middleware" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-signing@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.370.0.tgz#c094026251faa17a24f61630d56152f7b073e6cf" + integrity sha512-Dwr/RTCWOXdm394wCwICGT2VNOTMRe4IGPsBRJAsM24pm+EEqQzSS3Xu/U/zF4exuxqpMta4wec4QpSarPNTxA== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/protocol-http" "^1.1.0" + "@smithy/signature-v4" "^1.0.1" + "@smithy/types" "^1.1.0" + "@smithy/util-middleware" "^1.0.1" + tslib "^2.5.0" + "@aws-sdk/middleware-signing@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.6.1.tgz#e70a2f35d85d70e33c9fddfb54b9520f6382db16" @@ -2475,6 +2799,17 @@ "@aws-sdk/util-endpoints" "3.357.0" tslib "^2.5.0" +"@aws-sdk/middleware-user-agent@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.370.0.tgz#a2bf71baf6407654811a02e4d276a2eec3996fdb" + integrity sha512-2+3SB6MtMAq1+gVXhw0Y3ONXuljorh6ijnxgTpv+uQnBW5jHCUiAS8WDYiDEm7i9euJPbvJfM8WUrSMDMU6Cog== + dependencies: + "@aws-sdk/types" "3.370.0" + "@aws-sdk/util-endpoints" "3.370.0" + "@smithy/protocol-http" "^1.1.0" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/middleware-user-agent@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.6.1.tgz#6845dfb3bc6187897f348c2c87dec833e6a65c99" @@ -2789,6 +3124,18 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/token-providers@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.370.0.tgz#e5229f2d116887c90ec103e024583be05c1f506c" + integrity sha512-EyR2ZYr+lJeRiZU2/eLR+mlYU9RXLQvNyGFSAekJKgN13Rpq/h0syzXVFLP/RSod/oZenh/fhVZ2HwlZxuGBtQ== + dependencies: + "@aws-sdk/client-sso-oidc" "3.370.0" + "@aws-sdk/types" "3.370.0" + "@smithy/property-provider" "^1.0.1" + "@smithy/shared-ini-file-loader" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/types@3.186.0": version "3.186.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.186.0.tgz#f6fb6997b6a364f399288bfd5cd494bc680ac922" @@ -2801,6 +3148,14 @@ dependencies: tslib "^2.5.0" +"@aws-sdk/types@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.370.0.tgz#79e0e4927529c957b5c5c2a00f7590a76784a5e4" + integrity sha512-8PGMKklSkRKjunFhzM2y5Jm0H2TBu7YRNISdYzXLUHKSP9zlMEYagseKVdmox0zKHf1LXVNuSlUV2b6SRrieCQ== + dependencies: + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/types@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.6.1.tgz#00686db69e998b521fcd4a5f81ef0960980f80c4" @@ -3037,6 +3392,14 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/util-endpoints@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.370.0.tgz#bf1f4653c3afc89d4e79aa4895dd3dffbb56c930" + integrity sha512-5ltVAnM79nRlywwzZN5i8Jp4tk245OCGkKwwXbnDU+gq7zT3CIOsct1wNZvmpfZEPGt/bv7/NyRcjP+7XNsX/g== + dependencies: + "@aws-sdk/types" "3.370.0" + tslib "^2.5.0" + "@aws-sdk/util-format-url@3.357.0": version "3.357.0" resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.357.0.tgz#46978ecb6e514e31046c598cadee0a99bb07354a" @@ -3158,6 +3521,16 @@ bowser "^2.11.0" tslib "^2.5.0" +"@aws-sdk/util-user-agent-browser@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.370.0.tgz#df144f5f1a65578842b79d49555c754a531d85f0" + integrity sha512-028LxYZMQ0DANKhW+AKFQslkScZUeYlPmSphrCIXgdIItRZh6ZJHGzE7J/jDsEntZOrZJsjI4z0zZ5W2idj04w== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/types" "^1.1.0" + bowser "^2.11.0" + tslib "^2.5.0" + "@aws-sdk/util-user-agent-browser@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.6.1.tgz#11b9cc8743392761adb304460f4b54ec8acc2ee6" @@ -3185,6 +3558,16 @@ "@aws-sdk/types" "3.357.0" tslib "^2.5.0" +"@aws-sdk/util-user-agent-node@3.370.0": + version "3.370.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.370.0.tgz#96d8420b42cbebd498de8b94886340d11c97a34b" + integrity sha512-33vxZUp8vxTT/DGYIR3PivQm07sSRGWI+4fCv63Rt7Q++fO24E0kQtmVAlikRY810I10poD6rwILVtITtFSzkg== + dependencies: + "@aws-sdk/types" "3.370.0" + "@smithy/node-config-provider" "^1.0.1" + "@smithy/types" "^1.1.0" + tslib "^2.5.0" + "@aws-sdk/util-user-agent-node@3.6.1": version "3.6.1" resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.6.1.tgz#98384095fa67d098ae7dd26f3ccaad028e8aebb6" @@ -7603,6 +7986,158 @@ nanoid "^3.3.6" webpack "^5.88.0" +"@smithy/abort-controller@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz#74caac052ecea15c5460438272ad8d43a6ccbc53" + integrity sha512-tb2h0b+JvMee+eAxTmhnyqyNk51UXIK949HnE14lFeezKsVJTB30maan+CO2IMwnig2wVYQH84B5qk6ylmKCuA== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/config-resolver@^1.0.1", "@smithy/config-resolver@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-1.0.2.tgz#d4f556a44292b41b5c067662a4bd5049dea40e35" + integrity sha512-8Bk7CgnVKg1dn5TgnjwPz2ebhxeR7CjGs5yhVYH3S8x0q8yPZZVWwpRIglwXaf5AZBzJlNO1lh+lUhMf2e73zQ== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-config-provider" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + tslib "^2.5.0" + +"@smithy/credential-provider-imds@^1.0.1", "@smithy/credential-provider-imds@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-1.0.2.tgz#7aa797c0d95448eb3dccb988b40e62db8989576f" + integrity sha512-fLjCya+JOu2gPJpCiwSUyoLvT8JdNJmOaTOkKYBZoGf7CzqR6lluSyI+eboZnl/V0xqcfcqBG4tgqCISmWS3/w== + dependencies: + "@smithy/node-config-provider" "^1.0.2" + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/url-parser" "^1.0.2" + tslib "^2.5.0" + +"@smithy/eventstream-codec@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-1.0.2.tgz#06d1b6e2510cb2475a39b3a20b0c75e751917c59" + integrity sha512-eW/XPiLauR1VAgHKxhVvgvHzLROUgTtqat2lgljztbH8uIYWugv7Nz+SgCavB+hWRazv2iYgqrSy74GvxXq/rg== + dependencies: + "@aws-crypto/crc32" "3.0.0" + "@smithy/types" "^1.1.1" + "@smithy/util-hex-encoding" "^1.0.2" + tslib "^2.5.0" + +"@smithy/fetch-http-handler@^1.0.1", "@smithy/fetch-http-handler@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-1.0.2.tgz#4186ee6451de22e867f43c05236dcff43eca6e91" + integrity sha512-kynyofLf62LvR8yYphPPdyHb8fWG3LepFinM/vWUTG2Q1pVpmPCM530ppagp3+q2p+7Ox0UvSqldbKqV/d1BpA== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/querystring-builder" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-base64" "^1.0.2" + tslib "^2.5.0" + +"@smithy/hash-node@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-1.0.2.tgz#dc65203a348d29e45c493ead3e772e4f7dfb5bc0" + integrity sha512-K6PKhcUNrJXtcesyzhIvNlU7drfIU7u+EMQuGmPw6RQDAg/ufUcfKHz4EcUhFAodUmN+rrejhRG9U6wxjeBOQA== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-buffer-from" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/invalid-dependency@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-1.0.2.tgz#0a9d82d1a14e5bdbdc0bd2cef5f457c85a942920" + integrity sha512-B1Y3Tsa6dfC+Vvb+BJMhTHOfFieeYzY9jWQSTR1vMwKkxsymD0OIAnEw8rD/RiDj/4E4RPGFdx9Mdgnyd6Bv5Q== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/is-array-buffer@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-1.0.2.tgz#224702a2364d698f0a36ecb2c240c0c9541ecfb6" + integrity sha512-pkyBnsBRpe+c/6ASavqIMRBdRtZNJEVJOEzhpxZ9JoAXiZYbkfaSMRA/O1dUxGdJ653GHONunnZ4xMo/LJ7utQ== + dependencies: + tslib "^2.5.0" + +"@smithy/middleware-content-length@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-1.0.2.tgz#63099f8d01b3419b65e21cfd07b0c2ef47d1f473" + integrity sha512-pa1/SgGIrSmnEr2c9Apw7CdU4l/HW0fK3+LKFCPDYJrzM0JdYpqjQzgxi31P00eAkL0EFBccpus/p1n2GF9urw== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/middleware-endpoint@^1.0.2": + version "1.0.3" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-1.0.3.tgz#ff4b1c0a83eb8d8b8d3937f434a95efbbf43e1cd" + integrity sha512-GsWvTXMFjSgl617PCE2km//kIjjtvMRrR2GAuRDIS9sHiLwmkS46VWaVYy+XE7ubEsEtzZ5yK2e8TKDR6Qr5Lw== + dependencies: + "@smithy/middleware-serde" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/url-parser" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + tslib "^2.5.0" + +"@smithy/middleware-retry@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-1.0.4.tgz#8e9de0713dac7f7af405477d46bd4525ca7b9ea8" + integrity sha512-G7uRXGFL8c3F7APnoIMTtNAHH8vT4F2qVnAWGAZaervjupaUQuRRHYBLYubK0dWzOZz86BtAXKieJ5p+Ni2Xpg== + dependencies: + "@smithy/protocol-http" "^1.1.1" + "@smithy/service-error-classification" "^1.0.3" + "@smithy/types" "^1.1.1" + "@smithy/util-middleware" "^1.0.2" + "@smithy/util-retry" "^1.0.4" + tslib "^2.5.0" + uuid "^8.3.2" + +"@smithy/middleware-serde@^1.0.1", "@smithy/middleware-serde@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-1.0.2.tgz#87b3a0211602ae991d9b756893eb6bf2e3e5f711" + integrity sha512-T4PcdMZF4xme6koUNfjmSZ1MLi7eoFeYCtodQNQpBNsS77TuJt1A6kt5kP/qxrTvfZHyFlj0AubACoaUqgzPeg== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/middleware-stack@^1.0.1", "@smithy/middleware-stack@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-1.0.2.tgz#d241082bf3cb315c749dda57e233039a9aed804e" + integrity sha512-H7/uAQEcmO+eDqweEFMJ5YrIpsBwmrXSP6HIIbtxKJSQpAcMGY7KrR2FZgZBi1FMnSUOh+rQrbOyj5HQmSeUBA== + dependencies: + tslib "^2.5.0" + +"@smithy/node-config-provider@^1.0.1", "@smithy/node-config-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-1.0.2.tgz#2d391b96a9e10072e7e0a3698427400f4ef17ec4" + integrity sha512-HU7afWpTToU0wL6KseGDR2zojeyjECQfr8LpjAIeHCYIW7r360ABFf4EaplaJRMVoC3hD9FeltgI3/NtShOqCg== + dependencies: + "@smithy/property-provider" "^1.0.2" + "@smithy/shared-ini-file-loader" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/node-http-handler@^1.0.2", "@smithy/node-http-handler@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-1.0.3.tgz#89b556ca2bdcce7a994a9da1ea265094d76d4791" + integrity sha512-PcPUSzTbIb60VCJCiH0PU0E6bwIekttsIEf5Aoo/M0oTfiqsxHTn0Rcij6QoH6qJy6piGKXzLSegspXg5+Kq6g== + dependencies: + "@smithy/abort-controller" "^1.0.2" + "@smithy/protocol-http" "^1.1.1" + "@smithy/querystring-builder" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/property-provider@^1.0.1", "@smithy/property-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-1.0.2.tgz#f99f104cbd6576c9aca9f56cb72819b4a65208e1" + integrity sha512-pXDPyzKX8opzt38B205kDgaxda6LHcTfPvTYQZnwP6BAPp1o9puiCPjeUtkKck7Z6IbpXCPUmUQnzkUzWTA42Q== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + "@smithy/protocol-http@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.0.1.tgz#62fd73d73db285fd8e9a2287ed2904ac66e0d43f" @@ -7611,6 +8146,68 @@ "@smithy/types" "^1.0.0" tslib "^2.5.0" +"@smithy/protocol-http@^1.1.0", "@smithy/protocol-http@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-1.1.1.tgz#10977cf71631eed4f5ad1845408920238d52cdba" + integrity sha512-mFLFa2sSvlUxm55U7B4YCIsJJIMkA6lHxwwqOaBkral1qxFz97rGffP/mmd4JDuin1EnygiO5eNJGgudiUgmDQ== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/querystring-builder@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-1.0.2.tgz#ce861f6cbd14792c83aa19b4967a19923bd0706e" + integrity sha512-6P/xANWrtJhMzTPUR87AbXwSBuz1SDHIfL44TFd/GT3hj6rA+IEv7rftEpPjayUiWRocaNnrCPLvmP31mobOyA== + dependencies: + "@smithy/types" "^1.1.1" + "@smithy/util-uri-escape" "^1.0.2" + tslib "^2.5.0" + +"@smithy/querystring-parser@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-1.0.2.tgz#559d09c46b21e6fbda71e95deda4bcd8a46bdecc" + integrity sha512-IWxwxjn+KHWRRRB+K2Ngl+plTwo2WSgc2w+DvLy0DQZJh9UGOpw40d6q97/63GBlXIt4TEt5NbcFrO30CKlrsA== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/service-error-classification@^1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-1.0.3.tgz#c620c1562610d3351985eb6dd04262ca2657ae67" + integrity sha512-2eglIYqrtcUnuI71yweu7rSfCgt6kVvRVf0C72VUqrd0LrV1M0BM0eYN+nitp2CHPSdmMI96pi+dU9U/UqAMSA== + +"@smithy/shared-ini-file-loader@^1.0.1", "@smithy/shared-ini-file-loader@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-1.0.2.tgz#c6e79991d87925bd18e0adae00c97da6c8ecae1e" + integrity sha512-bdQj95VN+lCXki+P3EsDyrkpeLn8xDYiOISBGnUG/AGPYJXN8dmp4EhRRR7XOoLoSs8anZHR4UcGEOzFv2jwGw== + dependencies: + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/signature-v4@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-1.0.2.tgz#3a7b10ac66c337b404aa061e5f268f0550729680" + integrity sha512-rpKUhmCuPmpV5dloUkOb9w1oBnJatvKQEjIHGmkjRGZnC3437MTdzWej9TxkagcZ8NRRJavYnEUixzxM1amFig== + dependencies: + "@smithy/eventstream-codec" "^1.0.2" + "@smithy/is-array-buffer" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-hex-encoding" "^1.0.2" + "@smithy/util-middleware" "^1.0.2" + "@smithy/util-uri-escape" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/smithy-client@^1.0.3": + version "1.0.4" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-1.0.4.tgz#96d03d123d117a637c679a79bb8eae96e3857bd9" + integrity sha512-gpo0Xl5Nyp9sgymEfpt7oa9P2q/GlM3VmQIdm+FeH0QEdYOQx3OtvwVmBYAMv2FIPWxkMZlsPYRTnEiBTK5TYg== + dependencies: + "@smithy/middleware-stack" "^1.0.2" + "@smithy/types" "^1.1.1" + "@smithy/util-stream" "^1.0.2" + tslib "^2.5.0" + "@smithy/types@^1.0.0": version "1.0.0" resolved "https://registry.npmjs.org/@smithy/types/-/types-1.0.0.tgz#87ab6131fe5e19cbd4d383ffb94d2b806d027d38" @@ -7618,6 +8215,132 @@ dependencies: tslib "^2.5.0" +"@smithy/types@^1.1.0", "@smithy/types@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@smithy/types/-/types-1.1.1.tgz#949394a22e13e7077471bae0d18c146e5f62c456" + integrity sha512-tMpkreknl2gRrniHeBtdgQwaOlo39df8RxSrwsHVNIGXULy5XP6KqgScUw2m12D15wnJCKWxVhCX+wbrBW/y7g== + dependencies: + tslib "^2.5.0" + +"@smithy/url-parser@^1.0.1", "@smithy/url-parser@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-1.0.2.tgz#fb59be6f2283399443d9e7afe08ebf63b3c266bb" + integrity sha512-0JRsDMQe53F6EHRWksdcavKDRjyqp8vrjakg8EcCUOa7PaFRRB1SO/xGZdzSlW1RSTWQDEksFMTCEcVEKmAoqA== + dependencies: + "@smithy/querystring-parser" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/util-base64@^1.0.1", "@smithy/util-base64@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-1.0.2.tgz#6cdd5a9356dafad3c531123c12cd77d674762da0" + integrity sha512-BCm15WILJ3SL93nusoxvJGMVfAMWHZhdeDZPtpAaskozuexd0eF6szdz4kbXaKp38bFCSenA6bkUHqaE3KK0dA== + dependencies: + "@smithy/util-buffer-from" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-body-length-browser@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-1.0.2.tgz#4a9a49497634b5f25ab5ff73f1a8498010b0024a" + integrity sha512-Xh8L06H2anF5BHjSYTg8hx+Itcbf4SQZnVMl4PIkCOsKtneMJoGjPRLy17lEzfoh/GOaa0QxgCP6lRMQWzNl4w== + dependencies: + tslib "^2.5.0" + +"@smithy/util-body-length-node@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-1.0.2.tgz#bc4969022f7d9ffcb239d626d80a85138e986df6" + integrity sha512-nXHbZsUtvZeyfL4Ceds9nmy2Uh2AhWXohG4vWHyjSdmT8cXZlJdmJgnH6SJKDjyUecbu+BpKeVvSrA4cWPSOPA== + dependencies: + tslib "^2.5.0" + +"@smithy/util-buffer-from@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-1.0.2.tgz#27e19573d721962bd2443f23d4edadb8206b2cb5" + integrity sha512-lHAYIyrBO9RANrPvccnPjU03MJnWZ66wWuC5GjWWQVfsmPwU6m00aakZkzHdUT6tGCkGacXSgArP5wgTgA+oCw== + dependencies: + "@smithy/is-array-buffer" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-config-provider@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-1.0.2.tgz#4d2e867df1cc7b4010d1278bd5767ce1b679dae9" + integrity sha512-HOdmDm+3HUbuYPBABLLHtn8ittuRyy+BSjKOA169H+EMc+IozipvXDydf+gKBRAxUa4dtKQkLraypwppzi+PRw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-defaults-mode-browser@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-1.0.2.tgz#31ad7b9bce7e38fd57f4a370ee416373b4fbd432" + integrity sha512-J1u2PO235zxY7dg0+ZqaG96tFg4ehJZ7isGK1pCBEA072qxNPwIpDzUVGnLJkHZvjWEGA8rxIauDtXfB0qxeAg== + dependencies: + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + bowser "^2.11.0" + tslib "^2.5.0" + +"@smithy/util-defaults-mode-node@^1.0.1": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-1.0.2.tgz#b295fe2a18568c1e21a85b6557e2b769452b4d95" + integrity sha512-9/BN63rlIsFStvI+AvljMh873Xw6bbI6b19b+PVYXyycQ2DDQImWcjnzRlHW7eP65CCUNGQ6otDLNdBQCgMXqg== + dependencies: + "@smithy/config-resolver" "^1.0.2" + "@smithy/credential-provider-imds" "^1.0.2" + "@smithy/node-config-provider" "^1.0.2" + "@smithy/property-provider" "^1.0.2" + "@smithy/types" "^1.1.1" + tslib "^2.5.0" + +"@smithy/util-hex-encoding@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-1.0.2.tgz#5b9f2162f2a59b2d2aa39992bd2c7f65b6616ab6" + integrity sha512-Bxydb5rMJorMV6AuDDMOxro3BMDdIwtbQKHpwvQFASkmr52BnpDsWlxgpJi8Iq7nk1Bt4E40oE1Isy/7ubHGzg== + dependencies: + tslib "^2.5.0" + +"@smithy/util-middleware@^1.0.1", "@smithy/util-middleware@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-1.0.2.tgz#c3d4c7a6cd31bde33901e54abd7700c8ca73dab3" + integrity sha512-vtXK7GOR2BoseCX8NCGe9SaiZrm9M2lm/RVexFGyPuafTtry9Vyv7hq/vw8ifd/G/pSJ+msByfJVb1642oQHKw== + dependencies: + tslib "^2.5.0" + +"@smithy/util-retry@^1.0.3", "@smithy/util-retry@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-1.0.4.tgz#9d95df3884981414163d5f780d38e3529384d9ad" + integrity sha512-RnZPVFvRoqdj2EbroDo3OsnnQU8eQ4AlnZTOGusbYKybH3269CFdrZfZJloe60AQjX7di3J6t/79PjwCLO5Khw== + dependencies: + "@smithy/service-error-classification" "^1.0.3" + tslib "^2.5.0" + +"@smithy/util-stream@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-1.0.2.tgz#2d33aa5168e51d1dd7937c32a09c8334d2da44d9" + integrity sha512-qyN2M9QFMTz4UCHi6GnBfLOGYKxQZD01Ga6nzaXFFC51HP/QmArU72e4kY50Z/EtW8binPxspP2TAsGbwy9l3A== + dependencies: + "@smithy/fetch-http-handler" "^1.0.2" + "@smithy/node-http-handler" "^1.0.3" + "@smithy/types" "^1.1.1" + "@smithy/util-base64" "^1.0.2" + "@smithy/util-buffer-from" "^1.0.2" + "@smithy/util-hex-encoding" "^1.0.2" + "@smithy/util-utf8" "^1.0.2" + tslib "^2.5.0" + +"@smithy/util-uri-escape@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-1.0.2.tgz#c69a5423c9baa7a045a79372320bd40a437ac756" + integrity sha512-k8C0BFNS9HpBMHSgUDnWb1JlCQcFG+PPlVBq9keP4Nfwv6a9Q0yAfASWqUCtzjuMj1hXeLhn/5ADP6JxnID1Pg== + dependencies: + tslib "^2.5.0" + +"@smithy/util-utf8@^1.0.1", "@smithy/util-utf8@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-1.0.2.tgz#b34c27b4efbe4f0edb6560b6d4f743088302671f" + integrity sha512-V4cyjKfJlARui0dMBfWJMQAmJzoW77i4N3EjkH/bwnE2Ngbl4tqD2Y0C/xzpzY/J1BdxeCKxAebVFk8aFCaSCw== + dependencies: + "@smithy/util-buffer-from" "^1.0.2" + tslib "^2.5.0" + "@socket.io/component-emitter@~3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz#96116f2a912e0c02817345b3c10751069920d553"