diff --git a/packages/middleware-flexible-checksums/package.json b/packages/middleware-flexible-checksums/package.json index 6f26116dd794..0ad4b1d8348d 100644 --- a/packages/middleware-flexible-checksums/package.json +++ b/packages/middleware-flexible-checksums/package.json @@ -35,6 +35,7 @@ "@smithy/node-config-provider": "^3.1.5", "@smithy/protocol-http": "^4.1.1", "@smithy/types": "^3.4.0", + "@smithy/util-middleware": "^3.0.4", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, diff --git a/packages/middleware-flexible-checksums/src/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.ts b/packages/middleware-flexible-checksums/src/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.ts index ac105c94d97a..cf21cfcc5a86 100644 --- a/packages/middleware-flexible-checksums/src/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.ts +++ b/packages/middleware-flexible-checksums/src/NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS.ts @@ -1,11 +1,10 @@ import { LoadedConfigSelectors } from "@smithy/node-config-provider"; -import { RequestChecksumCalculation } from "./constants"; +import { DEFAULT_REQUEST_CHECKSUM_CALCULATION, RequestChecksumCalculation } from "./constants"; import { SelectorType, stringUnionSelector } from "./stringUnionSelector"; export const ENV_REQUEST_CHECKSUM_CALCULATION = "AWS_REQUEST_CHECKSUM_CALCULATION"; export const CONFIG_REQUEST_CHECKSUM_CALCULATION = "request_checksum_calculation"; -export const DEFAULT_REQUEST_CHECKSUM_CALCULATION = RequestChecksumCalculation.WHEN_SUPPORTED; export const NODE_REQUEST_CHECKSUM_CALCULATION_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => diff --git a/packages/middleware-flexible-checksums/src/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.ts b/packages/middleware-flexible-checksums/src/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.ts index 197b4ea6d052..fcf839559c10 100644 --- a/packages/middleware-flexible-checksums/src/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.ts +++ b/packages/middleware-flexible-checksums/src/NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS.ts @@ -1,11 +1,10 @@ import { LoadedConfigSelectors } from "@smithy/node-config-provider"; -import { RequestChecksumCalculation } from "./constants"; +import { DEFAULT_RESPONSE_CHECKSUM_VALIDATION, RequestChecksumCalculation } from "./constants"; import { SelectorType, stringUnionSelector } from "./stringUnionSelector"; export const ENV_RESPONSE_CHECKSUM_VALIDATION = "AWS_RESPONSE_CHECKSUM_VALIDATION"; export const CONFIG_RESPONSE_CHECKSUM_VALIDATION = "response_checksum_validation"; -export const DEFAULT_RESPONSE_CHECKSUM_VALIDATION = RequestChecksumCalculation.WHEN_SUPPORTED; export const NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS: LoadedConfigSelectors = { environmentVariableSelector: (env) => diff --git a/packages/middleware-flexible-checksums/src/constants.ts b/packages/middleware-flexible-checksums/src/constants.ts index ac944f5fe23f..1a1d13a2efa7 100644 --- a/packages/middleware-flexible-checksums/src/constants.ts +++ b/packages/middleware-flexible-checksums/src/constants.ts @@ -21,6 +21,8 @@ export const RequestChecksumCalculation = { export type RequestChecksumCalculation = (typeof RequestChecksumCalculation)[keyof typeof RequestChecksumCalculation]; +export const DEFAULT_REQUEST_CHECKSUM_CALCULATION = RequestChecksumCalculation.WHEN_SUPPORTED; + /** * Determines when checksum validation will be performed on response payloads. */ @@ -44,6 +46,8 @@ export const ResponseChecksumValidation = { export type ResponseChecksumValidation = (typeof ResponseChecksumValidation)[keyof typeof ResponseChecksumValidation]; +export const DEFAULT_RESPONSE_CHECKSUM_VALIDATION = RequestChecksumCalculation.WHEN_SUPPORTED; + /** * Checksum Algorithms supported by the SDK. */ diff --git a/packages/middleware-flexible-checksums/src/index.ts b/packages/middleware-flexible-checksums/src/index.ts index 8ff2b77d48e1..c014f44cf2a2 100644 --- a/packages/middleware-flexible-checksums/src/index.ts +++ b/packages/middleware-flexible-checksums/src/index.ts @@ -3,3 +3,4 @@ export * from "./NODE_RESPONSE_CHECKSUM_VALIDATION_CONFIG_OPTIONS"; export * from "./constants"; export * from "./flexibleChecksumsMiddleware"; export * from "./getFlexibleChecksumsPlugin"; +export * from "./resolveFlexibleChecksumsConfig"; diff --git a/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.spec.ts b/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.spec.ts new file mode 100644 index 000000000000..7bb1cd64f0d6 --- /dev/null +++ b/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.spec.ts @@ -0,0 +1,35 @@ +import { normalizeProvider } from "@smithy/util-middleware"; + +import { DEFAULT_REQUEST_CHECKSUM_CALCULATION, DEFAULT_RESPONSE_CHECKSUM_VALIDATION } from "./constants"; +import { resolveFlexibleChecksumsConfig } from "./resolveFlexibleChecksumsConfig"; + +jest.mock("@smithy/util-middleware"); + +describe(resolveFlexibleChecksumsConfig.name, () => { + beforeEach(() => { + (normalizeProvider as jest.Mock).mockImplementation((input) => input); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it("returns default client checksums configuration, if not provided", () => { + const resolvedConfig = resolveFlexibleChecksumsConfig({}); + expect(resolvedConfig).toEqual({ + requestChecksumCalculation: DEFAULT_REQUEST_CHECKSUM_CALCULATION, + responseChecksumValidation: DEFAULT_RESPONSE_CHECKSUM_VALIDATION, + }); + expect(normalizeProvider).toHaveBeenCalledTimes(2); + }); + + it("normalizes client checksums configuration", () => { + const mockInput = { + requestChecksumCalculation: "WHEN_REQUIRED", + responseChecksumValidation: "WHEN_REQUIRED", + }; + const resolvedConfig = resolveFlexibleChecksumsConfig(mockInput); + expect(resolvedConfig).toEqual(mockInput); + expect(normalizeProvider).toHaveBeenCalledTimes(2); + }); +}); diff --git a/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.ts b/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.ts new file mode 100644 index 000000000000..b57f894b23fb --- /dev/null +++ b/packages/middleware-flexible-checksums/src/resolveFlexibleChecksumsConfig.ts @@ -0,0 +1,33 @@ +import { Provider } from "@smithy/types"; +import { normalizeProvider } from "@smithy/util-middleware"; + +import { DEFAULT_REQUEST_CHECKSUM_CALCULATION, DEFAULT_RESPONSE_CHECKSUM_VALIDATION } from "./constants"; + +export interface FlexibleChecksumsInputConfig { + /** + * Determines when a checksum will be calculated for request payloads. + */ + requestChecksumCalculation?: string | Provider; + + /** + * Determines when checksum validation will be performed on response payloads. + */ + responseChecksumValidation?: string | Provider; +} + +export interface FlexibleChecksumsResolvedConfig { + requestChecksumCalculation: Provider; + responseChecksumValidation: Provider; +} + +export const resolveFlexibleChecksumsConfig = ( + input: T & FlexibleChecksumsInputConfig +): T & FlexibleChecksumsResolvedConfig => ({ + ...input, + requestChecksumCalculation: normalizeProvider( + input.requestChecksumCalculation ?? DEFAULT_REQUEST_CHECKSUM_CALCULATION + ), + responseChecksumValidation: normalizeProvider( + input.responseChecksumValidation ?? DEFAULT_RESPONSE_CHECKSUM_VALIDATION + ), +});