@@ -35,11 +35,18 @@ const defaultSuccessHandler: SuccessHandler = (
35
35
signingProperties : Record < string , unknown >
36
36
) : void => { } ;
37
37
38
+ /**
39
+ * @internal
40
+ */
41
+ interface HttpSigningMiddlewarePreviouslyResolved {
42
+ systemClockOffset ?: number ;
43
+ }
44
+
38
45
/**
39
46
* @internal
40
47
*/
41
48
export const httpSigningMiddleware = < Input extends object , Output extends object > (
42
- config : object
49
+ config : HttpSigningMiddlewarePreviouslyResolved
43
50
) : FinalizeRequestMiddleware < Input , Output > => (
44
51
next : FinalizeHandler < Input , Output > ,
45
52
context : HttpSigningMiddlewareHandlerExecutionContext
@@ -60,10 +67,35 @@ export const httpSigningMiddleware = <Input extends object, Output extends objec
60
67
identity,
61
68
signer,
62
69
} = scheme ;
63
- const output = await next ( {
64
- ...args ,
65
- request : await signer . sign ( args . request , identity , signingProperties ) ,
66
- } ) . catch ( ( signer . errorHandler || defaultErrorHandler ) ( signingProperties ) ) ;
67
- ( signer . successHandler || defaultSuccessHandler ) ( output . response , signingProperties ) ;
70
+ const lastSystemClockOffset = config . systemClockOffset | 0 ;
71
+
72
+ const makeSignedRequest = async ( ) =>
73
+ next ( {
74
+ ...args ,
75
+ request : await signer . sign ( args . request as HttpRequest , identity , signingProperties ) ,
76
+ } ) ;
77
+
78
+ const onError = ( signer . errorHandler || defaultErrorHandler ) ( signingProperties ) ;
79
+ const onSuccess = signer . successHandler || defaultSuccessHandler ;
80
+
81
+ const output = await makeSignedRequest ( ) . catch ( async ( error : unknown ) => {
82
+ let thrownError : unknown ;
83
+ try {
84
+ onError ( error as Error ) ;
85
+ } catch ( e ) {
86
+ thrownError = e ;
87
+ }
88
+ const latestSystemClockOffset = config . systemClockOffset | 0 ;
89
+ const systemClockOffsetModified = lastSystemClockOffset !== latestSystemClockOffset ;
90
+
91
+ if ( systemClockOffsetModified ) {
92
+ return makeSignedRequest ( ) . catch ( onError ) ;
93
+ } else {
94
+ if ( thrownError ) {
95
+ throw thrownError ;
96
+ }
97
+ }
98
+ } ) ;
99
+ onSuccess ( output . response , signingProperties ) ;
68
100
return output ;
69
101
} ;
0 commit comments