File tree 2 files changed +27
-6
lines changed
packages/s3-request-presigner/src
2 files changed +27
-6
lines changed Original file line number Diff line number Diff line change @@ -99,4 +99,16 @@ describe("getSignedUrl", () => {
99
99
expect ( mockPresign ) . toBeCalled ( ) ;
100
100
expect ( mockPresign . mock . calls [ 0 ] [ 1 ] ) . toMatchObject ( options ) ;
101
101
} ) ;
102
+
103
+ it ( "should not throw if it's called concurrently" , async ( ) => {
104
+ const mockPresigned = "a presigned url" ;
105
+ mockPresign . mockReturnValue ( mockPresigned ) ;
106
+ const client = new S3Client ( clientParams ) ;
107
+ const command = new GetObjectCommand ( {
108
+ Bucket : "Bucket" ,
109
+ Key : "Key" ,
110
+ } ) ;
111
+ const commands = [ command , command ] ;
112
+ return expect ( Promise . all ( commands . map ( ( command ) => getSignedUrl ( client , command ) ) ) ) . resolves . toBeInstanceOf ( Array ) ;
113
+ } ) ;
102
114
} ) ;
Original file line number Diff line number Diff line change @@ -40,19 +40,28 @@ export const getSignedUrl = async <
40
40
} ,
41
41
} as any ;
42
42
} ;
43
- client . middlewareStack . addRelativeTo ( presignInterceptMiddleware , {
44
- name : "presignInterceptMiddleware" ,
45
- relation : "before" ,
46
- toMiddleware : "awsAuthMiddleware" ,
47
- } ) ;
43
+ const middlewareName = "presignInterceptMiddleware" ;
44
+ try {
45
+ client . middlewareStack . addRelativeTo ( presignInterceptMiddleware , {
46
+ name : middlewareName ,
47
+ relation : "before" ,
48
+ toMiddleware : "awsAuthMiddleware" ,
49
+ } ) ;
50
+ } catch ( e ) {
51
+ if ( e . message ! . includes ( `Duplicated middleware name '${ middlewareName } '` ) ) {
52
+ // Swallow if the interceptor is already added. See https://github.com/aws/aws-sdk-js-v3/issues/1857
53
+ } else {
54
+ throw e ;
55
+ }
56
+ }
48
57
49
58
let presigned : HttpRequest ;
50
59
try {
51
60
const output = await client . send ( command ) ;
52
61
//@ts -ignore the output is faked, so it's not actually OutputType
53
62
presigned = output . presigned ;
54
63
} finally {
55
- client . middlewareStack . remove ( "presignInterceptMiddleware" ) ;
64
+ client . middlewareStack . remove ( middlewareName ) ;
56
65
}
57
66
58
67
return formatUrl ( presigned ) ;
You can’t perform that action at this time.
0 commit comments