File tree Expand file tree Collapse file tree 2 files changed +27
-6
lines changed
packages/s3-request-presigner/src Expand file tree Collapse file tree 2 files changed +27
-6
lines changed Original file line number Diff line number Diff line change @@ -99,4 +99,16 @@ describe("getSignedUrl", () => {
9999 expect ( mockPresign ) . toBeCalled ( ) ;
100100 expect ( mockPresign . mock . calls [ 0 ] [ 1 ] ) . toMatchObject ( options ) ;
101101 } ) ;
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+ } ) ;
102114} ) ;
Original file line number Diff line number Diff line change @@ -40,19 +40,28 @@ export const getSignedUrl = async <
4040 } ,
4141 } as any ;
4242 } ;
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+ }
4857
4958 let presigned : HttpRequest ;
5059 try {
5160 const output = await client . send ( command ) ;
5261 //@ts -ignore the output is faked, so it's not actually OutputType
5362 presigned = output . presigned ;
5463 } finally {
55- client . middlewareStack . remove ( "presignInterceptMiddleware" ) ;
64+ client . middlewareStack . remove ( middlewareName ) ;
5665 }
5766
5867 return formatUrl ( presigned ) ;
You can’t perform that action at this time.
0 commit comments