|
1 | 1 | import { AwsCrc32c } from "@aws-crypto/crc32c"; |
2 | 2 | import { Crc64Nvme, crc64NvmeCrtContainer } from "@aws-sdk/crc64-nvme"; |
3 | | -import { ChecksumConstructor, HashConstructor } from "@smithy/types"; |
| 3 | +import type { ChecksumConstructor, HashConstructor } from "@smithy/types"; |
4 | 4 |
|
5 | | -import { PreviouslyResolved } from "./configuration"; |
| 5 | +import type { PreviouslyResolved } from "./configuration"; |
6 | 6 | import { ChecksumAlgorithm } from "./constants"; |
7 | 7 | import { getCrc32ChecksumAlgorithmFunction } from "./getCrc32ChecksumAlgorithmFunction"; |
| 8 | +import { CLIENT_SUPPORTED_ALGORITHMS } from "./types"; |
8 | 9 |
|
9 | 10 | /** |
10 | 11 | * Returns the function that will compute the checksum for the given {@link ChecksumAlgorithm}. |
11 | 12 | */ |
12 | 13 | export const selectChecksumAlgorithmFunction = ( |
13 | | - checksumAlgorithm: ChecksumAlgorithm, |
| 14 | + checksumAlgorithm: ChecksumAlgorithm | string, |
14 | 15 | config: PreviouslyResolved |
15 | 16 | ): ChecksumConstructor | HashConstructor => { |
| 17 | + const { checksumAlgorithms = {} } = config; |
16 | 18 | switch (checksumAlgorithm) { |
17 | 19 | case ChecksumAlgorithm.MD5: |
18 | | - return config.md5; |
| 20 | + return checksumAlgorithms?.MD5 ?? config.md5; |
19 | 21 | case ChecksumAlgorithm.CRC32: |
20 | | - return getCrc32ChecksumAlgorithmFunction(); |
| 22 | + return checksumAlgorithms?.CRC32 ?? getCrc32ChecksumAlgorithmFunction(); |
21 | 23 | case ChecksumAlgorithm.CRC32C: |
22 | | - return AwsCrc32c; |
| 24 | + return checksumAlgorithms?.CRC32C ?? AwsCrc32c; |
23 | 25 | case ChecksumAlgorithm.CRC64NVME: |
24 | 26 | if (typeof crc64NvmeCrtContainer.CrtCrc64Nvme !== "function") { |
25 | | - return Crc64Nvme; |
| 27 | + return checksumAlgorithms?.CRC64NVME ?? Crc64Nvme; |
26 | 28 | } |
27 | | - return crc64NvmeCrtContainer.CrtCrc64Nvme; |
| 29 | + return checksumAlgorithms?.CRC64NVME ?? crc64NvmeCrtContainer.CrtCrc64Nvme; |
28 | 30 | case ChecksumAlgorithm.SHA1: |
29 | | - return config.sha1; |
| 31 | + return checksumAlgorithms?.SHA1 ?? config.sha1; |
30 | 32 | case ChecksumAlgorithm.SHA256: |
31 | | - return config.sha256; |
| 33 | + return checksumAlgorithms?.SHA256 ?? config.sha256; |
32 | 34 | default: |
33 | | - throw new Error(`Unsupported checksum algorithm: ${checksumAlgorithm}`); |
| 35 | + if (checksumAlgorithms?.[checksumAlgorithm]) { |
| 36 | + return checksumAlgorithms[checksumAlgorithm]; |
| 37 | + } |
| 38 | + throw new Error( |
| 39 | + `The checksum algorithm "${checksumAlgorithm}" is not supported by the client.` + |
| 40 | + ` Select one of ${CLIENT_SUPPORTED_ALGORITHMS}, or provide an implementation to ` + |
| 41 | + ` the client constructor checksums field.` |
| 42 | + ); |
34 | 43 | } |
35 | 44 | }; |
0 commit comments