@@ -5,6 +5,10 @@ import { Credentials, HashConstructor, Provider, RegionInfo, RegionInfoProvider,
5
5
// 5 minutes buffer time the refresh the credential before it really expires
6
6
const CREDENTIAL_EXPIRE_WINDOW = 300000 ;
7
7
8
+ // AwsAuth v/s SigV4Auth
9
+ // AwsAuth: specific to SigV4 auth for AWS services
10
+ // SigV4Auth: SigV4 auth for non-AWS services
11
+
8
12
export interface AwsAuthInputConfig {
9
13
/**
10
14
* The credentials used to sign requests.
@@ -32,6 +36,29 @@ export interface AwsAuthInputConfig {
32
36
*/
33
37
signingRegion ?: string ;
34
38
}
39
+
40
+ export interface SigV4AuthInputConfig {
41
+ /**
42
+ * The credentials used to sign requests.
43
+ */
44
+ credentials ?: Credentials | Provider < Credentials > ;
45
+
46
+ /**
47
+ * The signer to use when signing requests.
48
+ */
49
+ signer ?: RequestSigner | Provider < RequestSigner > ;
50
+
51
+ /**
52
+ * Whether to escape request path when signing the request.
53
+ */
54
+ signingEscapePath ?: boolean ;
55
+
56
+ /**
57
+ * An offset value in milliseconds to apply to all signing times.
58
+ */
59
+ systemClockOffset ?: number ;
60
+ }
61
+
35
62
interface PreviouslyResolved {
36
63
credentialDefaultProvider : ( input : any ) => Provider < Credentials > ;
37
64
region : string | Provider < string > ;
@@ -40,13 +67,23 @@ interface PreviouslyResolved {
40
67
serviceId : string ;
41
68
sha256 : HashConstructor ;
42
69
}
70
+
71
+ interface SigV4PreviouslyResolved {
72
+ credentialDefaultProvider : ( input : any ) => Provider < Credentials > ;
73
+ region : string | Provider < string > ;
74
+ signingName : string ;
75
+ sha256 : HashConstructor ;
76
+ }
77
+
43
78
export interface AwsAuthResolvedConfig {
44
79
credentials : Provider < Credentials > ;
45
80
signer : Provider < RequestSigner > ;
46
81
signingEscapePath : boolean ;
47
82
systemClockOffset : number ;
48
83
}
49
84
85
+ export interface SigV4AuthResolvedConfig extends AwsAuthResolvedConfig { }
86
+
50
87
export const resolveAwsAuthConfig = < T > (
51
88
input : T & AwsAuthInputConfig & PreviouslyResolved
52
89
) : T & AwsAuthResolvedConfig => {
@@ -91,6 +128,37 @@ export const resolveAwsAuthConfig = <T>(
91
128
} ;
92
129
} ;
93
130
131
+ // TODO: reduce code duplication
132
+ export const resolveSigV4AuthConfig = < T > (
133
+ input : T & SigV4AuthInputConfig & SigV4PreviouslyResolved
134
+ ) : T & SigV4AuthResolvedConfig => {
135
+ const normalizedCreds = input . credentials
136
+ ? normalizeCredentialProvider ( input . credentials )
137
+ : input . credentialDefaultProvider ( input as any ) ;
138
+ const { signingEscapePath = true , systemClockOffset = input . systemClockOffset || 0 , sha256 } = input ;
139
+ let signer : Provider < RequestSigner > ;
140
+ if ( input . signer ) {
141
+ //if signer is supplied by user, normalize it to a function returning a promise for signer.
142
+ signer = normalizeProvider ( input . signer ) ;
143
+ } else {
144
+ signer = normalizeProvider ( new SignatureV4 ( {
145
+ credentials : normalizedCreds ,
146
+ region : input . region ,
147
+ service : input . signingName ,
148
+ sha256,
149
+ uriEscapePath : signingEscapePath ,
150
+ } ) ) ;
151
+ }
152
+
153
+ return {
154
+ ...input ,
155
+ systemClockOffset,
156
+ signingEscapePath,
157
+ credentials : normalizedCreds ,
158
+ signer,
159
+ } ;
160
+ } ;
161
+
94
162
const normalizeProvider = < T > ( input : T | Provider < T > ) : Provider < T > => {
95
163
if ( typeof input === "object" ) {
96
164
const promisified = Promise . resolve ( input ) ;
0 commit comments