Skip to content

Commit 9cd37b2

Browse files
committed
fix(signature-v4-multi-region): container based loading for CRT and JS Sigv4a
1 parent 81ddf6c commit 9cd37b2

File tree

2 files changed

+46
-16
lines changed

2 files changed

+46
-16
lines changed

packages/signature-v4-multi-region/src/SignatureV4MultiRegion.ts

+21-16
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,8 @@ import {
99
RequestSigningArguments,
1010
} from "@smithy/types";
1111

12-
/**
13-
* @internal
14-
*/
15-
export interface SigV4aSigner extends RequestPresigner, RequestSigner {
16-
signWithCredentials(
17-
requestToSign: HttpRequest,
18-
credentials: AwsCredentialIdentity,
19-
options: RequestSigningArguments
20-
): Promise<HttpRequest>;
21-
}
12+
import { OptionalSigV4aSigner, signatureV4aContainer } from "./signature-v4a-container";
13+
import { OptionalCrtSignerV4, signatureV4CrtContainer } from "./signature-v4-crt-container";
2214

2315
/**
2416
* @internal
@@ -36,7 +28,7 @@ export type SignatureV4MultiRegionInit = SignatureV4Init &
3628
* @internal
3729
*/
3830
export class SignatureV4MultiRegion implements RequestPresigner, RequestSigner {
39-
private sigv4aSigner?: SigV4aSigner;
31+
private sigv4aSigner?: InstanceType<OptionalCrtSignerV4> | InstanceType<OptionalSigV4aSigner>;
4032
private readonly sigv4Signer: SignatureV4S3Express;
4133
private readonly signerOptions: SignatureV4MultiRegionInit;
4234

@@ -87,12 +79,25 @@ export class SignatureV4MultiRegion implements RequestPresigner, RequestSigner {
8779
return this.sigv4Signer.presignWithCredentials(originalRequest, credentials, options);
8880
}
8981

90-
private async getSigv4aSigner(): Promise<SigV4aSigner> {
82+
private async getSigv4aSigner(): Promise<InstanceType<OptionalCrtSignerV4> | InstanceType<OptionalSigV4aSigner>> {
9183
if (!this.sigv4aSigner) {
92-
const { SignatureV4a } = await import("@smithy/signature-v4a");
93-
this.sigv4aSigner = new SignatureV4a({
94-
...this.signerOptions,
95-
}) as SigV4aSigner;
84+
if (signatureV4CrtContainer.CrtSignerV4) {
85+
// CRT implementation
86+
this.sigv4aSigner = new signatureV4CrtContainer.CrtSignerV4({
87+
...this.signerOptions,
88+
signingAlgorithm: 1,
89+
});
90+
} else if (signatureV4aContainer.SignatureV4a) {
91+
// SigV4a JS implementation
92+
this.sigv4aSigner = new signatureV4aContainer.SignatureV4a({
93+
...this.signerOptions,
94+
});
95+
} else {
96+
throw new Error(
97+
"Neither CRT nor JS SigV4a implementation is available. " +
98+
"Please load either @aws-sdk/signature-v4-crt or @smithy/signature-v4a."
99+
);
100+
}
96101
}
97102
return this.sigv4aSigner;
98103
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { AwsCredentialIdentity } from "@aws-sdk/types";
2+
import type { HttpRequest, RequestPresigner, RequestSigner, RequestSigningArguments } from "@smithy/types";
3+
4+
/**
5+
* @public
6+
*/
7+
export type OptionalSigV4aSigner = {
8+
new (options: any): RequestPresigner &
9+
RequestSigner & {
10+
signWithCredentials(
11+
requestToSign: HttpRequest,
12+
credentials: AwsCredentialIdentity,
13+
options: RequestSigningArguments
14+
): Promise<HttpRequest>;
15+
};
16+
};
17+
18+
/**
19+
* @public
20+
*/
21+
export const signatureV4aContainer: {
22+
SignatureV4a: null | OptionalSigV4aSigner;
23+
} = {
24+
SignatureV4a: null,
25+
};

0 commit comments

Comments
 (0)